Index: DamEngine/trunk/src/Deltares.DamEngine.Data.Tests/Geometry/GeometryCurveTests.cs =================================================================== diff -u -r5064 -r5073 --- DamEngine/trunk/src/Deltares.DamEngine.Data.Tests/Geometry/GeometryCurveTests.cs (.../GeometryCurveTests.cs) (revision 5064) +++ DamEngine/trunk/src/Deltares.DamEngine.Data.Tests/Geometry/GeometryCurveTests.cs (.../GeometryCurveTests.cs) (revision 5073) @@ -19,12 +19,13 @@ // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. -using System; +using System.Collections.Generic; using Deltares.DamEngine.Data.Geometry; using NUnit.Framework; namespace Deltares.DamEngine.Data.Tests.Geometry; +[TestFixture] public class GeometryCurveTests { [Test] @@ -124,4 +125,84 @@ Assert.That(curve.SurfaceAtLeft.Name.Equals("SurfaceLeft")); Assert.That(curve.SurfaceAtRight.Name.Equals("SurfaceRight")); } + + [TestFixture] + public class GivenGeometryCurve + { + private static readonly GeometryCurve geometryCurve = CreateGeometryCurve(); + private static readonly List calcPoints = ClonedPoints(geometryCurve); + + [TestFixture] + public class WhenCloned : GivenGeometryCurve + { + private static readonly GeometryCurve clonedGeometryCurve = geometryCurve.Clone(calcPoints); + + [Test] + public void ThenCopyOfCurveIsReturned() + { + Assert.That(clonedGeometryCurve, Is.Not.EqualTo(geometryCurve)); + Assert.That(clonedGeometryCurve.Name, Is.EqualTo(geometryCurve.Name)); + Assert.That(clonedGeometryCurve.LocationEquals(geometryCurve), Is.True); + Assert.That(clonedGeometryCurve.HeadPoint, Is.Not.EqualTo(geometryCurve.HeadPoint)); + Assert.That(clonedGeometryCurve.EndPoint, Is.Not.EqualTo(geometryCurve.EndPoint)); + // Assert.That(clonedGeometryCurve.SurfaceAtLeft.OuterLoop.Count, Is.EqualTo(geometryCurve.SurfaceAtLeft.OuterLoop.Count)); + // Assert.That(clonedGeometryCurve.SurfaceAtRight.OuterLoop.Count, Is.EqualTo(geometryCurve.SurfaceAtRight.OuterLoop.Count)); + // Assert.That(clonedGeometryCurve.SurfaceAtLeft, Is.Not.EqualTo(geometryCurve.SurfaceAtLeft)); + // Assert.That(clonedGeometryCurve.SurfaceAtRight, Is.Not.EqualTo(geometryCurve.SurfaceAtRight)); + } + } + + [TestFixture] + public class WithoutSurfacesWhenCloned : GivenGeometryCurve + { + [SetUp] + public void Setup() + { + geometryCurve.SurfaceAtLeft = null; + geometryCurve.SurfaceAtRight = null; + } + private static readonly GeometryCurve clonedGeometryCurve = geometryCurve.Clone(calcPoints); + + [Test] + public void ThenCopyOfCurveIsReturned_WithoutExceptions() + { + Assert.Multiple(() => + { + Assert.That(clonedGeometryCurve, Is.Not.EqualTo(geometryCurve)); + Assert.That(clonedGeometryCurve.Name, Is.EqualTo(geometryCurve.Name)); + Assert.That(clonedGeometryCurve.LocationEquals(geometryCurve), Is.True); + Assert.That(clonedGeometryCurve.HeadPoint, Is.Not.EqualTo(geometryCurve.HeadPoint)); + Assert.That(clonedGeometryCurve.EndPoint, Is.Not.EqualTo(geometryCurve.EndPoint)); + Assert.That(clonedGeometryCurve.SurfaceAtLeft, Is.Null); + Assert.That(clonedGeometryCurve.SurfaceAtRight, Is.Null); + }); + } + } + + private static List ClonedPoints(GeometryCurve curve) + { + var points = new List + { + curve.HeadPoint.Clone(), + curve.EndPoint.Clone() + }; + return points; + } + + private static GeometryCurve CreateGeometryCurve() + { + // ToDo: Create a proper GeometryCurve with a SurfaceAtLeft and SurfaceAtRight + // var loopLeft = new GeometryLoop(); + // loopLeft.CurveList.Add(new GeometryCurve(new Point2D(0.1, 0.2), new Point2D(0.3, 0.4))); + // var loopRight = new GeometryLoop(); + // loopRight.CurveList.Add(new GeometryCurve(new Point2D(10.1, 10.2), new Point2D(10.3, 10.4))); + var curve = new GeometryCurve(new Point2D(1.0, 2.0), new Point2D(10.0, 20.0)) + { + // SurfaceAtLeft = new GeometrySurface(loopLeft), + // SurfaceAtRight = new GeometrySurface(loopRight), + Name = "Geometry Curve 1" + }; + return curve; + } + } } \ No newline at end of file Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryLoop.cs =================================================================== diff -u -r5069 -r5073 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryLoop.cs (.../GeometryLoop.cs) (revision 5069) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryLoop.cs (.../GeometryLoop.cs) (revision 5073) @@ -249,11 +249,15 @@ /// The cloned GeometryLoop public override GeometryLoop Clone() { + SyncPoints(); GeometryPointString clonedGeometryPointString = base.Clone(); - GeometryLoop clonedGeometryLoop = new GeometryLoop(); + var clonedGeometryLoop = new GeometryLoop(); clonedGeometryLoop.Points.AddRange(clonedGeometryPointString.Points); - clonedGeometryLoop.SyncCalcPoints(); //Always sync the calcPoints after adding points or preferably add the calcPoints to the clonedGeometryPointString and synchronize the points (using SyncPoints) - clonedGeometryLoop.CurveList.AddRange(CurveList); // Wrong: The points in the new curves must be retrieved by location in the new pointlist in order to properly clone the curves + clonedGeometryLoop.SyncCalcPoints(); + foreach (GeometryCurve curve in CurveList) + { + clonedGeometryLoop.CurveList.Add(curve.Clone(clonedGeometryLoop.CalcPoints)); + } return clonedGeometryLoop; } } \ No newline at end of file Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryCurve.cs =================================================================== diff -u -r5065 -r5073 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryCurve.cs (.../GeometryCurve.cs) (revision 5065) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryCurve.cs (.../GeometryCurve.cs) (revision 5073) @@ -19,6 +19,8 @@ // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. +using System.Collections.Generic; + namespace Deltares.DamEngine.Data.Geometry; /// @@ -245,19 +247,21 @@ /// Clones the curve. /// /// Returns a clone - public GeometryCurve Clone() + public GeometryCurve Clone(List calcPoints) { - var curve = new GeometryCurve(headPoint.Clone(), endPoint.Clone()) + Point2D clonedHeadPoint = calcPoints.Find(p => p.LocationEquals(HeadPoint)); + Point2D clonedEndPoint = calcPoints.Find(p => p.LocationEquals(EndPoint)); + var curve = new GeometryCurve(clonedHeadPoint, clonedEndPoint) { Name = Name }; if (SurfaceAtLeft != null) { - curve.SurfaceAtLeft = SurfaceAtLeft.Clone(); + curve.SurfaceAtLeft = SurfaceAtLeft; } if (SurfaceAtRight != null) { - curve.SurfaceAtRight = SurfaceAtRight.Clone(); + curve.SurfaceAtRight = SurfaceAtRight; } return curve; } Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryData.cs =================================================================== diff -u -r5069 -r5073 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryData.cs (.../GeometryData.cs) (revision 5069) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryData.cs (.../GeometryData.cs) (revision 5073) @@ -1313,13 +1313,11 @@ } foreach (GeometryCurve curve in this.Curves) { - clonedGeometryData.Curves.Add(curve.Clone()); - // Wrong: The points in the new curves must be retrieved by location in the new pointlist in order to properly clone the curves + clonedGeometryData.Curves.Add(curve.Clone(clonedGeometryData.Points)); } foreach (GeometryCurve curve in this.NewlyEffectedCurves) { - clonedGeometryData.NewlyEffectedCurves.Add(curve.Clone()); - // Wrong: The points in the new curves must be retrieved by location in the new effectedpointlist in order to properly clone the curves + clonedGeometryData.NewlyEffectedCurves.Add(curve.Clone(clonedGeometryData.NewlyEffectedPoints)); } foreach (GeometryLoop loop in this.Loops) { @@ -1329,6 +1327,7 @@ { clonedGeometryData.Surfaces.Add(surface.Clone()); } + // for the clone, use the same geometry generator for now. Should be a new one but as the cloning is not correct, that will make some tests fail clonedGeometryData.geometryGenerator = geometryGenerator;//new GeometryGenerator(this); return clonedGeometryData; Index: DamEngine/trunk/src/Deltares.DamEngine.Data.Tests/Geometry/GeometryDataTests.cs =================================================================== diff -u -r5065 -r5073 --- DamEngine/trunk/src/Deltares.DamEngine.Data.Tests/Geometry/GeometryDataTests.cs (.../GeometryDataTests.cs) (revision 5065) +++ DamEngine/trunk/src/Deltares.DamEngine.Data.Tests/Geometry/GeometryDataTests.cs (.../GeometryDataTests.cs) (revision 5073) @@ -434,28 +434,6 @@ Assert.That(clonedGeometryData.Curves[0], Is.Not.EqualTo(originalGeometryData.Curves[0])); Assert.That(clonedGeometryData.Curves[0].HeadPoint.X, Is.EqualTo(originalGeometryData.Curves[0].HeadPoint.X)); } - - [Test] - public void ThenAllPointsAreCopied() - { - Assert.Multiple(() => - { - Assert.That(originalGeometryData.Curves[0].HeadPoint, Is.EqualTo(originalGeometryData.Points[0])); - Assert.That(clonedGeometryData.Curves[0].HeadPoint, Is.Not.EqualTo(clonedGeometryData.Points[0])); - }); - } - - [Test] - public void AfterRegeneratePointsAreLinked() - { - GeometryData data = originalGeometryData.Clone(); - data.RegenerateGeometry(); - Assert.Multiple(() => - { - Assert.That(originalGeometryData.Curves[0].HeadPoint, Is.EqualTo(originalGeometryData.Points[0])); - Assert.That(data.Curves[0].HeadPoint, Is.EqualTo(data.Points[0])); - }); - } [Test] public void ThenNewlyEffectedCurvesAreCopied()