// Copyright (C) Stichting Deltares 2018. All rights reserved. // // This file is part of the Dam Engine. // // The Dam Engine is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero 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 Affero General Public License for more details. // // You should have received a copy of the GNU Affero 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 Deltares.DamEngine.Calculators.PlLinesCreator; using Deltares.DamEngine.Data.General; using Deltares.DamEngine.Data.General.PlLines; using Deltares.DamEngine.Data.General.Sensors; using Deltares.DamEngine.Data.Geometry; using Deltares.DamEngine.Data.Geotechnics; using NUnit.Framework; namespace Deltares.DamEngine.Calculators.Tests.Sensors { [TestFixture] public class SensorPlLineCreatorTest { #region Setup [TestFixtureSetUp] public void FixtureSetup() { } [TestFixtureTearDown] public void FixtureTearDown() { } [SetUp] public void TestSetup() { } [TearDown] public void TestTearDown() { } #endregion [Test] [ExpectedException(typeof(PlLinesCreatorException))] public void CreatePlLine_Pl1NoSensorData_Throws() { // setup var location = new Location("test"); SensorLocation sensorLocation = new SensorFactory().CreateSensorLocation(location); var creator = SensorPlLineCreator.CreateInstance(sensorLocation, new Dictionary()); // call creator.CreatePlLine(PlLineType.Pl1); } [Test] // Pl2 is not yet supported [ExpectedException(typeof(NotSupportedException))] public void CreatePlLine_Pl2_ThrowsNotSupported() { // setup var location = new Location("test"); SensorLocation sensorLocation = new SensorFactory().CreateSensorLocation(location); var creator = SensorPlLineCreator.CreateInstance(sensorLocation, new Dictionary()); // call creator.CreatePlLine(PlLineType.Pl2); } [Test] [ExpectedException(typeof(PlLinesCreatorException))] public void CreatePlLine_Pl3NoSensorData_Throws() { // setup var location = new Location("test"); SensorLocation sensorLocation = new SensorFactory().CreateSensorLocation(location); var creator = SensorPlLineCreator.CreateInstance(sensorLocation, new Dictionary()); // call creator.CreatePlLine(PlLineType.Pl3); } [Test] [ExpectedException(typeof(PlLinesCreatorException))] public void CreatePlLine_Pl4NoSensorData_Throws() { // setup var location = new Location("test"); SensorLocation sensorLocation = new SensorFactory().CreateSensorLocation(location); var creator = SensorPlLineCreator.CreateInstance(sensorLocation, new Dictionary()); // call creator.CreatePlLine(PlLineType.Pl4); } [Test] public void CreatePlLine_AllPlLinesDummyTest_ResultsAreAsExpected() { // setup var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var location = new Location("test") { RiverLevel = 1, PolderLevel = 1 }; location.AddNewSensorData(); location.SensorData.Pl1PlLineOffsetBelowDikeToeAtPolder = DataSourceTypeSensors.LocationData; location.SensorData.Pl1PlLineOffsetBelowDikeTopAtPolder = DataSourceTypeSensors.LocationData; location.SensorData.Pl1PlLineOffsetBelowDikeTopAtRiver = DataSourceTypeSensors.LocationData; location.SensorData.Pl1PlLineOffsetBelowShoulderBaseInside = DataSourceTypeSensors.LocationData; // create dike with ditch surfaceLine.EnsurePointOfType(0.0, 0.0, CharacteristicPointType.SurfaceLevelOutside); surfaceLine.EnsurePointOfType(50.0, 0.0, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(85.0, 8.0, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(95.0, 8.0, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(108.0, 4.0, CharacteristicPointType.ShoulderBaseInside); surfaceLine.EnsurePointOfType(116.0, 3.0, CharacteristicPointType.ShoulderTopInside); surfaceLine.EnsurePointOfType(121.0, 0.0, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(190.0, 0.0, CharacteristicPointType.SurfaceLevelInside); location.SurfaceLine = surfaceLine; var sensor1 = new Sensor { ID = 1, Name = "Test1", Depth = 2, RelativeLocation = 50, PlLineMappings = new[] { PlLineType.Pl1 }, Type = SensorType.WaterLevel }; var sensor2 = new Sensor { ID = 2, Name = "Test2", Depth = 2, RelativeLocation = 90, PlLineMappings = new[] { PlLineType.Pl1 } }; var sensor3 = new Sensor { ID = 3, Name = "Test3", Depth = 2, RelativeLocation = 104, PlLineMappings = new[] { PlLineType.Pl1 } }; var sensor4 = new Sensor { ID = 4, Name = "Test4", Depth = 2, RelativeLocation = 123.3, PlLineMappings = new[] { PlLineType.Pl1 } }; var sensor5 = new Sensor { ID = 5, Name = "Test5", Depth = 2, RelativeLocation = 90, PlLineMappings = new[] { PlLineType.Pl3, PlLineType.Pl4 } }; var sensor6 = new Sensor { ID = 6, Name = "Test6", Depth = 2, RelativeLocation = 123.3, PlLineMappings = new[] { PlLineType.Pl3, PlLineType.Pl4 } }; var sensor7 = new Sensor { ID = 7, Name = "Test7", Depth = 2, RelativeLocation = 180, PlLineMappings = new[] { PlLineType.Pl3, PlLineType.Pl4 } }; var repository = new SensorRepository(location); repository.Add(sensor1); repository.Add(sensor2); repository.Add(sensor3); repository.Add(sensor4); repository.Add(sensor5); repository.Add(sensor6); repository.Add(sensor7); IDictionary sensorValues = new Dictionary() { {sensor1, 1}, {sensor2, 1}, {sensor3, 1}, {sensor4, 1}, {sensor5, 1}, {sensor6, 1}, {sensor7, 1}, }; var sensorLocation = location.SensorData; var creator = new SensorPlLine1Creator(sensorLocation, sensorValues); // call PlLine actual = creator.CreatePlLine(); // asserts // Number of expected points in line var expectedCount = repository.Sensors.Count(s => s.PlLineMappings.Contains(PlLineType.Pl1)) + 2 + 4; // interection + end + 4 configured characteristic points Assert.AreEqual(expectedCount, actual.Points.Count); // P1 var p1 = actual.Points.First(); Assert.IsNotNull(p1); var expectedZValueP1 = sensorValues[sensor1]; Assert.AreEqual(expectedZValueP1, p1.Z); // P2 var p2 = actual.Points.FirstOrDefault(p => p.Name == sensor2.Name); Assert.IsNotNull(p2); Assert.AreEqual(sensor2.RelativeLocation, p2.X); var expectedZValueP2 = sensorValues[sensor2]; Assert.AreEqual(expectedZValueP2, p2.Z); // P3 var p3 = actual.Points.FirstOrDefault(p => p.Name == sensor3.Name); Assert.IsNotNull(p3); Assert.AreEqual(sensor3.RelativeLocation, p3.X); var expectedZValueP3 = sensorValues[sensor3]; Assert.AreEqual(expectedZValueP3, p3.Z); // P4 var p4 = actual.Points.FirstOrDefault(p => p.Name == sensor4.Name); Assert.IsNotNull(p4); Assert.AreEqual(sensor4.RelativeLocation, p4.X); var expectedZValueP4 = sensorValues[sensor4]; Assert.AreEqual(expectedZValueP4, p4.Z); } [Test] public void CreatePlLine_Pl1DikeToeAtPolderToSurfaceLevelInside_ZValueShouldBePolderLevel() { // setup const double polderLevel = -0.5; const double expectedEndPoint = -0.1; // Is not polderlevel, but level under toe of dike inward var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var location = new Location("test") { RiverLevel = 5, PolderLevel = polderLevel }; location.AddNewSensorData(); location.SensorData.Pl1PlLineOffsetBelowDikeToeAtPolder = DataSourceTypeSensors.LocationData; location.SensorData.Pl1PlLineOffsetBelowDikeTopAtPolder = DataSourceTypeSensors.LocationData; location.SensorData.Pl1PlLineOffsetBelowDikeTopAtRiver = DataSourceTypeSensors.LocationData; location.SensorData.Pl1PlLineOffsetBelowShoulderBaseInside = DataSourceTypeSensors.LocationData; // create dike with ditch surfaceLine.EnsurePointOfType(0.0, 0.0, CharacteristicPointType.SurfaceLevelOutside); surfaceLine.EnsurePointOfType(50.0, 0.0, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(85.0, 8.0, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(95.0, 8.0, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(108.0, 4.0, CharacteristicPointType.ShoulderBaseInside); surfaceLine.EnsurePointOfType(116.0, 3.0, CharacteristicPointType.ShoulderTopInside); surfaceLine.EnsurePointOfType(121.0, 0.0, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(190.0, 0.0, CharacteristicPointType.SurfaceLevelInside); location.SurfaceLine = surfaceLine; var sensor1 = new Sensor { ID = 1, Name = "Test1", Depth = 2, RelativeLocation = 50, PlLineMappings = new[] { PlLineType.Pl1 }, Type = SensorType.WaterLevel }; var sensor2 = new Sensor { ID = 2, Name = "Test2", Depth = 2, RelativeLocation = 90, PlLineMappings = new[] { PlLineType.Pl1 } }; var sensor3 = new Sensor { ID = 3, Name = "Test3", Depth = 2, RelativeLocation = 104, PlLineMappings = new[] { PlLineType.Pl1 } }; var sensor4 = new Sensor { ID = 4, Name = "Test4", Depth = 2, RelativeLocation = 123.3, PlLineMappings = new[] { PlLineType.Pl1 } }; var repository = new SensorRepository(location); repository.Add(sensor1); repository.Add(sensor2); repository.Add(sensor3); repository.Add(sensor4); IDictionary sensorValues = new Dictionary() { {sensor1, 1}, {sensor2, 1}, {sensor3, 1}, {sensor4, 1}, }; var sensorLocation = location.SensorData; var creator = new SensorPlLine1Creator(sensorLocation, sensorValues); // call PlLine actual = creator.CreatePlLine(); // asserts var lastPoint = actual.Points.Last(); Assert.AreEqual(expectedEndPoint, lastPoint.Z); } [Test, Ignore("Test must be reviewed.")] public void CreatePlLine_Pl1DikeToeAtPolderToSurfaceLevelInsideAndNoLocationData_ZValueShouldBeSurfaceLevel() { // setup const int expectedValue = 1; var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var location = new Location("test") { RiverLevel = 5, PolderLevel = -1 }; location.AddNewSensorData(); location.SensorData.Pl1PlLineOffsetBelowDikeTopAtRiver = DataSourceTypeSensors.LocationData; location.SensorData.Pl1PlLineOffsetBelowDikeTopAtPolder = DataSourceTypeSensors.LocationData; location.SensorData.Pl1PlLineOffsetBelowShoulderBaseInside = DataSourceTypeSensors.LocationData; location.SensorData.Pl1PlLineOffsetBelowDikeToeAtPolder = DataSourceTypeSensors.Sensor; surfaceLine.EnsurePointOfType(0.0, 0.0, CharacteristicPointType.SurfaceLevelOutside); surfaceLine.EnsurePointOfType(50.0, 0.0, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(85.0, 8.0, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(95.0, 8.0, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(108.0, 4.0, CharacteristicPointType.ShoulderBaseInside); surfaceLine.EnsurePointOfType(116.0, 3.0, CharacteristicPointType.ShoulderTopInside); surfaceLine.EnsurePointOfType(121.0, 0.0, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(190.0, expectedValue, CharacteristicPointType.SurfaceLevelInside); location.SurfaceLine = surfaceLine; var sensor1 = new Sensor { ID = 1, Name = "Test1", Depth = 2, RelativeLocation = 50, PlLineMappings = new[] { PlLineType.Pl1 }, Type = SensorType.WaterLevel }; var sensor2 = new Sensor { ID = 2, Name = "Test2", Depth = 2, RelativeLocation = 90, PlLineMappings = new[] { PlLineType.Pl1 } }; var sensor3 = new Sensor { ID = 3, Name = "Test3", Depth = 2, RelativeLocation = 104, PlLineMappings = new[] { PlLineType.Pl1 } }; var sensor4 = new Sensor { ID = 4, Name = "Test4", Depth = 2, RelativeLocation = 123.3, PlLineMappings = new[] { PlLineType.Pl1 } }; var repository = new SensorRepository(location); repository.Add(sensor1); repository.Add(sensor2); repository.Add(sensor3); repository.Add(sensor4); IDictionary sensorValues = new Dictionary() { {sensor1, 1}, {sensor2, 1}, {sensor3, 1}, {sensor4, 1}, }; var sensorLocation = location.SensorData; var creator = new SensorPlLine1Creator(sensorLocation, sensorValues); // call PlLine actual = creator.CreatePlLine(); // asserts var lastPoint = actual.Points.Last(); Assert.AreEqual(expectedValue, lastPoint.Z); } [Test] public void GetDitchWaterLevelIntersectionAtXDikeSide_PolderLevelIntersectsInDitch_ShouldReturnIntersectionValue() { // setup var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var location = new Location(); surfaceLine.EnsurePointOfType(0.0, 0.0, CharacteristicPointType.SurfaceLevelOutside); surfaceLine.EnsurePointOfType(10, 0.0, CharacteristicPointType.DitchDikeSide); surfaceLine.EnsurePointOfType(15, -5, CharacteristicPointType.BottomDitchDikeSide); surfaceLine.EnsurePointOfType(17, -5, CharacteristicPointType.BottomDitchPolderSide); surfaceLine.EnsurePointOfType(20, 0.0, CharacteristicPointType.DitchPolderSide); surfaceLine.EnsurePointOfType(25, 0.0, CharacteristicPointType.SurfaceLevelInside); location.AddNewSensorData(); location.SurfaceLine = surfaceLine; var creator = new SensorPlLine1Creator(location.SensorData, new Dictionary()); var actual = creator.GetDitchWaterLevelIntersectionAtXDikeSide(-2.5); const double expected = 12.5; Assert.AreEqual(expected, actual); } [Test] public void CreatePlLine_Pl1IgnorAllSensors_ResultsAreAsExpected() { // setup var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var location = new Location("test") { RiverLevel = 1, PolderLevel = 1 }; location.AddNewSensorData(); location.SensorData.Pl1PlLineOffsetBelowDikeToeAtPolder = DataSourceTypeSensors.Ignore; location.SensorData.Pl1PlLineOffsetBelowDikeTopAtPolder = DataSourceTypeSensors.Ignore; location.SensorData.Pl1PlLineOffsetBelowDikeTopAtRiver = DataSourceTypeSensors.Ignore; location.SensorData.Pl1PlLineOffsetBelowShoulderBaseInside = DataSourceTypeSensors.Ignore; location.SensorData.Pl1WaterLevelAtRiver = DataSourceTypeSensors.LocationData; location.SensorData.Pl1WaterLevelAtPolder = DataSourceTypeSensors.LocationData; // Assert.IsTrue(location.SensorData.IsValid()); surfaceLine.EnsurePointOfType(0.0, 0.0, CharacteristicPointType.SurfaceLevelOutside); surfaceLine.EnsurePointOfType(50.0, 0.0, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(80.0, 5.0, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(125, 5.0, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(140.0, 0.0, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(145.0, 0.0, CharacteristicPointType.ShoulderBaseInside); surfaceLine.EnsurePointOfType(190.0, 0.0, CharacteristicPointType.SurfaceLevelInside); location.SurfaceLine = surfaceLine; var sensor1 = new Sensor { ID = 1, Name = "Test1", Depth = 2, RelativeLocation = 50, PlLineMappings = new[] { PlLineType.Pl1 }, Type = SensorType.WaterLevel }; var sensor2 = new Sensor { ID = 2, Name = "Test2", Depth = 2, RelativeLocation = 90, PlLineMappings = new[] { PlLineType.Pl1 } }; var sensor3 = new Sensor { ID = 3, Name = "Test3", Depth = 2, RelativeLocation = 104, PlLineMappings = new[] { PlLineType.Pl1 } }; var sensor4 = new Sensor { ID = 4, Name = "Test4", Depth = 2, RelativeLocation = 123.3, PlLineMappings = new[] { PlLineType.Pl1 } }; var sensor5 = new Sensor { ID = 5, Name = "Test5", Depth = 2, RelativeLocation = 90, PlLineMappings = new[] { PlLineType.Pl3, PlLineType.Pl4 } }; var sensor6 = new Sensor { ID = 6, Name = "Test6", Depth = 2, RelativeLocation = 123.3, PlLineMappings = new[] { PlLineType.Pl3, PlLineType.Pl4 } }; var sensor7 = new Sensor { ID = 7, Name = "Test7", Depth = 2, RelativeLocation = 180, PlLineMappings = new[] { PlLineType.Pl3, PlLineType.Pl4 } }; var repository = new SensorRepository(location); repository.Add(sensor1); repository.Add(sensor2); repository.Add(sensor3); repository.Add(sensor4); repository.Add(sensor5); repository.Add(sensor6); repository.Add(sensor7); IDictionary sensorValues = new Dictionary() { {sensor1, 1}, {sensor2, 1}, {sensor3, 1}, {sensor4, 1}, {sensor5, 1}, {sensor6, 1}, {sensor7, 1}, }; var sensorLocation = location.SensorData; var creator = new SensorPlLine1Creator(sensorLocation, sensorValues); // call PlLine actual = creator.CreatePlLine(); // asserts // Number of expected points in line const int expectedNumberOfCharacteristicPoints = 2; var pl1SensorCount = repository.Sensors.Count(s => s.PlLineMappings.Contains(PlLineType.Pl1)) + expectedNumberOfCharacteristicPoints + 1; // plus one for the intersection point + one for point below toe of dike Assert.AreEqual(pl1SensorCount, actual.Points.Count); // P2 var p2 = actual.Points.FirstOrDefault(p => p.Name == sensor2.Name); Assert.IsNotNull(p2); Assert.AreEqual(sensor2.RelativeLocation, p2.X); var expectedZValueP2 = sensorValues[sensor2]; Assert.AreEqual(expectedZValueP2, p2.Z); // P3 var p3 = actual.Points.FirstOrDefault(p => p.Name == sensor3.Name); Assert.IsNotNull(p3); Assert.AreEqual(sensor3.RelativeLocation, p3.X); var expectedZValueP3 = sensorValues[sensor3]; Assert.AreEqual(expectedZValueP3, p3.Z); // P4 var p4 = actual.Points.FirstOrDefault(p => p.Name == sensor4.Name); Assert.IsNotNull(p4); Assert.AreEqual(sensor4.RelativeLocation, p4.X); var expectedZValueP4 = sensorValues[sensor4]; Assert.AreEqual(expectedZValueP4, p4.Z); } [Test] public void CreatePlLinePl1_DikeHasDitch_ResultsAreAsExpected() { var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var location = new Location("test") { RiverLevel = 1, PolderLevel = 1 }; #region Setup location.AddNewSensorData(); location.SensorData.Pl1PlLineOffsetBelowDikeToeAtPolder = DataSourceTypeSensors.Ignore; location.SensorData.Pl1PlLineOffsetBelowDikeTopAtPolder = DataSourceTypeSensors.Ignore; location.SensorData.Pl1PlLineOffsetBelowDikeTopAtRiver = DataSourceTypeSensors.Ignore; location.SensorData.Pl1PlLineOffsetBelowShoulderBaseInside = DataSourceTypeSensors.Ignore; location.SensorData.Pl1WaterLevelAtRiver = DataSourceTypeSensors.LocationData; location.SensorData.Pl1WaterLevelAtPolder = DataSourceTypeSensors.LocationData; // Assert.IsTrue(location.SensorData.IsValid()); surfaceLine.EnsurePointOfType(0.0, 0.0, CharacteristicPointType.SurfaceLevelOutside); surfaceLine.EnsurePointOfType(50.0, 0.0, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(80.0, 5.0, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(125, 5.0, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(140.0, 0.0, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(148.0, 0.5, CharacteristicPointType.DitchDikeSide); surfaceLine.EnsurePointOfType(150.0, -4.0, CharacteristicPointType.BottomDitchDikeSide); surfaceLine.EnsurePointOfType(154.0, -4.0, CharacteristicPointType.BottomDitchPolderSide); surfaceLine.EnsurePointOfType(158.0, 0.0, CharacteristicPointType.DitchPolderSide); surfaceLine.EnsurePointOfType(190.0, 0.0, CharacteristicPointType.SurfaceLevelInside); location.SurfaceLine = surfaceLine; var sensor1 = new Sensor { ID = 1, Name = "Test1", Depth = 2, RelativeLocation = 50, PlLineMappings = new[] { PlLineType.Pl1 }, Type = SensorType.WaterLevel }; var sensor2 = new Sensor { ID = 2, Name = "Test2", Depth = 2, RelativeLocation = 90, PlLineMappings = new[] { PlLineType.Pl1 } }; var sensor3 = new Sensor { ID = 3, Name = "Test3", Depth = 2, RelativeLocation = 104, PlLineMappings = new[] { PlLineType.Pl1 } }; var sensor4 = new Sensor { ID = 4, Name = "Test4", Depth = 2, RelativeLocation = 128, PlLineMappings = new[] { PlLineType.Pl1 } }; var repository = new SensorRepository(location); repository.Add(sensor1); repository.Add(sensor2); repository.Add(sensor3); repository.Add(sensor4); IDictionary sensorValues = new Dictionary() { {sensor1, 3}, {sensor2, 3}, {sensor3, 3}, {sensor4, 3}, }; var sensorLocation = location.SensorData; var creator = new SensorPlLine1Creator(sensorLocation, sensorValues); #endregion // call PlLine actual = creator.CreatePlLine(); // asserts // Number of expected points in line var pl1SensorCount = repository.Sensors.Count(s => s.PlLineMappings.Contains(PlLineType.Pl1)); Assert.AreEqual(pl1SensorCount + 2 /* intersection points */, actual.Points.Count); // P2 var p2 = actual.Points.FirstOrDefault(p => p.Name == sensor2.Name); Assert.IsNotNull(p2); Assert.AreEqual(sensor2.RelativeLocation, p2.X); var expectedZValueP2 = sensorValues[sensor2]; Assert.AreEqual(expectedZValueP2, p2.Z); // P3 var p3 = actual.Points.FirstOrDefault(p => p.Name == sensor3.Name); Assert.IsNotNull(p3); Assert.AreEqual(sensor3.RelativeLocation, p3.X); var expectedZValueP3 = sensorValues[sensor3]; Assert.AreEqual(expectedZValueP3, p3.Z); // P4 var p4 = actual.Points.FirstOrDefault(p => p.Name == sensor4.Name); Assert.IsNotNull(p4); Assert.AreEqual(sensor4.RelativeLocation, p4.X); var expectedZValueP4 = sensorValues[sensor4]; Assert.AreEqual(expectedZValueP4, p4.Z); } [Test] public void CreatePlLine_DikeHasDitchAndSensor_DichLevelIsHorizontal() { const int polderLevel = 0; const int waterLevel = 1; var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var location = new Location("test") { RiverLevel = waterLevel, PolderLevel = polderLevel }; #region Setup location.AddNewSensorData(); location.SensorData.Pl1PlLineOffsetBelowDikeToeAtPolder = DataSourceTypeSensors.Ignore; location.SensorData.Pl1PlLineOffsetBelowDikeTopAtPolder = DataSourceTypeSensors.Ignore; location.SensorData.Pl1PlLineOffsetBelowDikeTopAtRiver = DataSourceTypeSensors.Ignore; location.SensorData.Pl1PlLineOffsetBelowShoulderBaseInside = DataSourceTypeSensors.Ignore; location.SensorData.Pl1WaterLevelAtRiver = DataSourceTypeSensors.Sensor; location.SensorData.Pl1WaterLevelAtPolder = DataSourceTypeSensors.Sensor; // Assert.IsTrue(location.SensorData.IsValid()); surfaceLine.EnsurePointOfType(0.0, 0.0, CharacteristicPointType.SurfaceLevelOutside); surfaceLine.EnsurePointOfType(50.0, 0.0, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(80.0, 5.0, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(125, 5.0, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(140.0, 0.0, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(148.0, 0.5, CharacteristicPointType.DitchDikeSide); surfaceLine.EnsurePointOfType(150.0, -4.0, CharacteristicPointType.BottomDitchDikeSide); surfaceLine.EnsurePointOfType(154.0, -4.0, CharacteristicPointType.BottomDitchPolderSide); surfaceLine.EnsurePointOfType(158.0, 0.0, CharacteristicPointType.DitchPolderSide); surfaceLine.EnsurePointOfType(190.0, 0.0, CharacteristicPointType.SurfaceLevelInside); location.SurfaceLine = surfaceLine; var sensor1 = new Sensor { ID = 1, Name = "Test1", Depth = 2, RelativeLocation = 50, PlLineMappings = new[] { PlLineType.Pl1 }, Type = SensorType.WaterLevel }; var sensor2 = new Sensor { ID = 2, Name = "Test2", Depth = 2, RelativeLocation = 90, PlLineMappings = new[] { PlLineType.Pl1 } }; var sensor3 = new Sensor { ID = 3, Name = "Test3", Depth = 2, RelativeLocation = 104, PlLineMappings = new[] { PlLineType.Pl1 } }; var sensor4 = new Sensor { ID = 4, Name = "Test4", Depth = 2, RelativeLocation = 128, PlLineMappings = new[] { PlLineType.Pl1 } }; var sensor5 = new Sensor { ID = 5, Name = "Test5", Depth = 2, RelativeLocation = 152, PlLineMappings = new[] { PlLineType.Pl1 }, Type = SensorType.PolderLevel }; var repository = new SensorRepository(location); repository.Add(sensor1); repository.Add(sensor2); repository.Add(sensor3); repository.Add(sensor4); repository.Add(sensor5); IDictionary sensorValues = new Dictionary() { {sensor1, waterLevel}, {sensor2, -1}, {sensor3, -1}, {sensor4, -1}, {sensor5, -1.5} }; var sensorLocation = location.SensorData; #endregion // call var creator = new SensorPlLine1Creator(sensorLocation, sensorValues); PlLine actual = creator.CreatePlLine(); // checks var xDitchDikeSide = creator.GetDitchWaterLevelIntersectionAtXDikeSide(sensorValues[sensor5]); var xDitchPolderSide = creator.GetDitchWaterLevelIntersectionAtXPolderSide(sensorValues[sensor5]); Assert.IsTrue(actual.Points.Any(p => p.X == xDitchDikeSide)); var zDitchDikeSide = actual.Points.Single(p => p.X == xDitchDikeSide).Z; var zDitchPolderSide = actual.Points.Single(p => p.X == xDitchPolderSide).Z; Assert.IsTrue(actual.Points.Any(p => p.X == xDitchPolderSide)); Assert.AreEqual(zDitchDikeSide, zDitchPolderSide); var endPoint = actual.Points.Last(); // End point should be z of x intersection at dike side in ditch (horizontal) Assert.AreEqual(endPoint.Z, zDitchDikeSide); } [Test] public void CreatePlLine_Pl3and4_FirstSegmentShouldBeHorizontalEqualToLocationData() { // setup const double xDikeToeAtRiver = 50.0; const double waterLevel = 1.0; var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var location = new Location("test") { RiverLevel = waterLevel, PolderLevel = waterLevel }; { location.AddNewSensorData(); location.SensorData.Pl3 = DataSourceTypeSensors.Sensor; location.SensorData.Pl1WaterLevelAtRiver = DataSourceTypeSensors.LocationData; location.SensorData.Pl1WaterLevelAtPolder = DataSourceTypeSensors.LocationData; // Assert.IsTrue(location.SensorData.IsValid()); surfaceLine.EnsurePointOfType(0.0, 0.0, CharacteristicPointType.SurfaceLevelOutside); surfaceLine.EnsurePointOfType(xDikeToeAtRiver, 0.0, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(80.0, 5.0, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(125, 5.0, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(140.0, 0.0, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(145.0, 0.0, CharacteristicPointType.ShoulderBaseInside); surfaceLine.EnsurePointOfType(190.0, 0.0, CharacteristicPointType.SurfaceLevelInside); location.SurfaceLine = surfaceLine; var sensor1 = new Sensor { ID = 1, Name = "Test1", Depth = waterLevel, RelativeLocation = 50, PlLineMappings = new[] { PlLineType.Pl1 }, Type = SensorType.WaterLevel }; var sensor5 = new Sensor { ID = 5, Name = "Test5", Depth = -8, RelativeLocation = 90, PlLineMappings = new[] { PlLineType.Pl3 } }; var sensor6 = new Sensor { ID = 6, Name = "Test6", Depth = -8, RelativeLocation = 123.3, PlLineMappings = new[] { PlLineType.Pl3 } }; var sensor7 = new Sensor { ID = 7, Name = "Test7", Depth = -8, RelativeLocation = 180, PlLineMappings = new[] { PlLineType.Pl3 } }; var repository = new SensorRepository(location); repository.Add(sensor1); repository.Add(sensor5); repository.Add(sensor6); repository.Add(sensor7); IDictionary sensorValues = new Dictionary() { {sensor1, waterLevel}, {sensor5, waterLevel}, {sensor6, waterLevel}, {sensor7, waterLevel}, }; var sensorLocation = location.SensorData; var creator = new SensorPlLine3Creator(sensorLocation, sensorValues); // call PlLine actual = creator.CreatePlLine(); //checks // start first segment Assert.AreEqual(-0.0, actual.Points[0].X); Assert.AreEqual(waterLevel, actual.Points[0].Z); // end of first segment (ends at DikeToeAtRiver) Assert.AreEqual(xDikeToeAtRiver, actual.Points[1].X); Assert.AreEqual(waterLevel, actual.Points[1].Z); } } [Test] public void CreatePlLine_Pl3and4_FirstSegmentShouldBeHorizontalEqualToWaterLevelSensor() { // setup const double xDikeToeAtRiver = 50.0; const double waterLevel = -0.25; var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var location = new Location("test") { RiverLevel = 1.0, PolderLevel = 1.0 }; { location.AddNewSensorData(); location.SensorData.Pl3 = DataSourceTypeSensors.Sensor; location.SensorData.Pl1WaterLevelAtRiver = DataSourceTypeSensors.Sensor; location.SensorData.Pl1WaterLevelAtPolder = DataSourceTypeSensors.Sensor; // Assert.IsTrue(location.SensorData.IsValid()); surfaceLine.EnsurePointOfType(0.0, 0.0, CharacteristicPointType.SurfaceLevelOutside); surfaceLine.EnsurePointOfType(xDikeToeAtRiver, 0.0, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(80.0, 5.0, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(125, 5.0, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(140.0, 0.0, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(145.0, 0.0, CharacteristicPointType.ShoulderBaseInside); surfaceLine.EnsurePointOfType(190.0, 0.0, CharacteristicPointType.SurfaceLevelInside); location.SurfaceLine = surfaceLine; var sensor1 = new Sensor { ID = 1, Name = "Test1", Depth = -0.25, RelativeLocation = 50, PlLineMappings = new[] { PlLineType.Pl1 }, Type = SensorType.WaterLevel }; var sensor5 = new Sensor { ID = 5, Name = "Test5", Depth = -8, RelativeLocation = 90, PlLineMappings = new[] { PlLineType.Pl3 } }; var sensor6 = new Sensor { ID = 6, Name = "Test6", Depth = -8, RelativeLocation = 123.3, PlLineMappings = new[] { PlLineType.Pl3 } }; var sensor7 = new Sensor { ID = 7, Name = "Test7", Depth = -8, RelativeLocation = 180, PlLineMappings = new[] { PlLineType.Pl3 } }; var repository = new SensorRepository(location); repository.Add(sensor1); repository.Add(sensor5); repository.Add(sensor6); repository.Add(sensor7); IDictionary sensorValues = new Dictionary() { {sensor1, waterLevel}, {sensor5, 1}, {sensor6, 1}, {sensor7, 1}, }; var sensorLocation = location.SensorData; var creator = new SensorPlLine3Creator(sensorLocation, sensorValues); // call PlLine actual = creator.CreatePlLine(); //checks // start first segment Assert.AreEqual(-0.0, actual.Points[0].X); Assert.AreEqual(waterLevel, actual.Points[0].Z); // end of first segment (ends at DikeToeAtRiver) Assert.AreEqual(xDikeToeAtRiver, actual.Points[1].X); Assert.AreEqual(waterLevel, actual.Points[1].Z); } } } }