Index: Core/Components/src/Core.Components.Charting/Core.Components.Charting.csproj =================================================================== diff -u -rebbb56ddd6ef8857548dcbbfa51c0650f0207d86 -rd494567cc0771ff224e920de98682a901dcfe01a --- Core/Components/src/Core.Components.Charting/Core.Components.Charting.csproj (.../Core.Components.Charting.csproj) (revision ebbb56ddd6ef8857548dcbbfa51c0650f0207d86) +++ Core/Components/src/Core.Components.Charting/Core.Components.Charting.csproj (.../Core.Components.Charting.csproj) (revision d494567cc0771ff224e920de98682a901dcfe01a) @@ -42,6 +42,7 @@ + Index: Core/Components/src/Core.Components.Charting/Data/ChartMultipleAreaData.cs =================================================================== diff -u --- Core/Components/src/Core.Components.Charting/Data/ChartMultipleAreaData.cs (revision 0) +++ Core/Components/src/Core.Components.Charting/Data/ChartMultipleAreaData.cs (revision d494567cc0771ff224e920de98682a901dcfe01a) @@ -0,0 +1,65 @@ +// Copyright (C) Stichting Deltares 2016. 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 Lesser 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser 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.Geometry; +using Core.Components.Charting.Styles; + +namespace Core.Components.Charting.Data +{ + public class ChartMultipleAreaData : ChartData + { + public ChartMultipleAreaData(IEnumerable> areas, string name) + : base(name) + { + if (areas == null) + { + var message = string.Format("A collection of areas is required when creating {0}.", typeof(ChartMultipleAreaData).Name); + throw new ArgumentNullException("areas", message); + } + if (areas.Any(a => a == null)) + { + var message = string.Format("Every area in the collection needs a value when creating {0}.", typeof(ChartMultipleAreaData).Name); + throw new ArgumentException(message, "areas"); + } + + Areas = areas.Select(area => area.ToList()).ToList(); + IsVisible = true; + } + + /// + /// Gets or sets a value indicating whether the is visible. + /// + public bool IsVisible { get; set; } + + /// + /// Gets the areas that are described by the . + /// + public IEnumerable> Areas { get; private set; } + + /// + /// The style of the . + /// + public ChartAreaStyle Style { get; set; } + } +} \ No newline at end of file Index: Core/Components/src/Core.Components.OxyPlot/Converter/ChartMultipleAreaDataConverter.cs =================================================================== diff -u --- Core/Components/src/Core.Components.OxyPlot/Converter/ChartMultipleAreaDataConverter.cs (revision 0) +++ Core/Components/src/Core.Components.OxyPlot/Converter/ChartMultipleAreaDataConverter.cs (revision d494567cc0771ff224e920de98682a901dcfe01a) @@ -0,0 +1,64 @@ +// Copyright (C) Stichting Deltares 2016. 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 Lesser 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser 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.Collections.Generic; +using System.Linq; +using Core.Components.Charting.Data; +using Core.Components.Charting.Styles; +using Core.Components.OxyPlot.CustomSeries; +using OxyPlot.Series; + +namespace Core.Components.OxyPlot.Converter +{ + /// + /// This class converts into . + /// + public class ChartMultipleAreaDataConverter : ChartDataConverter + { + protected override IList Convert(ChartMultipleAreaData data) + { + var series = new MultipleAreaSeries + { + IsVisible = data.IsVisible, + Tag = data + }; + + foreach (var area in data.Areas) + { + series.Areas.Add(area.Select(Point2DToDataPoint).ToArray()); + } + + CreateStyle(series, data.Style); + + return new List { series }; + } + + private void CreateStyle(MultipleAreaSeries series, ChartAreaStyle style) + { + if (style != null) + { + series.Fill = ChartDataHelper.Convert(style.FillColor); + series.Color = ChartDataHelper.Convert(style.StrokeColor); + series.StrokeThickness = style.Width; + } + } + } +} \ No newline at end of file Index: Core/Components/src/Core.Components.OxyPlot/Converter/ChartSeriesFactory.cs =================================================================== diff -u -r8aa11a9aa48733a5b5b72c58c71674472825b26c -rd494567cc0771ff224e920de98682a901dcfe01a --- Core/Components/src/Core.Components.OxyPlot/Converter/ChartSeriesFactory.cs (.../ChartSeriesFactory.cs) (revision 8aa11a9aa48733a5b5b72c58c71674472825b26c) +++ Core/Components/src/Core.Components.OxyPlot/Converter/ChartSeriesFactory.cs (.../ChartSeriesFactory.cs) (revision d494567cc0771ff224e920de98682a901dcfe01a) @@ -37,6 +37,7 @@ /// private readonly IEnumerable converters = new Collection { + new ChartMultipleAreaDataConverter(), new ChartAreaDataConverter(), new ChartLineDataConverter(), new ChartPointDataConverter(), Index: Core/Components/src/Core.Components.OxyPlot/Core.Components.OxyPlot.csproj =================================================================== diff -u -r0b76c9841bdeef5c3b9fa1ba0d6cb98a63b90c21 -rd494567cc0771ff224e920de98682a901dcfe01a --- Core/Components/src/Core.Components.OxyPlot/Core.Components.OxyPlot.csproj (.../Core.Components.OxyPlot.csproj) (revision 0b76c9841bdeef5c3b9fa1ba0d6cb98a63b90c21) +++ Core/Components/src/Core.Components.OxyPlot/Core.Components.OxyPlot.csproj (.../Core.Components.OxyPlot.csproj) (revision d494567cc0771ff224e920de98682a901dcfe01a) @@ -52,9 +52,11 @@ + + Index: Core/Components/src/Core.Components.OxyPlot/CustomSeries/MultipleAreaSeries.cs =================================================================== diff -u --- Core/Components/src/Core.Components.OxyPlot/CustomSeries/MultipleAreaSeries.cs (revision 0) +++ Core/Components/src/Core.Components.OxyPlot/CustomSeries/MultipleAreaSeries.cs (revision d494567cc0771ff224e920de98682a901dcfe01a) @@ -0,0 +1,146 @@ +// Copyright (C) Stichting Deltares 2016. 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 Lesser 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser 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.Collections.Generic; +using System.Linq; +using OxyPlot; +using OxyPlot.Series; + +namespace Core.Components.OxyPlot.CustomSeries +{ + public class MultipleAreaSeries : XYAxisSeries + { + private readonly OxyColor defaultColor = OxyColors.Fuchsia; + + public List Areas { get; private set; } + + public MultipleAreaSeries() + { + Areas = new List(); + Fill = OxyColors.Automatic; + Color = OxyColors.Automatic; + } + + /// + /// Gets or sets the color of the curve. + /// + /// The color. + public OxyColor Color { get; set; } + + /// + /// Gets the actual color. + /// + /// The actual color. + public OxyColor ActualColor + { + get + { + return Color.GetActualColor(defaultColor); + } + } + + /// + /// Gets or sets the thickness of the curve. + /// + /// The stroke thickness. + public double StrokeThickness { get; set; } + + /// + /// Gets or sets the area fill color. + /// + /// The fill. + public OxyColor Fill { get; set; } + + /// + /// Gets the actual fill color. + /// + /// The actual fill. + public OxyColor ActualFill + { + get + { + return Fill.GetActualColor(defaultColor); + } + } + + public override void Render(IRenderContext rc) + { + var areas = Areas; + int numberOfAreas = areas.Count; + if (numberOfAreas == 0) + { + return; + } + if (areas.TrueForAll(a => !a.Any())) + { + return; + } + + VerifyAxes(); + + var clippingRect = GetClippingRect(); + rc.SetClip(clippingRect); + + // Transform all points to screen coordinates + foreach (var area in areas) + { + var n0 = area.Length; + IList pts0 = new ScreenPoint[n0]; + TransformToScreenCoordinates(n0, pts0, area); + + rc.DrawClippedPolygon(clippingRect, pts0, 1, GetSelectableFillColor(ActualFill), ActualColor, StrokeThickness); + } + + rc.ResetClip(); + } + + protected override void UpdateMaxMin() + { + base.UpdateMaxMin(); + var allPoints = Areas.SelectMany(a => a).ToArray(); + + if (!allPoints.Any()) + { + return; + } + + MinX = allPoints.Min(p => p.X); + MaxX = allPoints.Max(p => p.X); + + MinY = allPoints.Min(p => p.Y); + MaxY = allPoints.Max(p => p.Y); + + XAxis.Include(MinX); + XAxis.Include(MaxX); + + YAxis.Include(MinY); + YAxis.Include(MaxY); + } + + private void TransformToScreenCoordinates(int n0, IList pts0, DataPoint[] actualPoints) + { + for (int i = 0; i < n0; i++) + { + pts0[i] = XAxis.Transform(actualPoints[i].X, actualPoints[i].Y, YAxis); + } + } + } +} \ No newline at end of file Index: Core/Components/test/Core.Components.Charting.Test/Core.Components.Charting.Test.csproj =================================================================== diff -u -rebbb56ddd6ef8857548dcbbfa51c0650f0207d86 -rd494567cc0771ff224e920de98682a901dcfe01a --- Core/Components/test/Core.Components.Charting.Test/Core.Components.Charting.Test.csproj (.../Core.Components.Charting.Test.csproj) (revision ebbb56ddd6ef8857548dcbbfa51c0650f0207d86) +++ Core/Components/test/Core.Components.Charting.Test/Core.Components.Charting.Test.csproj (.../Core.Components.Charting.Test.csproj) (revision d494567cc0771ff224e920de98682a901dcfe01a) @@ -51,6 +51,7 @@ + Index: Core/Components/test/Core.Components.Charting.Test/Data/ChartMultipleAreaDataTest.cs =================================================================== diff -u --- Core/Components/test/Core.Components.Charting.Test/Data/ChartMultipleAreaDataTest.cs (revision 0) +++ Core/Components/test/Core.Components.Charting.Test/Data/ChartMultipleAreaDataTest.cs (revision d494567cc0771ff224e920de98682a901dcfe01a) @@ -0,0 +1,128 @@ +// Copyright (C) Stichting Deltares 2016. 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 Lesser 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser 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.ObjectModel; +using System.Linq; +using Core.Common.Base.Geometry; +using Core.Common.TestUtil; +using Core.Components.Charting.Data; +using NUnit.Framework; + +namespace Core.Components.Charting.Test.Data +{ + [TestFixture] + public class ChartMultipleAreaDataTest + { + [Test] + public void Constructor_NullAreas_ThrowsArgumentNullException() + { + // Call + TestDelegate test = () => new ChartMultipleAreaData(null, "test data"); + + // Assert + var expectedMessage = "A collection of areas is required when creating ChartMultipleAreaData."; + TestHelper.AssertThrowsArgumentExceptionAndTestMessage(test, expectedMessage); + } + + [Test] + public void Constructor_NullAreaInAreas_ThrowsArgumentNullException() + { + // Call + TestDelegate test = () => new ChartMultipleAreaData(new Collection> { null }, "test data"); + + // Asserrt + var expectedMessage = "Every area in the collection needs a value when creating ChartMultipleAreaData."; + TestHelper.AssertThrowsArgumentExceptionAndTestMessage(test, expectedMessage); + } + + [Test] + [TestCase(null)] + [TestCase("")] + [TestCase(" ")] + public void Constructor_InvalidName_ThrowsArgumentException(string invalidName) + { + // Setup + var areas = new Collection>(); + + // Call + TestDelegate test = () => new ChartMultipleAreaData(areas, invalidName); + + // Assert + TestHelper.AssertThrowsArgumentExceptionAndTestMessage(test, "A name must be set to chart data"); + } + + [Test] + public void Constructor_WithEmptyAreas_CreatesNewICharData() + { + // Setup + var areas = new Collection>(); + + // Call + var data = new ChartMultipleAreaData(areas, "test data"); + + // Assert + Assert.IsInstanceOf(data); + Assert.AreNotSame(areas, data.Areas); + Assert.IsTrue(data.IsVisible); + } + + [Test] + public void Constructor_WithPoints_CreatesNewICharData() + { + // Setup + var areas = CreateTestAreas(); + + // Call + var data = new ChartMultipleAreaData(areas, "test data"); + + // Assert + Assert.IsInstanceOf(data); + Assert.AreNotSame(areas, data.Areas); + for (int i = 0; i < areas.Count; i++) + { + Assert.AreNotSame(areas[i], data.Areas.ElementAt(i)); + Assert.AreEqual(areas[i], data.Areas.ElementAt(i)); + } + CollectionAssert.AreEqual(areas, data.Areas); + } + + private Collection> CreateTestAreas() + { + return new Collection> + { + new Collection + { + new Point2D(0.0, 1.1), + new Point2D(1.0, 2.1), + new Point2D(1.6, 1.6) + }, + new Collection + { + new Point2D(0.4, 1.1), + new Point2D(1.6, 2.2), + new Point2D(1.2, 4.6) + + } + }; + } + } +} \ No newline at end of file Index: Core/Components/test/Core.Components.OxyPlot.Test/Converter/ChartMultipleAreaDataConverterTest.cs =================================================================== diff -u --- Core/Components/test/Core.Components.OxyPlot.Test/Converter/ChartMultipleAreaDataConverterTest.cs (revision 0) +++ Core/Components/test/Core.Components.OxyPlot.Test/Converter/ChartMultipleAreaDataConverterTest.cs (revision d494567cc0771ff224e920de98682a901dcfe01a) @@ -0,0 +1,192 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Drawing; +using System.Linq; +using Core.Common.Base.Geometry; +using Core.Common.TestUtil; +using Core.Components.Charting.Data; +using Core.Components.Charting.Styles; +using Core.Components.Charting.TestUtil; +using Core.Components.OxyPlot.Converter; +using Core.Components.OxyPlot.CustomSeries; +using NUnit.Framework; +using OxyPlot; +using OxyPlot.Series; + +namespace Core.Components.OxyPlot.Test.Converter +{ + [TestFixture] + public class ChartMultipleAreaDataConverterTest + { + [Test] + public void DefaultConstructor_IsChartDataConverter() + { + // Call + var converter = new ChartMultipleAreaDataConverter(); + + // Assert + Assert.IsInstanceOf>(converter); + } + + [Test] + public void CanConvertSeries_AreaData_ReturnTrue() + { + // Setup + var converter = new ChartMultipleAreaDataConverter(); + var areaData = new ChartMultipleAreaData(new Collection>(), "test data"); + + // Call + var canConvert = converter.CanConvertSeries(areaData); + + // Assert + Assert.IsTrue(canConvert); + } + + [Test] + public void CanConvertSeries_ChartData_ReturnsFalse() + { + // Setup + var converter = new ChartMultipleAreaDataConverter(); + var chartData = new TestChartData(); + + // Call + var canConvert = converter.CanConvertSeries(chartData); + + // Assert + Assert.IsFalse(canConvert); + } + + [Test] + public void Convert_RandomAreaData_ReturnsNewSeries() + { + // Setup + var converter = new ChartMultipleAreaDataConverter(); + var random = new Random(21); + var randomCount = random.Next(5, 10); + var areas = new Collection>(); + var points = new Collection(); + areas.Add(points); + + for (int i = 0; i < randomCount; i++) + { + points.Add(new Point2D(random.NextDouble(), random.NextDouble())); + } + + var areaData = new ChartMultipleAreaData(areas, "test data"); + + // Call + var series = converter.Convert(areaData); + + // Assert + Assert.IsInstanceOf>(series); + var areaSeries = ((MultipleAreaSeries)series[0]); + var expectedData = points.Select(t => new DataPoint(t.X, t.Y)).ToArray(); + CollectionAssert.AreEqual(expectedData, areaSeries.Areas[0]); + } + + [Test] + public void Convert_DataNull_ThrowsArgumentNullException() + { + // Setup + var testConverter = new ChartMultipleAreaDataConverter(); + + // Call + TestDelegate test = () => testConverter.Convert(null); + + // Assert + Assert.Throws(test); + } + + [Test] + public void Convert_DataCannotBeConverted_ThrowsArgumentException() + { + // Setup + var testConverter = new ChartMultipleAreaDataConverter(); + var testChartData = new TestChartData(); + var expectedMessage = string.Format("The data of type {0} cannot be converted by this converter.", testChartData.GetType()); + // Precondition + Assert.IsFalse(testConverter.CanConvertSeries(testChartData)); + + // Call + TestDelegate test = () => testConverter.Convert(testChartData); + + // Assert + TestHelper.AssertThrowsArgumentExceptionAndTestMessage(test, expectedMessage); + } + + [Test] + [TestCase(KnownColor.AliceBlue)] + [TestCase(KnownColor.Azure)] + [TestCase(KnownColor.Beige)] + public void Convert_WithDifferentFillColors_AppliesStyleToSeries(KnownColor color) + { + // Setup + var converter = new ChartMultipleAreaDataConverter(); + var expectedColor = Color.FromKnownColor(color); + var style = new ChartAreaStyle(expectedColor, Color.Red, 3); + var data = new ChartMultipleAreaData(new Collection>(), "test") + { + Style = style + }; + + // Call + var series = converter.Convert(data); + + // Assert + var multipleAreaSeries = ((MultipleAreaSeries)series[0]); + AssertColors(style.FillColor, multipleAreaSeries.Fill); + } + + [Test] + [TestCase(KnownColor.AliceBlue)] + [TestCase(KnownColor.Azure)] + [TestCase(KnownColor.Beige)] + public void Convert_WithDifferentStrokeColors_AppliesStyleToSeries(KnownColor color) + { + // Setup + var converter = new ChartMultipleAreaDataConverter(); + var expectedColor = Color.FromKnownColor(color); + var style = new ChartAreaStyle(Color.Red, expectedColor, 3); + var data = new ChartMultipleAreaData(new Collection>(), "test") + { + Style = style + }; + + // Call + var series = converter.Convert(data); + + // Assert + var multipleAreaSeries = ((MultipleAreaSeries)series[0]); + AssertColors(style.StrokeColor, multipleAreaSeries.Color); + } + + [Test] + [TestCase(1)] + [TestCase(5)] + [TestCase(7)] + public void Convert_WithDifferentStrokeWidths_AppliesStyleToSeries(int width) + { + // Setup + var converter = new ChartMultipleAreaDataConverter(); + var style = new ChartAreaStyle(Color.Red, Color.Red, width); + var data = new ChartMultipleAreaData(new Collection>(), "test") + { + Style = style + }; + + // Call + var series = converter.Convert(data); + + // Assert + var multipleAreaSeries = ((MultipleAreaSeries)series[0]); + Assert.AreEqual(width, multipleAreaSeries.StrokeThickness); + } + + private void AssertColors(Color color, OxyColor oxyColor) + { + OxyColor originalColor = OxyColor.FromArgb(color.A, color.R, color.G, color.B); + Assert.AreEqual(originalColor, oxyColor); + } + } +} \ No newline at end of file Index: Core/Components/test/Core.Components.OxyPlot.Test/Converter/ChartSeriesFactoryTest.cs =================================================================== diff -u -r8ca6a4ce40d75a96784c6ce8839e06e0b11052da -rd494567cc0771ff224e920de98682a901dcfe01a --- Core/Components/test/Core.Components.OxyPlot.Test/Converter/ChartSeriesFactoryTest.cs (.../ChartSeriesFactoryTest.cs) (revision 8ca6a4ce40d75a96784c6ce8839e06e0b11052da) +++ Core/Components/test/Core.Components.OxyPlot.Test/Converter/ChartSeriesFactoryTest.cs (.../ChartSeriesFactoryTest.cs) (revision d494567cc0771ff224e920de98682a901dcfe01a) @@ -27,6 +27,7 @@ using Core.Components.Charting.Data; using Core.Components.Charting.TestUtil; using Core.Components.OxyPlot.Converter; +using Core.Components.OxyPlot.CustomSeries; using NUnit.Framework; using OxyPlot; using OxyPlot.Series; @@ -53,7 +54,6 @@ var areaSeries = ((AreaSeries)series[0]); CollectionAssert.AreEqual(expectedData, areaSeries.Points); CollectionAssert.AreEqual(new Collection{expectedData.First()}, areaSeries.Points2); - Assert.AreNotSame(expectedData, areaSeries.ItemsSource); } [Test] @@ -95,6 +95,27 @@ } [Test] + public void Create_MultipleAreaData_ReturnsLinesSeriesWithAreaStyle() + { + // Setup + var factory = new ChartSeriesFactory(); + var testAreaA = CreateTestData(); + var testAreaB = CreateTestData(); + var expectedDataA = CreateExpectedData(testAreaA); + var expectedDataB = CreateExpectedData(testAreaB); + + // Call + IList series = factory.Create(new ChartMultipleAreaData(new [] { testAreaA, testAreaB }, "test data")); + + // Assert + Assert.AreEqual(1, series.Count); + Assert.IsInstanceOf>(series); + var multipleAreaSeries = ((MultipleAreaSeries)series[0]); + CollectionAssert.AreEqual(expectedDataA, multipleAreaSeries.Areas[0]); + CollectionAssert.AreEqual(expectedDataB, multipleAreaSeries.Areas[1]); + } + + [Test] public void Create_OtherData_ThrowsNotSupportedException() { // Setup Index: Core/Components/test/Core.Components.OxyPlot.Test/Core.Components.OxyPlot.Test.csproj =================================================================== diff -u -r0b76c9841bdeef5c3b9fa1ba0d6cb98a63b90c21 -rd494567cc0771ff224e920de98682a901dcfe01a --- Core/Components/test/Core.Components.OxyPlot.Test/Core.Components.OxyPlot.Test.csproj (.../Core.Components.OxyPlot.Test.csproj) (revision 0b76c9841bdeef5c3b9fa1ba0d6cb98a63b90c21) +++ Core/Components/test/Core.Components.OxyPlot.Test/Core.Components.OxyPlot.Test.csproj (.../Core.Components.OxyPlot.Test.csproj) (revision d494567cc0771ff224e920de98682a901dcfe01a) @@ -46,6 +46,9 @@ False ..\..\..\..\packages\OxyPlot.Core.1.0.0-unstable1953\lib\net40\OxyPlot.dll + + ..\..\..\..\packages\RhinoMocks.3.6.1\lib\net\Rhino.Mocks.dll + @@ -56,7 +59,9 @@ + + Index: Core/Components/test/Core.Components.OxyPlot.Test/CustomSeries/MultipleAreaSeriesTest.cs =================================================================== diff -u --- Core/Components/test/Core.Components.OxyPlot.Test/CustomSeries/MultipleAreaSeriesTest.cs (revision 0) +++ Core/Components/test/Core.Components.OxyPlot.Test/CustomSeries/MultipleAreaSeriesTest.cs (revision d494567cc0771ff224e920de98682a901dcfe01a) @@ -0,0 +1,172 @@ +// Copyright (C) Stichting Deltares 2016. 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 Lesser 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser 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 Core.Components.OxyPlot.CustomSeries; +using NUnit.Framework; +using OxyPlot; +using Rhino.Mocks; + +namespace Core.Components.OxyPlot.Test.CustomSeries +{ + public class MultipleAreaSeriesTest + { + [Test] + public void DefaultConstructor_RetunsDefaultValues() + { + // Call + var series = new MultipleAreaSeries(); + + // Assert + Assert.AreEqual(OxyColors.Automatic, series.Fill); + Assert.AreEqual(OxyColors.Fuchsia, series.ActualFill); + Assert.AreEqual(OxyColors.Automatic, series.Color); + Assert.AreEqual(OxyColors.Fuchsia, series.ActualColor); + Assert.AreEqual(0, series.StrokeThickness); + Assert.IsEmpty(series.Areas); + } + + [Test] + public void Render_NoAreas_NoCallForRenderArea() + { + // Setup + var mocks = new MockRepository(); + IRenderContext renderContext = mocks.StrictMock(); + mocks.ReplayAll(); + + var series = new MultipleAreaSeries(); + + // Call + series.Render(renderContext); + + // Assert + mocks.VerifyAll(); + } + + [Test] + public void Render_EmptyAreas_NoCallForRenderArea() + { + // Setup + var mocks = new MockRepository(); + IRenderContext renderContext = mocks.StrictMock(); + mocks.ReplayAll(); + + var series = new MultipleAreaSeries + { + Areas = + { + new DataPoint[0], + new DataPoint[0], + new DataPoint[0] + } + }; + + // Call + series.Render(renderContext); + + // Assert + mocks.VerifyAll(); + } + + [Test] + public void Render_NonEmptyArea_RendersThePoints() + { + // Setup + var random = new Random(21); + var pointCount = random.Next(5, 455); + var series = new MultipleAreaSeries(); + var model = new PlotModel(); + model.Series.Add(series); + + var mocks = new MockRepository(); + var renderContext = mocks.Stub(); + renderContext.Stub(rc => rc.SetClip(OxyRect.Create(0, 0, 0, 0))).Return(true); + renderContext.Stub(rc => rc.ResetClip()); + renderContext.Expect(rc => rc.DrawPolygon( + Arg.Matches(sp => sp.Length == pointCount), + Arg.Is.Equal(series.ActualFill), + Arg.Is.Equal(series.ActualColor), + Arg.Is.Equal(series.StrokeThickness), + Arg.Is.Anything, + Arg.Is.Anything, + Arg.Is.Anything)); + + mocks.ReplayAll(); + var area = new DataPoint[pointCount]; + series.Areas.Add(area); + + for (var i = 0; i < pointCount; i++) + { + area[i] = new DataPoint(random.Next(-50,50), random.Next(-50,50)); + } + + ((IPlotModel)model).Update(false); + + // Call + series.Render(renderContext); + + // Assert + mocks.VerifyAll(); + } + + [Test] + public void Render_MultipleNonEmptyArea_RendersTheAreas() + { + // Setup + var random = new Random(21); + var areaCount = random.Next(5, 455); + var series = new MultipleAreaSeries(); + var model = new PlotModel(); + model.Series.Add(series); + + var mocks = new MockRepository(); + var renderContext = mocks.Stub(); + renderContext.Stub(rc => rc.SetClip(OxyRect.Create(0, 0, 0, 0))).Return(true); + renderContext.Stub(rc => rc.ResetClip()); + renderContext.Expect(rc => rc.DrawPolygon( + Arg.Matches(sp => sp.Length > 0), + Arg.Is.Equal(series.ActualFill), + Arg.Is.Equal(series.ActualColor), + Arg.Is.Equal(series.StrokeThickness), + Arg.Is.Anything, + Arg.Is.Anything, + Arg.Is.Anything)).Repeat.Times(areaCount); + + mocks.ReplayAll(); + + for (var i = 0; i < areaCount; i++) + { + series.Areas.Add(new [] + { + new DataPoint(random.Next(-50, 50), random.Next(-50, 50)) + }); + } + + ((IPlotModel)model).Update(false); + + // Call + series.Render(renderContext); + + // Assert + mocks.VerifyAll(); + } + } +} \ No newline at end of file Index: Core/Plugins/src/Core.Plugins.OxyPlot/Legend/ChartLegendView.cs =================================================================== diff -u -r170ec8698dfed095e23f4fa822fe2198b3e5f242 -rd494567cc0771ff224e920de98682a901dcfe01a --- Core/Plugins/src/Core.Plugins.OxyPlot/Legend/ChartLegendView.cs (.../ChartLegendView.cs) (revision 170ec8698dfed095e23f4fa822fe2198b3e5f242) +++ Core/Plugins/src/Core.Plugins.OxyPlot/Legend/ChartLegendView.cs (.../ChartLegendView.cs) (revision d494567cc0771ff224e920de98682a901dcfe01a) @@ -108,11 +108,22 @@ OnNodeChecked = PointBasedChartDataOnNodeChecked }); + treeViewControl.RegisterTreeNodeInfo(new TreeNodeInfo + { + Text = multipleAreaData => multipleAreaData.Name, + Image = multipleAreaData => OxyPlotResources.AreaIcon, + CanDrag = (multipleAreaData, parentData) => true, + CanCheck = multipleAreaData => true, + IsChecked = multipleAreaData => multipleAreaData.IsVisible, + OnNodeChecked = ChartMultipleAreaDataOnNodeChecked + }); + treeViewControl.RegisterTreeNodeInfo(new TreeNodeInfo { Text = chartControl => chartControl.Name, Image = chartControl => GuiResources.folder, ChildNodeObjects = chartControl => chartControl.List.Reverse().Cast().ToArray(), + CanDrag = (multipleAreaData, parentData) => true, CanDrop = ChartControlCanDrop, CanInsert = ChartControlCanInsert, OnDrop = ChartControlOnDrop @@ -121,12 +132,23 @@ # region ChartData - private static void PointBasedChartDataOnNodeChecked(PointBasedChartData pointBasedChartData, object parentData) + private void PointBasedChartDataOnNodeChecked(PointBasedChartData pointBasedChartData, object parentData) { pointBasedChartData.IsVisible = !pointBasedChartData.IsVisible; - pointBasedChartData.NotifyObservers(); + NotifyObserversOfData(pointBasedChartData); + } - var observableParent = parentData as IObservable; + private void ChartMultipleAreaDataOnNodeChecked(ChartMultipleAreaData chartMultipleAreaData, object parentData) + { + chartMultipleAreaData.IsVisible = !chartMultipleAreaData.IsVisible; + NotifyObserversOfData(chartMultipleAreaData); + } + + private void NotifyObserversOfData(ChartData chartData) + { + chartData.NotifyObservers(); + + var observableParent = Data as IObservable; if (observableParent != null) { observableParent.NotifyObservers(); Index: Core/Plugins/test/Core.Plugins.OxyPlot.Test/Core.Plugins.OxyPlot.Test.csproj =================================================================== diff -u -r170ec8698dfed095e23f4fa822fe2198b3e5f242 -rd494567cc0771ff224e920de98682a901dcfe01a --- Core/Plugins/test/Core.Plugins.OxyPlot.Test/Core.Plugins.OxyPlot.Test.csproj (.../Core.Plugins.OxyPlot.Test.csproj) (revision 170ec8698dfed095e23f4fa822fe2198b3e5f242) +++ Core/Plugins/test/Core.Plugins.OxyPlot.Test/Core.Plugins.OxyPlot.Test.csproj (.../Core.Plugins.OxyPlot.Test.csproj) (revision d494567cc0771ff224e920de98682a901dcfe01a) @@ -67,6 +67,7 @@ + Index: Core/Plugins/test/Core.Plugins.OxyPlot.Test/Legend/ChartAreaDataTreeNodeInfoTest.cs =================================================================== diff -u -rc9396d0af18873fda14c7e486decbfca7d4e8b21 -rd494567cc0771ff224e920de98682a901dcfe01a --- Core/Plugins/test/Core.Plugins.OxyPlot.Test/Legend/ChartAreaDataTreeNodeInfoTest.cs (.../ChartAreaDataTreeNodeInfoTest.cs) (revision c9396d0af18873fda14c7e486decbfca7d4e8b21) +++ Core/Plugins/test/Core.Plugins.OxyPlot.Test/Legend/ChartAreaDataTreeNodeInfoTest.cs (.../ChartAreaDataTreeNodeInfoTest.cs) (revision d494567cc0771ff224e920de98682a901dcfe01a) @@ -17,14 +17,12 @@ [TestFixture] public class ChartAreaDataTreeNodeInfoTest { - private MockRepository mocks; private ChartLegendView chartLegendView; private TreeNodeInfo info; [SetUp] public void SetUp() { - mocks = new MockRepository(); chartLegendView = new ChartLegendView(); TreeViewControl treeViewControl = TypeUtils.GetField(chartLegendView, "treeViewControl"); @@ -37,16 +35,11 @@ public void TearDown() { chartLegendView.Dispose(); - - mocks.VerifyAll(); } [Test] public void Initialized_Always_ExpectedPropertiesSet() { - // Setup - mocks.ReplayAll(); - // Assert Assert.AreEqual(typeof(ChartAreaData), info.TagType); Assert.IsNull(info.ForeColor); @@ -66,10 +59,8 @@ public void Text_Always_ReturnsNameFromChartData() { // Setup - var areaData = mocks.StrictMock(Enumerable.Empty(), "test data"); + var areaData = new ChartAreaData(Enumerable.Empty(), "test data"); - mocks.ReplayAll(); - // Call var text = info.Text(areaData); @@ -81,10 +72,8 @@ public void Image_Always_ReturnsSetImage() { // Setup - var areaData = mocks.StrictMock(Enumerable.Empty(), "test data"); + var areaData = new ChartAreaData(Enumerable.Empty(), "test data"); - mocks.ReplayAll(); - // Call var image = info.Image(areaData); @@ -96,10 +85,8 @@ public void CanDrag_Always_ReturnsTrue() { // Setup - var areaData = mocks.StrictMock(Enumerable.Empty(), "test data"); + var areaData = new ChartAreaData(Enumerable.Empty(), "test data"); - mocks.ReplayAll(); - // Call var canDrag = info.CanDrag(areaData, null); @@ -111,10 +98,8 @@ public void CanCheck_Always_ReturnsTrue() { // Setup - var areaData = mocks.StrictMock(Enumerable.Empty(), "test data"); + var areaData = new ChartAreaData(Enumerable.Empty(), "test data"); - mocks.ReplayAll(); - // Call var canCheck = info.CanCheck(areaData); @@ -127,11 +112,9 @@ public void IsChecked_Always_ReturnsAccordingToVisibleStateOfAreaData(bool isVisible) { // Setup - var areaData = mocks.StrictMock(Enumerable.Empty(), "test data"); + var areaData = new ChartAreaData(Enumerable.Empty(), "test data"); areaData.IsVisible = isVisible; - mocks.ReplayAll(); - // Call var canCheck = info.IsChecked(areaData); @@ -144,10 +127,8 @@ public void OnNodeChecked_AreaDataNodeWithoutParent_SetsAreaDataVisibility(bool initialVisibleState) { // Setup - var areaData = mocks.StrictMock(Enumerable.Empty(), "test data"); + var areaData = new ChartAreaData(Enumerable.Empty(), "test data"); - mocks.ReplayAll(); - areaData.IsVisible = initialVisibleState; // Call @@ -162,20 +143,22 @@ public void OnNodeChecked_AreaDataNodeWithObservableParent_SetsAreaDataVisibilityAndNotifiesParentObservers(bool initialVisibleState) { // Setup - var observable = mocks.StrictMock(); - var areaData = mocks.StrictMock(Enumerable.Empty(), "test data"); + var notified = 0; + var observer = new Observer(() => notified++); + var chartData = new ChartDataCollection(new List(), "Collection"); + observer.Observable = chartData; + chartLegendView.Data = chartData; - observable.Expect(o => o.NotifyObservers()); + var areaData = new ChartAreaData(Enumerable.Empty(), "test data"); - mocks.ReplayAll(); - areaData.IsVisible = initialVisibleState; // Call - info.OnNodeChecked(areaData, observable); + info.OnNodeChecked(areaData, null); // Assert Assert.AreEqual(!initialVisibleState, areaData.IsVisible); + Assert.AreEqual(1, notified); } } } \ No newline at end of file Index: Core/Plugins/test/Core.Plugins.OxyPlot.Test/Legend/ChartDataCollectionTreeNodeInfoTest.cs =================================================================== diff -u -rc9396d0af18873fda14c7e486decbfca7d4e8b21 -rd494567cc0771ff224e920de98682a901dcfe01a --- Core/Plugins/test/Core.Plugins.OxyPlot.Test/Legend/ChartDataCollectionTreeNodeInfoTest.cs (.../ChartDataCollectionTreeNodeInfoTest.cs) (revision c9396d0af18873fda14c7e486decbfca7d4e8b21) +++ Core/Plugins/test/Core.Plugins.OxyPlot.Test/Legend/ChartDataCollectionTreeNodeInfoTest.cs (.../ChartDataCollectionTreeNodeInfoTest.cs) (revision d494567cc0771ff224e920de98682a901dcfe01a) @@ -2,10 +2,12 @@ using System.Collections.Generic; using System.Linq; using Core.Common.Base; +using Core.Common.Base.Geometry; using Core.Common.Controls.TreeView; using Core.Common.TestUtil; using Core.Common.Utils.Reflection; using Core.Components.Charting.Data; +using Core.Components.Charting.TestUtil; using Core.Plugins.OxyPlot.Legend; using NUnit.Framework; using Rhino.Mocks; @@ -16,17 +18,16 @@ [TestFixture] public class ChartDataCollectionTreeNodeInfoTest { - private MockRepository mocks; private ChartLegendView chartLegendView; private TreeNodeInfo info; + private TreeViewControl treeViewControl; [SetUp] public void SetUp() { - mocks = new MockRepository(); chartLegendView = new ChartLegendView(); - TreeViewControl treeViewControl = TypeUtils.GetField(chartLegendView, "treeViewControl"); + treeViewControl = TypeUtils.GetField(chartLegendView, "treeViewControl"); Dictionary treeNodeInfoLookup = TypeUtils.GetField>(treeViewControl, "tagTypeTreeNodeInfoLookup"); info = treeNodeInfoLookup[typeof(ChartDataCollection)]; @@ -36,16 +37,11 @@ public void TearDown() { chartLegendView.Dispose(); - - mocks.VerifyAll(); } [Test] public void Initialized_Always_ExpectedPropertiesSet() { - // Setup - mocks.ReplayAll(); - // Assert Assert.AreEqual(typeof(ChartDataCollection), info.TagType); Assert.IsNull(info.ForeColor); @@ -58,17 +54,14 @@ Assert.IsNull(info.CanCheck); Assert.IsNull(info.IsChecked); Assert.IsNull(info.OnNodeChecked); - Assert.IsNull(info.CanDrag); } [Test] public void Text_Always_ReturnsNameFromChartData() { // Setup - var chartDataCollection = mocks.StrictMock(new List(), "test data"); + var chartDataCollection = new ChartDataCollection(new List(), "test data"); - mocks.ReplayAll(); - // Call var text = info.Text(chartDataCollection); @@ -80,10 +73,8 @@ public void Image_Always_ReturnsSetImage() { // Setup - var chartDataCollection = mocks.StrictMock(new List(), "test data"); + var chartDataCollection = new ChartDataCollection(new List(), "test data"); - mocks.ReplayAll(); - // Call var image = info.Image(chartDataCollection); @@ -95,18 +86,16 @@ public void ChildNodeObjects_Always_ReturnsChildsOnDataReversed() { // Setup - var chartData1 = mocks.StrictMock("test data"); - var chartData2 = mocks.StrictMock("test data"); - var chartData3 = mocks.StrictMock("test data"); - var chartDataCollection = mocks.StrictMock(new List + var chartData1 = new TestChartData(); + var chartData2 = new TestChartData(); + var chartData3 = new TestChartData(); + var chartDataCollection = new ChartDataCollection(new List { chartData1, chartData2, chartData3 }, "test data"); - mocks.ReplayAll(); - // Call var objects = info.ChildNodeObjects(chartDataCollection); @@ -118,10 +107,8 @@ public void CanDrop_SourceNodeTagIsNoChartData_ReturnsFalse() { // Setup - var chartDataCollection = mocks.StrictMock(new List(), "test data"); + var chartDataCollection = new ChartDataCollection(new List(), "test data"); - mocks.ReplayAll(); - // Call var canDrop = info.CanDrop(new object(), chartDataCollection); @@ -133,11 +120,9 @@ public void CanDrop_SourceNodeTagIsChartData_ReturnsTrue() { // Setup - var chartData = mocks.StrictMock("test data"); - var chartDataCollection = mocks.StrictMock(new List(), "test data"); + var chartData = new TestChartData(); + var chartDataCollection = new ChartDataCollection(new List(), "test data"); - mocks.ReplayAll(); - // Call var canDrop = info.CanDrop(chartData, chartDataCollection); @@ -149,10 +134,8 @@ public void CanInsert_SourceNodeTagIsNoChartData_ReturnsFalse() { // Setup - var chartDataCollection = mocks.StrictMock(new List(), "test data"); + var chartDataCollection = new ChartDataCollection(new List(), "test data"); - mocks.ReplayAll(); - // Call var canInsert = info.CanInsert(new object(), chartDataCollection); @@ -164,11 +147,9 @@ public void CanInsert_SourceNodeTagIsChartData_ReturnsTrue() { // Setup - var chartData = mocks.StrictMock("test data"); - var chartDataCollection = mocks.StrictMock(new List(), "test data"); + var chartData = new TestChartData(); + var chartDataCollection = new ChartDataCollection(new List(), "test data"); - mocks.ReplayAll(); - // Call var canInsert = info.CanInsert(chartData, chartDataCollection); @@ -177,72 +158,78 @@ } [Test] + public void CanDrag_Always_ReturnsTrue() + { + // Call + var canInsert = info.CanDrag(null, null); + + // Assert + Assert.IsTrue(canInsert); + } + + [Test] [TestCase(0)] [TestCase(1)] [TestCase(2)] public void OnDrop_ChartDataMovedToPositionInsideRange_SetsNewReverseOrder(int position) { // Setup - var observer = mocks.StrictMock(); - var chartData1 = mocks.StrictMock("test data"); - var chartData2 = mocks.StrictMock("test data"); - var chartData3 = mocks.StrictMock("test data"); - var chartDataCollection = mocks.StrictMock(new List + var chartData1 = new TestChartData(); + var chartData2 = new TestChartData(); + var chartData3 = new TestChartData(); + var chartDataCollection = new ChartDataCollection(new List { chartData1, chartData2, chartData3 }, "test data"); + var notify = 0; + var observer = new Observer(() => notify++); - observer.Expect(o => o.UpdateObserver()); - mocks.ReplayAll(); - chartDataCollection.Attach(observer); - using (var treeViewControl = new TreeViewControl()) - { - // Call - info.OnDrop(chartData1, chartDataCollection, chartDataCollection, position, treeViewControl); + // Call + info.OnDrop(chartData1, chartDataCollection, chartDataCollection, position, treeViewControl); - // Assert - var reversedIndex = 2 - position; - Assert.AreSame(chartData1, chartDataCollection.List.ElementAt(reversedIndex)); - } - // Assert observer is notified in TearDown() + // Assert + var reversedIndex = 2 - position; + Assert.AreSame(chartData1, chartDataCollection.List.ElementAt(reversedIndex)); + + Assert.AreEqual(1, notify); } [Test] [TestCase(-50)] [TestCase(-1)] - [TestCase(3)] + [TestCase(4)] [TestCase(50)] - public void OnDrop_ChartDataMovedToPositionOutsideRange_SetsNewReverseOrder(int position) + public void OnDrop_ChartDataMovedToPositionOutsideRange_ThrowsException(int position) { // Setup - var observer = mocks.StrictMock(); - var chartData1 = mocks.StrictMock("test data"); - var chartData2 = mocks.StrictMock("test data"); - var chartData3 = mocks.StrictMock("test data"); - var chartDataCollection = mocks.StrictMock(new List + var chartData1 = new ChartLineData(Enumerable.Empty(), "line"); + var chartData2 = new ChartAreaData(Enumerable.Empty(), "area"); + var chartData3 = new ChartPointData(Enumerable.Empty(), "point"); + var chartData4 = new ChartMultipleAreaData(Enumerable.Empty>(), "multiple area"); + var chartDataCollection = new ChartDataCollection(new List { chartData1, chartData2, - chartData3 + chartData3, + chartData4 }, "test data"); + var notify = 0; + var observer = new Observer(() => notify++); chartDataCollection.Attach(observer); - mocks.ReplayAll(); + chartLegendView.Data = chartDataCollection; - using (var treeViewControl = new TreeViewControl()) - { - // Call - TestDelegate test = () => info.OnDrop(chartData1, chartDataCollection, chartDataCollection, position, treeViewControl); + // Call + TestDelegate test = () => info.OnDrop(chartData1, chartDataCollection, chartDataCollection, position, treeViewControl); - // Assert - Assert.Throws(test); - } - // Assert UpdateObserver be not called by TearDown() + // Assert + Assert.Throws(test); + Assert.AreEqual(0, notify); } } } \ No newline at end of file Index: Core/Plugins/test/Core.Plugins.OxyPlot.Test/Legend/ChartLineDataTreeNodeInfoTest.cs =================================================================== diff -u -rc9396d0af18873fda14c7e486decbfca7d4e8b21 -rd494567cc0771ff224e920de98682a901dcfe01a --- Core/Plugins/test/Core.Plugins.OxyPlot.Test/Legend/ChartLineDataTreeNodeInfoTest.cs (.../ChartLineDataTreeNodeInfoTest.cs) (revision c9396d0af18873fda14c7e486decbfca7d4e8b21) +++ Core/Plugins/test/Core.Plugins.OxyPlot.Test/Legend/ChartLineDataTreeNodeInfoTest.cs (.../ChartLineDataTreeNodeInfoTest.cs) (revision d494567cc0771ff224e920de98682a901dcfe01a) @@ -17,14 +17,12 @@ [TestFixture] public class ChartLineDataTreeNodeInfoTest { - private MockRepository mocks; private ChartLegendView chartLegendView; private TreeNodeInfo info; [SetUp] public void SetUp() { - mocks = new MockRepository(); chartLegendView = new ChartLegendView(); TreeViewControl treeViewControl = TypeUtils.GetField(chartLegendView, "treeViewControl"); @@ -37,16 +35,11 @@ public void TearDown() { chartLegendView.Dispose(); - - mocks.VerifyAll(); } [Test] public void Initialized_Always_ExpectedPropertiesSet() { - // Setup - mocks.ReplayAll(); - // Assert Assert.AreEqual(typeof(ChartLineData), info.TagType); Assert.IsNull(info.ForeColor); @@ -66,10 +59,8 @@ public void Text_Always_ReturnsNameFromChartData() { // Setup - var lineData = mocks.StrictMock(Enumerable.Empty(), "test data"); + var lineData = new ChartLineData(Enumerable.Empty(), "test data"); - mocks.ReplayAll(); - // Call var text = info.Text(lineData); @@ -81,10 +72,8 @@ public void Image_Always_ReturnsSetImage() { // Setup - var lineData = mocks.StrictMock(Enumerable.Empty(), "test data"); + var lineData = new ChartLineData(Enumerable.Empty(), "test data"); - mocks.ReplayAll(); - // Call var image = info.Image(lineData); @@ -96,10 +85,8 @@ public void CanDrag_Always_ReturnsTrue() { // Setup - var lineData = mocks.StrictMock(Enumerable.Empty(), "test data"); + var lineData = new ChartLineData(Enumerable.Empty(), "test data"); - mocks.ReplayAll(); - // Call var canDrag = info.CanDrag(lineData, null); @@ -111,10 +98,8 @@ public void CanCheck_Always_ReturnsTrue() { // Setup - var lineData = mocks.StrictMock(Enumerable.Empty(), "test data"); + var lineData = new ChartLineData(Enumerable.Empty(), "test data"); - mocks.ReplayAll(); - // Call var canCheck = info.CanCheck(lineData); @@ -127,12 +112,10 @@ public void IsChecked_Always_ReturnsAccordingToVisibleStateOfLineData(bool isVisible) { // Setup - var lineData = mocks.StrictMock(Enumerable.Empty(), "test data"); + var lineData = new ChartLineData(Enumerable.Empty(), "test data"); lineData.IsVisible = isVisible; - mocks.ReplayAll(); - // Call var canCheck = info.IsChecked(lineData); @@ -145,10 +128,8 @@ public void LineDataNodeWithoutParent_SetsLineDataVisibility(bool initialVisibleState) { // Setup - var lineData = mocks.StrictMock(Enumerable.Empty(), "test data"); + var lineData = new ChartLineData(Enumerable.Empty(), "test data"); - mocks.ReplayAll(); - lineData.IsVisible = initialVisibleState; // Call @@ -163,20 +144,22 @@ public void OnNodeChecked_LineDataNodeWithObservableParent_SetsLineDataVisibilityAndNotifiesParentObservers(bool initialVisibleState) { // Setup - var lineData = mocks.StrictMock(Enumerable.Empty(), "test data"); - - var observable = mocks.StrictMock(); - observable.Expect(o => o.NotifyObservers()); + var notified = 0; + var observer = new Observer(() => notified++); + var chartData = new ChartDataCollection(new List(), "Collection"); + observer.Observable = chartData; + chartLegendView.Data = chartData; - mocks.ReplayAll(); + var lineData = new ChartLineData(Enumerable.Empty(), "test data"); lineData.IsVisible = initialVisibleState; // Call - info.OnNodeChecked(lineData, observable); + info.OnNodeChecked(lineData, null); // Assert Assert.AreEqual(!initialVisibleState, lineData.IsVisible); + Assert.AreEqual(1, notified); } } } \ No newline at end of file Index: Core/Plugins/test/Core.Plugins.OxyPlot.Test/Legend/ChartMultipleAreaDataTreeNodeInfoTest.cs =================================================================== diff -u --- Core/Plugins/test/Core.Plugins.OxyPlot.Test/Legend/ChartMultipleAreaDataTreeNodeInfoTest.cs (revision 0) +++ Core/Plugins/test/Core.Plugins.OxyPlot.Test/Legend/ChartMultipleAreaDataTreeNodeInfoTest.cs (revision d494567cc0771ff224e920de98682a901dcfe01a) @@ -0,0 +1,170 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using Core.Common.Base; +using Core.Common.Base.Geometry; +using Core.Common.Controls.TreeView; +using Core.Common.TestUtil; +using Core.Common.Utils.Reflection; +using Core.Components.Charting.Data; +using Core.Plugins.OxyPlot.Legend; +using Core.Plugins.OxyPlot.Properties; +using NUnit.Framework; +using Rhino.Mocks; + +namespace Core.Plugins.OxyPlot.Test.Legend +{ + [TestFixture] + public class ChartMultipleAreaDataTreeNodeInfoTest + { + private ChartLegendView chartLegendView; + private TreeNodeInfo info; + + [SetUp] + public void SetUp() + { + chartLegendView = new ChartLegendView(); + + TreeViewControl treeViewControl = TypeUtils.GetField(chartLegendView, "treeViewControl"); + Dictionary treeNodeInfoLookup = TypeUtils.GetField>(treeViewControl, "tagTypeTreeNodeInfoLookup"); + + info = treeNodeInfoLookup[typeof(ChartMultipleAreaData)]; + } + + [TearDown] + public void TearDown() + { + chartLegendView.Dispose(); + } + + [Test] + public void Initialized_Always_ExpectedPropertiesSet() + { + // Assert + Assert.AreEqual(typeof(ChartMultipleAreaData), info.TagType); + Assert.IsNull(info.ForeColor); + Assert.IsNull(info.ContextMenuStrip); + Assert.IsNull(info.EnsureVisibleOnCreate); + Assert.IsNull(info.ChildNodeObjects); + Assert.IsNull(info.CanRename); + Assert.IsNull(info.OnNodeRenamed); + Assert.IsNull(info.CanRemove); + Assert.IsNull(info.OnNodeRemoved); + Assert.IsNull(info.CanDrop); + Assert.IsNull(info.CanInsert); + Assert.IsNull(info.OnDrop); + } + + [Test] + public void Text_Always_ReturnsNameFromChartData() + { + // Setup + var areaData = CreateChartMultipleAreaData(); + + // Call + var text = info.Text(areaData); + + // Assert + Assert.AreEqual(areaData.Name, text); + } + + [Test] + public void Image_Always_ReturnsSetImage() + { + // Setup + var areaData = CreateChartMultipleAreaData(); + + // Call + var image = info.Image(areaData); + + // Assert + TestHelper.AssertImagesAreEqual(Resources.AreaIcon, image); + } + + [Test] + public void CanDrag_Always_ReturnsTrue() + { + // Setup + var areaData = CreateChartMultipleAreaData(); + + // Call + var canDrag = info.CanDrag(areaData, null); + + // Assert + Assert.IsTrue(canDrag); + } + + [Test] + public void CanCheck_Always_ReturnsTrue() + { + // Setup + var areaData = CreateChartMultipleAreaData(); + + // Call + var canCheck = info.CanCheck(areaData); + + // Assert + Assert.IsTrue(canCheck); + } + + [TestCase(true)] + [TestCase(false)] + public void IsChecked_Always_ReturnsAccordingToVisibleStateOfAreaData(bool isVisible) + { + // Setup + var areaData = CreateChartMultipleAreaData(); + areaData.IsVisible = isVisible; + + // Call + var canCheck = info.IsChecked(areaData); + + // Assert + Assert.AreEqual(isVisible, canCheck); + } + + [TestCase(true)] + [TestCase(false)] + public void OnNodeChecked_AreaDataNodeWithoutParent_SetsAreaDataVisibility(bool initialVisibleState) + { + // Setup + var areaData = CreateChartMultipleAreaData(); + + areaData.IsVisible = initialVisibleState; + + // Call + info.OnNodeChecked(areaData, null); + + // Assert + Assert.AreEqual(!initialVisibleState, areaData.IsVisible); + } + + [TestCase(true)] + [TestCase(false)] + public void OnNodeChecked_AreaDataNodeWithObservableParent_SetsAreaDataVisibilityAndNotifiesParentObservers(bool initialVisibleState) + { + // Setup + var notified = 0; + var observer = new Observer(() => notified++); + var chartData = new ChartDataCollection(new List(), "Collection"); + observer.Observable = chartData; + chartLegendView.Data = chartData; + + var areaData = CreateChartMultipleAreaData(); + + areaData.IsVisible = initialVisibleState; + + // Call + info.OnNodeChecked(areaData, null); + + // Assert + Assert.AreEqual(!initialVisibleState, areaData.IsVisible); + Assert.AreEqual(1, notified); + } + + private ChartMultipleAreaData CreateChartMultipleAreaData() + { + return new ChartMultipleAreaData(Enumerable.Empty>(), "test data"); + } + } +} \ No newline at end of file Index: Core/Plugins/test/Core.Plugins.OxyPlot.Test/Legend/ChartPointDataTreeNodeInfoTest.cs =================================================================== diff -u -rc9396d0af18873fda14c7e486decbfca7d4e8b21 -rd494567cc0771ff224e920de98682a901dcfe01a --- Core/Plugins/test/Core.Plugins.OxyPlot.Test/Legend/ChartPointDataTreeNodeInfoTest.cs (.../ChartPointDataTreeNodeInfoTest.cs) (revision c9396d0af18873fda14c7e486decbfca7d4e8b21) +++ Core/Plugins/test/Core.Plugins.OxyPlot.Test/Legend/ChartPointDataTreeNodeInfoTest.cs (.../ChartPointDataTreeNodeInfoTest.cs) (revision d494567cc0771ff224e920de98682a901dcfe01a) @@ -17,14 +17,12 @@ [TestFixture] public class ChartPointDataTreeNodeInfoTest { - private MockRepository mocks; private ChartLegendView chartLegendView; private TreeNodeInfo info; [SetUp] public void SetUp() { - mocks = new MockRepository(); chartLegendView = new ChartLegendView(); TreeViewControl treeViewControl = TypeUtils.GetField(chartLegendView, "treeViewControl"); @@ -37,16 +35,11 @@ public void TearDown() { chartLegendView.Dispose(); - - mocks.VerifyAll(); } [Test] public void Initialized_Always_ExpectedPropertiesSet() { - // Setup - mocks.ReplayAll(); - // Assert Assert.AreEqual(typeof(ChartPointData), info.TagType); Assert.IsNull(info.ForeColor); @@ -66,10 +59,8 @@ public void Text_Always_ReturnsNameFromChartData() { // Setup - var pointData = mocks.StrictMock(Enumerable.Empty(), "test data"); + var pointData = new ChartPointData(Enumerable.Empty(), "test data"); - mocks.ReplayAll(); - // Call var text = info.Text(pointData); @@ -81,10 +72,8 @@ public void Image_Always_ReturnsSetImage() { // Setup - var pointData = mocks.StrictMock(Enumerable.Empty(), "test data"); + var pointData = new ChartPointData(Enumerable.Empty(), "test data"); - mocks.ReplayAll(); - // Call var image = info.Image(pointData); @@ -96,10 +85,8 @@ public void CanDrag_Always_ReturnsTrue() { // Setup - var pointData = mocks.StrictMock(Enumerable.Empty(), "test data"); + var pointData = new ChartPointData(Enumerable.Empty(), "test data"); - mocks.ReplayAll(); - // Call var canDrag = info.CanDrag(pointData, null); @@ -111,10 +98,8 @@ public void CanCheck_Always_ReturnsTrue() { // Setup - var pointData = mocks.StrictMock(Enumerable.Empty(), "test data"); + var pointData = new ChartPointData(Enumerable.Empty(), "test data"); - mocks.ReplayAll(); - // Call var canCheck = info.CanCheck(pointData); @@ -127,12 +112,10 @@ public void IsChecked_Always_ReturnsAccordingToVisibleStateOfPointsData(bool isVisible) { // Setup - var pointData = mocks.StrictMock(Enumerable.Empty(), "test data"); + var pointData = new ChartPointData(Enumerable.Empty(), "test data"); pointData.IsVisible = isVisible; - mocks.ReplayAll(); - // Call var canCheck = info.IsChecked(pointData); @@ -145,10 +128,8 @@ public void PointDataNodeWithoutParent_SetsPointDataVisibility(bool initialVisibleState) { // Setup - var pointData = mocks.StrictMock(Enumerable.Empty(), "test data"); + var pointData = new ChartPointData(Enumerable.Empty(), "test data"); - mocks.ReplayAll(); - pointData.IsVisible = initialVisibleState; // Call @@ -163,20 +144,22 @@ public void OnNodeChecked_PointDataNodeWithObservableParent_SetsPointDataVisibilityAndNotifiesParentObservers(bool initialVisibleState) { // Setup - var pointData = mocks.StrictMock(Enumerable.Empty(), "test data"); + var notified = 0; + var observer = new Observer(() => notified++); + var chartData = new ChartDataCollection(new List(), "Collection"); + observer.Observable = chartData; + chartLegendView.Data = chartData; - var observable = mocks.StrictMock(); - observable.Expect(o => o.NotifyObservers()); + var pointData = new ChartPointData(Enumerable.Empty(), "test data"); - mocks.ReplayAll(); - pointData.IsVisible = initialVisibleState; // Call - info.OnNodeChecked(pointData, observable); + info.OnNodeChecked(pointData, null); // Assert Assert.AreEqual(!initialVisibleState, pointData.IsVisible); + Assert.AreEqual(1, notified); } } } \ No newline at end of file Index: Ringtoets/Common/src/Ringtoets.Common.Forms/Views/ChartDataFactory.cs =================================================================== diff -u -r411b50528bbd83c02ffdcae699895529b2b34bf7 -rd494567cc0771ff224e920de98682a901dcfe01a --- Ringtoets/Common/src/Ringtoets.Common.Forms/Views/ChartDataFactory.cs (.../ChartDataFactory.cs) (revision 411b50528bbd83c02ffdcae699895529b2b34bf7) +++ Ringtoets/Common/src/Ringtoets.Common.Forms/Views/ChartDataFactory.cs (.../ChartDataFactory.cs) (revision d494567cc0771ff224e920de98682a901dcfe01a) @@ -19,6 +19,7 @@ // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. +using System.Collections.Generic; using System.Linq; using Core.Common.Base.Geometry; using Core.Components.Charting.Data; @@ -49,5 +50,15 @@ { return new ChartPointData(Enumerable.Empty(), name); } + + /// + /// Create a instance with a name, but without data. + /// + /// The name of the . + /// An empty object. + public static ChartDataCollection CreateEmptyChartDataCollection(string name) + { + return new ChartDataCollection(new List(), name); + } } } \ No newline at end of file Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/Ringtoets.Piping.Forms.csproj =================================================================== diff -u -re0e813ab11c3b35020a785cebf275366cd2eaf9d -rd494567cc0771ff224e920de98682a901dcfe01a --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/Ringtoets.Piping.Forms.csproj (.../Ringtoets.Piping.Forms.csproj) (revision e0e813ab11c3b35020a785cebf275366cd2eaf9d) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/Ringtoets.Piping.Forms.csproj (.../Ringtoets.Piping.Forms.csproj) (revision d494567cc0771ff224e920de98682a901dcfe01a) @@ -39,9 +39,21 @@ MinimumRecommendedRules.ruleset + + ..\..\..\..\packages\GeoAPI.1.7.4\lib\net40-client\GeoAPI.dll + True + ..\..\..\..\packages\log4net.2.0.4\lib\net40-full\log4net.dll + + ..\..\..\..\packages\NetTopologySuite.1.14\lib\net40-client\NetTopologySuite.dll + True + + + ..\..\..\..\packages\NetTopologySuite.1.14\lib\net40-client\PowerCollections.dll + True + Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/Views/PipingChartDataFactory.cs =================================================================== diff -u -r323312312700f92d2d2d5b57423a36ed138c7cf9 -rd494567cc0771ff224e920de98682a901dcfe01a --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/Views/PipingChartDataFactory.cs (.../PipingChartDataFactory.cs) (revision 323312312700f92d2d2d5b57423a36ed138c7cf9) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/Views/PipingChartDataFactory.cs (.../PipingChartDataFactory.cs) (revision d494567cc0771ff224e920de98682a901dcfe01a) @@ -28,6 +28,8 @@ using Core.Common.Base.Geometry; using Core.Components.Charting.Data; using Core.Components.Charting.Styles; +using GeoAPI.Geometries; +using NetTopologySuite.Geometries; using Ringtoets.Common.Forms.Views; using Ringtoets.Piping.Forms.Properties; using Ringtoets.Piping.Primitives; @@ -217,30 +219,34 @@ /// /// Create an instance of with styling based on the color of of - /// . The is drawn for the full width of the - /// (as far as the is visible below the . + /// the as index . The is drawn + /// for the full width of the (as far as the is visible below + /// the ). /// - /// The to create for. + /// The index of the in the to create for. /// The which contains the . /// The that may intersect with the - /// and by doing that restricts the drawn height of the . + /// and by doing that restricts the drawn height of the . /// An which contains one or more (in the case of the /// splitting the layer in multiple parts) instances of . /// Thrown when either: /// - /// is null. + /// is null. /// is null. /// - public static ChartData CreatePipingSoilLayer(PipingSoilLayer soilLayer, PipingSoilProfile soilProfile, RingtoetsPipingSurfaceLine surfaceLine) + public static ChartData CreatePipingSoilLayer(int soilLayerIndex, PipingSoilProfile soilProfile, RingtoetsPipingSurfaceLine surfaceLine) { + if (soilProfile == null) + { + throw new ArgumentNullException("soilProfile"); + } if (surfaceLine == null) { throw new ArgumentNullException("surfaceLine"); } + var soilLayer = soilProfile.Layers.ElementAt(soilLayerIndex); + var name = string.Format("{0}_{1}", soilLayerIndex, soilLayer.MaterialName); - var index = 1; - var name = string.Format("{0}_{1}", index, soilLayer.MaterialName); - var surfaceLineLocalGeometry = surfaceLine.ProjectGeometryToLZ().ToArray(); var surfaceLineLowestPointY = surfaceLineLocalGeometry.Select(p => p.Y).Min(); var surfaceLineHeighestPointY = surfaceLineLocalGeometry.Select(p => p.Y).Max(); @@ -253,69 +259,69 @@ var startX = firstSurfaceLinePoint.X; var endX = lastSurfaceLinePoint.X; + var style = new ChartAreaStyle(soilLayer.Color, Color.Black, 1); + if (surfaceLineLowestPointY >= topLevel) { - return new ChartAreaData(new [] + return new ChartMultipleAreaData(new[] { - new Point2D(startX, topLevel), - new Point2D(endX, topLevel), - new Point2D(endX, bottomLevel), - new Point2D(startX, bottomLevel) - }, name); + new[] + { + new Point2D(startX, topLevel), + new Point2D(endX, topLevel), + new Point2D(endX, bottomLevel), + new Point2D(startX, bottomLevel) + } + }, name) + { + Style = style + }; } - if (surfaceLineLowestPointY > bottomLevel) + if (surfaceLineHeighestPointY <= bottomLevel) { - Point2D soilLayerTopPointA = new Point2D( - startX, - topLevel); - Point2D soilLayerTopPointB = new Point2D( - endX, - topLevel); + return new ChartMultipleAreaData(Enumerable.Empty>(), name); + } - var points = new HashSet(); - var addingFromSurfaceLine = firstSurfaceLinePoint.Y < topLevel; - if (addingFromSurfaceLine) - { - points.Add(firstSurfaceLinePoint); - } - else - { - points.Add(soilLayerTopPointA); - } - for (var i = 1; i < surfaceLineLocalGeometry.Length; i++) - { - Point2D surfaceLinePointA = surfaceLineLocalGeometry[i-1]; - Point2D surfaceLinePointB = surfaceLineLocalGeometry[i]; + List coordinates = surfaceLineLocalGeometry.Select(p => new Coordinate(p.X, p.Y)).ToList(); + double closingSurfaceLineToPolygonBottomLevel = Math.Min(surfaceLineLowestPointY,bottomLevel) - 1; + coordinates.Add(new Coordinate(endX, closingSurfaceLineToPolygonBottomLevel)); + coordinates.Add(new Coordinate(startX, closingSurfaceLineToPolygonBottomLevel)); + coordinates.Add(new Coordinate(firstSurfaceLinePoint.X, firstSurfaceLinePoint.Y)); - var intersection = Math2D.GetIntersectionBetweenSegments( - new Segment2D(soilLayerTopPointA, soilLayerTopPointB), - new Segment2D(surfaceLinePointA, surfaceLinePointB)); + var surfaceLinePolygon = new Polygon(new LinearRing(coordinates.ToArray())); + var soilLayerPolygon = new Polygon(new LinearRing(new[] + { + new Coordinate(startX, topLevel), + new Coordinate(endX, topLevel), + new Coordinate(endX, bottomLevel), + new Coordinate(startX, bottomLevel), + new Coordinate(startX, topLevel) + })); - if (intersection.IntersectionType == Intersection2DType.Intersects) - { - addingFromSurfaceLine = surfaceLinePointA.Y > surfaceLinePointB.Y; - points.Add(intersection.IntersectionPoints[0]); - } - if (addingFromSurfaceLine) - { - points.Add(surfaceLinePointB); - } - } - if (!addingFromSurfaceLine) + IGeometry intersection = surfaceLinePolygon.Intersection(soilLayerPolygon); + IEnumerable> areas = BuildSepearteAreasFromCoordinateList(intersection.Coordinates); + return new ChartMultipleAreaData(areas, name) + { + Style = style + }; + } + + private static IEnumerable> BuildSepearteAreasFromCoordinateList(Coordinate[] coordinates) + { + var areas = new List>(); + HashSet area = new HashSet(); + + foreach (var coordinate in coordinates) + { + var added = area.Add(new Point2D(coordinate.X, coordinate.Y)); + if (!added) { - points.Add(new Point2D(endX, topLevel)); + areas.Add(area); + area = new HashSet(); } - points.Add(new Point2D(endX, bottomLevel)); - points.Add(new Point2D(startX, bottomLevel)); - - return new ChartAreaData(points, name); } - if (surfaceLineHeighestPointY > bottomLevel) - { - - } - return new ChartAreaData(Enumerable.Empty(), name); - } + return areas; + } private static ChartData CreatePointWithZAtL(RoundedDouble pointL, RingtoetsPipingSurfaceLine surfaceLine, string name, Color color) { Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/Views/PipingInputView.cs =================================================================== diff -u -r514bb621efe079e984040e45ec67b06862d03da9 -rd494567cc0771ff224e920de98682a901dcfe01a --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/Views/PipingInputView.cs (.../PipingInputView.cs) (revision 514bb621efe079e984040e45ec67b06862d03da9) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/Views/PipingInputView.cs (.../PipingInputView.cs) (revision d494567cc0771ff224e920de98682a901dcfe01a) @@ -19,13 +19,15 @@ // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. +using System.Linq; using System.Windows.Forms; using Core.Common.Base; using Core.Components.Charting.Data; using Core.Components.Charting.Forms; using Ringtoets.Common.Forms.Views; using Ringtoets.Piping.Data; using Ringtoets.Piping.Forms.Properties; +using Ringtoets.Piping.Primitives; using PipingDataResources = Ringtoets.Piping.Data.Properties.Resources; namespace Ringtoets.Piping.Forms.Views @@ -46,6 +48,7 @@ private ChartData ditchDikeSidePointData; private ChartData dikeToeAtRiverPointData; private ChartData dikeToeAtPolderPointData; + private ChartData soilProfile; private readonly Observer calculationObserver; private readonly Observer calculationInputObserver; @@ -130,6 +133,7 @@ dikeToeAtRiverPointData = AddOrUpdateChartData(dikeToeAtRiverPointData, GetDikeToeAtRiverData()); exitPointData = AddOrUpdateChartData(exitPointData, GetExitPointChartData()); entryPointData = AddOrUpdateChartData(entryPointData, GetEntryPointChartData()); + soilProfile = AddOrUpdateChartData(soilProfile, GetStochasticSoilProfileData()); // Top most layer } @@ -222,6 +226,21 @@ return data == null || data.InputParameters.SurfaceLine == null; } + private ChartData GetStochasticSoilProfileData() + { + if (data == null || data.StochasticSoilProfile == null || data.StochasticSoilProfile.SoilProfile == null) + { + return ChartDataFactory.CreateEmptyChartDataCollection("Profiel "); + } + var pipingSoilProfile = data.StochasticSoilProfile.SoilProfile; + + return new ChartDataCollection(pipingSoilProfile.Layers.Select((layer, layerIndex) => + PipingChartDataFactory.CreatePipingSoilLayer( + layerIndex, + pipingSoilProfile, + data.SurfaceLine)).ToList(), pipingSoilProfile.Name); + } + private ChartData AddOrUpdateChartData(ChartData oldChartData, ChartData newChartData) { if (oldChartData != null) Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/packages.config =================================================================== diff -u -rbbfd376aee76613b471f70d2b1214d7e7b08fb1f -rd494567cc0771ff224e920de98682a901dcfe01a --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/packages.config (.../packages.config) (revision bbfd376aee76613b471f70d2b1214d7e7b08fb1f) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/packages.config (.../packages.config) (revision d494567cc0771ff224e920de98682a901dcfe01a) @@ -1,4 +1,6 @@  + + \ No newline at end of file Index: Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/Views/PipingChartDataFactoryTest.cs =================================================================== diff -u -r323312312700f92d2d2d5b57423a36ed138c7cf9 -rd494567cc0771ff224e920de98682a901dcfe01a --- Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/Views/PipingChartDataFactoryTest.cs (.../PipingChartDataFactoryTest.cs) (revision 323312312700f92d2d2d5b57423a36ed138c7cf9) +++ Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/Views/PipingChartDataFactoryTest.cs (.../PipingChartDataFactoryTest.cs) (revision d494567cc0771ff224e920de98682a901dcfe01a) @@ -514,17 +514,18 @@ }, SoilProfileType.SoilProfile1D, 0); // Call - ChartData data = PipingChartDataFactory.CreatePipingSoilLayer(profile.Layers.First(), profile, surfaceLine); + ChartData data = PipingChartDataFactory.CreatePipingSoilLayer(0, profile, surfaceLine); // Assert - var soilLayerChartData = (ChartAreaData) data; + var soilLayerChartData = (ChartMultipleAreaData) data; + Assert.AreEqual(1, soilLayerChartData.Areas.Count()); CollectionAssert.AreEqual(new [] { new Point2D(0, 3.2), new Point2D(2, 3.2), new Point2D(2, 2), new Point2D(0, 2) - }, soilLayerChartData.Points); + }, soilLayerChartData.Areas.ElementAt(0)); } [Test] @@ -542,11 +543,11 @@ }, SoilProfileType.SoilProfile1D, 0); // Call - ChartData data = PipingChartDataFactory.CreatePipingSoilLayer(profile.Layers.First(), profile, surfaceLine); + ChartData data = PipingChartDataFactory.CreatePipingSoilLayer(0, profile, surfaceLine); // Assert - var soilLayerChartData = (ChartAreaData)data; - CollectionAssert.IsEmpty(soilLayerChartData.Points); + var soilLayerChartData = (ChartMultipleAreaData)data; + CollectionAssert.IsEmpty(soilLayerChartData.Areas); } [Test] @@ -567,20 +568,21 @@ }, SoilProfileType.SoilProfile1D, 0); // Call - ChartData data = PipingChartDataFactory.CreatePipingSoilLayer(profile.Layers.First(), profile, surfaceLine); + ChartData data = PipingChartDataFactory.CreatePipingSoilLayer(0, profile, surfaceLine); // Assert - var soilLayerChartData = (ChartAreaData)data; + var soilLayerChartData = (ChartMultipleAreaData)data; + Assert.AreEqual(1, soilLayerChartData.Areas.Count()); CollectionAssert.AreEqual(new[] { - new Point2D(0, top), new Point2D(0.5, top), new Point2D(1, 2.0), new Point2D(1.5, top), new Point2D(2, top), new Point2D(2, bottom), - new Point2D(0, bottom) - }, soilLayerChartData.Points); + new Point2D(0, bottom), + new Point2D(0, top), + }, soilLayerChartData.Areas.ElementAt(0)); } [Test] @@ -603,20 +605,21 @@ }, SoilProfileType.SoilProfile1D, 0); // Call - ChartData data = PipingChartDataFactory.CreatePipingSoilLayer(profile.Layers.First(), profile, surfaceLine); + ChartData data = PipingChartDataFactory.CreatePipingSoilLayer(0, profile, surfaceLine); // Assert - var soilLayerChartData = (ChartAreaData)data; + var soilLayerChartData = (ChartMultipleAreaData)data; + Assert.AreEqual(1, soilLayerChartData.Areas.Count()); CollectionAssert.AreEqual(new[] { - new Point2D(0, top), new Point2D(0.5, top), new Point2D(1, 2.0), new Point2D(1.5, top), new Point2D(2, top), new Point2D(2, bottom), - new Point2D(0, bottom) - }, soilLayerChartData.Points); + new Point2D(0, bottom), + new Point2D(0, top), + }, soilLayerChartData.Areas.ElementAt(0)); } [Test] @@ -637,19 +640,20 @@ }, SoilProfileType.SoilProfile1D, 0); // Call - ChartData data = PipingChartDataFactory.CreatePipingSoilLayer(profile.Layers.First(), profile, surfaceLine); + ChartData data = PipingChartDataFactory.CreatePipingSoilLayer(0, profile, surfaceLine); // Assert - var soilLayerChartData = (ChartAreaData)data; + var soilLayerChartData = (ChartMultipleAreaData)data; + Assert.AreEqual(1, soilLayerChartData.Areas.Count()); CollectionAssert.AreEqual(new[] { new Point2D(0, 2.0), new Point2D(1, 2.0), new Point2D(1.5, top), new Point2D(2, top), new Point2D(2, bottom), - new Point2D(0, bottom) - }, soilLayerChartData.Points); + new Point2D(0, bottom), + }, soilLayerChartData.Areas.ElementAt(0)); } [Test] @@ -670,21 +674,61 @@ }, SoilProfileType.SoilProfile1D, 0); // Call - ChartData data = PipingChartDataFactory.CreatePipingSoilLayer(profile.Layers.First(), profile, surfaceLine); + ChartData data = PipingChartDataFactory.CreatePipingSoilLayer(0, profile, surfaceLine); // Assert - var soilLayerChartData = (ChartAreaData)data; + var soilLayerChartData = (ChartMultipleAreaData)data; + Assert.AreEqual(1, soilLayerChartData.Areas.Count()); CollectionAssert.AreEqual(new[] { - new Point2D(0, top), new Point2D(0.5, top), new Point2D(1, 2.0), new Point2D(2, 2.0), new Point2D(2, bottom), - new Point2D(0, bottom) - }, soilLayerChartData.Points); + new Point2D(0, bottom), + new Point2D(0, top), + }, soilLayerChartData.Areas.ElementAt(0)); } + [Test] + public void CreatePipingSoilLayer_SurfaceLineZigZagsThroughSoilLayer_SoilLayerSplitInMultipleSeries() + { + var surfaceLine = new RingtoetsPipingSurfaceLine(); + surfaceLine.SetGeometry(new[] + { + new Point3D(0, 0, 4.0), + new Point3D(4, 0, 0.0), + new Point3D(8, 0, 4.0) + }); + var bottom = 1; + var top = 3; + var profile = new PipingSoilProfile("name", bottom, new[] + { + new PipingSoilLayer(top) + }, SoilProfileType.SoilProfile1D, 0); + + // Call + ChartData data = PipingChartDataFactory.CreatePipingSoilLayer(0, profile, surfaceLine); + + // Assert + var soilLayerChartData = (ChartMultipleAreaData)data; + Assert.AreEqual(2, soilLayerChartData.Areas.Count()); + CollectionAssert.AreEqual(new[] + { + new Point2D(1, top), + new Point2D(3, bottom), + new Point2D(0, bottom), + new Point2D(0, top) + }, soilLayerChartData.Areas.ElementAt(0)); + CollectionAssert.AreEqual(new[] + { + new Point2D(5, bottom), + new Point2D(7, top), + new Point2D(8, top), + new Point2D(8, bottom) + }, soilLayerChartData.Areas.ElementAt(1)); + } + private static RingtoetsPipingSurfaceLine GetSurfaceLineWithGeometry() { var points = new[] Index: Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/Views/PipingInputViewTest.cs =================================================================== diff -u -rf9aefa56762ac1dd731bc4bfed955d651781d598 -rd494567cc0771ff224e920de98682a901dcfe01a --- Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/Views/PipingInputViewTest.cs (.../PipingInputViewTest.cs) (revision f9aefa56762ac1dd731bc4bfed955d651781d598) +++ Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/Views/PipingInputViewTest.cs (.../PipingInputViewTest.cs) (revision d494567cc0771ff224e920de98682a901dcfe01a) @@ -123,7 +123,7 @@ view.Data = calculation; // Precondition - Assert.AreEqual(9, view.Chart.Data.List.Count); + Assert.AreEqual(10, view.Chart.Data.List.Count); // Call view.Data = null; @@ -166,7 +166,7 @@ Assert.IsNotNull(chartData); Assert.AreEqual(Resources.PipingInputContext_NodeDisplayName, chartData.Name); - Assert.AreEqual(9, chartData.List.Count); + Assert.AreEqual(10, chartData.List.Count); AssertSurfaceLineChartData(surfaceLine, chartData.List[surfaceLineIndex]); AssertEntryPointLPointchartData(calculation.InputParameters, surfaceLine, chartData.List[entryPointIndex]); @@ -192,7 +192,7 @@ Assert.IsNotNull(chartData); Assert.AreEqual(Resources.PipingInputContext_NodeDisplayName, chartData.Name); - Assert.AreEqual(9, chartData.List.Count); + Assert.AreEqual(10, chartData.List.Count); var lineData = (ChartLineData) chartData.List[surfaceLineIndex]; var entryPointData = (ChartPointData) chartData.List[entryPointIndex]; var exitPointData = (ChartPointData) chartData.List[exitPointIndex];