Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/PropertyClasses/PipingFailureMechanismProperties.cs =================================================================== diff -u -r039794fd06a72ae34d24f8f1f6d0bf9f7ee99147 -r208f69e10634efd1657580dcf349224453be8a05 --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/PropertyClasses/PipingFailureMechanismProperties.cs (.../PipingFailureMechanismProperties.cs) (revision 039794fd06a72ae34d24f8f1f6d0bf9f7ee99147) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/PropertyClasses/PipingFailureMechanismProperties.cs (.../PipingFailureMechanismProperties.cs) (revision 208f69e10634efd1657580dcf349224453be8a05) @@ -203,7 +203,8 @@ } set { - ChangePropertyValueAndNotifyAffectedObjects((f, v) => f.PipingProbabilityAssessmentInput.A = v, value); + data.PipingProbabilityAssessmentInput.A = value; + data.NotifyObservers(); } } Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/Views/PipingFailureMechanismResultView.cs =================================================================== diff -u -r77b27109212e94d58eb47248d4210f7eac243fb6 -r208f69e10634efd1657580dcf349224453be8a05 --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/Views/PipingFailureMechanismResultView.cs (.../PipingFailureMechanismResultView.cs) (revision 77b27109212e94d58eb47248d4210f7eac243fb6) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/Views/PipingFailureMechanismResultView.cs (.../PipingFailureMechanismResultView.cs) (revision 208f69e10634efd1657580dcf349224453be8a05) @@ -39,6 +39,7 @@ { private const int assessmentLayerTwoAIndex = 2; private const double tolerance = 1e-6; + private readonly Observer failureMechanismObserver; private readonly RecursiveObserver calculationInputObserver; private readonly RecursiveObserver calculationOutputObserver; private readonly RecursiveObserver calculationGroupObserver; @@ -76,6 +77,8 @@ calculationGroupObserver = new RecursiveObserver( UpdateDataGridViewDataSource, c => c.Children); + + failureMechanismObserver = new Observer(UpdateDataGridViewDataSource); } public override IFailureMechanism FailureMechanism @@ -87,6 +90,7 @@ var calculatableFailureMechanism = value as ICalculatableFailureMechanism; CalculationGroup observableGroup = calculatableFailureMechanism?.CalculationsGroup; + failureMechanismObserver.Observable = base.FailureMechanism; calculationInputObserver.Observable = observableGroup; calculationOutputObserver.Observable = observableGroup; calculationGroupObserver.Observable = observableGroup; @@ -98,6 +102,7 @@ DataGridViewControl.CellFormatting -= ShowAssessmentLayerTwoAErrors; DataGridViewControl.CellFormatting -= DisableIrrelevantFieldsFormatting; + failureMechanismObserver.Dispose(); calculationInputObserver.Dispose(); calculationOutputObserver.Dispose(); calculationGroupObserver.Dispose(); Index: Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/PropertyClasses/PipingFailureMechanismPropertiesTest.cs =================================================================== diff -u -r02b9cf02cd0f64f14f0a655e13fc2c778cb2046b -r208f69e10634efd1657580dcf349224453be8a05 --- Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/PropertyClasses/PipingFailureMechanismPropertiesTest.cs (.../PipingFailureMechanismPropertiesTest.cs) (revision 02b9cf02cd0f64f14f0a655e13fc2c778cb2046b) +++ Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/PropertyClasses/PipingFailureMechanismPropertiesTest.cs (.../PipingFailureMechanismPropertiesTest.cs) (revision 208f69e10634efd1657580dcf349224453be8a05) @@ -341,20 +341,14 @@ public void A_SetInvalidValue_ThrowsArgumentOutOfRangeExceptionNoNotifications(double value) { // Setup - var failureMechanism = new PipingFailureMechanism(); - var mocks = new MockRepository(); - var observable = mocks.StrictMock(); - - var changeHandler = new FailureMechanismSetPropertyValueAfterConfirmationParameterTester( - failureMechanism, - value, - new[] - { - observable - }); + var observer = mocks.StrictMock(); + var changeHandler = mocks.Stub>(); mocks.ReplayAll(); + var failureMechanism = new PipingFailureMechanism(); + failureMechanism.Attach(observer); + var properties = new PipingFailureMechanismProperties( failureMechanism, changeHandler); @@ -365,7 +359,6 @@ // Assert var exception = Assert.Throws(call); Assert.AreEqual("De waarde moet in het bereik [0,0, 1,0] liggen.", exception.Message); - Assert.IsTrue(changeHandler.Called); mocks.VerifyAll(); } @@ -375,24 +368,18 @@ [TestCase(1)] [TestCase(0.0000001)] [TestCase(0.9999999)] - public void A_SetValidValue_SetsValueAndUpdatesObservers(double value) + public void A_SetValidValue_SetsValueAndNotifiesObservers(double value) { // Setup - var failureMechanism = new PipingFailureMechanism(); - var mocks = new MockRepository(); - var observable = mocks.StrictMock(); - observable.Expect(o => o.NotifyObservers()); - - var changeHandler = new FailureMechanismSetPropertyValueAfterConfirmationParameterTester( - failureMechanism, - value, - new[] - { - observable - }); + var observer = mocks.StrictMock(); + observer.Expect(o => o.UpdateObserver()); + var changeHandler = mocks.Stub>(); mocks.ReplayAll(); + var failureMechanism = new PipingFailureMechanism(); + failureMechanism.Attach(observer); + var properties = new PipingFailureMechanismProperties( failureMechanism, changeHandler); @@ -402,7 +389,6 @@ // Assert Assert.AreEqual(value, failureMechanism.PipingProbabilityAssessmentInput.A); - Assert.IsTrue(changeHandler.Called); mocks.VerifyAll(); } Index: Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/Views/PipingFailureMechanismResultViewTest.cs =================================================================== diff -u -r25244fe94c640d8b0598ee52e355a320efb66512 -r208f69e10634efd1657580dcf349224453be8a05 --- Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/Views/PipingFailureMechanismResultViewTest.cs (.../PipingFailureMechanismResultViewTest.cs) (revision 25244fe94c640d8b0598ee52e355a320efb66512) +++ Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/Views/PipingFailureMechanismResultViewTest.cs (.../PipingFailureMechanismResultViewTest.cs) (revision 208f69e10634efd1657580dcf349224453be8a05) @@ -527,6 +527,52 @@ } } + [Test] + [TestCase(AssessmentLayerOneState.NotAssessed)] + [TestCase(AssessmentLayerOneState.NoVerdict)] + public void GivenFailureMechanismResultView_WhenFailureMechanismNotifiesObserver_ThenViewUpdated(AssessmentLayerOneState assessmentLayerOneState) + { + // Given + const int rowIndex = 0; + + var pipingFailureMechanism = new PipingFailureMechanism(); + using (PipingFailureMechanismResultView view = ShowFullyConfiguredFailureMechanismResultsView(pipingFailureMechanism)) + { + PipingCalculationScenario calculationScenario1 = PipingCalculationScenarioFactory.CreatePipingCalculationScenario( + pipingFailureMechanism.Sections.First()); + calculationScenario1.Contribution = (RoundedDouble) 0.6; + PipingCalculationScenario calculationScenario2 = PipingCalculationScenarioFactory.CreatePipingCalculationScenario( + pipingFailureMechanism.Sections.First()); + calculationScenario2.Contribution = (RoundedDouble) 0.4; + pipingFailureMechanism.CalculationsGroup.Children.Add(calculationScenario1); + pipingFailureMechanism.CalculationsGroup.Children.Add(calculationScenario2); + + view.Data = pipingFailureMechanism.SectionResults; + + var gridTester = new ControlTester("dataGridView"); + var dataGridView = (DataGridView) gridTester.TheObject; + + dataGridView.Rows[rowIndex].Cells[assessmentLayerOneIndex].Value = assessmentLayerOneState; + + PipingFailureMechanismSectionResultRow[] sectionResultRows = dataGridView.Rows.Cast() + .Select(r => r.DataBoundItem) + .Cast() + .ToArray(); + + // When + pipingFailureMechanism.PipingProbabilityAssessmentInput.A = 0.01; + pipingFailureMechanism.NotifyObservers(); + + // Then + PipingFailureMechanismSectionResultRow[] updatedRows = dataGridView.Rows.Cast() + .Select(r => r.DataBoundItem) + .Cast() + .ToArray(); + + CollectionAssert.AreNotEquivalent(sectionResultRows, updatedRows); + } + } + private PipingFailureMechanismResultView ShowFullyConfiguredFailureMechanismResultsView(PipingFailureMechanism failureMechanism) { failureMechanism.AddSection(new FailureMechanismSection("Section 1", new List Index: Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/Views/PipingScenariosViewTest.cs =================================================================== diff -u -r25244fe94c640d8b0598ee52e355a320efb66512 -r208f69e10634efd1657580dcf349224453be8a05 --- Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/Views/PipingScenariosViewTest.cs (.../PipingScenariosViewTest.cs) (revision 25244fe94c640d8b0598ee52e355a320efb66512) +++ Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/Views/PipingScenariosViewTest.cs (.../PipingScenariosViewTest.cs) (revision 208f69e10634efd1657580dcf349224453be8a05) @@ -279,20 +279,7 @@ Assert.IsEmpty(dataGridView.Rows[0].ErrorText); } - public override void Setup() - { - base.Setup(); - - testForm = new Form(); - } - - public override void TearDown() - { - base.TearDown(); - - testForm.Dispose(); - } - + [Test] [TestCase(isRelevantColumnIndex, true)] [TestCase(contributionColumnIndex, 30.0)] public void PipingScenarioView_EditingPropertyViaDataGridView_ObserversCorrectlyNotified(int cellIndex, object newValue) @@ -322,6 +309,47 @@ mocks.VerifyAll(); } + [Test] + public void GivenFPipingScenarioView_WhenFailureMechanismNotifiesObserver_ThenViewUpdated() + { + // Given + using (PipingScenariosView view = ShowFullyConfiguredPipingScenarioView()) + { + var dataGridView = (DataGridView) new ControlTester("dataGridView").TheObject; + + PipingScenarioRow[] sectionResultRows = dataGridView.Rows.Cast() + .Select(r => r.DataBoundItem) + .Cast() + .ToArray(); + + // When + view.PipingFailureMechanism.PipingProbabilityAssessmentInput.A = 0.01; + view.PipingFailureMechanism.NotifyObservers(); + + // Then + PipingScenarioRow[] updatedRows = dataGridView.Rows.Cast() + .Select(r => r.DataBoundItem) + .Cast() + .ToArray(); + + CollectionAssert.AreNotEquivalent(sectionResultRows, updatedRows); + } + } + + public override void Setup() + { + base.Setup(); + + testForm = new Form(); + } + + public override void TearDown() + { + base.TearDown(); + + testForm.Dispose(); + } + private PipingScenariosView ShowFullyConfiguredPipingScenarioView() { var surfaceLine1 = new PipingSurfaceLine("Surface line 1")