Index: Ringtoets/Integration/src/Ringtoets.Integration.Forms/Properties/Resources.Designer.cs =================================================================== diff -u -ra7a3af9bffa76922cf344ee2134ad30078de878d -r1edcce70c4214ce894351c4e19f69c0c954d6360 --- Ringtoets/Integration/src/Ringtoets.Integration.Forms/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision a7a3af9bffa76922cf344ee2134ad30078de878d) +++ Ringtoets/Integration/src/Ringtoets.Integration.Forms/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision 1edcce70c4214ce894351c4e19f69c0c954d6360) @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.42000 +// Runtime Version:4.0.30319.18444 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -163,6 +163,18 @@ } /// + /// Looks up a localized string similar to Het veranderen van het traject type zorgt ervoor dat de uitvoer van alle berekeningen wordt gewist. + /// + ///Weet u zeker dat u wilt doorgaan?. + /// + public static string FailureMechanismContributionView_ChangeComposition_Change_will_clear_calculation_output_accept_question { + get { + return ResourceManager.GetString("FailureMechanismContributionView_ChangeComposition_Change_will_clear_calculation_" + + "output_accept_question", resourceCulture); + } + } + + /// /// Looks up a localized string similar to n.v.t. /// public static string FailureMechanismContributionView_ProbabilityPerYear_Not_applicable { Index: Ringtoets/Integration/src/Ringtoets.Integration.Forms/Properties/Resources.resx =================================================================== diff -u -ra7a3af9bffa76922cf344ee2134ad30078de878d -r1edcce70c4214ce894351c4e19f69c0c954d6360 --- Ringtoets/Integration/src/Ringtoets.Integration.Forms/Properties/Resources.resx (.../Resources.resx) (revision a7a3af9bffa76922cf344ee2134ad30078de878d) +++ Ringtoets/Integration/src/Ringtoets.Integration.Forms/Properties/Resources.resx (.../Resources.resx) (revision 1edcce70c4214ce894351c4e19f69c0c954d6360) @@ -228,4 +228,9 @@ n.v.t + + Het veranderen van het traject type zorgt ervoor dat de uitvoer van alle berekeningen wordt gewist. + +Weet u zeker dat u wilt doorgaan? + \ No newline at end of file Index: Ringtoets/Integration/src/Ringtoets.Integration.Forms/Views/FailureMechanismContributionView.cs =================================================================== diff -u -ra9aafffab97152303562110b1d789bacb465ce24 -r1edcce70c4214ce894351c4e19f69c0c954d6360 --- Ringtoets/Integration/src/Ringtoets.Integration.Forms/Views/FailureMechanismContributionView.cs (.../FailureMechanismContributionView.cs) (revision a9aafffab97152303562110b1d789bacb465ce24) +++ Ringtoets/Integration/src/Ringtoets.Integration.Forms/Views/FailureMechanismContributionView.cs (.../FailureMechanismContributionView.cs) (revision 1edcce70c4214ce894351c4e19f69c0c954d6360) @@ -27,11 +27,12 @@ using Core.Common.Controls.Views; using Core.Common.Utils.Reflection; -using Ringtoets.Common.Data; using Ringtoets.Common.Data.AssessmentSection; using Ringtoets.Common.Data.Contribution; +using Ringtoets.Common.Data.FailureMechanism; using Ringtoets.Common.Forms.PresentationObjects; +using CoreCommonBaseResources = Core.Common.Base.Properties.Resources; using CommonGuiResources = Core.Common.Gui.Properties.Resources; using RingtoetsIntegrationFormsResources = Ringtoets.Integration.Forms.Properties.Resources; @@ -47,6 +48,8 @@ private DataGridViewColumn probabilityPerYearColumn; private FailureMechanismContributionContext data; + private bool revertingComboBoxSelectedValue; + /// /// Creates a new instance of . /// @@ -271,11 +274,36 @@ private void AssessmentSectionCompositionComboBoxSelectedIndexChanged(object sender, EventArgs e) { + if (revertingComboBoxSelectedValue) + { + return; + } + IAssessmentSection assessmentSection = data.Parent; - assessmentSection.ChangeComposition((AssessmentSectionComposition)assessmentSectionCompositionComboBox.SelectedValue); - SetGridDataSource(); - assessmentSection.NotifyObservers(); + var dialogResult = MessageBox.Show(RingtoetsIntegrationFormsResources.FailureMechanismContributionView_ChangeComposition_Change_will_clear_calculation_output_accept_question, + CoreCommonBaseResources.Confirm, + MessageBoxButtons.OKCancel); + if (dialogResult == DialogResult.OK) + { + assessmentSection.ChangeComposition((AssessmentSectionComposition)assessmentSectionCompositionComboBox.SelectedValue); + SetGridDataSource(); + foreach (IFailureMechanism failureMechanism in assessmentSection.GetFailureMechanisms()) + { + foreach (ICalculationItem calculation in failureMechanism.CalculationItems) + { + calculation.ClearOutput(); + calculation.NotifyObservers(); + } + } + assessmentSection.NotifyObservers(); + } + else + { + revertingComboBoxSelectedValue = true; + assessmentSectionCompositionComboBox.SelectedValue = assessmentSection.Composition; + revertingComboBoxSelectedValue = false; + } } } } \ No newline at end of file Index: Ringtoets/Integration/test/Ringtoets.Integration.Forms.Test/Views/FailureMechanismContributionViewTest.cs =================================================================== diff -u -ra9aafffab97152303562110b1d789bacb465ce24 -r1edcce70c4214ce894351c4e19f69c0c954d6360 --- Ringtoets/Integration/test/Ringtoets.Integration.Forms.Test/Views/FailureMechanismContributionViewTest.cs (.../FailureMechanismContributionViewTest.cs) (revision a9aafffab97152303562110b1d789bacb465ce24) +++ Ringtoets/Integration/test/Ringtoets.Integration.Forms.Test/Views/FailureMechanismContributionViewTest.cs (.../FailureMechanismContributionViewTest.cs) (revision 1edcce70c4214ce894351c4e19f69c0c954d6360) @@ -4,7 +4,6 @@ using NUnit.Extensions.Forms; using NUnit.Framework; using Rhino.Mocks; -using Ringtoets.Common.Data; using Ringtoets.Common.Data.AssessmentSection; using Ringtoets.Common.Data.Contribution; using Ringtoets.Common.Data.FailureMechanism; @@ -15,7 +14,7 @@ namespace Ringtoets.Integration.Forms.Test.Views { [TestFixture] - public class FailureMechanismContributionViewTest + public class FailureMechanismContributionViewTest : NUnitFormTest { private const string normInputTextBoxName = "normInput"; private const string dataGridViewControlName = "probabilityDistributionGrid"; @@ -24,15 +23,19 @@ private Form testForm; [SetUp] - public void Setup() + public override void Setup() { + base.Setup(); + testForm = new Form(); } [TearDown] - public void TearDown() + public override void TearDown() { testForm.Dispose(); + + base.TearDown(); } [Test] @@ -316,7 +319,7 @@ [TestCase(AssessmentSectionComposition.Dune, AssessmentSectionComposition.DikeAndDune)] [TestCase(AssessmentSectionComposition.DikeAndDune, AssessmentSectionComposition.Dike)] [TestCase(AssessmentSectionComposition.DikeAndDune, AssessmentSectionComposition.Dune)] - public void CompositionComboBox_ChangeComposition_UpdateAssessmentSectionContributionAndView(AssessmentSectionComposition initialComposition, AssessmentSectionComposition newComposition) + public void CompositionComboBox_ChangeComposition_ShowMessageBoxWithExpectedText(AssessmentSectionComposition initialComposition, AssessmentSectionComposition newComposition) { // Setup using (var view = new FailureMechanismContributionView()) @@ -337,10 +340,66 @@ var contributionGridView = (DataGridView)new ControlTester(dataGridViewControlName).TheObject; contributionGridView.Invalidated += (sender, args) => dataGridInvalidatedCallCount++; + string messageBoxTitle = null, messageBoxText = null; + DialogBoxHandler = (name, wnd) => + { + var messageBox = new MessageBoxTester(wnd); + messageBoxTitle = messageBox.Title; + messageBoxText = messageBox.Text; + + messageBox.ClickOk(); + }; + // Call compositionComboBox.SelectedValue = newComposition; // Assert + Assert.AreEqual("Bevestigen", messageBoxTitle); + string expectedText = "Het veranderen van het traject type zorgt ervoor dat de uitvoer van alle berekeningen wordt gewist." + Environment.NewLine + + Environment.NewLine + + "Weet u zeker dat u wilt doorgaan?"; + Assert.AreEqual(expectedText, messageBoxText); + } + } + + [Test] + [TestCase(AssessmentSectionComposition.Dike, AssessmentSectionComposition.Dune)] + [TestCase(AssessmentSectionComposition.Dike, AssessmentSectionComposition.DikeAndDune)] + [TestCase(AssessmentSectionComposition.Dune, AssessmentSectionComposition.Dike)] + [TestCase(AssessmentSectionComposition.Dune, AssessmentSectionComposition.DikeAndDune)] + [TestCase(AssessmentSectionComposition.DikeAndDune, AssessmentSectionComposition.Dike)] + [TestCase(AssessmentSectionComposition.DikeAndDune, AssessmentSectionComposition.Dune)] + public void CompositionComboBox_ChangeCompositionAndOk_UpdateAssessmentSectionContributionAndView(AssessmentSectionComposition initialComposition, AssessmentSectionComposition newComposition) + { + // Setup + using (var view = new FailureMechanismContributionView()) + { + var assessmentSection = new AssessmentSection(initialComposition); + + var context = new FailureMechanismContributionContext(assessmentSection.FailureMechanismContribution, assessmentSection); + + view.Data = context; + ShowFormWithView(view); + + // Precondition + Assert.AreNotEqual(assessmentSection.Composition, newComposition); + + int dataGridInvalidatedCallCount = 0; + var contributionGridView = (DataGridView)new ControlTester(dataGridViewControlName).TheObject; + contributionGridView.Invalidated += (sender, args) => dataGridInvalidatedCallCount++; + + DialogBoxHandler = (name, wnd) => + { + var messageBox = new MessageBoxTester(wnd); + messageBox.ClickOk(); + }; + + var compositionComboBox = (ComboBox)new ControlTester(assessmentSectionCompositionComboBoxName).TheObject; + + // Call + compositionComboBox.SelectedValue = newComposition; + + // Assert Assert.AreEqual(newComposition, compositionComboBox.SelectedValue); Assert.AreEqual(newComposition, assessmentSection.Composition); @@ -356,7 +415,7 @@ [TestCase(AssessmentSectionComposition.Dune, AssessmentSectionComposition.DikeAndDune)] [TestCase(AssessmentSectionComposition.DikeAndDune, AssessmentSectionComposition.Dike)] [TestCase(AssessmentSectionComposition.DikeAndDune, AssessmentSectionComposition.Dune)] - public void CompositionComboBox_ChangeComposition_NotifyAssessmentSectionObservers(AssessmentSectionComposition initialComposition, AssessmentSectionComposition newComposition) + public void CompositionComboBox_ChangeCompositionAndOk_NotifyAssessmentSectionObservers(AssessmentSectionComposition initialComposition, AssessmentSectionComposition newComposition) { // Setup using (var view = new FailureMechanismContributionView()) @@ -377,6 +436,12 @@ // Precondition Assert.AreNotEqual(assessmentSection.Composition, newComposition); + DialogBoxHandler = (name, wnd) => + { + var messageBox = new MessageBoxTester(wnd); + messageBox.ClickOk(); + }; + var compositionComboBox = (ComboBox)new ControlTester(assessmentSectionCompositionComboBoxName).TheObject; // Call @@ -388,6 +453,167 @@ } + [Test] + [TestCase(AssessmentSectionComposition.Dike, AssessmentSectionComposition.Dune)] + [TestCase(AssessmentSectionComposition.Dike, AssessmentSectionComposition.DikeAndDune)] + [TestCase(AssessmentSectionComposition.Dune, AssessmentSectionComposition.Dike)] + [TestCase(AssessmentSectionComposition.Dune, AssessmentSectionComposition.DikeAndDune)] + [TestCase(AssessmentSectionComposition.DikeAndDune, AssessmentSectionComposition.Dike)] + [TestCase(AssessmentSectionComposition.DikeAndDune, AssessmentSectionComposition.Dune)] + public void CompositionComboBox_ChangeCompositionAndOk_ClearOutputAndNotify(AssessmentSectionComposition initialComposition, AssessmentSectionComposition newComposition) + { + // Setup + using (var view = new FailureMechanismContributionView()) + { + var firstMockRepository = new MockRepository(); + + var calculationItem1 = firstMockRepository.Stub(); + calculationItem1.Expect(ci => ci.ClearOutput()); + calculationItem1.Expect(ci => ci.NotifyObservers()); + var calculationItem2 = firstMockRepository.Stub(); + calculationItem2.Expect(ci => ci.ClearOutput()); + calculationItem2.Expect(ci => ci.NotifyObservers()); + + var failureMechanism1 = firstMockRepository.Stub(); + failureMechanism1.Stub(fm => fm.CalculationItems).Return(new[] + { + calculationItem1 + }); + failureMechanism1.Stub(fm => fm.Name).Return("A"); + var failureMechanism2 = firstMockRepository.Stub(); + failureMechanism2.Stub(fm => fm.CalculationItems).Return(new[] + { + calculationItem2 + }); + failureMechanism2.Stub(fm => fm.Name).Return("B"); + + firstMockRepository.ReplayAll(); + + var failureMechanisms = new[] + { + failureMechanism1, + failureMechanism2 + }; + + var failureMechanismContribution = new FailureMechanismContribution(failureMechanisms, 100.0, 30000); + + var secondMockRepository = new MockRepository(); + var assessmentSection = secondMockRepository.Stub(); + assessmentSection.Stub(section => section.FailureMechanismContribution).Return(failureMechanismContribution); + assessmentSection.Stub(section => section.Composition).Return(initialComposition); + assessmentSection.Stub(section => section.GetFailureMechanisms()).Return(failureMechanisms); + assessmentSection.Stub(section => section.NotifyObservers()); + assessmentSection.Expect(section => section.ChangeComposition(newComposition)); + secondMockRepository.ReplayAll(); + + var context = new FailureMechanismContributionContext(failureMechanismContribution, assessmentSection); + + view.Data = context; + ShowFormWithView(view); + + // Precondition + Assert.AreNotEqual(assessmentSection.Composition, newComposition); + + int dataGridInvalidatedCallCount = 0; + var contributionGridView = (DataGridView)new ControlTester(dataGridViewControlName).TheObject; + contributionGridView.Invalidated += (sender, args) => dataGridInvalidatedCallCount++; + + DialogBoxHandler = (name, wnd) => + { + var messageBox = new MessageBoxTester(wnd); + messageBox.ClickOk(); + }; + + var compositionComboBox = (ComboBox)new ControlTester(assessmentSectionCompositionComboBoxName).TheObject; + + // Call + compositionComboBox.SelectedValue = newComposition; + + // Assert + Assert.AreEqual(newComposition, compositionComboBox.SelectedValue); + + Assert.AreEqual(1, dataGridInvalidatedCallCount); + + firstMockRepository.VerifyAll(); // Expect ICalculationItem.ClearOutput and ICalculationItem.NotifyObservers + secondMockRepository.VerifyAll(); + } + } + + [Test] + [TestCase(AssessmentSectionComposition.Dike, AssessmentSectionComposition.Dune)] + [TestCase(AssessmentSectionComposition.Dike, AssessmentSectionComposition.DikeAndDune)] + [TestCase(AssessmentSectionComposition.Dune, AssessmentSectionComposition.Dike)] + [TestCase(AssessmentSectionComposition.Dune, AssessmentSectionComposition.DikeAndDune)] + [TestCase(AssessmentSectionComposition.DikeAndDune, AssessmentSectionComposition.Dike)] + [TestCase(AssessmentSectionComposition.DikeAndDune, AssessmentSectionComposition.Dune)] + public void CompositionComboBox_ChangeCompositionAndCancel_KeepOriginalCompositionAndCalculationResults(AssessmentSectionComposition initialComposition, AssessmentSectionComposition newComposition) + { + // Setup + using (var view = new FailureMechanismContributionView()) + { + var firstMockRepository = new MockRepository(); + + var calculationItem1 = firstMockRepository.Stub(); + calculationItem1.Expect(ci => ci.ClearOutput()).Repeat.Never(); + var calculationItem2 = firstMockRepository.Stub(); + calculationItem2.Expect(ci => ci.ClearOutput()).Repeat.Never(); + + var failureMechanism = firstMockRepository.Stub(); + failureMechanism.Stub(fm => fm.CalculationItems).Return(new[] + { + calculationItem1, + calculationItem2 + }); + failureMechanism.Stub(fm => fm.Name).Return("A"); + + firstMockRepository.ReplayAll(); + + var failureMechanisms = new[] + { + failureMechanism + }; + + var failureMechanismContribution = new FailureMechanismContribution(failureMechanisms, 100.0, 30000); + + var secondMockRepository = new MockRepository(); + var assessmentSection = secondMockRepository.Stub(); + assessmentSection.Stub(section => section.FailureMechanismContribution).Return(failureMechanismContribution); + assessmentSection.Stub(section => section.Composition).Return(initialComposition); + assessmentSection.Stub(section => section.GetFailureMechanisms()).Return(failureMechanisms); + assessmentSection.Expect(section => section.ChangeComposition(newComposition)).Repeat.Never(); + secondMockRepository.ReplayAll(); + + var context = new FailureMechanismContributionContext(failureMechanismContribution, assessmentSection); + + view.Data = context; + ShowFormWithView(view); + + // Precondition + Assert.AreNotEqual(assessmentSection.Composition, newComposition); + + int dataGridInvalidatedCallCount = 0; + var contributionGridView = (DataGridView)new ControlTester(dataGridViewControlName).TheObject; + contributionGridView.Invalidated += (sender, args) => dataGridInvalidatedCallCount++; + + var compositionComboBox = (ComboBox)new ControlTester(assessmentSectionCompositionComboBoxName).TheObject; + + DialogBoxHandler = (name, wnd) => + { + var messageBox = new MessageBoxTester(wnd); + messageBox.ClickCancel(); + }; + + // Call + compositionComboBox.SelectedValue = newComposition; + + // Assert + Assert.AreEqual(0, dataGridInvalidatedCallCount); + Assert.AreEqual(initialComposition, compositionComboBox.SelectedValue); + + secondMockRepository.VerifyAll(); + } + } + private void ShowFormWithView(FailureMechanismContributionView distributionView) { testForm.Controls.Add(distributionView);