Index: Riskeer/Revetment/src/Riskeer.Revetment.Service/WaveConditionsDataSynchronizationService.cs =================================================================== diff -u -r4da2af82acf0b1d6ce385c124f871e34d9373021 -rfa82eea9c005e9a95f257da305ed0ca293e8002e --- Riskeer/Revetment/src/Riskeer.Revetment.Service/WaveConditionsDataSynchronizationService.cs (.../WaveConditionsDataSynchronizationService.cs) (revision 4da2af82acf0b1d6ce385c124f871e34d9373021) +++ Riskeer/Revetment/src/Riskeer.Revetment.Service/WaveConditionsDataSynchronizationService.cs (.../WaveConditionsDataSynchronizationService.cs) (revision fa82eea9c005e9a95f257da305ed0ca293e8002e) @@ -112,6 +112,47 @@ } /// + /// Clears the output for calculations that corresponds with the and removes this + /// from the input in the given . + /// + /// The failure mechanism which contains the calculations. + /// The + /// to clear for. + /// The type of the failure mechanism. + /// The type of the calculation. + /// An of calculations which are affected by clearing the output. + /// Thrown when any parameter is null. + public static IEnumerable ClearWaveConditionsCalculationOutputAndRemoveTargetProbability( + TFailureMechanism failureMechanism, HydraulicBoundaryLocationCalculationsForTargetProbability calculationsForTargetProbability) + where TFailureMechanism : IFailureMechanism + where TCalculation : ICalculation + { + if (failureMechanism == null) + { + throw new ArgumentNullException(nameof(failureMechanism)); + } + + if (calculationsForTargetProbability == null) + { + throw new ArgumentNullException(nameof(calculationsForTargetProbability)); + } + + var affectedItems = new List(); + foreach (TCalculation calculation in failureMechanism.Calculations.Cast() + .Where(c => c.InputParameters.CalculationsTargetProbability == calculationsForTargetProbability)) + { + calculation.InputParameters.CalculationsTargetProbability = null; + if (calculation.InputParameters.WaterLevelType == WaveConditionsInputWaterLevelType.UserDefinedTargetProbability) + { + RiskeerCommonDataSynchronizationService.ClearCalculationOutput(calculation); + } + affectedItems.Add(calculation); + } + + return affectedItems; + } + + /// /// Gets the based on the given . /// /// The to get the from. Index: Riskeer/Revetment/test/Riskeer.Revetment.Service.Test/WaveConditionsDataSynchronizationServiceTest.cs =================================================================== diff -u -r4da2af82acf0b1d6ce385c124f871e34d9373021 -rfa82eea9c005e9a95f257da305ed0ca293e8002e --- Riskeer/Revetment/test/Riskeer.Revetment.Service.Test/WaveConditionsDataSynchronizationServiceTest.cs (.../WaveConditionsDataSynchronizationServiceTest.cs) (revision 4da2af82acf0b1d6ce385c124f871e34d9373021) +++ Riskeer/Revetment/test/Riskeer.Revetment.Service.Test/WaveConditionsDataSynchronizationServiceTest.cs (.../WaveConditionsDataSynchronizationServiceTest.cs) (revision fa82eea9c005e9a95f257da305ed0ca293e8002e) @@ -204,5 +204,161 @@ Assert.IsTrue(failureMechanism.Calculations.Except(expectedAffectedCalculations).All(c => c.HasOutput)); mocks.ReplayAll(); } + + [Test] + public void ClearWaveConditionsCalculationOutputAndRemoveTargetProbability_FailureMechanismNull_ThrowsArgumentNullException() + { + // Call + void Call() => WaveConditionsDataSynchronizationService.ClearWaveConditionsCalculationOutputAndRemoveTargetProbability>( + null, new HydraulicBoundaryLocationCalculationsForTargetProbability(0.1)); + + // Assert + var exception = Assert.Throws(Call); + Assert.AreEqual("failureMechanism", exception.ParamName); + } + + [Test] + public void ClearWaveConditionsCalculationOutputAndRemoveTargetProbability_CalculationsForTargetProbabilityNull_ThrowsArgumentNullException() + { + // Call + void Call() => WaveConditionsDataSynchronizationService.ClearWaveConditionsCalculationOutputAndRemoveTargetProbability>( + new TestFailureMechanism(), null); + + // Assert + var exception = Assert.Throws(Call); + Assert.AreEqual("calculationsForTargetProbability", exception.ParamName); + } + + [Test] + public void ClearWaveConditionsCalculationOutputAndRemoveTargetProbability_WithAllData_ClearsOutputAndReturnsAffectedObjects() + { + // Setup + var calculationsForTargetProbabilityToClear = new HydraulicBoundaryLocationCalculationsForTargetProbability(0.1); + var otherCalculationsForTargetProbability = new HydraulicBoundaryLocationCalculationsForTargetProbability(0.01); + + var calculation1 = new TestWaveConditionsCalculation(new TestWaveConditionsInput + { + WaterLevelType = WaveConditionsInputWaterLevelType.Signaling, + CalculationsTargetProbability = calculationsForTargetProbabilityToClear + }, true); + var calculation2 = new TestWaveConditionsCalculation(new TestWaveConditionsInput + { + WaterLevelType = WaveConditionsInputWaterLevelType.LowerLimit, + CalculationsTargetProbability = calculationsForTargetProbabilityToClear + }, true); + var calculation3 = new TestWaveConditionsCalculation(new TestWaveConditionsInput + { + WaterLevelType = WaveConditionsInputWaterLevelType.None, + CalculationsTargetProbability = calculationsForTargetProbabilityToClear + }, true); + var calculation4 = new TestWaveConditionsCalculation(new TestWaveConditionsInput + { + WaterLevelType = WaveConditionsInputWaterLevelType.UserDefinedTargetProbability, + CalculationsTargetProbability = calculationsForTargetProbabilityToClear + }, true); + var calculation5 = new TestWaveConditionsCalculation(new TestWaveConditionsInput + { + WaterLevelType = WaveConditionsInputWaterLevelType.UserDefinedTargetProbability, + CalculationsTargetProbability = otherCalculationsForTargetProbability + }, true); + + var mocks = new MockRepository(); + var failureMechanism = mocks.Stub(); + failureMechanism.Stub(fm => fm.Calculations).Return(new[] + { + calculation1, + calculation2, + calculation3, + calculation4, + calculation5 + }); + mocks.ReplayAll(); + + TestWaveConditionsCalculation[] expectedAffectedCalculationsOutputCleared = + { + calculation4 + }; + + TestWaveConditionsCalculation[] expectedAffectedCalculations = + { + calculation1, + calculation2, + calculation3, + calculation4 + }; + + // Call + IEnumerable affectedCalculations = WaveConditionsDataSynchronizationService.ClearWaveConditionsCalculationOutputAndRemoveTargetProbability>( + failureMechanism, calculationsForTargetProbabilityToClear); + + // Assert + CollectionAssert.AreEqual(expectedAffectedCalculations, affectedCalculations); + Assert.IsTrue(expectedAffectedCalculationsOutputCleared.All(c => !c.HasOutput)); + Assert.IsTrue(failureMechanism.Calculations.Except(expectedAffectedCalculationsOutputCleared).All(c => c.HasOutput)); + mocks.ReplayAll(); + } + + [Test] + public void ClearWaveConditionsCalculationOutputAndRemoveTargetProbability_WithAllData_RemovesTargetProbabilityAndReturnsAffectedObjects() + { + // Setup + var calculationsForTargetProbabilityToClear = new HydraulicBoundaryLocationCalculationsForTargetProbability(0.1); + var otherCalculationsForTargetProbability = new HydraulicBoundaryLocationCalculationsForTargetProbability(0.01); + + var calculation1 = new TestWaveConditionsCalculation(new TestWaveConditionsInput + { + WaterLevelType = WaveConditionsInputWaterLevelType.Signaling, + CalculationsTargetProbability = calculationsForTargetProbabilityToClear + }, true); + var calculation2 = new TestWaveConditionsCalculation(new TestWaveConditionsInput + { + WaterLevelType = WaveConditionsInputWaterLevelType.LowerLimit, + CalculationsTargetProbability = calculationsForTargetProbabilityToClear + }, true); + var calculation3 = new TestWaveConditionsCalculation(new TestWaveConditionsInput + { + WaterLevelType = WaveConditionsInputWaterLevelType.None, + CalculationsTargetProbability = calculationsForTargetProbabilityToClear + }, true); + var calculation4 = new TestWaveConditionsCalculation(new TestWaveConditionsInput + { + WaterLevelType = WaveConditionsInputWaterLevelType.UserDefinedTargetProbability, + CalculationsTargetProbability = calculationsForTargetProbabilityToClear + }, true); + var calculation5 = new TestWaveConditionsCalculation(new TestWaveConditionsInput + { + WaterLevelType = WaveConditionsInputWaterLevelType.UserDefinedTargetProbability, + CalculationsTargetProbability = otherCalculationsForTargetProbability + }, true); + + var mocks = new MockRepository(); + var failureMechanism = mocks.Stub(); + failureMechanism.Stub(fm => fm.Calculations).Return(new[] + { + calculation1, + calculation2, + calculation3, + calculation4, + calculation5 + }); + mocks.ReplayAll(); + + TestWaveConditionsCalculation[] expectedAffectedCalculations = + { + calculation1, + calculation2, + calculation3, + calculation4 + }; + + // Call + IEnumerable affectedCalculations = WaveConditionsDataSynchronizationService.ClearWaveConditionsCalculationOutputAndRemoveTargetProbability>( + failureMechanism, calculationsForTargetProbabilityToClear); + + // Assert + CollectionAssert.AreEqual(expectedAffectedCalculations, affectedCalculations); + Assert.IsTrue(expectedAffectedCalculations.All(c => c.InputParameters.CalculationsTargetProbability == null)); + mocks.ReplayAll(); + } } } \ No newline at end of file