// Copyright (C) Stichting Deltares 2017. All rights reserved. // // This file is part of Ringtoets. // // Ringtoets is free software: you can redistribute it and/or modify // it under the terms of the GNU 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 General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // All names, logos, and references to "Deltares" are registered trademarks of // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. using System; using System.Collections.Generic; using System.Linq; using Core.Common.Base; using Core.Common.Base.Data; using Core.Common.Base.Geometry; using Core.Common.TestUtil; using Core.Common.Utils; using NUnit.Framework; using Ringtoets.Piping.Primitives.Exceptions; namespace Ringtoets.Piping.Primitives.Test { [TestFixture] public class RingtoetsPipingSurfaceLineTest { [Test] public void DefaultConstructor_ExpectedValues() { // Call var surfaceLine = new RingtoetsPipingSurfaceLine(); // Assert Assert.IsInstanceOf(surfaceLine); Assert.IsEmpty(surfaceLine.Name); CollectionAssert.IsEmpty(surfaceLine.Points); Assert.IsNull(surfaceLine.StartingWorldPoint); Assert.IsNull(surfaceLine.EndingWorldPoint); Assert.IsNull(surfaceLine.ReferenceLineIntersectionWorldPoint); } [Test] public void ReferenceLineIntersectionWorldPoint_SetNewValue_GetNewlySetValue() { // Setup var surfaceLine = new RingtoetsPipingSurfaceLine(); var point = new Point2D(1.2, 3.4); // Call surfaceLine.ReferenceLineIntersectionWorldPoint = point; // Assert Assert.AreEqual(point, surfaceLine.ReferenceLineIntersectionWorldPoint); } [Test] public void SetGeometry_EmptyCollection_PointsSetEmptyAndNullStartAndEndWorldPoints() { // Setup var surfaceLine = new RingtoetsPipingSurfaceLine(); IEnumerable sourceData = Enumerable.Empty(); // Call surfaceLine.SetGeometry(sourceData); // Assert CollectionAssert.IsEmpty(surfaceLine.Points); Assert.IsNull(surfaceLine.StartingWorldPoint); Assert.IsNull(surfaceLine.EndingWorldPoint); } [Test] public void SetGeometry_CollectionOfOnePoint_InitializeStartAndEndWorldPointsToSameInstanceAndInitializePoints() { // Setup var surfaceLine = new RingtoetsPipingSurfaceLine(); var sourceData = new[] { new Point3D(1.1, 2.2, 3.3) }; // Call surfaceLine.SetGeometry(sourceData); // Assert Assert.AreNotSame(sourceData, surfaceLine.Points); CollectionAssert.AreEqual(sourceData, surfaceLine.Points); TestHelper.AssertAreEqualButNotSame(sourceData[0], surfaceLine.StartingWorldPoint); TestHelper.AssertAreEqualButNotSame(sourceData[0], surfaceLine.EndingWorldPoint); } [Test] public void SetGeometry_CollectionOfMultiplePoints_InitializeStartAndEndWorldPointsInitializePoints() { // Setup var surfaceLine = new RingtoetsPipingSurfaceLine(); var sourceData = new[] { new Point3D(1.1, 2.2, 3.3), new Point3D(4.4, 5.5, 6.6), new Point3D(7.7, 8.8, 9.9), new Point3D(10.10, 11.11, 12.12) }; // Call surfaceLine.SetGeometry(sourceData); // Assert Assert.AreNotSame(sourceData, surfaceLine.Points); CollectionAssert.AreEqual(sourceData, surfaceLine.Points); Assert.AreEqual(sourceData[0], surfaceLine.StartingWorldPoint); Assert.AreEqual(sourceData[3], surfaceLine.EndingWorldPoint); } [Test] public void SetGeometry_GeometryIsNull_ThrowsArgumentNullException() { // Setup var surfaceLine = new RingtoetsPipingSurfaceLine(); // Call TestDelegate test = () => surfaceLine.SetGeometry(null); // Assert var exception = Assert.Throws(test); StringAssert.StartsWith("De geometrie die opgegeven werd voor de profielschematisatie heeft geen waarde.", exception.Message); } [Test] public void SetGeometry_GeometryContainsNullPoint_ThrowsArgumentException() { // Setup var surfaceLine = new RingtoetsPipingSurfaceLine(); // Call TestDelegate test = () => surfaceLine.SetGeometry(new Point3D[] { null }); // Assert var exception = Assert.Throws(test); StringAssert.StartsWith("Een punt in de geometrie voor de profielschematisatie heeft geen waarde.", exception.Message); } [Test] public void GetZAtL_GeometryIsEmpty_ThrowInvalidOperationException() { // Setup var surfaceLine = new RingtoetsPipingSurfaceLine(); var l = (RoundedDouble) new Random(21).NextDouble(); // Call TestDelegate test = () => surfaceLine.GetZAtL(l); // Assert string exceptionMessage = Assert.Throws(test).Message; Assert.AreEqual("De profielschematisatie heeft geen geometrie.", exceptionMessage); } [Test] public void GetZAtL_SurfaceLineContainsPointAtL_ReturnsZOfPoint() { // Setup double testZ = new Random(22).NextDouble(); var surfaceLine = new RingtoetsPipingSurfaceLine(); var l = (RoundedDouble) 2.0; surfaceLine.SetGeometry(new[] { new Point3D(0.0, 0.0, 2.2), new Point3D(l, 0.0, testZ), new Point3D(3.0, 0.0, 7.7) }); // Call double result = surfaceLine.GetZAtL(l); // Assert Assert.AreEqual(testZ, result, 1e-2); } [Test] [SetCulture("nl-NL")] [TestCase(-1)] [TestCase(-5e-3)] [TestCase(3.1 + 5e-3)] [TestCase(4.0)] public void GetZAtL_SurfaceLineDoesNotContainsPointAtL_ThrowsArgumentOutOfRange(double l) { // Setup double testZ = new Random(22).NextDouble(); var surfaceLine = new RingtoetsPipingSurfaceLine(); surfaceLine.SetGeometry(new[] { new Point3D(1.0, 0.0, 2.2), new Point3D(2.0, 0.0, testZ), new Point3D(4.1, 0.0, 7.7) }); // Call TestDelegate test = () => surfaceLine.GetZAtL((RoundedDouble) l); // Assert const string expectedMessage = "Kan geen hoogte bepalen. De lokale coördinaat moet in het bereik [0,0, 3,1] liggen."; TestHelper.AssertThrowsArgumentExceptionAndTestMessage(test, expectedMessage); } [Test] public void GetZAtL_SurfaceLineVerticalAtL_ThrowsRingtoetsPipingSurfaceLineException() { // Setup double testZ = new Random(22).NextDouble(); var surfaceLine = new RingtoetsPipingSurfaceLine(); var l = (RoundedDouble) 2.0; surfaceLine.SetGeometry(new[] { new Point3D(0.0, 0.0, 2.2), new Point3D(l, 0.0, testZ), new Point3D(l, 0.0, testZ + 1), new Point3D(3.0, 0.0, 7.7) }); // Call TestDelegate test = () => surfaceLine.GetZAtL(l); // Assert var exception = Assert.Throws(test); string message = $"Kan geen hoogte bepalen op het punt met de lokale coördinaat {l}, omdat de profielschematisatie verticaal loopt op dat punt."; Assert.AreEqual(message, exception.Message); } [Test] public void ToString_ReturnName() { // Setup const string niceName = "Nice name"; var surfaceLine = new RingtoetsPipingSurfaceLine { Name = niceName }; // Call string text = surfaceLine.ToString(); // Assert Assert.AreEqual(niceName, text); } [Test] [TestCase(5.0)] [TestCase(1.375)] [TestCase(-0.005)] [TestCase(-5)] public void ValidateInRange_PointNotInRange_ReturnsFalse(double invalidValue) { // Setup const double testX = 1.0; const double testY = 2.2; const double testZ = 4.4; var testPoint = new Point3D(testX, testY, testZ); var surfaceLine = new RingtoetsPipingSurfaceLine(); CreateTestGeometry(testPoint, surfaceLine); // Call bool valid = surfaceLine.ValidateInRange(invalidValue); // Assert Assert.IsFalse(valid); } [Test] [TestCase(-0e-3)] [TestCase(1.37)] [TestCase(1.0)] public void ValidateInRange_PointInRange_ReturnsTrue(double validValue) { // Setup const double testX = 1.0; const double testY = 2.2; const double testZ = 4.4; var testPoint = new Point3D(testX, testY, testZ); var surfaceLine = new RingtoetsPipingSurfaceLine(); CreateTestGeometry(testPoint, surfaceLine); // Call bool valid = surfaceLine.ValidateInRange(validValue); // Assert Assert.IsTrue(valid); } [Test] public void GetLocalPointFromGeometry_ValidSurfaceLine_ReturnsLocalPoint() { // Setup const double testX = 1.0; const double testY = 2.2; const double testZ = 4.4; var testPoint = new Point3D(testX, testY, testZ); var surfaceLine = new RingtoetsPipingSurfaceLine(); CreateTestGeometry(testPoint, surfaceLine); // Call Point2D localPoint = surfaceLine.GetLocalPointFromGeometry(testPoint); // Assert Assert.AreEqual(new Point2D(0.04, 4.4), localPoint); } [Test] public void GetLocalPointFromGeometry_NoPointsOnSurfaceLine_ReturnsPointWithNanValues() { // Setup var surfaceLine = new RingtoetsPipingSurfaceLine(); // Call Point2D localPoint = surfaceLine.GetLocalPointFromGeometry(new Point3D(1.0, 2.2, 4.4)); // Assert Assert.AreEqual(new Point2D(double.NaN, double.NaN), localPoint); } [Test] public void GetLocalPointFromGeometry_OnePointOnSurfaceLine_ReturnsPointWithNanValues() { // Setup const double testX = 1.0; const double testY = 2.2; const double testZ = 4.4; var testPoint = new Point3D(testX, testY, testZ); var surfaceLine = new RingtoetsPipingSurfaceLine(); surfaceLine.SetGeometry(new[] { testPoint }); // Call Point2D localPoint = surfaceLine.GetLocalPointFromGeometry(testPoint); // Assert Assert.AreEqual(new Point2D(double.NaN, double.NaN), localPoint); } [Test] public void CopyProperties_WithSurfaceLineNull_ThrowsArgumentNullException() { // Setup var surfaceLine = new RingtoetsPipingSurfaceLine(); // Call TestDelegate call = () => surfaceLine.CopyProperties(null); // Assert string paramName = Assert.Throws(call).ParamName; Assert.AreEqual("fromSurfaceLine", paramName); } [Test] public void CopyProperties_LineWithUpdatedGeometricPoints_PropertiesUpdated() { // Setup RingtoetsPipingSurfaceLine surfaceLine = CreateSurfaceLineWithCharacteristicPoints(); RingtoetsPipingSurfaceLine surfaceLineToUpdateFrom = CreateSurfaceLineWithCharacteristicPoints(); var expectedGeometry = new List { new Point3D(0, 1, 2), new Point3D(3, 4, 5), new Point3D(6, 7, 8) }; expectedGeometry.AddRange(surfaceLine.Points); surfaceLineToUpdateFrom.SetGeometry(expectedGeometry); // Call surfaceLine.CopyProperties(surfaceLineToUpdateFrom); // Assert AssertPropertiesUpdated(surfaceLineToUpdateFrom, surfaceLine); } [Test] public void CopyProperties_LineUpdatedWithRemovedCharacteristicPoints_PropertiesUpdated() { // Setup RingtoetsPipingSurfaceLine surfaceLine = CreateSurfaceLineWithCharacteristicPoints(); var surfaceLineToUpdateFrom = new RingtoetsPipingSurfaceLine { Name = surfaceLine.Name, ReferenceLineIntersectionWorldPoint = surfaceLine.ReferenceLineIntersectionWorldPoint }; surfaceLineToUpdateFrom.SetGeometry(surfaceLine.Points); // Call surfaceLine.CopyProperties(surfaceLineToUpdateFrom); // Assert AssertPropertiesUpdated(surfaceLineToUpdateFrom, surfaceLine); } [Test] public void CopyProperties_LineWithUpdatedReferenceLineWorldPoint_PropertiesUpdated() { // Setup RingtoetsPipingSurfaceLine surfaceLine = CreateSurfaceLineWithCharacteristicPoints(); var expectedIntersectionPoint = new Point2D(123, 456); RingtoetsPipingSurfaceLine surfaceLineToUpdateFrom = CreateSurfaceLineWithCharacteristicPoints(); surfaceLineToUpdateFrom.ReferenceLineIntersectionWorldPoint = expectedIntersectionPoint; // Call surfaceLine.CopyProperties(surfaceLineToUpdateFrom); // Assert AssertPropertiesUpdated(surfaceLineToUpdateFrom, surfaceLine); } [Test] public void CopyProperties_LineWithUpdatedGeometryAndReferenceLineIntersectionAndCharacteristicPoints_PropertiesUpdated() { // Setup var surfaceLine = new RingtoetsPipingSurfaceLine(); RingtoetsPipingSurfaceLine surfaceLineToUpdateFrom = CreateSurfaceLineWithCharacteristicPoints(); // Call surfaceLine.CopyProperties(surfaceLineToUpdateFrom); // Assert AssertPropertiesUpdated(surfaceLineToUpdateFrom, surfaceLine); } [Test] public void Equals_ToItself_ReturnsTrue() { // Setup var surfaceLineOne = new RingtoetsPipingSurfaceLine(); // Call bool isLineOneEqualToLineOne = surfaceLineOne.Equals(surfaceLineOne); // Assert Assert.IsTrue(isLineOneEqualToLineOne); } [Test] public void Equal_SameReference_ReturnsTrue() { // Setup var surfaceLineOne = new RingtoetsPipingSurfaceLine(); RingtoetsPipingSurfaceLine surfaceLineTwo = surfaceLineOne; // Call bool isLineOneEqualToLineTwo = surfaceLineOne.Equals(surfaceLineTwo); bool isLineTwoEqualToLineOne = surfaceLineTwo.Equals(surfaceLineOne); // Assert Assert.IsTrue(isLineOneEqualToLineTwo); Assert.IsTrue(isLineTwoEqualToLineOne); } [Test] public void Equals_ToNull_ReturnsFalse() { // Setup var surfaceLineOne = new RingtoetsPipingSurfaceLine { Name = "Name A" }; // Call bool isLineOneEqualToNull = surfaceLineOne.Equals(null); // Assert Assert.IsFalse(isLineOneEqualToNull); } [Test] public void Equals_ToDifferentType_ReturnsFalse() { // Setup var surfaceLineOne = new RingtoetsPipingSurfaceLine { Name = "Name A" }; var differentType = new object(); // Call bool isSurfaceLineEqualToDifferentType = surfaceLineOne.Equals(differentType); bool isDifferentTypeEqualToSurfaceLine = differentType.Equals(surfaceLineOne); // Assert Assert.IsFalse(isSurfaceLineEqualToDifferentType); Assert.IsFalse(isDifferentTypeEqualToSurfaceLine); } [Test] public void Equals_DifferentNames_ReturnsFalse() { // Setup RingtoetsPipingSurfaceLine surfaceLineOne = CreateSurfaceLineWithCharacteristicPoints(); surfaceLineOne.Name = "Name A"; RingtoetsPipingSurfaceLine surfaceLineTwo = CreateSurfaceLineWithCharacteristicPoints(); surfaceLineTwo.Name = "Name B"; // Call bool isLineOneEqualToLineTwo = surfaceLineOne.Equals(surfaceLineTwo); bool isLineTwoEqualToLineOne = surfaceLineTwo.Equals(surfaceLineOne); // Assert Assert.IsFalse(isLineOneEqualToLineTwo); Assert.IsFalse(isLineTwoEqualToLineOne); } [Test] public void Equals_DifferentGeometries_ReturnsFalse() { // Setup var surfaceLineOne = new RingtoetsPipingSurfaceLine { Name = "Name A" }; surfaceLineOne.SetGeometry(new[] { new Point3D(1, 2, 3) }); var surfaceLineTwo = new RingtoetsPipingSurfaceLine { Name = "Name A" }; surfaceLineTwo.SetGeometry(new[] { new Point3D(3, 4, 5) }); // Call bool isLineOneEqualToLineTwo = surfaceLineOne.Equals(surfaceLineTwo); bool isLineTwoEqualToLineOne = surfaceLineTwo.Equals(surfaceLineOne); // Assert Assert.IsFalse(isLineOneEqualToLineTwo); Assert.IsFalse(isLineTwoEqualToLineOne); } [Test] public void Equals_DifferentReferenceLineIntersectionWorldPoint_ReturnsFalse() { // Setup RingtoetsPipingSurfaceLine surfaceLineOne = CreateSurfaceLineWithCharacteristicPoints(); surfaceLineOne.ReferenceLineIntersectionWorldPoint = new Point2D(0, 0); RingtoetsPipingSurfaceLine surfaceLineTwo = CreateSurfaceLineWithCharacteristicPoints(); surfaceLineTwo.ReferenceLineIntersectionWorldPoint = new Point2D(1, 1); // Call bool isLineOneEqualToLineTwo = surfaceLineOne.Equals(surfaceLineTwo); bool isLineTwoEqualToLineOne = surfaceLineTwo.Equals(surfaceLineOne); // Assert Assert.IsFalse(isLineOneEqualToLineTwo); Assert.IsFalse(isLineTwoEqualToLineOne); } [Test] public void Equals_DifferentBottomDitchDikeSide_ReturnsFalse() { // Setup RingtoetsPipingSurfaceLine surfaceLineOne = CreateSurfaceLineWithCharacteristicPoints(); RingtoetsPipingSurfaceLine surfaceLineTwo = CreateSurfaceLineWithCharacteristicPoints(); Point3D[] points = surfaceLineTwo.Points.ToArray(); surfaceLineTwo.SetBottomDitchDikeSideAt(points[5]); // Call bool isLineOneEqualToLineTwo = surfaceLineOne.Equals(surfaceLineTwo); bool isLineTwoEqualToLineOne = surfaceLineTwo.Equals(surfaceLineOne); // Assert Assert.IsFalse(isLineOneEqualToLineTwo); Assert.IsFalse(isLineTwoEqualToLineOne); } [Test] public void Equals_DifferentBottomDitchPolderSide_ReturnsFalse() { // Setup RingtoetsPipingSurfaceLine surfaceLineOne = CreateSurfaceLineWithCharacteristicPoints(); RingtoetsPipingSurfaceLine surfaceLineTwo = CreateSurfaceLineWithCharacteristicPoints(); Point3D[] points = surfaceLineTwo.Points.ToArray(); surfaceLineTwo.SetBottomDitchPolderSideAt(points[5]); // Call bool isLineOneEqualToLineTwo = surfaceLineOne.Equals(surfaceLineTwo); bool isLineTwoEqualToLineOne = surfaceLineTwo.Equals(surfaceLineOne); // Assert Assert.IsFalse(isLineOneEqualToLineTwo); Assert.IsFalse(isLineTwoEqualToLineOne); } [Test] public void Equals_DifferentDikeToeAtPolder_ReturnsFalse() { // Setup RingtoetsPipingSurfaceLine surfaceLineOne = CreateSurfaceLineWithCharacteristicPoints(); RingtoetsPipingSurfaceLine surfaceLineTwo = CreateSurfaceLineWithCharacteristicPoints(); Point3D[] points = surfaceLineTwo.Points.ToArray(); surfaceLineTwo.SetDikeToeAtPolderAt(points[5]); // Call bool isLineOneEqualToLineTwo = surfaceLineOne.Equals(surfaceLineTwo); bool isLineTwoEqualToLineOne = surfaceLineTwo.Equals(surfaceLineOne); // Assert Assert.IsFalse(isLineOneEqualToLineTwo); Assert.IsFalse(isLineTwoEqualToLineOne); } [Test] public void Equals_DifferentDikeToeAtRiver_ReturnsFalse() { // Setup RingtoetsPipingSurfaceLine surfaceLineOne = CreateSurfaceLineWithCharacteristicPoints(); RingtoetsPipingSurfaceLine surfaceLineTwo = CreateSurfaceLineWithCharacteristicPoints(); Point3D[] points = surfaceLineTwo.Points.ToArray(); surfaceLineTwo.SetDikeToeAtRiverAt(points[5]); // Call bool isLineOneEqualToLineTwo = surfaceLineOne.Equals(surfaceLineTwo); bool isLineTwoEqualToLineOne = surfaceLineTwo.Equals(surfaceLineOne); // Assert Assert.IsFalse(isLineOneEqualToLineTwo); Assert.IsFalse(isLineTwoEqualToLineOne); } [Test] public void Equals_DifferentDitchDikeSide_ReturnsFalse() { // Setup RingtoetsPipingSurfaceLine surfaceLineOne = CreateSurfaceLineWithCharacteristicPoints(); RingtoetsPipingSurfaceLine surfaceLineTwo = CreateSurfaceLineWithCharacteristicPoints(); Point3D[] points = surfaceLineTwo.Points.ToArray(); surfaceLineTwo.SetDitchDikeSideAt(points[1]); // Call bool isLineOneEqualToLineTwo = surfaceLineOne.Equals(surfaceLineTwo); bool isLineTwoEqualToLineOne = surfaceLineTwo.Equals(surfaceLineOne); // Assert Assert.IsFalse(isLineOneEqualToLineTwo); Assert.IsFalse(isLineTwoEqualToLineOne); } [Test] public void Equals_DifferentDitchPolderSide_ReturnsFalse() { // Setup RingtoetsPipingSurfaceLine surfaceLineOne = CreateSurfaceLineWithCharacteristicPoints(); RingtoetsPipingSurfaceLine surfaceLineTwo = CreateSurfaceLineWithCharacteristicPoints(); Point3D[] points = surfaceLineTwo.Points.ToArray(); surfaceLineTwo.SetDitchPolderSideAt(points[1]); // Call bool isLineOneEqualToLineTwo = surfaceLineOne.Equals(surfaceLineTwo); bool isLineTwoEqualToLineOne = surfaceLineTwo.Equals(surfaceLineOne); // Assert Assert.IsFalse(isLineOneEqualToLineTwo); Assert.IsFalse(isLineTwoEqualToLineOne); } [Test] public void Equals_NamesGeometriesAndReferenceLineIntersectionWorldPointAndCharacteristicPointsEqual_ReturnsTrue() { // Setup RingtoetsPipingSurfaceLine surfaceLineOne = CreateSurfaceLineWithCharacteristicPoints(); RingtoetsPipingSurfaceLine surfaceLineTwo = CreateSurfaceLineWithCharacteristicPoints(); // Call bool isLineOneEqualToLineTwo = surfaceLineOne.Equals(surfaceLineTwo); bool isLineTwoEqualToLineOne = surfaceLineTwo.Equals(surfaceLineOne); // Assert Assert.IsTrue(isLineOneEqualToLineTwo); Assert.IsTrue(isLineTwoEqualToLineOne); } [Test] public void Equals_TransitivePropertyWithSameNamesAndGeometry_ReturnsTrue() { // Setup RingtoetsPipingSurfaceLine surfaceLineOne = CreateSurfaceLineWithCharacteristicPoints(); RingtoetsPipingSurfaceLine surfaceLineTwo = CreateSurfaceLineWithCharacteristicPoints(); RingtoetsPipingSurfaceLine surfaceLineThree = CreateSurfaceLineWithCharacteristicPoints(); // Call bool isLineOneEqualToLineTwo = surfaceLineOne.Equals(surfaceLineTwo); bool isLineTwoEqualToLineThree = surfaceLineTwo.Equals(surfaceLineThree); bool isLineOneEqualToLineThree = surfaceLineOne.Equals(surfaceLineThree); // Assert Assert.IsTrue(isLineOneEqualToLineTwo); Assert.IsTrue(isLineTwoEqualToLineThree); Assert.IsTrue(isLineOneEqualToLineThree); } [Test] public void GetHashCode_EqualSurfaceLines_ReturnSameHashCode() { // Setup var surfaceLineOne = new RingtoetsPipingSurfaceLine(); var surfaceLineTwo = new RingtoetsPipingSurfaceLine(); // Call int hashCodeOne = surfaceLineOne.GetHashCode(); int hashCodeTwo = surfaceLineTwo.GetHashCode(); // Assert Assert.AreEqual(hashCodeOne, hashCodeTwo); } public abstract class SetCharacteristicPointTest { [Test] public void PointInGeometry_PointSetFromGeometry() { // Setup const double testX = 1.0; const double testY = 2.2; const double testZ = 4.4; var testPoint = new Point3D(testX, testY, testZ); var surfaceLine = new RingtoetsPipingSurfaceLine(); CreateTestGeometry(testPoint, surfaceLine); // Call SetCharacteristicPoint(surfaceLine, testPoint); // Assert Assert.AreEqual(testPoint, GetCharacteristicPoint(surfaceLine)); Assert.AreNotSame(testPoint, GetCharacteristicPoint(surfaceLine)); } [Test] public void GeometryEmpty_ThrowsInvalidOperationException() { // Setup var random = new Random(21); var testPoint = new Point3D(random.NextDouble(), random.NextDouble(), random.NextDouble()); var surfaceLine = new RingtoetsPipingSurfaceLine(); // Call TestDelegate test = () => SetCharacteristicPoint(surfaceLine, testPoint); // Assert string expectedMessage = $"De geometrie bevat geen punt op locatie {testPoint} om als '{CharacteristicPointDescription()}' in te stellen."; TestHelper.AssertThrowsArgumentExceptionAndTestMessage(test, expectedMessage); } [Test] public void Null_ThrowsArgumentNullException() { // Setup var surfaceLine = new RingtoetsPipingSurfaceLine(); // Call TestDelegate test = () => SetCharacteristicPoint(surfaceLine, null); // Assert const string expectedMessage = "Cannot find a point in geometry using a null point."; TestHelper.AssertThrowsArgumentExceptionAndTestMessage(test, expectedMessage); } protected abstract void SetCharacteristicPoint(RingtoetsPipingSurfaceLine surfaceLine, Point3D point); protected abstract Point3D GetCharacteristicPoint(RingtoetsPipingSurfaceLine surfaceLine); protected abstract string CharacteristicPointDescription(); } [TestFixture] public class SetDitchPolderSideAtTest : SetCharacteristicPointTest { protected override void SetCharacteristicPoint(RingtoetsPipingSurfaceLine surfaceLine, Point3D point) { surfaceLine.SetDitchPolderSideAt(point); } protected override Point3D GetCharacteristicPoint(RingtoetsPipingSurfaceLine surfaceLine) { return surfaceLine.DitchPolderSide; } protected override string CharacteristicPointDescription() { return "Insteek sloot polderzijde"; } } [TestFixture] public class SetBottomDitchPolderSideAtTest : SetCharacteristicPointTest { protected override void SetCharacteristicPoint(RingtoetsPipingSurfaceLine surfaceLine, Point3D point) { surfaceLine.SetBottomDitchPolderSideAt(point); } protected override Point3D GetCharacteristicPoint(RingtoetsPipingSurfaceLine surfaceLine) { return surfaceLine.BottomDitchPolderSide; } protected override string CharacteristicPointDescription() { return "Slootbodem polderzijde"; } } [TestFixture] public class SetBottomDitchDikeSideAtTest : SetCharacteristicPointTest { protected override void SetCharacteristicPoint(RingtoetsPipingSurfaceLine surfaceLine, Point3D point) { surfaceLine.SetBottomDitchDikeSideAt(point); } protected override Point3D GetCharacteristicPoint(RingtoetsPipingSurfaceLine surfaceLine) { return surfaceLine.BottomDitchDikeSide; } protected override string CharacteristicPointDescription() { return "Slootbodem dijkzijde"; } } [TestFixture] public class SetDitchDikeSideAtTest : SetCharacteristicPointTest { protected override void SetCharacteristicPoint(RingtoetsPipingSurfaceLine surfaceLine, Point3D point) { surfaceLine.SetDitchDikeSideAt(point); } protected override Point3D GetCharacteristicPoint(RingtoetsPipingSurfaceLine surfaceLine) { return surfaceLine.DitchDikeSide; } protected override string CharacteristicPointDescription() { return "Insteek sloot dijkzijde"; } } [TestFixture] public class SetDikeToeAtRiverAtTest : SetCharacteristicPointTest { protected override void SetCharacteristicPoint(RingtoetsPipingSurfaceLine surfaceLine, Point3D point) { surfaceLine.SetDikeToeAtRiverAt(point); } protected override Point3D GetCharacteristicPoint(RingtoetsPipingSurfaceLine surfaceLine) { return surfaceLine.DikeToeAtRiver; } protected override string CharacteristicPointDescription() { return "Teen dijk buitenwaarts"; } } [TestFixture] public class SetDikeToeAtPolderAtTest : SetCharacteristicPointTest { protected override void SetCharacteristicPoint(RingtoetsPipingSurfaceLine surfaceLine, Point3D point) { surfaceLine.SetDikeToeAtPolderAt(point); } protected override Point3D GetCharacteristicPoint(RingtoetsPipingSurfaceLine surfaceLine) { return surfaceLine.DikeToeAtPolder; } protected override string CharacteristicPointDescription() { return "Teen dijk binnenwaarts"; } } private static RingtoetsPipingSurfaceLine CreateSurfaceLineWithCharacteristicPoints() { var surfaceLine = new RingtoetsPipingSurfaceLine { Name = "Name A", ReferenceLineIntersectionWorldPoint = new Point2D(0, 0) }; var geometry = new[] { new Point3D(0, 0, 0), new Point3D(1, 0, 2), new Point3D(2, 0, 3), new Point3D(3, 0, 0), new Point3D(4, 0, 2), new Point3D(5, 0, 3) }; surfaceLine.SetGeometry(geometry); surfaceLine.SetBottomDitchDikeSideAt(geometry[0]); surfaceLine.SetBottomDitchPolderSideAt(geometry[1]); surfaceLine.SetDikeToeAtPolderAt(geometry[2]); surfaceLine.SetDikeToeAtRiverAt(geometry[3]); surfaceLine.SetDitchDikeSideAt(geometry[4]); surfaceLine.SetDitchPolderSideAt(geometry[5]); return surfaceLine; } private static void CreateTestGeometry(Point3D testPoint, RingtoetsPipingSurfaceLine surfaceLine) { var random = new Random(21); var points = new[] { new Point3D(random.NextDouble(), random.NextDouble(), random.NextDouble()), new Point3D(testPoint), new Point3D(2 + random.NextDouble(), random.NextDouble(), random.NextDouble()) }; surfaceLine.SetGeometry(points); } private static void AssertPropertiesUpdated(RingtoetsPipingSurfaceLine expectedSurfaceLine, RingtoetsPipingSurfaceLine actualSurfaceLine) { Assert.AreEqual(expectedSurfaceLine.Name, actualSurfaceLine.Name); TestHelper.AssertAreEqualButNotSame(expectedSurfaceLine.ReferenceLineIntersectionWorldPoint, actualSurfaceLine.ReferenceLineIntersectionWorldPoint); CollectionAssert.AreEqual(expectedSurfaceLine.Points, actualSurfaceLine.Points); TestHelper.AssertCollectionAreNotSame(expectedSurfaceLine.Points, actualSurfaceLine.Points); Point3D[] actualSurfaceLinePoints = actualSurfaceLine.Points; AssertAreEqualAndFromSurfaceLine(actualSurfaceLinePoints, expectedSurfaceLine.BottomDitchDikeSide, actualSurfaceLine.BottomDitchDikeSide); AssertAreEqualAndFromSurfaceLine(actualSurfaceLinePoints, expectedSurfaceLine.BottomDitchPolderSide, actualSurfaceLine.BottomDitchPolderSide); AssertAreEqualAndFromSurfaceLine(actualSurfaceLinePoints, expectedSurfaceLine.DikeToeAtPolder, actualSurfaceLine.DikeToeAtPolder); AssertAreEqualAndFromSurfaceLine(actualSurfaceLinePoints, expectedSurfaceLine.DikeToeAtRiver, actualSurfaceLine.DikeToeAtRiver); AssertAreEqualAndFromSurfaceLine(actualSurfaceLinePoints, expectedSurfaceLine.DitchPolderSide, actualSurfaceLine.DitchPolderSide); AssertAreEqualAndFromSurfaceLine(actualSurfaceLinePoints, expectedSurfaceLine.DitchDikeSide, actualSurfaceLine.DitchDikeSide); } private static void AssertAreEqualAndFromSurfaceLine(Point3D[] actualSurfaceLinePoints, Point3D expectedPoint, Point3D actualPoint) { Assert.AreEqual(expectedPoint, actualPoint); if (actualPoint != null) { Assert.IsTrue(actualSurfaceLinePoints.Contains(actualPoint, new ReferenceEqualityComparer())); } } } }