Index: Riskeer/Integration/src/Riskeer.Integration.Plugin/Handlers/FailureMechanismContributionNormChangeHandler.cs =================================================================== diff -u -r3fa590784870b7a0692243d07cc47caa8929f47c -r976b9242f7fa5c88c176c86544091059027d05f2 --- Riskeer/Integration/src/Riskeer.Integration.Plugin/Handlers/FailureMechanismContributionNormChangeHandler.cs (.../FailureMechanismContributionNormChangeHandler.cs) (revision 3fa590784870b7a0692243d07cc47caa8929f47c) +++ Riskeer/Integration/src/Riskeer.Integration.Plugin/Handlers/FailureMechanismContributionNormChangeHandler.cs (.../FailureMechanismContributionNormChangeHandler.cs) (revision 976b9242f7fa5c88c176c86544091059027d05f2) @@ -147,11 +147,19 @@ private IEnumerable ClearNormDependingHydraulicBoundaryLocationCalculationOutput(bool normativeNorm) { - IEnumerable calculationsToClear = GetHydraulicBoundaryLocationCalculationsToClear(normativeNorm); + NormType normativeNormType = assessmentSection.FailureMechanismContribution.NormativeNorm; + IEnumerable calculationsToClear = GetHydraulicBoundaryLocationCalculationsToClear(normativeNorm, normativeNormType); - IEnumerable affectedObjects = RiskeerCommonDataSynchronizationService.ClearHydraulicBoundaryLocationCalculationOutput(calculationsToClear) - .ToArray(); + NormType normType = normativeNorm + ? normativeNormType + : normativeNormType == NormType.LowerLimit + ? NormType.Signaling + : NormType.LowerLimit; + var affectedObjects = new List(); + affectedObjects.AddRange(RiskeerCommonDataSynchronizationService.ClearHydraulicBoundaryLocationCalculationOutput(calculationsToClear)); + affectedObjects.AddRange(RiskeerDataSynchronizationService.ClearAllWaveConditionsCalculationOutput(assessmentSection, normType)); + if (affectedObjects.Any()) { log.Info(Resources.FailureMechanismContributionNormChangeHandler_ClearNormDependingHydraulicBoundaryLocationCalculationOutput_Calculation_results_cleared); @@ -160,13 +168,13 @@ return affectedObjects; } - private IEnumerable GetHydraulicBoundaryLocationCalculationsToClear(bool normativeNorm) + private IEnumerable GetHydraulicBoundaryLocationCalculationsToClear(bool normativeNorm, NormType normativeNormType) { return normativeNorm - ? assessmentSection.FailureMechanismContribution.NormativeNorm == NormType.LowerLimit + ? normativeNormType == NormType.LowerLimit ? assessmentSection.WaterLevelCalculationsForLowerLimitNorm : assessmentSection.WaterLevelCalculationsForSignalingNorm - : assessmentSection.FailureMechanismContribution.NormativeNorm == NormType.LowerLimit + : normativeNormType == NormType.LowerLimit ? assessmentSection.WaterLevelCalculationsForSignalingNorm : assessmentSection.WaterLevelCalculationsForLowerLimitNorm; } Index: Riskeer/Integration/test/Riskeer.Integration.Plugin.Test/Handlers/FailureMechanismContributionNormChangeHandlerTest.cs =================================================================== diff -u -r0403b90b2a1c32b0a8e37a2ca14141ba76bba502 -r976b9242f7fa5c88c176c86544091059027d05f2 --- Riskeer/Integration/test/Riskeer.Integration.Plugin.Test/Handlers/FailureMechanismContributionNormChangeHandlerTest.cs (.../FailureMechanismContributionNormChangeHandlerTest.cs) (revision 0403b90b2a1c32b0a8e37a2ca14141ba76bba502) +++ Riskeer/Integration/test/Riskeer.Integration.Plugin.Test/Handlers/FailureMechanismContributionNormChangeHandlerTest.cs (.../FailureMechanismContributionNormChangeHandlerTest.cs) (revision 976b9242f7fa5c88c176c86544091059027d05f2) @@ -32,12 +32,16 @@ using Riskeer.Common.Data.Calculation; using Riskeer.Common.Data.Contribution; using Riskeer.Common.Data.Hydraulics; +using Riskeer.GrassCoverErosionOutwards.Data; using Riskeer.Integration.Data; using Riskeer.Integration.Forms.PropertyClasses; using Riskeer.Integration.Plugin.Handlers; using Riskeer.Integration.TestUtil; using Riskeer.MacroStabilityInwards.Data; using Riskeer.Piping.Data.SemiProbabilistic; +using Riskeer.Revetment.Data; +using Riskeer.StabilityStoneCover.Data; +using Riskeer.WaveImpactAsphaltCover.Data; namespace Riskeer.Integration.Plugin.Test.Handlers { @@ -135,17 +139,15 @@ }; AssessmentSection assessmentSection = TestDataGenerator.GetAssessmentSectionWithAllCalculationConfigurations(); - ICalculation[] expectedAffectedCalculations = assessmentSection.Piping - .Calculations - .OfType() - .Where(c => c.HasOutput && !c.InputParameters.UseAssessmentLevelManualInput) - .Concat( - assessmentSection.MacroStabilityInwards - .Calculations - .OfType() - .Where(c => c.HasOutput && !c.InputParameters.UseAssessmentLevelManualInput)) - .ToArray(); + var expectedAffectedCalculations = new List(); + expectedAffectedCalculations.AddRange(assessmentSection.Piping.Calculations + .OfType() + .Where(c => c.HasOutput && !c.InputParameters.UseAssessmentLevelManualInput)); + expectedAffectedCalculations.AddRange(assessmentSection.MacroStabilityInwards.Calculations + .OfType() + .Where(c => c.HasOutput && !c.InputParameters.UseAssessmentLevelManualInput)); + IEnumerable expectedAffectedObjects = expectedAffectedCalculations.Concat(new IObservable[] { @@ -169,7 +171,7 @@ // Then var expectedMessages = new[] { - $"De resultaten van {expectedAffectedCalculations.Length} semi-probabilistische berekeningen zonder handmatige waterstand zijn verwijderd." + $"De resultaten van {expectedAffectedCalculations.Count} semi-probabilistische berekeningen zonder handmatige waterstand zijn verwijderd." }; TestHelper.AssertLogMessagesAreGenerated(Call, expectedMessages, 1); Assert.IsTrue(actionPerformed); @@ -188,17 +190,15 @@ }; AssessmentSection assessmentSection = TestDataGenerator.GetAssessmentSectionWithAllCalculationConfigurations(); - ICalculation[] calculations = assessmentSection.Piping - .Calculations - .OfType() - .Where(c => c.HasOutput && !c.InputParameters.UseAssessmentLevelManualInput) - .Concat( - assessmentSection.MacroStabilityInwards - .Calculations - .OfType() - .Where(c => c.HasOutput && !c.InputParameters.UseAssessmentLevelManualInput)) - .ToArray(); + var calculations = new List(); + calculations.AddRange(assessmentSection.Piping.Calculations + .OfType() + .Where(c => c.HasOutput && !c.InputParameters.UseAssessmentLevelManualInput)); + calculations.AddRange(assessmentSection.MacroStabilityInwards.Calculations + .OfType() + .Where(c => c.HasOutput && !c.InputParameters.UseAssessmentLevelManualInput)); + calculations.ForEachElementDo(c => c.ClearOutput()); var mocks = new MockRepository(); @@ -276,7 +276,8 @@ [Test] [TestCaseSource(nameof(GetChangeNormativeNormCases))] public void GivenCalculationsWithOutput_WhenChangingNormativeNorm_ThenAllDependingOutputClearedAndActionPerformedAndAllAffectedObjectsNotified( - NormType normType, Func> getCalculationsFunc) + NormType normType, Func> getLocationCalculationsFunc, + WaveConditionsInputWaterLevelType waterLevelType) { // Given DialogBoxHandler = (name, wnd) => @@ -288,26 +289,37 @@ AssessmentSection assessmentSection = TestDataGenerator.GetAssessmentSectionWithAllCalculationConfigurations(); assessmentSection.FailureMechanismContribution.NormativeNorm = normType; - IEnumerable expectedCalculationsToClear = getCalculationsFunc(assessmentSection); + IEnumerable expectedLocationCalculationsToClear = getLocationCalculationsFunc(assessmentSection); - ICalculation[] expectedAffectedCalculations = assessmentSection.Piping - .Calculations - .OfType() - .Where(c => c.HasOutput && !c.InputParameters.UseAssessmentLevelManualInput) - .Concat( - assessmentSection.MacroStabilityInwards - .Calculations - .OfType() - .Where(c => c.HasOutput && !c.InputParameters.UseAssessmentLevelManualInput)) - .ToArray(); + var waveConditionsCalculations = new List>(); + waveConditionsCalculations.AddRange(assessmentSection.GrassCoverErosionOutwards.Calculations + .Cast() + .Where(c => c.HasOutput)); + waveConditionsCalculations.AddRange(assessmentSection.StabilityStoneCover.Calculations + .Cast() + .Where(c => c.HasOutput)); + waveConditionsCalculations.AddRange(assessmentSection.WaveImpactAsphaltCover.Calculations + .Cast() + .Where(c => c.HasOutput)); + waveConditionsCalculations.ForEachElementDo(c => c.InputParameters.WaterLevelType = waterLevelType); + + var expectedAffectedSemiProbabilisticCalculations = new List(); + expectedAffectedSemiProbabilisticCalculations.AddRange(assessmentSection.Piping.Calculations + .OfType() + .Where(c => c.HasOutput && !c.InputParameters.UseAssessmentLevelManualInput)); + expectedAffectedSemiProbabilisticCalculations.AddRange(assessmentSection.MacroStabilityInwards.Calculations + .OfType() + .Where(c => c.HasOutput && !c.InputParameters.UseAssessmentLevelManualInput)); + IEnumerable expectedAffectedObjects = - expectedAffectedCalculations.Concat(new IObservable[] - { - assessmentSection.FailureMechanismContribution - }) - .Concat(expectedCalculationsToClear) - .ToArray(); + expectedAffectedSemiProbabilisticCalculations.Concat(new IObservable[] + { + assessmentSection.FailureMechanismContribution + }) + .Concat(expectedLocationCalculationsToClear) + .Concat(waveConditionsCalculations) + .ToArray(); var mocks = new MockRepository(); var observer = mocks.StrictMock(); @@ -319,7 +331,9 @@ var handler = new FailureMechanismContributionNormChangeHandler(assessmentSection); // Precondition - CollectionAssert.IsNotEmpty(expectedCalculationsToClear.Where(c => c.HasOutput)); + CollectionAssert.IsNotEmpty(expectedAffectedSemiProbabilisticCalculations.Where(c => c.HasOutput)); + CollectionAssert.IsNotEmpty(expectedLocationCalculationsToClear.Where(c => c.HasOutput)); + CollectionAssert.IsNotEmpty(waveConditionsCalculations.Where(c => c.HasOutput)); // When var actionPerformed = false; @@ -329,20 +343,22 @@ var expectedMessages = new[] { "Alle berekende hydraulische belastingen behorende bij de gewijzigde norm zijn verwijderd.", - $"De resultaten van {expectedAffectedCalculations.Length} semi-probabilistische berekeningen zonder handmatige waterstand zijn verwijderd." + $"De resultaten van {expectedAffectedSemiProbabilisticCalculations.Count} semi-probabilistische berekeningen zonder handmatige waterstand zijn verwijderd." }; TestHelper.AssertLogMessagesAreGenerated(Call, expectedMessages, 2); Assert.IsTrue(actionPerformed); - CollectionAssert.IsEmpty(expectedAffectedCalculations.Where(c => c.HasOutput)); - CollectionAssert.IsEmpty(expectedCalculationsToClear.Where(c => c.HasOutput)); + CollectionAssert.IsEmpty(expectedAffectedSemiProbabilisticCalculations.Where(c => c.HasOutput)); + CollectionAssert.IsEmpty(expectedLocationCalculationsToClear.Where(c => c.HasOutput)); + CollectionAssert.IsEmpty(waveConditionsCalculations.Where(c => c.HasOutput)); mocks.VerifyAll(); } [Test] [TestCaseSource(nameof(GetChangeNormativeNormCases))] public void GivenCalculationsWithoutOutput_WhenChangingNormativeNorm_ThenActionPerformedAndContributionNotified( - NormType normType, Func> getCalculationsFunc) + NormType normType, Func> getLocationCalculationsFunc, + WaveConditionsInputWaterLevelType waterLevelType) { // Given DialogBoxHandler = (name, wnd) => @@ -354,18 +370,27 @@ AssessmentSection assessmentSection = TestDataGenerator.GetAssessmentSectionWithAllCalculationConfigurations(); assessmentSection.FailureMechanismContribution.NormativeNorm = normType; - IEnumerable calculationsBelongingToNorm = getCalculationsFunc(assessmentSection); + IEnumerable calculationsBelongingToNorm = getLocationCalculationsFunc(assessmentSection); - ICalculation[] calculations = assessmentSection.Piping - .Calculations - .OfType() - .Where(c => c.HasOutput && !c.InputParameters.UseAssessmentLevelManualInput) - .Concat( - assessmentSection.MacroStabilityInwards - .Calculations - .OfType() - .Where(c => c.HasOutput && !c.InputParameters.UseAssessmentLevelManualInput)) - .ToArray(); + var waveConditionsCalculations = new List>(); + waveConditionsCalculations.AddRange(assessmentSection.GrassCoverErosionOutwards.Calculations + .Cast()); + waveConditionsCalculations.AddRange(assessmentSection.StabilityStoneCover.Calculations + .Cast()); + waveConditionsCalculations.AddRange(assessmentSection.WaveImpactAsphaltCover.Calculations + .Cast()); + + waveConditionsCalculations.ForEachElementDo(c => c.InputParameters.WaterLevelType = waterLevelType); + + var calculations = new List(); + calculations.AddRange(assessmentSection.Piping.Calculations + .OfType() + .Where(c => c.HasOutput && !c.InputParameters.UseAssessmentLevelManualInput)); + calculations.AddRange(assessmentSection.MacroStabilityInwards.Calculations + .OfType() + .Where(c => c.HasOutput && !c.InputParameters.UseAssessmentLevelManualInput)); + calculations.AddRange(waveConditionsCalculations); + var mocks = new MockRepository(); var observer = mocks.StrictMock(); observer.Expect(o => o.UpdateObserver()).Repeat.Once(); @@ -451,7 +476,8 @@ [Test] [TestCaseSource(nameof(GetChangeNormCases))] public void GivenCalculationsWithOutput_WhenChangingNorm_ThenAllDependingOutputClearedAndActionPerformedAndAllAffectedObjectsNotified( - NormType normType, Func> getCalculationsFunc) + NormType normType, Func> getCalculationsFunc, + WaveConditionsInputWaterLevelType waterLevelType) { // Given DialogBoxHandler = (name, wnd) => @@ -465,11 +491,25 @@ IEnumerable expectedCalculationsToClear = getCalculationsFunc(assessmentSection); + var waveConditionsCalculations = new List>(); + waveConditionsCalculations.AddRange(assessmentSection.GrassCoverErosionOutwards.Calculations + .Cast() + .Where(c => c.HasOutput)); + waveConditionsCalculations.AddRange(assessmentSection.StabilityStoneCover.Calculations + .Cast() + .Where(c => c.HasOutput)); + waveConditionsCalculations.AddRange(assessmentSection.WaveImpactAsphaltCover.Calculations + .Cast() + .Where(c => c.HasOutput)); + + waveConditionsCalculations.ForEachElementDo(c => c.InputParameters.WaterLevelType = waterLevelType); + IEnumerable expectedAffectedObjects = new IObservable[] { assessmentSection.FailureMechanismContribution } .Concat(expectedCalculationsToClear) + .Concat(waveConditionsCalculations) .ToArray(); var mocks = new MockRepository(); @@ -483,6 +523,7 @@ // Precondition CollectionAssert.IsNotEmpty(expectedCalculationsToClear.Where(c => c.HasOutput)); + CollectionAssert.IsNotEmpty(waveConditionsCalculations.Where(c => c.HasOutput)); // When var actionPerformed = false; @@ -497,13 +538,15 @@ Assert.IsTrue(actionPerformed); CollectionAssert.IsEmpty(expectedCalculationsToClear.Where(c => c.HasOutput)); + CollectionAssert.IsEmpty(waveConditionsCalculations.Where(c => c.HasOutput)); mocks.VerifyAll(); } [Test] [TestCaseSource(nameof(GetChangeNormCases))] public void GivenCalculationsWithoutOutput_WhenChangingNorm_ThenActionPerformedAndContributionNotified( - NormType normType, Func> getCalculationsFunc) + NormType normType, Func> getLocationCalculationsFunc, + WaveConditionsInputWaterLevelType waterLevelType) { // Given DialogBoxHandler = (name, wnd) => @@ -515,8 +558,16 @@ AssessmentSection assessmentSection = TestDataGenerator.GetAssessmentSectionWithAllCalculationConfigurations(); assessmentSection.FailureMechanismContribution.NormativeNorm = normType; - IEnumerable calculationsBelongingToNorm = getCalculationsFunc(assessmentSection); + IEnumerable calculationsBelongingToNorm = getLocationCalculationsFunc(assessmentSection); + var waveConditionsCalculations = new List>(); + waveConditionsCalculations.AddRange(assessmentSection.GrassCoverErosionOutwards.Calculations + .Cast()); + waveConditionsCalculations.AddRange(assessmentSection.StabilityStoneCover.Calculations + .Cast()); + waveConditionsCalculations.AddRange(assessmentSection.WaveImpactAsphaltCover.Calculations + .Cast()); + var mocks = new MockRepository(); var observer = mocks.StrictMock(); observer.Expect(o => o.UpdateObserver()).Repeat.Once(); @@ -527,6 +578,13 @@ c.Output = null; c.Attach(observer); }); + waveConditionsCalculations.ForEachElementDo(c => + { + c.InputParameters.WaterLevelType = waterLevelType; + c.ClearOutput(); + c.Attach(observer); + }); + assessmentSection.FailureMechanismContribution.Attach(observer); var handler = new FailureMechanismContributionNormChangeHandler(assessmentSection); @@ -545,20 +603,24 @@ { yield return new TestCaseData( NormType.LowerLimit, new Func>( - section => section.WaterLevelCalculationsForLowerLimitNorm)); + section => section.WaterLevelCalculationsForLowerLimitNorm), + WaveConditionsInputWaterLevelType.LowerLimit); yield return new TestCaseData( NormType.Signaling, new Func>( - section => section.WaterLevelCalculationsForSignalingNorm)); + section => section.WaterLevelCalculationsForSignalingNorm), + WaveConditionsInputWaterLevelType.Signaling); } private static IEnumerable GetChangeNormCases() { yield return new TestCaseData( NormType.LowerLimit, new Func>( - section => section.WaterLevelCalculationsForSignalingNorm)); + section => section.WaterLevelCalculationsForSignalingNorm), + WaveConditionsInputWaterLevelType.Signaling); yield return new TestCaseData( NormType.Signaling, new Func>( - section => section.WaterLevelCalculationsForLowerLimitNorm)); + section => section.WaterLevelCalculationsForLowerLimitNorm), + WaveConditionsInputWaterLevelType.LowerLimit); } } } \ No newline at end of file