Index: Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Service/GrassCoverErosionInwardsCalculationActivity.cs =================================================================== diff -u -r08adf25cc7efeb88759bcba90e9881466fbf60f9 -r033d7b8a24f6a4b966258700bc135a1a68881aff --- Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Service/GrassCoverErosionInwardsCalculationActivity.cs (.../GrassCoverErosionInwardsCalculationActivity.cs) (revision 08adf25cc7efeb88759bcba90e9881466fbf60f9) +++ Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Service/GrassCoverErosionInwardsCalculationActivity.cs (.../GrassCoverErosionInwardsCalculationActivity.cs) (revision 033d7b8a24f6a4b966258700bc135a1a68881aff) @@ -25,6 +25,7 @@ using Ringtoets.Common.Data.FailureMechanism; using Ringtoets.Common.Service; using Ringtoets.GrassCoverErosionInwards.Data; +using Ringtoets.GrassCoverErosionInwards.Service.Properties; using Ringtoets.GrassCoverErosionInwards.Utils; using Ringtoets.HydraRing.Calculation.Activities; @@ -89,12 +90,30 @@ PerformRun(() => GrassCoverErosionInwardsCalculationService.Validate(calculation, assessmentSection), () => calculation.ClearOutput(), - () => GrassCoverErosionInwardsCalculationService.Calculate(calculation, - assessmentSection, - hlcdDirectory, - failureMechanismSection, - failureMechanismSection.Name, // TODO: Provide name of reference line instead - failureMechanism.GeneralInput)); + () => + { + ProgressText = Resources.GrassCoverErosionInwardsCalculationActivity_OnRun_Calculate_probability; + GrassCoverErosionInwardsCalculationServiceOutput output = + GrassCoverErosionInwardsCalculationService.CalculateProbability(calculation, + hlcdDirectory, + failureMechanismSection, + failureMechanismSection.Name, // TODO: Provide name of reference line instead + failureMechanism.GeneralInput); + + if (output != null && calculation.InputParameters.CalculateDikeHeight) + { + ProgressText = Resources.GrassCoverErosionInwardsCalculationActivity_OnRun_Calculate_dikeHeight; + output.DikeHeight = + GrassCoverErosionInwardsCalculationService.CalculateDikeHeight(calculation, + assessmentSection, + hlcdDirectory, + failureMechanismSection, + failureMechanismSection.Name, // TODO : Provide name of reference line instead + failureMechanism.GeneralInput); + } + + return output; + }); } protected override void OnFinish() Index: Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Service/GrassCoverErosionInwardsCalculationService.cs =================================================================== diff -u -ra2816cf7e28f73c0ea8c9432cee533ace72543cc -r033d7b8a24f6a4b966258700bc135a1a68881aff --- Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Service/GrassCoverErosionInwardsCalculationService.cs (.../GrassCoverErosionInwardsCalculationService.cs) (revision a2816cf7e28f73c0ea8c9432cee533ace72543cc) +++ Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Service/GrassCoverErosionInwardsCalculationService.cs (.../GrassCoverErosionInwardsCalculationService.cs) (revision 033d7b8a24f6a4b966258700bc135a1a68881aff) @@ -58,26 +58,23 @@ } /// - /// Performs a grass cover erosion inwards calculation based on the supplied and sets - /// if the calculation was successful. Error and status information is logged during the execution of the operation. + /// Performs a grass cover erosion inwards calculation based on the supplied + /// and sets if the calculation was successful. + /// Error and status information is logged during the execution of the operation. /// /// The that holds all the information required to perform the calculation. - /// The that holds information about the norm used in the calculation. /// The directory of the HLCD file that should be used for performing the calculation. /// The to create input with. /// The id of the ring to perform the calculation for. /// Calculation input parameters that apply to all instances. /// A on a successful calculation, null otherwise. - internal static GrassCoverErosionInwardsCalculationServiceOutput Calculate(GrassCoverErosionInwardsCalculation calculation, - IAssessmentSection assessmentSection, - string hlcdDirectory, FailureMechanismSection failureMechanismSection, - string ringId, GeneralGrassCoverErosionInwardsInput generalInput) + internal static GrassCoverErosionInwardsCalculationServiceOutput CalculateProbability(GrassCoverErosionInwardsCalculation calculation, + string hlcdDirectory, FailureMechanismSection failureMechanismSection, + string ringId, GeneralGrassCoverErosionInwardsInput generalInput) { OvertoppingCalculationInput overtoppingCalculationInput = CreateOvertoppingInput(calculation, failureMechanismSection, generalInput); var exceedanceProbabilityCalculationParser = new ExceedanceProbabilityCalculationParser(); var waveHeightCalculationParser = new WaveHeightCalculationParser(); - var targetProbabiltyCalculationParser = new TargetProbabilityCalculationParser(); - var calculateDikeHeight = calculation.InputParameters.CalculateDikeHeight; CalculationServiceHelper.PerformCalculation( calculation.Name, @@ -96,44 +93,56 @@ }); VerifyOvertoppingCalculationOutput(exceedanceProbabilityCalculationParser.Output, waveHeightCalculationParser.Output, calculation.Name); + }); - if (calculateDikeHeight) - { - DikeHeightCalculationInput dikeHeightCalculationInput = CreateDikeHeightInput(calculation, assessmentSection, failureMechanismSection, generalInput); + return exceedanceProbabilityCalculationParser.Output != null + && waveHeightCalculationParser.Output != null ? new GrassCoverErosionInwardsCalculationServiceOutput( + exceedanceProbabilityCalculationParser.Output.Beta, + waveHeightCalculationParser.Output.WaveHeight, + waveHeightCalculationParser.Output.IsOvertoppingDominant, + null) : null; + } - HydraRingCalculationService.PerformCalculation( - hlcdDirectory, - ringId, - HydraRingTimeIntegrationSchemeType.FerryBorgesCastanheta, - HydraRingUncertaintiesType.All, - dikeHeightCalculationInput, - new IHydraRingFileParser[] - { - targetProbabiltyCalculationParser - }); + /// + /// Performs a grass cover erosion inwards dike height calculation based on the supplied + /// and sets if the calculation was successful. + /// Error and status information is logged during the execution of the operation. + /// + /// The that holds all the information required to perform the calculation. + /// The that holds information about the norm used in the calculation. + /// The directory of the HLCD file that should be used for performing the calculation. + /// The to create input with. + /// The id of the ring to perform the calculation for. + /// Calculation input parameters that apply to all instances. + /// A double with a value on a successful calculation, double.NaN otherwise. + internal static double CalculateDikeHeight(GrassCoverErosionInwardsCalculation calculation, + IAssessmentSection assessmentSection, + string hlcdDirectory, FailureMechanismSection failureMechanismSection, + string ringId, GeneralGrassCoverErosionInwardsInput generalInput) + { + var targetProbabiltyCalculationParser = new TargetProbabilityCalculationParser(); - VerifyDikeHeightCalculationOutput(targetProbabiltyCalculationParser.Output, calculation.Name); - } - }); + CalculationServiceHelper.PerformCalculation( + calculation.Name, + () => + { + DikeHeightCalculationInput dikeHeightCalculationInput = CreateDikeHeightInput(calculation, assessmentSection, failureMechanismSection, generalInput); - if (exceedanceProbabilityCalculationParser.Output == null || waveHeightCalculationParser.Output == null) - { - return null; - } + HydraRingCalculationService.PerformCalculation( + hlcdDirectory, + ringId, + HydraRingTimeIntegrationSchemeType.FerryBorgesCastanheta, + HydraRingUncertaintiesType.All, + dikeHeightCalculationInput, + new IHydraRingFileParser[] + { + targetProbabiltyCalculationParser + }); - double? dikeHeightOutput = null; + VerifyDikeHeightCalculationOutput(targetProbabiltyCalculationParser.Output, calculation.Name); + }); - if (calculateDikeHeight) - { - TargetProbabilityCalculationOutput output = targetProbabiltyCalculationParser.Output; - dikeHeightOutput = output == null ? double.NaN : output.Result; - } - - return new GrassCoverErosionInwardsCalculationServiceOutput( - exceedanceProbabilityCalculationParser.Output.Beta, - waveHeightCalculationParser.Output.WaveHeight, - waveHeightCalculationParser.Output.IsOvertoppingDominant, - dikeHeightOutput); + return targetProbabiltyCalculationParser.Output == null ? double.NaN : targetProbabiltyCalculationParser.Output.Result; } private static void VerifyOvertoppingCalculationOutput(ExceedanceProbabilityCalculationOutput exceedanceOutput, WaveHeightCalculationOutput waveHeightOutput, string name) @@ -152,25 +161,27 @@ } } - private static OvertoppingCalculationInput CreateOvertoppingInput(GrassCoverErosionInwardsCalculation calculation, FailureMechanismSection failureMechanismSection, GeneralGrassCoverErosionInwardsInput generalInput) + private static OvertoppingCalculationInput CreateOvertoppingInput(GrassCoverErosionInwardsCalculation calculation, + FailureMechanismSection failureMechanismSection, + GeneralGrassCoverErosionInwardsInput generalInput) { return new OvertoppingCalculationInput(calculation.InputParameters.HydraulicBoundaryLocation.Id, new HydraRingSection(1, failureMechanismSection.GetSectionLength(), calculation.InputParameters.Orientation), - calculation.InputParameters.DikeHeight, + calculation.InputParameters.DikeHeight, generalInput.CriticalOvertoppingModelFactor, - generalInput.FbFactor.Mean, + generalInput.FbFactor.Mean, generalInput.FbFactor.StandardDeviation, - generalInput.FnFactor.Mean, + generalInput.FnFactor.Mean, generalInput.FnFactor.StandardDeviation, - generalInput.OvertoppingModelFactor, + generalInput.OvertoppingModelFactor, calculation.InputParameters.CriticalFlowRate.Mean, - calculation.InputParameters.CriticalFlowRate.StandardDeviation, - generalInput.FrunupModelFactor.Mean, - generalInput.FrunupModelFactor.StandardDeviation, - generalInput.FshallowModelFactor.Mean, - generalInput.FshallowModelFactor.StandardDeviation, + calculation.InputParameters.CriticalFlowRate.StandardDeviation, + generalInput.FrunupModelFactor.Mean, + generalInput.FrunupModelFactor.StandardDeviation, + generalInput.FshallowModelFactor.Mean, + generalInput.FshallowModelFactor.StandardDeviation, ParseProfilePoints(calculation.InputParameters.DikeGeometry), - ParseForeshore(calculation.InputParameters), + ParseForeshore(calculation.InputParameters), ParseBreakWater(calculation.InputParameters)); } Index: Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Service/GrassCoverErosionInwardsCalculationServiceOutput.cs =================================================================== diff -u -r08adf25cc7efeb88759bcba90e9881466fbf60f9 -r033d7b8a24f6a4b966258700bc135a1a68881aff --- Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Service/GrassCoverErosionInwardsCalculationServiceOutput.cs (.../GrassCoverErosionInwardsCalculationServiceOutput.cs) (revision 08adf25cc7efeb88759bcba90e9881466fbf60f9) +++ Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Service/GrassCoverErosionInwardsCalculationServiceOutput.cs (.../GrassCoverErosionInwardsCalculationServiceOutput.cs) (revision 033d7b8a24f6a4b966258700bc135a1a68881aff) @@ -58,8 +58,8 @@ public bool IsOvertoppingDominant { get; private set; } /// - /// Gets the dike height that was a result of the dike height calculation. + /// Gets or sets the dike height that was a result of the dike height calculation. /// - public double? DikeHeight { get; private set; } + public double? DikeHeight { get; set; } } } \ No newline at end of file Index: Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Service/Properties/Resources.Designer.cs =================================================================== diff -u -ra34dbc4a2d6b3689cde30ea81370912cdaa858ce -r033d7b8a24f6a4b966258700bc135a1a68881aff --- Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Service/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision a34dbc4a2d6b3689cde30ea81370912cdaa858ce) +++ Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Service/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision 033d7b8a24f6a4b966258700bc135a1a68881aff) @@ -61,6 +61,24 @@ } /// + /// Looks up a localized string similar to HBN berekenen. + /// + internal static string GrassCoverErosionInwardsCalculationActivity_OnRun_Calculate_dikeHeight { + get { + return ResourceManager.GetString("GrassCoverErosionInwardsCalculationActivity_OnRun_Calculate_dikeHeight", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Faalkans berekenen. + /// + internal static string GrassCoverErosionInwardsCalculationActivity_OnRun_Calculate_probability { + get { + return ResourceManager.GetString("GrassCoverErosionInwardsCalculationActivity_OnRun_Calculate_probability", resourceCulture); + } + } + + /// /// Looks up a localized string similar to De berekening voor grasbekleding erosie kruin en binnentalud '{0}' is niet gelukt.. /// internal static string GrassCoverErosionInwardsCalculationService_Calculate_Error_in_grass_cover_erosion_inwards_0_calculation { Index: Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Service/Properties/Resources.resx =================================================================== diff -u -ra34dbc4a2d6b3689cde30ea81370912cdaa858ce -r033d7b8a24f6a4b966258700bc135a1a68881aff --- Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Service/Properties/Resources.resx (.../Resources.resx) (revision a34dbc4a2d6b3689cde30ea81370912cdaa858ce) +++ Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Service/Properties/Resources.resx (.../Resources.resx) (revision 033d7b8a24f6a4b966258700bc135a1a68881aff) @@ -123,4 +123,10 @@ De HBN berekening voor grasbekleding erosie kruin en binnentalud '{0}' is niet gelukt. + + Faalkans berekenen + + + HBN berekenen + \ No newline at end of file Index: Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Integration.Test/GrassCoverErosionInwardsCalculationActivityIntegrationTest.cs =================================================================== diff -u -r53aef346fd0ee3cc79d1f5df9171c476453f2935 -r033d7b8a24f6a4b966258700bc135a1a68881aff --- Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Integration.Test/GrassCoverErosionInwardsCalculationActivityIntegrationTest.cs (.../GrassCoverErosionInwardsCalculationActivityIntegrationTest.cs) (revision 53aef346fd0ee3cc79d1f5df9171c476453f2935) +++ Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Integration.Test/GrassCoverErosionInwardsCalculationActivityIntegrationTest.cs (.../GrassCoverErosionInwardsCalculationActivityIntegrationTest.cs) (revision 033d7b8a24f6a4b966258700bc135a1a68881aff) @@ -33,6 +33,7 @@ using Ringtoets.Common.Data.FailureMechanism; using Ringtoets.GrassCoverErosionInwards.Data; using Ringtoets.GrassCoverErosionInwards.Service; +using Ringtoets.GrassCoverErosionInwards.Service.Properties; using Ringtoets.HydraRing.Data; using Ringtoets.Integration.Data; using Ringtoets.Integration.Plugin.FileImporters; @@ -186,7 +187,7 @@ } }; - var activity = new GrassCoverErosionInwardsCalculationActivity(calculation, testDataPath, assessmentSection.GrassCoverErosionInwards, assessmentSection); + var activity = new GrassCoverErosionInwardsCalculationActivity(calculation, testDataPath, assessmentSection.GrassCoverErosionInwards, assessmentSection); // Call Action call = () => activity.Run(); @@ -205,7 +206,7 @@ } [Test] - public void Run_InvalidGrassCoverErosionInwardsCalculationAndRan_PerformGrassCoverErosionInwardsValidationAndCalculationAndLogStartAndEndAndError() + public void Run_InvalidGrassCoverErosionInwardsCalculationAndRan_PerformGrassCoverErosionInwardsValidationAndCalculationAndLogStartAndEndAndErrorAndDoesNotPerformDikeHeightCalculation() { // Setup var mocks = new MockRepository(); @@ -253,11 +254,161 @@ } [Test] - public void Finish_ValidGrassCoverErosionInwardsCalculationAndRan_SetsOutputAndNotifyObserversOfGrassCoverErosionInwardsCalculation() + public void Run_CalculateDikeHeightTrueAndValidProbabilityCalculationAndInvalidDikeHeightCalculationAndRan_PerformGrassCoverErosionInwardsValidationAndCalculationAndLogStartAndEndAndError() { // Setup var mocks = new MockRepository(); var observerMock = mocks.StrictMock(); + mocks.ReplayAll(); + + var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike) + { + FailureMechanismContribution = + { + Norm = 1 + } + }; + ImportHydraulicBoundaryDatabase(assessmentSection); + + assessmentSection.GrassCoverErosionInwards.AddSection(new FailureMechanismSection("test section", new[] + { + new Point2D(0, 0), + new Point2D(1, 1) + })); + + var calculation = new GrassCoverErosionInwardsCalculation + { + InputParameters = + { + HydraulicBoundaryLocation = assessmentSection.HydraulicBoundaryDatabase.Locations.First(hl => hl.Id == 1300001), + DikeProfile = CreateDikeProfile(), + CalculateDikeHeight = true + } + }; + + calculation.Attach(observerMock); + + var activity = new GrassCoverErosionInwardsCalculationActivity(calculation, testDataPath, assessmentSection.GrassCoverErosionInwards, assessmentSection); + + // Call + Action call = () => activity.Run(); + + // Assert + TestHelper.AssertLogMessages(call, messages => + { + var msgs = messages.ToArray(); + Assert.AreEqual(7, msgs.Length); + StringAssert.StartsWith(String.Format("Validatie van '{0}' gestart om: ", calculation.Name), msgs[0]); + StringAssert.StartsWith(String.Format("Validatie van '{0}' beëindigd om: ", calculation.Name), msgs[1]); + StringAssert.StartsWith(String.Format("Berekening van '{0}' gestart om: ", calculation.Name), msgs[2]); + StringAssert.StartsWith(String.Format("Berekening van '{0}' beëindigd om: ", calculation.Name), msgs[3]); + StringAssert.StartsWith(String.Format("Berekening van '{0}' gestart om: ", calculation.Name), msgs[4]); + StringAssert.StartsWith(String.Format("De HBN berekening voor grasbekleding erosie kruin en binnentalud '{0}' is niet gelukt.", calculation.Name), msgs[5]); + StringAssert.StartsWith(String.Format("Berekening van '{0}' beëindigd om: ", calculation.Name), msgs[6]); + }); + Assert.AreEqual(ActivityState.Executed, activity.State); + mocks.VerifyAll(); // Expect no calls on the observer + } + + [Test] + public void Run_CalculateDikeHeightFalse_ProgressTextSetToProbabilityCalculation() + { + var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike); + ImportHydraulicBoundaryDatabase(assessmentSection); + + assessmentSection.GrassCoverErosionInwards.AddSection(new FailureMechanismSection("test section", new[] + { + new Point2D(0, 0), + new Point2D(1, 1) + })); + + var calculation = new GrassCoverErosionInwardsCalculation + { + InputParameters = + { + HydraulicBoundaryLocation = assessmentSection.HydraulicBoundaryDatabase.Locations.First(hl => hl.Id == 1300001), + DikeProfile = CreateDikeProfile(), + CalculateDikeHeight = false + } + }; + + var activity = new GrassCoverErosionInwardsCalculationActivity(calculation, testDataPath, assessmentSection.GrassCoverErosionInwards, assessmentSection); + + // Call + activity.Run(); + + // Assert + Assert.AreEqual(Resources.GrassCoverErosionInwardsCalculationActivity_OnRun_Calculate_probability, activity.ProgressText); + } + + [Test] + public void Run_CalculateDikeHeightTrueAndInvalidProbabilityCalculation_ProgressTextSetToProbabilityCalculation() + { + var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike); + ImportHydraulicBoundaryDatabase(assessmentSection); + + assessmentSection.GrassCoverErosionInwards.AddSection(new FailureMechanismSection("test section", new[] + { + new Point2D(0, 0), + new Point2D(1, 1) + })); + + var calculation = new GrassCoverErosionInwardsCalculation + { + InputParameters = + { + HydraulicBoundaryLocation = new HydraulicBoundaryLocation(1, "test", 1, 1), + DikeProfile = CreateDikeProfile(), + CalculateDikeHeight = true + } + }; + + var activity = new GrassCoverErosionInwardsCalculationActivity(calculation, testDataPath, assessmentSection.GrassCoverErosionInwards, assessmentSection); + + // Call + activity.Run(); + + // Assert + Assert.AreEqual(Resources.GrassCoverErosionInwardsCalculationActivity_OnRun_Calculate_probability, activity.ProgressText); + } + + [Test] + public void Run_CalculateDikeHeightTrue_ProgressTextSetToDikeHeightCalculation() + { + var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike); + ImportHydraulicBoundaryDatabase(assessmentSection); + + assessmentSection.GrassCoverErosionInwards.AddSection(new FailureMechanismSection("test section", new[] + { + new Point2D(0, 0), + new Point2D(1, 1) + })); + + var calculation = new GrassCoverErosionInwardsCalculation + { + InputParameters = + { + HydraulicBoundaryLocation = assessmentSection.HydraulicBoundaryDatabase.Locations.First(hl => hl.Id == 1300001), + DikeProfile = CreateDikeProfile(), + CalculateDikeHeight = true + } + }; + + var activity = new GrassCoverErosionInwardsCalculationActivity(calculation, testDataPath, assessmentSection.GrassCoverErosionInwards, assessmentSection); + + // Call + activity.Run(); + + // Assert + Assert.AreEqual(Resources.GrassCoverErosionInwardsCalculationActivity_OnRun_Calculate_dikeHeight, activity.ProgressText); + } + + [Test] + public void Finish_CalculateDikeHeightFalseAndValidGrassCoverErosionInwardsCalculationAndRan_SetsOutputAndNotifyObserversOfGrassCoverErosionInwardsCalculation() + { + // Setup + var mocks = new MockRepository(); + var observerMock = mocks.StrictMock(); observerMock.Expect(o => o.UpdateObserver()); mocks.ReplayAll(); @@ -275,7 +426,8 @@ InputParameters = { HydraulicBoundaryLocation = assessmentSection.HydraulicBoundaryDatabase.Locations.First(hl => hl.Id == 1300001), - DikeProfile = CreateDikeProfile() + DikeProfile = CreateDikeProfile(), + CalculateDikeHeight = false } }; @@ -295,11 +447,15 @@ Assert.AreEqual((RoundedDouble) 2.792, calculation.Output.Reliability); Assert.AreEqual(1.0/250000.0, calculation.Output.RequiredProbability); Assert.AreEqual((RoundedDouble) 4.465, calculation.Output.RequiredReliability); + Assert.IsNaN(calculation.Output.DikeHeight); + Assert.IsFalse(calculation.Output.DikeHeightCalculated); mocks.VerifyAll(); } [Test] - public void Finish_InvalidGrassCoverErosionInwardsCalculationAndRan_DoesNotSetOutputAndNotifyObserversOfGrassCoverErosionInwardsCalculation() + [TestCase(false, TestName = "Finish_InvalidCalculationAndRan_DoesNotSetOutputAndNotifyObservers(false)")] + [TestCase(true, TestName = "Finish_InvalidCalculationAndRan_DoesNotSetOutputAndNotifyObservers(true)")] + public void Finish_InvalidGrassCoverErosionInwardsCalculationAndRan_DoesNotSetOutputAndNotifyObservers(bool calculateDikeHeight) { // Setup var mocks = new MockRepository(); @@ -320,7 +476,8 @@ { InputParameters = { - HydraulicBoundaryLocation = new HydraulicBoundaryLocation(1, "test", 1, 1) + HydraulicBoundaryLocation = new HydraulicBoundaryLocation(1, "test", 1, 1), + CalculateDikeHeight = calculateDikeHeight } }; @@ -335,9 +492,108 @@ // Assert Assert.IsNull(calculation.Output); - mocks.VerifyAll(); // Expect no calls on the observer + mocks.VerifyAll(); } + [Test] + public void Finish_CalculateDikeHeightTrueAndValidCalculationsAndRan_OutputSetAndObserversNotified() + { + // Setup + var mocks = new MockRepository(); + var observerMock = mocks.StrictMock(); + observerMock.Expect(o => o.UpdateObserver()); + mocks.ReplayAll(); + + var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike); + ImportHydraulicBoundaryDatabase(assessmentSection); + + assessmentSection.GrassCoverErosionInwards.AddSection(new FailureMechanismSection("test section", new[] + { + new Point2D(0, 0), + new Point2D(1, 1) + })); + + var calculation = new GrassCoverErosionInwardsCalculation + { + InputParameters = + { + HydraulicBoundaryLocation = assessmentSection.HydraulicBoundaryDatabase.Locations.First(hl => hl.Id == 1300001), + DikeProfile = CreateDikeProfile(), + CalculateDikeHeight = true + } + }; + + calculation.Attach(observerMock); + + var activity = new GrassCoverErosionInwardsCalculationActivity(calculation, testDataPath, assessmentSection.GrassCoverErosionInwards, assessmentSection); + + activity.Run(); + + // Call + activity.Finish(); + + // Assert + Assert.IsNotNull(calculation.Output); + Assert.AreEqual((RoundedDouble) 0.625, calculation.Output.FactorOfSafety); + Assert.AreEqual(0.002617555933643434d, calculation.Output.Probability); + Assert.AreEqual((RoundedDouble) 2.792, calculation.Output.Reliability); + Assert.AreEqual(1.0/250000.0, calculation.Output.RequiredProbability); + Assert.AreEqual((RoundedDouble) 4.465, calculation.Output.RequiredReliability); + Assert.AreEqual((RoundedDouble) 6.94, calculation.Output.DikeHeight); + Assert.IsTrue(calculation.Output.DikeHeightCalculated); + mocks.VerifyAll(); + } + + [Test] + public void Finish_CalculateDikeHeightTrueAndInvalidDikeHeightCalculationAndRan_OutputSetAndObserversNotified() + { + // Setup + var mocks = new MockRepository(); + var observerMock = mocks.StrictMock(); + observerMock.Expect(o => o.UpdateObserver()); + mocks.ReplayAll(); + + var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike) + { + FailureMechanismContribution = + { + Norm = 1 + } + }; + ImportHydraulicBoundaryDatabase(assessmentSection); + + assessmentSection.GrassCoverErosionInwards.AddSection(new FailureMechanismSection("test section", new[] + { + new Point2D(0, 0), + new Point2D(1, 1) + })); + + var calculation = new GrassCoverErosionInwardsCalculation + { + InputParameters = + { + HydraulicBoundaryLocation = assessmentSection.HydraulicBoundaryDatabase.Locations.First(hl => hl.Id == 1300001), + DikeProfile = CreateDikeProfile(), + CalculateDikeHeight = true + } + }; + + calculation.Attach(observerMock); + + var activity = new GrassCoverErosionInwardsCalculationActivity(calculation, testDataPath, assessmentSection.GrassCoverErosionInwards, assessmentSection); + + activity.Run(); + + // Call + activity.Finish(); + + // Assert + Assert.IsNotNull(calculation.Output); + Assert.IsNaN(calculation.Output.DikeHeight); + Assert.IsTrue(calculation.Output.DikeHeightCalculated); + mocks.VerifyAll(); + } + private void ImportHydraulicBoundaryDatabase(AssessmentSection assessmentSection) { string validFilePath = Path.Combine(testDataPath, "HRD dutch coast south.sqlite"); Index: Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Integration.Test/GrassCoverErosionInwardsCalculationServiceIntegrationTest.cs =================================================================== diff -u -r53aef346fd0ee3cc79d1f5df9171c476453f2935 -r033d7b8a24f6a4b966258700bc135a1a68881aff --- Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Integration.Test/GrassCoverErosionInwardsCalculationServiceIntegrationTest.cs (.../GrassCoverErosionInwardsCalculationServiceIntegrationTest.cs) (revision 53aef346fd0ee3cc79d1f5df9171c476453f2935) +++ Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Integration.Test/GrassCoverErosionInwardsCalculationServiceIntegrationTest.cs (.../GrassCoverErosionInwardsCalculationServiceIntegrationTest.cs) (revision 033d7b8a24f6a4b966258700bc135a1a68881aff) @@ -189,7 +189,7 @@ } [Test] - public void Calculate_ValidCalculation_LogStartAndEndAndReturnOutput() + public void CalculateProbability_ValidCalculation_LogStartAndEndAndReturnOutput() { // Setup var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike); @@ -216,12 +216,11 @@ GrassCoverErosionInwardsCalculationServiceOutput output = null; // Call - Action call = () => output = GrassCoverErosionInwardsCalculationService.Calculate(calculation, - assessmentSection, - testDataPath, - failureMechanismSection, - failureMechanismSection.Name, - assessmentSection.GrassCoverErosionInwards.GeneralInput); + Action call = () => output = GrassCoverErosionInwardsCalculationService.CalculateProbability(calculation, + testDataPath, + failureMechanismSection, + failureMechanismSection.Name, + assessmentSection.GrassCoverErosionInwards.GeneralInput); // Assert TestHelper.AssertLogMessages(call, messages => @@ -232,10 +231,11 @@ StringAssert.StartsWith(String.Format("Berekening van '{0}' beëindigd om: ", calculation.Name), msgs[1]); }); Assert.IsNotNull(output); + Assert.IsNull(output.DikeHeight); } [Test] - public void Calculate_InvalidCalculation_LogStartAndEndAndErrorMessageAndReturnNull() + public void CalculateProbability_InvalidCalculation_LogStartAndEndAndErrorMessageAndReturnNull() { // Setup var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike); @@ -259,12 +259,11 @@ GrassCoverErosionInwardsCalculationServiceOutput output = null; // Call - Action call = () => output = GrassCoverErosionInwardsCalculationService.Calculate(calculation, - assessmentSection, - testDataPath, - failureMechanismSection, - failureMechanismSection.Name, - assessmentSection.GrassCoverErosionInwards.GeneralInput); + Action call = () => output = GrassCoverErosionInwardsCalculationService.CalculateProbability(calculation, + testDataPath, + failureMechanismSection, + failureMechanismSection.Name, + assessmentSection.GrassCoverErosionInwards.GeneralInput); // Assert TestHelper.AssertLogMessages(call, messages => @@ -279,7 +278,7 @@ } [Test] - public void Calculate_CalculateDikeHeightFalse_DikeHeightNotCalculated() + public void CalculateDikeHeight_CalculationValid_DikeHeightCalculated() { // Setup var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike); @@ -299,63 +298,15 @@ { HydraulicBoundaryLocation = assessmentSection.HydraulicBoundaryDatabase.Locations.First(hl => hl.Id == 1300001), DikeProfile = dikeProfile, - CalculateDikeHeight = false - } - }; - - var failureMechanismSection = assessmentSection.GrassCoverErosionInwards.Sections.First(); - GrassCoverErosionInwardsCalculationServiceOutput output = null; - - // Call - Action call = () => output = GrassCoverErosionInwardsCalculationService.Calculate(calculation, - assessmentSection, - testDataPath, - failureMechanismSection, - failureMechanismSection.Name, - assessmentSection.GrassCoverErosionInwards.GeneralInput); - - // Assert - TestHelper.AssertLogMessages(call, messages => - { - var msgs = messages.ToArray(); - Assert.AreEqual(2, msgs.Length); - StringAssert.StartsWith(String.Format("Berekening van '{0}' gestart om: ", calculation.Name), msgs[0]); - StringAssert.StartsWith(String.Format("Berekening van '{0}' beëindigd om: ", calculation.Name), msgs[1]); - }); - Assert.IsNotNull(output); - Assert.IsNull(output.DikeHeight); - } - - [Test] - public void Calculate_CalculateDikeHeightTrue_DikeHeightCalculated() - { - // Setup - var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike); - ImportHydraulicBoundaryDatabase(assessmentSection); - - assessmentSection.GrassCoverErosionInwards.AddSection(new FailureMechanismSection("test section", new[] - { - new Point2D(0, 0), - new Point2D(1, 1) - })); - - var dikeProfile = GetDikeProfile(); - - var calculation = new GrassCoverErosionInwardsCalculation - { - InputParameters = - { - HydraulicBoundaryLocation = assessmentSection.HydraulicBoundaryDatabase.Locations.First(hl => hl.Id == 1300001), - DikeProfile = dikeProfile, CalculateDikeHeight = true } }; var failureMechanismSection = assessmentSection.GrassCoverErosionInwards.Sections.First(); - GrassCoverErosionInwardsCalculationServiceOutput output = null; + double? output = null; // Call - Action call = () => output = GrassCoverErosionInwardsCalculationService.Calculate(calculation, + Action call = () => output = GrassCoverErosionInwardsCalculationService.CalculateDikeHeight(calculation, assessmentSection, testDataPath, failureMechanismSection, @@ -370,12 +321,11 @@ StringAssert.StartsWith(String.Format("Berekening van '{0}' gestart om: ", calculation.Name), msgs[0]); StringAssert.StartsWith(String.Format("Berekening van '{0}' beëindigd om: ", calculation.Name), msgs[1]); }); - Assert.IsNotNull(output); - Assert.AreEqual(15.5937, output.DikeHeight); + Assert.AreEqual(15.5937, output); } [Test] - public void Calculate_CalculateDikeHeightTrueDikeHeightCalculationFails_DikeHeightOutputNaN() + public void CalculateDikeHeight_CalculationFails_DikeHeightOutputNaN() { // Setup var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike) @@ -406,15 +356,15 @@ }; var failureMechanismSection = assessmentSection.GrassCoverErosionInwards.Sections.First(); - GrassCoverErosionInwardsCalculationServiceOutput output = null; + double? output = null; // Call - Action call = () => output = GrassCoverErosionInwardsCalculationService.Calculate(calculation, - assessmentSection, - testDataPath, - failureMechanismSection, - failureMechanismSection.Name, - assessmentSection.GrassCoverErosionInwards.GeneralInput); + Action call = () => output = GrassCoverErosionInwardsCalculationService.CalculateDikeHeight(calculation, + assessmentSection, + testDataPath, + failureMechanismSection, + failureMechanismSection.Name, + assessmentSection.GrassCoverErosionInwards.GeneralInput); // Assert TestHelper.AssertLogMessages(call, messages => @@ -425,58 +375,9 @@ StringAssert.StartsWith(String.Format("De HBN berekening voor grasbekleding erosie kruin en binnentalud '{0}' is niet gelukt.", calculation.Name), msgs[1]); StringAssert.StartsWith(String.Format("Berekening van '{0}' beëindigd om: ", calculation.Name), msgs[2]); }); - Assert.IsNotNull(output); - Assert.IsNaN(output.DikeHeight); + Assert.IsNaN(output); } - [Test] - public void Calculate_CalculateDikeHeightTrueAndCalculationInvalid_LogStartAndEndAndErrorMessageAndReturnNull() - { - // Setup - var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike); - ImportHydraulicBoundaryDatabase(assessmentSection); - - assessmentSection.GrassCoverErosionInwards.AddSection(new FailureMechanismSection("test section", new[] - { - new Point2D(0, 0), - new Point2D(1, 1) - })); - - var calculation = new GrassCoverErosionInwardsCalculation - { - InputParameters = - { - HydraulicBoundaryLocation = assessmentSection.HydraulicBoundaryDatabase.Locations.First(hl => hl.Id == 1300001), - DikeProfile = new DikeProfile(new Point2D(0, 0), new RoughnessPoint[0], new Point2D[0], - null, new DikeProfile.ConstructionProperties()), - CalculateDikeHeight = true - } - }; - - var failureMechanismSection = assessmentSection.GrassCoverErosionInwards.Sections.First(); - GrassCoverErosionInwardsCalculationServiceOutput output = null; - - // Call - Action call = () => output = GrassCoverErosionInwardsCalculationService.Calculate(calculation, - assessmentSection, - testDataPath, - failureMechanismSection, - failureMechanismSection.Name, - assessmentSection.GrassCoverErosionInwards.GeneralInput); - - // Assert - TestHelper.AssertLogMessages(call, messages => - { - var msgs = messages.ToArray(); - Assert.AreEqual(4, msgs.Length); - StringAssert.StartsWith(String.Format("Berekening van '{0}' gestart om: ", calculation.Name), msgs[0]); - StringAssert.StartsWith(String.Format("De berekening voor grasbekleding erosie kruin en binnentalud '{0}' is niet gelukt.", calculation.Name), msgs[1]); - StringAssert.StartsWith(String.Format("De HBN berekening voor grasbekleding erosie kruin en binnentalud '{0}' is niet gelukt.", calculation.Name), msgs[2]); - StringAssert.StartsWith(String.Format("Berekening van '{0}' beëindigd om: ", calculation.Name), msgs[3]); - }); - Assert.IsNull(output); - } - private void ImportHydraulicBoundaryDatabase(AssessmentSection assessmentSection) { string validFilePath = Path.Combine(testDataPath, "HRD dutch coast south.sqlite");