// Copyright (C) Stichting Deltares 2025. All rights reserved.
//
// This file is part of the Dam Engine.
//
// The Dam Engine is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see .
//
// All names, logos, and references to "Deltares" are registered trademarks of
// Stichting Deltares and remain full property of Stichting Deltares at all times.
// All rights reserved.
using System;
using Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityCommon.MacroStabilityIo;
using Deltares.DamEngine.Data.General;
using Deltares.DamEngine.Data.Geotechnics;
using Deltares.MacroStability.Io.XmlInput;
using KellermanSoftware.CompareNetObjects;
using NUnit.Framework;
using CharacteristicPointType = Deltares.MacroStability.Io.XmlInput.CharacteristicPointType;
namespace Deltares.DamEngine.Calculators.Tests.KernelWrappers.MacroStabilityCommon;
[TestFixture]
public class InputConversionHelperTests
{
[Test]
public void GivenMacroStabilitySoilWhenConvertingToDamSoilAndBackThenResultEqualsOriginal()
{
// Given MacroStability Soil
var macroStabilitySoil = new SoilType
{
Name = "MacroStabilitySoil",
AbovePhreaticLevel = 1.01,
BelowPhreaticLevel = 1.02,
Cohesion = 1.03,
FrictionAngle = 1.04,
Dilatancy = 1.04,
RatioCuPc = 1.06,
ShearStrengthAbovePhreaticLevelModel = ShearStrengthModelType.MohrCoulomb,
ShearStrengthBelowPhreaticLevelModel = ShearStrengthModelType.MohrCoulomb,
StrengthIncreaseExponent = 1.08,
UseSoilClassification = false, // must be false
SigmaTauTable = [],
SuTable = [],
BondStressCurve = null // must be null
};
// When Converting to DamSoil and back
Soil damSoil = InputConversionHelper.ConvertToDamSoil(macroStabilitySoil);
SoilType actualMacroStabilitySoil = InputConversionHelper.ConvertToMacroStabilitySoil(damSoil);
// Then result equals original
var compare = new CompareLogic
{
Config =
{
MaxDifferences = 100
}
};
ComparisonResult result = compare.Compare(macroStabilitySoil, actualMacroStabilitySoil);
Assert.That(result.Differences, Is.Empty, "Differences found converting/reconverting Soil but this ok now if diff = 3");
}
[Test]
public void GivenMacroStabilitySoilWithSuAndSigmaTauTableWhenConvertingToDamSoilAndBackThenResultEqualsOriginal()
{
// Given MacroStability Soil with filled Su and SigmaTau table
var sigmaTauTable = new SoilTypeSigmaTauTablePoint[2];
sigmaTauTable[0] = new SoilTypeSigmaTauTablePoint
{
Sigma = 1.1,
Tau = 2.1
};
sigmaTauTable[1] = new SoilTypeSigmaTauTablePoint
{
Sigma = 2.1,
Tau = 3.1
};
var suTable = new SoilTypeSuTablePoint[2];
suTable[0] = new SoilTypeSuTablePoint
{
Su = 0.1,
EffectiveStress = 10.1
};
suTable[1] = new SoilTypeSuTablePoint
{
Su = 1.21,
EffectiveStress = 13.4
};
var macroStabilitySoil = new SoilType
{
Name = "MacroStabilitySoil",
AbovePhreaticLevel = 1.01,
BelowPhreaticLevel = 1.02,
Cohesion = 1.03,
FrictionAngle = 1.04,
Dilatancy = 1.04,
RatioCuPc = 1.06,
ShearStrengthAbovePhreaticLevelModel = ShearStrengthModelType.MohrCoulomb,
ShearStrengthBelowPhreaticLevelModel = ShearStrengthModelType.MohrCoulomb,
StrengthIncreaseExponent = 1.08,
UseSoilClassification = false, // must be false
SigmaTauTable = sigmaTauTable,
SuTable = suTable,
BondStressCurve = null // must be null
};
// When Converting to DamSoil and back
Soil damSoil = InputConversionHelper.ConvertToDamSoil(macroStabilitySoil);
SoilType actualMacroStabilitySoil = InputConversionHelper.ConvertToMacroStabilitySoil(damSoil);
// Then result equals original
var compare = new CompareLogic
{
Config =
{
MaxDifferences = 100
}
};
ComparisonResult result = compare.Compare(macroStabilitySoil, actualMacroStabilitySoil);
Assert.That(result.Differences, Is.Empty, "Differences found converting/reconverting Soil but this ok now if diff = 3");
}
[Test]
[TestCase(SearchAlgorithmType.Grid, StabilitySearchMethod.Grid)]
[TestCase(SearchAlgorithmType.BeeswarmAndLevenbergMarquardt, StabilitySearchMethod.BeeSwarm)]
public void CanConvertToDamSearchMethod(SearchAlgorithmType searchAlgorithm, StabilitySearchMethod stabilitySearchMethod)
{
Assert.That(InputConversionHelper.ConvertToDamSearchMethod(searchAlgorithm), Is.EqualTo(stabilitySearchMethod));
}
[Test]
[TestCase(StabilitySearchMethod.Grid, SearchAlgorithmType.Grid)]
[TestCase(StabilitySearchMethod.BeeSwarm, SearchAlgorithmType.BeeswarmAndLevenbergMarquardt)]
public void ConvertToMacroStabilitySearchMethod(StabilitySearchMethod stabilitySearchMethod, SearchAlgorithmType searchAlgorithm)
{
Assert.That(InputConversionHelper.ConvertToMacroStabilitySearchMethod(stabilitySearchMethod), Is.EqualTo(searchAlgorithm));
}
[Test]
[TestCase(StabilityModelOption.Bishop, StabilityModelType.Bishop)]
[TestCase(StabilityModelOption.UpliftVan, StabilityModelType.UpliftVan)]
public void CanConvertToMStabModelType(StabilityModelOption modelOption, StabilityModelType stabilityModelType)
{
Assert.That(InputConversionHelper.ConvertToDamStabilityModelType(modelOption), Is.EqualTo(stabilityModelType));
}
[Test]
[TestCase(StabilityModelType.UpliftVan, StabilityModelOption.UpliftVan)]
public void CanConvertToModelOptions(StabilityModelType stabilityModelType, StabilityModelOption modelOption)
{
Assert.That(InputConversionHelper.ConvertToMacroStabilityModelOption(stabilityModelType), Is.EqualTo(modelOption));
}
[TestCase(WaterpressureInterpolationModel.Automatic, WaterPressureInterpolationModelType.Automatic)]
[TestCase(WaterpressureInterpolationModel.Hydrostatic, WaterPressureInterpolationModelType.Hydrostatic)]
public static void CanConvertToMacroStabilityWaterPressureInterpolationModel(
WaterpressureInterpolationModel damWaterPressureInterpolationModel, WaterPressureInterpolationModelType waterPressureInterpolationModel)
{
Assert.That(InputConversionHelper.ConvertToMacroStabilityWaterPressureInterpolationModel(damWaterPressureInterpolationModel), Is.EqualTo(waterPressureInterpolationModel));
}
[TestCase(WaterPressureInterpolationModelType.Automatic, WaterpressureInterpolationModel.Automatic)]
[TestCase(WaterPressureInterpolationModelType.Hydrostatic, WaterpressureInterpolationModel.Hydrostatic)]
public static void CanConvertToDamWaterPressureInterpolationModel(
WaterPressureInterpolationModelType waterPressureInterpolationModel, WaterpressureInterpolationModel damWaterPressureInterpolationModel)
{
Assert.That(InputConversionHelper.ConvertToDamWaterPressureInterpolationModel(waterPressureInterpolationModel), Is.EqualTo(damWaterPressureInterpolationModel));
}
[TestCase(Data.Geotechnics.CharacteristicPointType.BottomDitchPolderSide, CharacteristicPointType.BottomDitchPolderSide)]
[TestCase(Data.Geotechnics.CharacteristicPointType.BottomDitchDikeSide, CharacteristicPointType.BottomDitchDikeSide)]
[TestCase(Data.Geotechnics.CharacteristicPointType.DikeToeAtPolder, CharacteristicPointType.DikeToeAtPolder)]
[TestCase(Data.Geotechnics.CharacteristicPointType.DikeToeAtRiver, CharacteristicPointType.DikeToeAtRiver)]
[TestCase(Data.Geotechnics.CharacteristicPointType.DikeTopAtPolder, CharacteristicPointType.DikeTopAtPolder)]
[TestCase(Data.Geotechnics.CharacteristicPointType.DikeTopAtRiver, CharacteristicPointType.DikeTopAtRiver)]
[TestCase(Data.Geotechnics.CharacteristicPointType.DitchDikeSide, CharacteristicPointType.DitchDikeSide)]
[TestCase(Data.Geotechnics.CharacteristicPointType.DitchPolderSide, CharacteristicPointType.DitchPolderSide)]
[TestCase(Data.Geotechnics.CharacteristicPointType.DikeLine, CharacteristicPointType.None)]
[TestCase(Data.Geotechnics.CharacteristicPointType.None, CharacteristicPointType.None)]
[TestCase(Data.Geotechnics.CharacteristicPointType.ShoulderBaseInside, CharacteristicPointType.ShoulderBaseInside)]
[TestCase(Data.Geotechnics.CharacteristicPointType.ShoulderBaseOutside, CharacteristicPointType.ShoulderBaseOutside)]
[TestCase(Data.Geotechnics.CharacteristicPointType.ShoulderTopInside, CharacteristicPointType.ShoulderTopInside)]
[TestCase(Data.Geotechnics.CharacteristicPointType.ShoulderTopOutside, CharacteristicPointType.ShoulderTopOutside)]
[TestCase(Data.Geotechnics.CharacteristicPointType.SurfaceLevelInside, CharacteristicPointType.SurfaceLevelInside)]
[TestCase(Data.Geotechnics.CharacteristicPointType.SurfaceLevelOutside, CharacteristicPointType.SurfaceLevelOutside)]
[TestCase(Data.Geotechnics.CharacteristicPointType.TrafficLoadInside, CharacteristicPointType.TrafficLoadInside)]
[TestCase(Data.Geotechnics.CharacteristicPointType.TrafficLoadOutside, CharacteristicPointType.TrafficLoadOutside)]
public static void CanConvertToMacroStabilityCharacteristicPointType(
Data.Geotechnics.CharacteristicPointType damCharacteristicPointType, CharacteristicPointType kernelCharacteristicPointType)
{
Assert.That(InputConversionHelper.ConvertToMacroStabilityCharacteristicPointType(damCharacteristicPointType), Is.EqualTo(kernelCharacteristicPointType));
}
[TestCase(CharacteristicPointType.BottomDitchDikeSide, Data.Geotechnics.CharacteristicPointType.BottomDitchDikeSide)]
[TestCase(CharacteristicPointType.BottomDitchPolderSide, Data.Geotechnics.CharacteristicPointType.BottomDitchPolderSide)]
[TestCase(CharacteristicPointType.DikeToeAtPolder, Data.Geotechnics.CharacteristicPointType.DikeToeAtPolder)]
[TestCase(CharacteristicPointType.DikeToeAtRiver, Data.Geotechnics.CharacteristicPointType.DikeToeAtRiver)]
[TestCase(CharacteristicPointType.DikeTopAtPolder, Data.Geotechnics.CharacteristicPointType.DikeTopAtPolder)]
[TestCase(CharacteristicPointType.DikeTopAtRiver, Data.Geotechnics.CharacteristicPointType.DikeTopAtRiver)]
[TestCase(CharacteristicPointType.DitchDikeSide, Data.Geotechnics.CharacteristicPointType.DitchDikeSide)]
[TestCase(CharacteristicPointType.DitchPolderSide, Data.Geotechnics.CharacteristicPointType.DitchPolderSide)]
[TestCase(CharacteristicPointType.None, Data.Geotechnics.CharacteristicPointType.None)]
[TestCase(CharacteristicPointType.ShoulderBaseInside, Data.Geotechnics.CharacteristicPointType.ShoulderBaseInside)]
[TestCase(CharacteristicPointType.ShoulderBaseOutside, Data.Geotechnics.CharacteristicPointType.ShoulderBaseOutside)]
[TestCase(CharacteristicPointType.ShoulderTopInside, Data.Geotechnics.CharacteristicPointType.ShoulderTopInside)]
[TestCase(CharacteristicPointType.ShoulderTopOutside, Data.Geotechnics.CharacteristicPointType.ShoulderTopOutside)]
[TestCase(CharacteristicPointType.SurfaceLevelInside, Data.Geotechnics.CharacteristicPointType.SurfaceLevelInside)]
[TestCase(CharacteristicPointType.SurfaceLevelOutside, Data.Geotechnics.CharacteristicPointType.SurfaceLevelOutside)]
[TestCase(CharacteristicPointType.TrafficLoadInside, Data.Geotechnics.CharacteristicPointType.TrafficLoadInside)]
[TestCase(CharacteristicPointType.TrafficLoadOutside, Data.Geotechnics.CharacteristicPointType.TrafficLoadOutside)]
public static void CanConvertToDamCharacteristicPointType(
CharacteristicPointType kernelCharacteristicPointType, Data.Geotechnics.CharacteristicPointType damCharacteristicPointType)
{
Assert.That(InputConversionHelper.ConvertToDamCharacteristicPointType(kernelCharacteristicPointType), Is.EqualTo(damCharacteristicPointType));
}
[TestCase(SearchAlgorithmType.Beeswarm)]
[TestCase(SearchAlgorithmType.LevenbergMarquardt)]
[TestCase(SearchAlgorithmType.Single)]
public void CanConvertToDamSearchMethodHandleException(SearchAlgorithmType searchAlgorithm)
{
Assert.That(() => InputConversionHelper.ConvertToDamSearchMethod(searchAlgorithm), Throws.InstanceOf());
}
[TestCase(StabilityModelType.BishopUpliftVan)]
public void CanConvertToModelOptionsHandleException(StabilityModelType stabilityModelType)
{
Assert.That(() => InputConversionHelper.ConvertToMacroStabilityModelOption(stabilityModelType), Throws.InstanceOf());
}
[TestCase(OrientationType.Outwards, StabilityGridPosition.Left)]
[TestCase(OrientationType.Inwards, StabilityGridPosition.Right)]
public static void CanConvertToMStabGridPosition(OrientationType gridOrientation, StabilityGridPosition stabilityGridPosition)
{
Assert.That(InputConversionHelper.ConvertToDamGridPosition(gridOrientation), Is.EqualTo(stabilityGridPosition));
}
[TestCase(StabilityGridPosition.Left, OrientationType.Outwards)]
[TestCase(StabilityGridPosition.Right, OrientationType.Inwards)]
public static void CanConvertToGridOrientation(StabilityGridPosition stabilityGridPosition, OrientationType gridOrientation)
{
Assert.That(InputConversionHelper.ConvertToMacroStabilityGridOrientation(stabilityGridPosition), Is.EqualTo(gridOrientation));
}
}