Index: Ringtoets/Revetment/src/Ringtoets.Revetment.Forms/Factories/WaveConditionsChartDataPointsFactory.cs =================================================================== diff -u -r39359f299a246ff0e9e41ef17dbbdb0168dc79d8 -r44fdff23a18b3b9c97489455962b43b7841a2c39 --- Ringtoets/Revetment/src/Ringtoets.Revetment.Forms/Factories/WaveConditionsChartDataPointsFactory.cs (.../WaveConditionsChartDataPointsFactory.cs) (revision 39359f299a246ff0e9e41ef17dbbdb0168dc79d8) +++ Ringtoets/Revetment/src/Ringtoets.Revetment.Forms/Factories/WaveConditionsChartDataPointsFactory.cs (.../WaveConditionsChartDataPointsFactory.cs) (revision 44fdff23a18b3b9c97489455962b43b7841a2c39) @@ -19,6 +19,7 @@ // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. +using System; using System.Linq; using Core.Common.Base.Geometry; using Core.Components.Charting.Data; @@ -121,16 +122,7 @@ /// public static Point2D[] CreateLowerBoundaryRevetmentGeometryPoints(WaveConditionsInput input) { - if (input == null || double.IsNaN(input.LowerBoundaryRevetment)) - { - return new Point2D[0]; - } - - return new[] - { - new Point2D(GetForeshoreProfileStartX(input), input.LowerBoundaryRevetment), - new Point2D(GetPointXOnRevetmenetLine(input, input.LowerBoundaryRevetment), input.LowerBoundaryRevetment) - }; + return CreateGeometryPoints(input, () => input.LowerBoundaryRevetment); } /// @@ -145,16 +137,55 @@ /// public static Point2D[] CreateUpperBoundaryRevetmentGeometryPoints(WaveConditionsInput input) { - if (input == null || double.IsNaN(input.UpperBoundaryRevetment)) + return CreateGeometryPoints(input, () => input.UpperBoundaryRevetment); + } + + /// + /// Create lower boundary water levels geometry points in 2D space based on the provided . + /// + /// The to create the lower boundary water levels geometry points for. + /// An array of points in 2D space or an empty array when: + /// + /// is null; + /// the is not set; + /// + /// + public static Point2D[] CreateLowerBoundaryWaterLevelsGeometryPoints(WaveConditionsInput input) + { + return CreateGeometryPoints(input, () => input.LowerBoundaryWaterLevels); + } + + /// + /// Create upper boundary water levels geometry points in 2D space based on the provided . + /// + /// The to create the upper boundary water levels geometry points for. + /// An array of points in 2D space or an empty array when: + /// + /// is null; + /// the is not set; + /// + /// + public static Point2D[] CreateUpperBoundaryWaterLevelsGeometryPoints(WaveConditionsInput input) + { + return CreateGeometryPoints(input, () => input.UpperBoundaryWaterLevels); + } + + private static Point2D[] CreateGeometryPoints(WaveConditionsInput input, Func getValueFunc) + { + if (input == null) { return new Point2D[0]; } - return new[] - { - new Point2D(GetForeshoreProfileStartX(input), input.UpperBoundaryRevetment), - new Point2D(GetPointXOnRevetmenetLine(input, input.UpperBoundaryRevetment), input.UpperBoundaryRevetment) - }; + double value = getValueFunc(); + + return double.IsNaN(value) + ? new Point2D[0] + : new[] + { + new Point2D(GetForeshoreProfileStartX(input), value), + new Point2D(GetPointXOnRevetmenetLine(input, value), value) + }; } private static double GetForeshoreProfileStartX(WaveConditionsInput input) Index: Ringtoets/Revetment/src/Ringtoets.Revetment.Forms/Views/WaveConditionsInputView.cs =================================================================== diff -u -r2a00fd15de1fcdd317234f2f490fe298905979a4 -r44fdff23a18b3b9c97489455962b43b7841a2c39 --- Ringtoets/Revetment/src/Ringtoets.Revetment.Forms/Views/WaveConditionsInputView.cs (.../WaveConditionsInputView.cs) (revision 2a00fd15de1fcdd317234f2f490fe298905979a4) +++ Ringtoets/Revetment/src/Ringtoets.Revetment.Forms/Views/WaveConditionsInputView.cs (.../WaveConditionsInputView.cs) (revision 44fdff23a18b3b9c97489455962b43b7841a2c39) @@ -137,6 +137,8 @@ revetmentChartData.NotifyObservers(); lowerBoundaryRevetmentChartData.NotifyObservers(); upperBoundaryRevetmentChartData.NotifyObservers(); + lowerBoundaryWaterLevelsChartData.NotifyObservers(); + upperBoundaryWaterLevelsChartData.NotifyObservers(); } private void UpdateChartTitle() @@ -156,6 +158,9 @@ revetmentChartData.Points = WaveConditionsChartDataPointsFactory.CreateRevetmentGeometryPoints(input); lowerBoundaryRevetmentChartData.Points = WaveConditionsChartDataPointsFactory.CreateLowerBoundaryRevetmentGeometryPoints(input); upperBoundaryRevetmentChartData.Points = WaveConditionsChartDataPointsFactory.CreateUpperBoundaryRevetmentGeometryPoints(input); + + lowerBoundaryWaterLevelsChartData.Points = WaveConditionsChartDataPointsFactory.CreateLowerBoundaryWaterLevelsGeometryPoints(input); + upperBoundaryWaterLevelsChartData.Points = WaveConditionsChartDataPointsFactory.CreateUpperBoundaryWaterLevelsGeometryPoints(input); } } } \ No newline at end of file Index: Ringtoets/Revetment/test/Ringtoets.Revetment.Forms.Test/Factories/WaveConditionsChartDataPointsFactoryTest.cs =================================================================== diff -u -r39359f299a246ff0e9e41ef17dbbdb0168dc79d8 -r44fdff23a18b3b9c97489455962b43b7841a2c39 --- Ringtoets/Revetment/test/Ringtoets.Revetment.Forms.Test/Factories/WaveConditionsChartDataPointsFactoryTest.cs (.../WaveConditionsChartDataPointsFactoryTest.cs) (revision 39359f299a246ff0e9e41ef17dbbdb0168dc79d8) +++ Ringtoets/Revetment/test/Ringtoets.Revetment.Forms.Test/Factories/WaveConditionsChartDataPointsFactoryTest.cs (.../WaveConditionsChartDataPointsFactoryTest.cs) (revision 44fdff23a18b3b9c97489455962b43b7841a2c39) @@ -528,6 +528,202 @@ CollectionAssert.AreEqual(expectedPoints, points); } + [Test] + public void CreateLowerBoundaryWaterLevelsGeometryPoints_InputNull_ReturnsEmptyPointsArray() + { + // Call + Point2D[] points = WaveConditionsChartDataPointsFactory.CreateLowerBoundaryWaterLevelsGeometryPoints(null); + + // Assert + CollectionAssert.IsEmpty(points); + } + + [Test] + public void CreateLowerBoundaryWaterLevelsGeometryPoints_LowerBoundaryWaterLevelsNaN_ReturnsEmptyPointsArray() + { + // Call + Point2D[] points = WaveConditionsChartDataPointsFactory.CreateLowerBoundaryWaterLevelsGeometryPoints(new WaveConditionsInput()); + + // Assert + CollectionAssert.IsEmpty(points); + } + + [Test] + public void CreateLowerBoundaryWaterLevelsGeometryPoints_NoForeshoreProfile_ReturnsLowerBoundaryWaterLevelsGeometryPointsArray() + { + // Call + var input = new WaveConditionsInput + { + LowerBoundaryWaterLevels = (RoundedDouble) 3 + }; + + // Call + Point2D[] points = WaveConditionsChartDataPointsFactory.CreateLowerBoundaryWaterLevelsGeometryPoints(input); + + // Assert + var expectedPoints = new[] + { + new Point2D(-10, 3), + new Point2D(1, 3) + }; + CollectionAssert.AreEqual(expectedPoints, points); + } + + [Test] + public void CreateLowerBoundaryWaterLevelsGeometryPoints_UseForeshoreProfileFalse_ReturnsLowerBoundaryWaterLevelsGeometryPointsArray() + { + // Call + var input = new WaveConditionsInput + { + LowerBoundaryWaterLevels= (RoundedDouble) 3, + ForeshoreProfile = new TestForeshoreProfile(new[] + { + new Point2D(0, 0), + new Point2D(3, 4) + }), + UseForeshore = false + }; + + // Call + Point2D[] points = WaveConditionsChartDataPointsFactory.CreateLowerBoundaryWaterLevelsGeometryPoints(input); + + // Assert + var expectedPoints = new[] + { + new Point2D(-10, 3), + new Point2D(1, 3) + }; + CollectionAssert.AreEqual(expectedPoints, points); + } + + [Test] + [TestCaseSource(nameof(GetForeshoreProfileGeometries), new object[] + { + "CreateLowerBoundaryWaterLevelsGeometryPoints_WithForeshoreProfile_ReturnsLowerBoundaryWaterLevelsGeometryPointsArray({0})" + })] + public void CreateLowerBoundaryWaterLevelsGeometryPoints_WithForeshoreProfile_ReturnsLowerBoundaryWaterLevelsGeometryPointsArray( + IEnumerable foreshoreProfileGeometry) + { + // Call + var input = new WaveConditionsInput + { + LowerBoundaryWaterLevels = (RoundedDouble) 3, + ForeshoreProfile = new TestForeshoreProfile(foreshoreProfileGeometry) + }; + + // Call + Point2D[] points = WaveConditionsChartDataPointsFactory.CreateLowerBoundaryWaterLevelsGeometryPoints(input); + + // Assert + Point2D lastGeometryPoint = foreshoreProfileGeometry.Last(); + double endPointX = (input.LowerBoundaryWaterLevels - lastGeometryPoint.Y) / 3; + + var expectedPoints = new[] + { + new Point2D(foreshoreProfileGeometry.First().X, 3), + new Point2D(endPointX + lastGeometryPoint.X, 3) + }; + CollectionAssert.AreEqual(expectedPoints, points); + } + + [Test] + public void CreateUpperBoundaryWaterLevelsGeometryPoints_InputNull_ReturnsEmptyPointsArray() + { + // Call + Point2D[] points = WaveConditionsChartDataPointsFactory.CreateUpperBoundaryWaterLevelsGeometryPoints(null); + + // Assert + CollectionAssert.IsEmpty(points); + } + + [Test] + public void CreateUpperBoundaryWaterLevelsGeometryPoints_UpperBoundaryWaterLevelsNaN_ReturnsEmptyPointsArray() + { + // Call + Point2D[] points = WaveConditionsChartDataPointsFactory.CreateUpperBoundaryWaterLevelsGeometryPoints(new WaveConditionsInput()); + + // Assert + CollectionAssert.IsEmpty(points); + } + + [Test] + public void CreateUpperBoundaryWaterLevelsGeometryPoints_NoForeshoreProfile_ReturnsUpperBoundaryWaterLevelsGeometryPointsArray() + { + // Call + var input = new WaveConditionsInput + { + UpperBoundaryWaterLevels = (RoundedDouble) 9 + }; + + // Call + Point2D[] points = WaveConditionsChartDataPointsFactory.CreateUpperBoundaryWaterLevelsGeometryPoints(input); + + // Assert + var expectedPoints = new[] + { + new Point2D(-10, 9), + new Point2D(3, 9) + }; + CollectionAssert.AreEqual(expectedPoints, points); + } + + [Test] + public void CreateUpperBoundaryWaterLevelsGeometryPoints_UseForeshoreProfileFalse_ReturnsUpperBoundaryWaterLevelsGeometryPointsArray() + { + // Call + var input = new WaveConditionsInput + { + UpperBoundaryWaterLevels = (RoundedDouble) 9, + ForeshoreProfile = new TestForeshoreProfile(new[] + { + new Point2D(0, 0), + new Point2D(3, 4) + }), + UseForeshore = false + }; + + // Call + Point2D[] points = WaveConditionsChartDataPointsFactory.CreateUpperBoundaryWaterLevelsGeometryPoints(input); + + // Assert + var expectedPoints = new[] + { + new Point2D(-10, 9), + new Point2D(3, 9) + }; + CollectionAssert.AreEqual(expectedPoints, points); + } + + [Test] + [TestCaseSource(nameof(GetForeshoreProfileGeometries), new object[] + { + "CreateUpperBoundaryWaterLevelsGeometryPoints_WithForeshoreProfile_ReturnsUppserBoundaryWaterLevelsGeometryPointsArray({0})" + })] + public void CreateUpperBoundaryWaterLevelsGeometryPoints_WithForeshoreProfile_ReturnsUppserBoundaryWaterLevelsGeometryPointsArray( + IEnumerable foreshoreProfileGeometry) + { + // Call + var input = new WaveConditionsInput + { + UpperBoundaryWaterLevels = (RoundedDouble) 9, + ForeshoreProfile = new TestForeshoreProfile(foreshoreProfileGeometry) + }; + + // Call + Point2D[] points = WaveConditionsChartDataPointsFactory.CreateUpperBoundaryWaterLevelsGeometryPoints(input); + + // Assert + Point2D lastGeometryPoint = foreshoreProfileGeometry.Last(); + double endPointX = (input.UpperBoundaryWaterLevels - lastGeometryPoint.Y) / 3; + + var expectedPoints = new[] + { + new Point2D(foreshoreProfileGeometry.First().X, 9), + new Point2D(endPointX + lastGeometryPoint.X, 9) + }; + CollectionAssert.AreEqual(expectedPoints, points); + } + private static IEnumerable GetInputWithoutRevetmentBoundaries(string testNameFormat) { yield return new TestCaseData(new WaveConditionsInput()) Index: Ringtoets/Revetment/test/Ringtoets.Revetment.Forms.Test/Views/WaveConditionsInputViewTest.cs =================================================================== diff -u -r2a00fd15de1fcdd317234f2f490fe298905979a4 -r44fdff23a18b3b9c97489455962b43b7841a2c39 --- Ringtoets/Revetment/test/Ringtoets.Revetment.Forms.Test/Views/WaveConditionsInputViewTest.cs (.../WaveConditionsInputViewTest.cs) (revision 2a00fd15de1fcdd317234f2f490fe298905979a4) +++ Ringtoets/Revetment/test/Ringtoets.Revetment.Forms.Test/Views/WaveConditionsInputViewTest.cs (.../WaveConditionsInputViewTest.cs) (revision 44fdff23a18b3b9c97489455962b43b7841a2c39) @@ -201,6 +201,13 @@ AssertUpperBoundaryRevetmentChartData(calculation.InputParameters.ForeshoreGeometry, calculation.InputParameters.UpperBoundaryRevetment, chartData.Collection.ElementAt(upperBoundaryRevetmentChartDataIndex)); + + AssertLowerBoundaryWaterLevelsChartData(calculation.InputParameters.ForeshoreGeometry, + calculation.InputParameters.LowerBoundaryWaterLevels, + chartData.Collection.ElementAt(lowerBoundaryWaterLevelsChartDataIndex)); + AssertUpperBoundaryWaterLevelsChartData(calculation.InputParameters.ForeshoreGeometry, + calculation.InputParameters.UpperBoundaryWaterLevels, + chartData.Collection.ElementAt(upperBoundaryWaterLevelsChartDataIndex)); } } @@ -272,7 +279,7 @@ // Setup var mocks = new MockRepository(); var observer = mocks.StrictMock(); - observer.Expect(o => o.UpdateObserver()).Repeat.Times(5); + observer.Expect(o => o.UpdateObserver()).Repeat.Times(7); mocks.ReplayAll(); var calculation = new TestWaveConditionsCalculation @@ -286,7 +293,9 @@ new Point2D(2.0, 2.0) }), LowerBoundaryRevetment = (RoundedDouble) 5, - UpperBoundaryRevetment = (RoundedDouble) 8 + UpperBoundaryRevetment = (RoundedDouble) 8, + LowerBoundaryWaterLevels = (RoundedDouble) 3, + UpperBoundaryWaterLevels = (RoundedDouble) 7 } }; @@ -300,12 +309,16 @@ var revetmentBaseChartData = (ChartLineData) view.Chart.Data.Collection.ElementAt(revetmentBaseChartDataIndex); var lowerBoundaryRevetmentChartData = (ChartLineData) view.Chart.Data.Collection.ElementAt(lowerBoundaryRevetmentChartDataIndex); var upperBoundaryRevetmentChartData = (ChartLineData) view.Chart.Data.Collection.ElementAt(upperBoundaryRevetmentChartDataIndex); + var lowerBoundaryWaterLevelsChartData = (ChartLineData) view.Chart.Data.Collection.ElementAt(lowerBoundaryWaterLevelsChartDataIndex); + var upperBoundaryWaterLevelsChartData = (ChartLineData) view.Chart.Data.Collection.ElementAt(upperBoundaryWaterLevelsChartDataIndex); foreshoreChartData.Attach(observer); revetmentChartData.Attach(observer); revetmentBaseChartData.Attach(observer); lowerBoundaryRevetmentChartData.Attach(observer); upperBoundaryRevetmentChartData.Attach(observer); + lowerBoundaryWaterLevelsChartData.Attach(observer); + upperBoundaryWaterLevelsChartData.Attach(observer); ForeshoreProfile profile2 = new TestForeshoreProfile(new[] { @@ -325,6 +338,8 @@ Assert.AreSame(revetmentBaseChartData, (ChartLineData) view.Chart.Data.Collection.ElementAt(revetmentBaseChartDataIndex)); Assert.AreSame(lowerBoundaryRevetmentChartData, (ChartLineData) view.Chart.Data.Collection.ElementAt(lowerBoundaryRevetmentChartDataIndex)); Assert.AreSame(upperBoundaryRevetmentChartData, (ChartLineData) view.Chart.Data.Collection.ElementAt(upperBoundaryRevetmentChartDataIndex)); + Assert.AreSame(lowerBoundaryWaterLevelsChartData, (ChartLineData) view.Chart.Data.Collection.ElementAt(lowerBoundaryWaterLevelsChartDataIndex)); + Assert.AreSame(upperBoundaryWaterLevelsChartData, (ChartLineData) view.Chart.Data.Collection.ElementAt(upperBoundaryWaterLevelsChartDataIndex)); AssertForeshoreChartData(profile2, foreshoreChartData); AssertRevetmentChartData(profile2.Geometry.Last(), calculation.InputParameters.LowerBoundaryRevetment, @@ -338,6 +353,13 @@ AssertUpperBoundaryRevetmentChartData(calculation.InputParameters.ForeshoreGeometry, calculation.InputParameters.UpperBoundaryRevetment, upperBoundaryRevetmentChartData); + + AssertLowerBoundaryWaterLevelsChartData(calculation.InputParameters.ForeshoreGeometry, + calculation.InputParameters.LowerBoundaryWaterLevels, + lowerBoundaryWaterLevelsChartData); + AssertUpperBoundaryWaterLevelsChartData(calculation.InputParameters.ForeshoreGeometry, + calculation.InputParameters.UpperBoundaryWaterLevels, + upperBoundaryWaterLevelsChartData); mocks.VerifyAll(); } } @@ -465,7 +487,7 @@ ChartData chartData) { Assert.IsInstanceOf(chartData); - var revetmentChartData = (ChartLineData)chartData; + var revetmentChartData = (ChartLineData) chartData; var expectedGeometry = new[] { @@ -496,6 +518,42 @@ Assert.AreEqual("Bovengrens bekleding", revetmentChartData.Name); } + private static void AssertLowerBoundaryWaterLevelsChartData(RoundedPoint2DCollection foreshorePoints, + double lowerBoundaryWaterLevels, + ChartData chartData) + { + Assert.IsInstanceOf(chartData); + var waterLevelsChartData = (ChartLineData) chartData; + + var expectedGeometry = new[] + { + new Point2D(foreshorePoints.First().X, lowerBoundaryWaterLevels), + new Point2D(GetPointX(lowerBoundaryWaterLevels, foreshorePoints.Last()), lowerBoundaryWaterLevels) + }; + + CollectionAssert.AreEqual(expectedGeometry, waterLevelsChartData.Points); + + Assert.AreEqual("Ondergrens waterstanden", waterLevelsChartData.Name); + } + + private static void AssertUpperBoundaryWaterLevelsChartData(RoundedPoint2DCollection foreshorePoints, + double upperBoundaryWaterLevels, + ChartData chartData) + { + Assert.IsInstanceOf(chartData); + var waterLevelsChartData = (ChartLineData) chartData; + + var expectedGeometry = new[] + { + new Point2D(foreshorePoints.First().X, upperBoundaryWaterLevels), + new Point2D(GetPointX(upperBoundaryWaterLevels, foreshorePoints.Last()), upperBoundaryWaterLevels) + }; + + CollectionAssert.AreEqual(expectedGeometry, waterLevelsChartData.Points); + + Assert.AreEqual("Bovengrens waterstanden", waterLevelsChartData.Name); + } + private static double GetPointX(double pointY, Point2D lastForeshorePoint) { return ((pointY - lastForeshorePoint.Y) / 3) + lastForeshorePoint.X;