Index: Ringtoets/GrassCoverErosionOutwards/test/Ringtoets.GrassCoverErosionOutwards.Integration.Test/GrassCoverErosionOutwardsWaveConditionsCalculationActivityIntegrationTest.cs =================================================================== diff -u -r72ab8a712b043d82de3925e0bffad7aea60cbf19 -rcff4b928800b2a49ccaaaa49e7c87755d79b0169 --- Ringtoets/GrassCoverErosionOutwards/test/Ringtoets.GrassCoverErosionOutwards.Integration.Test/GrassCoverErosionOutwardsWaveConditionsCalculationActivityIntegrationTest.cs (.../GrassCoverErosionOutwardsWaveConditionsCalculationActivityIntegrationTest.cs) (revision 72ab8a712b043d82de3925e0bffad7aea60cbf19) +++ Ringtoets/GrassCoverErosionOutwards/test/Ringtoets.GrassCoverErosionOutwards.Integration.Test/GrassCoverErosionOutwardsWaveConditionsCalculationActivityIntegrationTest.cs (.../GrassCoverErosionOutwardsWaveConditionsCalculationActivityIntegrationTest.cs) (revision cff4b928800b2a49ccaaaa49e7c87755d79b0169) @@ -37,12 +37,12 @@ using Ringtoets.Common.Service.TestUtil; using Ringtoets.GrassCoverErosionOutwards.Data; using Ringtoets.GrassCoverErosionOutwards.Service; +using Ringtoets.GrassCoverErosionOutwards.Util.TestUtil; using Ringtoets.HydraRing.Calculation.Calculator.Factory; using Ringtoets.HydraRing.Calculation.Data; using Ringtoets.HydraRing.Calculation.Data.Input.WaveConditions; using Ringtoets.HydraRing.Calculation.TestUtil; using Ringtoets.HydraRing.Calculation.TestUtil.Calculator; -using Ringtoets.Integration.Data; using Ringtoets.Revetment.Data; namespace Ringtoets.GrassCoverErosionOutwards.Integration.Test @@ -58,9 +58,10 @@ public void Run_CalculationWithInvalidHydraulicBoundaryDatabaseFilePath_DoesNotPerformCalculationAndLogsError() { // Setup - GrassCoverErosionOutwardsWaveConditionsCalculation calculation = CreateValidCalculation(); - AssessmentSection assessmentSection = CreateAssessmentSectionWithHydraulicBoundaryOutput(calculation.InputParameters.HydraulicBoundaryLocation); - + AssessmentSectionStub assessmentSection = CreateAssessmentSection(); + GrassCoverErosionOutwardsFailureMechanism failureMechanism = CreateFailureMechanismWithHydraulicBoundaryOutput(assessmentSection); + GrassCoverErosionOutwardsWaveConditionsCalculation calculation = CreateValidCalculation(assessmentSection.HydraulicBoundaryDatabase.Locations.First()); + string invalidFilePath = Path.Combine(testDataPath, "NonExisting.sqlite"); var mockRepository = new MockRepository(); @@ -69,7 +70,7 @@ var activity = new GrassCoverErosionOutwardsWaveConditionsCalculationActivity(calculation, invalidFilePath, - assessmentSection.GrassCoverErosionOutwards, + failureMechanism, assessmentSection); using (new HydraRingCalculatorFactoryConfig(calculatorFactory)) @@ -97,9 +98,10 @@ public void Run_CalculationWithInvalidPreprocessorDirectory_DoesNotPerformCalculationAndLogsError() { // Setup - GrassCoverErosionOutwardsWaveConditionsCalculation calculation = CreateValidCalculation(); - AssessmentSection assessmentSection = CreateAssessmentSectionWithHydraulicBoundaryOutput(calculation.InputParameters.HydraulicBoundaryLocation); - + AssessmentSectionStub assessmentSection = CreateAssessmentSection(); + GrassCoverErosionOutwardsFailureMechanism failureMechanism = CreateFailureMechanismWithHydraulicBoundaryOutput(assessmentSection); + GrassCoverErosionOutwardsWaveConditionsCalculation calculation = CreateValidCalculation(assessmentSection.HydraulicBoundaryDatabase.Locations.First()); + assessmentSection.HydraulicBoundaryDatabase.CanUsePreprocessor = true; assessmentSection.HydraulicBoundaryDatabase.UsePreprocessor = true; assessmentSection.HydraulicBoundaryDatabase.PreprocessorDirectory = "NonExistingPreprocessorDirectory"; @@ -110,7 +112,7 @@ var activity = new GrassCoverErosionOutwardsWaveConditionsCalculationActivity(calculation, validFilePath, - assessmentSection.GrassCoverErosionOutwards, + failureMechanism, assessmentSection); using (new HydraRingCalculatorFactoryConfig(calculatorFactory)) @@ -135,73 +137,19 @@ } [Test] - public void Run_CalculationWithValidCalculation_PerformCalculationAndLogStartAndEnd() - { - // Setup - GrassCoverErosionOutwardsWaveConditionsCalculation calculation = CreateValidCalculation(); - AssessmentSection assessmentSection = CreateAssessmentSectionWithHydraulicBoundaryOutput(calculation.InputParameters.HydraulicBoundaryLocation); - - var activity = new GrassCoverErosionOutwardsWaveConditionsCalculationActivity(calculation, - validFilePath, - assessmentSection.GrassCoverErosionOutwards, - assessmentSection); - - RoundedDouble[] waterLevels = GetWaterLevels(calculation).ToArray(); - int nrOfCalculators = waterLevels.Length; - - var mockRepository = new MockRepository(); - var calculatorFactory = mockRepository.StrictMock(); - calculatorFactory.Expect(cf => cf.CreateWaveConditionsCosineCalculator(testDataPath, string.Empty)) - .Return(new TestWaveConditionsCosineCalculator()) - .Repeat - .Times(nrOfCalculators); - mockRepository.ReplayAll(); - - using (new HydraRingCalculatorFactoryConfig(calculatorFactory)) - { - // Call - Action call = () => activity.Run(); - - // Assert - TestHelper.AssertLogMessages(call, messages => - { - string[] msgs = messages.ToArray(); - Assert.AreEqual(14, msgs.Length); - Assert.AreEqual($"Golfcondities berekenen voor '{calculation.Name}' is gestart.", msgs[0]); - CalculationServiceTestHelper.AssertValidationStartMessage(msgs[1]); - CalculationServiceTestHelper.AssertValidationEndMessage(msgs[2]); - CalculationServiceTestHelper.AssertCalculationStartMessage(msgs[3]); - - var i = 3; - foreach (RoundedDouble waterLevel in waterLevels) - { - Assert.AreEqual($"Berekening voor waterstand '{waterLevel}' is gestart.", msgs[i + 1]); - StringAssert.StartsWith("Golfcondities berekening is uitgevoerd op de tijdelijke locatie", msgs[i + 2]); - Assert.AreEqual($"Berekening voor waterstand '{waterLevel}' is beƫindigd.", msgs[i + 3]); - i = i + 3; - } - - CalculationServiceTestHelper.AssertCalculationEndMessage(msgs[13]); - }); - Assert.AreEqual(ActivityState.Executed, activity.State); - } - - mockRepository.VerifyAll(); - } - - [Test] public void Run_Always_SetProgressTexts() { // Setup - GrassCoverErosionOutwardsWaveConditionsCalculation calculation = CreateValidCalculation(); - AssessmentSection assessmentSection = CreateAssessmentSectionWithHydraulicBoundaryOutput(calculation.InputParameters.HydraulicBoundaryLocation); - + AssessmentSectionStub assessmentSection = CreateAssessmentSection(); + GrassCoverErosionOutwardsFailureMechanism failureMechanism = CreateFailureMechanismWithHydraulicBoundaryOutput(assessmentSection); + GrassCoverErosionOutwardsWaveConditionsCalculation calculation = CreateValidCalculation(assessmentSection.HydraulicBoundaryDatabase.Locations.First()); + var activity = new GrassCoverErosionOutwardsWaveConditionsCalculationActivity(calculation, validFilePath, - assessmentSection.GrassCoverErosionOutwards, + failureMechanism, assessmentSection); - RoundedDouble[] waterLevels = GetWaterLevels(calculation).ToArray(); + RoundedDouble[] waterLevels = GetWaterLevels(calculation, failureMechanism, assessmentSection).ToArray(); int nrOfCalculators = waterLevels.Length; var mockRepository = new MockRepository(); @@ -238,19 +186,20 @@ public void Run_Always_InputPropertiesCorrectlySendToService(BreakWaterType breakWaterType) { // Setup - GrassCoverErosionOutwardsWaveConditionsCalculation calculation = CreateValidCalculation(); - AssessmentSection assessmentSection = CreateAssessmentSectionWithHydraulicBoundaryOutput(calculation.InputParameters.HydraulicBoundaryLocation); - + AssessmentSectionStub assessmentSection = CreateAssessmentSection(); + GrassCoverErosionOutwardsFailureMechanism failureMechanism = CreateFailureMechanismWithHydraulicBoundaryOutput(assessmentSection); + GrassCoverErosionOutwardsWaveConditionsCalculation calculation = CreateValidCalculation(assessmentSection.HydraulicBoundaryDatabase.Locations.First()); + calculation.InputParameters.BreakWater.Type = breakWaterType; var activity = new GrassCoverErosionOutwardsWaveConditionsCalculationActivity(calculation, validFilePath, - assessmentSection.GrassCoverErosionOutwards, + failureMechanism, assessmentSection); var waveConditionsCosineCalculator = new TestWaveConditionsCosineCalculator(); - RoundedDouble[] waterLevels = GetWaterLevels(calculation).ToArray(); + RoundedDouble[] waterLevels = GetWaterLevels(calculation, failureMechanism, assessmentSection).ToArray(); int nrOfCalculators = waterLevels.Length; var mockRepository = new MockRepository(); @@ -273,12 +222,12 @@ var waterLevelIndex = 0; foreach (WaveConditionsCosineCalculationInput actualInput in testWaveConditionsInputs) { - GeneralGrassCoverErosionOutwardsInput generalInput = assessmentSection.GrassCoverErosionOutwards.GeneralInput; + GeneralGrassCoverErosionOutwardsInput generalInput = failureMechanism.GeneralInput; double mechanismSpecificNorm = RingtoetsCommonDataCalculationService.ProfileSpecificRequiredProbability( assessmentSection.FailureMechanismContribution.Norm, - assessmentSection.GrassCoverErosionOutwards.Contribution, - assessmentSection.GrassCoverErosionOutwards.GeneralInput.N); + failureMechanism.Contribution, + failureMechanism.GeneralInput.N); WaveConditionsInput input = calculation.InputParameters; var expectedInput = new WaveConditionsCosineCalculationInput(1, @@ -303,12 +252,13 @@ public void Cancel_WhenPerformingCalculation_CurrentCalculationForWaterLevelCompletesAndSubsequentCalculationsDidNotRun() { // Setup - GrassCoverErosionOutwardsWaveConditionsCalculation calculation = CreateValidCalculation(); - AssessmentSection assessmentSection = CreateAssessmentSectionWithHydraulicBoundaryOutput(calculation.InputParameters.HydraulicBoundaryLocation); + AssessmentSectionStub assessmentSection = CreateAssessmentSection(); + GrassCoverErosionOutwardsFailureMechanism failureMechanism = CreateFailureMechanismWithHydraulicBoundaryOutput(assessmentSection); + GrassCoverErosionOutwardsWaveConditionsCalculation calculation = CreateValidCalculation(assessmentSection.HydraulicBoundaryDatabase.Locations.First()); var activity = new GrassCoverErosionOutwardsWaveConditionsCalculationActivity(calculation, validFilePath, - assessmentSection.GrassCoverErosionOutwards, + failureMechanism, assessmentSection); var mockRepository = new MockRepository(); @@ -331,7 +281,7 @@ TestHelper.AssertLogMessages(() => activity.Run(), messages => { string[] msgs = messages.ToArray(); - RoundedDouble firstWaterLevel = GetWaterLevels(calculation).First(); + RoundedDouble firstWaterLevel = GetWaterLevels(calculation, failureMechanism, assessmentSection).First(); Assert.AreEqual(8, msgs.Length); Assert.AreEqual($"Golfcondities berekenen voor '{calculation.Name}' is gestart.", msgs[0]); @@ -352,18 +302,60 @@ } [Test] + public void Run_WhenCanceled_OutputNull() + { + // Setup + AssessmentSectionStub assessmentSection = CreateAssessmentSection(); + GrassCoverErosionOutwardsFailureMechanism failureMechanism = CreateFailureMechanismWithHydraulicBoundaryOutput(assessmentSection); + GrassCoverErosionOutwardsWaveConditionsCalculation calculation = CreateValidCalculation(assessmentSection.HydraulicBoundaryDatabase.Locations.First()); + + var activity = new GrassCoverErosionOutwardsWaveConditionsCalculationActivity(calculation, + validFilePath, + failureMechanism, + assessmentSection); + + var mockRepository = new MockRepository(); + var calculatorFactory = mockRepository.StrictMock(); + calculatorFactory.Expect(cf => cf.CreateWaveConditionsCosineCalculator(testDataPath, string.Empty)).Return(new TestWaveConditionsCosineCalculator()); + mockRepository.ReplayAll(); + + using (new HydraRingCalculatorFactoryConfig(calculatorFactory)) + { + activity.ProgressChanged += (sender, args) => + { + if (activity.State != ActivityState.Canceled) + { + activity.Cancel(); + } + }; + + activity.Run(); + + // Call + activity.Finish(); + + // Assert + Assert.AreEqual(ActivityState.Canceled, activity.State); + Assert.IsNull(calculation.Output); + } + + mockRepository.VerifyAll(); + } + + [Test] public void Run_CalculationPerformed_SetsOutput() { // Setup - GrassCoverErosionOutwardsWaveConditionsCalculation calculation = CreateValidCalculation(); - AssessmentSection assessmentSection = CreateAssessmentSectionWithHydraulicBoundaryOutput(calculation.InputParameters.HydraulicBoundaryLocation); + AssessmentSectionStub assessmentSection = CreateAssessmentSection(); + GrassCoverErosionOutwardsFailureMechanism failureMechanism = CreateFailureMechanismWithHydraulicBoundaryOutput(assessmentSection); + GrassCoverErosionOutwardsWaveConditionsCalculation calculation = CreateValidCalculation(assessmentSection.HydraulicBoundaryDatabase.Locations.First()); var activity = new GrassCoverErosionOutwardsWaveConditionsCalculationActivity(calculation, validFilePath, - assessmentSection.GrassCoverErosionOutwards, + failureMechanism, assessmentSection); - int nrOfCalculators = GetWaterLevels(calculation).Count(); + int nrOfCalculators = GetWaterLevels(calculation, failureMechanism, assessmentSection).Count(); var mockRepository = new MockRepository(); var calculatorFactory = mockRepository.StrictMock(); @@ -394,18 +386,17 @@ public void Run_ErrorInCalculation_ActivityStateFailed(bool endInFailure, string lastErrorFileContent) { // Setup - GrassCoverErosionOutwardsWaveConditionsCalculation calculation = CreateValidCalculation(); - AssessmentSection assessmentSection = CreateAssessmentSectionWithHydraulicBoundaryOutput(calculation.InputParameters.HydraulicBoundaryLocation); + AssessmentSectionStub assessmentSection = CreateAssessmentSection(); + GrassCoverErosionOutwardsFailureMechanism failureMechanism = CreateFailureMechanismWithHydraulicBoundaryOutput(assessmentSection); + GrassCoverErosionOutwardsWaveConditionsCalculation calculation = CreateValidCalculation(assessmentSection.HydraulicBoundaryDatabase.Locations.First()); - var failureMechanism = new GrassCoverErosionOutwardsFailureMechanism(); - var calculator = new TestWaveConditionsCosineCalculator { EndInFailure = endInFailure, LastErrorFileContent = lastErrorFileContent }; - int nrOfCalculators = GetWaterLevels(calculation).Count(); + int nrOfCalculators = GetWaterLevels(calculation, failureMechanism, assessmentSection).Count(); var mockRepository = new MockRepository(); var calculatorFactory = mockRepository.StrictMock(); @@ -436,12 +427,13 @@ public void Run_CalculationFailed_OutputNull(bool endInFailure, string lastErrorFileContent) { // Setup - GrassCoverErosionOutwardsWaveConditionsCalculation calculation = CreateValidCalculation(); - AssessmentSection assessmentSection = CreateAssessmentSectionWithHydraulicBoundaryOutput(calculation.InputParameters.HydraulicBoundaryLocation); + AssessmentSectionStub assessmentSection = CreateAssessmentSection(); + GrassCoverErosionOutwardsFailureMechanism failureMechanism = CreateFailureMechanismWithHydraulicBoundaryOutput(assessmentSection); + GrassCoverErosionOutwardsWaveConditionsCalculation calculation = CreateValidCalculation(assessmentSection.HydraulicBoundaryDatabase.Locations.First()); var activity = new GrassCoverErosionOutwardsWaveConditionsCalculationActivity(calculation, validFilePath, - assessmentSection.GrassCoverErosionOutwards, + failureMechanism, assessmentSection); var waveConditionsCosineCalculator = new TestWaveConditionsCosineCalculator @@ -450,7 +442,7 @@ LastErrorFileContent = lastErrorFileContent }; - int nrOfCalculators = GetWaterLevels(calculation).Count(); + int nrOfCalculators = GetWaterLevels(calculation, failureMechanism, assessmentSection).Count(); var mockRepository = new MockRepository(); var calculatorFactory = mockRepository.StrictMock(); @@ -476,16 +468,15 @@ public void Run_HydraulicBoundaryDatabaseWithCanUsePreprocessorFalse_CreateWaveConditionsCosineCalculatorAsExpected() { // Setup - GrassCoverErosionOutwardsWaveConditionsCalculation calculation = CreateValidCalculation(); - AssessmentSection assessmentSection = CreateAssessmentSectionWithHydraulicBoundaryOutput(calculation.InputParameters.HydraulicBoundaryLocation); + AssessmentSectionStub assessmentSection = CreateAssessmentSection(); + GrassCoverErosionOutwardsFailureMechanism failureMechanism = CreateFailureMechanismWithHydraulicBoundaryOutput(assessmentSection); + GrassCoverErosionOutwardsWaveConditionsCalculation calculation = CreateValidCalculation(assessmentSection.HydraulicBoundaryDatabase.Locations.First()); - var grassCoverErosionOutwardsFailureMechanism = new GrassCoverErosionOutwardsFailureMechanism(); - var activity = new GrassCoverErosionOutwardsWaveConditionsCalculationActivity(calculation, validFilePath, - grassCoverErosionOutwardsFailureMechanism, + failureMechanism, assessmentSection); - int nrOfCalculators = GetWaterLevels(calculation).Count(); + int nrOfCalculators = GetWaterLevels(calculation, failureMechanism, assessmentSection).Count(); var mockRepository = new MockRepository(); var calculatorFactory = mockRepository.StrictMock(); @@ -509,20 +500,19 @@ public void Run_HydraulicBoundaryDatabaseWithUsePreprocessorTrue_CreateWaveConditionsCosineCalculatorAsExpected() { // Setup - GrassCoverErosionOutwardsWaveConditionsCalculation calculation = CreateValidCalculation(); - AssessmentSection assessmentSection = CreateAssessmentSectionWithHydraulicBoundaryOutput(calculation.InputParameters.HydraulicBoundaryLocation); + AssessmentSectionStub assessmentSection = CreateAssessmentSection(); + GrassCoverErosionOutwardsFailureMechanism failureMechanism = CreateFailureMechanismWithHydraulicBoundaryOutput(assessmentSection); + GrassCoverErosionOutwardsWaveConditionsCalculation calculation = CreateValidCalculation(assessmentSection.HydraulicBoundaryDatabase.Locations.First()); assessmentSection.HydraulicBoundaryDatabase.CanUsePreprocessor = true; assessmentSection.HydraulicBoundaryDatabase.UsePreprocessor = true; assessmentSection.HydraulicBoundaryDatabase.PreprocessorDirectory = validPreprocessorDirectory; - var grassCoverErosionOutwardsFailureMechanism = new GrassCoverErosionOutwardsFailureMechanism(); - var activity = new GrassCoverErosionOutwardsWaveConditionsCalculationActivity(calculation, validFilePath, - grassCoverErosionOutwardsFailureMechanism, + failureMechanism, assessmentSection); - int nrOfCalculators = GetWaterLevels(calculation).Count(); + int nrOfCalculators = GetWaterLevels(calculation, failureMechanism, assessmentSection).Count(); var mockRepository = new MockRepository(); var calculatorFactory = mockRepository.StrictMock(); @@ -546,20 +536,19 @@ public void Run_HydraulicBoundaryDatabaseWithUsePreprocessorFalse_CreateWaveConditionsCosineCalculatorAsExpected() { // Setup - GrassCoverErosionOutwardsWaveConditionsCalculation calculation = CreateValidCalculation(); - AssessmentSection assessmentSection = CreateAssessmentSectionWithHydraulicBoundaryOutput(calculation.InputParameters.HydraulicBoundaryLocation); + AssessmentSectionStub assessmentSection = CreateAssessmentSection(); + GrassCoverErosionOutwardsFailureMechanism failureMechanism = CreateFailureMechanismWithHydraulicBoundaryOutput(assessmentSection); + GrassCoverErosionOutwardsWaveConditionsCalculation calculation = CreateValidCalculation(assessmentSection.HydraulicBoundaryDatabase.Locations.First()); assessmentSection.HydraulicBoundaryDatabase.CanUsePreprocessor = true; assessmentSection.HydraulicBoundaryDatabase.UsePreprocessor = false; assessmentSection.HydraulicBoundaryDatabase.PreprocessorDirectory = "InvalidPreprocessorDirectory"; - var grassCoverErosionOutwardsFailureMechanism = new GrassCoverErosionOutwardsFailureMechanism(); - var activity = new GrassCoverErosionOutwardsWaveConditionsCalculationActivity(calculation, validFilePath, - grassCoverErosionOutwardsFailureMechanism, + failureMechanism, assessmentSection); - int nrOfCalculators = GetWaterLevels(calculation).Count(); + int nrOfCalculators = GetWaterLevels(calculation, failureMechanism, assessmentSection).Count(); var mockRepository = new MockRepository(); var calculatorFactory = mockRepository.StrictMock(); @@ -579,13 +568,26 @@ mockRepository.VerifyAll(); } - private static GrassCoverErosionOutwardsWaveConditionsCalculation CreateValidCalculation() + private static GrassCoverErosionOutwardsFailureMechanism CreateFailureMechanismWithHydraulicBoundaryOutput(AssessmentSectionStub assessmentSection) { + var failureMechanism = new GrassCoverErosionOutwardsFailureMechanism(); + GrassCoverErosionOutwardsHydraulicBoundaryLocationsTestHelper.SetHydraulicBoundaryLocations( + failureMechanism, + assessmentSection, new[] + { + new HydraulicBoundaryLocation(1300001, string.Empty, 0, 0) + }); + failureMechanism.WaterLevelCalculationsForMechanismSpecificLowerLimitNorm.First().Output = new TestHydraulicBoundaryLocationOutput(9.3); + return failureMechanism; + } + + private static GrassCoverErosionOutwardsWaveConditionsCalculation CreateValidCalculation(HydraulicBoundaryLocation location) + { return new GrassCoverErosionOutwardsWaveConditionsCalculation { InputParameters = { - HydraulicBoundaryLocation = new HydraulicBoundaryLocation(1300001, string.Empty, 0, 0), + HydraulicBoundaryLocation = location, ForeshoreProfile = new TestForeshoreProfile(true), UseForeshore = true, UseBreakWater = true, @@ -598,30 +600,26 @@ }; } - private static AssessmentSection CreateAssessmentSectionWithHydraulicBoundaryOutput(HydraulicBoundaryLocation hydraulicBoundaryLocation) + private static AssessmentSectionStub CreateAssessmentSection() { - hydraulicBoundaryLocation.DesignWaterLevelCalculation1.Output = new TestHydraulicBoundaryLocationOutput(9.3); - - return new AssessmentSection(AssessmentSectionComposition.Dike) + return new AssessmentSectionStub { FailureMechanismContribution = { NormativeNorm = NormType.LowerLimit }, HydraulicBoundaryDatabase = { - FilePath = validFilePath, - Locations = - { - hydraulicBoundaryLocation - } + FilePath = validFilePath } }; } - private static IEnumerable GetWaterLevels(GrassCoverErosionOutwardsWaveConditionsCalculation calculation) + private static IEnumerable GetWaterLevels(GrassCoverErosionOutwardsWaveConditionsCalculation calculation, + GrassCoverErosionOutwardsFailureMechanism failureMechanism, + IAssessmentSection assessmentSection) { - return calculation.InputParameters.GetWaterLevels(calculation.InputParameters.HydraulicBoundaryLocation?.DesignWaterLevelCalculation1.Output?.Result ?? RoundedDouble.NaN); + return calculation.InputParameters.GetWaterLevels(failureMechanism.GetNormativeAssessmentLevel(assessmentSection, calculation.InputParameters.HydraulicBoundaryLocation)); } } } \ No newline at end of file