Index: Ringtoets/Common/src/Ringtoets.Common.Forms/TreeNodeInfos/RingtoetsContextMenuItemFactory.cs =================================================================== diff -u -r37fdad457c3ca89b8d5483bf2796b1ccb11ffdd5 -r4d9751a5458228080891025ab500ae7f2ef8301f --- Ringtoets/Common/src/Ringtoets.Common.Forms/TreeNodeInfos/RingtoetsContextMenuItemFactory.cs (.../RingtoetsContextMenuItemFactory.cs) (revision 37fdad457c3ca89b8d5483bf2796b1ccb11ffdd5) +++ Ringtoets/Common/src/Ringtoets.Common.Forms/TreeNodeInfos/RingtoetsContextMenuItemFactory.cs (.../RingtoetsContextMenuItemFactory.cs) (revision 4d9751a5458228080891025ab500ae7f2ef8301f) @@ -122,7 +122,7 @@ { return performAllItem; } - + if (!calculationGroup.GetCalculations().Any()) { performAllItem.Enabled = false; @@ -256,7 +256,7 @@ return; } - foreach (var calc in failureMechanism.Calculations) + foreach (var calc in failureMechanism.Calculations.Where(c => c.HasOutput)) { calc.ClearOutput(); calc.NotifyObservers(); Index: Ringtoets/Common/test/Ringtoets.Common.Forms.Test/TreeNodeInfos/RingtoetsContextMenuBuilderTest.cs =================================================================== diff -u -r37fdad457c3ca89b8d5483bf2796b1ccb11ffdd5 -r4d9751a5458228080891025ab500ae7f2ef8301f --- Ringtoets/Common/test/Ringtoets.Common.Forms.Test/TreeNodeInfos/RingtoetsContextMenuBuilderTest.cs (.../RingtoetsContextMenuBuilderTest.cs) (revision 37fdad457c3ca89b8d5483bf2796b1ccb11ffdd5) +++ Ringtoets/Common/test/Ringtoets.Common.Forms.Test/TreeNodeInfos/RingtoetsContextMenuBuilderTest.cs (.../RingtoetsContextMenuBuilderTest.cs) (revision 4d9751a5458228080891025ab500ae7f2ef8301f) @@ -19,6 +19,7 @@ // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. +using System.Linq; using System.Windows.Forms; using Core.Common.Base; using Core.Common.Controls.TreeView; @@ -124,7 +125,7 @@ calculationWithOutputMock } }; - + var contextMenuBuilder = new ContextMenuBuilder(applicationFeatureCommandsMock, exportImportHandlerMock, viewCommandsMock, calculationGroup, treeViewControlMock); var ringtoetsContextMenuBuilder = new RingtoetsContextMenuBuilder(contextMenuBuilder); @@ -176,6 +177,74 @@ } [Test] + public void AddClearAllCalculationOutputInFailureMechanismItem_WhenBuildWithCalculationOutput_ItemAddedToContextMenuEnabled() + { + // Setup + var mocks = new MockRepository(); + var applicationFeatureCommandsMock = mocks.StrictMock(); + var exportImportHandlerMock = mocks.StrictMock(); + var viewCommandsMock = mocks.StrictMock(); + var treeViewControlMock = mocks.StrictMock(); + var calculationWithOutputMock = mocks.StrictMock(); + calculationWithOutputMock.Expect(c => c.HasOutput).Return(true); + var failureMechanismMock = mocks.StrictMock(); + failureMechanismMock.Expect(fm => fm.Calculations).Return(new[] + { + calculationWithOutputMock + }); + mocks.ReplayAll(); + + var contextMenuBuilder = new ContextMenuBuilder(applicationFeatureCommandsMock, exportImportHandlerMock, viewCommandsMock, failureMechanismMock, treeViewControlMock); + var ringtoetsContextMenuBuilder = new RingtoetsContextMenuBuilder(contextMenuBuilder); + + // Call + var result = ringtoetsContextMenuBuilder.AddClearAllCalculationOutputInFailureMechanismItem(failureMechanismMock).Build(); + + // Assert + Assert.IsInstanceOf(result); + Assert.AreEqual(1, result.Items.Count); + + TestHelper.AssertContextMenuStripContainsItem(result, 0, + RingtoetsFormsResources.Clear_all_output, + RingtoetsFormsResources.Clear_all_output_ToolTip, + RingtoetsFormsResources.ClearIcon); + + mocks.VerifyAll(); + } + + [Test] + public void AddClearAllCalculationOutputInFailureMechanismItem_WhenBuildWithoutCalculationOutput_ItemAddedToContextMenuDisabled() + { + // Setup + var mocks = new MockRepository(); + var applicationFeatureCommandsMock = mocks.StrictMock(); + var exportImportHandlerMock = mocks.StrictMock(); + var viewCommandsMock = mocks.StrictMock(); + var treeViewControlMock = mocks.StrictMock(); + var failureMechanismMock = mocks.StrictMock(); + failureMechanismMock.Expect(fm => fm.Calculations).Return(Enumerable.Empty()); + mocks.ReplayAll(); + + var contextMenuBuilder = new ContextMenuBuilder(applicationFeatureCommandsMock, exportImportHandlerMock, viewCommandsMock, failureMechanismMock, treeViewControlMock); + var ringtoetsContextMenuBuilder = new RingtoetsContextMenuBuilder(contextMenuBuilder); + + // Call + var result = ringtoetsContextMenuBuilder.AddClearAllCalculationOutputInFailureMechanismItem(failureMechanismMock).Build(); + + // Assert + Assert.IsInstanceOf(result); + Assert.AreEqual(1, result.Items.Count); + + TestHelper.AssertContextMenuStripContainsItem(result, 0, + RingtoetsFormsResources.Clear_all_output, + RingtoetsFormsResources.CalculationGroup_ClearOutput_No_calculation_with_output_to_clear, + RingtoetsFormsResources.ClearIcon, + false); + + mocks.VerifyAll(); + } + + [Test] public void AddPerformAllCalculationsInGroupItem_WhenBuildWithCalculation_ItemAddedToContextMenuEnabled() { // Setup @@ -250,6 +319,73 @@ } [Test] + public void AddPerformAllCalculationsInFailureMechanismItem_WhenBuildWithCalculation_ItemAddedToContextMenuEnabled() + { + // Setup + var mocks = new MockRepository(); + var applicationFeatureCommandsMock = mocks.StrictMock(); + var exportImportHandlerMock = mocks.StrictMock(); + var viewCommandsMock = mocks.StrictMock(); + var treeViewControlMock = mocks.StrictMock(); + var failureMechanismMock = mocks.StrictMock(); + failureMechanismMock.Expect(fm => fm.Calculations).Return(new[] + { + new TestCalculation() + }); + var failureMechanismContextMock = mocks.StrictMock>(); + failureMechanismContextMock.Expect(fmc => fmc.WrappedData).Return(failureMechanismMock); + mocks.ReplayAll(); + + var contextMenuBuilder = new ContextMenuBuilder(applicationFeatureCommandsMock, exportImportHandlerMock, viewCommandsMock, failureMechanismContextMock, treeViewControlMock); + var ringtoetsContextMenuBuilder = new RingtoetsContextMenuBuilder(contextMenuBuilder); + + // Call + var result = ringtoetsContextMenuBuilder.AddPerformAllCalculationsInFailureMechanismItem(failureMechanismContextMock, null).Build(); + + // Assert + Assert.IsInstanceOf(result); + Assert.AreEqual(1, result.Items.Count); + TestHelper.AssertContextMenuStripContainsItem(result, 0, + RingtoetsFormsResources.Calculate_all, + RingtoetsFormsResources.Calculate_all_ToolTip, + RingtoetsFormsResources.CalculateAllIcon); + + mocks.VerifyAll(); + } + + [Test] + public void AddPerformAllCalculationsInFailureMechanismItem_WhenBuildWithoutCalculation_ItemAddedToContextMenuDisabled() + { + // Setup + var mocks = new MockRepository(); + var applicationFeatureCommandsMock = mocks.StrictMock(); + var exportImportHandlerMock = mocks.StrictMock(); + var viewCommandsMock = mocks.StrictMock(); + var treeViewControlMock = mocks.StrictMock(); + var failureMechanismContextMock = mocks.StrictMock>(); + var failureMechanismMock = mocks.StrictMock(); + failureMechanismContextMock.Expect(fmc => fmc.WrappedData).Return(failureMechanismMock); + failureMechanismMock.Expect(fm => fm.Calculations).Return(Enumerable.Empty()); + mocks.ReplayAll(); + + var contextMenuBuilder = new ContextMenuBuilder(applicationFeatureCommandsMock, exportImportHandlerMock, viewCommandsMock, failureMechanismContextMock, treeViewControlMock); + var ringtoetsContextMenuBuilder = new RingtoetsContextMenuBuilder(contextMenuBuilder); + + // Call + var result = ringtoetsContextMenuBuilder.AddPerformAllCalculationsInFailureMechanismItem(failureMechanismContextMock, null).Build(); + + // Assert + Assert.IsInstanceOf(result); + Assert.AreEqual(1, result.Items.Count); + TestHelper.AssertContextMenuStripContainsItem(result, 0, + RingtoetsFormsResources.Calculate_all, + RingtoetsFormsResources.FailureMechanism_CreateCalculateAllItem_No_calculations_to_run, + RingtoetsFormsResources.CalculateAllIcon, false); + + mocks.VerifyAll(); + } + + [Test] public void AddPerformCalculationItem_WhenBuildWithAllValidData_ItemAddedToContextMenuEnabled() { // Setup @@ -682,9 +818,9 @@ } } - public void ClearOutput() { } + public void ClearOutput() {} - public void ClearHydraulicBoundaryLocation() { } + public void ClearHydraulicBoundaryLocation() {} public ICalculationInput GetObservableInput() { @@ -699,4 +835,4 @@ # endregion } -} +} \ No newline at end of file Index: Ringtoets/Common/test/Ringtoets.Common.Forms.Test/TreeNodeInfos/RingtoetsContextMenuItemFactoryTest.cs =================================================================== diff -u -r37fdad457c3ca89b8d5483bf2796b1ccb11ffdd5 -r4d9751a5458228080891025ab500ae7f2ef8301f --- Ringtoets/Common/test/Ringtoets.Common.Forms.Test/TreeNodeInfos/RingtoetsContextMenuItemFactoryTest.cs (.../RingtoetsContextMenuItemFactoryTest.cs) (revision 37fdad457c3ca89b8d5483bf2796b1ccb11ffdd5) +++ Ringtoets/Common/test/Ringtoets.Common.Forms.Test/TreeNodeInfos/RingtoetsContextMenuItemFactoryTest.cs (.../RingtoetsContextMenuItemFactoryTest.cs) (revision 4d9751a5458228080891025ab500ae7f2ef8301f) @@ -19,11 +19,14 @@ // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. +using System.Collections.Generic; +using System.Linq; using Core.Common.Base; 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.FailureMechanism; using Ringtoets.Common.Forms.PresentationObjects; @@ -37,14 +40,6 @@ [TestFixture] public class RingtoetsContextMenuItemFactoryTest : NUnitFormTest { - private RingtoetsContextMenuItemFactory factory; - - [TestFixtureSetUp] - public void TestFixtureSetUp() - { - factory = new RingtoetsContextMenuItemFactory(); - } - [Test] public void CreateAddCalculationGroupItem_Always_CreatesDecoratedItem() { @@ -303,6 +298,141 @@ } [Test] + public void CreateClearAllCalculationOutputInFailureMechanismItem_FailureMechanismWithCalculationOutput_CreatesDecoratedAndEnabledItem() + { + // Setup + var mocks = new MockRepository(); + var calculationWithOutputMock = mocks.StrictMock(); + calculationWithOutputMock.Expect(c => c.HasOutput).Return(true); + var failureMechanismMock = mocks.StrictMock(); + failureMechanismMock.Expect(fm => fm.Calculations).Return(new[] + { + calculationWithOutputMock + }); + + mocks.ReplayAll(); + + // Call + var toolStripItem = RingtoetsContextMenuItemFactory.CreateClearAllCalculationOutputInFailureMechanismItem(failureMechanismMock); + + // Assert + Assert.AreEqual(RingtoetsFormsResources.Clear_all_output, toolStripItem.Text); + Assert.AreEqual(RingtoetsFormsResources.Clear_all_output_ToolTip, toolStripItem.ToolTipText); + TestHelper.AssertImagesAreEqual(RingtoetsFormsResources.ClearIcon, toolStripItem.Image); + Assert.IsTrue(toolStripItem.Enabled); + + mocks.VerifyAll(); + } + + [Test] + public void CreateClearAllCalculationOutputInFailureMechanismItem_FailureMechanismWithoutCalculationOutput_CreatesDecoratedAndDisabledItem() + { + // Setup + var mocks = new MockRepository(); + var calculationWithoutOutputMock = mocks.StrictMock(); + calculationWithoutOutputMock.Expect(c => c.HasOutput).Return(false); + var failureMechanismMock = mocks.StrictMock(); + failureMechanismMock.Expect(fm => fm.Calculations).Return(new[] + { + calculationWithoutOutputMock + }); + mocks.ReplayAll(); + + // Call + var toolStripItem = RingtoetsContextMenuItemFactory.CreateClearAllCalculationOutputInFailureMechanismItem(failureMechanismMock); + + // Assert + Assert.AreEqual(RingtoetsFormsResources.Clear_all_output, toolStripItem.Text); + Assert.AreEqual(RingtoetsFormsResources.CalculationGroup_ClearOutput_No_calculation_with_output_to_clear, toolStripItem.ToolTipText); + TestHelper.AssertImagesAreEqual(RingtoetsFormsResources.ClearIcon, toolStripItem.Image); + Assert.IsFalse(toolStripItem.Enabled); + + mocks.VerifyAll(); + } + + [Test] + public void CreateClearAllCalculationOutputInFailureMechanismItem_PerformClickOnCreatedItemAndConfirmChange_CalculationOutputClearedAndObserversNotified() + { + // Setup + var mocks = new MockRepository(); + var calculationWithOutputMock1 = mocks.StrictMock(); + var calculationWithOutputMock2 = mocks.StrictMock(); + var calculationWithoutOutputMock = mocks.StrictMock(); + + calculationWithOutputMock1.Stub(c => c.HasOutput).Return(true); + calculationWithOutputMock2.Stub(c => c.HasOutput).Return(true); + calculationWithoutOutputMock.Stub(c => c.HasOutput).Return(false); + + calculationWithOutputMock1.Expect(c => c.ClearOutput()); + calculationWithOutputMock1.Expect(c => c.NotifyObservers()); + calculationWithOutputMock2.Expect(c => c.ClearOutput()); + calculationWithOutputMock2.Expect(c => c.NotifyObservers()); + + var failureMechanism = new TestFailureMechanism(new[] + { + calculationWithOutputMock1, + calculationWithOutputMock2, + calculationWithoutOutputMock + }); + + mocks.ReplayAll(); + + DialogBoxHandler = (name, wnd) => + { + var messageBox = new MessageBoxTester(wnd); + + messageBox.ClickOk(); + }; + + var toolStripItem = RingtoetsContextMenuItemFactory.CreateClearAllCalculationOutputInFailureMechanismItem(failureMechanism); + + // Call + toolStripItem.PerformClick(); + + // Assert + mocks.VerifyAll(); + } + + [Test] + public void CreateClearAllCalculationOutputInFailureMechanismItem_PerformClickOnCreatedItemAndCancelChangee_CalculationOutputNotCleared() + { + // Setup + var mocks = new MockRepository(); + var calculationWithOutputMock1 = mocks.StrictMock(); + var calculationWithOutputMock2 = mocks.StrictMock(); + var calculationWithoutOutputMock = mocks.StrictMock(); + + calculationWithOutputMock1.Stub(c => c.HasOutput).Return(true); + calculationWithOutputMock2.Stub(c => c.HasOutput).Return(true); + calculationWithoutOutputMock.Stub(c => c.HasOutput).Return(false); + + var failureMechanismMock = mocks.StrictMock(); + failureMechanismMock.Expect(fm => fm.Calculations).Return(new[] + { + calculationWithOutputMock1, + calculationWithOutputMock2, + calculationWithoutOutputMock + }); + + mocks.ReplayAll(); + + DialogBoxHandler = (name, wnd) => + { + var messageBox = new MessageBoxTester(wnd); + + messageBox.ClickCancel(); + }; + + var toolStripItem = RingtoetsContextMenuItemFactory.CreateClearAllCalculationOutputInFailureMechanismItem(failureMechanismMock); + + // Call + toolStripItem.PerformClick(); + + // Assert + mocks.VerifyAll(); + } + + [Test] public void CreatePerformAllCalculationsInGroupItem_GroupWithCalculations_CreatesDecoratedAndEnabledItem() { // Setup @@ -452,6 +582,79 @@ } [Test] + public void CreatePerformAllCalculationsInFailureMechanismItemItem_FailureMechanismItemWithCalculations_CreatesDecoratedAndEnabledItem() + { + // Setup + var mocks = new MockRepository(); + var calculationMock = mocks.StrictMock(); + var assessmentSectionMock = mocks.StrictMock(); + mocks.ReplayAll(); + + var failureMechanismMock = new TestFailureMechanism(new[] + { + calculationMock + }); + var failureMechanismContext = new TestFailureMechanismContext(failureMechanismMock, assessmentSectionMock); + + // Call + var toolStripItem = RingtoetsContextMenuItemFactory.CreatePerformAllCalculationsInFailureMechanismItem(failureMechanismContext, null); + + // Assert + Assert.AreEqual(RingtoetsFormsResources.Calculate_all, toolStripItem.Text); + Assert.AreEqual(RingtoetsFormsResources.Calculate_all_ToolTip, toolStripItem.ToolTipText); + TestHelper.AssertImagesAreEqual(RingtoetsFormsResources.CalculateAllIcon, toolStripItem.Image); + Assert.IsTrue(toolStripItem.Enabled); + mocks.VerifyAll(); + } + + [Test] + public void CreatePerformAllCalculationsInFailureMechanismItemItem_FailureMechanismItemWithoutCalculations_CreatesDecoratedAndDisabledItem() + { + // Setup + var mocks = new MockRepository(); + var assessmentSectionMock = mocks.StrictMock(); + mocks.ReplayAll(); + + var failureMechanismMock = new TestFailureMechanism(Enumerable.Empty()); + var failureMechanismContext = new TestFailureMechanismContext(failureMechanismMock, assessmentSectionMock); + + // Call + var toolStripItem = RingtoetsContextMenuItemFactory.CreatePerformAllCalculationsInFailureMechanismItem(failureMechanismContext, null); + + // Assert + Assert.AreEqual(RingtoetsFormsResources.Calculate_all, toolStripItem.Text); + Assert.AreEqual(RingtoetsFormsResources.FailureMechanism_CreateCalculateAllItem_No_calculations_to_run, toolStripItem.ToolTipText); + TestHelper.AssertImagesAreEqual(RingtoetsFormsResources.CalculateAllIcon, toolStripItem.Image); + Assert.IsFalse(toolStripItem.Enabled); + mocks.VerifyAll(); + } + + [Test] + public void CreatePerformAllCalculationsInFailureMechanismItemItem_PerformClickOnCreatedItem_PerformAllCalculationMethodPerformed() + { + // Setup + var mocks = new MockRepository(); + var calculationMock = mocks.StrictMock(); + var assessmentSectionMock = mocks.StrictMock(); + mocks.ReplayAll(); + + var counter = 0; + var failureMechanism = new TestFailureMechanism(new[] + { + calculationMock + }); + var failureMechanismContext = new TestFailureMechanismContext(failureMechanism, assessmentSectionMock); + var toolStripItem = RingtoetsContextMenuItemFactory.CreatePerformAllCalculationsInFailureMechanismItem(failureMechanismContext, (fmContext) => counter++); + + // Call + toolStripItem.PerformClick(); + + // Assert + Assert.AreEqual(1, counter); + mocks.VerifyAll(); + } + + [Test] public void CreatePerformCalculationItem_IsEnabledFuncTrue_CreatesDecoratedAndEnabledItem() { // Setup @@ -675,6 +878,36 @@ # region Nested types + private class TestFailureMechanismContext : FailureMechanismContext + { + public TestFailureMechanismContext(TestFailureMechanism wrappedFailureMechanism, IAssessmentSection parent) : + base(wrappedFailureMechanism, parent) {} + } + + private class TestFailureMechanism : FailureMechanismBase + { + private readonly IEnumerable calculations; + + public TestFailureMechanism(IEnumerable calculations) + : base("Name", "Code") + { + this.calculations = calculations; + } + + public override IEnumerable Calculations + { + get + { + return calculations; + } + } + + protected override FailureMechanismSectionResult CreateFailureMechanismSectionResult(FailureMechanismSection section) + { + return null; + } + } + private class TestCalculationGroupContext : Observable, ICalculationContext { public TestCalculationGroupContext(CalculationGroup wrappedData, IFailureMechanism failureMechanism) @@ -720,9 +953,9 @@ } } - public void ClearOutput() { } + public void ClearOutput() {} - public void ClearHydraulicBoundaryLocation() { } + public void ClearHydraulicBoundaryLocation() {} public ICalculationInput GetObservableInput() { @@ -737,4 +970,4 @@ # endregion } -} +} \ No newline at end of file