Index: Ringtoets/MacroStabilityInwards/src/Ringtoets.MacroStabilityInwards.Primitives/MacroStabilityInwardsPhreaticLine.cs =================================================================== diff -u -r4d4b8f95164640e83b52ec826869edbb656f2884 -r1aa559e52bc5cea607d34b0a4675d2074f808c83 --- Ringtoets/MacroStabilityInwards/src/Ringtoets.MacroStabilityInwards.Primitives/MacroStabilityInwardsPhreaticLine.cs (.../MacroStabilityInwardsPhreaticLine.cs) (revision 4d4b8f95164640e83b52ec826869edbb656f2884) +++ Ringtoets/MacroStabilityInwards/src/Ringtoets.MacroStabilityInwards.Primitives/MacroStabilityInwardsPhreaticLine.cs (.../MacroStabilityInwardsPhreaticLine.cs) (revision 1aa559e52bc5cea607d34b0a4675d2074f808c83) @@ -86,7 +86,6 @@ unchecked { int hashCode = Name.GetHashCode(); - hashCode = (hashCode * 397) ^ Name.GetHashCode(); foreach (Point2D point in Geometry) { Index: Ringtoets/MacroStabilityInwards/src/Ringtoets.MacroStabilityInwards.Primitives/MacroStabilityInwardsWaternetLine.cs =================================================================== diff -u -r14c118039f313ea66787d8065daad0aa783b731a -r1aa559e52bc5cea607d34b0a4675d2074f808c83 --- Ringtoets/MacroStabilityInwards/src/Ringtoets.MacroStabilityInwards.Primitives/MacroStabilityInwardsWaternetLine.cs (.../MacroStabilityInwardsWaternetLine.cs) (revision 14c118039f313ea66787d8065daad0aa783b731a) +++ Ringtoets/MacroStabilityInwards/src/Ringtoets.MacroStabilityInwards.Primitives/MacroStabilityInwardsWaternetLine.cs (.../MacroStabilityInwardsWaternetLine.cs) (revision 1aa559e52bc5cea607d34b0a4675d2074f808c83) @@ -21,6 +21,7 @@ using System; using System.Collections.Generic; +using System.Linq; using Core.Common.Base.Geometry; namespace Ringtoets.MacroStabilityInwards.Primitives @@ -73,5 +74,66 @@ /// Gets the associated phreatic line. /// public MacroStabilityInwardsPhreaticLine PhreaticLine { get; } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + { + return false; + } + if (ReferenceEquals(this, obj)) + { + return true; + } + if (obj.GetType() != GetType()) + { + return false; + } + return Equals((MacroStabilityInwardsWaternetLine) obj); + } + + public override int GetHashCode() + { + unchecked + { + int hashCode = Name.GetHashCode(); + + foreach (Point2D point in Geometry) + { + hashCode = (hashCode * 397) ^ point.GetHashCode(); + } + + hashCode = (hashCode * 397) ^ PhreaticLine.GetHashCode(); + + return hashCode; + } + } + + private bool Equals(MacroStabilityInwardsWaternetLine other) + { + return Name.Equals(other.Name) + && PhreaticLine.Equals(other.PhreaticLine) + && EqualGeometry(other.Geometry.ToArray()); + } + + private bool EqualGeometry(Point2D[] otherGeometry) + { + Point2D[] geometry = Geometry.ToArray(); + int nrOfPoints = geometry.Length; + if (otherGeometry.Length != nrOfPoints) + { + return false; + } + + for (var i = 0; i < nrOfPoints; i++) + { + if (!geometry[i].Equals(otherGeometry[i])) + { + return false; + } + } + + return true; + } } } \ No newline at end of file Index: Ringtoets/MacroStabilityInwards/test/Ringtoets.MacroStabilityInwards.Primitives.Test/MacroStabilityInwardsPhreaticLineTest.cs =================================================================== diff -u -r4d4b8f95164640e83b52ec826869edbb656f2884 -r1aa559e52bc5cea607d34b0a4675d2074f808c83 --- Ringtoets/MacroStabilityInwards/test/Ringtoets.MacroStabilityInwards.Primitives.Test/MacroStabilityInwardsPhreaticLineTest.cs (.../MacroStabilityInwardsPhreaticLineTest.cs) (revision 4d4b8f95164640e83b52ec826869edbb656f2884) +++ Ringtoets/MacroStabilityInwards/test/Ringtoets.MacroStabilityInwards.Primitives.Test/MacroStabilityInwardsPhreaticLineTest.cs (.../MacroStabilityInwardsPhreaticLineTest.cs) (revision 1aa559e52bc5cea607d34b0a4675d2074f808c83) @@ -110,16 +110,16 @@ MacroStabilityInwardsPhreaticLine otherPhreaticLine) { // Call - bool isStructureEqualToOther = phreaticLine.Equals(otherPhreaticLine); - bool isOtherEqualToStructure = otherPhreaticLine.Equals(phreaticLine); + bool isPhreaticLineEqualToOther = phreaticLine.Equals(otherPhreaticLine); + bool isOtherEqualToPhreaticLine = otherPhreaticLine.Equals(phreaticLine); // Assert - Assert.IsFalse(isStructureEqualToOther); - Assert.IsFalse(isOtherEqualToStructure); + Assert.IsFalse(isPhreaticLineEqualToOther); + Assert.IsFalse(isOtherEqualToPhreaticLine); } [Test] - public void GetHashCode_EqualStructures_ReturnsSameHashCode() + public void GetHashCode_EqualPhreaticLines_ReturnsSameHashCode() { // Setup MacroStabilityInwardsPhreaticLine phreaticLineX = CreatePhreaticLine(); Index: Ringtoets/MacroStabilityInwards/test/Ringtoets.MacroStabilityInwards.Primitives.Test/MacroStabilityInwardsWaternetLineTest.cs =================================================================== diff -u -r14c118039f313ea66787d8065daad0aa783b731a -r1aa559e52bc5cea607d34b0a4675d2074f808c83 --- Ringtoets/MacroStabilityInwards/test/Ringtoets.MacroStabilityInwards.Primitives.Test/MacroStabilityInwardsWaternetLineTest.cs (.../MacroStabilityInwardsWaternetLineTest.cs) (revision 14c118039f313ea66787d8065daad0aa783b731a) +++ Ringtoets/MacroStabilityInwards/test/Ringtoets.MacroStabilityInwards.Primitives.Test/MacroStabilityInwardsWaternetLineTest.cs (.../MacroStabilityInwardsWaternetLineTest.cs) (revision 1aa559e52bc5cea607d34b0a4675d2074f808c83) @@ -90,5 +90,114 @@ Assert.AreEqual(phreaticLineName, waternetLine.PhreaticLine.Name); CollectionAssert.IsEmpty(waternetLine.PhreaticLine.Geometry); } + + [Test] + [TestCase(null)] + [TestCase("string")] + public void Equals_ToDifferentTypeOrNull_ReturnsFalse(object other) + { + // Setup + MacroStabilityInwardsWaternetLine waternetLine = CreateWaternetLine(); + + // Call + bool isEqualToDifferentObject = waternetLine.Equals(other); + + // Assert + Assert.IsFalse(isEqualToDifferentObject); + } + + [Test] + public void Equals_AllPropertiesEqual_ReturnsTrue() + { + // Setup + MacroStabilityInwardsWaternetLine waternetLineX = CreateWaternetLine(); + MacroStabilityInwardsWaternetLine waternetLineY = CreateWaternetLine(); + + // Call + bool isXEqualToY = waternetLineX.Equals(waternetLineY); + bool isYEqualToZ = waternetLineY.Equals(waternetLineX); + + // Assert + Assert.IsTrue(isXEqualToY); + Assert.IsTrue(isYEqualToZ); + } + + [Test] + [TestCaseSource(nameof(GetWaternetLineCombinations))] + public void Equals_DifferentProperty_ReturnsFalse(MacroStabilityInwardsWaternetLine waternetLine, + MacroStabilityInwardsWaternetLine otherWaternetLine) + { + // Call + bool isWaternetLineEqualToOther = waternetLine.Equals(otherWaternetLine); + bool isOtherEqualToWaternetLine = otherWaternetLine.Equals(waternetLine); + + // Assert + Assert.IsFalse(isWaternetLineEqualToOther); + Assert.IsFalse(isOtherEqualToWaternetLine); + } + + [Test] + public void GetHashCode_EqualWaternetLines_ReturnsSameHashCode() + { + // Setup + MacroStabilityInwardsWaternetLine waternetLineX = CreateWaternetLine(); + MacroStabilityInwardsWaternetLine waternetLineY = CreateWaternetLine(); + + // Call + int hashCodeOne = waternetLineX.GetHashCode(); + int hashCodeTwo = waternetLineY.GetHashCode(); + + // Assert + Assert.AreEqual(hashCodeOne, hashCodeTwo); + } + + private static IEnumerable GetWaternetLineCombinations() + { + yield return new TestCaseData(CreateWaternetLine(), + new MacroStabilityInwardsWaternetLine("Other name", new[] + { + new Point2D(0, 0), + new Point2D(1, 1) + }, new TestMacroStabilityInwardsPhreaticLine())).SetName("Other name"); + + yield return new TestCaseData(CreateWaternetLine(), + new MacroStabilityInwardsWaternetLine("Test", new[] + { + new Point2D(0, 0), + new Point2D(1, 1), + new Point2D(1, 1) + }, new TestMacroStabilityInwardsPhreaticLine())).SetName("Geometry not same length"); + + yield return new TestCaseData(CreateWaternetLine(), + new MacroStabilityInwardsWaternetLine("Test", new[] + { + new Point2D(0, 0), + new Point2D(2, 2) + }, new TestMacroStabilityInwardsPhreaticLine())).SetName("Geometry not same coordinates"); + + yield return new TestCaseData(CreateWaternetLine(), + new MacroStabilityInwardsWaternetLine("Test", new[] + { + new Point2D(0, 0), + new Point2D(1, 1) + }, new MacroStabilityInwardsPhreaticLine( + "Test", + new[] + { + new Point2D(0, 0) + }))).SetName("Other phreatic line"); + } + + private static MacroStabilityInwardsWaternetLine CreateWaternetLine() + { + return new MacroStabilityInwardsWaternetLine( + "Test", + new[] + { + new Point2D(0, 0), + new Point2D(1, 1) + }, + new TestMacroStabilityInwardsPhreaticLine()); + } } } \ No newline at end of file