// 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 System.Collections.Generic; using System.Linq; using Deltares.DamEngine.Calculators.KernelWrappers.Common; using Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityCommon; using Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityCommon.MacroStabilityIo; using Deltares.DamEngine.Data.General; using Deltares.DamEngine.Data.Geometry; using Deltares.DamEngine.Data.Geotechnics; using Deltares.DamEngine.TestHelpers.Factories; using Deltares.MacroStability.Io.XmlInput; using KellermanSoftware.CompareNetObjects; using NUnit.Framework; using CharacteristicPointType = Deltares.DamEngine.Data.Geotechnics.CharacteristicPointType; using Point2D = Deltares.DamEngine.Data.Geometry.Point2D; using Soil = Deltares.DamEngine.Data.Geotechnics.Soil; using SoilProfileType = Deltares.MacroStability.Io.XmlInput.SoilProfileType; using UpliftVanCalculationGrid = Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityCommon.UpliftVanCalculationGrid; namespace Deltares.DamEngine.Calculators.Tests.KernelWrappers.MacroStabilityCommon.MacroStabilityIo; [TestFixture] public class EngineToMacroStabilityKernelInputTests { private static readonly List soilParametersToIgnore = [ "RRatio", "RheologicalCoefficient", "BondStressCurve", "UseSoilType", "UseDefaultShearStrengthModel" ]; [TestCase(StabilityModelType.UpliftVan, TangentLinesDefinition.OnBoundaryLines)] [TestCase(StabilityModelType.UpliftVan, TangentLinesDefinition.Specified)] [TestCase(StabilityModelType.Bishop, TangentLinesDefinition.Specified)] public void GivenDamEngineDataModelWhenTransferToKernelInputThenDataIsEqual(StabilityModelType stabilityModelType, TangentLinesDefinition tangentLinesDefinition) { // Given DamEngine data (DamProjectData) DamProjectData expectedDamProjectData = FactoryForDamProjectData.CreateExampleDamProjectData(); expectedDamProjectData.DamProjectCalculationSpecification.DamCalculationSpecifications[0] .StabilityModelType = stabilityModelType; Waternet expectedWaternet = CreateExampleWaternet(); Location expectedLocation = expectedDamProjectData.Dike.Locations[0]; SoilList expectedSoilList = expectedDamProjectData.Dike.SoilList; SoilProfile2D expectedSoilProfile2D = expectedLocation.Segment.SoilProfileProbabilities[0].SoilProfile2D; SurfaceLine2 expectedSurfaceLine2D = expectedLocation.SurfaceLine; IList expectedConsolidationValues = expectedLocation.TrafficLoadDegreeOfConsolidations; FailureMechanismParametersMStab expectedParametersMStab = expectedDamProjectData.DamProjectCalculationSpecification.CurrentSpecification.FailureMechanismParametersMStab; var damKernelInput = new DamKernelInput { SubSoilScenario = expectedLocation.Segment.SoilProfileProbabilities[0], Location = expectedLocation, DamFailureMechanismeCalculationSpecification = expectedDamProjectData.DamProjectCalculationSpecification.CurrentSpecification }; // Determine the proper values for grid and traffic load using the helper methods UpliftVanCalculationGrid expectedUpliftVanCalculationGrid = null; BishopCalculationGrid expectedBishopCalculationGrid = null; double xCoordinateLowestUpliftFactorPoint = 0.0; if (stabilityModelType == StabilityModelType.UpliftVan) { damKernelInput.DamFailureMechanismeCalculationSpecification.FailureMechanismParametersMStab.MStabParameters.SlipCircleDefinition.UpliftVanTangentLinesDefinition = tangentLinesDefinition; xCoordinateLowestUpliftFactorPoint = (expectedSurfaceLine2D.CharacteristicPoints.GetPoint2D(CharacteristicPointType.DikeTopAtPolder).X + expectedSurfaceLine2D.CharacteristicPoints.GetPoint2D(CharacteristicPointType.DikeToeAtPolder).X) * 0.5; expectedUpliftVanCalculationGrid = MacroStabilityCommonHelper.DetermineUpliftVanCalculationGrid(damKernelInput, xCoordinateLowestUpliftFactorPoint); } else { //Note: Bishop only uses auto search area setting, not the tangent line definition expectedBishopCalculationGrid = MacroStabilityCommonHelper.DetermineBishopCalculationGrid(damKernelInput); } TrafficLoad expectedTrafficLoad = MacroStabilityCommonHelper.FillTrafficLoad(damKernelInput); // When transfer to kernel input FullInputModelType fullInputModel = FillMacroStabilityKernelInputFromEngine.CreateFullInputModel( damKernelInput, expectedParametersMStab.MStabParameters, expectedWaternet, xCoordinateLowestUpliftFactorPoint); Assert.That(fullInputModel, Is.Not.Null); // Then the data models are equal CompareStabilityModel(expectedParametersMStab, fullInputModel.StabilityModel); CompareSoilModel(expectedSoilList, fullInputModel.StabilityModel.Soils); CompareSoilProfile2D(expectedSoilProfile2D, fullInputModel.StabilityModel.ConstructionStages[0].SoilProfile, fullInputModel.StabilityModel.Soils); CompareSurfaceLine(expectedSurfaceLine2D, fullInputModel.PreprocessingInput.PreConstructionStages[0].Surfaceline); CompareTrafficLoad(expectedTrafficLoad, fullInputModel.StabilityModel.ConstructionStages[0].UniformLoads[0]); CompareTrafficLoadDegreeOfConsolidations(expectedConsolidationValues, fullInputModel.StabilityModel.ConstructionStages[0].ConsolidationValues, fullInputModel.StabilityModel.ConstructionStages[0].SoilProfile.SoilSurfaces, fullInputModel.StabilityModel.Soils); if (stabilityModelType == StabilityModelType.UpliftVan) { SlipCircleDefinition expectedUpliftVanSlipCircleDefinition = expectedParametersMStab.MStabParameters.SlipCircleDefinition; CompareUpliftVanCalculationGridSettings(expectedUpliftVanSlipCircleDefinition, fullInputModel.PreprocessingInput.SearchAreaConditions); bool areTangentLineSpecified = expectedUpliftVanSlipCircleDefinition.UpliftVanTangentLinesDefinition == TangentLinesDefinition.Specified; CompareUpliftVanSlipCircleDefinition(expectedUpliftVanCalculationGrid, fullInputModel.StabilityModel.UpliftVanCalculationGrid, areTangentLineSpecified); } else { SlipCircleDefinition expectedBishopSlipCircleDefinition = expectedParametersMStab.MStabParameters.SlipCircleDefinition; CompareBishopCalculationGridSettings(expectedBishopSlipCircleDefinition, fullInputModel.PreprocessingInput.SearchAreaConditions); CompareBishopCalculationGrid(expectedBishopCalculationGrid, fullInputModel.StabilityModel.BishopCalculationCircle); } CompareWaternet(expectedWaternet, fullInputModel.StabilityModel.ConstructionStages[0].Waternet); } private static Waternet CreateExampleWaternet() { var waterNet = new Waternet { IsGenerated = false, UnitWeight = 9.81, Name = "Test Waternet" }; var random = new Random(21); var phreaticLine = new PhreaticLine { Name = "Test Phreatic line" }; waterNet.PhreaticLine = phreaticLine; FillGeometryPointString(phreaticLine, random.Next()); // Head line const int nrOfHeadLines = 10; for (var i = 0; i < nrOfHeadLines; i++) { var headLine = new HeadLine { Name = $"Test Head line{i}" }; FillGeometryPointString(headLine, random.Next()); waterNet.HeadLineList.Add(headLine); } // Waternet line for (var i = 0; i < nrOfHeadLines; i++) { var waternetLine = new WaternetLine { Name = $"Test Waternet line {i}", HeadLine = waterNet.HeadLineList[i] }; FillGeometryPointString(waternetLine, random.Next()); waterNet.WaternetLineList.Add(waternetLine); } return waterNet; } private static void FillGeometryPointString(GeometryPointString geometry, int seed) { var random = new Random(seed); for (var i = 0; i < 10; i++) { geometry.Points.Add(new Point2D(random.NextDouble(), random.NextDouble())); } } private static void CompareTrafficLoad(TrafficLoad expectedTrafficLoad, UniformLoadType actualTrafficLoad) { Assert.Multiple(() => { Assert.That(actualTrafficLoad.XStart, Is.EqualTo(expectedTrafficLoad.XStart).Within(GeometryConstants.Tolerance)); Assert.That(actualTrafficLoad.XEnd, Is.EqualTo(expectedTrafficLoad.XEnd).Within(GeometryConstants.Tolerance)); Assert.That(actualTrafficLoad.Pressure, Is.EqualTo(expectedTrafficLoad.Pressure).Within(GeometryConstants.Tolerance)); Assert.That(actualTrafficLoad.DistributionAngle, Is.EqualTo(expectedTrafficLoad.DistributionAngle).Within(GeometryConstants.Tolerance)); }); } private static void CompareTrafficLoadDegreeOfConsolidations(IList expectedDegreeOfConsolidations, ConsolidationValuesTypeConsolidationValue[] actualDegreeOfConsolidations, SoilSurfaceType[] actualSurfaceTypes, SoilType[] actualSoils) { int expectedNrOfDegreeOfConsolidation = expectedDegreeOfConsolidations.Count; Assert.That(actualDegreeOfConsolidations, Has.Length.EqualTo(expectedNrOfDegreeOfConsolidation)); for (var i = 0; i < expectedNrOfDegreeOfConsolidation; i++) { SoilSurfaceType actualSurfaceType = FindSurfaceByKey(actualDegreeOfConsolidations[i].Consolidated, actualSurfaceTypes); Soil damSoil = InputConversionHelper.ConvertToDamSoil(actualSoils[actualSurfaceType.Soil]); Assert.Multiple(() => { Assert.That(actualDegreeOfConsolidations[i].Value, Is.EqualTo(expectedDegreeOfConsolidations[i].DegreeOfConsolidation).Within(GeometryConstants.Tolerance)); // There is only ever 1 Traffic load (as Consolidator)to refer to so do not check Assert.That(damSoil.Name, Is.EqualTo(expectedDegreeOfConsolidations[i].SoilName)); }); } } private static SoilSurfaceType FindSurfaceByKey(int key, SoilSurfaceType[] types) { foreach (SoilSurfaceType soilSurfaceType in types) { if (soilSurfaceType.Key == key) { return soilSurfaceType; } } return null; } private static void CompareUpliftVanCalculationGridSettings(SlipCircleDefinition expectedSlipCircleDefinition, SearchAreaConditionsType actualSearchAreaConditionsType) { Assert.That(actualSearchAreaConditionsType.AutoSearchArea, Is.EqualTo(expectedSlipCircleDefinition.UpliftVanGridSizeDetermination == GridSizeDetermination.Automatic)); if (actualSearchAreaConditionsType.AutoTangentLines) { Assert.That(actualSearchAreaConditionsType.OnlyAbovePleistoceen, Is.EqualTo(expectedSlipCircleDefinition.UpliftVanTangentLinesDefinition == TangentLinesDefinition.Automatic)); } else { Assert.That(expectedSlipCircleDefinition.UpliftVanTangentLinesDefinition, Is.EqualTo(TangentLinesDefinition.Specified)); } } private static void CompareBishopCalculationGridSettings(SlipCircleDefinition expectedSlipCircleDefinition, SearchAreaConditionsType actualSearchAreaConditionsType) { Assert.Multiple(() => { Assert.That(actualSearchAreaConditionsType.AutoSearchArea, Is.EqualTo(expectedSlipCircleDefinition.BishopSearchAreaDetermination == GridSizeDetermination.Automatic)); Assert.That(actualSearchAreaConditionsType.AutoTangentLines, Is.False); }); } private static void CompareUpliftVanSlipCircleDefinition(UpliftVanCalculationGrid expectedSlipPlaneUpliftVan, UpliftVanCalculationGridType actualSlipPlaneUpliftVan, bool areTangentLineSpecified) { Assert.Multiple(() => { Assert.That(actualSlipPlaneUpliftVan.LeftGrid.GridXLeft, Is.EqualTo(expectedSlipPlaneUpliftVan.LeftGridXLeft)); Assert.That(actualSlipPlaneUpliftVan.LeftGrid.GridXRight, Is.EqualTo(expectedSlipPlaneUpliftVan.LeftGridXRight)); Assert.That(actualSlipPlaneUpliftVan.LeftGrid.GridZTop, Is.EqualTo(expectedSlipPlaneUpliftVan.LeftGridZTop)); Assert.That(actualSlipPlaneUpliftVan.LeftGrid.GridZBottom, Is.EqualTo(expectedSlipPlaneUpliftVan.LeftGridZBottom)); Assert.That(actualSlipPlaneUpliftVan.LeftGrid.GridXNumber, Is.EqualTo(expectedSlipPlaneUpliftVan.LeftGridXCount)); Assert.That(actualSlipPlaneUpliftVan.LeftGrid.GridZNumber, Is.EqualTo(expectedSlipPlaneUpliftVan.LeftGridZCount)); Assert.That(actualSlipPlaneUpliftVan.RightGrid.GridXLeft, Is.EqualTo(expectedSlipPlaneUpliftVan.RightGridXLeft)); Assert.That(actualSlipPlaneUpliftVan.RightGrid.GridXRight, Is.EqualTo(expectedSlipPlaneUpliftVan.RightGridXRight)); Assert.That(actualSlipPlaneUpliftVan.RightGrid.GridZTop, Is.EqualTo(expectedSlipPlaneUpliftVan.RightGridZTop)); Assert.That(actualSlipPlaneUpliftVan.RightGrid.GridZBottom, Is.EqualTo(expectedSlipPlaneUpliftVan.RightGridZBottom)); Assert.That(actualSlipPlaneUpliftVan.RightGrid.GridXNumber, Is.EqualTo(expectedSlipPlaneUpliftVan.RightGridXCount)); Assert.That(actualSlipPlaneUpliftVan.RightGrid.GridZNumber, Is.EqualTo(expectedSlipPlaneUpliftVan.RightGridZCount)); }); if (areTangentLineSpecified) { Assert.That(actualSlipPlaneUpliftVan.TangentLines, Is.EqualTo(expectedSlipPlaneUpliftVan.TangentLineLevels).AsCollection); } } private static void CompareBishopCalculationGrid(BishopCalculationGrid expectedSlipCircleBishop, BishopCalculationCircle actualSlipCircleBishop) { Assert.Multiple(() => { Assert.That(actualSlipCircleBishop.Grid.GridXLeft, Is.EqualTo(expectedSlipCircleBishop.GridXLeft)); Assert.That(actualSlipCircleBishop.Grid.GridXRight, Is.EqualTo(expectedSlipCircleBishop.GridXRight)); Assert.That(actualSlipCircleBishop.Grid.GridZTop, Is.EqualTo(expectedSlipCircleBishop.GridZTop)); Assert.That(actualSlipCircleBishop.Grid.GridZBottom, Is.EqualTo(expectedSlipCircleBishop.GridZBottom)); Assert.That(actualSlipCircleBishop.Grid.GridXNumber, Is.EqualTo(expectedSlipCircleBishop.GridXCount)); Assert.That(actualSlipCircleBishop.Grid.GridZNumber, Is.EqualTo(expectedSlipCircleBishop.GridZCount)); }); Assert.That(actualSlipCircleBishop.TangentLines, Is.EqualTo(expectedSlipCircleBishop.TangentLineLevels).AsCollection); } private static void CompareWaternet(Waternet expectedWaternet, WaternetType actualWaternet) { Assert.That(actualWaternet.Name, Is.EqualTo(expectedWaternet.Name)); CompareHeadLine(expectedWaternet.PhreaticLine, actualWaternet.PhreaticLine); CompareWaternetHeadLines(expectedWaternet.HeadLineList, actualWaternet.HeadLines); CompareWaternetLines(expectedWaternet.WaternetLineList, actualWaternet.WaternetLines, actualWaternet.HeadLines); } private static void CompareWaternetLines(List expectedWaternetLines, WaternetTypeWaternetLine[] actualWaternetLines, HeadLineType[] actualHeadLines) { Assert.That(actualWaternetLines.Count, Is.EqualTo(expectedWaternetLines.Count)); for (var i = 0; i < expectedWaternetLines.Count; i++) { WaternetLine expectedWaternetLine = expectedWaternetLines.ElementAt(i); WaternetTypeWaternetLine actualWaternetLine = actualWaternetLines[i]; CompareWaternetLine(expectedWaternetLine, actualWaternetLine); HeadLineType associatedHeadLine = FindAssociatedHeadLine(actualWaternetLine.AssociatedHeadLine, actualHeadLines); CompareHeadLine(expectedWaternetLine.HeadLine, associatedHeadLine); } } private static HeadLineType FindAssociatedHeadLine(int associatedHeadLine, HeadLineType[] actualHeadLines) { foreach (HeadLineType headLine in actualHeadLines) { if (headLine.Key == associatedHeadLine) { return headLine; } } return null; } private static void CompareWaternetHeadLines(List expectedHeadLines, HeadLineType[] actualHeadLines) { Assert.That(actualHeadLines.Count, Is.EqualTo(expectedHeadLines.Count)); for (var i = 0; i < expectedHeadLines.Count; i++) { HeadLine expectedHeadLine = expectedHeadLines.ElementAt(i); HeadLineType actualHeadLine = actualHeadLines.ElementAt(i); CompareHeadLine(expectedHeadLine, actualHeadLine); } } private static void CompareHeadLine(GeometryPointString expectedHeadLine, HeadLineType actualHeadLine) { Assert.That(actualHeadLine.WaternetLine.Name, Is.EqualTo(expectedHeadLine.Name)); List expectedPoints = expectedHeadLine.Points; List actualPoints = actualHeadLine.WaternetLine.Points.ToList(); Assert.That(actualPoints, Has.Count.EqualTo(expectedPoints.Count)); for (var i = 0; i < expectedPoints.Count; i++) { Point2D expectedCoordinate = expectedPoints[i]; var actualCoordinateAsPoint2D = new Point2D(actualPoints[i].X, actualPoints[i].Z); Assert.That(expectedCoordinate.LocationEquals(actualCoordinateAsPoint2D), Is.True); } } private static void CompareWaternetLine(GeometryPointString expectedWaternetLine, WaternetTypeWaternetLine actualWaternetLine) { Assert.That(actualWaternetLine.Name, Is.EqualTo(expectedWaternetLine.Name)); List expectedPoints = expectedWaternetLine.Points; List actualPoints = actualWaternetLine.Points.ToList(); Assert.That(actualPoints, Has.Count.EqualTo(expectedPoints.Count)); for (var i = 0; i < expectedPoints.Count; i++) { Point2D expectedCoordinate = expectedPoints[i]; var actualCoordinateAsPoint2D = new Point2D(actualPoints[i].X, actualPoints[i].Z); Assert.That(expectedCoordinate.LocationEquals(actualCoordinateAsPoint2D), Is.True); } } private static void CompareSurfaceLine(SurfaceLine2 expectedSurfaceLine2, SurfaceLineType actualSurfaceLine2) { CharacteristicPointSet expectedCharacteristicPoints = expectedSurfaceLine2.CharacteristicPoints; SurfaceLineTypeCharacteristicPoint[] actualCharacteristicPoints = actualSurfaceLine2.CharacteristicPoints; Assert.That(actualCharacteristicPoints, Has.Length.EqualTo(expectedCharacteristicPoints.Count)); for (var i = 0; i < actualCharacteristicPoints.Length; i++) { Assert.Multiple(() => { Assert.That(actualCharacteristicPoints[i].CharacteristicPointType, Is.EqualTo(InputConversionHelper.ConvertToMacroStabilityCharacteristicPointType( expectedSurfaceLine2.CharacteristicPoints[i].CharacteristicPointType))); Assert.That(actualCharacteristicPoints[i].GeometryPoint.X, Is.EqualTo(expectedSurfaceLine2.CharacteristicPoints[i].Point.X).Within(GeometryConstants.Tolerance)); Assert.That(actualCharacteristicPoints[i].GeometryPoint.Z, Is.EqualTo(expectedSurfaceLine2.CharacteristicPoints[i].Point.Z).Within(GeometryConstants.Tolerance)); }); } } private static void CompareSoilProfile2D(SoilProfile2D expectedSoilProfile, SoilProfileType actualSoilProfile, SoilType[] actualSoils) { Assert.Multiple(() => { Assert.That(actualSoilProfile.SoilSurfaces, Has.Length.EqualTo(expectedSoilProfile.Surfaces.Count)); Assert.That(actualSoilProfile.Geometry.Points, Has.Length.EqualTo(expectedSoilProfile.Geometry.Points.Count)); Assert.That(actualSoilProfile.Geometry.Curves, Has.Length.EqualTo(expectedSoilProfile.Geometry.Curves.Count)); Assert.That(actualSoilProfile.Geometry.GeometrySurfaces, Has.Length.EqualTo(expectedSoilProfile.Geometry.Surfaces.Count)); }); for (var i = 0; i < expectedSoilProfile.Surfaces.Count; i++) { Soil damSoil = InputConversionHelper.ConvertToDamSoil(actualSoils[actualSoilProfile.SoilSurfaces[i].Soil]); CompareSoil(damSoil, expectedSoilProfile.Surfaces[i].Soil); Assert.Multiple(() => { Assert.That(actualSoilProfile.SoilSurfaces[i].WaterPressureInterpolationModel, Is.EqualTo( InputConversionHelper.ConvertToMacroStabilityWaterPressureInterpolationModel(expectedSoilProfile.Surfaces[i].WaterpressureInterpolationModel))); Assert.That(actualSoilProfile.SoilSurfaces[i].IsAquifer, Is.EqualTo(expectedSoilProfile.Surfaces[i].IsAquifer)); }); } for (var j = 0; j < expectedSoilProfile.Geometry.Points.Count; j++) { Assert.Multiple(() => { Assert.That(actualSoilProfile.Geometry.Points[j].X, Is.EqualTo(expectedSoilProfile.Geometry.Points[j].X).Within(GeometryConstants.Tolerance)); Assert.That(actualSoilProfile.Geometry.Points[j].Z, Is.EqualTo(expectedSoilProfile.Geometry.Points[j].Z).Within(GeometryConstants.Tolerance)); }); } for (var j = 0; j < expectedSoilProfile.Geometry.Curves.Count; j++) { PointType headPoint = FindPointByKey(actualSoilProfile.Geometry.Curves[j].HeadPoint, actualSoilProfile.Geometry.Points); PointType endPoint = FindPointByKey(actualSoilProfile.Geometry.Curves[j].EndPoint, actualSoilProfile.Geometry.Points); Assert.Multiple(() => { Assert.That(headPoint.X, Is.EqualTo(expectedSoilProfile.Geometry.Curves[j].HeadPoint.X).Within(GeometryConstants.Tolerance)); Assert.That(headPoint.Z, Is.EqualTo(expectedSoilProfile.Geometry.Curves[j].HeadPoint.Z).Within(GeometryConstants.Tolerance)); Assert.That(endPoint.X, Is.EqualTo(expectedSoilProfile.Geometry.Curves[j].EndPoint.X).Within(GeometryConstants.Tolerance)); Assert.That(endPoint.Z, Is.EqualTo(expectedSoilProfile.Geometry.Curves[j].EndPoint.Z).Within(GeometryConstants.Tolerance)); }); } } private static PointType FindPointByKey(int pointKey, PointType[] points) { foreach (PointType point in points) { if (point.Key == pointKey) { return point; } } return null; } private static void CompareSoilModel(SoilList expectedSoils, SoilType[] actualSoils) { Assert.That(actualSoils, Has.Length.EqualTo(expectedSoils.Soils.Count), "Soil Count does not match"); var i = 0; foreach (Soil expectedSoil in expectedSoils.Soils) { Soil actualSoil = InputConversionHelper.ConvertToDamSoil(actualSoils[i]); CompareSoil(actualSoil, expectedSoil); i++; } } private static void CompareSoil(Soil actualSoil, Soil expectedSoil) { Assert.Multiple(() => { Assert.That(actualSoil.Name, Is.EqualTo(expectedSoil.Name)); Assert.That(actualSoil, Is.Not.Null, $"Soil {expectedSoil.Name} not found"); }); var compare = new CompareLogic { Config = { MaxDifferences = 100, MembersToIgnore = soilParametersToIgnore } }; ComparisonResult result = compare.Compare(expectedSoil, actualSoil); Assert.That(result.Differences, Is.Empty, "Differences found read/write kernel SoilModel"); } private static void CompareStabilityModel(FailureMechanismParametersMStab expectedStabilityModel, StabilityInputType actualStabilityModel) { Assert.Multiple(() => { Assert.That(actualStabilityModel.SearchAlgorithm, Is.EqualTo(InputConversionHelper.ConvertToMacroStabilitySearchMethod(expectedStabilityModel.MStabParameters.SearchMethod))); Assert.That(actualStabilityModel.ModelOption, Is.EqualTo(InputConversionHelper.ConvertToMacroStabilityModelOption(expectedStabilityModel.MStabParameters.Model))); Assert.That(actualStabilityModel.Orientation, Is.EqualTo(InputConversionHelper.ConvertToMacroStabilityGridOrientation(expectedStabilityModel.MStabParameters.GridPosition))); }); } public class GivenDamKernelInput { private readonly DamKernelInput damKernelInput = CreateDamKernelInputWithForbiddenZone(); [Test] [TestCase(0.0, 5.0)] [TestCase(0.2, 6.0)] [TestCase(1.0, 10.0)] public void WithForbiddenZone_WhenTransferSlipPlaneConstraints_ThenSlipPlaneConstraintsAreSet(double forbiddenZoneFactor,double xEntryMax) { damKernelInput.Location.StabilityOptions.ForbiddenZoneFactor = forbiddenZoneFactor; var macroStabilityInput = new FullInputModelType { StabilityModel = new StabilityInputType { SlipPlaneConstraints = new SlipPlaneConstraintsType() } }; // When FillMacroStabilityKernelInputFromEngine.DetermineSlipPlaneConstraints(damKernelInput.Location, macroStabilityInput.StabilityModel.SlipPlaneConstraints); Assert.Multiple(() => { // Then Assert.That(macroStabilityInput.StabilityModel.SlipPlaneConstraints.SlipPlaneMinDepth, Is.EqualTo(1.5)); Assert.That(macroStabilityInput.StabilityModel.SlipPlaneConstraints.XEntryMin, Is.EqualTo(1.0)); Assert.That(macroStabilityInput.StabilityModel.SlipPlaneConstraints.XEntryMax, Is.EqualTo(xEntryMax)); }); } [Test] public void WithNoZones_WhenTransferSlipPlaneConstraints_ThenXEntryIsNotSet() { damKernelInput.Location.StabilityOptions.StabilityZoneType = StabilityZoneType.NoZones; var macroStabilityInput = new FullInputModelType { StabilityModel = new StabilityInputType { SlipPlaneConstraints = new SlipPlaneConstraintsType() } }; // When FillMacroStabilityKernelInputFromEngine.DetermineSlipPlaneConstraints(damKernelInput.Location, macroStabilityInput.StabilityModel.SlipPlaneConstraints); Assert.Multiple(() => { // Then Assert.That(macroStabilityInput.StabilityModel.SlipPlaneConstraints.SlipPlaneMinDepth, Is.EqualTo(1.5)); Assert.That(macroStabilityInput.StabilityModel.SlipPlaneConstraints.XEntryMin, Is.NaN); Assert.That(macroStabilityInput.StabilityModel.SlipPlaneConstraints.XEntryMax, Is.NaN); }); } private static DamKernelInput CreateDamKernelInputWithForbiddenZone() { var surfaceLine = new SurfaceLine2() { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; surfaceLine.EnsurePointOfType(1.0, 0, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(5.0, 0, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(10.0, 0, CharacteristicPointType.DikeToeAtPolder); var damKernelInput = new DamKernelInput { Location = new Location() { SurfaceLine = surfaceLine, StabilityOptions = new StabilityOptions { MinimalCircleDepth = 1.5, StabilityZoneType = StabilityZoneType.ForbiddenZone, ForbiddenZoneFactor = 0.2 } } }; return damKernelInput; } } }