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