// Copyright (C) Stichting Deltares 2018. 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.Linq; using Deltares.DamEngine.Calculators.Dikes_Design; using Deltares.DamEngine.Data.General; using Deltares.DamEngine.Data.Geometry; using Deltares.DamEngine.Data.Geotechnics; using Deltares.DamEngine.Data.Standard.Validation; using Deltares.DamEngine.TestHelpers.Factories; using NUnit.Framework; namespace Deltares.DamEngine.Calculators.Tests.DikesDesign { [TestFixture] public class SurfaceLineHeightAdapterTest { [Test] public void ConstructNewSurfaceLineReturnsANewSurfaceLine() { var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var location = new Location(); { surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(1, 1, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(2, 1, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(3, 0, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(100, 0, CharacteristicPointType.SurfaceLevelInside); var surfaceLineAdapter = new SurfaceLineHeightAdapter(surfaceLine, location); var constructNewSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(1); { Assert.IsNotNull(constructNewSurfaceLine); } } } [Test] public void AdaptedSurfaceLineHasSamePointAtToeRiver() { var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var location = new Location(); { const double newDikeHeight = 6.0; var pointAtToeRiver = new GeometryPoint { X = 17, Z = 0 }; var pointAtTopRiver = new GeometryPoint { X = 34.5, Z = 5 }; var pointAtTopPolder = new GeometryPoint { X = 35, Z = 5 }; var pointAtToePolder = new GeometryPoint { X = 36, Z = 0 }; surfaceLine.EnsurePointOfType(pointAtToeRiver.X, pointAtToePolder.Z, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(pointAtTopRiver.X, pointAtTopRiver.Z, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(pointAtTopPolder.X, pointAtTopPolder.Z, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(pointAtToePolder.X, pointAtToePolder.Z, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(100, 0, CharacteristicPointType.SurfaceLevelInside); var surfaceLineAdapter = new SurfaceLineHeightAdapter(surfaceLine, location); var newSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(newDikeHeight); { var newPointAtToeRiver = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtRiver); Assert.IsTrue(newPointAtToeRiver.LocationEquals(pointAtToeRiver)); Assert.IsTrue(newSurfaceLine.Geometry.Points.Any(p => p.LocationEquals(pointAtToeRiver))); } } } [Test] public void AdaptedSurfaceLineHasSameSlopeInside() { var line = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var surfaceLine = line; var location = new Location(); const double cToleranceSlope = 0.0001; const double newDikeHeight = 6.0; var pointAtToeRiver = new GeometryPoint { X = 17, Z = 0 }; var pointAtTopRiver = new GeometryPoint { X = 34.5, Z = 5 }; var pointAtTopPolder = new GeometryPoint { X = 35, Z = 5 }; var pointAtToePolder = new GeometryPoint { X = 36, Z = 0 }; surfaceLine.EnsurePointOfType(100, 0, CharacteristicPointType.SurfaceLevelInside); surfaceLine.EnsurePointOfType(pointAtToeRiver.X, pointAtToePolder.Z, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(pointAtTopRiver.X, pointAtTopRiver.Z, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(pointAtTopPolder.X, pointAtTopPolder.Z, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(pointAtToePolder.X, pointAtToePolder.Z, CharacteristicPointType.DikeToeAtPolder); var surfaceLineAdapter = new SurfaceLineHeightAdapter(surfaceLine, location); var newSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(newDikeHeight); double oldSlope = surfaceLine.TanSlopeInside(); double newSlope = newSurfaceLine.TanSlopeInside(); Assert.AreEqual(oldSlope, newSlope, cToleranceSlope); } [Test] public void AdaptedSurfaceLineHasCorrectNewPointAtTopRiver() { var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var location = new Location(); const double newDikeHeight = 2.0; var pointAtToeRiver = new GeometryPoint { X = 0, Z = 0 }; var pointAtTopRiver = new GeometryPoint { X = 1, Z = 1 }; var pointAtTopPolder = new GeometryPoint { X = 2, Z = 1 }; var pointAtToePolder = new GeometryPoint { X = 3, Z = 0 }; surfaceLine.EnsurePointOfType(pointAtToeRiver.X, pointAtToeRiver.Z, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(pointAtTopRiver.X, pointAtTopRiver.Z, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(pointAtTopPolder.X, pointAtTopPolder.Z, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(pointAtToePolder.X, pointAtToePolder.Z, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(100, 0, CharacteristicPointType.SurfaceLevelInside); var surfaceLineAdapter = new SurfaceLineHeightAdapter(surfaceLine, location); var newSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(newDikeHeight); var actualPoint = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtRiver); var expectedPoint = new GeometryPoint { X = 2, Z = 2 }; Assert.IsTrue(expectedPoint.LocationEquals(actualPoint)); } [Test] public void AdaptedSurfaceLineHasRemovedOldPointAtTopRiverCorrectly() { var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var location = new Location(); const double newDikeHeight = 2.0; var pointAtToeRiver = new GeometryPoint { X = 0, Z = 0 }; var pointAtTopRiver = new GeometryPoint { X = 1, Z = 1 }; var pointAtTopPolder = new GeometryPoint { X = 2, Z = 1 }; var pointAtToePolder = new GeometryPoint { X = 3, Z = 0 }; surfaceLine.EnsurePointOfType(pointAtToeRiver.X, pointAtToeRiver.Z, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(pointAtTopRiver.X, pointAtTopRiver.Z, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(pointAtTopPolder.X, pointAtTopPolder.Z, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(pointAtToePolder.X, pointAtToePolder.Z, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(100, 0, CharacteristicPointType.SurfaceLevelInside); var surfaceLineAdapter = new SurfaceLineHeightAdapter(surfaceLine, location); var newSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(newDikeHeight); Assert.IsFalse(newSurfaceLine.Geometry.Points.Any(p => p.LocationEquals(pointAtTopRiver))); } [Test] public void AdaptedSurfaceLineWithoutShoulderHasCorrectNewPointAtTopPolder() { var line = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var surfaceLine = line; var location = new Location(); const double newDikeHeight = 2.0; var pointAtToeRiver = new GeometryPoint { X = 0, Z = 0 }; var pointAtTopRiver = new GeometryPoint { X = 1, Z = 1 }; var pointAtTopPolder = new GeometryPoint { X = 2, Z = 1 }; var pointAtToePolder = new GeometryPoint { X = 3, Z = 0 }; surfaceLine.EnsurePointOfType(pointAtToeRiver.X, pointAtToeRiver.Z, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(pointAtTopRiver.X, pointAtTopRiver.Z, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(pointAtTopPolder.X, pointAtTopPolder.Z, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(pointAtToePolder.X, pointAtToePolder.Z, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(100, 0, CharacteristicPointType.SurfaceLevelInside); var surfaceLineAdapter = new SurfaceLineHeightAdapter(surfaceLine, location); var newSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(newDikeHeight); var actualPoint = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtPolder); var expectedPoint = new GeometryPoint { X = 3, Z = 2 }; Assert.IsTrue(expectedPoint.LocationEquals(actualPoint)); } [Test] public void AdaptedSurfaceLineWithoutShoulderHasCorrectlyRemovedOldPointAtTopPolder() { var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var location = new Location(); const double newDikeHeight = 2.0; var pointAtToeRiver = new GeometryPoint { X = 0, Z = 0 }; var pointAtTopRiver = new GeometryPoint { X = 1, Z = 1 }; var pointAtTopPolder = new GeometryPoint { X = 2, Z = 1 }; var pointAtToePolder = new GeometryPoint { X = 3, Z = 0 }; surfaceLine.EnsurePointOfType(pointAtToeRiver.X, pointAtToeRiver.Z, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(pointAtTopRiver.X, pointAtTopRiver.Z, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(pointAtTopPolder.X, pointAtTopPolder.Z, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(pointAtToePolder.X, pointAtToePolder.Z, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(100, 0, CharacteristicPointType.SurfaceLevelInside); var surfaceLineAdapter = new SurfaceLineHeightAdapter(surfaceLine, location); var newSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(newDikeHeight); Assert.IsFalse(newSurfaceLine.Geometry.Points.Any(p => p.LocationEquals(pointAtTopPolder))); } [Test] public void AdaptedSurfaceLineWithoutShoulderHasCorrectNewPointAtToePolder() { var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var location = new Location(); const double newDikeHeight = 2.0; var pointAtToeRiver = new GeometryPoint { X = 0, Z = 0 }; var pointAtTopRiver = new GeometryPoint { X = 2, Z = 1 }; var pointAtTopPolder = new GeometryPoint { X = 3, Z = 1 }; var pointAtToePolder = new GeometryPoint { X = 7, Z = 0 }; surfaceLine.EnsurePointOfType(pointAtToeRiver.X, pointAtToeRiver.Z, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(pointAtTopRiver.X, pointAtTopRiver.Z, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(pointAtTopPolder.X, pointAtTopPolder.Z, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(pointAtToePolder.X, pointAtToePolder.Z, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(100, 0, CharacteristicPointType.SurfaceLevelInside); var surfaceLineAdapter = new SurfaceLineHeightAdapter(surfaceLine, location); var newSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(newDikeHeight); var actualPoint = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder); var expectedPoint = new GeometryPoint { X = 13 }; Assert.IsTrue(expectedPoint.LocationEquals(actualPoint)); double oldSlope = surfaceLine.TanSlopeInside(); double newSlope = newSurfaceLine.TanSlopeInside(); Assert.AreEqual(oldSlope, newSlope, 0.001); } [Test] public void AdaptedSurfaceLineWithShoulderHasCorrectPointAtToePolder() { var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var location = new Location(); const double newDikeHeight = 2.0; surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(1, 1, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(2, 1, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(3, 0.5, CharacteristicPointType.ShoulderBaseInside); surfaceLine.EnsurePointOfType(4, 0.5, CharacteristicPointType.ShoulderTopInside); surfaceLine.EnsurePointOfType(5, 0, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(100, 0, CharacteristicPointType.SurfaceLevelInside); var surfaceLineAdapter = new SurfaceLineHeightAdapter(surfaceLine, location); var newSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(newDikeHeight); var expectedPoint = new GeometryPoint() { X = 7, Z = 0 }; // var actualPoint = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder); Assert.IsTrue(expectedPoint.LocationEquals(actualPoint)); } [Test] public void AdaptedSurfaceLineHasRemovedShoulderPointsCorrectly() { var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var location = new Location(); const double newDikeHeight = 3.0; var pointAtToeRiver = new GeometryPoint { X = 0, Z = 0 }; var pointAtTopRiver = new GeometryPoint { X = 1, Z = 1 }; var pointAtTopPolder = new GeometryPoint { X = 2, Z = 1 }; var pointAtShoulderInsteek = new GeometryPoint { X = 3, Z = 0.5 }; var pointAtShoulderTop = new GeometryPoint { X = 4, Z = 0.5 }; var pointAtToePolder = new GeometryPoint { X = 5, Z = 0 }; var pointAtSurfaceLevelInside = new GeometryPoint { X = 100, Z = 0 }; surfaceLine.EnsurePointOfType(pointAtToeRiver.X, pointAtToeRiver.Z, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(pointAtTopRiver.X, pointAtTopRiver.Z, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(pointAtTopPolder.X, pointAtTopPolder.Z, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(pointAtShoulderInsteek.X, pointAtShoulderInsteek.Z, CharacteristicPointType.ShoulderBaseInside); surfaceLine.EnsurePointOfType(pointAtShoulderTop.X, pointAtShoulderTop.Z, CharacteristicPointType.ShoulderTopInside); surfaceLine.EnsurePointOfType(pointAtToePolder.X, pointAtToePolder.Z, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(pointAtSurfaceLevelInside.X, pointAtSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside); var surfaceLineAdapter = new SurfaceLineHeightAdapter(surfaceLine, location); var newSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(newDikeHeight); Assert.IsNull(newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.ShoulderTopInside)); Assert.IsNull(newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.ShoulderBaseInside)); Assert.IsFalse(newSurfaceLine.Geometry.Points.Any(p => p.LocationEquals(pointAtShoulderInsteek))); Assert.IsFalse(newSurfaceLine.Geometry.Points.Any(p => p.LocationEquals(pointAtShoulderTop))); var newPointAtToePolder = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder); Assert.AreEqual(3, newSurfaceLine.GetPointSegmentIncluding(pointAtTopRiver.X, newPointAtToePolder.X).Count()); Assert.AreEqual(5, newSurfaceLine.Geometry.Points.Count); } [Test] public void AdaptedSurfaceLineWithLargeShoulderHaveSameToeAtPolder() { var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var location = new Location(); const double newDikeHeight = 1.5; var pointAtToeRiver = new GeometryPoint { X = 0, Z = 0 }; var pointAtTopRiver = new GeometryPoint { X = 1, Z = 1 }; var pointAtTopPolder = new GeometryPoint { X = 2, Z = 1 }; var pointAtShoulderInsteek = new GeometryPoint { X = 3, Z = 0.5 }; var pointAtShoulderTop = new GeometryPoint { X = 5, Z = 0.5 }; var pointAtToePolder = new GeometryPoint { X = 6, Z = 0 }; var pointAtSurfaceLevelInside = new GeometryPoint { X = 100, Z = 0 }; surfaceLine.EnsurePointOfType(pointAtToeRiver.X, pointAtToeRiver.Z, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(pointAtTopRiver.X, pointAtTopRiver.Z, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(pointAtTopPolder.X, pointAtTopPolder.Z, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(pointAtShoulderInsteek.X, pointAtShoulderInsteek.Z, CharacteristicPointType.ShoulderBaseInside); surfaceLine.EnsurePointOfType(pointAtShoulderTop.X, pointAtShoulderTop.Z, CharacteristicPointType.ShoulderTopInside); surfaceLine.EnsurePointOfType(pointAtToePolder.X, pointAtToePolder.Z, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(pointAtSurfaceLevelInside.X, pointAtSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside); var surfaceLineAdapter = new SurfaceLineHeightAdapter(surfaceLine, location); var newSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(newDikeHeight); Assert.IsTrue(pointAtToePolder.LocationEquals(newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder))); } [Test] public void AdaptedSurfaceLineWithLargeShoulderHaveSameTopAtShoulderInside() { var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var location = new Location(); const double newDikeHeight = 3.0; var pointAtToeRiver = new GeometryPoint { X = 0, Z = 0 }; var pointAtTopRiver = new GeometryPoint { X = 1, Z = 2 }; var pointAtTopPolder = new GeometryPoint { X = 2, Z = 2 }; var pointAtShoulderInsteek = new GeometryPoint { X = 3, Z = 1 }; var pointAtShoulderTop = new GeometryPoint { X = 5, Z = 1 }; var pointAtToePolder = new GeometryPoint { X = 6, Z = 2 }; var pointAtSurfaceLevelInside = new GeometryPoint { X = 100, Z = 0 }; surfaceLine.EnsurePointOfType(pointAtToeRiver.X, pointAtToeRiver.Z, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(pointAtTopRiver.X, pointAtTopRiver.Z, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(pointAtTopPolder.X, pointAtTopPolder.Z, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(pointAtShoulderInsteek.X, pointAtShoulderInsteek.Z, CharacteristicPointType.ShoulderBaseInside); surfaceLine.EnsurePointOfType(pointAtShoulderTop.X, pointAtShoulderTop.Z, CharacteristicPointType.ShoulderTopInside); surfaceLine.EnsurePointOfType(pointAtToePolder.X, pointAtToePolder.Z, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(pointAtSurfaceLevelInside.X, pointAtSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside); var surfaceLineAdapter = new SurfaceLineHeightAdapter(surfaceLine, location); var newSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(newDikeHeight); Assert.IsTrue(pointAtShoulderTop.LocationEquals(newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.ShoulderTopInside))); } [Test] public void AdaptedSurfaceLineWithLargeShoulderShouldHaveACorrectIntersectionPoint() { var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var location = new Location(); const double newDikeHeight = 3.0; var pointAtToeRiver = new GeometryPoint { X = 0, Z = 0 }; var pointAtTopRiver = new GeometryPoint { X = 1, Z = 2 }; var pointAtTopPolder = new GeometryPoint { X = 2, Z = 2 }; var pointAtShoulderInsteek = new GeometryPoint { X = 3, Z = 1 }; var pointAtShoulderTop = new GeometryPoint { X = 5, Z = 1 }; var pointAtToePolder = new GeometryPoint { X = 6, Z = 0 }; var pointAtSurfaceLevelInside = new GeometryPoint { X = 100, Z = 0 }; surfaceLine.EnsurePointOfType(pointAtToeRiver.X, pointAtToeRiver.Z, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(pointAtTopRiver.X, pointAtTopRiver.Z, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(pointAtTopPolder.X, pointAtTopPolder.Z, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(pointAtShoulderInsteek.X, pointAtShoulderInsteek.Z, CharacteristicPointType.ShoulderBaseInside); surfaceLine.EnsurePointOfType(pointAtShoulderTop.X, pointAtShoulderTop.Z, CharacteristicPointType.ShoulderTopInside); surfaceLine.EnsurePointOfType(pointAtToePolder.X, pointAtToePolder.Z, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(pointAtSurfaceLevelInside.X, pointAtSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside); var surfaceLineAdapter = new SurfaceLineHeightAdapter(surfaceLine, location); var newSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(newDikeHeight); var expectedPoint = new GeometryPoint { X = 4.5, Z = 1 }; var actualPoint = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.ShoulderBaseInside); Assert.IsTrue(expectedPoint.LocationEquals(actualPoint)); } [Test] public void AdaptedSurfaceLineWithSoulderAndDitchShouldNotCreateInvalidSurfaceLine() { var surfaceLine = FactoryForSurfaceLines.CreateRealisticSurfaceLineForHeightAdapter(); var location = new Location(); const double newDikeHeight = 19.2; var validationError = surfaceLine.Validate().FirstOrDefault(vr => vr.MessageType == ValidationResultType.Error); if (validationError != null) { throw new SurfaceLineException(validationError.Text); } var surfaceLineAdapter = new SurfaceLineHeightAdapter(surfaceLine, location); var newSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(newDikeHeight); validationError = newSurfaceLine.Validate().FirstOrDefault(vr => vr.MessageType == ValidationResultType.Error); if (validationError != null) { throw new SurfaceLineException(validationError.Text); } } [Test] public void AdaptedSurfaceLineWithTrafficLoadPointsShouldAdjustThosePoints1() { var surfaceLine = FactoryForSurfaceLines.CreateRealisticSurfaceLineForHeightAdapter(); var location = new Location(); const double cTolerance = 0.0000001; const double newDikeHeight = 19.2; var surfaceLineAdapter = new SurfaceLineHeightAdapter(surfaceLine, location); var newSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(newDikeHeight); Assert.AreEqual(newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtPolder).Z, newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadOutside).Z, cTolerance); Assert.AreEqual(newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtPolder).Z, newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadInside).Z, cTolerance); } [Test] public void AdaptedSurfaceLineWithTrafficLoadPointsShouldAdjustThosePoints2() { var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var location = new Location(); const double newDikeHeight = 1.2; var pointDikeToeAtRiver = new GeometryPoint { X = 0, Z = 0 }; var pointDikeTopAtRiver = new GeometryPoint { X = 1, Z = 1 }; var pointTrafficLoadOutside = new GeometryPoint { X = 1.1, Z = 1 }; var pointTrafficLoadInside = new GeometryPoint { X = 1.9, Z = 1 }; var pointDikeTopAtPolder = new GeometryPoint { X = 2, Z = 1 }; var pointDikeToeAtPolder = new GeometryPoint { X = 3, Z = 0 }; surfaceLine.EnsurePointOfType(pointDikeToeAtRiver.X, pointDikeToeAtRiver.Z, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(pointDikeTopAtRiver.X, pointDikeTopAtRiver.Z, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(pointTrafficLoadOutside.X, pointTrafficLoadOutside.Z, CharacteristicPointType.TrafficLoadOutside); surfaceLine.EnsurePointOfType(pointTrafficLoadInside.X, pointTrafficLoadInside.Z, CharacteristicPointType.TrafficLoadInside); surfaceLine.EnsurePointOfType(pointDikeTopAtPolder.X, pointDikeTopAtPolder.Z, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(100, 0, CharacteristicPointType.SurfaceLevelInside); var surfaceLineAdapter = new SurfaceLineHeightAdapter(surfaceLine, location); var newSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(newDikeHeight); Assert.AreEqual(newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtPolder).Z, newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadOutside).Z); Assert.AreEqual(newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtPolder).Z, newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadInside).Z); } /// /// Create dike with skewed dike table and points between characteristic points /// /// private SurfaceLine2 CreateSurfaceLineWithSkwewedDikeTableAndInBetweenPoints() { var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var point1 = new GeometryPoint { X = 0, Z = 0 }; var pointDikeToeAtRiver = new GeometryPoint { X = 2, Z = 0 }; var point2 = new GeometryPoint { X = 4, Z = 1 }; var pointDikeTopAtRiver = new GeometryPoint { X = 6, Z = 3 }; var point3 = new GeometryPoint { X = 7, Z = 3 }; var pointDikeTopAtPolder = new GeometryPoint { X = 8, Z = 3.5 }; var point4 = new GeometryPoint { X = 10, Z = 1.5 }; var pointDikeToeAtPolder = new GeometryPoint { X = 12, Z = 0.5 }; var point5 = new GeometryPoint { X = 13, Z = 0 }; var pointSurfaceLevelInside = new GeometryPoint { X = 100, Z = 0 }; surfaceLine.EnsurePointOfType(pointDikeToeAtRiver.X, pointDikeToeAtRiver.Z, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(pointDikeTopAtRiver.X, pointDikeTopAtRiver.Z, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(pointDikeTopAtPolder.X, pointDikeTopAtPolder.Z, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(pointSurfaceLevelInside.X, pointSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside); surfaceLine.EnsurePoint(point1.X, point1.Z); surfaceLine.EnsurePoint(point2.X, point2.Z); surfaceLine.EnsurePoint(point3.X, point3.Z); surfaceLine.EnsurePoint(point4.X, point4.Z); surfaceLine.EnsurePoint(point5.X, point5.Z); surfaceLine.SortPoints(); return surfaceLine; } /// /// Test if dike with skewed dike table and points between characteristic points is constructed correctly with new height /// [Test] public void CanAdaptSurfaceLineWithSkewedDikeTableAndInBetweenPoints() { SurfaceLine2 surfaceLine = CreateSurfaceLineWithSkwewedDikeTableAndInBetweenPoints(); var location = new Location(); const double cTolerance = 0.001; const double newDikeHeight = 4.0; Assert.AreEqual(10, surfaceLine.Geometry.Points.Count); var surfaceLineAdapter = new SurfaceLineHeightAdapter(surfaceLine, location); var newSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(newDikeHeight); Assert.AreEqual(6, newSurfaceLine.Geometry.Points.Count); Assert.AreEqual(7.3333, newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtRiver).X, cTolerance); Assert.AreEqual(4.0000, newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtRiver).Z, cTolerance); Assert.AreEqual(9.3333, newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtPolder).X, cTolerance); Assert.AreEqual(4.0000, newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtPolder).Z, cTolerance); Assert.AreEqual(14.6666, newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder).X, cTolerance); Assert.AreEqual(0.0000, newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder).Z, cTolerance); Assert.AreEqual(100.000, newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelInside).X, cTolerance); Assert.AreEqual(0.0000, newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelInside).Z, cTolerance); } [Test] public void AdaptedSurfaceLineWithNewDefinedTopExactOnOldTop() { var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var location = new Location(); const double newDikeHeight = 2.0; surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(1, 1, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(4, 1, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(5, 0, CharacteristicPointType.ShoulderBaseInside); surfaceLine.EnsurePointOfType(6, 0, CharacteristicPointType.ShoulderTopInside); surfaceLine.EnsurePointOfType(7, -1, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(100, 0, CharacteristicPointType.SurfaceLevelInside); location.UseNewDikeTopWidth = true; location.NewDikeTopWidth = 1; var surfaceLineAdapter = new SurfaceLineHeightAdapter(surfaceLine, location); var newSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(newDikeHeight); var expectedNewTopRiver = new GeometryPoint() { X = 2, Z = 2 }; var actualNewTopRiver = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtRiver); Assert.IsTrue(expectedNewTopRiver.LocationEquals(actualNewTopRiver)); var expectedNewTopPolder = new GeometryPoint() { X = 3, Z = 2 }; var actualNewTopPolder = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtPolder); Assert.IsTrue(expectedNewTopPolder.LocationEquals(actualNewTopPolder)); var expectedShoulderBaseInside = new GeometryPoint() { X = 5, Z = 0 }; var actualShoulderBaseInside = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.ShoulderBaseInside); Assert.IsTrue(expectedShoulderBaseInside.LocationEquals(actualShoulderBaseInside)); Assert.AreEqual(9, newSurfaceLine.Geometry.Points.Count); } [Test] public void AdaptedSurfaceLineWithNewDefinedTopSmallerThanOldTop() { var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var location = new Location(); const double newDikeHeight = 2.0; surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(1, 1, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(4, 1, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(5, 0, CharacteristicPointType.ShoulderBaseInside); surfaceLine.EnsurePointOfType(6, 0, CharacteristicPointType.ShoulderTopInside); surfaceLine.EnsurePointOfType(7, -1, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(100, 0, CharacteristicPointType.SurfaceLevelInside); location.UseNewDikeTopWidth = true; location.NewDikeTopWidth = 0.8; var surfaceLineAdapter = new SurfaceLineHeightAdapter(surfaceLine, location); var newSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(newDikeHeight); var expectedNewTopRiver = new GeometryPoint() { X = 2, Z = 2 }; var actualNewTopRiver = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtRiver); Assert.IsTrue(expectedNewTopRiver.LocationEquals(actualNewTopRiver)); var expectedNewTopPolder = new GeometryPoint() { X = 2.8, Z = 2 }; var actualNewTopPolder = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtPolder); Assert.IsTrue(expectedNewTopPolder.LocationEquals(actualNewTopPolder)); var expectedNewPoint = new GeometryPoint() { X = 3.8, Z = 1 }; var actualNewPoint = newSurfaceLine.Geometry.Points[4]; Assert.IsTrue(expectedNewPoint.LocationEquals(actualNewPoint)); var expectedShoulderBaseInside = new GeometryPoint() { X = 5, Z = 0 }; var actualShoulderBaseInside = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.ShoulderBaseInside); Assert.IsTrue(expectedShoulderBaseInside.LocationEquals(actualShoulderBaseInside)); Assert.AreEqual(10, newSurfaceLine.Geometry.Points.Count); } [Test] public void AdaptedSurfaceLineWithNewDefinedTopWiderThanOldTopBeyondShoulder() { var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var location = new Location(); const double newDikeHeight = 2.0; surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(1, 1, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(4, 1, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(5, 0, CharacteristicPointType.ShoulderBaseInside); surfaceLine.EnsurePointOfType(6, 0, CharacteristicPointType.ShoulderTopInside); surfaceLine.EnsurePointOfType(7, -1, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(100, -1, CharacteristicPointType.SurfaceLevelInside); location.UseNewDikeTopWidth = true; location.NewDikeTopWidth = 3; var surfaceLineAdapter = new SurfaceLineHeightAdapter(surfaceLine, location); var newSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(newDikeHeight); var expectedNewTopRiver = new GeometryPoint() { X = 2, Z = 2 }; var actualNewTopRiver = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtRiver); Assert.IsTrue(expectedNewTopRiver.LocationEquals(actualNewTopRiver)); var expectedNewTopPolder = new GeometryPoint() { X = 5, Z = 2 }; var actualNewTopPolder = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtPolder); Assert.IsTrue(expectedNewTopPolder.LocationEquals(actualNewTopPolder)); var expectedToeInside = new GeometryPoint() { X = 8, Z = -1 }; var actualToeInside = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder); Assert.IsTrue(expectedToeInside.LocationEquals(actualToeInside)); Assert.AreEqual(5, newSurfaceLine.Geometry.Points.Count); } [Test] public void AdaptedSurfaceLineWithNewDefinedTopWiderThanOldTopOnShoulderTopInside() { var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var location = new Location(); const double newDikeHeight = 2.0; surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(1, 1, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(4, 1, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(5, 0, CharacteristicPointType.ShoulderBaseInside); surfaceLine.EnsurePointOfType(6, 0, CharacteristicPointType.ShoulderTopInside); surfaceLine.EnsurePointOfType(7, -1, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(100, -1, CharacteristicPointType.SurfaceLevelInside); location.UseNewDikeTopWidth = true; location.NewDikeTopWidth = 2; var surfaceLineAdapter = new SurfaceLineHeightAdapter(surfaceLine, location); var newSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(newDikeHeight); var expectedNewTopRiver = new GeometryPoint() { X = 2, Z = 2 }; var actualNewTopRiver = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtRiver); Assert.IsTrue(expectedNewTopRiver.LocationEquals(actualNewTopRiver)); var expectedNewTopPolder = new GeometryPoint() { X = 4, Z = 2 }; var actualNewTopPolder = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtPolder); Assert.IsTrue(expectedNewTopPolder.LocationEquals(actualNewTopPolder)); var expectedToeInside = new GeometryPoint() { X = 7, Z = -1 }; var actualToeInside = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder); Assert.IsTrue(expectedToeInside.LocationEquals(actualToeInside)); Assert.AreEqual(6, newSurfaceLine.Geometry.Points.Count); } [Test] public void AdaptedSurfaceLineWithNewDefinedTopWiderThanOldTopIntersectingShoulder() { var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var location = new Location(); const double newDikeHeight = 2.0; surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(1, 1, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(4, 1, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(5, 0, CharacteristicPointType.ShoulderBaseInside); surfaceLine.EnsurePointOfType(6, 0, CharacteristicPointType.ShoulderTopInside); surfaceLine.EnsurePointOfType(7, -1, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(100, -1, CharacteristicPointType.SurfaceLevelInside); location.UseNewDikeTopWidth = true; location.NewDikeTopWidth = 1.5; var surfaceLineAdapter = new SurfaceLineHeightAdapter(surfaceLine, location); var newSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(newDikeHeight); var expectedNewTopRiver = new GeometryPoint() { X = 2, Z = 2 }; var actualNewTopRiver = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtRiver); Assert.IsTrue(expectedNewTopRiver.LocationEquals(actualNewTopRiver)); var expectedNewTopPolder = new GeometryPoint() { X = 3.5, Z = 2 }; var actualNewTopPolder = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtPolder); Assert.IsTrue(expectedNewTopPolder.LocationEquals(actualNewTopPolder)); var expectedShoulderBaseInside = new GeometryPoint() { X = 5.5, Z = 0 }; var actualShoulderBaseInside = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.ShoulderBaseInside); Assert.IsTrue(expectedShoulderBaseInside.LocationEquals(actualShoulderBaseInside)); var expectedShoulderTopInside = new GeometryPoint() { X = 6, Z = 0 }; var actualShoulderTopInside = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.ShoulderTopInside); Assert.IsTrue(expectedShoulderTopInside.LocationEquals(actualShoulderTopInside)); var expectedToeInside = new GeometryPoint() { X = 7, Z = -1 }; var actualToeInside = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder); Assert.IsTrue(expectedToeInside.LocationEquals(actualToeInside)); Assert.AreEqual(7, newSurfaceLine.Geometry.Points.Count); } [Test] public void AdaptedSurfaceLineWithNewDefinedInsideSlope() { var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var location = new Location(); const double newDikeHeight = 2.0; surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(1, 1, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(4, 1, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(5, 0, CharacteristicPointType.ShoulderBaseInside); surfaceLine.EnsurePointOfType(6, 0, CharacteristicPointType.ShoulderTopInside); surfaceLine.EnsurePointOfType(7, -1, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(100, -1, CharacteristicPointType.SurfaceLevelInside); location.UseNewDikeSlopeInside = true; location.NewDikeSlopeInside = 0.5; var surfaceLineAdapter = new SurfaceLineHeightAdapter(surfaceLine, location); var newSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(newDikeHeight); var expectedNewTopRiver = new GeometryPoint() { X = 2, Z = 2 }; var actualNewTopRiver = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtRiver); Assert.IsTrue(expectedNewTopRiver.LocationEquals(actualNewTopRiver)); var expectedNewTopPolder = new GeometryPoint() { X = 5, Z = 2 }; var actualNewTopPolder = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtPolder); Assert.IsTrue(expectedNewTopPolder.LocationEquals(actualNewTopPolder)); var expectedToeInside = new GeometryPoint() { X = 11, Z = -1 }; var actualToeInside = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder); Assert.IsTrue(expectedToeInside.LocationEquals(actualToeInside)); Assert.AreEqual(5, newSurfaceLine.Geometry.Points.Count); } [Test] public void AdaptedSurfaceLineWithNewDefinedInsideSlopeEndingOnOldShoulderTop() { var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var location = new Location(); const double newDikeHeight = 2.0; surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(1, 1, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(4, 1, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(5, 0, CharacteristicPointType.ShoulderBaseInside); surfaceLine.EnsurePointOfType(6, 0, CharacteristicPointType.ShoulderTopInside); surfaceLine.EnsurePointOfType(7, -1, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(100, -1, CharacteristicPointType.SurfaceLevelInside); location.UseNewDikeSlopeInside = true; location.NewDikeSlopeInside = 2; var surfaceLineAdapter = new SurfaceLineHeightAdapter(surfaceLine, location); var newSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(newDikeHeight); var expectedNewTopRiver = new GeometryPoint() { X = 2, Z = 2 }; var actualNewTopRiver = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtRiver); Assert.IsTrue(expectedNewTopRiver.LocationEquals(actualNewTopRiver)); var expectedNewTopPolder = new GeometryPoint() { X = 5, Z = 2 }; var actualNewTopPolder = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtPolder); Assert.IsTrue(expectedNewTopPolder.LocationEquals(actualNewTopPolder)); var expectedPoint = new GeometryPoint() { X = 6, Z = 0 }; var actualPoint = newSurfaceLine.Geometry.Points[3]; Assert.IsTrue(expectedPoint.LocationEquals(actualPoint)); var expectedToeInside = new GeometryPoint() { X = 7, Z = -1 }; var actualToeInside = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder); Assert.IsTrue(expectedToeInside.LocationEquals(actualToeInside)); Assert.AreEqual(6, newSurfaceLine.Geometry.Points.Count); } [Test] public void AdaptedSurfaceLineWithNewDefinedOutsideSlope2() { var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var location = new Location(); const double newDikeHeight = 2.0; surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(1, 1, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(4, 1, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(5, 0, CharacteristicPointType.ShoulderBaseInside); surfaceLine.EnsurePointOfType(6, 0, CharacteristicPointType.ShoulderTopInside); surfaceLine.EnsurePointOfType(7, -1, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(100, -1, CharacteristicPointType.SurfaceLevelInside); location.UseNewDikeSlopeOutside = true; location.NewDikeSlopeOutside = 2; var surfaceLineAdapter = new SurfaceLineHeightAdapter(surfaceLine, location); var newSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(newDikeHeight); var expectedNewTopRiver = new GeometryPoint() { X = 1.5, Z = 2 }; var actualNewTopRiver = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtRiver); Assert.IsTrue(expectedNewTopRiver.LocationEquals(actualNewTopRiver)); var expectedNewTopPolder = new GeometryPoint() { X = 4.5, Z = 2 }; var actualNewTopPolder = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtPolder); Assert.IsTrue(expectedNewTopPolder.LocationEquals(actualNewTopPolder)); var expectedToeInside = new GeometryPoint() { X = 7.5, Z = -1 }; var actualToeInside = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder); Assert.IsTrue(expectedToeInside.LocationEquals(actualToeInside)); Assert.AreEqual(6, newSurfaceLine.Geometry.Points.Count); } [Test] public void AdaptedSurfaceLineWithNewDefinedOutsideSlope05() { var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var location = new Location(); const double newDikeHeight = 2.0; surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(1, 1, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(4, 1, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(5, 0, CharacteristicPointType.ShoulderBaseInside); surfaceLine.EnsurePointOfType(6, 0, CharacteristicPointType.ShoulderTopInside); surfaceLine.EnsurePointOfType(7, -1, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(100, -1, CharacteristicPointType.SurfaceLevelInside); location.UseNewDikeSlopeOutside = true; location.NewDikeSlopeOutside = 0.5; var surfaceLineAdapter = new SurfaceLineHeightAdapter(surfaceLine, location); var newSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(newDikeHeight); var expectedNewTopRiver = new GeometryPoint() { X = 3, Z = 2 }; var actualNewTopRiver = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtRiver); Assert.IsTrue(expectedNewTopRiver.LocationEquals(actualNewTopRiver)); var expectedNewTopPolder = new GeometryPoint() { X = 6, Z = 2 }; var actualNewTopPolder = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtPolder); Assert.IsTrue(expectedNewTopPolder.LocationEquals(actualNewTopPolder)); var expectedToeInside = new GeometryPoint() { X = 9, Z = -1 }; var actualToeInside = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder); Assert.IsTrue(expectedToeInside.LocationEquals(actualToeInside)); Assert.AreEqual(6, newSurfaceLine.Geometry.Points.Count); } [Test] public void AdaptedSurfaceLineWithNewDefinedTopWidthAndOutsideSlopeAndInsideSlope() { var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var location = new Location(); const double newDikeHeight = 2.0; surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(1, 1, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(4, 1, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(5, 0, CharacteristicPointType.ShoulderBaseInside); surfaceLine.EnsurePointOfType(6, 0, CharacteristicPointType.ShoulderTopInside); surfaceLine.EnsurePointOfType(7, -1, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(100, -1, CharacteristicPointType.SurfaceLevelInside); location.UseNewDikeSlopeOutside = true; location.NewDikeSlopeOutside = 2; location.UseNewDikeSlopeInside = true; location.NewDikeSlopeInside = 2; location.UseNewDikeTopWidth = true; location.NewDikeTopWidth = 1.5; var surfaceLineAdapter = new SurfaceLineHeightAdapter(surfaceLine, location); var newSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(newDikeHeight); var expectedNewTopRiver = new GeometryPoint() { X = 1.5, Z = 2 }; var actualNewTopRiver = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtRiver); Assert.IsTrue(expectedNewTopRiver.LocationEquals(actualNewTopRiver)); var expectedNewTopPolder = new GeometryPoint() { X = 3, Z = 2 }; var actualNewTopPolder = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtPolder); Assert.IsTrue(expectedNewTopPolder.LocationEquals(actualNewTopPolder)); var expectedPoint = new GeometryPoint() { X = 3.5, Z = 1 }; var actualPoint = newSurfaceLine.Geometry.Points[4]; Assert.IsTrue(expectedPoint.LocationEquals(actualPoint)); var expectedPoint2 = new GeometryPoint() { X = 4, Z = 1 }; var actualPoint2 = newSurfaceLine.Geometry.Points[5]; Assert.IsTrue(expectedPoint2.LocationEquals(actualPoint2)); var expectedShoulderBaseInside = new GeometryPoint() { X = 5, Z = 0 }; var actualShoulderBaseInside = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.ShoulderBaseInside); Assert.IsTrue(expectedShoulderBaseInside.LocationEquals(actualShoulderBaseInside)); var expectedToeInside = new GeometryPoint() { X = 7, Z = -1 }; var actualToeInside = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder); Assert.IsTrue(expectedToeInside.LocationEquals(actualToeInside)); Assert.AreEqual(10, newSurfaceLine.Geometry.Points.Count); } [Test] public void AdaptedSurfaceLineWithNewDefinedTopWidthAndOutsideSlopeAndInsideSlope05() { var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var location = new Location(); const double newDikeHeight = 2.0; surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(1, 1, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(4, 1, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(5, 0, CharacteristicPointType.ShoulderBaseInside); surfaceLine.EnsurePointOfType(6, 0, CharacteristicPointType.ShoulderTopInside); surfaceLine.EnsurePointOfType(7, -1, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(100, -1, CharacteristicPointType.SurfaceLevelInside); location.UseNewDikeSlopeOutside = true; location.NewDikeSlopeOutside = 2; location.UseNewDikeSlopeInside = true; location.NewDikeSlopeInside = 0.5; location.UseNewDikeTopWidth = true; location.NewDikeTopWidth = 1.5; var surfaceLineAdapter = new SurfaceLineHeightAdapter(surfaceLine, location); var newSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(newDikeHeight); var expectedNewTopRiver = new GeometryPoint() { X = 1.5, Z = 2 }; var actualNewTopRiver = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtRiver); Assert.IsTrue(expectedNewTopRiver.LocationEquals(actualNewTopRiver)); var expectedNewTopPolder = new GeometryPoint() { X = 3, Z = 2 }; var actualNewTopPolder = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtPolder); Assert.IsTrue(expectedNewTopPolder.LocationEquals(actualNewTopPolder)); var expectedToeInside = new GeometryPoint() { X = 9, Z = -1 }; var actualToeInside = newSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder); Assert.IsTrue(expectedToeInside.LocationEquals(actualToeInside)); Assert.AreEqual(6, newSurfaceLine.Geometry.Points.Count); } [Test] [ExpectedException(typeof(SurfaceLineAdapterException))] public void HeightAdaptionThrowsExceptionIfSurfaceLIsNotLongEnough() { var surfaceLine = FactoryForSurfaceLines.CreateRealisticSurfaceLineForHeightAdapter(); var location = new Location(); const double newDikeHeight = 19.0; var pointSurfaceLevelInside = new GeometryPoint { X = 40, Z = 12 }; // Set surfacelevelinside just beside ditch to force exception surfaceLine.EnsurePointOfType(pointSurfaceLevelInside.X, pointSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside); var surfaceLineAdapter = new SurfaceLineHeightAdapter(surfaceLine, location); var newSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(newDikeHeight); Assert.Null(newSurfaceLine); } } }