Index: Ringtoets/Integration/src/Ringtoets.Integration.Forms/Views/AssemblyResultPerSectionView.Designer.cs =================================================================== diff -u -rc704dafc81a213131e51f78b19fee63c14a9a5a5 -r91a5d8f7c8b54588748ae979c9e26ef72207768f --- Ringtoets/Integration/src/Ringtoets.Integration.Forms/Views/AssemblyResultPerSectionView.Designer.cs (.../AssemblyResultPerSectionView.Designer.cs) (revision c704dafc81a213131e51f78b19fee63c14a9a5a5) +++ Ringtoets/Integration/src/Ringtoets.Integration.Forms/Views/AssemblyResultPerSectionView.Designer.cs (.../AssemblyResultPerSectionView.Designer.cs) (revision 91a5d8f7c8b54588748ae979c9e26ef72207768f) @@ -42,9 +42,11 @@ this.buttonGroupBox = new System.Windows.Forms.GroupBox(); this.errorProvider = new System.Windows.Forms.ErrorProvider(this.components); this.warningProvider = new System.Windows.Forms.ErrorProvider(this.components); + this.manualAssemblyWarningProvider = new System.Windows.Forms.ErrorProvider(this.components); this.buttonGroupBox.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.warningProvider)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.manualAssemblyWarningProvider)).BeginInit(); this.SuspendLayout(); // // dataGridViewControl @@ -94,6 +96,13 @@ this.warningProvider.Icon = global::Ringtoets.Common.Forms.Properties.Resources.warning; this.warningProvider.SetIconPadding(this.refreshAssemblyResultsButton, 4); // + // manualAssemblyWarningProvider + // + this.manualAssemblyWarningProvider.BlinkStyle = System.Windows.Forms.ErrorBlinkStyle.NeverBlink; + this.manualAssemblyWarningProvider.ContainerControl = this; + this.manualAssemblyWarningProvider.Icon = global::Ringtoets.Common.Forms.Properties.Resources.PencilWarning; + this.manualAssemblyWarningProvider.SetIconPadding(this.refreshAssemblyResultsButton, 4); + // // AssemblyResultPerSectionView // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -107,6 +116,7 @@ this.buttonGroupBox.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.warningProvider)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.manualAssemblyWarningProvider)).EndInit(); this.ResumeLayout(false); } @@ -118,5 +128,6 @@ private System.Windows.Forms.GroupBox buttonGroupBox; private System.Windows.Forms.ErrorProvider errorProvider; private System.Windows.Forms.ErrorProvider warningProvider; + private System.Windows.Forms.ErrorProvider manualAssemblyWarningProvider; } } Index: Ringtoets/Integration/src/Ringtoets.Integration.Forms/Views/AssemblyResultPerSectionView.cs =================================================================== diff -u -r89eba1fca653769a3c3f7ebe9da8d91ebf0047a5 -r91a5d8f7c8b54588748ae979c9e26ef72207768f --- Ringtoets/Integration/src/Ringtoets.Integration.Forms/Views/AssemblyResultPerSectionView.cs (.../AssemblyResultPerSectionView.cs) (revision 89eba1fca653769a3c3f7ebe9da8d91ebf0047a5) +++ Ringtoets/Integration/src/Ringtoets.Integration.Forms/Views/AssemblyResultPerSectionView.cs (.../AssemblyResultPerSectionView.cs) (revision 91a5d8f7c8b54588748ae979c9e26ef72207768f) @@ -30,6 +30,7 @@ using Ringtoets.Integration.Data.Assembly; using Ringtoets.Integration.Forms.Observers; using Ringtoets.Integration.Forms.Properties; +using RingtoetsCommonFormsResources = Ringtoets.Common.Forms.Properties.Resources; using PipingDataResources = Ringtoets.Piping.Data.Properties.Resources; using GrassCoverErosionInwardsDataResources = Ringtoets.GrassCoverErosionInwards.Data.Properties.Resources; using MacroStabilityInwardsDataResources = Ringtoets.MacroStabilityInwards.Data.Properties.Resources; @@ -86,6 +87,7 @@ base.OnLoad(e); InitializeDataGridView(); + CheckManualAssemblyResults(); dataGridViewControl.CellFormatting += HandleCellStyling; } @@ -106,14 +108,50 @@ if (!refreshAssemblyResultsButton.Enabled) { refreshAssemblyResultsButton.Enabled = true; - warningProvider.SetIconPadding(refreshAssemblyResultsButton, - errorProvider.GetError(refreshAssemblyResultsButton) == string.Empty - ? 4 : 24); + warningProvider.SetError(refreshAssemblyResultsButton, Resources.AssemblyResultView_RefreshAssemblyResultsButton_Warning_Result_is_outdated_Press_Refresh_button_to_recalculate); + + warningProvider.SetIconPadding(refreshAssemblyResultsButton, + string.IsNullOrEmpty(errorProvider.GetError(refreshAssemblyResultsButton)) ? 4 : 24); + CheckManualAssemblyResults(); } } + private void CheckManualAssemblyResults() + { + SetManualAssemblyWarningIconPadding(); + + if (AssessmentSectionHelper.HasManualAssemblyResults(AssessmentSection)) + { + manualAssemblyWarningProvider.SetError(refreshAssemblyResultsButton, + RingtoetsCommonFormsResources.ManualAssemblyWarning_FailureMechanismAssemblyResult_is_based_on_manual_assemblies); + } + } + + private void SetManualAssemblyWarningIconPadding() + { + bool hasError = !string.IsNullOrEmpty(errorProvider.GetError(refreshAssemblyResultsButton)); + bool hasWarning = !string.IsNullOrEmpty(warningProvider.GetError(refreshAssemblyResultsButton)); + + int manualAssemblyWarningPadding; + if (hasError && hasWarning) + { + manualAssemblyWarningPadding = 44; + } + else if (hasError || hasWarning) + { + manualAssemblyWarningPadding = 24; + } + else + { + manualAssemblyWarningPadding = 4; + } + + manualAssemblyWarningProvider.SetIconPadding(refreshAssemblyResultsButton, + manualAssemblyWarningPadding); + } + private void HandleCellStyling(object sender, DataGridViewCellFormattingEventArgs e) { dataGridViewControl.FormatCellWithColumnStateDefinition(e.RowIndex, e.ColumnIndex); @@ -213,12 +251,15 @@ { errorProvider.SetError(refreshAssemblyResultsButton, e.Message); } + + CheckManualAssemblyResults(); } private void ClearCurrentData() { errorProvider.SetError(refreshAssemblyResultsButton, string.Empty); warningProvider.SetError(refreshAssemblyResultsButton, string.Empty); + manualAssemblyWarningProvider.SetError(refreshAssemblyResultsButton, string.Empty); dataGridViewControl.SetDataSource(Enumerable.Empty()); } } Index: Ringtoets/Integration/test/Ringtoets.Integration.Forms.Test/Views/AssemblyResultPerSectionViewTest.cs =================================================================== diff -u -r89eba1fca653769a3c3f7ebe9da8d91ebf0047a5 -r91a5d8f7c8b54588748ae979c9e26ef72207768f --- Ringtoets/Integration/test/Ringtoets.Integration.Forms.Test/Views/AssemblyResultPerSectionViewTest.cs (.../AssemblyResultPerSectionViewTest.cs) (revision 89eba1fca653769a3c3f7ebe9da8d91ebf0047a5) +++ Ringtoets/Integration/test/Ringtoets.Integration.Forms.Test/Views/AssemblyResultPerSectionViewTest.cs (.../AssemblyResultPerSectionViewTest.cs) (revision 91a5d8f7c8b54588748ae979c9e26ef72207768f) @@ -35,11 +35,13 @@ using Ringtoets.AssemblyTool.KernelWrapper.TestUtil.Calculators.Assembly; using Ringtoets.Common.Data.AssessmentSection; using Ringtoets.Common.Data.FailureMechanism; +using Ringtoets.Common.Data.TestUtil; using Ringtoets.HeightStructures.Data.TestUtil; using Ringtoets.Integration.Data; using Ringtoets.Integration.Forms.Views; using Ringtoets.Integration.TestUtil; using Ringtoets.MacroStabilityInwards.Data; +using Ringtoets.Piping.Data; using RingtoetsCommonFormsResources = Ringtoets.Common.Forms.Properties.Resources; namespace Ringtoets.Integration.Forms.Test.Views @@ -70,6 +72,7 @@ private const int technicalInnovationColumnIndex = 20; private const int expectedColumnCount = 21; private const string assemblyResultOutdatedWarning = "Toetsoordeel is verouderd. Druk op de \"Toetsoordeel verversen\" knop om opnieuw te berekenen."; + private const string assemblyResultManualWarning = "Toetsoordeel is (deels) gebaseerd op handmatig overschreven toetsoordelen."; private Form testForm; @@ -420,6 +423,124 @@ } } + [Test] + [TestCase(true)] + [TestCase(false)] + public void GivenFormWithAssemblyResultPerSectionViewWithManualAssembly_ThenExpectedWarningSet(bool hasManualAssembly) + { + // Given + var assessmentSection = new AssessmentSection(new Random(21).NextEnumValue()); + PipingFailureMechanism failureMechanism = assessmentSection.Piping; + FailureMechanismTestHelper.AddSections(failureMechanism, 1); + failureMechanism.SectionResults.Single().UseManualAssemblyProbability = hasManualAssembly; + + // When + using (AssemblyResultPerSectionView view = ShowAssemblyResultPerSectionView(assessmentSection)) + { + // Then + ButtonTester buttonTester = GetRefreshAssemblyResultButtonTester(); + Button button = buttonTester.Properties; + ErrorProvider manualAssemblyWarningProvider = GetManualAssemblyWarningProvider(view); + Assert.AreEqual(hasManualAssembly ? assemblyResultManualWarning : string.Empty, manualAssemblyWarningProvider.GetError(button)); + } + } + + [Test] + [TestCase(true)] + [TestCase(false)] + public void GivenFormWithAssemblyResultPerSectionViewWithManualAssembly_WhenAssessmentSectionNotifiesObservers_ThenWarningsSet( + bool hasManualAssembly) + { + // Given + var assessmentSection = new AssessmentSection(new Random(21).NextEnumValue()); + PipingFailureMechanism failureMechanism = assessmentSection.Piping; + FailureMechanismTestHelper.AddSections(failureMechanism, 1); + failureMechanism.SectionResults.Single().UseManualAssemblyProbability = hasManualAssembly; + + using (AssemblyResultPerSectionView view = ShowAssemblyResultPerSectionView(assessmentSection)) + { + // Precondition + ButtonTester buttonTester = GetRefreshAssemblyResultButtonTester(); + Button button = buttonTester.Properties; + Assert.IsFalse(button.Enabled); + ErrorProvider warningProvider = GetWarningProvider(view); + Assert.IsEmpty(warningProvider.GetError(button)); + ErrorProvider manualAssemblyWarningProvider = GetManualAssemblyWarningProvider(view); + string expectedManualAssemblyWarning = hasManualAssembly ? assemblyResultManualWarning : string.Empty; + Assert.AreEqual(4, manualAssemblyWarningProvider.GetIconPadding(button)); + Assert.AreEqual(expectedManualAssemblyWarning, manualAssemblyWarningProvider.GetError(button)); + + // When + assessmentSection.NotifyObservers(); + + // Then + Assert.AreEqual(assemblyResultOutdatedWarning, warningProvider.GetError(button)); + Assert.AreEqual(expectedManualAssemblyWarning, manualAssemblyWarningProvider.GetError(button)); + Assert.AreEqual(24, manualAssemblyWarningProvider.GetIconPadding(button)); + } + } + + [Test] + public void GivenAssessmentSectionObserversNotified_WhenRefreshingAssemblyResults_ThenWarningPaddingSet() + { + // Given + using (new AssemblyToolCalculatorFactoryConfig()) + using (AssemblyResultPerSectionView view = ShowAssemblyResultPerSectionView()) + { + AssessmentSection assessmentSection = view.AssessmentSection; + PipingFailureMechanism failureMechanism = assessmentSection.Piping; + FailureMechanismTestHelper.AddSections(failureMechanism, 1); + failureMechanism.SectionResults.Single().UseManualAssemblyProbability = true; + assessmentSection.NotifyObservers(); + + // Precondition + ButtonTester buttonTester = GetRefreshAssemblyResultButtonTester(); + Button button = buttonTester.Properties; + ErrorProvider manualAssemblyWarningProvider = GetManualAssemblyWarningProvider(view); + Assert.AreEqual(24, manualAssemblyWarningProvider.GetIconPadding(button)); + + // When + buttonTester.Click(); + + // Then + Assert.AreEqual(4, manualAssemblyWarningProvider.GetIconPadding(button)); + Assert.AreEqual(assemblyResultManualWarning, manualAssemblyWarningProvider.GetError(button)); + } + } + + [Test] + public void GivenAssemblyResultPerSectionViewWithError_WhenNotified_ThenWarningAndPaddingSet() + { + // Given + using (new AssemblyToolCalculatorFactoryConfig()) + { + var calculatorFactory = (TestAssemblyToolCalculatorFactory) AssemblyToolCalculatorFactory.Instance; + AssessmentSectionAssemblyCalculatorStub calculator = calculatorFactory.LastCreatedAssessmentSectionAssemblyCalculator; + calculator.ThrowExceptionOnCalculate = true; + + using (AssemblyResultPerSectionView view = ShowAssemblyResultPerSectionView()) + { + AssessmentSection assessmentSection = view.AssessmentSection; + PipingFailureMechanism failureMechanism = assessmentSection.Piping; + FailureMechanismTestHelper.AddSections(failureMechanism, 1); + failureMechanism.SectionResults.Single().UseManualAssemblyProbability = true; + + // Precondition + ButtonTester buttonTester = GetRefreshAssemblyResultButtonTester(); + Button button = buttonTester.Properties; + ErrorProvider manualAssemblyWarningProvider = GetManualAssemblyWarningProvider(view); + Assert.AreEqual(24, manualAssemblyWarningProvider.GetIconPadding(button)); + + // When + assessmentSection.NotifyObservers(); + + // Then + Assert.AreEqual(44, manualAssemblyWarningProvider.GetIconPadding(button)); + Assert.AreEqual(assemblyResultManualWarning, manualAssemblyWarningProvider.GetError(button)); + } + } + } + private ButtonTester GetRefreshAssemblyResultButtonTester() { return new ButtonTester("refreshAssemblyResultsButton", testForm); @@ -447,6 +568,11 @@ return TypeUtils.GetField(resultControl, "warningProvider"); } + private static ErrorProvider GetManualAssemblyWarningProvider(AssemblyResultPerSectionView resultControl) + { + return TypeUtils.GetField(resultControl, "manualAssemblyWarningProvider"); + } + private AssemblyResultPerSectionView ShowAssemblyResultPerSectionView() { return ShowAssemblyResultPerSectionView(TestDataGenerator.GetAssessmentSectionWithAllFailureMechanismSectionsAndResults(