Index: Ringtoets/StabilityStoneCover/src/Ringtoets.StabilityStoneCover.Plugin/StabilityStoneCoverPlugin.cs =================================================================== diff -u -r6b330f8e7c1df6bc70f6de1e4251f69cd6865a81 -rcc5cf56500e72070752f8daa5293d46c2757134e --- Ringtoets/StabilityStoneCover/src/Ringtoets.StabilityStoneCover.Plugin/StabilityStoneCoverPlugin.cs (.../StabilityStoneCoverPlugin.cs) (revision 6b330f8e7c1df6bc70f6de1e4251f69cd6865a81) +++ Ringtoets/StabilityStoneCover/src/Ringtoets.StabilityStoneCover.Plugin/StabilityStoneCoverPlugin.cs (.../StabilityStoneCoverPlugin.cs) (revision cc5cf56500e72070752f8daa5293d46c2757134e) @@ -288,7 +288,7 @@ c.AssessmentSection.FailureMechanismContribution.Norm, c.AssessmentSection.HydraulicBoundaryDatabase), ValidateAllDataAvailableAndGetErrorMessageForCalculationGroup) - .AddPerformAllCalculationsInGroupItem(group, nodeData, CalculateAll) + .AddPerformAllCalculationsInGroupItem(group, nodeData, CalculateAll, ValidateAllDataAvailableAndGetErrorMessageForCalculationGroup) .AddClearAllCalculationOutputInGroupItem(group) .AddSeparator(); Index: Ringtoets/StabilityStoneCover/test/Ringtoets.StabilityStoneCover.Forms.Test/TreeNodeInfos/StabilityStoneCoverWaveConditionsCalculationContextTreeNodeInfoTest.cs =================================================================== diff -u -r6b330f8e7c1df6bc70f6de1e4251f69cd6865a81 -rcc5cf56500e72070752f8daa5293d46c2757134e --- Ringtoets/StabilityStoneCover/test/Ringtoets.StabilityStoneCover.Forms.Test/TreeNodeInfos/StabilityStoneCoverWaveConditionsCalculationContextTreeNodeInfoTest.cs (.../StabilityStoneCoverWaveConditionsCalculationContextTreeNodeInfoTest.cs) (revision 6b330f8e7c1df6bc70f6de1e4251f69cd6865a81) +++ Ringtoets/StabilityStoneCover/test/Ringtoets.StabilityStoneCover.Forms.Test/TreeNodeInfos/StabilityStoneCoverWaveConditionsCalculationContextTreeNodeInfoTest.cs (.../StabilityStoneCoverWaveConditionsCalculationContextTreeNodeInfoTest.cs) (revision cc5cf56500e72070752f8daa5293d46c2757134e) @@ -762,7 +762,7 @@ assessmentSection.Stub(a => a.FailureMechanismContribution).Return( new FailureMechanismContribution(Enumerable.Empty(), 100, 20)); - var calculation = GetValidCalculation(assessmentSection); + var calculation = GetValidCalculation(); calculation.Name = "A"; var context = new StabilityStoneCoverWaveConditionsCalculationContext(calculation, failureMechanism, @@ -991,7 +991,7 @@ } } - private static StabilityStoneCoverWaveConditionsCalculation GetValidCalculation(IAssessmentSection assessmentSection) + private static StabilityStoneCoverWaveConditionsCalculation GetValidCalculation() { var calculation = new StabilityStoneCoverWaveConditionsCalculation { Index: Ringtoets/StabilityStoneCover/test/Ringtoets.StabilityStoneCover.Forms.Test/TreeNodeInfos/StabilityStoneCoverWaveConditionsCalculationGroupContextTreeNodeInfoTest.cs =================================================================== diff -u -rffd18d54d6f2d3b12d414d5f5234e6f598c39962 -rcc5cf56500e72070752f8daa5293d46c2757134e --- Ringtoets/StabilityStoneCover/test/Ringtoets.StabilityStoneCover.Forms.Test/TreeNodeInfos/StabilityStoneCoverWaveConditionsCalculationGroupContextTreeNodeInfoTest.cs (.../StabilityStoneCoverWaveConditionsCalculationGroupContextTreeNodeInfoTest.cs) (revision ffd18d54d6f2d3b12d414d5f5234e6f598c39962) +++ Ringtoets/StabilityStoneCover/test/Ringtoets.StabilityStoneCover.Forms.Test/TreeNodeInfos/StabilityStoneCoverWaveConditionsCalculationGroupContextTreeNodeInfoTest.cs (.../StabilityStoneCoverWaveConditionsCalculationGroupContextTreeNodeInfoTest.cs) (revision cc5cf56500e72070752f8daa5293d46c2757134e) @@ -19,21 +19,32 @@ // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. +using System; using System.Drawing; +using System.IO; using System.Linq; using System.Windows.Forms; using Core.Common.Base; +using Core.Common.Base.Data; +using Core.Common.Base.Geometry; using Core.Common.Controls.TreeView; using Core.Common.Gui; using Core.Common.Gui.Commands; using Core.Common.Gui.ContextMenu; +using Core.Common.Gui.Forms.MainWindow; using Core.Common.Gui.TestUtil.ContextMenu; using Core.Common.TestUtil; using NUnit.Extensions.Forms; using NUnit.Framework; using Rhino.Mocks; using Ringtoets.Common.Data.AssessmentSection; using Ringtoets.Common.Data.Calculation; +using Ringtoets.Common.Data.Contribution; +using Ringtoets.Common.Data.DikeProfiles; +using Ringtoets.Common.Data.FailureMechanism; +using Ringtoets.HydraRing.Calculation.TestUtil; +using Ringtoets.HydraRing.Data; +using Ringtoets.Revetment.Service.TestUtil; using Ringtoets.StabilityStoneCover.Data; using Ringtoets.StabilityStoneCover.Forms.PresentationObjects; using Ringtoets.StabilityStoneCover.Plugin; @@ -395,12 +406,93 @@ // Setup using (var treeViewControl = new TreeViewControl()) { + var failureMechanism = new StabilityStoneCoverFailureMechanism(); + var group = new CalculationGroup(); + failureMechanism.WaveConditionsCalculationGroup.Children.Add(group); var assessmentSection = mocks.Stub(); + var nodeData = new StabilityStoneCoverWaveConditionsCalculationGroupContext(group, + failureMechanism, + assessmentSection); + var parentNodeData = new StabilityStoneCoverWaveConditionsCalculationGroupContext(failureMechanism.WaveConditionsCalculationGroup, + failureMechanism, + assessmentSection); + var menuBuilder = new CustomItemsOnlyContextMenuBuilder(); + + var gui = mocks.Stub(); + gui.Stub(cmp => cmp.Get(nodeData, treeViewControl)).Return(menuBuilder); + + mocks.ReplayAll(); + + plugin.Gui = gui; + + // Call + using (ContextMenuStrip contextMenu = info.ContextMenuStrip(nodeData, parentNodeData, treeViewControl)) + { + // Assert + ToolStripItem validateItem = contextMenu.Items[contextMenuValidateAllIndexNestedGroup]; + ToolStripItem calculateItem = contextMenu.Items[contextMenuCalculateAllIndexNestedGroup]; + Assert.IsFalse(validateItem.Enabled); + Assert.IsFalse(calculateItem.Enabled); + Assert.AreEqual(RingtoetsCommonFormsResources.FailureMechanism_CreateCalculateAllItem_No_calculations_to_run, calculateItem.ToolTipText); + Assert.AreEqual(RingtoetsCommonFormsResources.FailureMechanism_CreateValidateAllItem_No_calculations_to_validate, validateItem.ToolTipText); + } + } + } + + [Test] + public void ContextMenuStrip_FailureMechanismWithNoSections_ValidateAndCalculateAllDisabled() + { + // Setup + using (var treeViewControl = new TreeViewControl()) + { + var failureMechanism = new StabilityStoneCoverFailureMechanism(); var group = new CalculationGroup(); + group.Children.Add(new StabilityStoneCoverWaveConditionsCalculation()); + failureMechanism.WaveConditionsCalculationGroup.Children.Add(group); + var assessmentSection = mocks.Stub(); + var nodeData = new StabilityStoneCoverWaveConditionsCalculationGroupContext(group, + failureMechanism, + assessmentSection); + var parentNodeData = new StabilityStoneCoverWaveConditionsCalculationGroupContext(failureMechanism.WaveConditionsCalculationGroup, + failureMechanism, + assessmentSection); + var menuBuilder = new CustomItemsOnlyContextMenuBuilder(); + + var gui = mocks.Stub(); + gui.Stub(cmp => cmp.Get(nodeData, treeViewControl)).Return(menuBuilder); + + mocks.ReplayAll(); + + plugin.Gui = gui; + + // Call + using (ContextMenuStrip contextMenu = info.ContextMenuStrip(nodeData, parentNodeData, treeViewControl)) + { + // Assert + ToolStripItem validateItem = contextMenu.Items[contextMenuValidateAllIndexNestedGroup]; + ToolStripItem calculateItem = contextMenu.Items[contextMenuCalculateAllIndexNestedGroup]; + Assert.IsFalse(validateItem.Enabled); + Assert.IsFalse(calculateItem.Enabled); + Assert.AreEqual(RingtoetsCommonFormsResources.Plugin_AllDataAvailable_No_failure_mechanism_sections_imported, calculateItem.ToolTipText); + Assert.AreEqual(RingtoetsCommonFormsResources.Plugin_AllDataAvailable_No_failure_mechanism_sections_imported, validateItem.ToolTipText); + } + } + } + + [Test] + public void ContextMenuStrip_AssessmentSectionWithoutHydraulicBoundaryDatabase_ValidateAndCalculateAllDisabled() + { + // Setup + using (var treeViewControl = new TreeViewControl()) + { var failureMechanism = new StabilityStoneCoverFailureMechanism(); + failureMechanism.AddSection(new FailureMechanismSection("", new [] {new Point2D(0,0)})); + var group = new CalculationGroup(); + group.Children.Add(new StabilityStoneCoverWaveConditionsCalculation()); failureMechanism.WaveConditionsCalculationGroup.Children.Add(group); + var assessmentSection = mocks.Stub(); var nodeData = new StabilityStoneCoverWaveConditionsCalculationGroupContext(group, failureMechanism, assessmentSection); @@ -425,13 +517,191 @@ ToolStripItem calculateItem = contextMenu.Items[contextMenuCalculateAllIndexNestedGroup]; Assert.IsFalse(validateItem.Enabled); Assert.IsFalse(calculateItem.Enabled); - Assert.AreEqual(RingtoetsCommonFormsResources.FailureMechanism_CreateCalculateAllItem_No_calculations_to_run, calculateItem.ToolTipText); - Assert.AreEqual(RingtoetsCommonFormsResources.FailureMechanism_CreateValidateAllItem_No_calculations_to_validate, validateItem.ToolTipText); + Assert.AreEqual(RingtoetsCommonFormsResources.Plugin_AllDataAvailable_No_hydraulic_boundary_database_imported, calculateItem.ToolTipText); + Assert.AreEqual(RingtoetsCommonFormsResources.Plugin_AllDataAvailable_No_hydraulic_boundary_database_imported, validateItem.ToolTipText); } } } [Test] + public void ContextMenuStrip_AssessmentSectionWithInvalidHydraulicBoundaryDatabasePath_ValidateAndCalculateAllDisabled() + { + // Setup + using (var treeViewControl = new TreeViewControl()) + { + var failureMechanism = new StabilityStoneCoverFailureMechanism(); + failureMechanism.AddSection(new FailureMechanismSection("", new [] {new Point2D(0,0)})); + var group = new CalculationGroup(); + group.Children.Add(new StabilityStoneCoverWaveConditionsCalculation()); + failureMechanism.WaveConditionsCalculationGroup.Children.Add(group); + var assessmentSection = mocks.Stub(); + assessmentSection.HydraulicBoundaryDatabase = new HydraulicBoundaryDatabase + { + FilePath = "" + }; + var nodeData = new StabilityStoneCoverWaveConditionsCalculationGroupContext(group, + failureMechanism, + assessmentSection); + var parentNodeData = new StabilityStoneCoverWaveConditionsCalculationGroupContext(failureMechanism.WaveConditionsCalculationGroup, + failureMechanism, + assessmentSection); + + var menuBuilder = new CustomItemsOnlyContextMenuBuilder(); + + var gui = mocks.Stub(); + gui.Stub(cmp => cmp.Get(nodeData, treeViewControl)).Return(menuBuilder); + + mocks.ReplayAll(); + + plugin.Gui = gui; + + // Call + using (ContextMenuStrip contextMenu = info.ContextMenuStrip(nodeData, parentNodeData, treeViewControl)) + { + // Assert + ToolStripItem validateItem = contextMenu.Items[contextMenuValidateAllIndexNestedGroup]; + ToolStripItem calculateItem = contextMenu.Items[contextMenuCalculateAllIndexNestedGroup]; + Assert.IsFalse(validateItem.Enabled); + Assert.IsFalse(calculateItem.Enabled); + var message = "Herstellen van de verbinding met de hydraulische randvoorwaardendatabase is mislukt. Fout bij het lezen van bestand '': Bestandspad mag niet leeg of ongedefinieerd zijn."; + Assert.AreEqual(message, calculateItem.ToolTipText); + Assert.AreEqual(message, validateItem.ToolTipText); + } + } + } + + [Test] + public void ContextMenuStrip_TwoCalculationsClickOnValidateAllInGroup_ValidationMessagesLogged() + { + string hrdPath = TestHelper.GetTestDataPath(TestDataPath.Ringtoets.Integration.Service, "HydraRingCalculation"); + + var assessmentSection = mocks.Stub(); + assessmentSection.HydraulicBoundaryDatabase = new HydraulicBoundaryDatabase + { + FilePath = Path.Combine(hrdPath, "HRD ijsselmeer.sqlite") + }; + assessmentSection.Stub(a => a.FailureMechanismContribution).Return( + new FailureMechanismContribution(Enumerable.Empty(), 30, 2)); + + var group = new CalculationGroup(); + group.Children.Add(new StabilityStoneCoverWaveConditionsCalculation()); + group.Children.Add(new StabilityStoneCoverWaveConditionsCalculation()); + + var failureMechanism = new StabilityStoneCoverFailureMechanism(); + failureMechanism.AddSection(new FailureMechanismSection("", new[] { new Point2D(0, 0) })); + failureMechanism.WaveConditionsCalculationGroup.Children.Add(group); + var nodeData = new StabilityStoneCoverWaveConditionsCalculationGroupContext(group, + failureMechanism, + assessmentSection); + var parentNodeData = new StabilityStoneCoverWaveConditionsCalculationGroupContext(failureMechanism.WaveConditionsCalculationGroup, + failureMechanism, + assessmentSection); + + var menuBuilder = new CustomItemsOnlyContextMenuBuilder(); + + // Setup + using (var treeViewControl = new TreeViewControl()) + { + + var gui = mocks.Stub(); + gui.Stub(cmp => cmp.Get(nodeData, treeViewControl)).Return(menuBuilder); + + mocks.ReplayAll(); + + plugin.Gui = gui; + + using (ContextMenuStrip contextMenu = info.ContextMenuStrip(nodeData, parentNodeData, treeViewControl)) + { + // Call + Action test = () => contextMenu.Items[3].PerformClick(); + + // Assert + TestHelper.AssertLogMessages(test, m => + { + var messages = m.ToArray(); + Assert.AreEqual(4, messages.Length); + StringAssert.StartsWith("Validatie van 'Nieuwe berekening' gestart om: ", messages[0]); + StringAssert.StartsWith("Validatie van 'Nieuwe berekening' beëindigd om: ", messages[1]); + StringAssert.StartsWith("Validatie van 'Nieuwe berekening' gestart om: ", messages[2]); + StringAssert.StartsWith("Validatie van 'Nieuwe berekening' beëindigd om: ", messages[3]); + }); + } + } + } + + [Test] + public void ContextMenuStrip_TwoCalculationsClickOnCalculateAllInGroup_MessagesLogged() + { + string hrdPath = TestHelper.GetTestDataPath(TestDataPath.Ringtoets.Integration.Service, "HydraRingCalculation"); + + var assessmentSection = mocks.Stub(); + assessmentSection.HydraulicBoundaryDatabase = new HydraulicBoundaryDatabase + { + FilePath = Path.Combine(hrdPath, "HRD ijsselmeer.sqlite") + }; + assessmentSection.Stub(a => a.FailureMechanismContribution).Return( + new FailureMechanismContribution(Enumerable.Empty(), 30, 2)); + assessmentSection.Stub(a => a.Id).Return("someId"); + + var group = new CalculationGroup(); + group.Children.Add(GetValidCalculation()); + group.Children.Add(GetValidCalculation()); + + var failureMechanism = new StabilityStoneCoverFailureMechanism(); + failureMechanism.AddSection(new FailureMechanismSection("", new[] { new Point2D(0, 0) })); + failureMechanism.WaveConditionsCalculationGroup.Children.Add(group); + var nodeData = new StabilityStoneCoverWaveConditionsCalculationGroupContext(group, + failureMechanism, + assessmentSection); + var parentNodeData = new StabilityStoneCoverWaveConditionsCalculationGroupContext(failureMechanism.WaveConditionsCalculationGroup, + failureMechanism, + assessmentSection); + + var menuBuilder = new CustomItemsOnlyContextMenuBuilder(); + + DialogBoxHandler = (name, wnd) => + { + // Expect an activity dialog which is automatically closed + }; + + // Setup + using (var treeViewControl = new TreeViewControl()) + { + + var mainWindow = mocks.Stub(); + + var gui = mocks.Stub(); + gui.Stub(cmp => cmp.Get(nodeData, treeViewControl)).Return(menuBuilder); + gui.Stub(g => g.MainWindow).Return(mainWindow); + + mocks.ReplayAll(); + + plugin.Gui = gui; + + using (new HydraRingCalculationServiceConfig()) + using (new WaveConditionsCalculationServiceConfig()) + using (ContextMenuStrip contextMenu = info.ContextMenuStrip(nodeData, parentNodeData, treeViewControl)) + { + // Call + Action test = () => contextMenu.Items[4].PerformClick(); + + // Assert + TestHelper.AssertLogMessages(test, m => + { + var messages = m.ToArray(); + Assert.AreEqual(30, messages.Length); + StringAssert.StartsWith("Berekening van 'Nieuwe berekening' gestart om: ", messages[0]); + StringAssert.StartsWith("Berekening van 'Nieuwe berekening' beëindigd om: ", messages[13]); + StringAssert.StartsWith("Berekening van 'Nieuwe berekening' gestart om: ", messages[14]); + StringAssert.StartsWith("Berekening van 'Nieuwe berekening' beëindigd om: ", messages[27]); + Assert.AreEqual("Uitvoeren van 'Nieuwe berekening' is gelukt.", messages[28]); + Assert.AreEqual("Uitvoeren van 'Nieuwe berekening' is gelukt.", messages[29]); + }); + } + } + } + + [Test] public void ContextMenuStrip_WithoutParentNodeWithNoChildren_RemoveAllChildrenDisabled() { // Setup @@ -556,7 +826,7 @@ } [Test] - public void ContextMenuStrip_ClickOnRemoveAllInGroup_RemovesAllChildren() + public void ContextMenuStrip_ClickOnRemoveAllInGroupAndConfirm_RemovesAllChildren() { // Setup using (var treeViewControl = new TreeViewControl()) @@ -599,6 +869,48 @@ } [Test] + public void ContextMenuStrip_ClickOnRemoveAllInGroupAndCancel_ChildrenNotRemoved() + { + // Setup + using (var treeViewControl = new TreeViewControl()) + { + var assessmentSection = mocks.Stub(); + var calculation = mocks.Stub(); + var failureMechanism = new StabilityStoneCoverFailureMechanism(); + failureMechanism.WaveConditionsCalculationGroup.Children.Add(calculation); + var nodeData = new StabilityStoneCoverWaveConditionsCalculationGroupContext(failureMechanism.WaveConditionsCalculationGroup, + failureMechanism, + assessmentSection); + + var menuBuilder = new CustomItemsOnlyContextMenuBuilder(); + var viewCommandsMock = mocks.StrictMock(); + + var gui = mocks.Stub(); + gui.Stub(cmp => cmp.Get(nodeData, treeViewControl)).Return(menuBuilder); + gui.Stub(cmp => cmp.ViewCommands).Return(viewCommandsMock); + + mocks.ReplayAll(); + + plugin.Gui = gui; + + DialogBoxHandler = (name, wnd) => + { + var dialog = new MessageBoxTester(wnd); + dialog.ClickCancel(); + }; + + using (ContextMenuStrip contextMenu = info.ContextMenuStrip(nodeData, null, treeViewControl)) + { + // Call + contextMenu.Items[contextMenuRemoveAllChildrenIndexRootGroup].PerformClick(); + + // Assert + Assert.AreEqual(new [] { calculation }, failureMechanism.WaveConditionsCalculationGroup.Children); + } + } + } + + [Test] public void OnNodeRemoved_ParentIsPipingCalculationGroupContainingGroup_RemoveGroupAndNotifyObservers() { // Setup @@ -731,5 +1043,38 @@ } } } + + private static StabilityStoneCoverWaveConditionsCalculation GetValidCalculation() + { + var calculation = new StabilityStoneCoverWaveConditionsCalculation + { + InputParameters = + { + HydraulicBoundaryLocation = new HydraulicBoundaryLocation(1300001, "", 0.0, 0.0), + ForeshoreProfile = CreateForeshoreProfile(), + UseForeshore = true, + UseBreakWater = true, + StepSize = (RoundedDouble)0.5, + LowerBoundaryRevetment = (RoundedDouble)4, + UpperBoundaryRevetment = (RoundedDouble)10, + UpperBoundaryWaterLevels = (RoundedDouble)8, + LowerBoundaryWaterLevels = (RoundedDouble)7.1 + } + }; + calculation.InputParameters.HydraulicBoundaryLocation.DesignWaterLevel = (RoundedDouble)9.3; + return calculation; + } + + private static ForeshoreProfile CreateForeshoreProfile() + { + return new ForeshoreProfile(new Point2D(0, 0), + new[] + { + new Point2D(3.3, 4.4), + new Point2D(5.5, 6.6) + }, + new BreakWater(BreakWaterType.Dam, 10.0), + new ForeshoreProfile.ConstructionProperties()); + } } } \ No newline at end of file