Index: Ringtoets/Common/src/Ringtoets.Common.Service/CalculationServiceHelper.cs =================================================================== diff -u -r3d9b418d483c122040e11a7e074d666c64e9d7b5 -r6744bc3cd2ffd54b89e8ee19c2953059ae698e80 --- Ringtoets/Common/src/Ringtoets.Common.Service/CalculationServiceHelper.cs (.../CalculationServiceHelper.cs) (revision 3d9b418d483c122040e11a7e074d666c64e9d7b5) +++ Ringtoets/Common/src/Ringtoets.Common.Service/CalculationServiceHelper.cs (.../CalculationServiceHelper.cs) (revision 6744bc3cd2ffd54b89e8ee19c2953059ae698e80) @@ -91,6 +91,18 @@ } /// + /// Logs messages as warnings. + /// + /// The messages to log. + public static void LogMessagesAsWarning(params string[] warningMessages) + { + foreach (var errorMessage in warningMessages) + { + log.Warn(errorMessage); + } + } + + /// /// Logs the begin time of the validation. /// /// The name of the object being validated. Index: Ringtoets/Piping/src/Ringtoets.Piping.Data/DerivedPipingInput.cs =================================================================== diff -u -r2363244674e6b7b97bead9a6855806420d368d80 -r6744bc3cd2ffd54b89e8ee19c2953059ae698e80 --- Ringtoets/Piping/src/Ringtoets.Piping.Data/DerivedPipingInput.cs (.../DerivedPipingInput.cs) (revision 2363244674e6b7b97bead9a6855806420d368d80) +++ Ringtoets/Piping/src/Ringtoets.Piping.Data/DerivedPipingInput.cs (.../DerivedPipingInput.cs) (revision 6744bc3cd2ffd54b89e8ee19c2953059ae698e80) @@ -20,6 +20,7 @@ // All rights reserved. using System; +using System.Collections.Generic; using System.Linq; using Core.Common.Base.Data; using Ringtoets.Common.Data.Probabilistics; @@ -264,17 +265,17 @@ private void UpdateSaturatedVolumicWeightOfCoverageLayerParameters(ShiftedLogNormalDistribution volumicWeightDistribution) { - PipingSoilLayer[] aquitardLayers = GetConsecutiveAquitardLayers(); + PipingSoilLayer[] coverageLayers = GetConsecutiveCoverageLayers(); - if (HasUniqueShiftAndDeviationSaturatedWeightDefinition(aquitardLayers)) + if (HasUniqueShiftAndDeviationSaturatedWeightDefinition(coverageLayers)) { - PipingSoilLayer topMostAquitardLayer = aquitardLayers.First(); + PipingSoilLayer topMostAquitardLayer = coverageLayers.First(); volumicWeightDistribution.Shift = (RoundedDouble) topMostAquitardLayer.BelowPhreaticLevelShift; volumicWeightDistribution.StandardDeviation = (RoundedDouble) topMostAquitardLayer.BelowPhreaticLevelDeviation; var weightedMean = new RoundedDouble(volumicWeightDistribution.Mean.NumberOfDecimalPlaces, GetWeightedMeanForVolumicWeightOfCoverageLayer( - aquitardLayers, + coverageLayers, input.StochasticSoilProfile.SoilProfile, input.SurfaceLine.GetZAtL(input.ExitPointL))); @@ -333,18 +334,33 @@ return new PipingSoilLayer[0]; } - private PipingSoilLayer[] GetConsecutiveAquitardLayers() + private PipingSoilLayer[] GetConsecutiveCoverageLayers() { RingtoetsPipingSurfaceLine surfaceLine = input.SurfaceLine; PipingSoilProfile soilProfile = input.StochasticSoilProfile != null ? input.StochasticSoilProfile.SoilProfile : null; RoundedDouble exitPointL = input.ExitPointL; + var consecutiveCoverageLayers = new PipingSoilLayer[0]; + if (surfaceLine != null && soilProfile != null && !double.IsNaN(exitPointL)) { - return soilProfile.GetConsecutiveAquitardLayersBelowLevel(surfaceLine.GetZAtL(exitPointL)).ToArray(); + PipingSoilLayer topAquifer = soilProfile + .GetConsecutiveAquiferLayersBelowLevel(surfaceLine.GetZAtL(exitPointL)) + .FirstOrDefault(); + + PipingSoilLayer[] consecutiveAquitardLayersBelowLevel = soilProfile + .GetConsecutiveAquitardLayersBelowLevel(surfaceLine.GetZAtL(exitPointL)) + .ToArray(); + + if (topAquifer != null + && consecutiveAquitardLayersBelowLevel.Any() + && topAquifer.Top < consecutiveAquitardLayersBelowLevel.First().Top) + { + consecutiveCoverageLayers = consecutiveAquitardLayersBelowLevel; + } } - return new PipingSoilLayer[0]; + return consecutiveCoverageLayers; } private bool AlmostEquals(double a, double b) Index: Ringtoets/Piping/src/Ringtoets.Piping.Service/PipingCalculationService.cs =================================================================== diff -u -rc33fbb6a840ef596c665774b609f82b948f3b512 -r6744bc3cd2ffd54b89e8ee19c2953059ae698e80 --- Ringtoets/Piping/src/Ringtoets.Piping.Service/PipingCalculationService.cs (.../PipingCalculationService.cs) (revision c33fbb6a840ef596c665774b609f82b948f3b512) +++ Ringtoets/Piping/src/Ringtoets.Piping.Service/PipingCalculationService.cs (.../PipingCalculationService.cs) (revision 6744bc3cd2ffd54b89e8ee19c2953059ae698e80) @@ -20,10 +20,14 @@ // All rights reserved. using System.Collections.Generic; +using System.Linq; +using Core.Common.Base.Data; +using log4net; using Ringtoets.Common.Service; using Ringtoets.Piping.Data; using Ringtoets.Piping.KernelWrapper; using Ringtoets.Piping.KernelWrapper.SubCalculator; +using Ringtoets.Piping.Primitives; using Ringtoets.Piping.Service.Properties; using RingtoetsCommonServiceResources = Ringtoets.Common.Service.Properties.Resources; @@ -56,6 +60,8 @@ return false; } + CalculationServiceHelper.LogMessagesAsWarning(GetInputWarnings(calculation.InputParameters).ToArray()); + var validationResults = new PipingCalculator(CreateInputFromData(calculation.InputParameters), PipingSubCalculatorFactory.Instance).Validate(); CalculationServiceHelper.LogMessagesAsError(Resources.Error_in_piping_validation_0, validationResults.ToArray()); @@ -154,11 +160,63 @@ { validationResult.Add(Resources.PipingCalculationService_ValidateInput_Cannot_determine_thickness_coverage_layer); } + + var pipingSoilProfile = inputParameters.StochasticSoilProfile.SoilProfile; + var surfaceLevel = inputParameters.SurfaceLine.GetZAtL(inputParameters.ExitPointL); + + if (pipingSoilProfile != null) + { + IEnumerable consecutiveAquiferLayersBelowLevel = pipingSoilProfile.GetConsecutiveAquiferLayersBelowLevel(surfaceLevel).ToArray(); + IEnumerable consecutiveAquitardLayersBelowLevel = pipingSoilProfile.GetConsecutiveAquitardLayersBelowLevel(surfaceLevel).ToArray(); + + var hasAquiferLayers = consecutiveAquiferLayersBelowLevel.Any(); + var hasAquitardLayers = consecutiveAquitardLayersBelowLevel.Any(); + + if (!hasAquiferLayers) + { + validationResult.Add(Resources.PipingCalculationService_ValidateInput_No_aquifer_layer_at_ExitPointL_under_SurfaceLine); + } + if (!hasAquitardLayers || (hasAquiferLayers && consecutiveAquiferLayersBelowLevel.First().Top > consecutiveAquitardLayersBelowLevel.First().Top)) + { + validationResult.Add(Resources.PipingCalculationService_ValidateInput_No_coverage_layer_at_ExitPointL_under_SurfaceLine); + } + } } + return validationResult; } + private static List GetInputWarnings(PipingInput inputParameters) + { + List warnings = new List(); + + var exitPointL = inputParameters.ExitPointL; + + var isSoilProfileMissing = inputParameters.StochasticSoilProfile == null; + var isSurfaceLineMissing = inputParameters.SurfaceLine == null; + var isExitPointLMissing = double.IsNaN(exitPointL); + + if (!isSurfaceLineMissing && !isSoilProfileMissing && !isExitPointLMissing) + { + var pipingSoilProfile = inputParameters.StochasticSoilProfile.SoilProfile; + var surfaceLevel = inputParameters.SurfaceLine.GetZAtL(exitPointL); + + IEnumerable consecutiveAquiferLayersBelowLevel = pipingSoilProfile.GetConsecutiveAquiferLayersBelowLevel(surfaceLevel); + IEnumerable consecutiveAquitardLayersBelowLevel = pipingSoilProfile.GetConsecutiveAquitardLayersBelowLevel(surfaceLevel); + if (consecutiveAquiferLayersBelowLevel.Count() > 1) + { + warnings.Add(Resources.PipingCalculationService_GetInputWarnings_Multiple_aquifer_layers_values_for_DiameterD70_and_DarcyPermeability_taken_from_top_layer); + } + if (consecutiveAquitardLayersBelowLevel.Count() > 1) + { + warnings.Add(Resources.PipingCalculationService_GetInputWarnings_Multiple_coverage_layers_values_for_saturated_weight_taken_as_weighted_mean_from_all_coverage_layers); + } + } + + return warnings; + } + private static PipingCalculatorInput CreateInputFromData(PipingInput inputParameters) { return new PipingCalculatorInput( Index: Ringtoets/Piping/src/Ringtoets.Piping.Service/Properties/Resources.Designer.cs =================================================================== diff -u -rc33fbb6a840ef596c665774b609f82b948f3b512 -r6744bc3cd2ffd54b89e8ee19c2953059ae698e80 --- Ringtoets/Piping/src/Ringtoets.Piping.Service/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision c33fbb6a840ef596c665774b609f82b948f3b512) +++ Ringtoets/Piping/src/Ringtoets.Piping.Service/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision 6744bc3cd2ffd54b89e8ee19c2953059ae698e80) @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.17929 +// Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -79,6 +79,26 @@ } /// + /// Looks up a localized string similar to Meerdere aaneengesloten watervoerende lagen gevonden. De definities voor de korrelgrootte en doorlatendheid van de bovenste watervoerende laag worden gebruikt in de berekening.. + /// + internal static string PipingCalculationService_GetInputWarnings_Multiple_aquifer_layers_values_for_DiameterD70_and_DarcyPermeability_taken_from_top_layer { + get { + return ResourceManager.GetString("PipingCalculationService_GetInputWarnings_Multiple_aquifer_layers_values_for_Diam" + + "eterD70_and_DarcyPermeability_taken_from_top_layer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Meerdere aaneengesloten deklagen gevonden. Het gewogen gemiddelde van de definities voor het verzadigd gewicht van de deklagen wordt gebruikt in de berekening.. + /// + internal static string PipingCalculationService_GetInputWarnings_Multiple_coverage_layers_values_for_saturated_weight_taken_as_weighted_mean_from_all_coverage_layers { + get { + return ResourceManager.GetString("PipingCalculationService_GetInputWarnings_Multiple_coverage_layers_values_for_sat" + + "urated_weight_taken_as_weighted_mean_from_all_coverage_layers", resourceCulture); + } + } + + /// /// Looks up a localized string similar to Kan het toetspeil niet afleiden op basis van de invoer.. /// internal static string PipingCalculationService_ValidateInput_Cannot_determine_AssessmentLevel { @@ -115,6 +135,26 @@ } /// + /// Looks up a localized string similar to Geen watervoerende laag gevonden voor de ondergrondschematisatie onder de profielschematisatie bij het uittredepunt.. + /// + internal static string PipingCalculationService_ValidateInput_No_aquifer_layer_at_ExitPointL_under_SurfaceLine { + get { + return ResourceManager.GetString("PipingCalculationService_ValidateInput_No_aquifer_layer_at_ExitPointL_under_Surfa" + + "ceLine", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Geen deklaag gevonden voor de ondergrondschematisatie onder de profielschematisatie bij het uittredepunt.. + /// + internal static string PipingCalculationService_ValidateInput_No_coverage_layer_at_ExitPointL_under_SurfaceLine { + get { + return ResourceManager.GetString("PipingCalculationService_ValidateInput_No_coverage_layer_at_ExitPointL_under_Surf" + + "aceLine", resourceCulture); + } + } + + /// /// Looks up a localized string similar to Er is geen hydraulische randvoorwaardenlocatie geselecteerd.. /// internal static string PipingCalculationService_ValidateInput_No_HydraulicBoundaryLocation_selected { Index: Ringtoets/Piping/src/Ringtoets.Piping.Service/Properties/Resources.resx =================================================================== diff -u -rc33fbb6a840ef596c665774b609f82b948f3b512 -r6744bc3cd2ffd54b89e8ee19c2953059ae698e80 --- Ringtoets/Piping/src/Ringtoets.Piping.Service/Properties/Resources.resx (.../Resources.resx) (revision c33fbb6a840ef596c665774b609f82b948f3b512) +++ Ringtoets/Piping/src/Ringtoets.Piping.Service/Properties/Resources.resx (.../Resources.resx) (revision 6744bc3cd2ffd54b89e8ee19c2953059ae698e80) @@ -153,4 +153,16 @@ Er is geen waarde voor het uittredepunt opgegeven. + + Geen deklaag gevonden voor de ondergrondschematisatie onder de profielschematisatie bij het uittredepunt. + + + Meerdere aaneengesloten watervoerende lagen gevonden. De definities voor de korrelgrootte en doorlatendheid van de bovenste watervoerende laag worden gebruikt in de berekening. + + + Meerdere aaneengesloten deklagen gevonden. Het gewogen gemiddelde van de definities voor het verzadigd gewicht van de deklagen wordt gebruikt in de berekening. + + + Geen watervoerende laag gevonden voor de ondergrondschematisatie onder de profielschematisatie bij het uittredepunt. + \ No newline at end of file Index: Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/DerivedPipingInputTest.cs =================================================================== diff -u -r2363244674e6b7b97bead9a6855806420d368d80 -r6744bc3cd2ffd54b89e8ee19c2953059ae698e80 --- Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/DerivedPipingInputTest.cs (.../DerivedPipingInputTest.cs) (revision 2363244674e6b7b97bead9a6855806420d368d80) +++ Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/DerivedPipingInputTest.cs (.../DerivedPipingInputTest.cs) (revision 6744bc3cd2ffd54b89e8ee19c2953059ae698e80) @@ -628,8 +628,57 @@ Assert.IsNaN(result.Shift); Assert.IsNaN(result.StandardDeviation); } + [Test] + public void SaturatedVolumicWeightOfCoverageLayer_NoAquiferLayers_ReturnsNaNForParameters() + { + // Setup + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); + var derivedInput = new DerivedPipingInput(input); + input.StochasticSoilProfile.SoilProfile = new PipingSoilProfile("", -2.0, new [] + { + new PipingSoilLayer(1.0) + { + IsAquifer = false + } + }, SoilProfileType.SoilProfile1D, 0); + // Call + var result = derivedInput.SaturatedVolumicWeightOfCoverageLayer; + + // Assert + Assert.IsNaN(result.Mean); + Assert.IsNaN(result.Shift); + Assert.IsNaN(result.StandardDeviation); + } + [Test] + public void SaturatedVolumicWeightOfCoverageLayer_NoCoverageLayersAboveTopAquiferLayer_ReturnsNaNForParameters() + { + // Setup + var input = PipingCalculationFactory.CreateInputWithAquiferAndCoverageLayer(); + var derivedInput = new DerivedPipingInput(input); + input.StochasticSoilProfile.SoilProfile = new PipingSoilProfile("", -2.0, new [] + { + new PipingSoilLayer(2.0) + { + IsAquifer = false + }, + new PipingSoilLayer(1.0) + { + IsAquifer = true + } + }, SoilProfileType.SoilProfile1D, 0); + + // Call + var result = derivedInput.SaturatedVolumicWeightOfCoverageLayer; + + // Assert + Assert.IsNaN(result.Mean); + Assert.IsNaN(result.Shift); + Assert.IsNaN(result.StandardDeviation); + } + + [Test] public void SaturatedVolumicWeightOfCoverageLayer_SingleLayer_ReturnsWithParametersFromLayer() { // Setup @@ -647,6 +696,10 @@ BelowPhreaticLevelShift = shift, BelowPhreaticLevelMean = belowPhreaticLevelMean }, + new PipingSoilLayer(0.5) + { + IsAquifer = true + }, }, SoilProfileType.SoilProfile1D, 0); // Call @@ -682,14 +735,18 @@ BelowPhreaticLevelDeviation = deviation, BelowPhreaticLevelShift = shift, BelowPhreaticLevelMean = belowPhreaticLevelMeanB - } + }, + new PipingSoilLayer(-1.5) + { + IsAquifer = true + }, }, SoilProfileType.SoilProfile1D, 0); // Call var result = derivedInput.SaturatedVolumicWeightOfCoverageLayer; // Assert - Assert.AreEqual((belowPhreaticLevelMeanA * 2.5 + belowPhreaticLevelMeanB * 1.5) / 4, result.Mean, result.Mean.GetAccuracy()); + Assert.AreEqual((belowPhreaticLevelMeanA * 2.5 + belowPhreaticLevelMeanB * 1.0) / 3.5, result.Mean, result.Mean.GetAccuracy()); Assert.AreEqual(shift, result.Shift, result.Shift.GetAccuracy()); Assert.AreEqual(deviation, result.StandardDeviation, result.StandardDeviation.GetAccuracy()); } Index: Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/PipingSoilProfileExtensionsTest.cs =================================================================== diff -u -r2363244674e6b7b97bead9a6855806420d368d80 -r6744bc3cd2ffd54b89e8ee19c2953059ae698e80 --- Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/PipingSoilProfileExtensionsTest.cs (.../PipingSoilProfileExtensionsTest.cs) (revision 2363244674e6b7b97bead9a6855806420d368d80) +++ Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/PipingSoilProfileExtensionsTest.cs (.../PipingSoilProfileExtensionsTest.cs) (revision 6744bc3cd2ffd54b89e8ee19c2953059ae698e80) @@ -20,6 +20,7 @@ // All rights reserved. using System.Collections.Generic; +using System.Linq; using NUnit.Framework; using Ringtoets.Piping.Primitives; @@ -28,18 +29,124 @@ [TestFixture] public class PipingSoilProfileExtensionsTest { + private PipingSoilLayer[] testCaseTwoAquitard = { + new PipingSoilLayer(2.1) + { + IsAquifer = false + }, + new PipingSoilLayer(1.1) + { + IsAquifer = false + } + }; + + private PipingSoilLayer[] testCaseTwoAquifer = { + new PipingSoilLayer(2.1) + { + IsAquifer = true + }, + new PipingSoilLayer(1.1) + { + IsAquifer = true + } + }; + + private PipingSoilLayer[] testCaseOneAquiferOneAquitard = { + new PipingSoilLayer(2.1) + { + IsAquifer = true + }, + new PipingSoilLayer(1.1) + { + IsAquifer = false + } + }; + + private PipingSoilLayer[] testCaseOneAquitardOneAquifer = { + new PipingSoilLayer(2.1) + { + IsAquifer = false + }, + new PipingSoilLayer(1.1) + { + IsAquifer = true + } + }; + + private PipingSoilLayer[] testCaseOneAquifer = { + new PipingSoilLayer(2.1) + { + IsAquifer = true + } + }; + + private PipingSoilLayer[] testCaseOneAquitard = { + new PipingSoilLayer(2.1) + { + IsAquifer = false + } + }; + + private PipingSoilLayer[] testCaseOneAquiferOneAquitardOneAquifer = { + new PipingSoilLayer(2.1) + { + IsAquifer = true + }, + new PipingSoilLayer(1.5) + { + IsAquifer = false + }, + new PipingSoilLayer(1.1) + { + IsAquifer = true + } + }; + + private PipingSoilLayer[] testCaseTwoAquiferOneAquitardOneAquifer = { + new PipingSoilLayer(2.1) + { + IsAquifer = true + }, + new PipingSoilLayer(1.1) + { + IsAquifer = true + }, + new PipingSoilLayer(1.0) + { + IsAquifer = false + }, + new PipingSoilLayer(0.5) + { + IsAquifer = true + } + }; + + private PipingSoilLayer[] testCaseTwoAquitardOneAquiferOneAquitard = { + new PipingSoilLayer(2.1) + { + IsAquifer = false + }, + new PipingSoilLayer(1.1) + { + IsAquifer = false + }, + new PipingSoilLayer(1.0) + { + IsAquifer = true + }, + new PipingSoilLayer(0.5) + { + IsAquifer = false + } + }; + #region GetTopmostConsecutiveAquiferLayerThicknessBelowLevel [Test] public void GetTopmostConsecutiveAquiferLayerThicknessBelowLevel_NoAquiferLayer_NaN() { // Setup - var pipingSoilLayers = new[] - { - new PipingSoilLayer(2.1), - new PipingSoilLayer(1.1) - }; - var profile = new PipingSoilProfile(string.Empty, 0.0, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); + var profile = CreateTestProfile(testCaseTwoAquitard); // Call double result = profile.GetTopmostConsecutiveAquiferLayerThicknessBelowLevel(1.0); @@ -52,15 +159,7 @@ public void GetTopmostConsecutiveAquiferLayerThicknessBelowLevel_AquiferLayerAboveLevel_NaN() { // Setup - var pipingSoilLayers = new[] - { - new PipingSoilLayer(2.1) - { - IsAquifer = true - }, - new PipingSoilLayer(1.1) - }; - var profile = new PipingSoilProfile(string.Empty, 0.0, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); + var profile = CreateTestProfile(testCaseOneAquiferOneAquitard); // Call double result = profile.GetTopmostConsecutiveAquiferLayerThicknessBelowLevel(1.0); @@ -73,14 +172,7 @@ public void GetTopmostConsecutiveAquiferLayerThicknessBelowLevel_AquiferLayerCompletelyBelowLevel_ReturnAquiferLayerThickness() { // Setup - var pipingSoilLayers = new[] - { - new PipingSoilLayer(2.1) - { - IsAquifer = true - } - }; - var profile = new PipingSoilProfile(string.Empty, 0.0, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); + var profile = CreateTestProfile(testCaseOneAquifer); // Call double result = profile.GetTopmostConsecutiveAquiferLayerThicknessBelowLevel(2.2); @@ -93,14 +185,7 @@ public void GetTopmostConsecutiveAquiferLayerThicknessBelowLevel_AquiferLayerPartlyBelowLevel_ReturnAquiferLayerThicknessUpTillLevel() { // Setup - var pipingSoilLayers = new[] - { - new PipingSoilLayer(2.1) - { - IsAquifer = true - } - }; - var profile = new PipingSoilProfile(string.Empty, 0.0, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); + var profile = CreateTestProfile(testCaseOneAquifer); // Call double result = profile.GetTopmostConsecutiveAquiferLayerThicknessBelowLevel(1.6); @@ -113,176 +198,98 @@ public void GetTopmostConsecutiveAquiferLayerThicknessBelowLevel_AquiferLayerTopEqualToLevel_ReturnAquiferLayerThickness() { // Setup - var pipingSoilLayers = new[] - { - new PipingSoilLayer(1.6) - { - IsAquifer = true - } - }; - var profile = new PipingSoilProfile(string.Empty, 0.0, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); + var profile = CreateTestProfile(testCaseOneAquifer); // Call - double result = profile.GetTopmostConsecutiveAquiferLayerThicknessBelowLevel(1.6); + double result = profile.GetTopmostConsecutiveAquiferLayerThicknessBelowLevel(2.1); // Assert - Assert.AreEqual(1.6, result, 1e-6); + Assert.AreEqual(2.1, result, 1e-6); } [Test] + public void GetTopmostConsecutiveAquiferLayerThicknessBelowLevel_AquiferLayerBottomEqualToLevel_NaN() + { + // Setup + var profile = CreateTestProfile(testCaseOneAquifer); + + // Call + double result = profile.GetTopmostConsecutiveAquiferLayerThicknessBelowLevel(0.0); + + // Assert + Assert.IsNaN(result); + } + + [Test] public void GetTopmostConsecutiveAquiferLayerThicknessBelowLevel_TwoAquiferLayersCompletelyBelowLevel_ReturnConsecutiveAquiferLayerThickness() { // Setup - var pipingSoilLayers = new[] - { - new PipingSoilLayer(2.1) - { - IsAquifer = true - }, - new PipingSoilLayer(1.1) - { - IsAquifer = true - }, - new PipingSoilLayer(0.5) - }; - var profile = new PipingSoilProfile(string.Empty, 0.0, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); + var profile = CreateTestProfile(testCaseTwoAquifer); // Call double result = profile.GetTopmostConsecutiveAquiferLayerThicknessBelowLevel(2.2); // Assert - Assert.AreEqual(1.6, result, 1e-6); + Assert.AreEqual(2.1, result, 1e-6); } [Test] public void GetTopmostConsecutiveAquiferLayerThicknessBelowLevel_TopmostAquiferLayerTopEqualToLevel_ReturnConsecutiveAquiferLayerThickness() { // Setup - var pipingSoilLayers = new[] - { - new PipingSoilLayer(2.1) - { - IsAquifer = true - }, - new PipingSoilLayer(1.1) - { - IsAquifer = true - }, - new PipingSoilLayer(0.5) - { - IsAquifer = false - } - }; - var profile = new PipingSoilProfile(string.Empty, 0.0, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); + var profile = CreateTestProfile(testCaseTwoAquifer); // Call double result = profile.GetTopmostConsecutiveAquiferLayerThicknessBelowLevel(2.1); // Assert - Assert.AreEqual(1.6, result, 1e-6); + Assert.AreEqual(2.1, result, 1e-6); } [Test] public void GetTopmostConsecutiveAquiferLayerThicknessBelowLevel_TopmostAquiferLayerTopPartlyBelowLevel_ReturnConsecutiveAquiferLayerThickness() { // Setup - var pipingSoilLayers = new[] - { - new PipingSoilLayer(2.1) - { - IsAquifer = true - }, - new PipingSoilLayer(1.1) - { - IsAquifer = true - }, - new PipingSoilLayer(0.5) - { - IsAquifer = false - } - }; - var profile = new PipingSoilProfile(string.Empty, 0.0, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); + var profile = CreateTestProfile(testCaseTwoAquifer); // Call double result = profile.GetTopmostConsecutiveAquiferLayerThicknessBelowLevel(2.0); // Assert - Assert.AreEqual(1.5, result, 1e-6); + Assert.AreEqual(2.0, result, 1e-6); } [Test] public void GetTopmostConsecutiveAquiferLayerThicknessBelowLevel_TopmostAquiferLayerCompletelyAboveLevel_ReturnBottomAquiferLayerThickness() { // Setup - var pipingSoilLayers = new[] - { - new PipingSoilLayer(2.1) - { - IsAquifer = true - }, - new PipingSoilLayer(1.5) - { - IsAquifer = false - }, - new PipingSoilLayer(1.1) - { - IsAquifer = true - } - }; - var profile = new PipingSoilProfile(string.Empty, 0.0, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); + var profile = CreateTestProfile(testCaseTwoAquifer); // Call - double result = profile.GetTopmostConsecutiveAquiferLayerThicknessBelowLevel(1.3); + double result = profile.GetTopmostConsecutiveAquiferLayerThicknessBelowLevel(0.5); // Assert - Assert.AreEqual(1.1, result, 1e-6); + Assert.AreEqual(0.5, result, 1e-6); } [Test] - public void GetTopmostConsecutiveAquiferLayerThicknessBelowLevel_TopmostAquiferLayerPartlyAboveLevel_ReturnConsecutiveAquiferLayerThicknessUpTillLevel() + public void GetTopmostConsecutiveAquiferLayerThicknessBelowLevel_BottomAquiferLayerTopEqualToLevel_BottomAquiferLayerThickness() { // Setup - var pipingSoilLayers = new[] - { - new PipingSoilLayer(2.1) - { - IsAquifer = true - }, - new PipingSoilLayer(1.1) - { - IsAquifer = true - } - }; - var profile = new PipingSoilProfile(string.Empty, 0.0, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); + var profile = CreateTestProfile(testCaseTwoAquifer); // Call - double result = profile.GetTopmostConsecutiveAquiferLayerThicknessBelowLevel(1.5); + double result = profile.GetTopmostConsecutiveAquiferLayerThicknessBelowLevel(1.1); // Assert - Assert.AreEqual(1.5, result, 1e-6); + Assert.AreEqual(1.1, result, 1e-6); } [Test] public void GetTopmostConsecutiveAquiferLayerThicknessBelowLevel_TwoConsecutiveAquiferLayersAndOneNonConsecutiveAquiferLayer_ReturnConsecutiveAquiferLayerThicknessUpTillLevel() { // Setup - var pipingSoilLayers = new[] - { - new PipingSoilLayer(2.1) - { - IsAquifer = true - }, - new PipingSoilLayer(1.1) - { - IsAquifer = true - }, - new PipingSoilLayer(1.0), - new PipingSoilLayer(0.5) - { - IsAquifer = true - } - }; - var profile = new PipingSoilProfile(string.Empty, 0.0, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); + var profile = CreateTestProfile(testCaseTwoAquiferOneAquitardOneAquifer); // Call double result = profile.GetTopmostConsecutiveAquiferLayerThicknessBelowLevel(1.5); @@ -292,72 +299,13 @@ } [Test] - public void GetTopmostConsecutiveAquiferLayerThicknessBelowLevel_AllAquiferLayersAboveLevel_NaN() - { - // Setup - var pipingSoilLayers = new[] - { - new PipingSoilLayer(2.1) - { - IsAquifer = true - }, - new PipingSoilLayer(1.1) - { - IsAquifer = true - }, - new PipingSoilLayer(0.6) - { - IsAquifer = false - } - }; - var profile = new PipingSoilProfile(string.Empty, 0.0, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); - - // Call - double result = profile.GetTopmostConsecutiveAquiferLayerThicknessBelowLevel(0.5); - - // Assert - Assert.IsNaN(result); - } - - [Test] - public void GetTopmostConsecutiveAquiferLayerThicknessBelowLevel_BottomAquiferLayerTopEqualToLevel_BottomAquiferLayerThickness() - { - // Setup - var pipingSoilLayers = new[] - { - new PipingSoilLayer(2.1) - { - IsAquifer = true - }, - new PipingSoilLayer(1.1) - { - IsAquifer = true - } - }; - var profile = new PipingSoilProfile(string.Empty, 0.0, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); - - // Call - double result = profile.GetTopmostConsecutiveAquiferLayerThicknessBelowLevel(1.1); - - // Assert - Assert.AreEqual(1.1, result, 1e-6); - } - - [Test] public void GetTopmostConsecutiveAquiferLayerThicknessBelowLevel_LevelBelowProfile_NaN() { // Setup - var pipingSoilLayers = new[] - { - new PipingSoilLayer(1.1) - { - IsAquifer = true - } - }; - var profile = new PipingSoilProfile(string.Empty, 0.5, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); + var profile = CreateTestProfile(testCaseTwoAquifer); // Call - double result = profile.GetTopmostConsecutiveAquiferLayerThicknessBelowLevel(0.0); + double result = profile.GetTopmostConsecutiveAquiferLayerThicknessBelowLevel(-1.0); // Assert Assert.IsNaN(result); @@ -368,15 +316,10 @@ #region GetConsecutiveAquiferLayersBelowLevel [Test] - public void GetConsecutiveAquiferLayersBelowLevel_NoAquiferLayer_ReturnsEmptyCollection() + public void GetConsecutiveAquiferLayersBelowLevel_NoAquiferLayer_ReturnEmptyCollection() { // Setup - var pipingSoilLayers = new[] - { - new PipingSoilLayer(2.1), - new PipingSoilLayer(1.1) - }; - var profile = new PipingSoilProfile(string.Empty, 0.0, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); + var profile = CreateTestProfile(testCaseTwoAquitard); // Call IEnumerable result = profile.GetConsecutiveAquiferLayersBelowLevel(1.0); @@ -386,18 +329,10 @@ } [Test] - public void GetConsecutiveAquiferLayersBelowLevel_AquiferLayerAboveLevel_ReturnsEmptyCollection() + public void GetConsecutiveAquiferLayersBelowLevel_AquiferLayerAboveLevel_ReturnEmptyCollection() { // Setup - var pipingSoilLayers = new[] - { - new PipingSoilLayer(2.1) - { - IsAquifer = true - }, - new PipingSoilLayer(1.1) - }; - var profile = new PipingSoilProfile(string.Empty, 0.0, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); + var profile = CreateTestProfile(testCaseOneAquiferOneAquitard); // Call IEnumerable result = profile.GetConsecutiveAquiferLayersBelowLevel(1.0); @@ -410,632 +345,323 @@ public void GetConsecutiveAquiferLayersBelowLevel_AquiferLayerCompletelyBelowLevel_ReturnAquiferLayer() { // Setup - var aquiferLayer = new PipingSoilLayer(2.1) - { - IsAquifer = true - }; - var pipingSoilLayers = new[] - { - aquiferLayer - }; - var profile = new PipingSoilProfile(string.Empty, 0.0, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); + var profile = CreateTestProfile(testCaseOneAquifer); // Call IEnumerable result = profile.GetConsecutiveAquiferLayersBelowLevel(2.2); // Assert - CollectionAssert.AreEqual(new[] { aquiferLayer }, result); + CollectionAssert.AreEqual(new[] { profile.Layers.ElementAt(0) }, result); } [Test] public void GetConsecutiveAquiferLayersBelowLevel_AquiferLayerPartlyBelowLevel_ReturnCollectionWithAquiferLayer() { // Setup - var aquiferLayer = new PipingSoilLayer(2.1) - { - IsAquifer = true - }; - var pipingSoilLayers = new[] - { - aquiferLayer - }; - var profile = new PipingSoilProfile(string.Empty, 0.0, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); + var profile = CreateTestProfile(testCaseOneAquifer); // Call IEnumerable result = profile.GetConsecutiveAquiferLayersBelowLevel(1.6); // Assert - CollectionAssert.AreEqual(new[] { aquiferLayer }, result); + CollectionAssert.AreEqual(new[] { profile.Layers.ElementAt(0) }, result); } [Test] public void GetConsecutiveAquiferLayersBelowLevel_AquiferLayerTopEqualToLevel_ReturnCollectionWithAquiferLayer() { // Setup - var aquiferLayer = new PipingSoilLayer(1.6) - { - IsAquifer = true - }; - var pipingSoilLayers = new[] - { - aquiferLayer - }; - var profile = new PipingSoilProfile(string.Empty, 0.0, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); + var profile = CreateTestProfile(testCaseOneAquifer); // Call - IEnumerable result = profile.GetConsecutiveAquiferLayersBelowLevel(1.6); + IEnumerable result = profile.GetConsecutiveAquiferLayersBelowLevel(2.1); // Assert - CollectionAssert.AreEqual(new[] { aquiferLayer }, result); + CollectionAssert.AreEqual(new[] { profile.Layers.ElementAt(0) }, result); } [Test] + public void GetConsecutiveAquiferLayersBelowLevel_AquiferLayerBottomEqualToLevel_ReturnEmptyCollection() + { + // Setup + var profile = CreateTestProfile(testCaseOneAquifer); + + // Call + IEnumerable result = profile.GetConsecutiveAquiferLayersBelowLevel(0.0); + + // Assert + Assert.IsEmpty(result); + } + + [Test] public void GetConsecutiveAquiferLayersBelowLevel_TwoAquiferLayersCompletelyBelowLevel_ReturnConsecutiveAquiferLayers() { // Setup - var aquiferLayerA = new PipingSoilLayer(2.1) - { - IsAquifer = true - }; - var aquiferLayerB = new PipingSoilLayer(1.1) - { - IsAquifer = true - }; - var pipingSoilLayers = new[] - { - aquiferLayerA, - aquiferLayerB, - new PipingSoilLayer(0.5) - }; - var profile = new PipingSoilProfile(string.Empty, 0.0, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); + var profile = CreateTestProfile(testCaseTwoAquifer); // Call IEnumerable result = profile.GetConsecutiveAquiferLayersBelowLevel(2.2); // Assert - CollectionAssert.AreEqual(new[] { aquiferLayerA, aquiferLayerB }, result); + CollectionAssert.AreEqual(profile.Layers, result); } [Test] public void GetConsecutiveAquiferLayersBelowLevel_TopmostAquiferLayerTopEqualToLevel_ReturnConsecutiveAquiferLayers() { // Setup - var aquiferLayerA = new PipingSoilLayer(2.1) - { - IsAquifer = true - }; - var aquiferLayerB = new PipingSoilLayer(1.1) - { - IsAquifer = true - }; - var pipingSoilLayers = new[] - { - aquiferLayerA, - aquiferLayerB, - new PipingSoilLayer(0.5) - { - IsAquifer = false - } - }; - var profile = new PipingSoilProfile(string.Empty, 0.0, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); + var profile = CreateTestProfile(testCaseTwoAquifer); // Call IEnumerable result = profile.GetConsecutiveAquiferLayersBelowLevel(2.1); // Assert - CollectionAssert.AreEqual(new[] { aquiferLayerA, aquiferLayerB }, result); + CollectionAssert.AreEqual(profile.Layers, result); } [Test] public void GetConsecutiveAquiferLayersBelowLevel_TopmostAquiferLayerTopPartlyBelowLevel_ReturnCollectionWithAquiferLayer() { // Setup - var aquiferLayerA = new PipingSoilLayer(2.1) - { - IsAquifer = true - }; - var aquiferLayerB = new PipingSoilLayer(1.1) - { - IsAquifer = true - }; - var pipingSoilLayers = new[] - { - aquiferLayerA, - aquiferLayerB, - new PipingSoilLayer(0.5) - { - IsAquifer = false - } - }; - var profile = new PipingSoilProfile(string.Empty, 0.0, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); + var profile = CreateTestProfile(testCaseTwoAquifer); // Call IEnumerable result = profile.GetConsecutiveAquiferLayersBelowLevel(2.0); // Assert - CollectionAssert.AreEqual(new[] { aquiferLayerA, aquiferLayerB }, result); + CollectionAssert.AreEqual(profile.Layers, result); } [Test] public void GetConsecutiveAquiferLayersBelowLevel_TopmostAquiferLayerCompletelyAboveLevel_ReturnCollectionWithoutTopmostAquiferLayer() { // Setup - var aquiferLayerA = new PipingSoilLayer(2.1) - { - IsAquifer = true - }; - var aquiferLayerB = new PipingSoilLayer(1.1) - { - IsAquifer = true - }; - var pipingSoilLayers = new[] - { - aquiferLayerA, - new PipingSoilLayer(1.5) - { - IsAquifer = false - }, - aquiferLayerB - }; - var profile = new PipingSoilProfile(string.Empty, 0.0, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); + var profile = CreateTestProfile(testCaseTwoAquifer); // Call - IEnumerable result = profile.GetConsecutiveAquiferLayersBelowLevel(1.3); + IEnumerable result = profile.GetConsecutiveAquiferLayersBelowLevel(0.5); // Assert - CollectionAssert.AreEqual(new[] { aquiferLayerB }, result); + CollectionAssert.AreEqual(new[] { profile.Layers.ElementAt(1) }, result); } - + [Test] - public void GetConsecutiveAquiferLayersBelowLevel_TopmostAquiferLayerPartlyAboveLevel_ReturnCollectionWithTopmostAquiferLayer() + public void GetConsecutiveAquiferLayersBelowLevel_BottomAquiferLayerTopEqualToLevel_ReturnCollectionWithBottomAquiferLayer() { // Setup - var aquiferLayerA = new PipingSoilLayer(2.1) - { - IsAquifer = true - }; - var aquiferLayerB = new PipingSoilLayer(1.1) - { - IsAquifer = true - }; - var pipingSoilLayers = new[] - { - aquiferLayerA, - aquiferLayerB - }; - var profile = new PipingSoilProfile(string.Empty, 0.0, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); + var profile = CreateTestProfile(testCaseTwoAquifer); // Call - IEnumerable result = profile.GetConsecutiveAquiferLayersBelowLevel(1.5); + IEnumerable result = profile.GetConsecutiveAquiferLayersBelowLevel(1.1); // Assert - CollectionAssert.AreEqual(new[] { aquiferLayerA, aquiferLayerB }, result); + CollectionAssert.AreEqual(new[] { profile.Layers.ElementAt(1) }, result); } [Test] public void GetConsecutiveAquiferLayersBelowLevel_TwoConsecutiveAquiferLayersAndOneNonConsecutiveAquiferLayer_ReturnConsecutiveAquiferLayers() { // Setup - var aquiferLayerA = new PipingSoilLayer(2.1) - { - IsAquifer = true - }; - var aquiferLayerB = new PipingSoilLayer(1.1) - { - IsAquifer = true - }; - var pipingSoilLayers = new[] - { - aquiferLayerA, - aquiferLayerB, - new PipingSoilLayer(1.0), - new PipingSoilLayer(0.5) - { - IsAquifer = true - } - }; - var profile = new PipingSoilProfile(string.Empty, 0.0, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); + var profile = CreateTestProfile(testCaseTwoAquiferOneAquitardOneAquifer); // Call IEnumerable result = profile.GetConsecutiveAquiferLayersBelowLevel(1.5); // Assert - CollectionAssert.AreEqual(new[] { aquiferLayerA, aquiferLayerB }, result); + CollectionAssert.AreEqual(profile.Layers.Take(2), result); } [Test] - public void GetConsecutiveAquiferLayersBelowLevel_AllAquiferLayersAboveLevel_ReturnsEmptyCollection() + public void GetConsecutiveAquiferLayersBelowLevel_LevelBelowProfile_ReturnEmptyCollection() { // Setup - var pipingSoilLayers = new[] - { - new PipingSoilLayer(2.1) - { - IsAquifer = true - }, - new PipingSoilLayer(1.1) - { - IsAquifer = true - }, - new PipingSoilLayer(0.6) - { - IsAquifer = false - } - }; - var profile = new PipingSoilProfile(string.Empty, 0.0, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); + var profile = CreateTestProfile(testCaseTwoAquifer); // Call - IEnumerable result = profile.GetConsecutiveAquiferLayersBelowLevel(0.5); + IEnumerable result = profile.GetConsecutiveAquiferLayersBelowLevel(-1.0); // Assert Assert.IsEmpty(result); } - [Test] - public void GetConsecutiveAquiferLayersBelowLevel_BottomAquiferLayerTopEqualToLevel_ReturnsCollectionWithBottomAquiferLayer() - { - // Setup - var aquiferLayerA = new PipingSoilLayer(2.1) - { - IsAquifer = true - }; - var aquiferLayerB = new PipingSoilLayer(1.1) - { - IsAquifer = true - }; - var pipingSoilLayers = new[] - { - aquiferLayerA, - aquiferLayerB - }; - var profile = new PipingSoilProfile(string.Empty, 0.0, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); + #endregion - // Call - IEnumerable result = profile.GetConsecutiveAquiferLayersBelowLevel(1.1); + #region GetConsecutiveAquitardLayersBelowLevel - // Assert - CollectionAssert.AreEqual(new[] { aquiferLayerB }, result); - } - [Test] - public void GetConsecutiveAquiferLayersBelowLevel_LevelBelowProfile_ReturnsEmptyCollection() + public void GetConsecutiveAquitardLayersBelowLevel_NoAquitardLayer_ReturnEmptyCollection() { // Setup - var pipingSoilLayers = new[] - { - new PipingSoilLayer(1.1) - { - IsAquifer = true - } - }; - var profile = new PipingSoilProfile(string.Empty, 0.5, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); + var profile = CreateTestProfile(testCaseTwoAquifer); // Call - IEnumerable result = profile.GetConsecutiveAquiferLayersBelowLevel(0.0); + IEnumerable result = profile.GetConsecutiveAquitardLayersBelowLevel(1.0); // Assert Assert.IsEmpty(result); } - #endregion - - #region GetConsecutiveAquitardLayersBelowLevel - [Test] - public void GetConsecutiveAquitardLayersBelowLevel_NoAquitardLayer_ReturnsEmptyCollection() + public void GetConsecutiveAquitardLayersBelowLevel_AquitardLayerAboveLevel_ReturnEmptyCollection() { // Setup - var pipingSoilLayers = new[] - { - new PipingSoilLayer(2.1) - { - IsAquifer = true - }, - new PipingSoilLayer(1.1) - { - IsAquifer = true - } - }; - var profile = new PipingSoilProfile(string.Empty, 0.0, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); + var profile = CreateTestProfile(testCaseOneAquitardOneAquifer); // Call - IEnumerable result = profile.GetConsecutiveAquitardLayersBelowLevel(1.0); + IEnumerable result = profile.GetConsecutiveAquitardLayersBelowLevel(1.1); // Assert Assert.IsEmpty(result); } [Test] - public void GetConsecutiveAquitardLayersBelowLevel_AquitardLayerAboveLevel_ReturnsEmptyCollection() + public void GetConsecutiveAquitardLayersBelowLevel_AquitardLayerCompletelyBelowLevel_ReturnAquitardLayer() { // Setup - var pipingSoilLayers = new[] - { - new PipingSoilLayer(2.1), - new PipingSoilLayer(1.1) - { - IsAquifer = true - } - }; - var profile = new PipingSoilProfile(string.Empty, 0.0, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); + var profile = CreateTestProfile(testCaseOneAquitard); // Call - IEnumerable result = profile.GetConsecutiveAquitardLayersBelowLevel(1.0); + IEnumerable result = profile.GetConsecutiveAquitardLayersBelowLevel(2.2); // Assert - Assert.IsEmpty(result); + CollectionAssert.AreEqual(profile.Layers, result); } [Test] - public void GetConsecutiveAquitardLayersBelowLevel_AquitardLayerCompletelyBelowLevel_ReturnAquitardLayer() + public void GetConsecutiveAquitardLayersBelowLevel_AquitardLayerPartlyBelowLevel_ReturnCollectionWithAquitardLayer() { // Setup - var aquitardLayer = new PipingSoilLayer(2.1); - var pipingSoilLayers = new[] - { - aquitardLayer - }; - var profile = new PipingSoilProfile(string.Empty, 0.0, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); + var profile = CreateTestProfile(testCaseOneAquitard); // Call - IEnumerable result = profile.GetConsecutiveAquitardLayersBelowLevel(2.2); + IEnumerable result = profile.GetConsecutiveAquitardLayersBelowLevel(1.6); // Assert - CollectionAssert.AreEqual(new[] { aquitardLayer }, result); + CollectionAssert.AreEqual(profile.Layers, result); } [Test] - public void GetConsecutiveAquitardLayersBelowLevel_AquitardLayerPartlyBelowLevel_ReturnCollectionWithAquitardLayer() + public void GetConsecutiveAquitardLayersBelowLevel_AquitardLayerTopEqualToLevel_ReturnCollectionWithAquitardLayer() { // Setup - var aquitardLayer = new PipingSoilLayer(2.1); - var pipingSoilLayers = new[] - { - aquitardLayer - }; - var profile = new PipingSoilProfile(string.Empty, 0.0, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); + var profile = CreateTestProfile(testCaseOneAquitard); // Call - IEnumerable result = profile.GetConsecutiveAquitardLayersBelowLevel(1.6); + IEnumerable result = profile.GetConsecutiveAquitardLayersBelowLevel(2.1); // Assert - CollectionAssert.AreEqual(new[] { aquitardLayer }, result); + CollectionAssert.AreEqual(profile.Layers, result); } [Test] - public void GetConsecutiveAquitardLayersBelowLevel_AquitardLayerTopEqualToLevel_ReturnCollectionWithAquitardLayer() + public void GetConsecutiveAquitardLayersBelowLevel_AquitardLayerBottomEqualToLevel_ReturnEmptyCollection() { // Setup - var aquitardLayer = new PipingSoilLayer(1.6); - var pipingSoilLayers = new[] - { - aquitardLayer - }; - var profile = new PipingSoilProfile(string.Empty, 0.0, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); + var profile = CreateTestProfile(testCaseOneAquitard); // Call - IEnumerable result = profile.GetConsecutiveAquitardLayersBelowLevel(1.6); + IEnumerable result = profile.GetConsecutiveAquitardLayersBelowLevel(0.0); // Assert - CollectionAssert.AreEqual(new[] { aquitardLayer }, result); + Assert.IsEmpty(result); } [Test] public void GetConsecutiveAquitardLayersBelowLevel_TwoAquitardLayersCompletelyBelowLevel_ReturnConsecutiveAquitardLayers() { // Setup - var aquitardLayerA = new PipingSoilLayer(2.1); - var aquitardLayerB = new PipingSoilLayer(1.1); - var pipingSoilLayers = new[] - { - aquitardLayerA, - aquitardLayerB, - new PipingSoilLayer(0.5) - { - IsAquifer = true - } - }; - var profile = new PipingSoilProfile(string.Empty, 0.0, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); + var profile = CreateTestProfile(testCaseTwoAquitard); // Call IEnumerable result = profile.GetConsecutiveAquitardLayersBelowLevel(2.2); // Assert - CollectionAssert.AreEqual(new[] { aquitardLayerA, aquitardLayerB }, result); + CollectionAssert.AreEqual(profile.Layers, result); } [Test] public void GetConsecutiveAquitardLayersBelowLevel_TopmostAquitardLayerTopEqualToLevel_ReturnConsecutiveAquitardLayers() { // Setup - var aquitardLayerA = new PipingSoilLayer(2.1); - var aquitardLayerB = new PipingSoilLayer(1.1); - var pipingSoilLayers = new[] - { - aquitardLayerA, - aquitardLayerB, - new PipingSoilLayer(0.5) - { - IsAquifer = true - } - }; - var profile = new PipingSoilProfile(string.Empty, 0.0, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); + var profile = CreateTestProfile(testCaseTwoAquitard); // Call IEnumerable result = profile.GetConsecutiveAquitardLayersBelowLevel(2.1); // Assert - CollectionAssert.AreEqual(new[] { aquitardLayerA, aquitardLayerB }, result); + CollectionAssert.AreEqual(profile.Layers, result); } [Test] public void GetConsecutiveAquitardLayersBelowLevel_TopmostAquitardLayerTopPartlyBelowLevel_ReturnCollectionWithAquitardLayer() { // Setup - var aquitardLayerA = new PipingSoilLayer(2.1); - var aquitardLayerB = new PipingSoilLayer(1.1); - var pipingSoilLayers = new[] - { - aquitardLayerA, - aquitardLayerB, - new PipingSoilLayer(0.5) - { - IsAquifer = true - } - }; - var profile = new PipingSoilProfile(string.Empty, 0.0, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); + var profile = CreateTestProfile(testCaseTwoAquitard); // Call IEnumerable result = profile.GetConsecutiveAquitardLayersBelowLevel(2.0); // Assert - CollectionAssert.AreEqual(new[] { aquitardLayerA, aquitardLayerB }, result); + CollectionAssert.AreEqual(profile.Layers, result); } [Test] public void GetConsecutiveAquitardLayersBelowLevel_TopmostAquitardLayerCompletelyAboveLevel_ReturnCollectionWithoutTopmostAquitardLayer() { // Setup - var aquitardLayerA = new PipingSoilLayer(2.1); - var aquitardLayerB = new PipingSoilLayer(1.1); - var pipingSoilLayers = new[] - { - aquitardLayerA, - new PipingSoilLayer(1.5) - { - IsAquifer = true - }, - aquitardLayerB - }; - var profile = new PipingSoilProfile(string.Empty, 0.0, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); + var profile = CreateTestProfile(testCaseTwoAquitard); // Call - IEnumerable result = profile.GetConsecutiveAquitardLayersBelowLevel(1.3); + IEnumerable result = profile.GetConsecutiveAquitardLayersBelowLevel(0.5); // Assert - CollectionAssert.AreEqual(new[] { aquitardLayerB }, result); + CollectionAssert.AreEqual(new[] { profile.Layers.ElementAt(1) }, result); } [Test] - public void GetConsecutiveAquitardLayersBelowLevel_TopmostAquitardLayerPartlyAboveLevel_ReturnCollectionWithTopmostAquitardLayer() + public void GetConsecutiveAquitardLayersBelowLevel_BottomAquitardLayerTopEqualToLevel_ReturnCollectionWithBottomAquitardLayer() { // Setup - var aquitardLayerA = new PipingSoilLayer(2.1); - var aquitardLayerB = new PipingSoilLayer(1.1); - var pipingSoilLayers = new[] - { - aquitardLayerA, - aquitardLayerB - }; - var profile = new PipingSoilProfile(string.Empty, 0.0, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); + var profile = CreateTestProfile(testCaseTwoAquitard); // Call - IEnumerable result = profile.GetConsecutiveAquitardLayersBelowLevel(1.5); + IEnumerable result = profile.GetConsecutiveAquitardLayersBelowLevel(1.1); // Assert - CollectionAssert.AreEqual(new[] { aquitardLayerA, aquitardLayerB }, result); + CollectionAssert.AreEqual(new[] { profile.Layers.ElementAt(1) }, result); } [Test] public void GetConsecutiveAquitardLayersBelowLevel_TwoConsecutiveAquitardLayersAndOneNonConsecutiveAquitardLayer_ReturnConsecutiveAquitardLayers() { // Setup - var aquitardLayerA = new PipingSoilLayer(2.1); - var aquitardLayerB = new PipingSoilLayer(1.1); - var pipingSoilLayers = new[] - { - aquitardLayerA, - aquitardLayerB, - new PipingSoilLayer(1.0) - { - IsAquifer = true - }, - new PipingSoilLayer(0.5) - }; - var profile = new PipingSoilProfile(string.Empty, 0.0, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); + var profile = CreateTestProfile(testCaseTwoAquitardOneAquiferOneAquitard); // Call IEnumerable result = profile.GetConsecutiveAquitardLayersBelowLevel(1.5); // Assert - CollectionAssert.AreEqual(new[] { aquitardLayerA, aquitardLayerB }, result); + CollectionAssert.AreEqual(profile.Layers.Take(2), result); } [Test] - public void GetConsecutiveAquitardLayersBelowLevel_AllAquitardLayersAboveLevel_ReturnsEmptyCollection() + public void GetConsecutiveAquitardLayersBelowLevel_LevelBelowProfile_ReturnEmptyCollection() { // Setup - var pipingSoilLayers = new[] - { - new PipingSoilLayer(2.1) - { - IsAquifer = false - }, - new PipingSoilLayer(1.1) - { - IsAquifer = false - }, - new PipingSoilLayer(0.6) - { - IsAquifer = true - } - }; - var profile = new PipingSoilProfile(string.Empty, 0.0, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); + var profile = CreateTestProfile(testCaseTwoAquitard); // Call - IEnumerable result = profile.GetConsecutiveAquitardLayersBelowLevel(0.5); + IEnumerable result = profile.GetConsecutiveAquitardLayersBelowLevel(-1.0); // Assert Assert.IsEmpty(result); } - [Test] - public void GetConsecutiveAquitardLayersBelowLevel_BottomAquitardLayerTopEqualToLevel_ReturnsCollectionWithBottomAquitardLayer() - { - // Setup - var aquitardLayerA = new PipingSoilLayer(2.1) - { - IsAquifer = false - }; - var aquitardLayerB = new PipingSoilLayer(1.1) - { - IsAquifer = false - }; - var pipingSoilLayers = new[] - { - aquitardLayerA, - aquitardLayerB - }; - var profile = new PipingSoilProfile(string.Empty, 0.0, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); + #endregion - // Call - IEnumerable result = profile.GetConsecutiveAquitardLayersBelowLevel(1.1); - - // Assert - CollectionAssert.AreEqual(new[] { aquitardLayerB }, result); - } - - [Test] - public void GetConsecutiveAquitardLayersBelowLevel_LevelBelowProfile_ReturnsEmptyCollection() + private PipingSoilProfile CreateTestProfile(PipingSoilLayer[] layers) { - // Setup - var pipingSoilLayers = new[] - { - new PipingSoilLayer(1.1) - { - IsAquifer = true - } - }; - var profile = new PipingSoilProfile(string.Empty, 0.5, pipingSoilLayers, SoilProfileType.SoilProfile1D, 0); - - // Call - IEnumerable result = profile.GetConsecutiveAquitardLayersBelowLevel(0.0); - - // Assert - Assert.IsEmpty(result); + return new PipingSoilProfile(string.Empty, 0.0, layers, SoilProfileType.SoilProfile1D, 0); } - - #endregion - } } \ No newline at end of file Index: Ringtoets/Piping/test/Ringtoets.Piping.Service.Test/PipingCalculationServiceTest.cs =================================================================== diff -u -rc33fbb6a840ef596c665774b609f82b948f3b512 -r6744bc3cd2ffd54b89e8ee19c2953059ae698e80 --- Ringtoets/Piping/test/Ringtoets.Piping.Service.Test/PipingCalculationServiceTest.cs (.../PipingCalculationServiceTest.cs) (revision c33fbb6a840ef596c665774b609f82b948f3b512) +++ Ringtoets/Piping/test/Ringtoets.Piping.Service.Test/PipingCalculationServiceTest.cs (.../PipingCalculationServiceTest.cs) (revision 6744bc3cd2ffd54b89e8ee19c2953059ae698e80) @@ -30,6 +30,7 @@ using Ringtoets.Piping.KernelWrapper.SubCalculator; using Ringtoets.Piping.KernelWrapper.TestUtil; using Ringtoets.Piping.KernelWrapper.TestUtil.SubCalculator; +using Ringtoets.Piping.Primitives; namespace Ringtoets.Piping.Service.Test { @@ -245,8 +246,9 @@ calculation.InputParameters.StochasticSoilProfile = null; calculation.Name = name; - // Call bool isValid = false; + + // Call Action call = () => isValid = PipingCalculationService.Validate(calculation); // Assert @@ -262,18 +264,142 @@ } [Test] - public void PerformValidatedCalculation_ValidPipingCalculation_LogStartAndEndOfValidatingInputsAndCalculation() + public void Validate_CalculationWithoutAquiferLayer_LogsErrorAndReturnsFalse() { // Setup const string name = ""; + + PipingCalculation calculation = PipingCalculationFactory.CreateCalculationWithValidInput(); + calculation.InputParameters.StochasticSoilProfile.SoilProfile = new PipingSoilProfile( + string.Empty, + 0.0, + new[] + { + new PipingSoilLayer(2.0) + { + IsAquifer = false + }, + }, + SoilProfileType.SoilProfile1D, + -1); + calculation.Name = name; + bool isValid = false; + + // Call + Action call = () => isValid = PipingCalculationService.Validate(calculation); + + // Assert + TestHelper.AssertLogMessages(call, messages => + { + var msgs = messages.ToArray(); + Assert.AreEqual(5, 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 totale deklaagdikte bij het uittredepunt niet afleiden op basis van de invoer.", msgs[2]); + StringAssert.StartsWith("Validatie mislukt: Geen watervoerende laag gevonden voor de ondergrondschematisatie onder de profielschematisatie bij het uittredepunt.", msgs[3]); + StringAssert.StartsWith(String.Format("Validatie van '{0}' beëindigd om: ", name), msgs.Last()); + }); + Assert.IsFalse(isValid); + } + + [Test] + public void Validate_CalculationWithoutAquitardLayer_LogsErrorAndReturnsFalse() + { + // Setup + const string name = ""; + + PipingCalculation calculation = PipingCalculationFactory.CreateCalculationWithValidInput(); + calculation.InputParameters.StochasticSoilProfile.SoilProfile = new PipingSoilProfile( + string.Empty, + 0.0, + new[] + { + new PipingSoilLayer(2.0) + { + IsAquifer = true + }, + }, + SoilProfileType.SoilProfile1D, + -1); + calculation.Name = name; + + bool isValid = false; + + // Call + 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 totale deklaagdikte bij het uittredepunt niet afleiden op basis van de invoer.", msgs[1]); + StringAssert.StartsWith("Validatie mislukt: Geen deklaag gevonden voor de ondergrondschematisatie onder de profielschematisatie bij het uittredepunt.", msgs[2]); + StringAssert.StartsWith(String.Format("Validatie van '{0}' beëindigd om: ", name), msgs.Last()); + }); + Assert.IsFalse(isValid); + } + + [Test] + public void Validate_CalculationWithoutCoverageLayer_LogsErrorAndReturnsFalse() + { + // Setup + const string name = ""; + + PipingCalculation calculation = PipingCalculationFactory.CreateCalculationWithValidInput(); + calculation.InputParameters.StochasticSoilProfile.SoilProfile = new PipingSoilProfile( + string.Empty, + 0.0, + new[] + { + new PipingSoilLayer(13.0) + { + IsAquifer = false + }, + new PipingSoilLayer(11.0) + { + IsAquifer = true + }, + }, + SoilProfileType.SoilProfile1D, + -1); + calculation.Name = name; + + bool isValid = false; + + // Call + 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 totale deklaagdikte bij het uittredepunt niet afleiden op basis van de invoer.", msgs[1]); + StringAssert.StartsWith("Validatie mislukt: Geen deklaag gevonden voor de ondergrondschematisatie onder de profielschematisatie bij het uittredepunt.", msgs[2]); + StringAssert.StartsWith(String.Format("Validatie van '{0}' beëindigd om: ", name), msgs.Last()); + }); + Assert.IsFalse(isValid); + } + + [Test] + public void Calculate_ValidPipingCalculation_LogStartAndEndOfValidatingInputsAndCalculation() + { + // Setup + const string name = ""; + PipingCalculation validPipingCalculation = PipingCalculationFactory.CreateCalculationWithValidInput(); validPipingCalculation.Name = name; - // Call Action call = () => { + // Precondition Assert.IsTrue(PipingCalculationService.Validate(validPipingCalculation)); + + // Call PipingCalculationService.Calculate(validPipingCalculation); }; @@ -290,33 +416,35 @@ } [Test] - public void PerformValidatedCalculation_ValidPipingCalculationNoOutput_ShouldSetOutput() + public void Calculate_ValidPipingCalculationNoOutput_ShouldSetOutput() { // Setup PipingCalculation validPipingCalculation = PipingCalculationFactory.CreateCalculationWithValidInput(); // Precondition Assert.IsNull(validPipingCalculation.Output); + Assert.IsTrue(PipingCalculationService.Validate(validPipingCalculation)); // Call - Assert.IsTrue(PipingCalculationService.Validate(validPipingCalculation)); PipingCalculationService.Calculate(validPipingCalculation); // Assert Assert.IsNotNull(validPipingCalculation.Output); } [Test] - public void PerformValidatedCalculation_ValidPipingCalculationWithOutput_ShouldChangeOutput() + public void Calculate_ValidPipingCalculationWithOutput_ShouldChangeOutput() { // Setup var output = new TestPipingOutput(); PipingCalculation validPipingCalculation = PipingCalculationFactory.CreateCalculationWithValidInput(); validPipingCalculation.Output = output; - // Call + // Precondition Assert.IsTrue(PipingCalculationService.Validate(validPipingCalculation)); + + // Call PipingCalculationService.Calculate(validPipingCalculation); // Assert