Index: Ringtoets/Integration/test/Ringtoets.Integration.Forms.Test/Views/FailureMechanismContributionViewTest.cs =================================================================== diff -u -r6de928689da61ccae1dc375d27b8f178d97a13f7 -r3df4971064b76a8e789bed245e8851fea72ba085 --- Ringtoets/Integration/test/Ringtoets.Integration.Forms.Test/Views/FailureMechanismContributionViewTest.cs (.../FailureMechanismContributionViewTest.cs) (revision 6de928689da61ccae1dc375d27b8f178d97a13f7) +++ Ringtoets/Integration/test/Ringtoets.Integration.Forms.Test/Views/FailureMechanismContributionViewTest.cs (.../FailureMechanismContributionViewTest.cs) (revision 3df4971064b76a8e789bed245e8851fea72ba085) @@ -21,6 +21,7 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Drawing; using System.Linq; using System.Windows.Forms; @@ -70,7 +71,13 @@ [Test] public void DefaultConstructor_SetsDefaults() { - using (var contributionView = new FailureMechanismContributionView()) + // Setup + var mocks = new MockRepository(); + var handler = mocks.Stub(); + mocks.ReplayAll(); + + // Call + using (var contributionView = new FailureMechanismContributionView(handler)) { ShowFormWithView(contributionView); @@ -88,17 +95,22 @@ Assert.IsFalse(contributionView.AutoScroll); } + mocks.VerifyAll(); } [Test] public void NormTextBox_Initialize_TextSetToData() { // Setup + var mocks = new MockRepository(); + var handler = mocks.Stub(); + mocks.ReplayAll(); + AssessmentSection assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike); FailureMechanismContribution failureMechanismContribution = assessmentSection.FailureMechanismContribution; // Call - using (var contributionView = new FailureMechanismContributionView + using (var contributionView = new FailureMechanismContributionView(handler) { Data = failureMechanismContribution, AssessmentSection = assessmentSection @@ -115,10 +127,11 @@ Assert.AreEqual(1000000, normControl.Maximum); Assert.AreEqual(100, normControl.Minimum); } + mocks.VerifyAll(); } [Test] - public void NormTextBox_ValueChanged_UpdatesDataWithNewValue() + public void NormTextBox_ValueChangedAndUserConfirmsChange_UpdatesDataWithNewValue() { // Setup const int normValue = 200; @@ -127,13 +140,61 @@ FailureMechanismContribution failureMechanismContribution = assessmentSection.FailureMechanismContribution; MockRepository mockRepository = new MockRepository(); - IObserver observerMock = mockRepository.StrictMock(); - observerMock.Expect(o => o.UpdateObserver()); + var observable1 = mockRepository.StrictMock(); + observable1.Expect(o => o.NotifyObservers()); + var observable2 = mockRepository.StrictMock(); + observable2.Expect(o => o.NotifyObservers()); + + var handler = mockRepository.StrictMock(); + handler.Expect(h => h.ConfirmNormChange()).Return(true); + handler.Expect(h => h.ChangeNorm(assessmentSection, normValue)) + .Return(new[] + { + observable1, + observable2 + }); + mockRepository.ReplayAll(); - failureMechanismContribution.Attach(observerMock); + using (FailureMechanismContributionView distributionView = new FailureMechanismContributionView(handler) + { + Data = failureMechanismContribution, + AssessmentSection = assessmentSection + }) + { + ShowFormWithView(distributionView); + ControlTester normTester = new ControlTester(normInputTextBoxName); - using (FailureMechanismContributionView distributionView = new FailureMechanismContributionView + // Precondition + Assert.AreEqual(failureMechanismContribution.Norm.ToString(), normTester.Text); + + // Call + SimulateUserComittingNormValue(normTester, normValue); + } + // Assert + mockRepository.VerifyAll(); + } + + [Test] + public void NormTextBox_ValueChangedAndUserDisallowsChange_NothingHappens() + { + // Setup + const int normValue = 200; + + AssessmentSection assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike); + FailureMechanismContribution failureMechanismContribution = assessmentSection.FailureMechanismContribution; + int originalNormValue = failureMechanismContribution.Norm; + + MockRepository mockRepository = new MockRepository(); + var handler = mockRepository.StrictMock(); + handler.Expect(h => h.ConfirmNormChange()).Return(false); + handler.Expect(h => h.ChangeNorm(assessmentSection, normValue)) + .Return(Enumerable.Empty()) + .Repeat.Never(); + + mockRepository.ReplayAll(); + + using (FailureMechanismContributionView distributionView = new FailureMechanismContributionView(handler) { Data = failureMechanismContribution, AssessmentSection = assessmentSection @@ -146,10 +207,10 @@ Assert.AreEqual(failureMechanismContribution.Norm.ToString(), normTester.Text); // Call - normTester.Properties.Text = normValue.ToString(); + SimulateUserComittingNormValue(normTester, normValue); // Assert - Assert.AreEqual(normValue, failureMechanismContribution.Norm); + Assert.AreEqual(originalNormValue.ToString(), normTester.Properties.Text); } mockRepository.VerifyAll(); } @@ -158,7 +219,11 @@ public void Data_Always_CorrectHeaders() { // Setup - using (var distributionView = new FailureMechanismContributionView()) + var mocks = new MockRepository(); + var handler = mocks.Stub(); + mocks.ReplayAll(); + + using (var distributionView = new FailureMechanismContributionView(handler)) { // Call ShowFormWithView(distributionView); @@ -181,6 +246,7 @@ string probabilitySpaceColumnHeaderText = dataGridView.Columns[probabilitySpaceColumnIndex].HeaderText; Assert.AreEqual("Faalkansruimte [1/jaar]", probabilitySpaceColumnHeaderText); } + mocks.VerifyAll(); } [Test] @@ -197,6 +263,8 @@ double testContribution = 100 - otherContribution; var mockRepository = new MockRepository(); + var handler = mockRepository.Stub(); + var someMechanism = mockRepository.StrictMock(testName, testCode); someMechanism.Contribution = testContribution; @@ -207,7 +275,7 @@ someMechanism }, otherContribution, 100); - using (var distributionView = new FailureMechanismContributionView + using (var distributionView = new FailureMechanismContributionView(handler) { AssessmentSection = assessmentSection }) @@ -246,6 +314,7 @@ var assessmentSection2 = new AssessmentSection(AssessmentSectionComposition.Dike); var mockRepository = new MockRepository(); + var handler = mockRepository.Stub(); var someMechanism = mockRepository.Stub(); mockRepository.ReplayAll(); @@ -258,7 +327,7 @@ someMechanism }, random.Next(0, 100), expectedValue); - using (var distributionView = new FailureMechanismContributionView + using (var distributionView = new FailureMechanismContributionView(handler) { Data = initialContribution, AssessmentSection = assessmentSection1 @@ -292,6 +361,7 @@ var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike); var mockRepository = new MockRepository(); + var handler = mockRepository.Stub(); var someMechanism = mockRepository.Stub(); mockRepository.ReplayAll(); @@ -300,7 +370,7 @@ someMechanism }, random.Next(0, 100), initialValue); - using (var distributionView = new FailureMechanismContributionView + using (var distributionView = new FailureMechanismContributionView(handler) { Data = contribution, AssessmentSection = assessmentSection @@ -332,14 +402,15 @@ var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike); var mockRepository = new MockRepository(); + var handler = mockRepository.Stub(); var failureMechanismStub = mockRepository.Stub(); failureMechanismStub.Stub(fm => fm.Name).Return("A"); failureMechanismStub.Stub(fm => fm.Code).Return("C"); failureMechanismStub.Contribution = 100; failureMechanismStub.IsRelevant = isFailureMechanismRelevant; mockRepository.ReplayAll(); - using (var view = new FailureMechanismContributionView()) + using (var view = new FailureMechanismContributionView(handler)) { // When var contributionData = new FailureMechanismContribution(new[] @@ -368,13 +439,14 @@ var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike); var mockRepository = new MockRepository(); + var handler = mockRepository.Stub(); var failureMechanismStub = mockRepository.Stub(); failureMechanismStub.Stub(fm => fm.Name).Return("A"); failureMechanismStub.Stub(fm => fm.Code).Return("C"); failureMechanismStub.Contribution = 0; mockRepository.ReplayAll(); - using (var view = new FailureMechanismContributionView()) + using (var view = new FailureMechanismContributionView(handler)) { // When var contributionData = new FailureMechanismContribution(new[] @@ -406,14 +478,14 @@ var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike); var mockRepository = new MockRepository(); - + var handler = mockRepository.Stub(); var failureMechanismStub = mockRepository.Stub(); failureMechanismStub.Stub(fm => fm.Name).Return("A"); failureMechanismStub.Stub(fm => fm.Code).Return("C"); failureMechanismStub.Contribution = contribution; mockRepository.ReplayAll(); - using (var view = new FailureMechanismContributionView()) + using (var view = new FailureMechanismContributionView(handler)) { // When var contributionData = new FailureMechanismContribution(new[] @@ -446,7 +518,11 @@ public void CompositionComboBox_WithDataSet_SelectedDisplayTextAndValueCorrect(AssessmentSectionComposition composition, string expectedDisplayText) { // Setup - using (var view = new FailureMechanismContributionView()) + var mocks = new MockRepository(); + var handler = mocks.Stub(); + mocks.ReplayAll(); + + using (var view = new FailureMechanismContributionView(handler)) { ShowFormWithView(view); @@ -462,6 +538,7 @@ Assert.AreEqual(expectedDisplayText, compositionComboBox.Text); Assert.AreEqual(composition, compositionComboBox.SelectedValue); } + mocks.VerifyAll(); } [Test] @@ -474,7 +551,11 @@ public void CompositionComboBox_ChangeCompositionAndOk_UpdateAssessmentSectionContributionAndView(AssessmentSectionComposition initialComposition, AssessmentSectionComposition newComposition) { // Setup - using (var view = new FailureMechanismContributionView()) + var mocks = new MockRepository(); + var handler = mocks.Stub(); + mocks.ReplayAll(); + + using (var view = new FailureMechanismContributionView(handler)) { var assessmentSection = new AssessmentSection(initialComposition); @@ -502,6 +583,7 @@ "Expect the DataGridView to be flagged for redrawing."); AssertDataGridViewDataSource(assessmentSection.FailureMechanismContribution.Distribution, contributionGridView); } + mocks.VerifyAll(); } [Test] @@ -514,13 +596,14 @@ public void CompositionComboBox_ChangeComposition_NotifyAssessmentSectionObservers(AssessmentSectionComposition initialComposition, AssessmentSectionComposition newComposition) { // Setup - using (var view = new FailureMechanismContributionView()) - { - var mocks = new MockRepository(); - var observer = mocks.StrictMock(); - observer.Expect(o => o.UpdateObserver()); - mocks.ReplayAll(); + var mocks = new MockRepository(); + var handler = mocks.Stub(); + var observer = mocks.StrictMock(); + observer.Expect(o => o.UpdateObserver()); + mocks.ReplayAll(); + using (var view = new FailureMechanismContributionView(handler)) + { var assessmentSection = new AssessmentSection(initialComposition); assessmentSection.Attach(observer); @@ -535,25 +618,25 @@ // Call compositionComboBox.SelectedValue = newComposition; - - // Assert - mocks.VerifyAll(); // Expect UpdateObserver call } + // Assert + mocks.VerifyAll(); // Expect UpdateObserver call } [Test] public void GivenView_WhenSettingRelevantFailureMechanism_RowIsStylesAsEnabled() { // Given - using (var view = new FailureMechanismContributionView()) + var mocks = new MockRepository(); + var handler = mocks.Stub(); + var failureMechanism = mocks.Stub(); + failureMechanism.IsRelevant = true; + mocks.ReplayAll(); + + using (var view = new FailureMechanismContributionView(handler)) { ShowFormWithView(view); - var mocks = new MockRepository(); - var failureMechanism = mocks.Stub(); - failureMechanism.IsRelevant = true; - mocks.ReplayAll(); - var failureMechanisms = new[] { failureMechanism @@ -578,23 +661,24 @@ DataGridViewCell cell = row.Cells[i]; AssertIsCellStyledAsEnabled(cell); } - mocks.VerifyAll(); } + mocks.VerifyAll(); } [Test] public void GivenView_WhenSettingFailureMechanismThatIsIrrelevant_RowIsStylesAsGreyedOut() { // Given - using (var view = new FailureMechanismContributionView()) + var mocks = new MockRepository(); + var handler = mocks.Stub(); + var failureMechanism = mocks.Stub(); + failureMechanism.IsRelevant = false; + mocks.ReplayAll(); + + using (var view = new FailureMechanismContributionView(handler)) { ShowFormWithView(view); - var mocks = new MockRepository(); - var failureMechanism = mocks.Stub(); - failureMechanism.IsRelevant = false; - mocks.ReplayAll(); - var failureMechanisms = new[] { failureMechanism @@ -619,8 +703,8 @@ DataGridViewCell cell = row.Cells[i]; AssertIsCellStyleGreyedOut(cell); } - mocks.VerifyAll(); } + mocks.VerifyAll(); } [Test] @@ -631,6 +715,7 @@ // Given List failureMechanismObservers = new List(); var mocks = new MockRepository(); + var handler = mocks.Stub(); var failureMechanism = mocks.Stub(); failureMechanism.Stub(fm => fm.Name).Return("A"); failureMechanism.Stub(fm => fm.Code).Return("C"); @@ -654,7 +739,7 @@ assessmentSection.Stub(section => section.Composition).Return(AssessmentSectionComposition.Dike); mocks.ReplayAll(); - using (var view = new FailureMechanismContributionView()) + using (var view = new FailureMechanismContributionView(handler)) { ShowFormWithView(view); @@ -714,6 +799,7 @@ // Given List failureMechanismObservers = new List(); var mocks = new MockRepository(); + var handler = mocks.Stub(); var failureMechanism = mocks.Stub(); failureMechanism.Stub(fm => fm.Name).Return("A"); failureMechanism.Stub(fm => fm.Code).Return("C"); @@ -765,7 +851,7 @@ viewCommandsStub.Expect(vc => vc.RemoveAllViewsForItem(irrelevantFailureMechanism)); mocks.ReplayAll(); - using (var view = new FailureMechanismContributionView + using (var view = new FailureMechanismContributionView(handler) { ViewCommands = viewCommandsStub }) @@ -789,7 +875,11 @@ public void GivenView_WhenSettingFailureMechanismThatIsAlwaysRelevant_IsRelevantFlagTrueAndReadonly() { // Given - using (var view = new FailureMechanismContributionView()) + var mocks = new MockRepository(); + var handler = mocks.Stub(); + mocks.ReplayAll(); + + using (var view = new FailureMechanismContributionView(handler)) { ShowFormWithView(view); @@ -812,8 +902,107 @@ Assert.IsTrue((bool) isRelevantCell.Value); Assert.IsTrue(isRelevantCell.ReadOnly); } + mocks.VerifyAll(); } + [Test] + public void GivenView_WhenEscapeAfterEnteringDifferentNormNotCommited_RevertNormAndNoChangedToData() + { + // Given + var mocks = new MockRepository(); + var handler = mocks.Stub(); + handler.Stub(h => h.ChangeNorm(null, 1)) + .IgnoreArguments() + .Return(Enumerable.Empty()); + mocks.ReplayAll(); + + AssessmentSection assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike); + FailureMechanismContribution failureMechanismContribution = assessmentSection.FailureMechanismContribution; + + const int normValue = 200; + int originalNorm = failureMechanismContribution.Norm; + + using (var view = new FailureMechanismContributionView(handler) + { + Data = failureMechanismContribution, + AssessmentSection = assessmentSection + }) + { + ShowFormWithView(view); + ControlTester normTester = new ControlTester(normInputTextBoxName); + + // When + var normInput = (NumericUpDown)normTester.TheObject; + view.ActiveControl = normInput; + normInput.Value = normValue; + var keyEventArgs = new KeyEventArgs(Keys.Escape); + EventHelper.RaiseEvent(normInput.Controls.OfType().First(), "KeyDown", keyEventArgs); + + // Then + Assert.IsTrue(keyEventArgs.Handled); + Assert.IsTrue(keyEventArgs.SuppressKeyPress); + + Assert.AreEqual(originalNorm, normInput.Value); + Assert.AreNotSame(normInput, view.ActiveControl); + } + mocks.VerifyAll(); + } + + [Test] + public void GivenView_WhenEnterAfterEnteringDifferentNormNotCommited_CommitValueAndChangeData() + { + // Given + const int normValue = 200; + + AssessmentSection assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike); + FailureMechanismContribution failureMechanismContribution = assessmentSection.FailureMechanismContribution; + + var mocks = new MockRepository(); + var handler = mocks.StrictMock(); + handler.Expect(h => h.ConfirmNormChange()) + .Return(true); + handler.Expect(h => h.ChangeNorm(assessmentSection, normValue)) + .Return(Enumerable.Empty()); + mocks.ReplayAll(); + + using (var view = new FailureMechanismContributionView(handler) + { + Data = failureMechanismContribution, + AssessmentSection = assessmentSection + }) + { + ShowFormWithView(view); + ControlTester normTester = new ControlTester(normInputTextBoxName); + + // When + var normInput = (NumericUpDown)normTester.TheObject; + view.ActiveControl = normInput; + normInput.Value = normValue; + var keyEventArgs = new KeyEventArgs(Keys.Enter); + EventHelper.RaiseEvent(normInput.Controls.OfType().First(), "KeyDown", keyEventArgs); + + // Then + Assert.IsTrue(keyEventArgs.Handled); + Assert.IsTrue(keyEventArgs.SuppressKeyPress); + + Assert.AreEqual(normValue, normInput.Value); + Assert.AreNotSame(normInput, view.ActiveControl); + } + mocks.VerifyAll(); + } + + private static void SimulateUserComittingNormValue(ControlTester normTester, int normValue) + { + var normInput = (NumericUpDown) normTester.TheObject; + normInput.Value = normValue; + var eventArgs = new CancelEventArgs(); + EventHelper.RaiseEvent(normTester.TheObject, "Validating", eventArgs); + if (!eventArgs.Cancel) + { + normTester.FireEvent("Validated"); + } + } + private void AssertDataGridViewDataSource(IEnumerable expectedDistributionElements, DataGridView dataGridView) { FailureMechanismContributionItem[] itemArray = expectedDistributionElements.ToArray();