// 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.Collections.Generic; using System.IO; using System.Linq; using System.Xml.Schema; using Core.Common.Base.IO; using Core.Common.TestUtil; using NUnit.Framework; using Ringtoets.Common.IO.Configurations; using Ringtoets.Common.IO.Configurations.Import; using Ringtoets.MacroStabilityInwards.IO.Configurations; namespace Ringtoets.MacroStabilityInwards.IO.Test.Configurations { [TestFixture] public class MacroStabilityInwardsCalculationConfigurationReaderTest { private readonly string testDirectoryPath = TestHelper.GetTestDataPath(TestDataPath.Ringtoets.MacroStabilityInwards.IO, nameof(MacroStabilityInwardsCalculationConfigurationReader)); [Test] [TestCaseSource(nameof(InvalidConfigurations))] public void Constructor_FileInvalidBasedOnSchemaDefinition_ThrowCriticalFileReadException(string fileName, string expectedParsingMessage) { // Setup string filePath = Path.Combine(testDirectoryPath, fileName); // Precondition Assert.IsTrue(File.Exists(filePath), $"File '{fileName}' does not exist"); // Call TestDelegate call = () => new MacroStabilityInwardsCalculationConfigurationReader(filePath); // Assert var exception = Assert.Throws(call); Assert.IsInstanceOf(exception.InnerException); StringAssert.Contains(expectedParsingMessage, exception.InnerException?.Message); } [Test] public void Constructor_ValidConfiguration_ExpectedValues() { // Setup string filePath = Path.Combine(testDirectoryPath, "validConfigurationEmptyCalculation.xml"); // Call var reader = new MacroStabilityInwardsCalculationConfigurationReader(filePath); // Assert Assert.IsInstanceOf>(reader); } [Test] public void Read_ValidConfigurationWithEmptyCalculation_ReturnExpectedReadMacroStabilityInwardsCalculation() { // Setup string filePath = Path.Combine(testDirectoryPath, "validConfigurationEmptyCalculation.xml"); var reader = new MacroStabilityInwardsCalculationConfigurationReader(filePath); // Call IList readConfigurationItems = reader.Read().ToList(); // Assert Assert.AreEqual(1, readConfigurationItems.Count); var configuration = (MacroStabilityInwardsCalculationConfiguration) readConfigurationItems[0]; Assert.AreEqual("Calculation", configuration.Name); Assert.IsNull(configuration.AssessmentLevel); Assert.IsNull(configuration.HydraulicBoundaryLocationName); Assert.IsNull(configuration.SurfaceLineName); Assert.IsNull(configuration.StochasticSoilModelName); Assert.IsNull(configuration.StochasticSoilProfileName); Assert.IsNull(configuration.Scenario); Assert.IsNull(configuration.DikeSoilScenario); Assert.IsNull(configuration.WaterLevelRiverAverage); Assert.IsNull(configuration.DrainageConstructionPresent); Assert.IsNull(configuration.XCoordinateDrainageConstruction); Assert.IsNull(configuration.ZCoordinateDrainageConstruction); Assert.IsNull(configuration.MinimumLevelPhreaticLineAtDikeTopRiver); Assert.IsNull(configuration.MinimumLevelPhreaticLineAtDikeTopPolder); Assert.IsNull(configuration.AdjustPhreaticLine3And4ForUplift); Assert.IsNull(configuration.PhreaticLine2); Assert.IsNull(configuration.PhreaticLine3); Assert.IsNull(configuration.PhreaticLine4); Assert.IsNull(configuration.LocationInputDaily); Assert.IsNull(configuration.LocationInputExtreme); Assert.IsNull(configuration.SlipPlaneMinimumDepth); Assert.IsNull(configuration.SlipPlaneMinimumLength); Assert.IsNull(configuration.MaximumSliceWidth); Assert.IsNull(configuration.CreateZones); Assert.IsNull(configuration.GridDeterminationType); Assert.IsNull(configuration.MoveGrid); Assert.IsNull(configuration.TangentLineDeterminationType); Assert.IsNull(configuration.TangentLineZTop); Assert.IsNull(configuration.TangentLineZBottom); Assert.IsNull(configuration.TangentLineNumber); Assert.IsNull(configuration.LeftGrid); Assert.IsNull(configuration.RightGrid); } [Test] public void Read_ValidConfigurationWithCalculationContainingNaNs_ReturnExpectedReadMacroStabilityInwardsCalculation() { // Setup string filePath = Path.Combine(testDirectoryPath, "validConfigurationCalculationContainingNaNs.xml"); var reader = new MacroStabilityInwardsCalculationConfigurationReader(filePath); // Call IList readConfigurationItems = reader.Read().ToList(); // Assert Assert.AreEqual(1, readConfigurationItems.Count); var configuration = (MacroStabilityInwardsCalculationConfiguration) readConfigurationItems[0]; Assert.IsNaN(configuration.AssessmentLevel); Assert.IsNaN(configuration.Scenario.Contribution); Assert.IsNaN(configuration.WaterLevelRiverAverage); Assert.IsNaN(configuration.XCoordinateDrainageConstruction); Assert.IsNaN(configuration.ZCoordinateDrainageConstruction); Assert.IsNaN(configuration.MinimumLevelPhreaticLineAtDikeTopRiver); Assert.IsNaN(configuration.MinimumLevelPhreaticLineAtDikeTopPolder); Assert.IsNaN(configuration.PhreaticLine2.Inwards); Assert.IsNaN(configuration.PhreaticLine2.Outwards); Assert.IsNaN(configuration.PhreaticLine3.Inwards); Assert.IsNaN(configuration.PhreaticLine3.Outwards); Assert.IsNaN(configuration.PhreaticLine4.Inwards); Assert.IsNaN(configuration.PhreaticLine4.Outwards); Assert.IsNaN(configuration.LocationInputDaily.WaterLevelPolder); Assert.IsNaN(configuration.LocationInputDaily.PhreaticLineOffsetBelowDikeTopAtRiver); Assert.IsNaN(configuration.LocationInputDaily.PhreaticLineOffsetBelowDikeToeAtPolder); Assert.IsNaN(configuration.LocationInputDaily.PhreaticLineOffsetBelowDikeTopAtPolder); Assert.IsNaN(configuration.LocationInputDaily.PhreaticLineOffsetBelowShoulderBaseInside); Assert.IsNaN(configuration.LocationInputExtreme.PenetrationLength); Assert.IsNaN(configuration.LocationInputExtreme.WaterLevelPolder); Assert.IsNaN(configuration.LocationInputExtreme.PhreaticLineOffsetBelowDikeTopAtRiver); Assert.IsNaN(configuration.LocationInputExtreme.PhreaticLineOffsetBelowDikeToeAtPolder); Assert.IsNaN(configuration.LocationInputExtreme.PhreaticLineOffsetBelowDikeTopAtPolder); Assert.IsNaN(configuration.LocationInputExtreme.PhreaticLineOffsetBelowShoulderBaseInside); Assert.IsNaN(configuration.SlipPlaneMinimumDepth); Assert.IsNaN(configuration.SlipPlaneMinimumLength); Assert.IsNaN(configuration.MaximumSliceWidth); Assert.IsNaN(configuration.TangentLineZTop); Assert.IsNaN(configuration.TangentLineZBottom); Assert.IsNaN(configuration.LeftGrid.XLeft); Assert.IsNaN(configuration.LeftGrid.XRight); Assert.IsNaN(configuration.LeftGrid.ZTop); Assert.IsNaN(configuration.LeftGrid.ZBottom); Assert.IsNaN(configuration.RightGrid.XLeft); Assert.IsNaN(configuration.RightGrid.XRight); Assert.IsNaN(configuration.RightGrid.ZTop); Assert.IsNaN(configuration.RightGrid.ZBottom); } [Test] public void Read_ValidConfigurationWithCalculationContainingInfinities_ReturnExpectedReadMacroStabilityInwardsCalculation() { // Setup string filePath = Path.Combine(testDirectoryPath, "validConfigurationCalculationContainingInfinities.xml"); var reader = new MacroStabilityInwardsCalculationConfigurationReader(filePath); // Call IList readConfigurationItems = reader.Read().ToList(); // Assert Assert.AreEqual(1, readConfigurationItems.Count); var configuration = (MacroStabilityInwardsCalculationConfiguration) readConfigurationItems[0]; Assert.IsNotNull(configuration.AssessmentLevel); Assert.IsNotNull(configuration.Scenario.Contribution); Assert.IsTrue(double.IsNegativeInfinity(configuration.AssessmentLevel.Value)); Assert.IsTrue(double.IsPositiveInfinity(configuration.Scenario.Contribution.Value)); Assert.IsTrue(double.IsPositiveInfinity(configuration.WaterLevelRiverAverage.Value)); Assert.IsTrue(double.IsPositiveInfinity(configuration.XCoordinateDrainageConstruction.Value)); Assert.IsTrue(double.IsPositiveInfinity(configuration.ZCoordinateDrainageConstruction.Value)); Assert.IsTrue(double.IsPositiveInfinity(configuration.MinimumLevelPhreaticLineAtDikeTopRiver.Value)); Assert.IsTrue(double.IsPositiveInfinity(configuration.MinimumLevelPhreaticLineAtDikeTopPolder.Value)); Assert.IsTrue(double.IsPositiveInfinity(configuration.PhreaticLine2.Inwards.Value)); Assert.IsTrue(double.IsPositiveInfinity(configuration.PhreaticLine2.Outwards.Value)); Assert.IsTrue(double.IsPositiveInfinity(configuration.PhreaticLine3.Inwards.Value)); Assert.IsTrue(double.IsPositiveInfinity(configuration.PhreaticLine3.Outwards.Value)); Assert.IsTrue(double.IsPositiveInfinity(configuration.PhreaticLine4.Inwards.Value)); Assert.IsTrue(double.IsPositiveInfinity(configuration.PhreaticLine4.Outwards.Value)); Assert.IsTrue(double.IsPositiveInfinity(configuration.LocationInputDaily.WaterLevelPolder.Value)); Assert.IsTrue(double.IsPositiveInfinity(configuration.LocationInputDaily.PhreaticLineOffsetBelowDikeTopAtRiver.Value)); Assert.IsTrue(double.IsPositiveInfinity(configuration.LocationInputDaily.PhreaticLineOffsetBelowDikeToeAtPolder.Value)); Assert.IsTrue(double.IsPositiveInfinity(configuration.LocationInputDaily.PhreaticLineOffsetBelowDikeTopAtPolder.Value)); Assert.IsTrue(double.IsPositiveInfinity(configuration.LocationInputDaily.PhreaticLineOffsetBelowShoulderBaseInside.Value)); Assert.IsTrue(double.IsPositiveInfinity(configuration.LocationInputExtreme.PenetrationLength.Value)); Assert.IsTrue(double.IsPositiveInfinity(configuration.LocationInputExtreme.WaterLevelPolder.Value)); Assert.IsTrue(double.IsPositiveInfinity(configuration.LocationInputExtreme.PhreaticLineOffsetBelowDikeTopAtRiver.Value)); Assert.IsTrue(double.IsPositiveInfinity(configuration.LocationInputExtreme.PhreaticLineOffsetBelowDikeToeAtPolder.Value)); Assert.IsTrue(double.IsPositiveInfinity(configuration.LocationInputExtreme.PhreaticLineOffsetBelowDikeTopAtPolder.Value)); Assert.IsTrue(double.IsPositiveInfinity(configuration.LocationInputExtreme.PhreaticLineOffsetBelowShoulderBaseInside.Value)); Assert.IsTrue(double.IsPositiveInfinity(configuration.SlipPlaneMinimumDepth.Value)); Assert.IsTrue(double.IsPositiveInfinity(configuration.SlipPlaneMinimumLength.Value)); Assert.IsTrue(double.IsPositiveInfinity(configuration.MaximumSliceWidth.Value)); Assert.IsTrue(double.IsPositiveInfinity(configuration.TangentLineZTop.Value)); Assert.IsTrue(double.IsPositiveInfinity(configuration.TangentLineZBottom.Value)); Assert.IsTrue(double.IsPositiveInfinity(configuration.LeftGrid.XLeft.Value)); Assert.IsTrue(double.IsPositiveInfinity(configuration.LeftGrid.XRight.Value)); Assert.IsTrue(double.IsPositiveInfinity(configuration.LeftGrid.ZTop.Value)); Assert.IsTrue(double.IsPositiveInfinity(configuration.LeftGrid.ZBottom.Value)); Assert.IsTrue(double.IsNegativeInfinity(configuration.RightGrid.XLeft.Value)); Assert.IsTrue(double.IsNegativeInfinity(configuration.RightGrid.XRight.Value)); Assert.IsTrue(double.IsNegativeInfinity(configuration.RightGrid.ZTop.Value)); Assert.IsTrue(double.IsNegativeInfinity(configuration.RightGrid.ZBottom.Value)); } [Test] [TestCase("validConfigurationFullCalculationContainingHydraulicBoundaryLocation.xml", TestName = "Read_ValidConfigurationWithFullCalculationContainingHydraulicBoundaryLocation_ReturnCalculation(HydraulicBoundaryLocation)")] [TestCase("validConfigurationFullCalculationContainingHydraulicBoundaryLocation_differentOrder.xml", TestName = "Read_ValidConfigurationWithFullCalculationContainingHydraulicBoundaryLocation_ReturnCalculation(HydraulicBoundaryLocation_differentOrder)")] public void Read_ValidConfigurationWithFullCalculationContainingHydraulicBoundaryLocation_ReturnExpectedReadMacroStabilityInwardsCalculation(string fileName) { // Setup string filePath = Path.Combine(testDirectoryPath, fileName); var reader = new MacroStabilityInwardsCalculationConfigurationReader(filePath); // Call IList readConfigurationItems = reader.Read().ToList(); // Assert Assert.AreEqual(1, readConfigurationItems.Count); var configuration = (MacroStabilityInwardsCalculationConfiguration) readConfigurationItems[0]; Assert.AreEqual("Calculation", configuration.Name); Assert.IsNull(configuration.AssessmentLevel); Assert.AreEqual("HRlocatie", configuration.HydraulicBoundaryLocationName); Assert.AreEqual("Profielschematisatie", configuration.SurfaceLineName); Assert.AreEqual("Ondergrondmodel", configuration.StochasticSoilModelName); Assert.AreEqual("Ondergrondschematisatie", configuration.StochasticSoilProfileName); Assert.AreEqual(ConfigurationDikeSoilScenario.SandDikeOnClay, configuration.DikeSoilScenario); Assert.AreEqual(10.5, configuration.WaterLevelRiverAverage); Assert.IsTrue(configuration.DrainageConstructionPresent); Assert.AreEqual(10.6, configuration.XCoordinateDrainageConstruction); Assert.AreEqual(10.7, configuration.ZCoordinateDrainageConstruction); Assert.AreEqual(10.9, configuration.MinimumLevelPhreaticLineAtDikeTopRiver); Assert.AreEqual(10.8, configuration.MinimumLevelPhreaticLineAtDikeTopPolder); Assert.IsTrue(configuration.AdjustPhreaticLine3And4ForUplift); MacroStabilityInwardsPhreaticLineConfiguration phreaticLine3Configuration = configuration.PhreaticLine3; Assert.IsNotNull(phreaticLine3Configuration); Assert.AreEqual(10.1, phreaticLine3Configuration.Inwards); Assert.AreEqual(10.2, phreaticLine3Configuration.Outwards); MacroStabilityInwardsPhreaticLineConfiguration phreaticLine4Configuration = configuration.PhreaticLine4; Assert.IsNotNull(phreaticLine4Configuration); Assert.AreEqual(10.3, phreaticLine4Configuration.Inwards); Assert.AreEqual(10.4, phreaticLine4Configuration.Outwards); MacroStabilityInwardsPhreaticLineConfiguration phreaticLine2Configuration = configuration.PhreaticLine2; Assert.IsNotNull(phreaticLine2Configuration); Assert.AreEqual(20.1, phreaticLine2Configuration.Inwards); Assert.AreEqual(20.2, phreaticLine2Configuration.Outwards); MacroStabilityInwardsLocationInputConfiguration dailyConfiguration = configuration.LocationInputDaily; Assert.IsNotNull(dailyConfiguration); Assert.AreEqual(2.2, dailyConfiguration.WaterLevelPolder); Assert.IsTrue(dailyConfiguration.UseDefaultOffsets); Assert.AreEqual(2.21, dailyConfiguration.PhreaticLineOffsetBelowDikeTopAtRiver); Assert.AreEqual(2.24, dailyConfiguration.PhreaticLineOffsetBelowDikeToeAtPolder); Assert.AreEqual(2.22, dailyConfiguration.PhreaticLineOffsetBelowDikeTopAtPolder); Assert.AreEqual(2.23, dailyConfiguration.PhreaticLineOffsetBelowShoulderBaseInside); MacroStabilityInwardsLocationInputExtremeConfiguration extremeConfiguration = configuration.LocationInputExtreme; Assert.IsNotNull(extremeConfiguration); Assert.AreEqual(15.2, extremeConfiguration.WaterLevelPolder); Assert.AreEqual(16.2, extremeConfiguration.PenetrationLength); Assert.IsFalse(extremeConfiguration.UseDefaultOffsets); Assert.AreEqual(15.21, extremeConfiguration.PhreaticLineOffsetBelowDikeTopAtRiver); Assert.AreEqual(15.24, extremeConfiguration.PhreaticLineOffsetBelowDikeToeAtPolder); Assert.AreEqual(15.22, extremeConfiguration.PhreaticLineOffsetBelowDikeTopAtPolder); Assert.AreEqual(15.23, extremeConfiguration.PhreaticLineOffsetBelowShoulderBaseInside); Assert.AreEqual(0.4, configuration.SlipPlaneMinimumDepth); Assert.AreEqual(0.5, configuration.SlipPlaneMinimumLength); Assert.AreEqual(0.6, configuration.MaximumSliceWidth); Assert.IsTrue(configuration.CreateZones); Assert.IsTrue(configuration.MoveGrid); Assert.AreEqual(ConfigurationGridDeterminationType.Automatic, configuration.GridDeterminationType); Assert.AreEqual(ConfigurationTangentLineDeterminationType.LayerSeparated, configuration.TangentLineDeterminationType); Assert.AreEqual(10, configuration.TangentLineZTop); Assert.AreEqual(1, configuration.TangentLineZBottom); Assert.AreEqual(5, configuration.TangentLineNumber); MacroStabilityInwardsGridConfiguration leftGridConfiguration = configuration.LeftGrid; Assert.IsNotNull(leftGridConfiguration); Assert.IsNaN(leftGridConfiguration.XLeft); Assert.IsNaN(leftGridConfiguration.XRight); Assert.IsNaN(leftGridConfiguration.ZTop); Assert.IsNaN(leftGridConfiguration.ZBottom); Assert.AreEqual(6, leftGridConfiguration.NumberOfVerticalPoints); Assert.AreEqual(5, leftGridConfiguration.NumberOfHorizontalPoints); MacroStabilityInwardsGridConfiguration rightGridConfiguration = configuration.RightGrid; Assert.IsNotNull(rightGridConfiguration); Assert.AreEqual(1, rightGridConfiguration.XLeft); Assert.AreEqual(2, rightGridConfiguration.XRight); Assert.AreEqual(3, rightGridConfiguration.ZTop); Assert.AreEqual(4, rightGridConfiguration.ZBottom); Assert.AreEqual(5, rightGridConfiguration.NumberOfVerticalPoints); Assert.AreEqual(6, rightGridConfiguration.NumberOfHorizontalPoints); ScenarioConfiguration scenarioConfiguration = configuration.Scenario; Assert.IsNotNull(scenarioConfiguration); Assert.AreEqual(8.8, scenarioConfiguration.Contribution); Assert.IsFalse(scenarioConfiguration.IsRelevant); } [Test] [TestCase("validConfigurationFullCalculationContainingAssessmentLevel.xml", TestName = "Read_ValidConfigurationWithFullCalculationContainingAssessmentLevel_ReturnCalculation(AssessmentLevel)")] [TestCase("validConfigurationFullCalculationContainingAssessmentLevel_differentOrder.xml", TestName = "Read_ValidConfigurationWithFullCalculationContainingAssessmentLevel_ReturnCalculation(AssessmentLevel_differentOrder)")] public void Read_ValidConfigurationWithFullCalculationContainingAssessmentLevel_ReturnExpectedReadMacroStabilityInwardsCalculation(string fileName) { // Setup string filePath = Path.Combine(testDirectoryPath, fileName); var reader = new MacroStabilityInwardsCalculationConfigurationReader(filePath); // Call IList readConfigurationItems = reader.Read().ToList(); // Assert Assert.AreEqual(1, readConfigurationItems.Count); var configuration = (MacroStabilityInwardsCalculationConfiguration) readConfigurationItems[0]; Assert.AreEqual("Calculation", configuration.Name); Assert.AreEqual(1.1, configuration.AssessmentLevel); Assert.IsNull(configuration.HydraulicBoundaryLocationName); Assert.AreEqual("Profielschematisatie", configuration.SurfaceLineName); Assert.AreEqual("Ondergrondmodel", configuration.StochasticSoilModelName); Assert.AreEqual("Ondergrondschematisatie", configuration.StochasticSoilProfileName); Assert.AreEqual(ConfigurationDikeSoilScenario.SandDikeOnClay, configuration.DikeSoilScenario); Assert.AreEqual(10.5, configuration.WaterLevelRiverAverage); Assert.IsTrue(configuration.DrainageConstructionPresent); Assert.AreEqual(10.6, configuration.XCoordinateDrainageConstruction); Assert.AreEqual(10.7, configuration.ZCoordinateDrainageConstruction); Assert.AreEqual(10.9, configuration.MinimumLevelPhreaticLineAtDikeTopRiver); Assert.AreEqual(10.8, configuration.MinimumLevelPhreaticLineAtDikeTopPolder); Assert.IsTrue(configuration.AdjustPhreaticLine3And4ForUplift); MacroStabilityInwardsPhreaticLineConfiguration phreaticLine3Configuration = configuration.PhreaticLine3; Assert.IsNotNull(phreaticLine3Configuration); Assert.AreEqual(10.1, phreaticLine3Configuration.Inwards); Assert.AreEqual(10.2, phreaticLine3Configuration.Outwards); MacroStabilityInwardsPhreaticLineConfiguration phreaticLine4Configuration = configuration.PhreaticLine4; Assert.IsNotNull(phreaticLine4Configuration); Assert.AreEqual(10.3, phreaticLine4Configuration.Inwards); Assert.AreEqual(10.4, phreaticLine4Configuration.Outwards); MacroStabilityInwardsPhreaticLineConfiguration phreaticLine2Configuration = configuration.PhreaticLine2; Assert.IsNotNull(phreaticLine2Configuration); Assert.AreEqual(20.1, phreaticLine2Configuration.Inwards); Assert.AreEqual(20.2, phreaticLine2Configuration.Outwards); MacroStabilityInwardsLocationInputConfiguration dailyConfiguration = configuration.LocationInputDaily; Assert.IsNotNull(dailyConfiguration); Assert.AreEqual(2.2, dailyConfiguration.WaterLevelPolder); Assert.IsTrue(dailyConfiguration.UseDefaultOffsets); Assert.AreEqual(2.21, dailyConfiguration.PhreaticLineOffsetBelowDikeTopAtRiver); Assert.AreEqual(2.24, dailyConfiguration.PhreaticLineOffsetBelowDikeToeAtPolder); Assert.AreEqual(2.22, dailyConfiguration.PhreaticLineOffsetBelowDikeTopAtPolder); Assert.AreEqual(2.23, dailyConfiguration.PhreaticLineOffsetBelowShoulderBaseInside); MacroStabilityInwardsLocationInputExtremeConfiguration extremeConfiguration = configuration.LocationInputExtreme; Assert.IsNotNull(extremeConfiguration); Assert.AreEqual(15.2, extremeConfiguration.WaterLevelPolder); Assert.AreEqual(16.2, extremeConfiguration.PenetrationLength); Assert.IsFalse(extremeConfiguration.UseDefaultOffsets); Assert.AreEqual(15.21, extremeConfiguration.PhreaticLineOffsetBelowDikeTopAtRiver); Assert.AreEqual(15.24, extremeConfiguration.PhreaticLineOffsetBelowDikeToeAtPolder); Assert.AreEqual(15.22, extremeConfiguration.PhreaticLineOffsetBelowDikeTopAtPolder); Assert.AreEqual(15.23, extremeConfiguration.PhreaticLineOffsetBelowShoulderBaseInside); Assert.AreEqual(0.4, configuration.SlipPlaneMinimumDepth); Assert.AreEqual(0.5, configuration.SlipPlaneMinimumLength); Assert.AreEqual(0.6, configuration.MaximumSliceWidth); Assert.IsTrue(configuration.CreateZones); Assert.IsTrue(configuration.MoveGrid); Assert.AreEqual(ConfigurationGridDeterminationType.Automatic, configuration.GridDeterminationType); Assert.AreEqual(ConfigurationTangentLineDeterminationType.LayerSeparated, configuration.TangentLineDeterminationType); Assert.AreEqual(10, configuration.TangentLineZTop); Assert.AreEqual(1, configuration.TangentLineZBottom); Assert.AreEqual(5, configuration.TangentLineNumber); MacroStabilityInwardsGridConfiguration leftGridConfiguration = configuration.LeftGrid; Assert.IsNotNull(leftGridConfiguration); Assert.IsNaN(leftGridConfiguration.XLeft); Assert.IsNaN(leftGridConfiguration.XRight); Assert.IsNaN(leftGridConfiguration.ZTop); Assert.IsNaN(leftGridConfiguration.ZBottom); Assert.AreEqual(6, leftGridConfiguration.NumberOfVerticalPoints); Assert.AreEqual(5, leftGridConfiguration.NumberOfHorizontalPoints); MacroStabilityInwardsGridConfiguration rightGridConfiguration = configuration.RightGrid; Assert.IsNotNull(rightGridConfiguration); Assert.AreEqual(1, rightGridConfiguration.XLeft); Assert.AreEqual(2, rightGridConfiguration.XRight); Assert.AreEqual(3, rightGridConfiguration.ZTop); Assert.AreEqual(4, rightGridConfiguration.ZBottom); Assert.AreEqual(5, rightGridConfiguration.NumberOfVerticalPoints); Assert.AreEqual(6, rightGridConfiguration.NumberOfHorizontalPoints); ScenarioConfiguration scenarioConfiguration = configuration.Scenario; Assert.IsNotNull(scenarioConfiguration); Assert.AreEqual(8.8, scenarioConfiguration.Contribution); Assert.IsFalse(scenarioConfiguration.IsRelevant); } [Test] public void Read_ValidConfigurationWithPartialCalculation_ReturnExpectedReadMacroStabilityInwardsCalculation() { // Setup string filePath = Path.Combine(testDirectoryPath, "validConfigurationPartialCalculation.xml"); var reader = new MacroStabilityInwardsCalculationConfigurationReader(filePath); // Call IList readConfigurationItems = reader.Read().ToList(); // Assert Assert.AreEqual(1, readConfigurationItems.Count); var configuration = (MacroStabilityInwardsCalculationConfiguration) readConfigurationItems[0]; Assert.AreEqual("Calculation", configuration.Name); Assert.AreEqual(1.1, configuration.AssessmentLevel); Assert.IsNull(configuration.HydraulicBoundaryLocationName); Assert.IsNull(configuration.SurfaceLineName); Assert.IsNull(configuration.StochasticSoilModelName); Assert.AreEqual("Ondergrondschematisatie", configuration.StochasticSoilProfileName); Assert.IsNull(configuration.Scenario); Assert.AreEqual(10.5, configuration.WaterLevelRiverAverage); Assert.AreEqual(10.6, configuration.XCoordinateDrainageConstruction); Assert.IsNull(configuration.ZCoordinateDrainageConstruction); Assert.AreEqual(10.9, configuration.MinimumLevelPhreaticLineAtDikeTopRiver); Assert.IsNull(configuration.MinimumLevelPhreaticLineAtDikeTopPolder); Assert.IsNull(configuration.AdjustPhreaticLine3And4ForUplift); Assert.AreEqual(20.1, configuration.PhreaticLine2.Inwards); Assert.AreEqual(20.2, configuration.PhreaticLine2.Outwards); Assert.AreEqual(10.1, configuration.PhreaticLine3.Inwards); Assert.AreEqual(10.2, configuration.PhreaticLine3.Outwards); Assert.IsNull(configuration.PhreaticLine4); Assert.IsNaN(configuration.LocationInputDaily.WaterLevelPolder); Assert.AreEqual(2.21, configuration.LocationInputDaily.PhreaticLineOffsetBelowDikeTopAtRiver); Assert.AreEqual(2.24, configuration.LocationInputDaily.PhreaticLineOffsetBelowDikeToeAtPolder); Assert.AreEqual(2.22, configuration.LocationInputDaily.PhreaticLineOffsetBelowDikeTopAtPolder); Assert.AreEqual(2.23, configuration.LocationInputDaily.PhreaticLineOffsetBelowShoulderBaseInside); Assert.IsNull(configuration.LocationInputExtreme); Assert.IsNull(configuration.MaximumSliceWidth); Assert.IsNull(configuration.SlipPlaneMinimumLength); Assert.AreEqual(0.4, configuration.SlipPlaneMinimumDepth); Assert.AreEqual(10, configuration.TangentLineZTop); Assert.AreEqual(1, configuration.TangentLineZBottom); Assert.AreEqual(5, configuration.TangentLineNumber); Assert.IsNaN(configuration.LeftGrid.XLeft); Assert.IsNaN(configuration.LeftGrid.XRight); Assert.IsNaN(configuration.LeftGrid.ZTop); Assert.IsNaN(configuration.LeftGrid.ZBottom); Assert.IsNull(configuration.RightGrid); } private static IEnumerable InvalidConfigurations() { const string testName = "{0:100}"; foreach (TestCaseData testCaseData in InvalidDuplicateElements()) { yield return testCaseData.SetName(testName); } foreach (TestCaseData testCaseData in InvalidTypeTestCases()) { yield return testCaseData.SetName(testName); } } private static IEnumerable InvalidTypeTestCases() { const string message = "The '{0}' element is invalid - The value '{1}' is invalid according to its datatype"; const string dataTypeDouble = "Double"; foreach (NameAdapter adapter in GetNameAdaptersOfDoubleProperties()) { yield return new TestCaseData($"invalid{adapter.PropertyName}Empty.xml", string.Format(message, adapter.ElementName, "")); yield return new TestCaseData($"invalid{adapter.PropertyName}No{dataTypeDouble}.xml", string.Format(message, adapter.ElementName, "string")); } const string dataTypeBoolean = "Boolean"; foreach (NameAdapter adapter in GetNameAdaptersOfBoolProperties()) { yield return new TestCaseData($"invalid{adapter.PropertyName}Empty.xml", string.Format(message, adapter.ElementName, "")); yield return new TestCaseData($"invalid{adapter.PropertyName}No{dataTypeBoolean}.xml", string.Format(message, adapter.ElementName, "string")); } const string dataTypeInteger = "Integer"; foreach (NameAdapter adapter in GetNameAdaptersOfIntegerProperties()) { yield return new TestCaseData($"invalid{adapter.PropertyName}Empty.xml", string.Format(message, adapter.ElementName, "")); yield return new TestCaseData($"invalid{adapter.PropertyName}No{dataTypeInteger}.xml", string.Format(message, adapter.ElementName, "string")); } const string stringMessage = "The '{0}' element is invalid - The value '' is invalid according to its datatype"; foreach (NameAdapter adapter in GetNameAdaptersOfStringProperties()) { yield return new TestCaseData($"invalid{adapter.PropertyName}Empty.xml", string.Format(stringMessage, adapter.ElementName)); } const string dataTypeEnumeration = "Enumeration"; const string enumMessage = "The '{0}' element is invalid - The value '{1}' is invalid according to its datatype 'String' - The Enumeration constraint failed."; foreach (NameAdapter adapter in GetNameAdaptersOfEnumerationProperties()) { yield return new TestCaseData($"invalid{adapter.PropertyName}Empty.xml", string.Format(enumMessage, adapter.ElementName, "")); yield return new TestCaseData($"invalid{adapter.PropertyName}No{dataTypeEnumeration}.xml", string.Format(enumMessage, adapter.ElementName, "string")); } } private static IEnumerable GetNameAdaptersOfIntegerProperties() { yield return new NameAdapter("TangentLineNumber", "aantal"); yield return new NameAdapter("LeftGridGridNumberOfHorizontalPoints", "aantalpuntenhorizontaal"); yield return new NameAdapter("LeftGridGridNumberOfVerticalPoints", "aantalpuntenverticaal"); yield return new NameAdapter("RightGridGridNumberOfHorizontalPoints", "aantalpuntenhorizontaal"); yield return new NameAdapter("RightGridGridNumberOfVerticalPoints", "aantalpuntenverticaal"); } private static IEnumerable GetNameAdaptersOfStringProperties() { yield return new NameAdapter("HydraulicBoundaryLocation", "hrlocatie"); yield return new NameAdapter("SurfaceLine", "profielschematisatie"); yield return new NameAdapter("StochasticSoilModel", "ondergrondmodel"); yield return new NameAdapter("StochasticSoilProfile", "ondergrondschematisatie"); } private static IEnumerable GetNameAdaptersOfEnumerationProperties() { yield return new NameAdapter("DikeSoilScenario", "dijktype"); yield return new NameAdapter("GridDeterminationType", "bepaling"); yield return new NameAdapter("TangentLineDeterminationType", "bepalingtangentlijnen"); } private static IEnumerable GetNameAdaptersOfBoolProperties() { yield return new NameAdapter("IsRelevant", "gebruik"); yield return new NameAdapter("CreateZones", "bepaling"); yield return new NameAdapter("DrainageConstructionPresent", "aanwezig"); yield return new NameAdapter("AdjustPhreaticLine3And4ForUplift", "corrigeervooropbarsten"); yield return new NameAdapter("LocationInputDailyUseDefaultOffsets", "gebruikdefaults"); yield return new NameAdapter("LocationInputExtremeUseDefaultOffsets", "gebruikdefaults"); yield return new NameAdapter("MoveGrid", "verplaatsgrid"); } private static IEnumerable GetNameAdaptersOfDoubleProperties() { yield return new NameAdapter("AssessmentLevel", "toetspeil"); yield return new NameAdapter("ScenarioContribution", "bijdrage"); yield return new NameAdapter("SlipPlaneMinimumDepth", "minimaleglijvlakdiepte"); yield return new NameAdapter("SlipPlaneMinimumLength", "minimaleglijvlaklengte"); yield return new NameAdapter("MaximumSliceWidth", "maximalelamelbreedte"); yield return new NameAdapter("WaterLevelRiverAverage", "gemiddeldhoogwater"); yield return new NameAdapter("XCoordinateDrainageConstruction", "x"); yield return new NameAdapter("ZCoordinateDrainageConstruction", "z"); yield return new NameAdapter("MinimumLevelPhreaticLineAtDikeTopRiver", "buitenkruin"); yield return new NameAdapter("MinimumLevelPhreaticLineAtDikeTopPolder", "binnenkruin"); yield return new NameAdapter("TangentLineZTop", "zboven"); yield return new NameAdapter("TangentLineZBottom", "zonder"); yield return new NameAdapter("PiezometricHeadPhreaticLine2Inwards", "binnenwaarts"); yield return new NameAdapter("PiezometricHeadPhreaticLine2Outwards", "buitenwaarts"); yield return new NameAdapter("LeakageLengthInwardsPhreaticLine3", "binnenwaarts"); yield return new NameAdapter("LeakageLengthOutwardsPhreaticLine3", "buitenwaarts"); yield return new NameAdapter("LeakageLengthInwardsPhreaticLine4", "binnenwaarts"); yield return new NameAdapter("LeakageLengthOutwardsPhreaticLine4", "buitenwaarts"); yield return new NameAdapter("LocationInputExtremePenetrationLength", "indringingslengte"); yield return new NameAdapter("LocationInputExtremeWaterLevelPolder", "polderpeil"); yield return new NameAdapter("LocationInputExtremePhreaticLineOffsetBelowDikeTopAtRiver", "buitenkruin"); yield return new NameAdapter("LocationInputExtremePhreaticLineOffsetBelowDikeTopAtPolder", "binnenkruin"); yield return new NameAdapter("LocationInputExtremePhreaticLineOffsetBelowShoulderBaseInside", "insteekbinnenberm"); yield return new NameAdapter("LocationInputExtremePhreaticLineOffsetBelowDikeToeAtPolder", "teendijkbinnenwaarts"); yield return new NameAdapter("LocationInputDailyWaterLevelPolder", "polderpeil"); yield return new NameAdapter("LocationInputDailyPhreaticLineOffsetBelowDikeTopAtRiver", "buitenkruin"); yield return new NameAdapter("LocationInputDailyPhreaticLineOffsetBelowDikeTopAtPolder", "binnenkruin"); yield return new NameAdapter("LocationInputDailyPhreaticLineOffsetBelowShoulderBaseInside", "insteekbinnenberm"); yield return new NameAdapter("LocationInputDailyPhreaticLineOffsetBelowDikeToeAtPolder", "teendijkbinnenwaarts"); yield return new NameAdapter("LeftGridXLeft", "xlinks"); yield return new NameAdapter("LeftGridXRight", "xrechts"); yield return new NameAdapter("LeftGridZTop", "zboven"); yield return new NameAdapter("LeftGridZBottom", "zonder"); yield return new NameAdapter("RightGridXLeft", "xlinks"); yield return new NameAdapter("RightGridXRight", "xrechts"); yield return new NameAdapter("RightGridZTop", "zboven"); yield return new NameAdapter("RightGridZBottom", "zonder"); } private static IEnumerable GetTagElements() { yield return "waterspanningen"; yield return "drainage"; yield return "initielehoogtepl1"; yield return "leklengtespl3"; yield return "leklengtespl4"; yield return "stijghoogtespl2"; yield return "dagelijks"; yield return "extreem"; yield return "offsets"; yield return "zonering"; yield return "grids"; yield return "tangentlijnen"; yield return "linkergrid"; yield return "rechtergrid"; yield return "scenario"; } private static IEnumerable InvalidDuplicateElements() { const string message = "Element '{0}' cannot appear more than once if content model type is \"all\"."; foreach (NameAdapter adapter in GetNameAdaptersOfAllProperties()) { yield return new TestCaseData($"invalidCalculationMultiple{adapter.PropertyName}.xml", string.Format(message, adapter.ElementName)); } foreach (string tagElement in GetTagElements()) { yield return new TestCaseData($"invalidCalculationMultiple{tagElement}Tag.xml", string.Format(message, tagElement)); } yield return new TestCaseData("invalidContainingBothAssessmentLevelAndHydraulicBoundaryLocation.xml", string.Format(message, "hrlocatie")); } private static IEnumerable GetNameAdaptersOfAllProperties() { return GetNameAdaptersOfDoubleProperties().Concat(GetNameAdaptersOfBoolProperties()) .Concat(GetNameAdaptersOfIntegerProperties()) .Concat(GetNameAdaptersOfEnumerationProperties()) .Concat(GetNameAdaptersOfStringProperties()); } /// /// Adapter class between the name of the property in the data model and the name of the corresponding xml element. /// private class NameAdapter { /// /// Creates a new instance of . /// /// The name of the property in the data model. /// The name of the identifier of the xml element. public NameAdapter(string propertyName, string elementName) { PropertyName = propertyName; ElementName = elementName; } /// /// Gets the name of the property in the data model. /// public string PropertyName { get; } /// /// Gets the name of the identifier of the xml element. /// public string ElementName { get; } } } }