Index: DamEngine/trunk/src/Deltares.DamEngine.Data.Tests/Geotechnics/SoilSurfaceProfileTests.cs =================================================================== diff -u -r3255 -r3256 --- DamEngine/trunk/src/Deltares.DamEngine.Data.Tests/Geotechnics/SoilSurfaceProfileTests.cs (.../SoilSurfaceProfileTests.cs) (revision 3255) +++ DamEngine/trunk/src/Deltares.DamEngine.Data.Tests/Geotechnics/SoilSurfaceProfileTests.cs (.../SoilSurfaceProfileTests.cs) (revision 3256) @@ -517,6 +517,102 @@ }, bottomLayerSurface.GeometrySurface.OuterLoop.CurveList); } + [Test] + public void ConvertToSoilProfile2D_WithSurfaceLineIntersectingSoilLayerAndHorizontalLineAtBottomIntersection_ReturnsExpectedSoilProfile() + { + // Setup + const string bottomLayerName = "BottomLayer"; + const string middleLayerName = "MiddleLayer"; + const string topLayerName = "TopLayer"; + + SoilLayer1D bottomLayer = CreateSoilLayer(-2.5, bottomLayerName); + SoilLayer1D middleLayer = CreateSoilLayer(0, middleLayerName); + + var profile = new SoilProfile1D(); + profile.Layers.Add(bottomLayer); + profile.Layers.Add(middleLayer); + profile.BottomLevel = -10; + + SurfaceLine2 surfaceLine = CreateSurfaceLine(new[] + { + new GeometryPoint(0, 2.5), + new GeometryPoint(5, -2.5), + new GeometryPoint(10, -2.5), + new GeometryPoint(15, 2.5) + }); + + var soilSurfaceProfile = new SoilSurfaceProfile + { + SoilProfile = profile, + SurfaceLine2 = surfaceLine, + DikeEmbankmentMaterial = new Soil + { + Name = topLayerName + } + }; + + // Call + SoilProfile2D soilProfile2D = soilSurfaceProfile.ConvertToSoilProfile2D(); + + // Assert + var soilLayer2Ds = soilProfile2D.Surfaces; + Assert.That(soilLayer2Ds, Has.Count.EqualTo(5)); + + var topSoilLayerSurfaces = soilLayer2Ds.Where(l => string.Equals(l.Name, topLayerName)).ToArray(); + Assert.That(topSoilLayerSurfaces.Length, Is.EqualTo(2)); + Assert.That(topSoilLayerSurfaces.All(s => ReferenceEquals(s.Soil, soilSurfaceProfile.DikeEmbankmentMaterial)), Is.True); + AssertGeometry(new[] + { + new GeometryCurve(new Point2D(0, 2.5), new Point2D(2.5, 0)), + new GeometryCurve(new Point2D(2.5, 0), new Point2D(0, 0)), + new GeometryCurve(new Point2D(0, 0), new Point2D(0, 2.5)) + }, topSoilLayerSurfaces[0].GeometrySurface.OuterLoop.CurveList); + AssertGeometry(new[] + { + new GeometryCurve(new Point2D(12.5, 0), new Point2D(15, 2.5)), + new GeometryCurve(new Point2D(15, 2.5), new Point2D(15, 0)), + new GeometryCurve(new Point2D(15, 0), new Point2D(12.5, 0)) + }, topSoilLayerSurfaces[1].GeometrySurface.OuterLoop.CurveList); + + var middleLayerSurfaces = soilLayer2Ds.Where(l => string.Equals(l.Name, middleLayerName)).ToArray(); + Assert.That(middleLayerSurfaces.Length, Is.EqualTo(2)); + Assert.That(middleLayerSurfaces.All(s => ReferenceEquals(s.Soil, middleLayer.Soil)), Is.True); + AssertGeometry(new[] + { + new GeometryCurve(new Point2D(0, 0), new Point2D(2.5, 0)), + new GeometryCurve(new Point2D(2.5, 0), new Point2D(5, -2.5)), + new GeometryCurve(new Point2D(5, -2.5), new Point2D(2.5, -2.5)), + new GeometryCurve(new Point2D(2.5, -2.5), new Point2D(0, -2.5)), + new GeometryCurve(new Point2D(0, -2.5), new Point2D(0, 0)) + }, middleLayerSurfaces[0].GeometrySurface.OuterLoop.CurveList); + AssertGeometry(new[] + { + new GeometryCurve(new Point2D(12.5, 0), new Point2D(15, 0)), + new GeometryCurve(new Point2D(15, 0), new Point2D(15, -2.5)), + new GeometryCurve(new Point2D(15, -2.5), new Point2D(12.5, -2.5)), + new GeometryCurve(new Point2D(12.5, -2.5), new Point2D(10, -2.5)), + new GeometryCurve(new Point2D(10, -2.5), new Point2D(12.5, 0)) + }, middleLayerSurfaces[1].GeometrySurface.OuterLoop.CurveList); + + SoilLayer2D bottomLayerSurface = soilLayer2Ds.Single(l => string.Equals(l.Name, bottomLayerName)); + Assert.That(bottomLayerSurface.Soil, Is.SameAs(bottomLayer.Soil)); + AssertGeometry(new[] + { + new GeometryCurve(new Point2D(0, -2.5), new Point2D(2.5, -2.5)), + new GeometryCurve(new Point2D(2.5, -2.5), new Point2D(5, -2.5)), + new GeometryCurve(new Point2D(5, -2.5), new Point2D(10, -2.5)), + new GeometryCurve(new Point2D(10, -2.5), new Point2D(12.5, -2.5)), + new GeometryCurve(new Point2D(12.5, -2.5), new Point2D(15, -2.5)), + new GeometryCurve(new Point2D(15, -2.5), new Point2D(15, -10)), + new GeometryCurve(new Point2D(15, -10), new Point2D(12.5, -10)), + new GeometryCurve(new Point2D(12.5, -10), new Point2D(10, -10)), + new GeometryCurve(new Point2D(10, -10), new Point2D(5, -10)), + new GeometryCurve(new Point2D(5, -10), new Point2D(2.5, -10)), + new GeometryCurve(new Point2D(2.5, -10), new Point2D(0, -10)), + new GeometryCurve(new Point2D(0, -10), new Point2D(0, -2.5)) + }, bottomLayerSurface.GeometrySurface.OuterLoop.CurveList); + } + private static void AssertGeometry(IEnumerable expectedCurves, IEnumerable actualCurves) { int nrOfExpectedCurves = expectedCurves.Count();