// Copyright (C) Stichting Deltares 2017. 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 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 General Public License for more details. // // You should have received a copy of the GNU 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 NUnit.Framework; using Ringtoets.Common.IO.Exceptions; using Ringtoets.Common.IO.SurfaceLines; using Ringtoets.MacroStabilityInwards.IO.SurfaceLines; using Ringtoets.MacroStabilityInwards.Primitives; using RingtoetsCommonDataResources = Ringtoets.Common.Data.Properties.Resources; namespace Ringtoets.MacroStabilityInwards.IO.Test.SurfaceLines { [TestFixture] public class MacroStabilityInwardsSurfaceLineExtensionsTest { private static IEnumerable DifferentCharacteristicPointConfigurationsWithMissingMandatoryPoint { get { var name = "Missing SurfaceLevelOutside"; CharacteristicPoints set = CreateCompleteCharacteristicPointSet(name); set.SurfaceLevelOutside = null; yield return new TestCaseData(set, RingtoetsCommonDataResources.CharacteristicPoint_SurfaceLevelOutside).SetName(name); name = "Missing DikeToeAtRiver"; set = CreateCompleteCharacteristicPointSet(name); set.DikeToeAtRiver = null; yield return new TestCaseData(set, RingtoetsCommonDataResources.CharacteristicPoint_DikeToeAtRiver).SetName(name); name = "Missing DikeTopAtPolder"; set = CreateCompleteCharacteristicPointSet(name); set.DikeTopAtPolder = null; yield return new TestCaseData(set, RingtoetsCommonDataResources.CharacteristicPoint_DikeTopAtPolder).SetName(name); name = "Missing DikeTopAtRiver"; set = CreateCompleteCharacteristicPointSet(name); set.DikeTopAtRiver = null; yield return new TestCaseData(set, RingtoetsCommonDataResources.CharacteristicPoint_DikeTopAtRiver).SetName(name); name = "Missing DikeToeAtPolder"; set = CreateCompleteCharacteristicPointSet(name); set.DikeToeAtPolder = null; yield return new TestCaseData(set, RingtoetsCommonDataResources.CharacteristicPoint_DikeToeAtPolder).SetName(name); name = "Missing SurfaceLevelInside"; set = CreateCompleteCharacteristicPointSet(name); set.SurfaceLevelInside = null; yield return new TestCaseData(set, RingtoetsCommonDataResources.CharacteristicPoint_SurfaceLevelInside).SetName(name); } } private static IEnumerable DifferentCharacteristicPointConfigurationsWithMandatoryPointNotOnSurfaceLine { get { var name = "Moved SurfaceLevelOutside"; CharacteristicPoints set = CreateCompleteCharacteristicPointSet(name); yield return new TestCaseData( set, new Action((points, p) => points.SurfaceLevelOutside = p), RingtoetsCommonDataResources.CharacteristicPoint_SurfaceLevelOutside).SetName(name); name = "Moved DikeToeAtRiver"; set = CreateCompleteCharacteristicPointSet(name); yield return new TestCaseData( set, new Action((points, p) => points.DikeToeAtRiver = p), RingtoetsCommonDataResources.CharacteristicPoint_DikeToeAtRiver).SetName(name); name = "Moved DikeTopAtPolder"; set = CreateCompleteCharacteristicPointSet(name); yield return new TestCaseData( set, new Action((points, p) => points.DikeTopAtPolder = p), RingtoetsCommonDataResources.CharacteristicPoint_DikeTopAtPolder).SetName(name); name = "Moved DikeTopAtRiver"; set = CreateCompleteCharacteristicPointSet(name); yield return new TestCaseData( set, new Action((points, p) => points.DikeTopAtRiver = p), RingtoetsCommonDataResources.CharacteristicPoint_DikeTopAtRiver).SetName(name); name = "Moved DikeToeAtPolder"; set = CreateCompleteCharacteristicPointSet(name); yield return new TestCaseData( set, new Action((points, p) => points.DikeToeAtPolder = p), RingtoetsCommonDataResources.CharacteristicPoint_DikeToeAtPolder).SetName(name); name = "Moved SurfaceLevelInside"; set = CreateCompleteCharacteristicPointSet(name); yield return new TestCaseData( set, new Action((points, p) => points.SurfaceLevelInside = p), RingtoetsCommonDataResources.CharacteristicPoint_SurfaceLevelInside).SetName(name); } } private static IEnumerable DifferentValidCharacteristicPointConfigurations { get { var name = "All present"; CharacteristicPoints set = CreateCompleteCharacteristicPointSet(name); yield return new TestCaseData(set).SetName(name); name = "Missing ShoulderBaseInside"; set = CreateCompleteCharacteristicPointSet(name); set.ShoulderBaseInside = null; yield return new TestCaseData(set).SetName(name); name = "Missing ShoulderTopInside"; set = CreateCompleteCharacteristicPointSet(name); set.ShoulderTopInside = null; yield return new TestCaseData(set).SetName(name); name = "Missing TrafficLoadOutside"; set = CreateCompleteCharacteristicPointSet(name); set.TrafficLoadOutside = null; yield return new TestCaseData(set).SetName(name); name = "Missing TrafficLoadInside"; set = CreateCompleteCharacteristicPointSet(name); set.TrafficLoadInside = null; yield return new TestCaseData(set).SetName(name); name = "Missing DitchDikeSide"; set = CreateCompleteCharacteristicPointSet(name); set.DitchDikeSide = null; yield return new TestCaseData(set).SetName(name); name = "Missing BottomDitchDikeSide"; set = CreateCompleteCharacteristicPointSet(name); set.BottomDitchDikeSide = null; yield return new TestCaseData(set).SetName(name); name = "Missing BottomDitchPolderSide"; set = CreateCompleteCharacteristicPointSet(name); set.BottomDitchPolderSide = null; yield return new TestCaseData(set).SetName(name); name = "Missing DitchPolderSide"; set = CreateCompleteCharacteristicPointSet(name); set.DitchPolderSide = null; yield return new TestCaseData(set).SetName(name); } } [Test] public void SetCharacteristicPoints_SurfaceLineNull_ThrowsArgumentNullException() { // Call TestDelegate test = () => ((MacroStabilityInwardsSurfaceLine) null).SetCharacteristicPoints(new CharacteristicPoints("Empty")); // Assert var exception = Assert.Throws(test); Assert.AreEqual("surfaceLine", exception.ParamName); } [Test] public void SetCharacteristicPoints_CharacteristicPointsNull_ThrowsImportedDataTransformException() { // Setup const string name = "Some line name"; var surfaceLine = new MacroStabilityInwardsSurfaceLine(name); surfaceLine.SetGeometry(new[] { new Point3D(3, 2, 5), new Point3D(3.4, 3, 8), new Point3D(4.4, 6, 8), new Point3D(5.1, 6, 6.5), new Point3D(8.5, 7.2, 4.2), new Point3D(9.6, 7.5, 3.9) }); // Call TestDelegate test = () => surfaceLine.SetCharacteristicPoints(null); // Assert var exception = Assert.Throws(test); Assert.AreEqual($"Karakteristieke punten definitie voor profielschematisatie '{name}' is verplicht.", exception.Message); } [Test] [TestCaseSource(nameof(DifferentValidCharacteristicPointConfigurations))] public void SetCharacteristicPoints_ValidSituations_PointsAreSet(CharacteristicPoints points) { // Setup var surfaceLine = new MacroStabilityInwardsSurfaceLine(string.Empty); surfaceLine.SetGeometry(CharacteristicPointsToGeometry(points)); // Call surfaceLine.SetCharacteristicPoints(points); // Assert Assert.AreEqual(points.DikeTopAtPolder, surfaceLine.DikeTopAtPolder); Assert.AreEqual(points.DikeTopAtRiver, surfaceLine.DikeTopAtRiver); Assert.AreEqual(points.ShoulderBaseInside, surfaceLine.ShoulderBaseInside); Assert.AreEqual(points.ShoulderTopInside, surfaceLine.ShoulderTopInside); Assert.AreEqual(points.TrafficLoadOutside, surfaceLine.TrafficLoadOutside); Assert.AreEqual(points.TrafficLoadInside, surfaceLine.TrafficLoadInside); Assert.AreEqual(points.SurfaceLevelOutside, surfaceLine.SurfaceLevelOutside); Assert.AreEqual(points.SurfaceLevelInside, surfaceLine.SurfaceLevelInside); Assert.AreEqual(points.DikeToeAtRiver, surfaceLine.DikeToeAtRiver); Assert.AreEqual(points.DikeToeAtPolder, surfaceLine.DikeToeAtPolder); Assert.AreEqual(points.DitchDikeSide, surfaceLine.DitchDikeSide); Assert.AreEqual(points.BottomDitchDikeSide, surfaceLine.BottomDitchDikeSide); Assert.AreEqual(points.BottomDitchPolderSide, surfaceLine.BottomDitchPolderSide); Assert.AreEqual(points.DitchPolderSide, surfaceLine.DitchPolderSide); } [Test] [TestCaseSource(nameof(DifferentCharacteristicPointConfigurationsWithMissingMandatoryPoint))] public void SetCharacteristicPoints_UndefinedMandatoryPoint_ThrowsImportedDataTransformException(CharacteristicPoints points, string pointDescription) { // Setup var surfaceLine = new MacroStabilityInwardsSurfaceLine(points.Name); surfaceLine.SetGeometry(CharacteristicPointsToGeometry(points)); // Call TestDelegate test = () => surfaceLine.SetCharacteristicPoints(points); // Assert var exception = Assert.Throws(test); string message = $"Profielschematisatie '{points.Name}' kan niet gebruikt worden. Karakteristiek punt \'{pointDescription}\' is niet gedefiniëerd. Dit karakteristieke punt is verplicht."; Assert.AreEqual(message, exception.Message); } [Test] [TestCaseSource(nameof(DifferentCharacteristicPointConfigurationsWithMandatoryPointNotOnSurfaceLine))] public void SetCharacteristicPoints_MandatoryPointNotOnSurfaceLine_ThrowsImportedDataTransformException( CharacteristicPoints points, Action setPoint, string pointDescription) { // Setup var surfaceLine = new MacroStabilityInwardsSurfaceLine(points.Name); surfaceLine.SetGeometry(CharacteristicPointsToGeometry(points)); var changedPoint = new Point3D(-1, -1, -1); setPoint(points, changedPoint); // Call TestDelegate test = () => surfaceLine.SetCharacteristicPoints(points); // Assert var exception = Assert.Throws(test); string message = $"Profielschematisatie '{points.Name}' kan niet gebruikt worden. " + $"De geometrie bevat geen punt op locatie {changedPoint} om als \'{pointDescription}\' in te stellen. " + "Dit karakteristieke punt is verplicht."; ; Assert.AreEqual(message, exception.Message); } private static IEnumerable CharacteristicPointsToGeometry(CharacteristicPoints points) { return new[] { points.DikeTopAtPolder, points.DikeTopAtRiver, points.ShoulderBaseInside, points.ShoulderTopInside, points.TrafficLoadOutside, points.TrafficLoadInside, points.SurfaceLevelOutside, points.SurfaceLevelInside, points.DikeToeAtRiver, points.DikeToeAtPolder, points.DitchDikeSide, points.BottomDitchDikeSide, points.BottomDitchPolderSide, points.DitchPolderSide }.Where(p => p != null); } private static CharacteristicPoints CreateCompleteCharacteristicPointSet(string name) { var surfaceLevelOutside = new Point3D(2, 2, 5); var dikeToeAtRiver = new Point3D(2.1, 2, 5); var trafficLoadOutside = new Point3D(2.25, 2, 5); var trafficLoadInside = new Point3D(2.45, 2, 5); var dikeTopAtPolder = new Point3D(2.7, 2, 5); var dikeTopAtRiver = new Point3D(2.6, 2, 5); var shoulderBaseInside = new Point3D(3.2, 2, 5); var shoulderTopInside = new Point3D(3.5, 2, 5); var dikeToeAtPolder = new Point3D(4.4, 3, 8); var ditchDikeSide = new Point3D(6.3, 6, 8); var bottomDitchDikeSide = new Point3D(5.1, 6, 6.5); var bottomDitchPolderSide = new Point3D(8.5, 7.2, 4.2); var ditchPolderSide = new Point3D(9.6, 7.5, 3.9); var surfaceLevelInside = new Point3D(10.1, 2, 5); return new CharacteristicPoints(name) { DikeTopAtPolder = dikeTopAtPolder, ShoulderBaseInside = shoulderBaseInside, ShoulderTopInside = shoulderTopInside, TrafficLoadOutside = trafficLoadOutside, TrafficLoadInside = trafficLoadInside, SurfaceLevelOutside = surfaceLevelOutside, SurfaceLevelInside = surfaceLevelInside, DikeToeAtRiver = dikeToeAtRiver, DikeToeAtPolder = dikeToeAtPolder, DikeTopAtRiver = dikeTopAtRiver, DitchDikeSide = ditchDikeSide, BottomDitchDikeSide = bottomDitchDikeSide, BottomDitchPolderSide = bottomDitchPolderSide, DitchPolderSide = ditchPolderSide }; } } }