Index: Ringtoets/Piping/src/Ringtoets.Piping.Data/DerivedPipingInput.cs =================================================================== diff -u -rba840423eb72501cbad89c1a6d88642531efa8d5 -r420c266df87245b9471d3794ef5043ee89cb482a --- Ringtoets/Piping/src/Ringtoets.Piping.Data/DerivedPipingInput.cs (.../DerivedPipingInput.cs) (revision ba840423eb72501cbad89c1a6d88642531efa8d5) +++ Ringtoets/Piping/src/Ringtoets.Piping.Data/DerivedPipingInput.cs (.../DerivedPipingInput.cs) (revision 420c266df87245b9471d3794ef5043ee89cb482a) @@ -74,21 +74,10 @@ { get { - RoundedDouble piezometricHeadExit; - try - { - var assessmentLevel = input.AssessmentLevel; - var dampingFactorExit = PipingSemiProbabilisticDesignValueFactory.GetDampingFactorExit(input).GetDesignValue(); - var phreaticLevelExit = PipingSemiProbabilisticDesignValueFactory.GetPhreaticLevelExit(input).GetDesignValue(); + var dampingFactorExit = PipingSemiProbabilisticDesignValueFactory.GetDampingFactorExit(input).GetDesignValue(); + var phreaticLevelExit = PipingSemiProbabilisticDesignValueFactory.GetPhreaticLevelExit(input).GetDesignValue(); - piezometricHeadExit = (RoundedDouble) InputParameterCalculationService.CalculatePiezometricHeadAtExit(assessmentLevel, dampingFactorExit, phreaticLevelExit); - } - catch (ArgumentOutOfRangeException) - { - piezometricHeadExit = (RoundedDouble) double.NaN; - } - - return new RoundedDouble(2, piezometricHeadExit); + return new RoundedDouble(2, InputParameterCalculationService.CalculatePiezometricHeadAtExit(AssessmentLevel, dampingFactorExit, phreaticLevelExit)); } } @@ -99,22 +88,20 @@ { get { - LognormalDistribution seepageLenght = new LognormalDistribution(2) + LognormalDistribution seepageLength = new LognormalDistribution(2); + double seepageLengthMean = input.ExitPointL - input.EntryPointL; + if (seepageLengthMean > 0) { - Mean = (RoundedDouble) double.NaN, - StandardDeviation = (RoundedDouble) double.NaN - }; - try - { - seepageLenght.Mean = input.ExitPointL - input.EntryPointL; + seepageLength.Mean = (RoundedDouble)seepageLengthMean; + seepageLength.StandardDeviation = (RoundedDouble)seepageLengthMean * seepageLengthStandardDeviationFraction; } - catch (ArgumentOutOfRangeException) + else { - seepageLenght.Mean = (RoundedDouble) double.NaN; + seepageLength.Mean = (RoundedDouble) double.NaN; + seepageLength.StandardDeviation = (RoundedDouble) double.NaN; } - seepageLenght.StandardDeviation = seepageLenght.Mean * seepageLengthStandardDeviationFraction; - return seepageLenght; + return seepageLength; } } @@ -127,17 +114,11 @@ { LognormalDistribution thicknessCoverageLayer = new LognormalDistribution(2) { - Mean = (RoundedDouble)double.NaN, StandardDeviation = (RoundedDouble) 0.5 }; if (input.SurfaceLine != null && input.SoilProfile != null & !double.IsNaN(input.ExitPointL)) { TrySetThicknessCoverageLayer(thicknessCoverageLayer); - - if (double.IsNaN(thicknessCoverageLayer.Mean)) - { - log.Warn(Resources.PipingInputSynchronizer_UpdateThicknessCoverageLayer_Cannot_determine_thickness_coverage_layer); - } } else { @@ -155,9 +136,8 @@ { get { - LognormalDistribution thicknesAquiferLayer = new LognormalDistribution(2) + LognormalDistribution thicknessAquiferLayer = new LognormalDistribution(2) { - Mean = (RoundedDouble)double.NaN, StandardDeviation = (RoundedDouble) 0.5 }; @@ -168,31 +148,26 @@ if (soilProfile != null && surfaceLine != null && !double.IsNaN(exitPointL)) { double thicknessTopAquiferLayer = GetThicknessTopAquiferLayer(soilProfile, surfaceLine, exitPointL); - TrySetThicknessAquiferLayerMean(thicknesAquiferLayer, thicknessTopAquiferLayer); - - if (double.IsNaN(thicknesAquiferLayer.Mean)) - { - log.Warn(Resources.PipingInputSynchronizer_UpdateThicknessAquiferLayer_Cannot_determine_thickness_aquifer_layer); - } + TrySetThicknessAquiferLayerMean(thicknessAquiferLayer, thicknessTopAquiferLayer); } else { - thicknesAquiferLayer.Mean = (RoundedDouble)double.NaN; + thicknessAquiferLayer.Mean = (RoundedDouble)double.NaN; } - return thicknesAquiferLayer; + return thicknessAquiferLayer; } } - private static void TrySetThicknessAquiferLayerMean(LognormalDistribution thicknesAquiferLayer, double thicknessTopAquiferLayer) + private static void TrySetThicknessAquiferLayerMean(LognormalDistribution thicknessAquiferLayer, double thicknessTopAquiferLayer) { - try + if(thicknessTopAquiferLayer > 0) { - thicknesAquiferLayer.Mean = (RoundedDouble)thicknessTopAquiferLayer; + thicknessAquiferLayer.Mean = (RoundedDouble)thicknessTopAquiferLayer; } - catch (ArgumentOutOfRangeException) + else { - thicknesAquiferLayer.Mean = (RoundedDouble)double.NaN; + thicknessAquiferLayer.Mean = (RoundedDouble)double.NaN; } } @@ -213,6 +188,7 @@ } } + private void TrySetThicknessCoverageLayer(LognormalDistribution thicknessCoverageLayer) { try Index: Ringtoets/Piping/src/Ringtoets.Piping.Data/PipingInput.cs =================================================================== diff -u -rba840423eb72501cbad89c1a6d88642531efa8d5 -r420c266df87245b9471d3794ef5043ee89cb482a --- Ringtoets/Piping/src/Ringtoets.Piping.Data/PipingInput.cs (.../PipingInput.cs) (revision ba840423eb72501cbad89c1a6d88642531efa8d5) +++ Ringtoets/Piping/src/Ringtoets.Piping.Data/PipingInput.cs (.../PipingInput.cs) (revision 420c266df87245b9471d3794ef5043ee89cb482a) @@ -209,8 +209,7 @@ { get { - var derivedPipingInput = new DerivedPipingInput(this); - return derivedPipingInput.AssessmentLevel; + return new DerivedPipingInput(this).AssessmentLevel; } } @@ -222,8 +221,7 @@ { get { - var derivedPipingInput = new DerivedPipingInput(this); - return derivedPipingInput.PiezometricHeadExit; + return new DerivedPipingInput(this).PiezometricHeadExit; } } @@ -387,8 +385,7 @@ { get { - var derivedPipingInput = new DerivedPipingInput(this); - return derivedPipingInput.SeepageLength; + return new DerivedPipingInput(this).SeepageLength; } } @@ -434,8 +431,7 @@ { get { - var derivedPipingInput = new DerivedPipingInput(this); - return derivedPipingInput.ThicknessAquiferLayer; + return new DerivedPipingInput(this).ThicknessAquiferLayer; } } @@ -447,8 +443,7 @@ { get { - var derivedPipingInput = new DerivedPipingInput(this); - return derivedPipingInput.ThicknessCoverageLayer; + return new DerivedPipingInput(this).ThicknessCoverageLayer; } } @@ -492,7 +487,6 @@ if (SurfaceLine == null) { ExitPointL = (RoundedDouble)double.NaN; - SeepageLength.Mean = (RoundedDouble)double.NaN; } else { Index: Ringtoets/Piping/src/Ringtoets.Piping.Data/Properties/Resources.Designer.cs =================================================================== diff -u -r10779bb6a6db2d00f4627b2bc190e7e35e1fee3e -r420c266df87245b9471d3794ef5043ee89cb482a --- Ringtoets/Piping/src/Ringtoets.Piping.Data/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision 10779bb6a6db2d00f4627b2bc190e7e35e1fee3e) +++ Ringtoets/Piping/src/Ringtoets.Piping.Data/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision 420c266df87245b9471d3794ef5043ee89cb482a) @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.34209 +// Runtime Version:4.0.30319.17929 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -241,26 +241,6 @@ } /// - /// Looks up a localized string similar to Kan de dikte van het watervoerend pakket niet afleiden op basis van de invoer.. - /// - public static string PipingInputSynchronizer_UpdateThicknessAquiferLayer_Cannot_determine_thickness_aquifer_layer { - get { - return ResourceManager.GetString("PipingInputSynchronizer_UpdateThicknessAquiferLayer_Cannot_determine_thickness_aq" + - "uifer_layer", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Kan de dikte van de deklaag niet afleiden op basis van de invoer.. - /// - public static string PipingInputSynchronizer_UpdateThicknessCoverageLayer_Cannot_determine_thickness_coverage_layer { - get { - return ResourceManager.GetString("PipingInputSynchronizer_UpdateThicknessCoverageLayer_Cannot_determine_thickness_c" + - "overage_layer", resourceCulture); - } - } - - /// /// Looks up a localized string similar to Level {0} is below the bottom of the soil profile {1}.. /// public static string PipingSoilProfile_GetTopAquiferLayerThicknessBelowLevel_Level_0_below_Bottom_1_ { Index: Ringtoets/Piping/src/Ringtoets.Piping.Data/Properties/Resources.resx =================================================================== diff -u -r10779bb6a6db2d00f4627b2bc190e7e35e1fee3e -r420c266df87245b9471d3794ef5043ee89cb482a --- Ringtoets/Piping/src/Ringtoets.Piping.Data/Properties/Resources.resx (.../Resources.resx) (revision 10779bb6a6db2d00f4627b2bc190e7e35e1fee3e) +++ Ringtoets/Piping/src/Ringtoets.Piping.Data/Properties/Resources.resx (.../Resources.resx) (revision 420c266df87245b9471d3794ef5043ee89cb482a) @@ -207,10 +207,4 @@ Level {0} is below the bottom of the soil profile {1}. - - Kan de dikte van het watervoerend pakket niet afleiden op basis van de invoer. - - - Kan de dikte van de deklaag niet afleiden op basis van de invoer. - \ No newline at end of file Index: Ringtoets/Piping/src/Ringtoets.Piping.Service/PipingCalculationService.cs =================================================================== diff -u -r0adc6562a9cedb81859034ef5d62e9b11db4d9c7 -r420c266df87245b9471d3794ef5043ee89cb482a --- Ringtoets/Piping/src/Ringtoets.Piping.Service/PipingCalculationService.cs (.../PipingCalculationService.cs) (revision 0adc6562a9cedb81859034ef5d62e9b11db4d9c7) +++ Ringtoets/Piping/src/Ringtoets.Piping.Service/PipingCalculationService.cs (.../PipingCalculationService.cs) (revision 420c266df87245b9471d3794ef5043ee89cb482a) @@ -20,7 +20,7 @@ // All rights reserved. using System; -using Core.Common.Base.Data; +using System.Collections.Generic; using log4net; using Ringtoets.Piping.Data; using Ringtoets.Piping.KernelWrapper; @@ -49,11 +49,19 @@ pipingCalculationLogger.Info(String.Format(Resources.Validation_Subject_0_started_Time_1_, calculation.Name, DateTimeService.CurrentTimeAsString)); + var inputValidationResults = ValidateInput(calculation.InputParameters); + + if (inputValidationResults.Count > 0) + { + LogMessagesAsError(Resources.Error_in_piping_validation_0, inputValidationResults.ToArray()); + LogValidationEndTime(calculation); + return false; + } + var validationResults = new PipingCalculator(CreateInputFromData(calculation.InputParameters), PipingSubCalculatorFactory.Instance).Validate(); LogMessagesAsError(Resources.Error_in_piping_validation_0, validationResults.ToArray()); - pipingCalculationLogger.Info(String.Format(Resources.Validation_Subject_0_ended_Time_1_, - calculation.Name, DateTimeService.CurrentTimeAsString)); + LogValidationEndTime(calculation); return validationResults.Count == 0; } @@ -75,11 +83,11 @@ var pipingResult = new PipingCalculator(CreateInputFromData(calculation.InputParameters), PipingSubCalculatorFactory.Instance).Calculate(); calculation.Output = new PipingOutput(pipingResult.UpliftZValue, - pipingResult.UpliftFactorOfSafety, - pipingResult.HeaveZValue, - pipingResult.HeaveFactorOfSafety, - pipingResult.SellmeijerZValue, - pipingResult.SellmeijerFactorOfSafety); + pipingResult.UpliftFactorOfSafety, + pipingResult.HeaveZValue, + pipingResult.HeaveFactorOfSafety, + pipingResult.SellmeijerZValue, + pipingResult.SellmeijerFactorOfSafety); } catch (PipingCalculatorException e) { @@ -88,10 +96,33 @@ finally { pipingCalculationLogger.Info(String.Format(Resources.Calculation_Subject_0_ended_Time_1_, - calculation.Name, DateTimeService.CurrentTimeAsString)); + calculation.Name, DateTimeService.CurrentTimeAsString)); } } + private static void LogValidationEndTime(PipingCalculation calculation) + { + pipingCalculationLogger.Info(String.Format(Resources.Validation_Subject_0_ended_Time_1_, + calculation.Name, DateTimeService.CurrentTimeAsString)); + } + + private static List ValidateInput(PipingInput inputParameters) + { + List validationResult = new List(); + + if (double.IsNaN(inputParameters.ThicknessAquiferLayer.Mean)) + { + validationResult.Add(Resources.PipingCalculationService_ValidateInput_Cannot_determine_thickness_aquifer_layer); + } + + if (double.IsNaN(inputParameters.ThicknessCoverageLayer.Mean)) + { + validationResult.Add(Resources.PipingCalculationService_ValidateInput_Cannot_determine_thickness_coverage_layer); + } + + return validationResult; + } + private static void LogMessagesAsError(string format, params string[] errorMessages) { foreach (var errorMessage in errorMessages) Index: Ringtoets/Piping/src/Ringtoets.Piping.Service/Properties/Resources.Designer.cs =================================================================== diff -u -r10779bb6a6db2d00f4627b2bc190e7e35e1fee3e -r420c266df87245b9471d3794ef5043ee89cb482a --- Ringtoets/Piping/src/Ringtoets.Piping.Service/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision 10779bb6a6db2d00f4627b2bc190e7e35e1fee3e) +++ Ringtoets/Piping/src/Ringtoets.Piping.Service/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision 420c266df87245b9471d3794ef5043ee89cb482a) @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.34209 +// Runtime Version:4.0.30319.17929 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -97,6 +97,24 @@ } /// + /// Looks up a localized string similar to Kan de dikte van het watervoerend pakket niet afleiden op basis van de invoer.. + /// + internal static string PipingCalculationService_ValidateInput_Cannot_determine_thickness_aquifer_layer { + get { + return ResourceManager.GetString("PipingCalculationService_ValidateInput_Cannot_determine_thickness_aquifer_layer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Kan de dikte van de deklaag niet afleiden op basis van de invoer.. + /// + internal static string PipingCalculationService_ValidateInput_Cannot_determine_thickness_coverage_layer { + get { + return ResourceManager.GetString("PipingCalculationService_ValidateInput_Cannot_determine_thickness_coverage_layer", resourceCulture); + } + } + + /// /// Looks up a localized string similar to Validatie van '{0}' beëindigd om: {1}. /// internal static string Validation_Subject_0_ended_Time_1_ { Index: Ringtoets/Piping/src/Ringtoets.Piping.Service/Properties/Resources.resx =================================================================== diff -u -r10779bb6a6db2d00f4627b2bc190e7e35e1fee3e -r420c266df87245b9471d3794ef5043ee89cb482a --- Ringtoets/Piping/src/Ringtoets.Piping.Service/Properties/Resources.resx (.../Resources.resx) (revision 10779bb6a6db2d00f4627b2bc190e7e35e1fee3e) +++ Ringtoets/Piping/src/Ringtoets.Piping.Service/Properties/Resources.resx (.../Resources.resx) (revision 420c266df87245b9471d3794ef5043ee89cb482a) @@ -135,4 +135,10 @@ Validatie van '{0}' gestart om: {1} + + Kan de dikte van het watervoerend pakket niet afleiden op basis van de invoer. + + + Kan de dikte van de deklaag niet afleiden op basis van de invoer. + \ No newline at end of file Index: Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/DerivedPipingInputTest.cs =================================================================== diff -u -rba840423eb72501cbad89c1a6d88642531efa8d5 -r420c266df87245b9471d3794ef5043ee89cb482a --- Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/DerivedPipingInputTest.cs (.../DerivedPipingInputTest.cs) (revision ba840423eb72501cbad89c1a6d88642531efa8d5) +++ Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/DerivedPipingInputTest.cs (.../DerivedPipingInputTest.cs) (revision 420c266df87245b9471d3794ef5043ee89cb482a) @@ -21,12 +21,12 @@ using System; using Core.Common.Base.Data; -using Core.Common.Base.Geometry; using Core.Common.TestUtil; using NUnit.Framework; using Ringtoets.HydraRing.Data; using Ringtoets.Piping.Data.Probabilistics; using Ringtoets.Piping.Data.Properties; +using Ringtoets.Piping.Data.TestUtil; using Ringtoets.Piping.KernelWrapper.SubCalculator; using Ringtoets.Piping.KernelWrapper.TestUtil; using Ringtoets.Piping.KernelWrapper.TestUtil.SubCalculator; @@ -51,7 +51,7 @@ public void Constructor_WithPipingInput_DoesNotThrow() { // Setup - var input = CreateInputWithAquiferAndCoverageLayer(1.0, 1.1); + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(1.0, 1.1); // Call TestDelegate call = () => new DerivedPipingInput(input); @@ -98,6 +98,22 @@ } [Test] + public void AssessmentLevel_HydraulicBoundaryCalculationUncalculated_AssessmentLevelNaN() + { + // Setup + var input = new PipingInput(new GeneralPipingInput()); + var derivedInput = new DerivedPipingInput(input); + + input.HydraulicBoundaryLocation = new HydraulicBoundaryLocation(0, string.Empty, 0.0, 0.0); + + // Call + var calculatedAssesmentLevel = derivedInput.AssessmentLevel; + + // Assert + Assert.IsNaN(calculatedAssesmentLevel); + } + + [Test] public void PiezometricHeadExit_ValidInput_SetsParametersForCalculatorAndReturnsPiezometricHead() { // Setup @@ -116,19 +132,19 @@ var factory = (TestPipingSubCalculatorFactory)PipingSubCalculatorFactory.Instance; var piezometricHeadAtExitCalculator = factory.LastCreatedPiezometricHeadAtExitCalculator; - Assert.AreEqual(derivedInput.AssessmentLevel.Value, piezometricHeadAtExitCalculator.HRiver); + Assert.AreEqual(piezometricHeadAtExitCalculator.HRiver, derivedInput.AssessmentLevel.Value, PipingCalculationFactory.GetAccuracy(derivedInput.AssessmentLevel)); Assert.AreEqual(PipingSemiProbabilisticDesignValueFactory.GetPhreaticLevelExit(input).GetDesignValue(), piezometricHeadAtExitCalculator.PhiPolder, - GetAccuracy(input.PhreaticLevelExit.Mean)); + PipingCalculationFactory.GetAccuracy(input.PhreaticLevelExit.Mean)); Assert.AreEqual(PipingSemiProbabilisticDesignValueFactory.GetDampingFactorExit(input).GetDesignValue(), piezometricHeadAtExitCalculator.RExit, - GetAccuracy(input.DampingFactorExit.Mean)); + PipingCalculationFactory.GetAccuracy(input.DampingFactorExit.Mean)); } } [Test] public void PiezometricHeadExit_InputWithAssessmentLevelMissing_PiezometricHeadSetToNaN() { // Setup - var input = CreateInputWithAquiferAndCoverageLayer(1.0, 1.0); + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(1.0, 1.0); var derivedInput = new DerivedPipingInput(input); // Call @@ -142,7 +158,7 @@ public void ThicknessAquiferLayer_SoilProfileSingleAquiferAndCoverageUnderSurfaceLine_ReturnsThicknessAquiferLayer() { // Setup - var input = CreateInputWithAquiferAndCoverageLayer(); + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); var derivedInput = new DerivedPipingInput(input); // Call @@ -156,7 +172,7 @@ public void ThicknessCoverageLayer_SoilProfileSingleAquiferAndCoverageUnderSurfaceLine_ReturnsThicknessCoverageLayer() { // Setup - var input = CreateInputWithAquiferAndCoverageLayer(); + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); var derivedInput = new DerivedPipingInput(input); // Call @@ -170,7 +186,7 @@ public void ThicknessAquiferLayer_InputWithoutSoilProfile_MeansSetToNaN() { // Setup - var input = CreateInputWithAquiferAndCoverageLayer(); + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); input.SoilProfile = null; var derivedInput = new DerivedPipingInput(input); @@ -185,7 +201,7 @@ public void ThicknessCoverageLayer_InputWithoutSoilProfile_MeansSetToNaN() { // Setup - var input = CreateInputWithAquiferAndCoverageLayer(); + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); input.SoilProfile = null; var derivedInput = new DerivedPipingInput(input); @@ -200,7 +216,7 @@ public void ThicknessAquiferLayer_InputWithoutSurfaceLine_MeansSetToNaN() { // Setup - var input = CreateInputWithAquiferAndCoverageLayer(); + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); input.SurfaceLine = null; var derivedInput = new DerivedPipingInput(input); @@ -217,7 +233,7 @@ public void ThicknessCoverageLayer_InputWithoutSurfaceLine_MeansSetToNaN() { // Setup - var input = CreateInputWithAquiferAndCoverageLayer(); + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); input.SurfaceLine = null; var derivedInput = new DerivedPipingInput(input); @@ -233,44 +249,32 @@ [Test] [TestCase(1e-6)] [TestCase(1)] - public void ThicknessCoverageLayer_SoilProfileSingleAquiferAboveSurfaceLine_ThicknessCoverageLayerNaNAndLog(double deltaAboveSurfaceLine) + public void ThicknessCoverageLayer_SoilProfileSingleAquiferAboveSurfaceLine_ThicknessCoverageLayerNaN(double deltaAboveSurfaceLine) { // Setup - var input = CreateInputWithSingleAquiferLayerAboveSurfaceLine(deltaAboveSurfaceLine); + var input = PipingCalculationFactory.CreateInputWithSingleAquiferLayerAboveSurfaceLine(deltaAboveSurfaceLine); var derivedInput = new DerivedPipingInput(input); // Call - LognormalDistribution thicknessCoverageLayer = null; - Action call = () => thicknessCoverageLayer = derivedInput.ThicknessCoverageLayer; + LognormalDistribution thicknessCoverageLayer = derivedInput.ThicknessCoverageLayer; // Assert - var messages = new[] - { - Resources.PipingInputSynchronizer_UpdateThicknessCoverageLayer_Cannot_determine_thickness_coverage_layer - }; - TestHelper.AssertLogMessagesAreGenerated(call, messages, 1); Assert.IsNaN(thicknessCoverageLayer.Mean); } [Test] [TestCase(1e-6)] [TestCase(1)] - public void ThicknessAquiferLayer_SoilProfileSingleAquiferAboveSurfaceLine_ThicknessCoverageLayerNaNAndLog(double deltaAboveSurfaceLine) + public void ThicknessAquiferLayer_SoilProfileSingleAquiferAboveSurfaceLine_ThicknessCoverageLayerNaN(double deltaAboveSurfaceLine) { // Setup - var input = CreateInputWithSingleAquiferLayerAboveSurfaceLine(deltaAboveSurfaceLine); + var input = PipingCalculationFactory.CreateInputWithSingleAquiferLayerAboveSurfaceLine(deltaAboveSurfaceLine); var derivedInput = new DerivedPipingInput(input); // Call - LognormalDistribution thicknessAquiferLayer = null; - Action call = () => thicknessAquiferLayer = derivedInput.ThicknessAquiferLayer; + LognormalDistribution thicknessAquiferLayer = derivedInput.ThicknessAquiferLayer; // Assert - var messages = new[] - { - Resources.PipingInputSynchronizer_UpdateThicknessAquiferLayer_Cannot_determine_thickness_aquifer_layer, - }; - TestHelper.AssertLogMessagesAreGenerated(call, messages, 1); Assert.IsNaN(thicknessAquiferLayer.Mean); } @@ -279,7 +283,7 @@ { // Setup double expectedThickness; - var input = CreateInputWithMultipleAquiferLayersUnderSurfaceLine(out expectedThickness); + var input = PipingCalculationFactory.CreateInputWithMultipleAquiferLayersUnderSurfaceLine(out expectedThickness); var derivedInput = new DerivedPipingInput(input); // Call @@ -293,7 +297,7 @@ public void ThicknessAquiferLayer_MeanSetExitPointSetToNaN_ThicknessAquiferLayerNaN() { // Setup - var input = CreateInputWithAquiferAndCoverageLayer(); + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); input.ExitPointL = (RoundedDouble) double.NaN; var derivedInput = new DerivedPipingInput(input); @@ -307,52 +311,40 @@ } [Test] - public void ThicknessAquiferLayer_MeanSetExitPointSetBeyondSurfaceLine_ThicknessAquiferLayerNaNAndLog() + public void ThicknessAquiferLayer_MeanSetExitPointSetBeyondSurfaceLine_ThicknessAquiferLayerNaN() { // Setup - var input = CreateInputWithAquiferAndCoverageLayer(); + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); input.ExitPointL = (RoundedDouble) 3.0; var derivedInput = new DerivedPipingInput(input); // Call - LognormalDistribution thicknessAquiferLayer = null; - Action call = () => thicknessAquiferLayer = derivedInput.ThicknessAquiferLayer; + LognormalDistribution thicknessAquiferLayer = derivedInput.ThicknessAquiferLayer; // Assert - var messages = new[] - { - Resources.PipingInputSynchronizer_UpdateThicknessAquiferLayer_Cannot_determine_thickness_aquifer_layer, - }; - TestHelper.AssertLogMessagesAreGenerated(call, messages, 1); Assert.IsNaN(thicknessAquiferLayer.Mean); } [Test] - public void ThicknessCoverageLayer_MeanSetExitPointSetBeyondSurfaceLine_ThicknessAquiferLayerNaNAndLog() + public void ThicknessCoverageLayer_MeanSetExitPointSetBeyondSurfaceLine_ThicknessAquiferLayerNaN() { // Setup - var input = CreateInputWithAquiferAndCoverageLayer(); + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); input.ExitPointL = (RoundedDouble)3.0; var derivedInput = new DerivedPipingInput(input); // Call - LognormalDistribution thicknessCoverageLayer = null; - Action call = () => thicknessCoverageLayer = derivedInput.ThicknessCoverageLayer; + LognormalDistribution thicknessCoverageLayer = derivedInput.ThicknessCoverageLayer; // Assert - var messages = new[] - { - Resources.PipingInputSynchronizer_UpdateThicknessCoverageLayer_Cannot_determine_thickness_coverage_layer - }; - TestHelper.AssertLogMessagesAreGenerated(call, messages, 1); Assert.IsNaN(thicknessCoverageLayer.Mean); } [Test] public void ThicknessCoverageLayer_MeanSetSoilProfileSetToNull_ThicknessCoverageLayerNaN() { // Setup - var input = CreateInputWithAquiferAndCoverageLayer(); + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); input.ThicknessCoverageLayer.Mean = new RoundedDouble(2, new Random(21).NextDouble() + 1); var derivedInput = new DerivedPipingInput(input); @@ -368,10 +360,10 @@ } [Test] - public void ThicknessCoverageLayer_ProfileWithoutAquiferLayer_ThicknessCoverageLayerNaNAndLog() + public void ThicknessCoverageLayer_ProfileWithoutAquiferLayer_ThicknessCoverageLayerNaN() { // Setup - var input = CreateInputWithAquiferAndCoverageLayer(); + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); var derivedInput = new DerivedPipingInput(input); input.SoilProfile = new PipingSoilProfile(String.Empty, 0, new[] { @@ -382,23 +374,17 @@ }, 0); // Call - LognormalDistribution thicknessCoverageLayer = null; - Action call = () => thicknessCoverageLayer = derivedInput.ThicknessCoverageLayer; + LognormalDistribution thicknessCoverageLayer = derivedInput.ThicknessCoverageLayer; // Assert - var messages = new[] - { - Resources.PipingInputSynchronizer_UpdateThicknessCoverageLayer_Cannot_determine_thickness_coverage_layer - }; - TestHelper.AssertLogMessagesAreGenerated(call, messages, 1); Assert.IsNaN(thicknessCoverageLayer.Mean); } [Test] - public void ThicknessAquiferLayer_ProfileWithoutAquiferLayer_ThicknessAquiferLayerNaNAndLog() + public void ThicknessAquiferLayer_ProfileWithoutAquiferLayer_ThicknessAquiferLayerNaN() { // Setup - var input = CreateInputWithAquiferAndCoverageLayer(); + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); var derivedInput = new DerivedPipingInput(input); input.SoilProfile = new PipingSoilProfile(String.Empty, 0, new[] { @@ -409,23 +395,17 @@ }, 0); // Call - LognormalDistribution thicknessAquiferLayer = null; - Action call = () => thicknessAquiferLayer = derivedInput.ThicknessAquiferLayer; + LognormalDistribution thicknessAquiferLayer = derivedInput.ThicknessAquiferLayer; // Assert - var messages = new[] - { - Resources.PipingInputSynchronizer_UpdateThicknessAquiferLayer_Cannot_determine_thickness_aquifer_layer, - }; - TestHelper.AssertLogMessagesAreGenerated(call, messages, 1); Assert.IsNaN(thicknessAquiferLayer.Mean); } [Test] public void ThicknessAquiferLayer_SoilProfileSingleAquiferUnderSurfaceLine_ThicknessAquiferLayerMeanSet() { // Setup - var input = CreateInputWithAquiferAndCoverageLayer(); + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); var derivedInput = new DerivedPipingInput(input); // Call @@ -440,7 +420,7 @@ { // Setup double expectedThickness; - var input = CreateInputWithMultipleAquiferLayersUnderSurfaceLine(out expectedThickness); + var input = PipingCalculationFactory.CreateInputWithMultipleAquiferLayersUnderSurfaceLine(out expectedThickness); var derivedInput = new DerivedPipingInput(input); // Call @@ -454,7 +434,7 @@ public void ThicknessAquiferLayer_MeanSetSoilProfileSetToNull_ThicknessAquiferLayerNaN() { // Setup - var input = CreateInputWithAquiferAndCoverageLayer(); + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); var derivedInput = new DerivedPipingInput(input); input.SoilProfile = null; @@ -467,10 +447,10 @@ } [Test] - public void ThicknessAquiferLayer_InputResultsInZeroAquiferThickness_ThicknessAquiferLayerNaNAndLog() + public void ThicknessAquiferLayer_InputResultsInZeroAquiferThickness_ThicknessAquiferLayerNaN() { // Setup - var input = CreateInputWithAquiferAndCoverageLayer(); + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); var derivedInput = new DerivedPipingInput(input); input.SoilProfile = new PipingSoilProfile(String.Empty, 0, new[] { @@ -485,20 +465,17 @@ }, 0); // Call - LognormalDistribution thicknessAquiferLayer = null; - Action call = () => thicknessAquiferLayer = derivedInput.ThicknessAquiferLayer; + LognormalDistribution thicknessAquiferLayer = derivedInput.ThicknessAquiferLayer; // Assert - var message = Resources.PipingInputSynchronizer_UpdateThicknessAquiferLayer_Cannot_determine_thickness_aquifer_layer; - TestHelper.AssertLogMessageIsGenerated(call, message, 1); Assert.IsNaN(thicknessAquiferLayer.Mean); } [Test] - public void ThicknessCoverageLayer_InputResultsInZeroCoverageThickness_ThicknessCoverageLayerNaNAndLog() + public void ThicknessCoverageLayer_InputResultsInZeroCoverageThickness_ThicknessCoverageLayerNaN() { // Setup - var input = CreateInputWithAquiferAndCoverageLayer(); + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); var derivedInput = new DerivedPipingInput(input); input.SoilProfile = new PipingSoilProfile(String.Empty, 0, new[] { @@ -513,20 +490,17 @@ }, 0); // Call - LognormalDistribution thicknessCoverageLayer = null; - Action call = () => thicknessCoverageLayer = derivedInput.ThicknessCoverageLayer; + LognormalDistribution thicknessCoverageLayer = derivedInput.ThicknessCoverageLayer; // Assert - var message = Resources.PipingInputSynchronizer_UpdateThicknessCoverageLayer_Cannot_determine_thickness_coverage_layer; - TestHelper.AssertLogMessageIsGenerated(call, message, 1); Assert.IsNaN(thicknessCoverageLayer.Mean); } [Test] public void ThicknessAquiferLayer_SurfaceLineHalfWayProfileLayer_ThicknessSetToLayerHeightUnderSurfaceLine() { // Setup - var input = CreateInputWithAquiferAndCoverageLayer(); + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); var derivedInput = new DerivedPipingInput(input); input.SoilProfile = new PipingSoilProfile(String.Empty, 0, new[] { @@ -547,103 +521,68 @@ Assert.AreEqual(0.5, thicknessAquiferLayer.Mean.Value); } - private static PipingInput CreateInputWithAquiferAndCoverageLayer(double thicknessAquiferLayer = 1.0, double thicknessCoverageLayer = 2.0) + [Test] + public void SeepageLength_ValidData_ReturnsSeepageLength() { - var surfaceLine = new RingtoetsPipingSurfaceLine(); - surfaceLine.SetGeometry(new[] - { - new Point3D(0, 0, thicknessCoverageLayer), - new Point3D(1.0, 0, thicknessCoverageLayer) - }); - var soilProfile = new PipingSoilProfile(String.Empty, -thicknessAquiferLayer, new[] - { - new PipingSoilLayer(thicknessCoverageLayer) - { - IsAquifer = false - }, - new PipingSoilLayer(0.0) - { - IsAquifer = true - } - }, 0); + // Setup + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); + var derivedInput = new DerivedPipingInput(input); - return new PipingInput(new GeneralPipingInput()) - { - SurfaceLine = surfaceLine, - SoilProfile = soilProfile, - ExitPointL = (RoundedDouble)0.5 - }; + // Call + var seepageLength = derivedInput.SeepageLength; + + // Assert + Assert.AreEqual(0.5, seepageLength.Mean.Value); + Assert.AreEqual(0.05, seepageLength.StandardDeviation.Value); } - private static PipingInput CreateInputWithSingleAquiferLayerAboveSurfaceLine(double deltaAboveSurfaceLine) + [Test] + public void SeepageLength_ExitPointSetBeyondEntryPoint_SeepageLengthNaN() { - var surfaceLine = new RingtoetsPipingSurfaceLine(); - var surfaceLineTopLevel = 2.0; - surfaceLine.SetGeometry(new[] - { - new Point3D(0, 0, surfaceLineTopLevel), - new Point3D(1.0, 0, surfaceLineTopLevel), - }); - var soilProfile = new PipingSoilProfile(String.Empty, 0, new[] - { - new PipingSoilLayer(surfaceLineTopLevel + deltaAboveSurfaceLine + 2) - { - IsAquifer = false - }, - new PipingSoilLayer(surfaceLineTopLevel + deltaAboveSurfaceLine + 1) - { - IsAquifer = true - }, - new PipingSoilLayer(surfaceLineTopLevel + deltaAboveSurfaceLine) - { - IsAquifer = false - } - }, 0); - var input = new PipingInput(new GeneralPipingInput()) - { - SurfaceLine = surfaceLine, - SoilProfile = soilProfile, - ExitPointL = (RoundedDouble)0.5 - }; - return input; + // Setup + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); + input.ExitPointL = (RoundedDouble) 2; + input.EntryPointL = (RoundedDouble) 3; + var derivedInput = new DerivedPipingInput(input); + + // Call + var seepageLength = derivedInput.SeepageLength; + + // Assert + Assert.IsNaN(seepageLength.Mean); + Assert.IsNaN(seepageLength.StandardDeviation); } - private static PipingInput CreateInputWithMultipleAquiferLayersUnderSurfaceLine(out double expectedThickness) + [Test] + public void SeepageLength_EntryPointNaN_SeepageLengthNaN() { - var surfaceLine = new RingtoetsPipingSurfaceLine(); - surfaceLine.SetGeometry(new[] - { - new Point3D(0, 0, 3.3), - new Point3D(1.0, 0, 3.3), - }); - var soilProfile = new PipingSoilProfile(String.Empty, 0, new[] - { - new PipingSoilLayer(4.3) - { - IsAquifer = false - }, - new PipingSoilLayer(3.3) - { - IsAquifer = true - }, - new PipingSoilLayer(1.1) - { - IsAquifer = true - } - }, 0); - var input = new PipingInput(new GeneralPipingInput()) - { - SurfaceLine = surfaceLine, - SoilProfile = soilProfile, - ExitPointL = (RoundedDouble)0.5 - }; - expectedThickness = 2.2; - return input; + // Setup + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); + input.EntryPointL = (RoundedDouble)double.NaN; + var derivedInput = new DerivedPipingInput(input); + + // Call + var seepageLength = derivedInput.SeepageLength; + + // Assert + Assert.IsNaN(seepageLength.Mean); + Assert.IsNaN(seepageLength.StandardDeviation); } - private static double GetAccuracy(RoundedDouble roundedDouble) + [Test] + public void SeepageLength_ExitPointNaN_SeepageLengthNaN() { - return Math.Pow(10.0, -roundedDouble.NumberOfDecimalPlaces); + // Setup + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); + input.ExitPointL = (RoundedDouble)double.NaN; + var derivedInput = new DerivedPipingInput(input); + + // Call + var seepageLength = derivedInput.SeepageLength; + + // Assert + Assert.IsNaN(seepageLength.Mean); + Assert.IsNaN(seepageLength.StandardDeviation); } } -} +} \ No newline at end of file Index: Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/PipingInputTest.cs =================================================================== diff -u -rba840423eb72501cbad89c1a6d88642531efa8d5 -r420c266df87245b9471d3794ef5043ee89cb482a --- Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/PipingInputTest.cs (.../PipingInputTest.cs) (revision ba840423eb72501cbad89c1a6d88642531efa8d5) +++ Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/PipingInputTest.cs (.../PipingInputTest.cs) (revision 420c266df87245b9471d3794ef5043ee89cb482a) @@ -5,8 +5,13 @@ using Core.Common.Base.Geometry; using Core.Common.TestUtil; using NUnit.Framework; +using Ringtoets.HydraRing.Data; using Ringtoets.Piping.Data.Probabilistics; using Ringtoets.Piping.Data.Properties; +using Ringtoets.Piping.Data.TestUtil; +using Ringtoets.Piping.KernelWrapper.SubCalculator; +using Ringtoets.Piping.KernelWrapper.TestUtil; +using Ringtoets.Piping.KernelWrapper.TestUtil.SubCalculator; using Ringtoets.Piping.Primitives; namespace Ringtoets.Piping.Data.Test @@ -341,5 +346,449 @@ Assert.AreEqual(3, originalDarcyPermeability.StandardDeviation.NumberOfDecimalPlaces); Assert.AreEqual(859.490, originalDarcyPermeability.StandardDeviation.Value); } + + [Test] + public void AssessmentLevel_InputHasNewHydraulicBoundaryLocationSet_AssessmentLevelUpdated() + { + // Setup + var input = new PipingInput(new GeneralPipingInput()); + + double testLevel = new Random(21).NextDouble(); + + input.HydraulicBoundaryLocation = new HydraulicBoundaryLocation(0, string.Empty, 0.0, 0.0) + { + DesignWaterLevel = testLevel + }; + + // Call + var calculatedAssesmentLevel = input.AssessmentLevel; + + // Assert + Assert.AreEqual(new RoundedDouble(2, testLevel), calculatedAssesmentLevel); + } + + [Test] + public void PiezometricHeadExit_ValidInput_SetsParametersForCalculatorAndReturnsPiezometricHead() + { + // Setup + var input = new PipingInput(new GeneralPipingInput()); + + using (new PipingSubCalculatorFactoryConfig()) + { + // Call + var piezometricHead = input.PiezometricHeadExit; + + // Assert + Assert.AreEqual(2, piezometricHead.NumberOfDecimalPlaces); + Assert.IsFalse(double.IsNaN(piezometricHead)); + + var factory = (TestPipingSubCalculatorFactory)PipingSubCalculatorFactory.Instance; + var piezometricHeadAtExitCalculator = factory.LastCreatedPiezometricHeadAtExitCalculator; + + Assert.AreEqual(piezometricHeadAtExitCalculator.HRiver, input.AssessmentLevel.Value, PipingCalculationFactory.GetAccuracy(input.AssessmentLevel)); + Assert.AreEqual(PipingSemiProbabilisticDesignValueFactory.GetPhreaticLevelExit(input).GetDesignValue(), piezometricHeadAtExitCalculator.PhiPolder, + PipingCalculationFactory.GetAccuracy(input.PhreaticLevelExit.Mean)); + Assert.AreEqual(PipingSemiProbabilisticDesignValueFactory.GetDampingFactorExit(input).GetDesignValue(), piezometricHeadAtExitCalculator.RExit, + PipingCalculationFactory.GetAccuracy(input.DampingFactorExit.Mean)); + } + } + + [Test] + public void PiezometricHeadExit_InputWithAssessmentLevelMissing_PiezometricHeadSetToNaN() + { + // Setup + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(1.0, 1.0); + + // Call + var piezometricHead = input.PiezometricHeadExit; + + // Assert + Assert.IsNaN(piezometricHead); + } + + [Test] + public void ThicknessAquiferLayer_SoilProfileSingleAquiferAndCoverageUnderSurfaceLine_ReturnsThicknessAquiferLayer() + { + // Setup + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); + + // Call + var thicknessAquiferLayer = input.ThicknessAquiferLayer; + + // Assert + Assert.AreEqual(1.0, thicknessAquiferLayer.Mean.Value); + } + + [Test] + public void ThicknessAquiferLayer_InputWithoutSoilProfile_MeansSetToNaN() + { + // Setup + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); + input.SoilProfile = null; + + // Call + var thicknessAquiferLayer = input.ThicknessAquiferLayer; + + // Assert + Assert.IsNaN(thicknessAquiferLayer.Mean); + } + + [Test] + public void ThicknessCoverageLayer_InputWithoutSoilProfile_MeansSetToNaN() + { + // Setup + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); + input.SoilProfile = null; + + // Call + var thicknessCoverageLayer = input.ThicknessCoverageLayer; + + // Assert + Assert.IsNaN(thicknessCoverageLayer.Mean); + } + + [Test] + public void ThicknessAquiferLayer_InputWithoutSurfaceLine_MeansSetToNaN() + { + // Setup + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); + input.SurfaceLine = null; + + // Call + LognormalDistribution thicknessAquiferLayer = input.ThicknessAquiferLayer; + + // Assert + Assert.IsNaN(thicknessAquiferLayer.Mean); + } + + [Test] + public void ThicknessCoverageLayer_InputWithoutSurfaceLine_MeansSetToNaN() + { + // Setup + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); + input.SurfaceLine = null; + + // Call + LognormalDistribution thicknessCoverageLayer = input.ThicknessCoverageLayer; + + // Assert + Assert.IsNaN(thicknessCoverageLayer.Mean); + } + + [Test] + [TestCase(1e-6)] + [TestCase(1)] + public void ThicknessCoverageLayer_SoilProfileSingleAquiferAboveSurfaceLine_ThicknessCoverageLayerNaN(double deltaAboveSurfaceLine) + { + // Setup + var input = PipingCalculationFactory.CreateInputWithSingleAquiferLayerAboveSurfaceLine(deltaAboveSurfaceLine); + + // Call + LognormalDistribution thicknessCoverageLayer = input.ThicknessCoverageLayer; + + // Assert + Assert.IsNaN(thicknessCoverageLayer.Mean); + } + + [Test] + [TestCase(1e-6)] + [TestCase(1)] + public void ThicknessAquiferLayer_SoilProfileSingleAquiferAboveSurfaceLine_ThicknessCoverageLayerNaN(double deltaAboveSurfaceLine) + { + // Setup + var input = PipingCalculationFactory.CreateInputWithSingleAquiferLayerAboveSurfaceLine(deltaAboveSurfaceLine); + + // Call + LognormalDistribution thicknessAquiferLayer = input.ThicknessAquiferLayer; + + // Assert + Assert.IsNaN(thicknessAquiferLayer.Mean); + } + + [Test] + public void ThicknessAquiferLayer_SoilProfileMultipleAquiferUnderSurfaceLine_AquiferMeanSetToTopAquiferThickness() + { + // Setup + double expectedThickness; + var input = PipingCalculationFactory.CreateInputWithMultipleAquiferLayersUnderSurfaceLine(out expectedThickness); + + // Call + LognormalDistribution thicknessAquiferLayer = input.ThicknessAquiferLayer; + + // Assert + Assert.AreEqual(expectedThickness, thicknessAquiferLayer.Mean, 1e-8); + } + + [Test] + public void ThicknessAquiferLayer_MeanSetExitPointSetToNaN_ThicknessAquiferLayerNaN() + { + // Setup + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); + input.ExitPointL = (RoundedDouble)double.NaN; + + // Call + LognormalDistribution thicknessAquiferLayer = input.ThicknessAquiferLayer; + + // Assert + Assert.IsNaN(thicknessAquiferLayer.Mean); + } + + [Test] + public void ThicknessAquiferLayer_MeanSetExitPointSetBeyondSurfaceLine_ThicknessAquiferLayerNaN() + { + // Setup + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); + input.ExitPointL = (RoundedDouble)3.0; + + // Call + LognormalDistribution thicknessAquiferLayer = input.ThicknessAquiferLayer; + + // Assert + Assert.IsNaN(thicknessAquiferLayer.Mean); + } + + [Test] + public void ThicknessCoverageLayer_MeanSetExitPointSetBeyondSurfaceLine_ThicknessAquiferLayerNaN() + { + // Setup + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); + input.ExitPointL = (RoundedDouble)3.0; + + // Call + LognormalDistribution thicknessCoverageLayer = input.ThicknessCoverageLayer; + + // Assert + Assert.IsNaN(thicknessCoverageLayer.Mean); + } + + [Test] + public void ThicknessCoverageLayer_MeanSetSoilProfileSetToNull_ThicknessCoverageLayerNaN() + { + // Setup + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); + input.ThicknessCoverageLayer.Mean = new RoundedDouble(2, new Random(21).NextDouble() + 1); + + input.SoilProfile = null; + + // Call + LognormalDistribution thicknessCoverageLayer = input.ThicknessCoverageLayer; + + // Assert + Assert.IsNaN(thicknessCoverageLayer.Mean); + } + + [Test] + public void ThicknessCoverageLayer_ProfileWithoutAquiferLayer_ThicknessCoverageLayerNaN() + { + // Setup + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); + input.SoilProfile = new PipingSoilProfile(String.Empty, 0, new[] + { + new PipingSoilLayer(2.0) + { + IsAquifer = false + } + }, 0); + + // Call + LognormalDistribution thicknessCoverageLayer = input.ThicknessCoverageLayer; + + // Assert + Assert.IsNaN(thicknessCoverageLayer.Mean); + } + + [Test] + public void ThicknessAquiferLayer_ProfileWithoutAquiferLayer_ThicknessAquiferLayerNaN() + { + // Setup + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); + input.SoilProfile = new PipingSoilProfile(String.Empty, 0, new[] + { + new PipingSoilLayer(2.0) + { + IsAquifer = false + } + }, 0); + + // Call + LognormalDistribution thicknessAquiferLayer = input.ThicknessAquiferLayer; + + // Assert + Assert.IsNaN(thicknessAquiferLayer.Mean); + } + + [Test] + public void ThicknessAquiferLayer_SoilProfileSingleAquiferUnderSurfaceLine_ThicknessAquiferLayerMeanSet() + { + // Setup + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); + + // Call + var thicknessAquiferLayer = input.ThicknessAquiferLayer; + + // Assert + Assert.AreEqual(1.0, thicknessAquiferLayer.Mean.Value); + } + + [Test] + public void ThicknessAquiferLayer_SoilProfileMultipleAquiferUnderSurfaceLine_MeanSetToTopAquiferThickness() + { + // Setup + double expectedThickness; + var input = PipingCalculationFactory.CreateInputWithMultipleAquiferLayersUnderSurfaceLine(out expectedThickness); + + // Call + var thicknessAquiferLayer = input.ThicknessAquiferLayer; + + // Assert + Assert.AreEqual(expectedThickness, thicknessAquiferLayer.Mean, 1e-8); + } + + [Test] + public void ThicknessAquiferLayer_MeanSetSoilProfileSetToNull_ThicknessAquiferLayerNaN() + { + // Setup + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); + + input.SoilProfile = null; + + // Call + var thicknessAquiferLayer = input.ThicknessAquiferLayer; + + // Assert + Assert.IsNaN(thicknessAquiferLayer.Mean); + } + + [Test] + public void ThicknessAquiferLayer_InputResultsInZeroAquiferThickness_ThicknessAquiferLayerNaN() + { + // Setup + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); + input.SoilProfile = new PipingSoilProfile(String.Empty, 0, new[] + { + new PipingSoilLayer(2.0) + { + IsAquifer = false + }, + new PipingSoilLayer(0.0) + { + IsAquifer = true + } + }, 0); + + // Call + LognormalDistribution thicknessAquiferLayer = input.ThicknessAquiferLayer; + + // Assert + Assert.IsNaN(thicknessAquiferLayer.Mean); + } + + [Test] + public void ThicknessCoverageLayer_InputResultsInZeroCoverageThickness_ThicknessCoverageLayerNaN() + { + // Setup + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); + input.SoilProfile = new PipingSoilProfile(String.Empty, 0, new[] + { + new PipingSoilLayer(2.0) + { + IsAquifer = false + }, + new PipingSoilLayer(2.0) + { + IsAquifer = true + } + }, 0); + + // Call + LognormalDistribution thicknessCoverageLayer = input.ThicknessCoverageLayer; + + // Assert + Assert.IsNaN(thicknessCoverageLayer.Mean); + } + + [Test] + public void ThicknessAquiferLayer_SurfaceLineHalfWayProfileLayer_ThicknessSetToLayerHeightUnderSurfaceLine() + { + // Setup + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); + input.SoilProfile = new PipingSoilProfile(String.Empty, 0, new[] + { + new PipingSoilLayer(2.5) + { + IsAquifer = true + }, + new PipingSoilLayer(1.5) + { + IsAquifer = true + } + }, 0); + + // Call + var thicknessAquiferLayer = input.ThicknessAquiferLayer; + + // Assert + Assert.AreEqual(0.5, thicknessAquiferLayer.Mean.Value); + } + + [Test] + public void SeepageLength_ValidData_ReturnsSeepageLength() + { + // Setup + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); + + // Call + var seepageLength = input.SeepageLength; + + // Assert + Assert.AreEqual(0.5, seepageLength.Mean.Value); + Assert.AreEqual(0.05, seepageLength.StandardDeviation.Value); + } + + [Test] + public void SeepageLength_ExitPointSetBeyondEntryPoint_SeepageLengthNaN() + { + // Setup + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); + input.ExitPointL = (RoundedDouble)2; + input.EntryPointL = (RoundedDouble)3; + + // Call + var seepageLength = input.SeepageLength; + + // Assert + Assert.IsNaN(seepageLength.Mean); + Assert.IsNaN(seepageLength.StandardDeviation); + } + + [Test] + public void SeepageLength_EntryPointNaN_SeepageLengthNaN() + { + // Setup + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); + input.EntryPointL = (RoundedDouble)double.NaN; + + // Call + var seepageLength = input.SeepageLength; + + // Assert + Assert.IsNaN(seepageLength.Mean); + Assert.IsNaN(seepageLength.StandardDeviation); + } + + [Test] + public void SeepageLength_ExitPointNaN_SeepageLengthNaN() + { + // Setup + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); + input.ExitPointL = (RoundedDouble)double.NaN; + + // Call + var seepageLength = input.SeepageLength; + + // Assert + Assert.IsNaN(seepageLength.Mean); + Assert.IsNaN(seepageLength.StandardDeviation); + } } } \ No newline at end of file Index: Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/Ringtoets.Piping.Data.Test.csproj =================================================================== diff -u -rba840423eb72501cbad89c1a6d88642531efa8d5 -r420c266df87245b9471d3794ef5043ee89cb482a --- Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/Ringtoets.Piping.Data.Test.csproj (.../Ringtoets.Piping.Data.Test.csproj) (revision ba840423eb72501cbad89c1a6d88642531efa8d5) +++ Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/Ringtoets.Piping.Data.Test.csproj (.../Ringtoets.Piping.Data.Test.csproj) (revision 420c266df87245b9471d3794ef5043ee89cb482a) @@ -112,6 +112,10 @@ {14C6F716-64E2-4BC4-A1EF-05865FCEFA4C} Ringtoets.Piping.Primitives + + {955E574D-67CE-4347-AA6B-7DF8A04ED754} + Ringtoets.Piping.Data.TestUtil + {27E0A5C9-3ABF-426A-A3DA-7D0B83A218C8} Ringtoets.Piping.KernelWrapper.TestUtil Index: Ringtoets/Piping/test/Ringtoets.Piping.Data.TestUtil/PipingCalculationFactory.cs =================================================================== diff -u -rba840423eb72501cbad89c1a6d88642531efa8d5 -r420c266df87245b9471d3794ef5043ee89cb482a --- Ringtoets/Piping/test/Ringtoets.Piping.Data.TestUtil/PipingCalculationFactory.cs (.../PipingCalculationFactory.cs) (revision ba840423eb72501cbad89c1a6d88642531efa8d5) +++ Ringtoets/Piping/test/Ringtoets.Piping.Data.TestUtil/PipingCalculationFactory.cs (.../PipingCalculationFactory.cs) (revision 420c266df87245b9471d3794ef5043ee89cb482a) @@ -15,7 +15,6 @@ public static PipingCalculation CreateCalculationWithValidInput() { - var random = new Random(22); var bottom = 1.12; var top = 10.56; var soilProfile = new PipingSoilProfile(String.Empty, 0.0, new[] @@ -93,5 +92,104 @@ } }; } + + public static PipingInput CreateInputWithAquiferAndCoverageLayer(double thicknessAquiferLayer = 1.0, double thicknessCoverageLayer = 2.0) + { + var surfaceLine = new RingtoetsPipingSurfaceLine(); + surfaceLine.SetGeometry(new[] + { + new Point3D(0, 0, thicknessCoverageLayer), + new Point3D(1.0, 0, thicknessCoverageLayer) + }); + var soilProfile = new PipingSoilProfile(String.Empty, -thicknessAquiferLayer, new[] + { + new PipingSoilLayer(thicknessCoverageLayer) + { + IsAquifer = false + }, + new PipingSoilLayer(0.0) + { + IsAquifer = true + } + }, 0); + + return new PipingInput(new GeneralPipingInput()) + { + SurfaceLine = surfaceLine, + SoilProfile = soilProfile, + ExitPointL = (RoundedDouble)0.5 + }; + } + + public static PipingInput CreateInputWithSingleAquiferLayerAboveSurfaceLine(double deltaAboveSurfaceLine) + { + var surfaceLine = new RingtoetsPipingSurfaceLine(); + var surfaceLineTopLevel = 2.0; + surfaceLine.SetGeometry(new[] + { + new Point3D(0, 0, surfaceLineTopLevel), + new Point3D(1.0, 0, surfaceLineTopLevel), + }); + var soilProfile = new PipingSoilProfile(String.Empty, 0, new[] + { + new PipingSoilLayer(surfaceLineTopLevel + deltaAboveSurfaceLine + 2) + { + IsAquifer = false + }, + new PipingSoilLayer(surfaceLineTopLevel + deltaAboveSurfaceLine + 1) + { + IsAquifer = true + }, + new PipingSoilLayer(surfaceLineTopLevel + deltaAboveSurfaceLine) + { + IsAquifer = false + } + }, 0); + var input = new PipingInput(new GeneralPipingInput()) + { + SurfaceLine = surfaceLine, + SoilProfile = soilProfile, + ExitPointL = (RoundedDouble)0.5 + }; + return input; + } + + public static PipingInput CreateInputWithMultipleAquiferLayersUnderSurfaceLine(out double expectedThickness) + { + var surfaceLine = new RingtoetsPipingSurfaceLine(); + surfaceLine.SetGeometry(new[] + { + new Point3D(0, 0, 3.3), + new Point3D(1.0, 0, 3.3), + }); + var soilProfile = new PipingSoilProfile(String.Empty, 0, new[] + { + new PipingSoilLayer(4.3) + { + IsAquifer = false + }, + new PipingSoilLayer(3.3) + { + IsAquifer = true + }, + new PipingSoilLayer(1.1) + { + IsAquifer = true + } + }, 0); + var input = new PipingInput(new GeneralPipingInput()) + { + SurfaceLine = surfaceLine, + SoilProfile = soilProfile, + ExitPointL = (RoundedDouble)0.5 + }; + expectedThickness = 2.2; + return input; + } + + public static double GetAccuracy(RoundedDouble roundedDouble) + { + return Math.Pow(10.0, -roundedDouble.NumberOfDecimalPlaces); + } } } \ No newline at end of file Index: Ringtoets/Piping/test/Ringtoets.Piping.KernelWrapper.TestUtil.Test/SubCalculator/EffectiveThicknessCalculatorStubTest.cs =================================================================== diff -u -r89488cc05b12fd5720cd28a4eeeb001dc9b1456d -r420c266df87245b9471d3794ef5043ee89cb482a --- Ringtoets/Piping/test/Ringtoets.Piping.KernelWrapper.TestUtil.Test/SubCalculator/EffectiveThicknessCalculatorStubTest.cs (.../EffectiveThicknessCalculatorStubTest.cs) (revision 89488cc05b12fd5720cd28a4eeeb001dc9b1456d) +++ Ringtoets/Piping/test/Ringtoets.Piping.KernelWrapper.TestUtil.Test/SubCalculator/EffectiveThicknessCalculatorStubTest.cs (.../EffectiveThicknessCalculatorStubTest.cs) (revision 420c266df87245b9471d3794ef5043ee89cb482a) @@ -19,7 +19,7 @@ Assert.IsNull(stub.SurfaceLine); Assert.AreEqual(0, stub.VolumicWeightOfWater); - Assert.AreEqual(0, stub.EffectiveHeight); + Assert.AreEqual(0.1, stub.EffectiveHeight); Assert.AreEqual(0, stub.EffectiveStress); } Index: Ringtoets/Piping/test/Ringtoets.Piping.KernelWrapper.TestUtil/SubCalculator/EffectiveThicknessCalculatorStub.cs =================================================================== diff -u -r89488cc05b12fd5720cd28a4eeeb001dc9b1456d -r420c266df87245b9471d3794ef5043ee89cb482a --- Ringtoets/Piping/test/Ringtoets.Piping.KernelWrapper.TestUtil/SubCalculator/EffectiveThicknessCalculatorStub.cs (.../EffectiveThicknessCalculatorStub.cs) (revision 89488cc05b12fd5720cd28a4eeeb001dc9b1456d) +++ Ringtoets/Piping/test/Ringtoets.Piping.KernelWrapper.TestUtil/SubCalculator/EffectiveThicknessCalculatorStub.cs (.../EffectiveThicknessCalculatorStub.cs) (revision 420c266df87245b9471d3794ef5043ee89cb482a) @@ -13,7 +13,14 @@ public double VolumicWeightOfWater { get; set; } public PipingProfile SoilProfile { get; set; } public PipingSurfaceLine SurfaceLine { get; set; } - public double EffectiveHeight { get; private set; } + public double EffectiveHeight + { + get + { + return 0.1; + } + } + public double EffectiveStress { get; private set; } public void Calculate() {} Index: Ringtoets/Piping/test/Ringtoets.Piping.Service.Test/PipingCalculationServiceTest.cs =================================================================== diff -u -r238411e28abf2f71dc0a5715ca940c6e87df9392 -r420c266df87245b9471d3794ef5043ee89cb482a --- Ringtoets/Piping/test/Ringtoets.Piping.Service.Test/PipingCalculationServiceTest.cs (.../PipingCalculationServiceTest.cs) (revision 238411e28abf2f71dc0a5715ca940c6e87df9392) +++ Ringtoets/Piping/test/Ringtoets.Piping.Service.Test/PipingCalculationServiceTest.cs (.../PipingCalculationServiceTest.cs) (revision 420c266df87245b9471d3794ef5043ee89cb482a) @@ -5,7 +5,9 @@ using Core.Common.TestUtil; using Deltares.WTIPiping; using NUnit.Framework; +using Rhino.Mocks; using Ringtoets.Piping.Data; +using Ringtoets.Piping.Data.Probabilistics; using Ringtoets.Piping.Data.TestUtil; using Ringtoets.Piping.KernelWrapper.SubCalculator; using Ringtoets.Piping.KernelWrapper.TestUtil; @@ -53,6 +55,32 @@ } [Test] + public void Validate_InValidCalculationInput_LogsErrorAndReturnsFalse() + { + // Setup + const string name = ""; + + var calculation = new PipingCalculation(new GeneralPipingInput(), new SemiProbabilisticPipingInput()); + calculation.Name = name; + + // Call + bool isValid = false; + Action call = () => isValid = PipingCalculationService.Validate(calculation); + + // Assert + TestHelper.AssertLogMessages(call, messages => + { + var msgs = messages.ToArray(); + Assert.AreEqual(4, msgs.Length); + StringAssert.StartsWith(String.Format("Validatie van '{0}' gestart om: ", name), msgs.First()); + StringAssert.StartsWith("Validatie mislukt: Kan de dikte van het watervoerend pakket niet afleiden op basis van de invoer.", msgs[1]); + StringAssert.StartsWith("Validatie mislukt: Kan de dikte van de deklaag niet afleiden op basis van de invoer.", msgs[2]); + StringAssert.StartsWith(String.Format("Validatie van '{0}' beëindigd om: ", name), msgs.Last()); + }); + Assert.IsFalse(isValid); + } + + [Test] public void PerformValidatedCalculation_ValidPipingCalculation_LogStartAndEndOfValidatingInputsAndCalculation() { // Setup