// Copyright (C) Stichting Deltares 2023. 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 Deltares.DamEngine.Calculators.DikesDesign;
using Deltares.DamEngine.Data.General;
using Deltares.DamEngine.Data.Geometry;
using Deltares.DamEngine.Data.Geotechnics;
using NUnit.Framework;
namespace Deltares.DamEngine.Calculators.Tests.DikesDesign
{
///
/// Class for testing SurfaceLineSlopeAdapter
///
[TestFixture]
public class SurfaceLineSlopeAdapterTest
{
private readonly Location location = new Location();
///
/// Tests the fixture tear down.
///
[TearDown]
public void TestFixtureTearDown()
{
}
private static SurfaceLine2 CreateSimpleDike()
{
var surfaceLine = new SurfaceLine2
{
CharacteristicPoints = { GeometryMustContainPoint = true },
Geometry = new GeometryPointString()
};
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);
return surfaceLine;
}
#region ConstructWithDeltaX
[Test]
public void ConstructNewSurfaceLineReturnsANewSurfaceLine()
{
var surfaceLine = CreateSimpleDike();
var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0);
var constructNewSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(1);
Assert.IsNotNull(constructNewSurfaceLine);
}
[Test]
public void AdaptedSimpleDikeLineHasCorrectNewToeDikeAtPolder()
{
var surfaceLine = CreateSimpleDike();
var pointDikeToeAtPolder = new GeometryPoint { X = 3, Z = 0 };
surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder);
var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0);
var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(1.0);
var expectedPointDikeToeAtPolder = new GeometryPoint { X = 4, Z = 0 };
Assert.IsTrue(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder)));
}
[Test]
public void AdaptedDikeWithShoulderHasCorrectPointsAfterToeSlope()
{
var surfaceLine = new SurfaceLine2
{
CharacteristicPoints =
{
GeometryMustContainPoint = true
},
Geometry = new GeometryPointString()
};
var pointShoulderBaseInside = new GeometryPoint { X = 9, Z = 1 };
var pointShoulderTopInside = new GeometryPoint { X = 11, Z = 1 };
var pointDikeToeAtPolder = new GeometryPoint { X = 14, Z = 0 };
var pointSurfaceLevelInside = new GeometryPoint { X = 20, Z = 0 };
surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver);
surfaceLine.EnsurePointOfType(4, 3, CharacteristicPointType.DikeTopAtRiver);
surfaceLine.EnsurePointOfType(6, 3, CharacteristicPointType.DikeTopAtPolder);
surfaceLine.EnsurePointOfType(pointShoulderBaseInside.X, pointShoulderBaseInside.Z, CharacteristicPointType.ShoulderBaseInside);
surfaceLine.EnsurePointOfType(pointShoulderTopInside.X, pointShoulderTopInside.Z, CharacteristicPointType.ShoulderTopInside);
surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder);
surfaceLine.EnsurePointOfType(pointSurfaceLevelInside.X, pointSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside);
var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0);
const double deltaX = 1.0;
var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(deltaX);
var expectedPointShoulderBaseInside = new GeometryPoint { X = pointShoulderBaseInside.X + deltaX, Z = pointShoulderBaseInside.Z };
var expectedPointShoulderTopInside = new GeometryPoint { X = pointShoulderTopInside.X, Z = pointShoulderTopInside.Z };
var expectedPointDikeToeAtPolder = new GeometryPoint { X = pointDikeToeAtPolder.X, Z = pointDikeToeAtPolder.Z };
var expectedPointSurfaceLevelInside = new GeometryPoint { X = pointSurfaceLevelInside.X, Z = pointSurfaceLevelInside.Z };
Assert.IsTrue(expectedPointShoulderBaseInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.ShoulderBaseInside)));
Assert.IsTrue(expectedPointShoulderTopInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.ShoulderTopInside)));
Assert.IsTrue(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder)));
Assert.IsTrue(expectedPointSurfaceLevelInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelInside)));
}
[Test]
public void AdaptedDikeWithDitchHasCorrectPointsAfterToeSlope()
{
var surfaceLine = new SurfaceLine2
{
CharacteristicPoints =
{
GeometryMustContainPoint = true
},
Geometry = new GeometryPointString()
};
var pointDikeToeAtPolder = new GeometryPoint { X = 14, Z = 0 };
var pointDitchDikeSide = new GeometryPoint { X = 16, Z = 0 };
var pointBottomDitchDikeSide = new GeometryPoint { X = 17, Z = -1 };
var pointBottomDitchPolderSide = new GeometryPoint { X = 18, Z = -1 };
var pointDitchPolderSide = new GeometryPoint { X = 19, Z = 0 };
var pointSurfaceLevelInside = new GeometryPoint { X = 30, Z = 0 };
surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver);
surfaceLine.EnsurePointOfType(4, 3, CharacteristicPointType.DikeTopAtRiver);
surfaceLine.EnsurePointOfType(6, 3, CharacteristicPointType.DikeTopAtPolder);
surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder);
surfaceLine.EnsurePointOfType(pointDitchDikeSide.X, pointDitchDikeSide.Z, CharacteristicPointType.DitchDikeSide);
surfaceLine.EnsurePointOfType(pointBottomDitchDikeSide.X, pointBottomDitchDikeSide.Z, CharacteristicPointType.BottomDitchDikeSide);
surfaceLine.EnsurePointOfType(pointBottomDitchPolderSide.X, pointBottomDitchPolderSide.Z, CharacteristicPointType.BottomDitchPolderSide);
surfaceLine.EnsurePointOfType(pointDitchPolderSide.X, pointDitchPolderSide.Z, CharacteristicPointType.DitchPolderSide);
surfaceLine.EnsurePointOfType(pointSurfaceLevelInside.X, pointSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside);
var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0);
const double deltaX = 1.0;
const double deltaXDitch = 3;
var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(deltaX);
var expectedPointDikeToeAtPolder = new GeometryPoint { X = pointDikeToeAtPolder.X + deltaX, Z = pointDikeToeAtPolder.Z };
var expectedPointDitchDikeSide = new GeometryPoint { X = pointDitchDikeSide.X + deltaX + deltaXDitch, Z = pointDitchDikeSide.Z };
var expectedPointBottomDitchDikeSide = new GeometryPoint { X = pointBottomDitchDikeSide.X + deltaX + deltaXDitch, Z = pointBottomDitchDikeSide.Z };
var expectedPointBottomDitchPolderSide = new GeometryPoint { X = pointBottomDitchPolderSide.X + deltaX + deltaXDitch, Z = pointBottomDitchPolderSide.Z };
var expectedPointDitchPolderSide = new GeometryPoint { X = pointDitchPolderSide.X + deltaX + deltaXDitch, Z = pointDitchPolderSide.Z };
var expectedPointSurfaceLevelInside = new GeometryPoint { X = pointSurfaceLevelInside.X, Z = pointSurfaceLevelInside.Z };
Assert.IsTrue(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder)));
Assert.IsTrue(expectedPointDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchDikeSide)));
Assert.IsTrue(expectedPointBottomDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchDikeSide)));
Assert.IsTrue(expectedPointBottomDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchPolderSide)));
Assert.IsTrue(expectedPointDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchPolderSide)));
Assert.IsTrue(expectedPointSurfaceLevelInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelInside)));
}
[Test]
public void AdaptedDikeWithShoulderAndDitchHasCorrectPointsAfterToeSlope()
{
var surfaceLine = new SurfaceLine2
{
CharacteristicPoints =
{
GeometryMustContainPoint = true
},
Geometry = new GeometryPointString()
};
var pointShoulderBaseInside = new GeometryPoint { X = 9, Z = 1 };
var pointShoulderTopInside = new GeometryPoint { X = 11, Z = 1 };
var pointDikeToeAtPolder = new GeometryPoint { X = 14, Z = 0 };
var pointDitchDikeSide = new GeometryPoint { X = 16, Z = 0 };
var pointBottomDitchDikeSide = new GeometryPoint { X = 17, Z = -1 };
var pointBottomDitchPolderSide = new GeometryPoint { X = 18, Z = -1 };
var pointDitchPolderSide = new GeometryPoint { X = 19, Z = 0 };
var pointSurfaceLevelInside = new GeometryPoint { X = 50, Z = 0 };
surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver);
surfaceLine.EnsurePointOfType(4, 3, CharacteristicPointType.DikeTopAtRiver);
surfaceLine.EnsurePointOfType(6, 3, CharacteristicPointType.DikeTopAtPolder);
surfaceLine.EnsurePointOfType(pointShoulderBaseInside.X, pointShoulderBaseInside.Z, CharacteristicPointType.ShoulderBaseInside);
surfaceLine.EnsurePointOfType(pointShoulderTopInside.X, pointShoulderTopInside.Z, CharacteristicPointType.ShoulderTopInside);
surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder);
surfaceLine.EnsurePointOfType(pointDitchDikeSide.X, pointDitchDikeSide.Z, CharacteristicPointType.DitchDikeSide);
surfaceLine.EnsurePointOfType(pointBottomDitchDikeSide.X, pointBottomDitchDikeSide.Z, CharacteristicPointType.BottomDitchDikeSide);
surfaceLine.EnsurePointOfType(pointBottomDitchPolderSide.X, pointBottomDitchPolderSide.Z, CharacteristicPointType.BottomDitchPolderSide);
surfaceLine.EnsurePointOfType(pointDitchPolderSide.X, pointDitchPolderSide.Z, CharacteristicPointType.DitchPolderSide);
surfaceLine.EnsurePointOfType(pointSurfaceLevelInside.X, pointSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside);
var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0);
const double deltaX = 1.0;
var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(deltaX);
var expectedPointShoulderBaseInside = new GeometryPoint { X = pointShoulderBaseInside.X + deltaX, Z = pointShoulderBaseInside.Z };
var expectedPointShoulderTopInside = new GeometryPoint { X = pointShoulderTopInside.X, Z = pointShoulderTopInside.Z };
var expectedPointDikeToeAtPolder = new GeometryPoint { X = pointDikeToeAtPolder.X, Z = pointDikeToeAtPolder.Z };
var expectedPointDitchDikeSide = new GeometryPoint { X = pointDitchDikeSide.X, Z = pointDitchDikeSide.Z };
var expectedPointBottomDitchDikeSide = new GeometryPoint { X = pointBottomDitchDikeSide.X, Z = pointBottomDitchDikeSide.Z };
var expectedPointBottomDitchPolderSide = new GeometryPoint { X = pointBottomDitchPolderSide.X, Z = pointBottomDitchPolderSide.Z };
var expectedPointDitchPolderSide = new GeometryPoint { X = pointDitchPolderSide.X, Z = pointDitchPolderSide.Z };
var expectedPointSurfaceLevelInside = new GeometryPoint { X = pointSurfaceLevelInside.X, Z = pointSurfaceLevelInside.Z };
Assert.IsTrue(expectedPointShoulderBaseInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.ShoulderBaseInside)));
Assert.IsTrue(expectedPointShoulderTopInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.ShoulderTopInside)));
Assert.IsTrue(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder)));
Assert.IsTrue(expectedPointDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchDikeSide)));
Assert.IsTrue(expectedPointBottomDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchDikeSide)));
Assert.IsTrue(expectedPointBottomDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchPolderSide)));
Assert.IsTrue(expectedPointDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchPolderSide)));
Assert.IsTrue(expectedPointSurfaceLevelInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelInside)));
}
[Test]
public void AdaptedSimpleDikeLineWithInBetweenPointOnInsideSlopeHasCorrectNewToeDikeAtPolder()
{
var surfaceLine = CreateSimpleDike();
surfaceLine.EnsurePoint(2.5, 0.4); // in between point on inside slope
surfaceLine.SortPoints();
var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0);
var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(1.0);
var expectedPointDikeToeAtPolder = new GeometryPoint { X = 4, Z = 0 };
Assert.AreEqual(6, surfaceLine.Geometry.Count);
Assert.AreEqual(5, adaptedSurfaceLine.Geometry.Count); // in between point should be thrown away
Assert.IsTrue(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder)));
}
[Test]
public void AdaptedSurfaceLineWithTrafficLoadPointsHasAdjustedPoints()
{
const double cTolerance = 0.0000001;
// Create the base surfaceline (dike with shoulder and ditch)
var surfaceLine = new SurfaceLine2
{
CharacteristicPoints =
{
GeometryMustContainPoint = true
},
Geometry = new GeometryPointString()
};
var pointShoulderBaseInside = new GeometryPoint { X = 9, Z = 1 };
var pointShoulderTopInside = new GeometryPoint { X = 11, Z = 1 };
var pointDikeToeAtPolder = new GeometryPoint { X = 14, Z = 0 };
var pointDitchDikeSide = new GeometryPoint { X = 16, Z = 0 };
var pointBottomDitchDikeSide = new GeometryPoint { X = 17, Z = -1 };
var pointBottomDitchPolderSide = new GeometryPoint { X = 18, Z = -1 };
var pointDitchPolderSide = new GeometryPoint { X = 19, Z = 0 };
var pointSurfaceLevelInside = new GeometryPoint { X = 20, Z = 0 };
surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver);
surfaceLine.EnsurePointOfType(4, 3, CharacteristicPointType.DikeTopAtRiver);
surfaceLine.EnsurePointOfType(6, 3, CharacteristicPointType.DikeTopAtPolder);
surfaceLine.EnsurePointOfType(pointShoulderBaseInside.X, pointShoulderBaseInside.Z, CharacteristicPointType.ShoulderBaseInside);
surfaceLine.EnsurePointOfType(pointShoulderTopInside.X, pointShoulderTopInside.Z, CharacteristicPointType.ShoulderTopInside);
surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder);
surfaceLine.EnsurePointOfType(pointDitchDikeSide.X, pointDitchDikeSide.Z, CharacteristicPointType.DitchDikeSide);
surfaceLine.EnsurePointOfType(pointBottomDitchDikeSide.X, pointBottomDitchDikeSide.Z, CharacteristicPointType.BottomDitchDikeSide);
surfaceLine.EnsurePointOfType(pointBottomDitchPolderSide.X, pointBottomDitchPolderSide.Z, CharacteristicPointType.BottomDitchPolderSide);
surfaceLine.EnsurePointOfType(pointDitchPolderSide.X, pointDitchPolderSide.Z, CharacteristicPointType.DitchPolderSide);
surfaceLine.EnsurePointOfType(pointSurfaceLevelInside.X, pointSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside);
var pointTrafficLoadOutside = new GeometryPoint { X = 7, Z = 2.3333333333 };
var pointTrafficLoadInside = new GeometryPoint { X = 8, Z = 1.6666666667 };
surfaceLine.EnsurePointOfType(pointTrafficLoadOutside.X, pointTrafficLoadOutside.Z, CharacteristicPointType.TrafficLoadOutside);
surfaceLine.EnsurePointOfType(pointTrafficLoadInside.X, pointTrafficLoadInside.Z, CharacteristicPointType.TrafficLoadInside);
surfaceLine.SortPoints();
var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0);
const double deltaX = 1.0;
SurfaceLine2 adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(deltaX);
GeometryPoint expectedPointTrafficLoadOutside = new GeometryPoint { X = 7, Z = 2.5 };
GeometryPoint expectedPointTrafficLoadInside = new GeometryPoint { X = 8, Z = 2.0 };
Assert.AreEqual(expectedPointTrafficLoadOutside.X, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadOutside).X, cTolerance);
Assert.AreEqual(expectedPointTrafficLoadInside.X, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadInside).X, cTolerance);
Assert.AreEqual(expectedPointTrafficLoadOutside.Z, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadOutside).Z, cTolerance);
Assert.AreEqual(expectedPointTrafficLoadInside.Z, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadInside).Z, cTolerance);
pointTrafficLoadOutside = new GeometryPoint { X = 9.5, Z = 1.0 };
pointTrafficLoadInside = new GeometryPoint { X = 10.5, Z = 1.0 };
surfaceLine.EnsurePointOfType(pointTrafficLoadOutside.X, pointTrafficLoadOutside.Z, CharacteristicPointType.TrafficLoadOutside);
surfaceLine.EnsurePointOfType(pointTrafficLoadInside.X, pointTrafficLoadInside.Z, CharacteristicPointType.TrafficLoadInside);
surfaceLine.SortPoints();
surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0);
adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(deltaX);
expectedPointTrafficLoadOutside = new GeometryPoint { X = 9.5, Z = 1.25 };
expectedPointTrafficLoadInside = new GeometryPoint { X = 10.5, Z = 1.0 };
Assert.AreEqual(expectedPointTrafficLoadOutside.X, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadOutside).X, cTolerance);
Assert.AreEqual(expectedPointTrafficLoadInside.X, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadInside).X, cTolerance);
Assert.AreEqual(expectedPointTrafficLoadOutside.Z, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadOutside).Z, cTolerance);
Assert.AreEqual(expectedPointTrafficLoadInside.Z, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadInside).Z, cTolerance);
}
#endregion
#region ConstructWithSlopeTangent
[Test]
public void IsExceptionThrownIfSlopeDoesNotIntersectSurfaceLine()
{
var surfaceLine = CreateSimpleDike();
var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0);
Assert.That(() => surfaceLineAdapter.ConstructNewSurfaceLineBySlope(0), Throws.InstanceOf());
}
[Test]
public void IsNotExceptionThrownIfSlopeEqualsTheCurrentSlope()
{
var surfaceLine = CreateSimpleDike();
var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0);
Assert.IsNotNull(surfaceLineAdapter.ConstructNewSurfaceLineBySlope(1.0));
}
[Test]
public void ConstructNewSurfaceLineBySlopeReturnsANewSurfaceLine()
{
var surfaceLine = CreateSimpleDike();
var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0);
Assert.IsNotNull(surfaceLineAdapter.ConstructNewSurfaceLineBySlope(0.9));
}
[Test]
public void AdaptedSimpleDikeLineBySlopeHasCorrectNewToeDikeAtPolder()
{
var surfaceLine = CreateSimpleDike();
var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0);
const double slopeTangent = 1.0 / 3.0;
var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent);
var expectedPointDikeToeAtPolder = new GeometryPoint { X = 5, Z = 0 };
Assert.IsTrue(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder)));
}
[Test]
public void AdaptedDikeWithShoulderBySlopeHasCorrectPointsAfterToeSlope()
{
var surfaceLine = new SurfaceLine2
{
CharacteristicPoints =
{
GeometryMustContainPoint = true
},
Geometry = new GeometryPointString()
};
var pointShoulderBaseInside = new GeometryPoint { X = 9, Z = 1 };
var pointShoulderTopInside = new GeometryPoint { X = 11, Z = 1 };
var pointDikeToeAtPolder = new GeometryPoint { X = 14, Z = 0 };
var pointSurfaceLevelInside = new GeometryPoint { X = 50, Z = 0 };
surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver);
surfaceLine.EnsurePointOfType(4, 3, CharacteristicPointType.DikeTopAtRiver);
surfaceLine.EnsurePointOfType(6, 3, CharacteristicPointType.DikeTopAtPolder);
surfaceLine.EnsurePointOfType(pointShoulderBaseInside.X, pointShoulderBaseInside.Z, CharacteristicPointType.ShoulderBaseInside);
surfaceLine.EnsurePointOfType(pointShoulderTopInside.X, pointShoulderTopInside.Z, CharacteristicPointType.ShoulderTopInside);
surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder);
surfaceLine.EnsurePointOfType(pointSurfaceLevelInside.X, pointSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside);
var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0);
const double slopeTangent = 1.0 / 4.0;
var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent);
const double deltaX = 4.0;
var expectedPointDikeToeAtPolder = new GeometryPoint { X = pointDikeToeAtPolder.X + deltaX, Z = pointDikeToeAtPolder.Z };
var expectedPointSurfaceLevelInside = new GeometryPoint { X = pointSurfaceLevelInside.X, Z = pointSurfaceLevelInside.Z };
Assert.IsFalse(adaptedSurfaceLine.HasAnnotation(CharacteristicPointType.ShoulderBaseInside));
Assert.IsFalse(adaptedSurfaceLine.HasAnnotation(CharacteristicPointType.ShoulderTopInside));
Assert.IsTrue(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder)));
Assert.IsTrue(expectedPointSurfaceLevelInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelInside)));
}
[Test]
public void AdaptedDikeWithDitchBySlopeHasCorrectPointsAfterToeSlope()
{
var surfaceLine = new SurfaceLine2
{
CharacteristicPoints =
{
GeometryMustContainPoint = true
},
Geometry = new GeometryPointString()
};
var pointDikeToeAtPolder = new GeometryPoint { X = 14, Z = 0 };
var pointDitchDikeSide = new GeometryPoint { X = 16, Z = 0 };
var pointBottomDitchDikeSide = new GeometryPoint { X = 17, Z = -1 };
var pointBottomDitchPolderSide = new GeometryPoint { X = 18, Z = -1 };
var pointDitchPolderSide = new GeometryPoint { X = 19, Z = 0 };
var pointSurfaceLevelInside = new GeometryPoint { X = 50, Z = 0 };
surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver);
surfaceLine.EnsurePointOfType(4, 3, CharacteristicPointType.DikeTopAtRiver);
surfaceLine.EnsurePointOfType(6, 3, CharacteristicPointType.DikeTopAtPolder);
surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder);
surfaceLine.EnsurePointOfType(pointDitchDikeSide.X, pointDitchDikeSide.Z, CharacteristicPointType.DitchDikeSide);
surfaceLine.EnsurePointOfType(pointBottomDitchDikeSide.X, pointBottomDitchDikeSide.Z, CharacteristicPointType.BottomDitchDikeSide);
surfaceLine.EnsurePointOfType(pointBottomDitchPolderSide.X, pointBottomDitchPolderSide.Z, CharacteristicPointType.BottomDitchPolderSide);
surfaceLine.EnsurePointOfType(pointDitchPolderSide.X, pointDitchPolderSide.Z, CharacteristicPointType.DitchPolderSide);
surfaceLine.EnsurePointOfType(pointSurfaceLevelInside.X, pointSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside);
var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0);
const double slopeTangent = 1.0 / 4.0;
var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent);
const double deltaX = 4.0;
const double deltaXDitch = 3;
var expectedPointDikeToeAtPolder = new GeometryPoint { X = pointDikeToeAtPolder.X + deltaX, Z = pointDikeToeAtPolder.Z };
var expectedPointDitchDikeSide = new GeometryPoint { X = pointDitchDikeSide.X + deltaX + deltaXDitch, Z = pointDitchDikeSide.Z };
var expectedPointBottomDitchDikeSide = new GeometryPoint { X = pointBottomDitchDikeSide.X + deltaX + deltaXDitch, Z = pointBottomDitchDikeSide.Z };
var expectedPointBottomDitchPolderSide = new GeometryPoint { X = pointBottomDitchPolderSide.X + deltaX + deltaXDitch, Z = pointBottomDitchPolderSide.Z };
var expectedPointDitchPolderSide = new GeometryPoint { X = pointDitchPolderSide.X + deltaX + deltaXDitch, Z = pointDitchPolderSide.Z };
var expectedPointSurfaceLevelInside = new GeometryPoint { X = pointSurfaceLevelInside.X, Z = pointSurfaceLevelInside.Z };
Assert.IsTrue(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder)));
Assert.IsTrue(expectedPointDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchDikeSide)));
Assert.IsTrue(expectedPointBottomDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchDikeSide)));
Assert.IsTrue(expectedPointBottomDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchPolderSide)));
Assert.IsTrue(expectedPointDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchPolderSide)));
Assert.IsTrue(expectedPointSurfaceLevelInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelInside)));
}
[Test]
public void IsExceptionThrownWhenSlopeDoesNotFit()
{
var surfaceLine = new SurfaceLine2
{
CharacteristicPoints =
{
GeometryMustContainPoint = true
},
Geometry = new GeometryPointString()
};
var pointDikeToeAtPolder = new GeometryPoint { X = 14, Z = 0 };
var pointDitchDikeSide = new GeometryPoint { X = 16, Z = 0 };
var pointBottomDitchDikeSide = new GeometryPoint { X = 17, Z = -1 };
var pointBottomDitchPolderSide = new GeometryPoint { X = 18, Z = -1 };
var pointDitchPolderSide = new GeometryPoint { X = 19, Z = 0 };
var pointSurfaceLevelInside = new GeometryPoint { X = 20, Z = 0 };
surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver);
surfaceLine.EnsurePointOfType(4, 3, CharacteristicPointType.DikeTopAtRiver);
surfaceLine.EnsurePointOfType(6, 3, CharacteristicPointType.DikeTopAtPolder);
surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder);
surfaceLine.EnsurePointOfType(pointDitchDikeSide.X, pointDitchDikeSide.Z, CharacteristicPointType.DitchDikeSide);
surfaceLine.EnsurePointOfType(pointBottomDitchDikeSide.X, pointBottomDitchDikeSide.Z, CharacteristicPointType.BottomDitchDikeSide);
surfaceLine.EnsurePointOfType(pointBottomDitchPolderSide.X, pointBottomDitchPolderSide.Z, CharacteristicPointType.BottomDitchPolderSide);
surfaceLine.EnsurePointOfType(pointDitchPolderSide.X, pointDitchPolderSide.Z, CharacteristicPointType.DitchPolderSide);
surfaceLine.EnsurePointOfType(pointSurfaceLevelInside.X, pointSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside);
var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0);
const double slopeTangent = 1.0 / 4.0;
Assert.That(() => surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent), Throws.InstanceOf());
}
[Test]
public void AdaptedDikeWithShoulderAndDitchBySlopeHasCorrectPointsAfterSlopeIntersectsBeyondDikeToe()
{
var surfaceLine = new SurfaceLine2
{
CharacteristicPoints =
{
GeometryMustContainPoint = true
},
Geometry = new GeometryPointString()
};
var pointShoulderBaseInside = new GeometryPoint { X = 9, Z = 1 };
var pointShoulderTopInside = new GeometryPoint { X = 11, Z = 1 };
var pointDikeToeAtPolder = new GeometryPoint { X = 14, Z = 0 };
var pointDitchDikeSide = new GeometryPoint { X = 16, Z = 0 };
var pointBottomDitchDikeSide = new GeometryPoint { X = 17, Z = -1 };
var pointBottomDitchPolderSide = new GeometryPoint { X = 18, Z = -1 };
var pointDitchPolderSide = new GeometryPoint { X = 19, Z = 0 };
var pointSurfaceLevelInside = new GeometryPoint { X = 50, Z = 0 };
surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver);
surfaceLine.EnsurePointOfType(4, 3, CharacteristicPointType.DikeTopAtRiver);
surfaceLine.EnsurePointOfType(6, 3, CharacteristicPointType.DikeTopAtPolder);
surfaceLine.EnsurePointOfType(pointShoulderBaseInside.X, pointShoulderBaseInside.Z, CharacteristicPointType.ShoulderBaseInside);
surfaceLine.EnsurePointOfType(pointShoulderTopInside.X, pointShoulderTopInside.Z, CharacteristicPointType.ShoulderTopInside);
surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder);
surfaceLine.EnsurePointOfType(pointDitchDikeSide.X, pointDitchDikeSide.Z, CharacteristicPointType.DitchDikeSide);
surfaceLine.EnsurePointOfType(pointBottomDitchDikeSide.X, pointBottomDitchDikeSide.Z, CharacteristicPointType.BottomDitchDikeSide);
surfaceLine.EnsurePointOfType(pointBottomDitchPolderSide.X, pointBottomDitchPolderSide.Z, CharacteristicPointType.BottomDitchPolderSide);
surfaceLine.EnsurePointOfType(pointDitchPolderSide.X, pointDitchPolderSide.Z, CharacteristicPointType.DitchPolderSide);
surfaceLine.EnsurePointOfType(pointSurfaceLevelInside.X, pointSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside);
var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0);
const double slopeTangent = 1.0 / 4.0;
var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent);
const double deltaX = 4.0;
const double deltaXDitch = 3;
var expectedPointDikeToeAtPolder = new GeometryPoint { X = pointDikeToeAtPolder.X + deltaX, Z = pointDikeToeAtPolder.Z };
var expectedPointDitchDikeSide = new GeometryPoint { X = pointDitchDikeSide.X + deltaX + deltaXDitch, Z = pointDitchDikeSide.Z };
var expectedPointBottomDitchDikeSide = new GeometryPoint { X = pointBottomDitchDikeSide.X + deltaX + deltaXDitch, Z = pointBottomDitchDikeSide.Z };
var expectedPointBottomDitchPolderSide = new GeometryPoint { X = pointBottomDitchPolderSide.X + deltaX + deltaXDitch, Z = pointBottomDitchPolderSide.Z };
var expectedPointDitchPolderSide = new GeometryPoint { X = pointDitchPolderSide.X + deltaX + deltaXDitch, Z = pointDitchPolderSide.Z };
var expectedPointSurfaceLevelInside = new GeometryPoint { X = pointSurfaceLevelInside.X, Z = pointSurfaceLevelInside.Z };
Assert.IsFalse(adaptedSurfaceLine.HasAnnotation(CharacteristicPointType.ShoulderBaseInside));
Assert.IsFalse(adaptedSurfaceLine.HasAnnotation(CharacteristicPointType.ShoulderTopInside));
Assert.IsTrue(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder)));
Assert.IsTrue(expectedPointDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchDikeSide)));
Assert.IsTrue(expectedPointBottomDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchDikeSide)));
Assert.IsTrue(expectedPointBottomDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchPolderSide)));
Assert.IsTrue(expectedPointDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchPolderSide)));
Assert.IsTrue(expectedPointSurfaceLevelInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelInside)));
}
[Test]
public void AdaptedDikeWithShoulderAndDitchBySlopeHasCorrectPointsAfterSlopeIntersectsInShoulderBetweenBaseAndTop()
{
var surfaceLine = new SurfaceLine2
{
CharacteristicPoints =
{
GeometryMustContainPoint = true
},
Geometry = new GeometryPointString()
};
var pointShoulderBaseInside = new GeometryPoint { X = 9, Z = 1 };
var pointShoulderTopInside = new GeometryPoint { X = 11, Z = 1 };
var pointDikeToeAtPolder = new GeometryPoint { X = 14, Z = 0 };
var pointDitchDikeSide = new GeometryPoint { X = 16, Z = 0 };
var pointBottomDitchDikeSide = new GeometryPoint { X = 17, Z = -1 };
var pointBottomDitchPolderSide = new GeometryPoint { X = 18, Z = -1 };
var pointDitchPolderSide = new GeometryPoint { X = 19, Z = 0 };
var pointSurfaceLevelInside = new GeometryPoint { X = 50, Z = 0 };
surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver);
surfaceLine.EnsurePointOfType(4, 3, CharacteristicPointType.DikeTopAtRiver);
surfaceLine.EnsurePointOfType(6, 3, CharacteristicPointType.DikeTopAtPolder);
surfaceLine.EnsurePointOfType(pointShoulderBaseInside.X, pointShoulderBaseInside.Z, CharacteristicPointType.ShoulderBaseInside);
surfaceLine.EnsurePointOfType(pointShoulderTopInside.X, pointShoulderTopInside.Z, CharacteristicPointType.ShoulderTopInside);
surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder);
surfaceLine.EnsurePointOfType(pointDitchDikeSide.X, pointDitchDikeSide.Z, CharacteristicPointType.DitchDikeSide);
surfaceLine.EnsurePointOfType(pointBottomDitchDikeSide.X, pointBottomDitchDikeSide.Z, CharacteristicPointType.BottomDitchDikeSide);
surfaceLine.EnsurePointOfType(pointBottomDitchPolderSide.X, pointBottomDitchPolderSide.Z, CharacteristicPointType.BottomDitchPolderSide);
surfaceLine.EnsurePointOfType(pointDitchPolderSide.X, pointDitchPolderSide.Z, CharacteristicPointType.DitchPolderSide);
surfaceLine.EnsurePointOfType(pointSurfaceLevelInside.X, pointSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside);
var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0);
const double slopeTangent = 1.0 / 2.0;
var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent);
const double deltaX = 1.0;
var expectedShoulderBaseInside = new GeometryPoint { X = pointShoulderBaseInside.X + deltaX, Z = pointShoulderBaseInside.Z };
var expectedShoulderTopInside = new GeometryPoint { X = pointShoulderTopInside.X, Z = pointShoulderTopInside.Z };
var expectedPointDikeToeAtPolder = new GeometryPoint { X = pointDikeToeAtPolder.X, Z = pointDikeToeAtPolder.Z };
var expectedPointDitchDikeSide = new GeometryPoint { X = pointDitchDikeSide.X, Z = pointDitchDikeSide.Z };
var expectedPointBottomDitchDikeSide = new GeometryPoint { X = pointBottomDitchDikeSide.X, Z = pointBottomDitchDikeSide.Z };
var expectedPointBottomDitchPolderSide = new GeometryPoint { X = pointBottomDitchPolderSide.X, Z = pointBottomDitchPolderSide.Z };
var expectedPointDitchPolderSide = new GeometryPoint { X = pointDitchPolderSide.X, Z = pointDitchPolderSide.Z };
var expectedPointSurfaceLevelInside = new GeometryPoint { X = pointSurfaceLevelInside.X, Z = pointSurfaceLevelInside.Z };
Assert.IsTrue(expectedShoulderBaseInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.ShoulderBaseInside)));
Assert.IsTrue(expectedShoulderTopInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.ShoulderTopInside)));
Assert.IsTrue(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder)));
Assert.IsTrue(expectedPointDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchDikeSide)));
Assert.IsTrue(expectedPointBottomDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchDikeSide)));
Assert.IsTrue(expectedPointBottomDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchPolderSide)));
Assert.IsTrue(expectedPointDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchPolderSide)));
Assert.IsTrue(expectedPointSurfaceLevelInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelInside)));
}
[Test]
public void AdaptedDikeWithShoulderAndDitchBySlopeHasCorrectPointsAfterSlopeIntersectsOnShoulderTop()
{
var surfaceLine = new SurfaceLine2
{
CharacteristicPoints =
{
GeometryMustContainPoint = true
},
Geometry = new GeometryPointString()
};
var pointShoulderBaseInside = new GeometryPoint { X = 9, Z = 1 };
var pointShoulderTopInside = new GeometryPoint { X = 10, Z = 1 };
var pointDikeToeAtPolder = new GeometryPoint { X = 14, Z = 0 };
var pointDitchDikeSide = new GeometryPoint { X = 16, Z = 0 };
var pointBottomDitchDikeSide = new GeometryPoint { X = 17, Z = -1 };
var pointBottomDitchPolderSide = new GeometryPoint { X = 18, Z = -1 };
var pointDitchPolderSide = new GeometryPoint { X = 19, Z = 0 };
var pointSurfaceLevelInside = new GeometryPoint { X = 50, Z = 0 };
surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver);
surfaceLine.EnsurePointOfType(4, 3, CharacteristicPointType.DikeTopAtRiver);
surfaceLine.EnsurePointOfType(6, 3, CharacteristicPointType.DikeTopAtPolder);
surfaceLine.EnsurePointOfType(pointShoulderBaseInside.X, pointShoulderBaseInside.Z, CharacteristicPointType.ShoulderBaseInside);
surfaceLine.EnsurePointOfType(pointShoulderTopInside.X, pointShoulderTopInside.Z, CharacteristicPointType.ShoulderTopInside);
surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder);
surfaceLine.EnsurePointOfType(pointDitchDikeSide.X, pointDitchDikeSide.Z, CharacteristicPointType.DitchDikeSide);
surfaceLine.EnsurePointOfType(pointBottomDitchDikeSide.X, pointBottomDitchDikeSide.Z, CharacteristicPointType.BottomDitchDikeSide);
surfaceLine.EnsurePointOfType(pointBottomDitchPolderSide.X, pointBottomDitchPolderSide.Z, CharacteristicPointType.BottomDitchPolderSide);
surfaceLine.EnsurePointOfType(pointDitchPolderSide.X, pointDitchPolderSide.Z, CharacteristicPointType.DitchPolderSide);
surfaceLine.EnsurePointOfType(pointSurfaceLevelInside.X, pointSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside);
var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0);
const double slopeTangent = 1.0 / 2.0;
var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent);
var expectedNewPoint = new GeometryPoint { X = pointShoulderTopInside.X, Z = pointShoulderTopInside.Z };
var expectedPointDikeToeAtPolder = new GeometryPoint { X = pointDikeToeAtPolder.X, Z = pointDikeToeAtPolder.Z };
var expectedPointDitchDikeSide = new GeometryPoint { X = pointDitchDikeSide.X, Z = pointDitchDikeSide.Z };
var expectedPointBottomDitchDikeSide = new GeometryPoint { X = pointBottomDitchDikeSide.X, Z = pointBottomDitchDikeSide.Z };
var expectedPointBottomDitchPolderSide = new GeometryPoint { X = pointBottomDitchPolderSide.X, Z = pointBottomDitchPolderSide.Z };
var expectedPointDitchPolderSide = new GeometryPoint { X = pointDitchPolderSide.X, Z = pointDitchPolderSide.Z };
var expectedPointSurfaceLevelInside = new GeometryPoint { X = pointSurfaceLevelInside.X, Z = pointSurfaceLevelInside.Z };
Assert.IsFalse(adaptedSurfaceLine.HasAnnotation(CharacteristicPointType.ShoulderBaseInside));
Assert.IsFalse(adaptedSurfaceLine.HasAnnotation(CharacteristicPointType.ShoulderTopInside));
Assert.IsTrue(adaptedSurfaceLine.Geometry.GetPointAt(expectedNewPoint.X, expectedNewPoint.Z) != null);
Assert.IsTrue(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder)));
Assert.IsTrue(expectedPointDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchDikeSide)));
Assert.IsTrue(expectedPointBottomDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchDikeSide)));
Assert.IsTrue(expectedPointBottomDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchPolderSide)));
Assert.IsTrue(expectedPointDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchPolderSide)));
Assert.IsTrue(expectedPointSurfaceLevelInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelInside)));
}
[Test]
public void AdaptedDikeWithShoulderAndDitchBySlopeHasCorrectPointsAfterSlopeIntersectsInShoulderBetweenTopAndDikeToe()
{
var surfaceLine = new SurfaceLine2
{
CharacteristicPoints =
{
GeometryMustContainPoint = true
},
Geometry = new GeometryPointString()
};
var pointShoulderBaseInside = new GeometryPoint { X = 7, Z = 1 };
var pointShoulderTopInside = new GeometryPoint { X = 8, Z = 0 };
var pointDikeToeAtPolder = new GeometryPoint { X = 14, Z = 0 };
var pointDitchDikeSide = new GeometryPoint { X = 16, Z = 0 };
var pointBottomDitchDikeSide = new GeometryPoint { X = 17, Z = -1 };
var pointBottomDitchPolderSide = new GeometryPoint { X = 18, Z = -1 };
var pointDitchPolderSide = new GeometryPoint { X = 19, Z = 0 };
var pointSurfaceLevelInside = new GeometryPoint { X = 50, Z = 0 };
surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver);
surfaceLine.EnsurePointOfType(4, 3, CharacteristicPointType.DikeTopAtRiver);
surfaceLine.EnsurePointOfType(6, 3, CharacteristicPointType.DikeTopAtPolder);
surfaceLine.EnsurePointOfType(pointShoulderBaseInside.X, pointShoulderBaseInside.Z, CharacteristicPointType.ShoulderBaseInside);
surfaceLine.EnsurePointOfType(pointShoulderTopInside.X, pointShoulderTopInside.Z, CharacteristicPointType.ShoulderTopInside);
surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder);
surfaceLine.EnsurePointOfType(pointDitchDikeSide.X, pointDitchDikeSide.Z, CharacteristicPointType.DitchDikeSide);
surfaceLine.EnsurePointOfType(pointBottomDitchDikeSide.X, pointBottomDitchDikeSide.Z, CharacteristicPointType.BottomDitchDikeSide);
surfaceLine.EnsurePointOfType(pointBottomDitchPolderSide.X, pointBottomDitchPolderSide.Z, CharacteristicPointType.BottomDitchPolderSide);
surfaceLine.EnsurePointOfType(pointDitchPolderSide.X, pointDitchPolderSide.Z, CharacteristicPointType.DitchPolderSide);
surfaceLine.EnsurePointOfType(pointSurfaceLevelInside.X, pointSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside);
var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0);
const double slopeTangent = 1.0 / 2.0;
var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent);
const double deltaX = 4.0; // from pointShoulderTopInside
var expectedNewPoint = new GeometryPoint { X = pointShoulderTopInside.X + deltaX, Z = pointShoulderTopInside.Z };
var expectedPointDikeToeAtPolder = new GeometryPoint { X = pointDikeToeAtPolder.X, Z = pointDikeToeAtPolder.Z };
var expectedPointDitchDikeSide = new GeometryPoint { X = pointDitchDikeSide.X, Z = pointDitchDikeSide.Z };
var expectedPointBottomDitchDikeSide = new GeometryPoint { X = pointBottomDitchDikeSide.X, Z = pointBottomDitchDikeSide.Z };
var expectedPointBottomDitchPolderSide = new GeometryPoint { X = pointBottomDitchPolderSide.X, Z = pointBottomDitchPolderSide.Z };
var expectedPointDitchPolderSide = new GeometryPoint { X = pointDitchPolderSide.X, Z = pointDitchPolderSide.Z };
var expectedPointSurfaceLevelInside = new GeometryPoint { X = pointSurfaceLevelInside.X, Z = pointSurfaceLevelInside.Z };
Assert.IsFalse(adaptedSurfaceLine.HasAnnotation(CharacteristicPointType.ShoulderBaseInside));
Assert.IsFalse(adaptedSurfaceLine.HasAnnotation(CharacteristicPointType.ShoulderTopInside));
Assert.IsTrue(adaptedSurfaceLine.Geometry.GetPointAt(expectedNewPoint.X, expectedNewPoint.Z) != null);
Assert.IsTrue(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder)));
Assert.IsTrue(expectedPointDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchDikeSide)));
Assert.IsTrue(expectedPointBottomDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchDikeSide)));
Assert.IsTrue(expectedPointBottomDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchPolderSide)));
Assert.IsTrue(expectedPointDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchPolderSide)));
Assert.IsTrue(expectedPointSurfaceLevelInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelInside)));
}
[Test]
public void AdaptedSimpleDikeLineWithInBetweenPointOnInsideSlopeBySlopeHasCorrectNewToeDikeAtPolder()
{
var surfaceLine = CreateSimpleDike();
var pointDikeToeAtPolder = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder);
surfaceLine.EnsurePoint(2.5, 0.4); // in between point on inside slope
surfaceLine.SortPoints();
var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0);
const double slopeTangent = 1.0 / 4.0;
var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent);
const double deltaX = 3.0;
var expectedPointDikeToeAtPolder = new GeometryPoint { X = pointDikeToeAtPolder.X + deltaX, Z = pointDikeToeAtPolder.Z };
Assert.AreEqual(6, surfaceLine.Geometry.Count);
Assert.AreEqual(5, adaptedSurfaceLine.Geometry.Count); // in between point should be thrown away
Assert.IsTrue(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder)));
}
[Test]
public void AdaptedSurfaceLineWithTrafficLoadPointsBySlopeHasAdjustedPoints()
{
const double cTolerance = 0.0000001;
// Create the base surfaceline (dike with shoulder and ditch)
var surfaceLine = new SurfaceLine2
{
CharacteristicPoints =
{
GeometryMustContainPoint = true
},
Geometry = new GeometryPointString()
};
var pointShoulderBaseInside = new GeometryPoint { X = 9, Z = 1 };
var pointShoulderTopInside = new GeometryPoint { X = 11, Z = 1 };
var pointDikeToeAtPolder = new GeometryPoint { X = 14, Z = 0 };
var pointDitchDikeSide = new GeometryPoint { X = 16, Z = 0 };
var pointBottomDitchDikeSide = new GeometryPoint { X = 17, Z = -1 };
var pointBottomDitchPolderSide = new GeometryPoint { X = 18, Z = -1 };
var pointDitchPolderSide = new GeometryPoint { X = 19, Z = 0 };
var pointSurfaceLevelInside = new GeometryPoint { X = 50, Z = 0 };
surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver);
surfaceLine.EnsurePointOfType(4, 3, CharacteristicPointType.DikeTopAtRiver);
surfaceLine.EnsurePointOfType(6, 3, CharacteristicPointType.DikeTopAtPolder);
surfaceLine.EnsurePointOfType(pointShoulderBaseInside.X, pointShoulderBaseInside.Z, CharacteristicPointType.ShoulderBaseInside);
surfaceLine.EnsurePointOfType(pointShoulderTopInside.X, pointShoulderTopInside.Z, CharacteristicPointType.ShoulderTopInside);
surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder);
surfaceLine.EnsurePointOfType(pointDitchDikeSide.X, pointDitchDikeSide.Z, CharacteristicPointType.DitchDikeSide);
surfaceLine.EnsurePointOfType(pointBottomDitchDikeSide.X, pointBottomDitchDikeSide.Z, CharacteristicPointType.BottomDitchDikeSide);
surfaceLine.EnsurePointOfType(pointBottomDitchPolderSide.X, pointBottomDitchPolderSide.Z, CharacteristicPointType.BottomDitchPolderSide);
surfaceLine.EnsurePointOfType(pointDitchPolderSide.X, pointDitchPolderSide.Z, CharacteristicPointType.DitchPolderSide);
surfaceLine.EnsurePointOfType(pointSurfaceLevelInside.X, pointSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside);
var pointTrafficLoadOutside = new GeometryPoint { X = 7, Z = 2.3333333333 };
var pointTrafficLoadInside = new GeometryPoint { X = 8, Z = 1.6666666667 };
surfaceLine.EnsurePointOfType(pointTrafficLoadOutside.X, pointTrafficLoadOutside.Z, CharacteristicPointType.TrafficLoadOutside);
surfaceLine.EnsurePointOfType(pointTrafficLoadInside.X, pointTrafficLoadInside.Z, CharacteristicPointType.TrafficLoadInside);
surfaceLine.SortPoints();
var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0);
const double slopeTangent = 1.0 / 4.0;
var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent);
var expectedPointTrafficLoadOutside = new GeometryPoint { X = 7, Z = 2.75 };
var expectedPointTrafficLoadInside = new GeometryPoint { X = 8, Z = 2.5 };
Assert.AreEqual(expectedPointTrafficLoadOutside.X, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadOutside).X, cTolerance);
Assert.AreEqual(expectedPointTrafficLoadInside.X, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadInside).X, cTolerance);
Assert.AreEqual(expectedPointTrafficLoadOutside.Z, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadOutside).Z, cTolerance);
Assert.AreEqual(expectedPointTrafficLoadInside.Z, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadInside).Z, cTolerance);
pointTrafficLoadOutside = new GeometryPoint { X = 10.0, Z = 1.0 };
pointTrafficLoadInside = new GeometryPoint { X = 13, Z = 1.0 / 3.0 };
surfaceLine.EnsurePointOfType(pointTrafficLoadOutside.X, pointTrafficLoadOutside.Z, CharacteristicPointType.TrafficLoadOutside);
surfaceLine.EnsurePointOfType(pointTrafficLoadInside.X, pointTrafficLoadInside.Z, CharacteristicPointType.TrafficLoadInside);
surfaceLine.SortPoints();
surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0);
adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent);
expectedPointTrafficLoadOutside = new GeometryPoint { X = 10.0, Z = 2.0 };
expectedPointTrafficLoadInside = new GeometryPoint { X = 13, Z = 1.25 };
Assert.AreEqual(expectedPointTrafficLoadOutside.X, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadOutside).X, cTolerance);
Assert.AreEqual(expectedPointTrafficLoadInside.X, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadInside).X, cTolerance);
Assert.AreEqual(expectedPointTrafficLoadOutside.Z, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadOutside).Z, cTolerance);
Assert.AreEqual(expectedPointTrafficLoadInside.Z, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadInside).Z, cTolerance);
}
#endregion
}
}