// 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.MacroStabilityInwards.Primitives.Exceptions; namespace Ringtoets.MacroStabilityInwards.Primitives.Test { [TestFixture] public class RingtoetsMacroStabilityInwardsSurfaceLineTest { [Test] public void DefaultConstructor_ExpectedValues() { // Call var surfaceLine = new RingtoetsMacroStabilityInwardsSurfaceLine(); // 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 RingtoetsMacroStabilityInwardsSurfaceLine(); 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 RingtoetsMacroStabilityInwardsSurfaceLine(); 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 RingtoetsMacroStabilityInwardsSurfaceLine(); 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 RingtoetsMacroStabilityInwardsSurfaceLine(); 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); TestHelper.AssertAreEqualButNotSame(sourceData[0], surfaceLine.StartingWorldPoint); TestHelper.AssertAreEqualButNotSame(sourceData[3], surfaceLine.EndingWorldPoint); } [Test] public void SetGeometry_GeometryIsNull_ThrowsArgumentNullException() { // Setup var surfaceLine = new RingtoetsMacroStabilityInwardsSurfaceLine(); // 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 RingtoetsMacroStabilityInwardsSurfaceLine(); // 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 RingtoetsMacroStabilityInwardsSurfaceLine(); 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 RingtoetsMacroStabilityInwardsSurfaceLine(); 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 RingtoetsMacroStabilityInwardsSurfaceLine(); 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_ThrowsRingtoetsMacroStabilityInwardsSurfaceLineException() { // Setup double testZ = new Random(22).NextDouble(); var surfaceLine = new RingtoetsMacroStabilityInwardsSurfaceLine(); 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 RingtoetsMacroStabilityInwardsSurfaceLine { 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 RingtoetsMacroStabilityInwardsSurfaceLine(); 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 RingtoetsMacroStabilityInwardsSurfaceLine(); 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 RingtoetsMacroStabilityInwardsSurfaceLine(); 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 RingtoetsMacroStabilityInwardsSurfaceLine(); // 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 RingtoetsMacroStabilityInwardsSurfaceLine(); 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 RingtoetsMacroStabilityInwardsSurfaceLine(); // Call TestDelegate call = () => surfaceLine.CopyProperties(null); // Assert string paramName = Assert.Throws(call).ParamName; Assert.AreEqual("fromSurfaceLine", paramName); } [Test] public void CopyProperties_LineWithUpdatedGeometricPoints_PropertiesUpdated() { // Setup RingtoetsMacroStabilityInwardsSurfaceLine surfaceLine = CreateSurfaceLineWithCharacteristicPoints(); RingtoetsMacroStabilityInwardsSurfaceLine 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 RingtoetsMacroStabilityInwardsSurfaceLine surfaceLine = CreateSurfaceLineWithCharacteristicPoints(); var surfaceLineToUpdateFrom = new RingtoetsMacroStabilityInwardsSurfaceLine { 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 RingtoetsMacroStabilityInwardsSurfaceLine surfaceLine = CreateSurfaceLineWithCharacteristicPoints(); var expectedIntersectionPoint = new Point2D(123, 456); RingtoetsMacroStabilityInwardsSurfaceLine surfaceLineToUpdateFrom = CreateSurfaceLineWithCharacteristicPoints(); surfaceLineToUpdateFrom.ReferenceLineIntersectionWorldPoint = expectedIntersectionPoint; // Call surfaceLine.CopyProperties(surfaceLineToUpdateFrom); // Assert AssertPropertiesUpdated(surfaceLineToUpdateFrom, surfaceLine); } [Test] public void CopyProperties_LineWithUpdatedGeometryAndReferenceLineIntersectionAndCharacteristicPoints_PropertiesUpdated() { // Setup var surfaceLine = new RingtoetsMacroStabilityInwardsSurfaceLine(); RingtoetsMacroStabilityInwardsSurfaceLine surfaceLineToUpdateFrom = CreateSurfaceLineWithCharacteristicPoints(); // Call surfaceLine.CopyProperties(surfaceLineToUpdateFrom); // Assert AssertPropertiesUpdated(surfaceLineToUpdateFrom, surfaceLine); } [Test] public void Equals_DerivedClassWithEqualProperties_ReturnsTrue() { // Setup RingtoetsMacroStabilityInwardsSurfaceLine profile = CreateSurfaceLineWithCharacteristicPoints(); var derivedLayer = new TestSurfaceLine(profile); // Call bool areEqual = profile.Equals(derivedLayer); // Assert Assert.IsTrue(areEqual); } [Test] public void Equals_ToItself_ReturnsTrue() { // Setup var surfaceLineOne = new RingtoetsMacroStabilityInwardsSurfaceLine(); // Call bool isLineOneEqualToLineOne = surfaceLineOne.Equals(surfaceLineOne); // Assert Assert.IsTrue(isLineOneEqualToLineOne); } [Test] public void Equal_SameReference_ReturnsTrue() { // Setup var surfaceLineOne = new RingtoetsMacroStabilityInwardsSurfaceLine(); RingtoetsMacroStabilityInwardsSurfaceLine 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 RingtoetsMacroStabilityInwardsSurfaceLine { Name = "Name A" }; // Call bool isLineOneEqualToNull = surfaceLineOne.Equals(null); // Assert Assert.IsFalse(isLineOneEqualToNull); } [Test] public void Equals_ToDifferentType_ReturnsFalse() { // Setup var surfaceLineOne = new RingtoetsMacroStabilityInwardsSurfaceLine { 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 RingtoetsMacroStabilityInwardsSurfaceLine surfaceLineOne = CreateSurfaceLineWithCharacteristicPoints(); surfaceLineOne.Name = "Name A"; RingtoetsMacroStabilityInwardsSurfaceLine 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 RingtoetsMacroStabilityInwardsSurfaceLine { Name = "Name A" }; surfaceLineOne.SetGeometry(new[] { new Point3D(1, 2, 3) }); var surfaceLineTwo = new RingtoetsMacroStabilityInwardsSurfaceLine { 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 RingtoetsMacroStabilityInwardsSurfaceLine surfaceLineOne = CreateSurfaceLineWithCharacteristicPoints(); surfaceLineOne.ReferenceLineIntersectionWorldPoint = new Point2D(0, 0); RingtoetsMacroStabilityInwardsSurfaceLine 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_DifferentSurfaceLevelInside_ReturnsFalse() { // Setup RingtoetsMacroStabilityInwardsSurfaceLine surfaceLineOne = CreateSurfaceLineWithCharacteristicPoints(); RingtoetsMacroStabilityInwardsSurfaceLine surfaceLineTwo = CreateSurfaceLineWithCharacteristicPoints(); Point3D[] points = surfaceLineTwo.Points.ToArray(); surfaceLineTwo.SetSurfaceLevelInsideAt(points[5]); // Call bool isLineOneEqualToLineTwo = surfaceLineOne.Equals(surfaceLineTwo); bool isLineTwoEqualToLineOne = surfaceLineTwo.Equals(surfaceLineOne); // Assert Assert.IsFalse(isLineOneEqualToLineTwo); Assert.IsFalse(isLineTwoEqualToLineOne); } [Test] public void Equals_DifferentTrafficLoadInside_ReturnsFalse() { // Setup RingtoetsMacroStabilityInwardsSurfaceLine surfaceLineOne = CreateSurfaceLineWithCharacteristicPoints(); RingtoetsMacroStabilityInwardsSurfaceLine surfaceLineTwo = CreateSurfaceLineWithCharacteristicPoints(); Point3D[] points = surfaceLineTwo.Points.ToArray(); surfaceLineTwo.SetTrafficLoadInsideAt(points[5]); // Call bool isLineOneEqualToLineTwo = surfaceLineOne.Equals(surfaceLineTwo); bool isLineTwoEqualToLineOne = surfaceLineTwo.Equals(surfaceLineOne); // Assert Assert.IsFalse(isLineOneEqualToLineTwo); Assert.IsFalse(isLineTwoEqualToLineOne); } [Test] public void Equals_DifferentTrafficLoadOutside_ReturnsFalse() { // Setup RingtoetsMacroStabilityInwardsSurfaceLine surfaceLineOne = CreateSurfaceLineWithCharacteristicPoints(); RingtoetsMacroStabilityInwardsSurfaceLine surfaceLineTwo = CreateSurfaceLineWithCharacteristicPoints(); Point3D[] points = surfaceLineTwo.Points.ToArray(); surfaceLineTwo.SetTrafficLoadOutsideAt(points[5]); // Call bool isLineOneEqualToLineTwo = surfaceLineOne.Equals(surfaceLineTwo); bool isLineTwoEqualToLineOne = surfaceLineTwo.Equals(surfaceLineOne); // Assert Assert.IsFalse(isLineOneEqualToLineTwo); Assert.IsFalse(isLineTwoEqualToLineOne); } [Test] public void Equals_DifferentDikeTopAtPolder_ReturnsFalse() { // Setup RingtoetsMacroStabilityInwardsSurfaceLine surfaceLineOne = CreateSurfaceLineWithCharacteristicPoints(); RingtoetsMacroStabilityInwardsSurfaceLine surfaceLineTwo = CreateSurfaceLineWithCharacteristicPoints(); Point3D[] points = surfaceLineTwo.Points.ToArray(); surfaceLineTwo.SetDikeTopAtPolderAt(points[5]); // Call bool isLineOneEqualToLineTwo = surfaceLineOne.Equals(surfaceLineTwo); bool isLineTwoEqualToLineOne = surfaceLineTwo.Equals(surfaceLineOne); // Assert Assert.IsFalse(isLineOneEqualToLineTwo); Assert.IsFalse(isLineTwoEqualToLineOne); } [Test] public void Equals_DifferentShoulderBaseInside_ReturnsFalse() { // Setup RingtoetsMacroStabilityInwardsSurfaceLine surfaceLineOne = CreateSurfaceLineWithCharacteristicPoints(); RingtoetsMacroStabilityInwardsSurfaceLine surfaceLineTwo = CreateSurfaceLineWithCharacteristicPoints(); Point3D[] points = surfaceLineTwo.Points.ToArray(); surfaceLineTwo.SetShoulderBaseInsideAt(points[5]); // Call bool isLineOneEqualToLineTwo = surfaceLineOne.Equals(surfaceLineTwo); bool isLineTwoEqualToLineOne = surfaceLineTwo.Equals(surfaceLineOne); // Assert Assert.IsFalse(isLineOneEqualToLineTwo); Assert.IsFalse(isLineTwoEqualToLineOne); } [Test] public void Equals_DifferentShoulderTopInside_ReturnsFalse() { // Setup RingtoetsMacroStabilityInwardsSurfaceLine surfaceLineOne = CreateSurfaceLineWithCharacteristicPoints(); RingtoetsMacroStabilityInwardsSurfaceLine surfaceLineTwo = CreateSurfaceLineWithCharacteristicPoints(); Point3D[] points = surfaceLineTwo.Points.ToArray(); surfaceLineTwo.SetShoulderTopInsideAt(points[7]); // Call bool isLineOneEqualToLineTwo = surfaceLineOne.Equals(surfaceLineTwo); bool isLineTwoEqualToLineOne = surfaceLineTwo.Equals(surfaceLineOne); // Assert Assert.IsFalse(isLineOneEqualToLineTwo); Assert.IsFalse(isLineTwoEqualToLineOne); } [Test] public void Equals_DifferentSurfaceLevelOutside_ReturnsFalse() { // Setup RingtoetsMacroStabilityInwardsSurfaceLine surfaceLineOne = CreateSurfaceLineWithCharacteristicPoints(); RingtoetsMacroStabilityInwardsSurfaceLine surfaceLineTwo = CreateSurfaceLineWithCharacteristicPoints(); Point3D[] points = surfaceLineTwo.Points.ToArray(); surfaceLineTwo.SetSurfaceLevelOutsideAt(points[5]); // 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 RingtoetsMacroStabilityInwardsSurfaceLine surfaceLineOne = CreateSurfaceLineWithCharacteristicPoints(); RingtoetsMacroStabilityInwardsSurfaceLine 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 RingtoetsMacroStabilityInwardsSurfaceLine surfaceLineOne = CreateSurfaceLineWithCharacteristicPoints(); RingtoetsMacroStabilityInwardsSurfaceLine 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 RingtoetsMacroStabilityInwardsSurfaceLine surfaceLineOne = CreateSurfaceLineWithCharacteristicPoints(); RingtoetsMacroStabilityInwardsSurfaceLine 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 RingtoetsMacroStabilityInwardsSurfaceLine surfaceLineOne = CreateSurfaceLineWithCharacteristicPoints(); RingtoetsMacroStabilityInwardsSurfaceLine 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 RingtoetsMacroStabilityInwardsSurfaceLine surfaceLineOne = CreateSurfaceLineWithCharacteristicPoints(); RingtoetsMacroStabilityInwardsSurfaceLine 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 RingtoetsMacroStabilityInwardsSurfaceLine surfaceLineOne = CreateSurfaceLineWithCharacteristicPoints(); RingtoetsMacroStabilityInwardsSurfaceLine 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 RingtoetsMacroStabilityInwardsSurfaceLine surfaceLineOne = CreateSurfaceLineWithCharacteristicPoints(); RingtoetsMacroStabilityInwardsSurfaceLine 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 RingtoetsMacroStabilityInwardsSurfaceLine surfaceLineOne = CreateSurfaceLineWithCharacteristicPoints(); RingtoetsMacroStabilityInwardsSurfaceLine surfaceLineTwo = CreateSurfaceLineWithCharacteristicPoints(); RingtoetsMacroStabilityInwardsSurfaceLine 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 RingtoetsMacroStabilityInwardsSurfaceLine(); var surfaceLineTwo = new RingtoetsMacroStabilityInwardsSurfaceLine(); // Call int hashCodeOne = surfaceLineOne.GetHashCode(); int hashCodeTwo = surfaceLineTwo.GetHashCode(); // Assert Assert.AreEqual(hashCodeOne, hashCodeTwo); } [TestFixture] public class SetDitchPolderSideAtTest : SetCharacteristicPointTest { protected override void SetCharacteristicPoint(RingtoetsMacroStabilityInwardsSurfaceLine surfaceLine, Point3D point) { surfaceLine.SetDitchPolderSideAt(point); } protected override Point3D GetCharacteristicPoint(RingtoetsMacroStabilityInwardsSurfaceLine surfaceLine) { return surfaceLine.DitchPolderSide; } protected override string CharacteristicPointDescription() { return "Insteek sloot polderzijde"; } } [TestFixture] public class SetBottomDitchPolderSideAtTest : SetCharacteristicPointTest { protected override void SetCharacteristicPoint(RingtoetsMacroStabilityInwardsSurfaceLine surfaceLine, Point3D point) { surfaceLine.SetBottomDitchPolderSideAt(point); } protected override Point3D GetCharacteristicPoint(RingtoetsMacroStabilityInwardsSurfaceLine surfaceLine) { return surfaceLine.BottomDitchPolderSide; } protected override string CharacteristicPointDescription() { return "Slootbodem polderzijde"; } } [TestFixture] public class SetBottomDitchDikeSideAtTest : SetCharacteristicPointTest { protected override void SetCharacteristicPoint(RingtoetsMacroStabilityInwardsSurfaceLine surfaceLine, Point3D point) { surfaceLine.SetBottomDitchDikeSideAt(point); } protected override Point3D GetCharacteristicPoint(RingtoetsMacroStabilityInwardsSurfaceLine surfaceLine) { return surfaceLine.BottomDitchDikeSide; } protected override string CharacteristicPointDescription() { return "Slootbodem dijkzijde"; } } [TestFixture] public class SetDitchDikeSideAtTest : SetCharacteristicPointTest { protected override void SetCharacteristicPoint(RingtoetsMacroStabilityInwardsSurfaceLine surfaceLine, Point3D point) { surfaceLine.SetDitchDikeSideAt(point); } protected override Point3D GetCharacteristicPoint(RingtoetsMacroStabilityInwardsSurfaceLine surfaceLine) { return surfaceLine.DitchDikeSide; } protected override string CharacteristicPointDescription() { return "Insteek sloot dijkzijde"; } } [TestFixture] public class SetDikeTopAtPolderAtTest : SetCharacteristicPointTest { protected override void SetCharacteristicPoint(RingtoetsMacroStabilityInwardsSurfaceLine surfaceLine, Point3D point) { surfaceLine.SetDikeTopAtPolderAt(point); } protected override Point3D GetCharacteristicPoint(RingtoetsMacroStabilityInwardsSurfaceLine surfaceLine) { return surfaceLine.DikeTopAtPolder; } protected override string CharacteristicPointDescription() { return "Kruin binnentalud"; } } [TestFixture] public class SetShoulderBaseInsideAtTest : SetCharacteristicPointTest { protected override void SetCharacteristicPoint(RingtoetsMacroStabilityInwardsSurfaceLine surfaceLine, Point3D point) { surfaceLine.SetShoulderBaseInsideAt(point); } protected override Point3D GetCharacteristicPoint(RingtoetsMacroStabilityInwardsSurfaceLine surfaceLine) { return surfaceLine.ShoulderBaseInside; } protected override string CharacteristicPointDescription() { return "Insteek binnenberm"; } } [TestFixture] public class SetShoulderTopInsideAtTest : SetCharacteristicPointTest { protected override void SetCharacteristicPoint(RingtoetsMacroStabilityInwardsSurfaceLine surfaceLine, Point3D point) { surfaceLine.SetShoulderTopInsideAt(point); } protected override Point3D GetCharacteristicPoint(RingtoetsMacroStabilityInwardsSurfaceLine surfaceLine) { return surfaceLine.ShoulderTopInside; } protected override string CharacteristicPointDescription() { return "Kruin binnenberm"; } } [TestFixture] public class SetSurfaceLevelInsideAtTest : SetCharacteristicPointTest { protected override void SetCharacteristicPoint(RingtoetsMacroStabilityInwardsSurfaceLine surfaceLine, Point3D point) { surfaceLine.SetSurfaceLevelInsideAt(point); } protected override Point3D GetCharacteristicPoint(RingtoetsMacroStabilityInwardsSurfaceLine surfaceLine) { return surfaceLine.SurfaceLevelInside; } protected override string CharacteristicPointDescription() { return "Maaiveld binnenwaarts"; } } [TestFixture] public class SetSurfaceLevelOutsideAtTest : SetCharacteristicPointTest { protected override void SetCharacteristicPoint(RingtoetsMacroStabilityInwardsSurfaceLine surfaceLine, Point3D point) { surfaceLine.SetSurfaceLevelOutsideAt(point); } protected override Point3D GetCharacteristicPoint(RingtoetsMacroStabilityInwardsSurfaceLine surfaceLine) { return surfaceLine.SurfaceLevelOutside; } protected override string CharacteristicPointDescription() { return "Maaiveld buitenwaarts"; } } [TestFixture] public class SetTrafficLoadInsideAtTest : SetCharacteristicPointTest { protected override void SetCharacteristicPoint(RingtoetsMacroStabilityInwardsSurfaceLine surfaceLine, Point3D point) { surfaceLine.SetTrafficLoadInsideAt(point); } protected override Point3D GetCharacteristicPoint(RingtoetsMacroStabilityInwardsSurfaceLine surfaceLine) { return surfaceLine.TrafficLoadInside; } protected override string CharacteristicPointDescription() { return "Verkeersbelasting kant binnenwaarts"; } } [TestFixture] public class SetTrafficLoadOutsideAtTest : SetCharacteristicPointTest { protected override void SetCharacteristicPoint(RingtoetsMacroStabilityInwardsSurfaceLine surfaceLine, Point3D point) { surfaceLine.SetTrafficLoadOutsideAt(point); } protected override Point3D GetCharacteristicPoint(RingtoetsMacroStabilityInwardsSurfaceLine surfaceLine) { return surfaceLine.TrafficLoadOutside; } protected override string CharacteristicPointDescription() { return "Verkeersbelasting kant buitenwaarts"; } } [TestFixture] public class SetDikeToeAtRiverAtTest : SetCharacteristicPointTest { protected override void SetCharacteristicPoint(RingtoetsMacroStabilityInwardsSurfaceLine surfaceLine, Point3D point) { surfaceLine.SetDikeToeAtRiverAt(point); } protected override Point3D GetCharacteristicPoint(RingtoetsMacroStabilityInwardsSurfaceLine surfaceLine) { return surfaceLine.DikeToeAtRiver; } protected override string CharacteristicPointDescription() { return "Teen dijk buitenwaarts"; } } [TestFixture] public class SetDikeToeAtPolderAtTest : SetCharacteristicPointTest { protected override void SetCharacteristicPoint(RingtoetsMacroStabilityInwardsSurfaceLine surfaceLine, Point3D point) { surfaceLine.SetDikeToeAtPolderAt(point); } protected override Point3D GetCharacteristicPoint(RingtoetsMacroStabilityInwardsSurfaceLine surfaceLine) { return surfaceLine.DikeToeAtPolder; } protected override string CharacteristicPointDescription() { return "Teen dijk binnenwaarts"; } } 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 RingtoetsMacroStabilityInwardsSurfaceLine(); 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 RingtoetsMacroStabilityInwardsSurfaceLine(); // 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 RingtoetsMacroStabilityInwardsSurfaceLine(); // 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(RingtoetsMacroStabilityInwardsSurfaceLine surfaceLine, Point3D point); protected abstract Point3D GetCharacteristicPoint(RingtoetsMacroStabilityInwardsSurfaceLine surfaceLine); protected abstract string CharacteristicPointDescription(); } private class TestSurfaceLine : RingtoetsMacroStabilityInwardsSurfaceLine { public TestSurfaceLine(RingtoetsMacroStabilityInwardsSurfaceLine profile) { CopyProperties(profile); } } private static void AssertPropertiesUpdated(RingtoetsMacroStabilityInwardsSurfaceLine expectedSurfaceLine, RingtoetsMacroStabilityInwardsSurfaceLine 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.SurfaceLevelOutside, actualSurfaceLine.SurfaceLevelOutside); AssertAreEqualAndFromSurfaceLine(actualSurfaceLinePoints, expectedSurfaceLine.TrafficLoadOutside, actualSurfaceLine.TrafficLoadOutside); AssertAreEqualAndFromSurfaceLine(actualSurfaceLinePoints, expectedSurfaceLine.TrafficLoadInside, actualSurfaceLine.TrafficLoadInside); AssertAreEqualAndFromSurfaceLine(actualSurfaceLinePoints, expectedSurfaceLine.DikeTopAtPolder, actualSurfaceLine.DikeTopAtPolder); AssertAreEqualAndFromSurfaceLine(actualSurfaceLinePoints, expectedSurfaceLine.ShoulderBaseInside, actualSurfaceLine.ShoulderBaseInside); AssertAreEqualAndFromSurfaceLine(actualSurfaceLinePoints, expectedSurfaceLine.ShoulderTopInside, actualSurfaceLine.ShoulderTopInside); 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); AssertAreEqualAndFromSurfaceLine(actualSurfaceLinePoints, expectedSurfaceLine.SurfaceLevelInside, actualSurfaceLine.SurfaceLevelInside); } private static void AssertAreEqualAndFromSurfaceLine(Point3D[] actualSurfaceLinePoints, Point3D expectedPoint, Point3D actualPoint) { Assert.AreEqual(expectedPoint, actualPoint); if (actualPoint != null) { Assert.IsTrue(actualSurfaceLinePoints.Contains(actualPoint, new ReferenceEqualityComparer())); } } private static RingtoetsMacroStabilityInwardsSurfaceLine CreateSurfaceLineWithCharacteristicPoints() { var surfaceLine = new RingtoetsMacroStabilityInwardsSurfaceLine { 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), new Point3D(6, 0, 4), new Point3D(7, 0, 5), new Point3D(8, 0, 5), new Point3D(9, 0, 4), new Point3D(10, 0, 3), new Point3D(11, 0, 2), new Point3D(12, 0, 1) }; surfaceLine.SetGeometry(geometry); surfaceLine.SetSurfaceLevelOutsideAt(geometry[0]); surfaceLine.SetTrafficLoadOutsideAt(geometry[1]); surfaceLine.SetTrafficLoadInsideAt(geometry[2]); surfaceLine.SetDikeToeAtPolderAt(geometry[3]); surfaceLine.SetShoulderBaseInsideAt(geometry[4]); surfaceLine.SetShoulderTopInsideAt(geometry[5]); surfaceLine.SetBottomDitchDikeSideAt(geometry[6]); surfaceLine.SetBottomDitchPolderSideAt(geometry[7]); surfaceLine.SetDikeToeAtPolderAt(geometry[8]); surfaceLine.SetDikeToeAtRiverAt(geometry[9]); surfaceLine.SetDitchDikeSideAt(geometry[10]); surfaceLine.SetDitchPolderSideAt(geometry[11]); surfaceLine.SetSurfaceLevelInsideAt(geometry[12]); return surfaceLine; } private static void CreateTestGeometry(Point3D testPoint, RingtoetsMacroStabilityInwardsSurfaceLine 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); } } }