Index: Ringtoets/DuneErosion/src/Ringtoets.DuneErosion.Plugin/DuneErosionPlugin.cs =================================================================== diff -u -ra6446f4410e56fb44c754aa1ce1d204d43c301f0 -rf6159b772668c5564d585d15a86bd8c3632f711c --- Ringtoets/DuneErosion/src/Ringtoets.DuneErosion.Plugin/DuneErosionPlugin.cs (.../DuneErosionPlugin.cs) (revision a6446f4410e56fb44c754aa1ce1d204d43c301f0) +++ Ringtoets/DuneErosion/src/Ringtoets.DuneErosion.Plugin/DuneErosionPlugin.cs (.../DuneErosionPlugin.cs) (revision f6159b772668c5564d585d15a86bd8c3632f711c) @@ -31,6 +31,7 @@ using Ringtoets.Common.Data.AssessmentSection; using Ringtoets.Common.Forms.PresentationObjects; using Ringtoets.Common.Forms.TreeNodeInfos; +using Ringtoets.Common.Service; using Ringtoets.DuneErosion.Data; using Ringtoets.DuneErosion.Forms; using Ringtoets.DuneErosion.Forms.GuiServices; @@ -237,17 +238,26 @@ #region DuneLocationsContext TreeNodeInfo - private ContextMenuStrip DuneLocationsContextMenuStrip(DuneLocationsContext context, object parent, TreeViewControl treeViewControl) + private static string ValidateAllDataAvailableAndGetErrorMessage(IAssessmentSection assessmentSection, DuneErosionFailureMechanism failureMechanism) { - bool locationsAvailable = context.FailureMechanism.DuneLocations.Any(); + if (!failureMechanism.DuneLocations.Any()) + { + return Resources.DuneErosionPlugin_DuneLocationsContextMenuStrip_Calculate_all_ToolTip_no_locations; + } - string toolTip = locationsAvailable - ? Resources.DuneErosionPlugin_DuneLocationsContextMenuStrip_Calculate_all_ToolTip - : Resources.DuneErosionPlugin_DuneLocationsContextMenuStrip_Calculate_all_ToolTip_no_locations; + if (failureMechanism.Contribution <= 0.0) + { + return RingtoetsCommonFormsResources.Contribution_of_failure_mechanism_zero; + } + return HydraulicBoundaryDatabaseConnectionValidator.Validate(assessmentSection.HydraulicBoundaryDatabase); + } + + private ContextMenuStrip DuneLocationsContextMenuStrip(DuneLocationsContext context, object parent, TreeViewControl treeViewControl) + { var calculateAllItem = new StrictContextMenuItem( RingtoetsCommonFormsResources.Calculate_all, - toolTip, + Resources.DuneErosionPlugin_DuneLocationsContextMenuStrip_Calculate_all_ToolTip, RingtoetsCommonFormsResources.CalculateAllIcon, (sender, args) => { @@ -262,10 +272,14 @@ context.AssessmentSection.Id, context.FailureMechanism.GetMechanismSpecificNorm(context.AssessmentSection.FailureMechanismContribution.Norm)); context.NotifyObservers(); - }) + }); + + var validationText = ValidateAllDataAvailableAndGetErrorMessage(context.AssessmentSection, context.FailureMechanism); + if (!string.IsNullOrEmpty(validationText)) { - Enabled = locationsAvailable - }; + calculateAllItem.Enabled = false; + calculateAllItem.ToolTipText = validationText; + } return Gui.Get(context, treeViewControl) .AddOpenItem() Index: Ringtoets/DuneErosion/src/Ringtoets.DuneErosion.Plugin/Ringtoets.DuneErosion.Plugin.csproj =================================================================== diff -u -r7cc1fd960a912443ccc3c6995eccb5673d1d8d22 -rf6159b772668c5564d585d15a86bd8c3632f711c --- Ringtoets/DuneErosion/src/Ringtoets.DuneErosion.Plugin/Ringtoets.DuneErosion.Plugin.csproj (.../Ringtoets.DuneErosion.Plugin.csproj) (revision 7cc1fd960a912443ccc3c6995eccb5673d1d8d22) +++ Ringtoets/DuneErosion/src/Ringtoets.DuneErosion.Plugin/Ringtoets.DuneErosion.Plugin.csproj (.../Ringtoets.DuneErosion.Plugin.csproj) (revision f6159b772668c5564d585d15a86bd8c3632f711c) @@ -92,6 +92,10 @@ Ringtoets.Common.Forms False + + {D951D6DA-FE83-4920-9FDB-63BF96480B54} + Ringtoets.Common.Service + {D1068432-C172-4AA6-847B-D9DEB4C6DE26} Ringtoets.DuneErosion.Data Index: Ringtoets/DuneErosion/test/Ringtoets.DuneErosion.Plugin.Test/TreeNodeInfos/DuneLocationsContextTreeNodeInfoTest.cs =================================================================== diff -u -rc9bd6bb2616d76ccae091516fbd2f5b575aafdfa -rf6159b772668c5564d585d15a86bd8c3632f711c --- Ringtoets/DuneErosion/test/Ringtoets.DuneErosion.Plugin.Test/TreeNodeInfos/DuneLocationsContextTreeNodeInfoTest.cs (.../DuneLocationsContextTreeNodeInfoTest.cs) (revision c9bd6bb2616d76ccae091516fbd2f5b575aafdfa) +++ Ringtoets/DuneErosion/test/Ringtoets.DuneErosion.Plugin.Test/TreeNodeInfos/DuneLocationsContextTreeNodeInfoTest.cs (.../DuneLocationsContextTreeNodeInfoTest.cs) (revision f6159b772668c5564d585d15a86bd8c3632f711c) @@ -203,15 +203,19 @@ } [Test] - [TestCase(true)] - [TestCase(false)] - public void ContextMenuStrip_Always_AddCustomItem(bool hasDuneLocations) + public void ContextMenuStrip_HydraulicBoundaryDatabaseNotValid_ContextMenuItemCalculateAllDisabledAndTooltipSet() { // Setup using (var treeViewControl = new TreeViewControl()) { + var hydraulicBoundaryDatabase = new HydraulicBoundaryDatabase(); + var assessmentSectionMock = mocks.StrictMock(); - var failureMechanism = new DuneErosionFailureMechanism(); + assessmentSectionMock.Stub(asm => asm.HydraulicBoundaryDatabase).Return(hydraulicBoundaryDatabase); + var failureMechanism = new DuneErosionFailureMechanism + { + Contribution = 10 + }; var context = new DuneLocationsContext(failureMechanism.DuneLocations, failureMechanism, assessmentSectionMock); var builder = new CustomItemsOnlyContextMenuBuilder(); @@ -222,31 +226,152 @@ plugin.Gui = gui; - if (hasDuneLocations) + failureMechanism.DuneLocations.Add(new TestDuneLocation()); + + // Call + using (ContextMenuStrip menu = info.ContextMenuStrip(context, null, treeViewControl)) { - failureMechanism.DuneLocations.Add(new TestDuneLocation()); + // Assert + ToolStripItem contextMenuItem = menu.Items[contextMenuCalculateAllIndex]; + + Assert.AreEqual("Alles be&rekenen", contextMenuItem.Text); + StringAssert.Contains("Herstellen van de verbinding met de hydraulische randvoorwaardendatabase is mislukt.", contextMenuItem.ToolTipText); + TestHelper.AssertImagesAreEqual(RingtoetsCommonFormsResources.CalculateAllIcon, contextMenuItem.Image); + Assert.IsFalse(contextMenuItem.Enabled); } + } + } + [Test] + public void ContextMenuStrip_NoDuneLocations_ContextMenuItemCalculateAllDisabledAndTooltipSet() + { + // Setup + string validFilePath = Path.Combine(testDataPath, "complete.sqlite"); + + using (var treeViewControl = new TreeViewControl()) + { + var hydraulicBoundaryDatabase = new HydraulicBoundaryDatabase + { + FilePath = validFilePath, + Version = "1.0" + }; + + var assessmentSectionMock = mocks.StrictMock(); + assessmentSectionMock.Stub(asm => asm.HydraulicBoundaryDatabase).Return(hydraulicBoundaryDatabase); + var failureMechanism = new DuneErosionFailureMechanism + { + Contribution = 10 + }; + var context = new DuneLocationsContext(failureMechanism.DuneLocations, failureMechanism, assessmentSectionMock); + + var builder = new CustomItemsOnlyContextMenuBuilder(); + + var gui = mocks.StrictMock(); + gui.Expect(cmp => cmp.Get(context, treeViewControl)).Return(builder); + mocks.ReplayAll(); + + plugin.Gui = gui; + // Call using (ContextMenuStrip menu = info.ContextMenuStrip(context, null, treeViewControl)) { // Assert - Assert.AreEqual(7, menu.Items.Count); + TestHelper.AssertContextMenuStripContainsItem(menu, contextMenuCalculateAllIndex, + "Alles be&rekenen", + "Er zijn geen locaties om een berekening voor uit te voeren.", + RingtoetsCommonFormsResources.CalculateAllIcon, + false); + } + } + } - var expectedMessage = hasDuneLocations - ? "Alle hydraulische randvoorwaarden berekenen." - : "Er zijn geen locaties om een berekening voor uit te voeren."; + [Test] + public void ContextMenuStrip_FailureMechanismContributionZero_ContextMenuItemCalculateAllDisabledAndTooltipSet() + { + // Setup + string validFilePath = Path.Combine(testDataPath, "complete.sqlite"); + using (var treeViewControl = new TreeViewControl()) + { + var hydraulicBoundaryDatabase = new HydraulicBoundaryDatabase + { + FilePath = validFilePath, + Version = "1.0" + }; + + var assessmentSectionMock = mocks.StrictMock(); + assessmentSectionMock.Stub(asm => asm.HydraulicBoundaryDatabase).Return(hydraulicBoundaryDatabase); + var failureMechanism = new DuneErosionFailureMechanism(); + var context = new DuneLocationsContext(failureMechanism.DuneLocations, failureMechanism, assessmentSectionMock); + + var builder = new CustomItemsOnlyContextMenuBuilder(); + + var gui = mocks.StrictMock(); + gui.Expect(cmp => cmp.Get(context, treeViewControl)).Return(builder); + mocks.ReplayAll(); + + plugin.Gui = gui; + + failureMechanism.DuneLocations.Add(new TestDuneLocation()); + + // Call + using (ContextMenuStrip menu = info.ContextMenuStrip(context, null, treeViewControl)) + { + // Assert TestHelper.AssertContextMenuStripContainsItem(menu, contextMenuCalculateAllIndex, "Alles be&rekenen", - expectedMessage, + "De bijdrage van dit toetsspoor is nul.", RingtoetsCommonFormsResources.CalculateAllIcon, - hasDuneLocations); + false); } } } [Test] + public void ContextMenuStrip_AllRequiredInputSet_ContextMenuItemCalculateAllEnabled() + { + // Setup + string validFilePath = Path.Combine(testDataPath, "complete.sqlite"); + + using (var treeViewControl = new TreeViewControl()) + { + var hydraulicBoundaryDatabase = new HydraulicBoundaryDatabase + { + FilePath = validFilePath, + Version = "1.0" + }; + + var assessmentSectionMock = mocks.StrictMock(); + assessmentSectionMock.Stub(asm => asm.HydraulicBoundaryDatabase).Return(hydraulicBoundaryDatabase); + var failureMechanism = new DuneErosionFailureMechanism + { + Contribution = 10 + }; + var context = new DuneLocationsContext(failureMechanism.DuneLocations, failureMechanism, assessmentSectionMock); + + var builder = new CustomItemsOnlyContextMenuBuilder(); + + var gui = mocks.StrictMock(); + gui.Expect(cmp => cmp.Get(context, treeViewControl)).Return(builder); + mocks.ReplayAll(); + + plugin.Gui = gui; + + failureMechanism.DuneLocations.Add(new TestDuneLocation()); + + // Call + using (ContextMenuStrip menu = info.ContextMenuStrip(context, null, treeViewControl)) + { + // Assert + TestHelper.AssertContextMenuStripContainsItem(menu, contextMenuCalculateAllIndex, + "Alles be&rekenen", + "Alle hydraulische randvoorwaarden berekenen.", + RingtoetsCommonFormsResources.CalculateAllIcon); + } + } + } + + [Test] public void ContextMenuStrip_ClickOnCalculateAllItem_ScheduleAllLocationsAndNotifyObservers() { // Setup