Index: Ringtoets/Common/src/Ringtoets.Common.IO/SoilProfile/SoilLayer2DLoop.cs =================================================================== diff -u -r7585d2fd78627d94d55ffa16423af90a91e4efd4 -r0ae39cf7e804cdb6d5932d8d5aeced1e54febb60 --- Ringtoets/Common/src/Ringtoets.Common.IO/SoilProfile/SoilLayer2DLoop.cs (.../SoilLayer2DLoop.cs) (revision 7585d2fd78627d94d55ffa16423af90a91e4efd4) +++ Ringtoets/Common/src/Ringtoets.Common.IO/SoilProfile/SoilLayer2DLoop.cs (.../SoilLayer2DLoop.cs) (revision 0ae39cf7e804cdb6d5932d8d5aeced1e54febb60) @@ -20,6 +20,7 @@ // All rights reserved. using System; +using System.Linq; using Core.Common.Base.Geometry; using Ringtoets.Common.IO.Properties; @@ -33,9 +34,15 @@ /// /// Creates a new instance of . /// + /// Thrown when is null. /// Thrown when do not form a loop. public SoilLayer2DLoop(Segment2D[] segments) { + if (segments == null) + { + throw new ArgumentNullException(nameof(segments)); + } + CheckValidLoop(segments); Segments = segments; @@ -82,5 +89,34 @@ return true; } + + private bool Equals(SoilLayer2DLoop other) + { + return Segments.SequenceEqual(other.Segments); + } + + 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((SoilLayer2DLoop) obj); + } + + public override int GetHashCode() + { + unchecked + { + var hashCode = 0; + + foreach (Segment2D segment in Segments) + { + hashCode = (hashCode * 397) ^ segment.GetHashCode(); + } + + return hashCode; + } + } } } \ No newline at end of file Index: Ringtoets/Common/test/Ringtoets.Common.IO.Test/SoilProfile/SoilLayer2DGeometryReaderTest.cs =================================================================== diff -u -r7585d2fd78627d94d55ffa16423af90a91e4efd4 -r0ae39cf7e804cdb6d5932d8d5aeced1e54febb60 --- Ringtoets/Common/test/Ringtoets.Common.IO.Test/SoilProfile/SoilLayer2DGeometryReaderTest.cs (.../SoilLayer2DGeometryReaderTest.cs) (revision 7585d2fd78627d94d55ffa16423af90a91e4efd4) +++ Ringtoets/Common/test/Ringtoets.Common.IO.Test/SoilProfile/SoilLayer2DGeometryReaderTest.cs (.../SoilLayer2DGeometryReaderTest.cs) (revision 0ae39cf7e804cdb6d5932d8d5aeced1e54febb60) @@ -631,7 +631,7 @@ } /// - /// Takes a and returns an of + /// Takes and returns an of /// which contains the same information as the original . /// /// The to convert to an of Index: Ringtoets/Common/test/Ringtoets.Common.IO.Test/SoilProfile/SoilLayer2DLoopTest.cs =================================================================== diff -u -r7585d2fd78627d94d55ffa16423af90a91e4efd4 -r0ae39cf7e804cdb6d5932d8d5aeced1e54febb60 --- Ringtoets/Common/test/Ringtoets.Common.IO.Test/SoilProfile/SoilLayer2DLoopTest.cs (.../SoilLayer2DLoopTest.cs) (revision 7585d2fd78627d94d55ffa16423af90a91e4efd4) +++ Ringtoets/Common/test/Ringtoets.Common.IO.Test/SoilProfile/SoilLayer2DLoopTest.cs (.../SoilLayer2DLoopTest.cs) (revision 0ae39cf7e804cdb6d5932d8d5aeced1e54febb60) @@ -30,6 +30,17 @@ public class SoilLayer2DLoopTest { [Test] + public void Constructor_SegmentsNull_ThrowsArgumentNullException() + { + // Call + TestDelegate test = () => new SoilLayer2DLoop(null); + + // Assert + string paramName = Assert.Throws(test).ParamName; + Assert.AreEqual("segments", paramName); + } + + [Test] public void Constructor_ConnectedSegments_SetsSegments() { // Setup @@ -95,5 +106,61 @@ var exception = Assert.Throws(test); Assert.AreEqual("De segmenten van de geometrie van de laag vormen geen lus.", exception.Message); } + + [Test] + public void GetHashCode_EqualLoops_AreEqual() + { + // Setup + SoilLayer2DLoop loopA = CreateValidLoop(); + SoilLayer2DLoop loopB = CreateValidLoop(); + + // Precondition + Assert.AreEqual(loopA, loopB); + Assert.AreEqual(loopB, loopA); + + // Call & Assert + Assert.AreEqual(loopA.GetHashCode(), loopB.GetHashCode()); + Assert.AreEqual(loopB.GetHashCode(), loopA.GetHashCode()); + } + + [Test] + public void Equals_DifferentType_ReturnsFalse() + { + // Setup + SoilLayer2DLoop loop = CreateValidLoop(); + + // Call + bool areEqual = loop.Equals(new object()); + + // Assert + Assert.IsFalse(areEqual); + } + + [Test] + public void Equals_Null_ReturnsFalse() + { + // Setup + SoilLayer2DLoop loop = CreateValidLoop(); + + // Call + bool areEqual = loop.Equals(null); + + // Assert + Assert.IsFalse(areEqual); + } + + private static SoilLayer2DLoop CreateValidLoop() + { + var pointA = new Point2D(0.0, 0.0); + var pointB = new Point2D(1.0, 0.0); + + var segments = new[] + { + new Segment2D(pointA, pointB), + new Segment2D(pointB, pointA) + }; + + return new SoilLayer2DLoop(segments); + } } } \ No newline at end of file