Index: Ringtoets/DuneErosion/src/Ringtoets.DuneErosion.Forms/DuneErosionFailureMechanismPropertyChangeHandler.cs =================================================================== diff -u -rdf65ea020222eb9b46294af5084e02bb83b684a4 -r6e236a1a97286ef68c664288eb5d89326f79a0cb --- Ringtoets/DuneErosion/src/Ringtoets.DuneErosion.Forms/DuneErosionFailureMechanismPropertyChangeHandler.cs (.../DuneErosionFailureMechanismPropertyChangeHandler.cs) (revision df65ea020222eb9b46294af5084e02bb83b684a4) +++ Ringtoets/DuneErosion/src/Ringtoets.DuneErosion.Forms/DuneErosionFailureMechanismPropertyChangeHandler.cs (.../DuneErosionFailureMechanismPropertyChangeHandler.cs) (revision 6e236a1a97286ef68c664288eb5d89326f79a0cb) @@ -45,13 +45,24 @@ protected override bool RequiresConfirmation(DuneErosionFailureMechanism failureMechanism) { - return base.RequiresConfirmation(failureMechanism) || - failureMechanism.DuneLocations.Any(c => c.Calculation.Output != null); + return base.RequiresConfirmation(failureMechanism) + || failureMechanism.DuneLocations.Any(c => c.Calculation.Output != null) + || failureMechanism.CalculationsForMechanismSpecificFactorizedSignalingNorm.Any(HasOutput) + || failureMechanism.CalculationsForMechanismSpecificSignalingNorm.Any(HasOutput) + || failureMechanism.CalculationsForMechanismSpecificLowerLimitNorm.Any(HasOutput) + || failureMechanism.CalculationsForLowerLimitNorm.Any(HasOutput) + || failureMechanism.CalculationsForFactorizedLowerLimitNorm.Any(HasOutput); } protected override IEnumerable PropertyChanged(DuneErosionFailureMechanism failureMechanism) { - return DuneErosionDataSynchronizationService.ClearDuneLocationOutput(failureMechanism.DuneLocations); + return DuneErosionDataSynchronizationService.ClearDuneLocationOutput(failureMechanism.DuneLocations) + .Concat(DuneErosionDataSynchronizationService.ClearDuneCalculationOutputs(failureMechanism)); } + + private static bool HasOutput(DuneLocationCalculation calculation) + { + return calculation.Output != null; + } } } \ No newline at end of file Index: Ringtoets/DuneErosion/test/Ringtoets.DuneErosion.Forms.Test/DuneErosionFailureMechanismPropertyChangeHandlerTest.cs =================================================================== diff -u -rdf65ea020222eb9b46294af5084e02bb83b684a4 -r6e236a1a97286ef68c664288eb5d89326f79a0cb --- Ringtoets/DuneErosion/test/Ringtoets.DuneErosion.Forms.Test/DuneErosionFailureMechanismPropertyChangeHandlerTest.cs (.../DuneErosionFailureMechanismPropertyChangeHandlerTest.cs) (revision df65ea020222eb9b46294af5084e02bb83b684a4) +++ Ringtoets/DuneErosion/test/Ringtoets.DuneErosion.Forms.Test/DuneErosionFailureMechanismPropertyChangeHandlerTest.cs (.../DuneErosionFailureMechanismPropertyChangeHandlerTest.cs) (revision 6e236a1a97286ef68c664288eb5d89326f79a0cb) @@ -128,6 +128,7 @@ "Weet u zeker dat u wilt doorgaan?"; Assert.AreEqual(expectedMessage, message); } + Assert.AreEqual(1, propertySet); var expectedAffectedObjects = new List(new[] { @@ -139,6 +140,58 @@ } [Test] + [TestCaseSource(nameof(ChangePropertyFailureMechanismTestCases))] + public void SetPropertyValueAfterConfirmation_IfConfirmationRequiredThenGiven_MessageDialogShownSetValueCalledAffectedObjectsReturned(ChangePropertyFailureMechanismTestCase testCase) + { + // Setup + bool dialogBoxWillBeShown = testCase.ExpectedAffectedCalculations.Any(); + + var title = ""; + var message = ""; + if (dialogBoxWillBeShown) + { + DialogBoxHandler = (name, wnd) => + { + var tester = new MessageBoxTester(wnd); + title = tester.Title; + message = tester.Text; + + tester.ClickOk(); + }; + } + + DuneErosionFailureMechanism failureMechanism = testCase.FailureMechanism; + var propertySet = 0; + + var changeHandler = new DuneErosionFailureMechanismPropertyChangeHandler(); + + // Call + IEnumerable affectedObjects = changeHandler.SetPropertyValueAfterConfirmation( + failureMechanism, + 3, + (f, v) => propertySet++); + + // Assert + if (dialogBoxWillBeShown) + { + Assert.AreEqual("Bevestigen", title); + string expectedMessage = "Als u deze parameter wijzigt, zal de uitvoer van alle randvoorwaarden locaties in dit toetsspoor verwijderd worden." + Environment.NewLine + + Environment.NewLine + + "Weet u zeker dat u wilt doorgaan?"; + Assert.AreEqual(expectedMessage, message); + } + + Assert.AreEqual(1, propertySet); + var expectedAffectedObjects = new List(new[] + { + failureMechanism + }); + expectedAffectedObjects.AddRange(testCase.ExpectedAffectedCalculations); + + CollectionAssert.AreEquivalent(expectedAffectedObjects, affectedObjects); + } + + [Test] public void SetPropertyValueAfterConfirmation_ConfirmationRequiredButNotGiven_SetValueNotCalledNoAffectedObjectsReturned() { // Setup @@ -179,6 +232,98 @@ public ICollection ExpectedAffectedLocations { get; } } + public class ChangePropertyFailureMechanismTestCase + { + public ChangePropertyFailureMechanismTestCase(DuneErosionFailureMechanism failureMechanism) + { + FailureMechanism = failureMechanism; + + ExpectedAffectedCalculations = failureMechanism.CalculationsForMechanismSpecificFactorizedSignalingNorm.Where(HasOutput) + .Concat(failureMechanism.CalculationsForMechanismSpecificSignalingNorm.Where(HasOutput)) + .Concat(failureMechanism.CalculationsForMechanismSpecificLowerLimitNorm.Where(HasOutput)) + .Concat(failureMechanism.CalculationsForLowerLimitNorm.Where(HasOutput)) + .Concat(failureMechanism.CalculationsForFactorizedLowerLimitNorm.Where(HasOutput)) + .ToArray(); + } + + public DuneErosionFailureMechanism FailureMechanism { get; } + + public IEnumerable ExpectedAffectedCalculations { get; } + + private static bool HasOutput(DuneLocationCalculation calculation) + { + return calculation.Output != null; + } + } + + private static IEnumerable ChangePropertyFailureMechanismTestCases() + { + yield return new TestCaseData(new ChangePropertyFailureMechanismTestCase(new DuneErosionFailureMechanism())) + .SetName("SetPropertyValueAfterConfirmation No Calculations"); + + var failureMechanismOneLocationWithoutOutput = new DuneErosionFailureMechanism(); + ConfigureFailureMechanism(failureMechanismOneLocationWithoutOutput); + yield return new TestCaseData(new ChangePropertyFailureMechanismTestCase(failureMechanismOneLocationWithoutOutput)) + .SetName("SetPropertyValueAfterConfirmation One location and all calculations without output"); + + var failureMechanism = new DuneErosionFailureMechanism(); + ConfigureFailureMechanism(failureMechanism); + SetCalculationOutput(failureMechanism.CalculationsForMechanismSpecificFactorizedSignalingNorm); + yield return new TestCaseData(new ChangePropertyFailureMechanismTestCase(failureMechanism)) + .SetName("SetPropertyValueAfterConfirmation One location and calculation failure mechanism specific factorized signaling norm with output"); + + failureMechanism = new DuneErosionFailureMechanism(); + ConfigureFailureMechanism(failureMechanism); + SetCalculationOutput(failureMechanism.CalculationsForMechanismSpecificSignalingNorm); + yield return new TestCaseData(new ChangePropertyFailureMechanismTestCase(failureMechanism)) + .SetName("SetPropertyValueAfterConfirmation One location and calculation mechanism specific signaling norm with output"); + + failureMechanism = new DuneErosionFailureMechanism(); + ConfigureFailureMechanism(failureMechanism); + SetCalculationOutput(failureMechanism.CalculationsForMechanismSpecificLowerLimitNorm); + yield return new TestCaseData(new ChangePropertyFailureMechanismTestCase(failureMechanism)) + .SetName("SetPropertyValueAfterConfirmation One location and calculation mechanism specific lower limit norm with output"); + + failureMechanism = new DuneErosionFailureMechanism(); + ConfigureFailureMechanism(failureMechanism); + SetCalculationOutput(failureMechanism.CalculationsForLowerLimitNorm); + yield return new TestCaseData(new ChangePropertyFailureMechanismTestCase(failureMechanism)) + .SetName("SetPropertyValueAfterConfirmation One location and calculation lower limit norm with output"); + + failureMechanism = new DuneErosionFailureMechanism(); + ConfigureFailureMechanism(failureMechanism); + SetCalculationOutput(failureMechanism.CalculationsForFactorizedLowerLimitNorm); + yield return new TestCaseData(new ChangePropertyFailureMechanismTestCase(failureMechanism)) + .SetName("SetPropertyValueAfterConfirmation One location and calculation factorized lower limit norm with output"); + + failureMechanism = new DuneErosionFailureMechanism(); + ConfigureFailureMechanism(failureMechanism); + SetCalculationOutput(failureMechanism.CalculationsForMechanismSpecificFactorizedSignalingNorm); + SetCalculationOutput(failureMechanism.CalculationsForMechanismSpecificSignalingNorm); + SetCalculationOutput(failureMechanism.CalculationsForMechanismSpecificLowerLimitNorm); + SetCalculationOutput(failureMechanism.CalculationsForLowerLimitNorm); + SetCalculationOutput(failureMechanism.CalculationsForFactorizedLowerLimitNorm); + yield return new TestCaseData(new ChangePropertyFailureMechanismTestCase(failureMechanism)) + .SetName("SetPropertyValueAfterConfirmation One location and all calculations with output"); + } + + private static void ConfigureFailureMechanism(DuneErosionFailureMechanism failureMechanism) + { + var duneLocations = new[] + { + new TestDuneLocation() + }; + + failureMechanism.DuneLocations.AddRange(duneLocations); + failureMechanism.SetDuneLocationCalculations(duneLocations); + } + + private static void SetCalculationOutput(IEnumerable calculations) + { + var output = new TestDuneLocationOutput(); + calculations.First().Output = output; + } + private static IEnumerable ChangePropertyTestCases() { yield return new TestCaseData(