Index: Ringtoets/Piping/src/Ringtoets.Piping.IO/Importers/PipingConfigurationImporter.cs =================================================================== diff -u -rea92fc3f6a4fcee8fd9fab1a17a66b4abddd80b2 -ref8341b9d75b82a9c652f5c2ef0c4108252c5fb8 --- Ringtoets/Piping/src/Ringtoets.Piping.IO/Importers/PipingConfigurationImporter.cs (.../PipingConfigurationImporter.cs) (revision ea92fc3f6a4fcee8fd9fab1a17a66b4abddd80b2) +++ Ringtoets/Piping/src/Ringtoets.Piping.IO/Importers/PipingConfigurationImporter.cs (.../PipingConfigurationImporter.cs) (revision ef8341b9d75b82a9c652f5c2ef0c4108252c5fb8) @@ -105,7 +105,11 @@ return false; } - ValidateReadItems(readItem); + ICalculationBase processedItem = ProcessReadItem(readItem); + if (processedItem != null) + { + validCalculationItems.Add(processedItem); + } } NotifyProgress(RingtoetsCommonIOResources.Importer_ProgressText_Adding_imported_data_to_DataModel, 3, 3); @@ -122,23 +126,43 @@ } } - private void ValidateReadItems(IReadPipingCalculationItem readItem) + private ICalculationBase ProcessReadItem(IReadPipingCalculationItem readItem) { - var readCalculation = readItem as ReadPipingCalculation; + ICalculationBase processedCalculationItem = null; + var readCalculationGroup = readItem as ReadPipingCalculationGroup; + var readCalculation = readItem as ReadPipingCalculation; + if (readCalculationGroup != null) + { + processedCalculationItem = ProcessCalculationGroup(readCalculationGroup); + } + if (readCalculation != null) { - ValidateCalculation(readCalculation); + processedCalculationItem = ProcessCalculation(readCalculation); } - if (readCalculationGroup != null) + return processedCalculationItem; + } + + private CalculationGroup ProcessCalculationGroup(ReadPipingCalculationGroup readCalculationGroup) + { + var group = new CalculationGroup(readCalculationGroup.Name, true); + + foreach (IReadPipingCalculationItem item in readCalculationGroup.Items) { - ValidateCalculationGroup(readCalculationGroup); + ICalculationBase processedItem = ProcessReadItem(item); + if (processedItem != null) + { + group.Children.Add(processedItem); + } } + + return group; } - private void ValidateCalculation(ReadPipingCalculation readCalculation) + private PipingCalculationScenario ProcessCalculation(ReadPipingCalculation readCalculation) { var pipingCalculation = new PipingCalculationScenario(new GeneralPipingInput()) { @@ -156,12 +180,10 @@ catch (CriticalFileValidationException e) { log.ErrorFormat(Resources.PipingConfigurationImporter_ValidateCalculation_Error_message_0_calculation_1_skipped, e.Message, readCalculation.Name); - return; + return null; } - validCalculationItems.Add(pipingCalculation); - - // Warn user when double name + return pipingCalculation; } /// @@ -325,11 +347,6 @@ } } - private static void ValidateCalculationGroup(ReadPipingCalculationGroup readCalculationGroup) - { - // Warn user when double name - } - private ReadResult ReadConfiguration() { try Index: Ringtoets/Piping/src/Ringtoets.Piping.IO/Schema/PipingConfigurationSchema.xsd =================================================================== diff -u -r0af83c27af5046fdd700b8e03136cb468dd30e48 -ref8341b9d75b82a9c652f5c2ef0c4108252c5fb8 --- Ringtoets/Piping/src/Ringtoets.Piping.IO/Schema/PipingConfigurationSchema.xsd (.../PipingConfigurationSchema.xsd) (revision 0af83c27af5046fdd700b8e03136cb468dd30e48) +++ Ringtoets/Piping/src/Ringtoets.Piping.IO/Schema/PipingConfigurationSchema.xsd (.../PipingConfigurationSchema.xsd) (revision ef8341b9d75b82a9c652f5c2ef0c4108252c5fb8) @@ -68,7 +68,9 @@ - + + + @@ -83,17 +85,23 @@ - + + + - + + + - + + + Index: Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/Importers/PipingConfigurationImporterTest.cs =================================================================== diff -u -rea92fc3f6a4fcee8fd9fab1a17a66b4abddd80b2 -ref8341b9d75b82a9c652f5c2ef0c4108252c5fb8 --- Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/Importers/PipingConfigurationImporterTest.cs (.../PipingConfigurationImporterTest.cs) (revision ea92fc3f6a4fcee8fd9fab1a17a66b4abddd80b2) +++ Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/Importers/PipingConfigurationImporterTest.cs (.../PipingConfigurationImporterTest.cs) (revision ef8341b9d75b82a9c652f5c2ef0c4108252c5fb8) @@ -20,8 +20,10 @@ // All rights reserved. using System; +using System.Collections.Generic; using System.IO; using System.Linq; +using Core.Common.Base.Data; using Core.Common.Base.Geometry; using Core.Common.Base.IO; using Core.Common.TestUtil; @@ -39,6 +41,15 @@ { private readonly string path = TestHelper.GetTestDataPath(TestDataPath.Ringtoets.Piping.IO, "PipingConfigurationReader"); + private static IEnumerable NestedOrNaNData + { + get + { + yield return new TestCaseData("validConfigurationNesting.xml", GetNestedData()); + yield return new TestCaseData("validConfigurationCalculationContainingNaNs.xml", GetNaNData()); + } + } + [Test] public void Constructor_ExpectedValues() { @@ -124,6 +135,31 @@ } [Test] + public void Import_InvalidFile_CancelImportWithErrorMessage() + { + // Setup + string filePath = Path.Combine(path, "invalidConfigurationCalculationContainingEmptyStrings.xml"); + var importer = new PipingConfigurationImporter(filePath, + new CalculationGroup(), + Enumerable.Empty(), + new PipingFailureMechanism()); + + // Call + bool importSuccesful = true; + Action call = () => importSuccesful = importer.Import(); + + // Assert + TestHelper.AssertLogMessages(call, messages => + { + var msgs = messages.ToArray(); + Assert.AreEqual(1, msgs.Length); + StringAssert.StartsWith($"Fout bij het lezen van bestand '{filePath}': het XML-document dat de configuratie voor de berekeningen beschrijft is niet geldig.", msgs[0]); + }); + + Assert.IsFalse(importSuccesful); + } + + [Test] [TestCase("Inlezen")] [TestCase("Valideren")] public void Import_CancelingImport_CancelImportAndLog(string expectedProgressMessage) @@ -320,7 +356,7 @@ pipingFailureMechanism.StochasticSoilModels.AddRange(new[] { stochasticSoilModel - }, "path"); + }, "path"); var hydraulicBoundaryLocation = new HydraulicBoundaryLocation(1, "HRlocatie", 10, 20); var importer = new PipingConfigurationImporter(filePath, @@ -455,28 +491,190 @@ // Assert Assert.IsTrue(succesful); - Assert.AreEqual(1, calculationGroup.Children.Count); - PipingCalculation calculation = calculationGroup.Children[0] as PipingCalculation; - Assert.AreEqual("Calculation", calculation.Name); - Assert.AreEqual(manualAssessmentLevel, calculation.InputParameters.UseAssessmentLevelManualInput); + var expectedCalculation = new PipingCalculationScenario(new GeneralPipingInput()) + { + Name = "Calculation", + InputParameters = + { + UseAssessmentLevelManualInput = manualAssessmentLevel, + HydraulicBoundaryLocation = hydraulicBoundaryLocation, + SurfaceLine = surfaceLine, + EntryPointL = (RoundedDouble) 2.2, + ExitPointL = (RoundedDouble) 3.3, + StochasticSoilModel = stochasticSoilModel, + StochasticSoilProfile = stochasticSoilProfile, + PhreaticLevelExit = + { + Mean = (RoundedDouble) 4.4, + StandardDeviation = (RoundedDouble) 5.5 + }, + DampingFactorExit = + { + Mean = (RoundedDouble) 6.6, + StandardDeviation = (RoundedDouble) 7.7 + } + } + }; if (manualAssessmentLevel) { - Assert.AreEqual(1.1, calculation.InputParameters.AssessmentLevel.Value); + expectedCalculation.InputParameters.AssessmentLevel = (RoundedDouble) 1.1; } + + AssertCalculationGroup(new CalculationGroup + { + Children = + { + expectedCalculation + } + }, calculationGroup); + } + + [Test] + [TestCaseSource(nameof(NestedOrNaNData))] + public void Import_NestedOrEmptyCalculations_DataAddedToModel(string file, CalculationGroup expectedCalculationGroup) + { + // Setup + string filePath = Path.Combine(path, file); + + var calculationGroup = new CalculationGroup(); + var pipingFailureMechanism = new PipingFailureMechanism(); + + var importer = new PipingConfigurationImporter(filePath, + calculationGroup, + Enumerable.Empty(), + pipingFailureMechanism); + + // Call + bool succesful = importer.Import(); + + // Assert + Assert.IsTrue(succesful); + AssertCalculationGroup(expectedCalculationGroup, calculationGroup); + } + + private static CalculationGroup GetNestedData() + { + return new CalculationGroup("Root", false) + { + Children = + { + new CalculationGroup("Group 1", false) + { + Children = + { + new PipingCalculationScenario(new GeneralPipingInput()) + { + Name = "Calculation 3" + } + } + }, + new PipingCalculationScenario(new GeneralPipingInput()) + { + Name = "Calculation 1" + }, + new CalculationGroup("Group 2", false) + { + Children = + { + new CalculationGroup("Group 4", false) + { + Children = + { + new PipingCalculationScenario(new GeneralPipingInput()) + { + Name = "Calculation 5" + } + } + }, + new PipingCalculationScenario(new GeneralPipingInput()) + { + Name = "Calculation 4" + } + } + }, + new PipingCalculationScenario(new GeneralPipingInput()) + { + Name = "Calculation 2" + }, + new CalculationGroup("Group 3", false) + } + }; + } + + private static CalculationGroup GetNaNData() + { + return new CalculationGroup("Root", false) + { + Children = + { + new PipingCalculationScenario(new GeneralPipingInput()) + { + Name = "Calculation", + InputParameters = + { + UseAssessmentLevelManualInput = true, + AssessmentLevel = RoundedDouble.NaN, + EntryPointL = RoundedDouble.NaN, + ExitPointL = RoundedDouble.NaN, + PhreaticLevelExit = + { + Mean = RoundedDouble.NaN, + StandardDeviation = RoundedDouble.NaN + }, + DampingFactorExit = + { + Mean = RoundedDouble.NaN, + StandardDeviation = RoundedDouble.NaN + } + } + } + } + }; + } + + private static void AssertCalculationGroup(CalculationGroup expectedCalculationGroup, CalculationGroup actualCalculationGroup) + { + Assert.AreEqual(expectedCalculationGroup.Children.Count, actualCalculationGroup.Children.Count); + + for (var i = 0; i < expectedCalculationGroup.Children.Count; i++) + { + Assert.AreEqual(expectedCalculationGroup.Children[i].Name, actualCalculationGroup.Children[i].Name); + var innerCalculationgroup = expectedCalculationGroup.Children[i] as CalculationGroup; + var innerCalculation = expectedCalculationGroup.Children[i] as PipingCalculationScenario; + + if (innerCalculationgroup != null) + { + AssertCalculationGroup(innerCalculationgroup, (CalculationGroup) actualCalculationGroup.Children[i]); + } + + if (innerCalculation != null) + { + AssertCalculation(innerCalculation, (PipingCalculationScenario) actualCalculationGroup.Children[i]); + } + } + } + + private static void AssertCalculation(PipingCalculationScenario expectedCalculation, PipingCalculationScenario actualCalculation) + { + Assert.AreEqual(expectedCalculation.InputParameters.UseAssessmentLevelManualInput, actualCalculation.InputParameters.UseAssessmentLevelManualInput); + if (expectedCalculation.InputParameters.UseAssessmentLevelManualInput) + { + Assert.AreEqual(expectedCalculation.InputParameters.AssessmentLevel.Value, actualCalculation.InputParameters.AssessmentLevel.Value); + } else { - Assert.AreSame(hydraulicBoundaryLocation, calculation.InputParameters.HydraulicBoundaryLocation); + Assert.AreSame(expectedCalculation.InputParameters.HydraulicBoundaryLocation, actualCalculation.InputParameters.HydraulicBoundaryLocation); } - Assert.AreSame(surfaceLine, calculation.InputParameters.SurfaceLine); - Assert.AreEqual(2.2, calculation.InputParameters.EntryPointL.Value); - Assert.AreEqual(3.3, calculation.InputParameters.ExitPointL.Value); - Assert.AreSame(stochasticSoilModel, calculation.InputParameters.StochasticSoilModel); - Assert.AreSame(stochasticSoilProfile, calculation.InputParameters.StochasticSoilProfile); - Assert.AreEqual(4.4, calculation.InputParameters.PhreaticLevelExit.Mean.Value); - Assert.AreEqual(5.5, calculation.InputParameters.PhreaticLevelExit.StandardDeviation.Value); - Assert.AreEqual(6.6, calculation.InputParameters.DampingFactorExit.Mean.Value); - Assert.AreEqual(7.7, calculation.InputParameters.DampingFactorExit.StandardDeviation.Value); + Assert.AreSame(expectedCalculation.InputParameters.SurfaceLine, actualCalculation.InputParameters.SurfaceLine); + Assert.AreEqual(expectedCalculation.InputParameters.EntryPointL.Value, actualCalculation.InputParameters.EntryPointL.Value); + Assert.AreEqual(expectedCalculation.InputParameters.ExitPointL.Value, actualCalculation.InputParameters.ExitPointL.Value); + Assert.AreSame(expectedCalculation.InputParameters.StochasticSoilModel, actualCalculation.InputParameters.StochasticSoilModel); + Assert.AreSame(expectedCalculation.InputParameters.StochasticSoilProfile, actualCalculation.InputParameters.StochasticSoilProfile); + Assert.AreEqual(expectedCalculation.InputParameters.PhreaticLevelExit.Mean.Value, actualCalculation.InputParameters.PhreaticLevelExit.Mean.Value); + Assert.AreEqual(expectedCalculation.InputParameters.PhreaticLevelExit.StandardDeviation.Value, actualCalculation.InputParameters.PhreaticLevelExit.StandardDeviation.Value); + Assert.AreEqual(expectedCalculation.InputParameters.DampingFactorExit.Mean.Value, actualCalculation.InputParameters.DampingFactorExit.Mean.Value); + Assert.AreEqual(expectedCalculation.InputParameters.DampingFactorExit.StandardDeviation.Value, actualCalculation.InputParameters.DampingFactorExit.StandardDeviation.Value); } private class ExpectedProgressNotification Index: Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/Readers/PipingConfigurationReaderTest.cs =================================================================== diff -u -r8732be87c6f131362724c2199b854587ad4ac67f -ref8341b9d75b82a9c652f5c2ef0c4108252c5fb8 --- Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/Readers/PipingConfigurationReaderTest.cs (.../PipingConfigurationReaderTest.cs) (revision 8732be87c6f131362724c2199b854587ad4ac67f) +++ Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/Readers/PipingConfigurationReaderTest.cs (.../PipingConfigurationReaderTest.cs) (revision ef8341b9d75b82a9c652f5c2ef0c4108252c5fb8) @@ -144,6 +144,9 @@ yield return new TestCaseData("invalidCalculationMultipleStochasts.xml", "The element 'berekening' has invalid child element 'stochasts'.") .SetName("invalidCalculationMultipleStochasts"); + yield return new TestCaseData("invalidConfigurationCalculationContainingEmptyStrings.xml", + "The 'hrlocatie' element is invalid - The value '' is invalid according to its datatype 'Token' - The actual length is less than the MinLength value.") + .SetName("invalidConfigurationCalculationContainingEmptyStrings"); } } @@ -427,27 +430,6 @@ } [Test] - public void Read_ValidConfigurationWithCalculationContainingEmptyStrings_ReturnExpectedReadPipingCalculation() - { - // Setup - string filePath = Path.Combine(testDirectoryPath, "validConfigurationCalculationContainingEmptyStrings.xml"); - var pipingConfigurationReader = new PipingConfigurationReader(filePath); - - // Call - IList readPipingCalculationItems = pipingConfigurationReader.Read().ToList(); - - // Assert - Assert.AreEqual(1, readPipingCalculationItems.Count); - - var calculation = readPipingCalculationItems[0] as ReadPipingCalculation; - Assert.IsNotNull(calculation); - Assert.IsEmpty(calculation.HydraulicBoundaryLocation); - Assert.IsEmpty(calculation.SurfaceLine); - Assert.IsEmpty(calculation.StochasticSoilModel); - Assert.IsEmpty(calculation.StochasticSoilProfile); - } - - [Test] public void Read_ValidConfigurationWithCalculationContainingNaNs_ReturnExpectedReadPipingCalculation() { // Setup Index: Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/test-data/PipingConfigurationReader/invalidConfigurationCalculationContainingEmptyStrings.xml =================================================================== diff -u --- Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/test-data/PipingConfigurationReader/invalidConfigurationCalculationContainingEmptyStrings.xml (revision 0) +++ Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/test-data/PipingConfigurationReader/invalidConfigurationCalculationContainingEmptyStrings.xml (revision ef8341b9d75b82a9c652f5c2ef0c4108252c5fb8) @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file Fisheye: Tag ef8341b9d75b82a9c652f5c2ef0c4108252c5fb8 refers to a dead (removed) revision in file `Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/test-data/PipingConfigurationReader/validConfigurationCalculationContainingEmptyStrings.xml'. Fisheye: No comparison available. Pass `N' to diff?