Index: Ringtoets/Common/src/Ringtoets.Common.Forms/ChangeHandlers/CalculationInputPropertyChangeHandler.cs =================================================================== diff -u -re8745adff2332038bbcbcc5f9ddd3028804ebd81 -r93ad732b7d1a01a0ed417becc70dc44ebf0f3ae5 --- Ringtoets/Common/src/Ringtoets.Common.Forms/ChangeHandlers/CalculationInputPropertyChangeHandler.cs (.../CalculationInputPropertyChangeHandler.cs) (revision e8745adff2332038bbcbcc5f9ddd3028804ebd81) +++ Ringtoets/Common/src/Ringtoets.Common.Forms/ChangeHandlers/CalculationInputPropertyChangeHandler.cs (.../CalculationInputPropertyChangeHandler.cs) (revision 93ad732b7d1a01a0ed417becc70dc44ebf0f3ae5) @@ -21,9 +21,11 @@ using System; using System.Collections.Generic; +using System.Windows.Forms; using Core.Common.Base; using Ringtoets.Common.Data.Calculation; using Ringtoets.Common.Forms.PropertyClasses; +using CoreCommonBaseResources = Core.Common.Base.Properties.Resources; namespace Ringtoets.Common.Forms.ChangeHandlers { @@ -61,7 +63,45 @@ throw new ArgumentNullException(nameof(setValue)); } - return null; + var changedObjects = new List(); + + if (RequiresConfirmation(calculation)) + { + if (ConfirmPropertyChange()) + { + setValue(calculationInput, value); + PropertyChanged(calculation); + changedObjects.Add(calculation); + changedObjects.Add(calculationInput); + } + } + else + { + setValue(calculationInput, value); + changedObjects.Add(calculationInput); + } + + return changedObjects; } + + private static void PropertyChanged(TCalculation calculation) + { + calculation.ClearOutput(); + } + + private static bool RequiresConfirmation(TCalculation calculation) + { + return calculation.HasOutput; + } + + private static bool ConfirmPropertyChange() + { + DialogResult result = MessageBox.Show("Als u een parameter in deze berekening wijzigt, zal de uitvoer van deze berekening verwijderd worden." + Environment.NewLine + + Environment.NewLine + + "Weet u zeker dat u wilt doorgaan?", + CoreCommonBaseResources.Confirm, + MessageBoxButtons.OKCancel); + return result == DialogResult.OK; + } } } \ No newline at end of file Index: Ringtoets/Common/test/Ringtoets.Common.Forms.Test/ChangeHandlers/CalculationInputPropertyChangeHandlerTest.cs =================================================================== diff -u -re8745adff2332038bbcbcc5f9ddd3028804ebd81 -r93ad732b7d1a01a0ed417becc70dc44ebf0f3ae5 --- Ringtoets/Common/test/Ringtoets.Common.Forms.Test/ChangeHandlers/CalculationInputPropertyChangeHandlerTest.cs (.../CalculationInputPropertyChangeHandlerTest.cs) (revision e8745adff2332038bbcbcc5f9ddd3028804ebd81) +++ Ringtoets/Common/test/Ringtoets.Common.Forms.Test/ChangeHandlers/CalculationInputPropertyChangeHandlerTest.cs (.../CalculationInputPropertyChangeHandlerTest.cs) (revision 93ad732b7d1a01a0ed417becc70dc44ebf0f3ae5) @@ -20,6 +20,10 @@ // All rights reserved. using System; +using System.Collections; +using System.Collections.Generic; +using Core.Common.Base; +using NUnit.Extensions.Forms; using NUnit.Framework; using Ringtoets.Common.Data.Calculation; using Ringtoets.Common.Forms.ChangeHandlers; @@ -29,7 +33,7 @@ namespace Ringtoets.Common.Forms.Test.ChangeHandlers { [TestFixture] - public class CalculationInputPropertyChangeHandlerTest + public class CalculationInputPropertyChangeHandlerTest : NUnitFormTest { [Test] public void Constructor_Expectedvalues() @@ -102,5 +106,161 @@ var exception = Assert.Throws(test); Assert.AreEqual("setValue", exception.ParamName); } + + [Test] + [TestCaseSource(nameof(ChangePropertyTestCases))] + public void SetPropertyValueAfterConfirmation_IfConfirmationRequiredThenGiven_SetValueCalledAffectedObjectsReturned(ChangePropertyTestCase testCase) + { + // Setup + var dialogBoxWillBeShown = testCase.Calculation.HasOutput; + + string title = ""; + string message = ""; + if (dialogBoxWillBeShown) + { + DialogBoxHandler = (name, wnd) => + { + var tester = new MessageBoxTester(wnd); + title = tester.Title; + message = tester.Text; + + tester.ClickOk(); + }; + } + + var calculationInput = new TestCalculationInput(); + var propertySet = 0; + + var changeHandler = new CalculationInputPropertyChangeHandler(); + + // Precondition + Assert.AreEqual(dialogBoxWillBeShown, testCase.Calculation.HasOutput); + + // Call + var affectedObjects = changeHandler.SetPropertyValueAfterConfirmation( + calculationInput, + testCase.Calculation, + 3, + (f, v) => propertySet++); + + // Assert + var expectedAffectedObjects = new List(); + + if (dialogBoxWillBeShown) + { + Assert.AreEqual("Bevestigen", title); + string expectedMessage = "Als u een parameter in deze berekening wijzigt, zal de uitvoer van deze berekening verwijderd worden." + Environment.NewLine + + Environment.NewLine + + "Weet u zeker dat u wilt doorgaan?"; + Assert.AreEqual(expectedMessage, message); + + expectedAffectedObjects.Add(testCase.Calculation); + } + expectedAffectedObjects.Add(calculationInput); + CollectionAssert.AreEquivalent(expectedAffectedObjects, affectedObjects); + Assert.AreEqual(1, propertySet); + Assert.IsFalse(testCase.Calculation.HasOutput); + } + + [Test] + public void SetPropertyValueAfterConfirmation_ConfirmationRequiredButNotGiven_SetValueNotCalledNoAffectedObjectsReturned() + { + // Setup + DialogBoxHandler = (name, wnd) => + { + var tester = new MessageBoxTester(wnd); + tester.ClickCancel(); + }; + + var calculation = CalculationTestHelper.CreateCalculationWithOutput(); + + var propertySet = 0; + + var changeHandler = new CalculationInputPropertyChangeHandler(); + + // Precondition + Assert.IsTrue(calculation.HasOutput); + + // Call + var affectedObjects = changeHandler.SetPropertyValueAfterConfirmation( + new TestCalculationInput(), + calculation, + 3, + (f, v) => propertySet++); + + // Assert + Assert.AreEqual(0, propertySet); + CollectionAssert.IsEmpty(affectedObjects); + Assert.IsTrue(calculation.HasOutput); + } + + [Test] + public void SetPropertyValueAfterConfirmation_ConfirmationRequiredAndGivenExceptionInSetValue_ExceptionBubbled() + { + // Setup + DialogBoxHandler = (name, wnd) => + { + var tester = new MessageBoxTester(wnd); + tester.ClickOk(); + }; + + var calculation = CalculationTestHelper.CreateCalculationWithOutput(); + + var changeHandler = new CalculationInputPropertyChangeHandler(); + var expectedException = new Exception(); + + // Call + TestDelegate test = () => changeHandler.SetPropertyValueAfterConfirmation( + new TestCalculationInput(), + calculation, + 3, + (f, v) => { throw expectedException; }); + + // Assert + var exception = Assert.Throws(test); + Assert.AreSame(expectedException, exception); + } + + [Test] + public void SetPropertyValueAfterConfirmation_ConfirmationNotRequiredExceptionInSetValue_ExceptionBubbled() + { + // Setup + var calculation = CalculationTestHelper.CreateCalculationWithoutOutput(); + + var changeHandler = new CalculationInputPropertyChangeHandler(); + var expectedException = new Exception(); + + // Call + TestDelegate test = () => changeHandler.SetPropertyValueAfterConfirmation( + new TestCalculationInput(), + calculation, + 3, + (f, v) => { throw expectedException; }); + + // Assert + var exception = Assert.Throws(test); + Assert.AreSame(expectedException, exception); + } + + public class ChangePropertyTestCase + { + public ChangePropertyTestCase(TestCalculation calculation) + { + Calculation = calculation; + } + + public TestCalculation Calculation { get; } + } + + private static IEnumerable ChangePropertyTestCases() + { + yield return new TestCaseData( + new ChangePropertyTestCase(CalculationTestHelper.CreateCalculationWithOutput()) + ).SetName("SetPropertyValueAfterConfirmation calculation with output"); + + yield return new TestCaseData( + new ChangePropertyTestCase(CalculationTestHelper.CreateCalculationWithoutOutput()) + ).SetName("SetPropertyValueAfterConfirmation calculation without output"); + } } } \ No newline at end of file Index: Ringtoets/Common/test/Ringtoets.Common.Forms.Test/ChangeHandlers/FailureMechanismPropertyChangeHandlerTest.cs =================================================================== diff -u -r50ddb1e22da777912b22e70497d1b67340ecaecd -r93ad732b7d1a01a0ed417becc70dc44ebf0f3ae5 --- Ringtoets/Common/test/Ringtoets.Common.Forms.Test/ChangeHandlers/FailureMechanismPropertyChangeHandlerTest.cs (.../FailureMechanismPropertyChangeHandlerTest.cs) (revision 50ddb1e22da777912b22e70497d1b67340ecaecd) +++ Ringtoets/Common/test/Ringtoets.Common.Forms.Test/ChangeHandlers/FailureMechanismPropertyChangeHandlerTest.cs (.../FailureMechanismPropertyChangeHandlerTest.cs) (revision 93ad732b7d1a01a0ed417becc70dc44ebf0f3ae5) @@ -124,6 +124,9 @@ var changeHandler = new FailureMechanismPropertyChangeHandler(); + // Precondition + Assert.IsTrue(testCase.ExpectedAffectedCalculations.All(c => c.HasOutput)); + // Call var affectedObjects = changeHandler.SetPropertyValueAfterConfirmation( testFailureMechanism, @@ -143,6 +146,7 @@ var expectedAffectedObjects = new List(testCase.ExpectedAffectedCalculations); expectedAffectedObjects.Add(testFailureMechanism); CollectionAssert.AreEqual(expectedAffectedObjects, affectedObjects); + Assert.IsTrue(testCase.Calculations.All(c => !c.HasOutput)); } [Test] @@ -167,7 +171,7 @@ var propertySet = 0; var changeHandler = new FailureMechanismPropertyChangeHandler(); - + // Call var affectedObjects = changeHandler.SetPropertyValueAfterConfirmation( testFailureMechanism, @@ -177,6 +181,7 @@ // Assert Assert.AreEqual(0, propertySet); CollectionAssert.IsEmpty(affectedObjects); + Assert.IsTrue(calculationWithOutput.HasOutput); } [Test] @@ -240,7 +245,7 @@ public ICollection ExpectedAffectedCalculations { get; } } - static IEnumerable ChangePropertyTestCases() + private static IEnumerable ChangePropertyTestCases() { yield return new TestCaseData( new ChangePropertyTestCase(new TestCalculation[0])