Index: Core/Common/test/Core.Common.Gui.Test/Core.Common.Gui.Test.csproj =================================================================== diff -u -reb7f8fe1e85f00faf16a1cddef014728d60a2b19 -reff8c57b5a5243e2c723f117b46bf8b4094ca4c6 --- Core/Common/test/Core.Common.Gui.Test/Core.Common.Gui.Test.csproj (.../Core.Common.Gui.Test.csproj) (revision eb7f8fe1e85f00faf16a1cddef014728d60a2b19) +++ Core/Common/test/Core.Common.Gui.Test/Core.Common.Gui.Test.csproj (.../Core.Common.Gui.Test.csproj) (revision eff8c57b5a5243e2c723f117b46bf8b4094ca4c6) @@ -61,6 +61,7 @@ + @@ -75,6 +76,10 @@ {30e4c2ae-719e-4d70-9fa9-668a9767fbfa} Core.Common.Gui + + {26214BD0-DAFB-4CFC-8EB2-80C5D53C859E} + Core.Common.Gui.TestUtils + {D749EE4C-CE50-4C17-BF01-9A953028C126} Core.Common.TestUtils Index: Core/Common/test/Core.Common.Gui.Test/TestContextMenuBuilderProviderTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.Gui.Test/TestContextMenuBuilderProviderTest.cs (revision 0) +++ Core/Common/test/Core.Common.Gui.Test/TestContextMenuBuilderProviderTest.cs (revision eff8c57b5a5243e2c723f117b46bf8b4094ca4c6) @@ -0,0 +1,67 @@ +using System; +using System.Windows.Forms; +using Core.Common.Controls; +using Core.Common.Gui.TestUtils; +using NUnit.Framework; +using Rhino.Mocks; + +namespace Core.Common.Gui.Test +{ + [TestFixture] + public class TestContextMenuBuilderProviderTest + { + [Test] + public void Create_NoMocks_ArgumentException() + { + // Call & Assert + Assert.Throws(() => TestContextMenuBuilderProvider.Create(null, null)); + } + + [Test] + public void Create_NoTreeNode_ArgumentException() + { + // Call & Assert + Assert.Throws(() => TestContextMenuBuilderProvider.Create(new MockRepository(), null)); + } + + [Test] + public void Create_MocksAndTreeNode_SetExpectationDefaults() + { + // Setup + var mockRepository = new MockRepository(); + + // Call + var result = TestContextMenuBuilderProvider.Create(mockRepository, mockRepository.StrictMock()); + + mockRepository.ReplayAll(); + + // Expect + ContextMenuStrip menu = result.Get(null).AddExportItem().AddImportItem().AddPropertiesItem().AddOpenItem().Build(); + Assert.IsFalse(menu.Items[0].Enabled); + Assert.IsFalse(menu.Items[1].Enabled); + Assert.IsFalse(menu.Items[2].Enabled); + Assert.IsFalse(menu.Items[3].Enabled); + } + + [Test] + [TestCase(true)] + [TestCase(false)] + public void Create_MocksAndTreeNodeWithExpectations_SetExpectation(bool expectation) + { + // Setup + var mockRepository = new MockRepository(); + + // Call + var result = TestContextMenuBuilderProvider.Create(mockRepository, mockRepository.StrictMock(), expectation); + + mockRepository.ReplayAll(); + + // Expect + ContextMenuStrip menu = result.Get(null).AddExportItem().AddImportItem().AddPropertiesItem().AddOpenItem().Build(); + Assert.AreEqual(expectation, menu.Items[0].Enabled); + Assert.AreEqual(expectation, menu.Items[1].Enabled); + Assert.AreEqual(expectation, menu.Items[2].Enabled); + Assert.AreEqual(expectation, menu.Items[3].Enabled); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.Gui.TestUtils/Core.Common.Gui.TestUtils.csproj =================================================================== diff -u --- Core/Common/test/Core.Common.Gui.TestUtils/Core.Common.Gui.TestUtils.csproj (revision 0) +++ Core/Common/test/Core.Common.Gui.TestUtils/Core.Common.Gui.TestUtils.csproj (revision eff8c57b5a5243e2c723f117b46bf8b4094ca4c6) @@ -0,0 +1,122 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {26214BD0-DAFB-4CFC-8EB2-80C5D53C859E} + Library + Properties + Core.Common.Gui.TestUtils + Core.Common.Gui.TestUtils + v4.0 + 512 + Always + + + 3.5 + + false + false + + + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + true + + + true + bin\Debug\ + 4 + x86 + MinimumRecommendedRules.ruleset + TRACE;DEBUG + full + + + bin\Release\ + 4 + x86 + MinimumRecommendedRules.ruleset + TRACE + true + + + bin\CreateInstallerWithDemoProject\ + TRACE + true + x86 + MinimumRecommendedRules.ruleset + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + true + + + False + Windows Installer 3.1 + true + + + + + + + + + {9A2D67E6-26AC-4D17-B11A-2B4372F2F572} + Core.Common.Controls + + + {30E4C2AE-719E-4D70-9FA9-668A9767FBFA} + Core.Common.Gui + + + + + ..\..\..\..\packages\RhinoMocks.3.6.1\lib\net\Rhino.Mocks.dll + + + + + + + + + + + + + + + + + \ No newline at end of file Index: Core/Common/test/Core.Common.Gui.TestUtils/Properties/AssemblyInfo.cs =================================================================== diff -u --- Core/Common/test/Core.Common.Gui.TestUtils/Properties/AssemblyInfo.cs (revision 0) +++ Core/Common/test/Core.Common.Gui.TestUtils/Properties/AssemblyInfo.cs (revision eff8c57b5a5243e2c723f117b46bf8b4094ca4c6) @@ -0,0 +1,13 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +[assembly: AssemblyTitle("Core.Common.Gui.TestUtils")] +[assembly: AssemblyProduct("Core.Common.Gui.TestUtils")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("d749c2bb-9e8a-4211-b24b-d3b179e73042")] \ No newline at end of file Index: Core/Common/test/Core.Common.Gui.TestUtils/TestContextMenuBuilderProvider.cs =================================================================== diff -u --- Core/Common/test/Core.Common.Gui.TestUtils/TestContextMenuBuilderProvider.cs (revision 0) +++ Core/Common/test/Core.Common.Gui.TestUtils/TestContextMenuBuilderProvider.cs (revision eff8c57b5a5243e2c723f117b46bf8b4094ca4c6) @@ -0,0 +1,44 @@ +using System; +using Core.Common.Controls; +using Core.Common.Gui.ContextMenu; +using Rhino.Mocks; + +namespace Core.Common.Gui.TestUtils +{ + /// + /// Class can be used to create a default implementation for a . + /// + public static class TestContextMenuBuilderProvider + { + /// + /// Creates a new instance of . Makes use of mocks. + /// + /// The to add the mocks to. + /// The to pass to the . + /// Value indicating whether following option should be available. + /// + /// export + /// import + /// show properties + /// open view + /// + /// A new mock. + public static IContextMenuBuilderProvider Create(MockRepository mocks, ITreeNode node, bool itemsEnabled = false) + { + if (mocks == null || node == null) + { + throw new ArgumentNullException(); + } + var menuBuilderProviderMock = mocks.StrictMock(); + var commandHandlerMock = mocks.StrictMock(); + + commandHandlerMock.Expect(ch => ch.CanExportFromGuiSelection()).Return(itemsEnabled).Repeat.Any(); + commandHandlerMock.Expect(ch => ch.CanImportToGuiSelection()).Return(itemsEnabled).Repeat.Any(); + commandHandlerMock.Expect(ch => ch.CanShowPropertiesForGuiSelection()).Return(itemsEnabled).Repeat.Any(); + commandHandlerMock.Expect(ch => ch.CanOpenDefaultViewForSelection()).Return(itemsEnabled).Repeat.Any(); + + menuBuilderProviderMock.Expect(mbp => mbp.Get(null)).IgnoreArguments().Return(new ContextMenuBuilder(commandHandlerMock, node)); + return menuBuilderProviderMock; + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.Gui.TestUtils/packages.config =================================================================== diff -u --- Core/Common/test/Core.Common.Gui.TestUtils/packages.config (revision 0) +++ Core/Common/test/Core.Common.Gui.TestUtils/packages.config (revision eff8c57b5a5243e2c723f117b46bf8b4094ca4c6) @@ -0,0 +1,4 @@ + + + + \ No newline at end of file Index: Ringtoets.sln =================================================================== diff -u -r41c77f9f36ae74a406fd382187426cc06d2b0200 -reff8c57b5a5243e2c723f117b46bf8b4094ca4c6 --- Ringtoets.sln (.../Ringtoets.sln) (revision 41c77f9f36ae74a406fd382187426cc06d2b0200) +++ Ringtoets.sln (.../Ringtoets.sln) (revision eff8c57b5a5243e2c723f117b46bf8b4094ca4c6) @@ -213,6 +213,8 @@ {C90B77DA-E421-43CC-B82E-529651BC21AC} = {C90B77DA-E421-43CC-B82E-529651BC21AC} EndProjectSection EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Core.Common.Gui.TestUtils", "Core\Common\test\Core.Common.Gui.TestUtils\Core.Common.Gui.TestUtils.csproj", "{26214BD0-DAFB-4CFC-8EB2-80C5D53C859E}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution CreateInstaller|x86 = CreateInstaller|x86 @@ -700,6 +702,14 @@ {D4200F43-3F72-4F42-AF0A-8CED416A38EC}.Debug|x86.Build.0 = Debug|x86 {D4200F43-3F72-4F42-AF0A-8CED416A38EC}.Release|x86.ActiveCfg = Release|x86 {D4200F43-3F72-4F42-AF0A-8CED416A38EC}.Release|x86.Build.0 = Release|x86 + {26214BD0-DAFB-4CFC-8EB2-80C5D53C859E}.CreateInstaller|x86.ActiveCfg = CreateInstallerWithDemoProject|x86 + {26214BD0-DAFB-4CFC-8EB2-80C5D53C859E}.CreateInstaller|x86.Build.0 = CreateInstallerWithDemoProject|x86 + {26214BD0-DAFB-4CFC-8EB2-80C5D53C859E}.CreateInstallerWithDemoProject|x86.ActiveCfg = CreateInstallerWithDemoProject|x86 + {26214BD0-DAFB-4CFC-8EB2-80C5D53C859E}.CreateInstallerWithDemoProject|x86.Build.0 = CreateInstallerWithDemoProject|x86 + {26214BD0-DAFB-4CFC-8EB2-80C5D53C859E}.Debug|x86.ActiveCfg = Debug|x86 + {26214BD0-DAFB-4CFC-8EB2-80C5D53C859E}.Debug|x86.Build.0 = Debug|x86 + {26214BD0-DAFB-4CFC-8EB2-80C5D53C859E}.Release|x86.ActiveCfg = Release|x86 + {26214BD0-DAFB-4CFC-8EB2-80C5D53C859E}.Release|x86.Build.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -736,6 +746,7 @@ {A6A434E0-AE5A-4D5B-97D7-532B00FBDFE9} = {0D9858E1-CF2D-4DE5-AC0E-64401900D531} {FAFDB463-9612-41F4-B3DD-FF9C6E7023BA} = {0D9858E1-CF2D-4DE5-AC0E-64401900D531} {D5EC1DF2-03C9-467B-B6AF-BE5AC83417F8} = {0D9858E1-CF2D-4DE5-AC0E-64401900D531} + {26214BD0-DAFB-4CFC-8EB2-80C5D53C859E} = {0D9858E1-CF2D-4DE5-AC0E-64401900D531} {EE2D52A2-9D3E-4056-8A21-F1725F67E5CF} = {D89FA693-A8E9-4560-9957-B74B7E9391F0} {DD70F63E-6459-4C49-86EC-4DB87DCE9B01} = {D89FA693-A8E9-4560-9957-B74B7E9391F0} {38C9E9C3-A3A9-49A0-A0DE-A4EDB9885A61} = {D89FA693-A8E9-4560-9957-B74B7E9391F0} Index: Ringtoets/Common/src/Ringtoets.Common.Forms/NodePresenters/CategoryTreeFolderNodePresenter.cs =================================================================== diff -u -rf9a6da5a0a62e484e46775cc57ee6f8fe412694f -reff8c57b5a5243e2c723f117b46bf8b4094ca4c6 --- Ringtoets/Common/src/Ringtoets.Common.Forms/NodePresenters/CategoryTreeFolderNodePresenter.cs (.../CategoryTreeFolderNodePresenter.cs) (revision f9a6da5a0a62e484e46775cc57ee6f8fe412694f) +++ Ringtoets/Common/src/Ringtoets.Common.Forms/NodePresenters/CategoryTreeFolderNodePresenter.cs (.../CategoryTreeFolderNodePresenter.cs) (revision eff8c57b5a5243e2c723f117b46bf8b4094ca4c6) @@ -1,6 +1,5 @@ using System; using System.Collections; -using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; using Core.Common.Controls; Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingCalculationContextNodePresenter.cs =================================================================== diff -u -r61161720b379645f400606e868e2a1286c17348d -reff8c57b5a5243e2c723f117b46bf8b4094ca4c6 --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingCalculationContextNodePresenter.cs (.../PipingCalculationContextNodePresenter.cs) (revision 61161720b379645f400606e868e2a1286c17348d) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingCalculationContextNodePresenter.cs (.../PipingCalculationContextNodePresenter.cs) (revision eff8c57b5a5243e2c723f117b46bf8b4094ca4c6) @@ -5,7 +5,8 @@ using System.Windows.Forms; using Core.Common.Base.Workflow; using Core.Common.Controls; - +using Core.Common.Gui; +using Core.Common.Gui.ContextMenu; using Ringtoets.Common.Forms.Extensions; using Ringtoets.Common.Forms.NodePresenters; using Ringtoets.Piping.Data; @@ -28,6 +29,10 @@ /// Injection points for a method to cause an to be scheduled for execution. /// public Action RunActivityAction { private get; set; } + /// + /// Sets the to be used for creating the . + /// + public IContextMenuBuilderProvider ContextMenuBuilderProvider { private get; set; } protected override void UpdateNode(ITreeNode parentNode, ITreeNode node, PipingCalculationContext pipingCalculationContext) { @@ -97,25 +102,28 @@ protected override ContextMenuStrip GetContextMenu(ITreeNode sender, PipingCalculationContext nodeData) { - PipingCalculation calculation = nodeData.WrappedData; + if (ContextMenuBuilderProvider == null) + { + return null; + } - var contextMenu = new ContextMenuStrip(); - contextMenu.AddMenuItem(Resources.Validate, + PipingCalculation calculation = nodeData.WrappedData; + var validateItem = new StrictContextMenuItem(Resources.Validate, null, Resources.ValidationIcon, (o, args) => { PipingCalculationService.Validate(calculation); }); - contextMenu.AddMenuItem(Resources.Calculate, + var calculateItem = new StrictContextMenuItem(Resources.Calculate, null, Resources.Play, (o, args) => { RunActivityAction(new PipingCalculationActivity(calculation)); }); - var clearOutputItem = contextMenu.AddMenuItem(Resources.Clear_output, + var clearOutputItem = new StrictContextMenuItem(Resources.Clear_output, null, RingtoetsFormsResources.ClearIcon, (o, args) => @@ -130,7 +138,20 @@ clearOutputItem.ToolTipText = Resources.ClearOutput_No_output_to_clear; } - return contextMenu; + return ContextMenuBuilderProvider + .Get(sender) + .AddCustomItem(validateItem) + .AddCustomItem(calculateItem) + .AddCustomItem(clearOutputItem) + .AddSeparator() + .AddExpandAllItem() + .AddCollapseAllItem() + .AddSeparator() + .AddImportItem() + .AddExportItem() + .AddSeparator() + .AddPropertiesItem() + .Build(); } } } \ No newline at end of file Index: Ringtoets/Piping/src/Ringtoets.Piping.Plugin/PipingGuiPlugin.cs =================================================================== diff -u -rf9a6da5a0a62e484e46775cc57ee6f8fe412694f -reff8c57b5a5243e2c723f117b46bf8b4094ca4c6 --- Ringtoets/Piping/src/Ringtoets.Piping.Plugin/PipingGuiPlugin.cs (.../PipingGuiPlugin.cs) (revision f9a6da5a0a62e484e46775cc57ee6f8fe412694f) +++ Ringtoets/Piping/src/Ringtoets.Piping.Plugin/PipingGuiPlugin.cs (.../PipingGuiPlugin.cs) (revision eff8c57b5a5243e2c723f117b46bf8b4094ca4c6) @@ -35,7 +35,8 @@ { yield return new PipingCalculationContextNodePresenter { - RunActivityAction = ActivityProgressDialogRunner.Run + RunActivityAction = ActivityProgressDialogRunner.Run, + ContextMenuBuilderProvider = Gui.ContextMenuProvider }; yield return new PipingCalculationGroupContextNodePresenter(); yield return new PipingInputContextNodePresenter(); Index: Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/NodePresenters/PipingCalculationContextNodePresenterTest.cs =================================================================== diff -u -r495647ee1c652fecc15eea7fefeab29ae01347fe -reff8c57b5a5243e2c723f117b46bf8b4094ca4c6 --- Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/NodePresenters/PipingCalculationContextNodePresenterTest.cs (.../PipingCalculationContextNodePresenterTest.cs) (revision 495647ee1c652fecc15eea7fefeab29ae01347fe) +++ Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/NodePresenters/PipingCalculationContextNodePresenterTest.cs (.../PipingCalculationContextNodePresenterTest.cs) (revision eff8c57b5a5243e2c723f117b46bf8b4094ca4c6) @@ -8,6 +8,9 @@ using System.Windows.Forms; using Core.Common.Base; using Core.Common.Base.Workflow; +using Core.Common.Gui; +using Core.Common.Gui.ContextMenu; +using Core.Common.Gui.TestUtils; using NUnit.Framework; using Rhino.Mocks; @@ -16,7 +19,9 @@ using Ringtoets.Piping.Forms.NodePresenters; using Ringtoets.Piping.Forms.PresentationObjects; -using RingtoetsFormsResources = Ringtoets.Piping.Forms.Properties.Resources; +using PipingFormsResources = Ringtoets.Piping.Forms.Properties.Resources; +using RingtoetsCommonFormsResources = Ringtoets.Common.Forms.Properties.Resources; +using CoreCommonGuiResources = Core.Common.Gui.Properties.Resources; namespace Ringtoets.Piping.Forms.Test.NodePresenters { @@ -28,6 +33,11 @@ private const int contextMenuValidateIndex = 0; private const int contextMenuCalculateIndex = 1; private const int contextMenuClearIndex = 2; + private const int contextMenuExpandIndex = 4; + private const int contextMenuCollapseIndex = 5; + private const int contextMenuImportIndex = 7; + private const int contextMenuExportIndex = 8; + private const int contextMenuPropertiesIndex = 10; [SetUp] public void SetUp() @@ -71,7 +81,7 @@ // Assert Assert.AreEqual(nodeName, pipingNode.Text); - TestHelper.AssertImagesAreEqual(RingtoetsFormsResources.PipingIcon, pipingNode.Image); + TestHelper.AssertImagesAreEqual(PipingFormsResources.PipingIcon, pipingNode.Image); } [Test] @@ -325,90 +335,151 @@ } [Test] - public void GetContextMenu_WithPipingCalculation_ContextMenuWithThreeItems() + public void GetContextMenu_WithPipingCalculation_ContextMenuWithElevenItems() { // Setup var nodeMock = mockRepository.StrictMock(); - mockRepository.ReplayAll(); var nodeData = new PipingCalculationContext(new PipingCalculation(), Enumerable.Empty(), Enumerable.Empty()); - var nodePresenter = new PipingCalculationContextNodePresenter(); + var nodePresenter = new PipingCalculationContextNodePresenter + { + ContextMenuBuilderProvider = TestContextMenuBuilderProvider.Create(mockRepository, nodeMock, true) + }; + mockRepository.ReplayAll(); + // Call ContextMenuStrip contextMenu = nodePresenter.GetContextMenu(nodeMock, nodeData); // Assert Assert.IsNotNull(contextMenu); - Assert.AreEqual(3, contextMenu.Items.Count); - var validateItem = contextMenu.Items[contextMenuValidateIndex]; - Assert.AreEqual(RingtoetsFormsResources.Validate, validateItem.Text); - TestHelper.AssertImagesAreEqual(RingtoetsFormsResources.ValidationIcon, validateItem.Image); + Assert.AreEqual(11, contextMenu.Items.Count); + ToolStripItem validateItem = contextMenu.Items[contextMenuValidateIndex]; + Assert.AreEqual(PipingFormsResources.Validate, validateItem.Text); + TestHelper.AssertImagesAreEqual(PipingFormsResources.ValidationIcon, validateItem.Image); + ToolStripItem calculatePipingItem = contextMenu.Items[contextMenuCalculateIndex]; - Assert.AreEqual(RingtoetsFormsResources.Calculate, calculatePipingItem.Text); - Assert.AreEqual(16, calculatePipingItem.Image.Height); - Assert.AreEqual(16, calculatePipingItem.Image.Width); + Assert.AreEqual(PipingFormsResources.Calculate, calculatePipingItem.Text); + TestHelper.AssertImagesAreEqual(PipingFormsResources.Play, calculatePipingItem.Image); ToolStripItem clearOutputItem = contextMenu.Items[contextMenuClearIndex]; - Assert.AreEqual(RingtoetsFormsResources.Clear_output, clearOutputItem.Text); - Assert.AreEqual(16, clearOutputItem.Image.Height); - Assert.AreEqual(16, clearOutputItem.Image.Width); - mockRepository.VerifyAll(); // Expect no calls on arguments + Assert.AreEqual(PipingFormsResources.Clear_output, clearOutputItem.Text); + TestHelper.AssertImagesAreEqual(RingtoetsCommonFormsResources.ClearIcon, clearOutputItem.Image); + + ToolStripItem expandItem = contextMenu.Items[contextMenuExpandIndex]; + Assert.AreEqual(CoreCommonGuiResources.Expand_all, expandItem.Text); + Assert.AreEqual(CoreCommonGuiResources.Expand_all_ToolTip, expandItem.ToolTipText); + TestHelper.AssertImagesAreEqual(CoreCommonGuiResources.ExpandAllIcon, expandItem.Image); + + ToolStripItem collapseItem = contextMenu.Items[contextMenuCollapseIndex]; + Assert.AreEqual(CoreCommonGuiResources.Collapse_all, collapseItem.Text); + Assert.AreEqual(CoreCommonGuiResources.Collapse_all_ToolTip, collapseItem.ToolTipText); + TestHelper.AssertImagesAreEqual(CoreCommonGuiResources.CollapseAllIcon, collapseItem.Image); + + ToolStripItem importItem = contextMenu.Items[contextMenuImportIndex]; + Assert.AreEqual(CoreCommonGuiResources.Import, importItem.Text); + Assert.AreEqual(CoreCommonGuiResources.Import_ToolTip, importItem.ToolTipText); + TestHelper.AssertImagesAreEqual(CoreCommonGuiResources.ImportIcon, importItem.Image); + + ToolStripItem exportItem = contextMenu.Items[contextMenuExportIndex]; + Assert.AreEqual(CoreCommonGuiResources.Export, exportItem.Text); + Assert.AreEqual(CoreCommonGuiResources.Export_ToolTip, exportItem.ToolTipText); + TestHelper.AssertImagesAreEqual(CoreCommonGuiResources.ExportIcon, exportItem.Image); + + ToolStripItem propertiesItem = contextMenu.Items[contextMenuPropertiesIndex]; + Assert.AreEqual(CoreCommonGuiResources.Properties, propertiesItem.Text); + Assert.AreEqual(CoreCommonGuiResources.Properties_ToolTip, propertiesItem.ToolTipText); + TestHelper.AssertImagesAreEqual(CoreCommonGuiResources.PropertiesIcon, propertiesItem.Image); + + mockRepository.VerifyAll(); } [Test] public void GetContextMenu_PipingCalculationWithoutOutput_ContextMenuItemClearOutputDisabled() { // Setup var nodeMock = mockRepository.StrictMock(); - mockRepository.ReplayAll(); var nodeData = new PipingCalculationContext(new PipingCalculation(), Enumerable.Empty(), Enumerable.Empty()); - var nodePresenter = new PipingCalculationContextNodePresenter(); + var nodePresenter = new PipingCalculationContextNodePresenter + { + ContextMenuBuilderProvider = TestContextMenuBuilderProvider.Create(mockRepository, nodeMock, true) + }; + mockRepository.ReplayAll(); + // Call ContextMenuStrip contextMenu = nodePresenter.GetContextMenu(nodeMock, nodeData); // Assert Assert.IsNotNull(contextMenu); - Assert.AreEqual(3, contextMenu.Items.Count); + Assert.AreEqual(11, contextMenu.Items.Count); ToolStripItem clearOutputItem = contextMenu.Items[contextMenuClearIndex]; Assert.IsFalse(clearOutputItem.Enabled); - Assert.AreEqual(RingtoetsFormsResources.ClearOutput_No_output_to_clear, clearOutputItem.ToolTipText); - mockRepository.VerifyAll(); // Expect no calls on arguments + Assert.AreEqual(PipingFormsResources.ClearOutput_No_output_to_clear, clearOutputItem.ToolTipText); + mockRepository.VerifyAll(); } [Test] - public void GetContextMenu_PipingCalculationWithOutput_ContextMenuItemClearOutputEnabled() + public void GetContextMenu_NoProviderPipingCalculationWithOutput_ReturnsNull() { // Setup var nodeMock = mockRepository.StrictMock(); + var nodePresenter = new PipingCalculationContextNodePresenter(); + var calculation = new PipingCalculation + { + Output = new TestPipingOutput() + }; + var nodeData = new PipingCalculationContext(calculation, + Enumerable.Empty(), + Enumerable.Empty()); + mockRepository.ReplayAll(); + // Call + ContextMenuStrip contextMenu = nodePresenter.GetContextMenu(nodeMock, nodeData); + + // Assert + Assert.IsNull(contextMenu); + + mockRepository.VerifyAll(); + } + + [Test] + public void GetContextMenu_WithProviderPipingCalculationWithOutput_ContextMenuItemClearOutputEnabled() + { + // Setup + var nodeMock = mockRepository.StrictMock(); + var calculation = new PipingCalculation { Output = new TestPipingOutput() }; var nodeData = new PipingCalculationContext(calculation, Enumerable.Empty(), Enumerable.Empty()); - - var nodePresenter = new PipingCalculationContextNodePresenter(); + var nodePresenter = new PipingCalculationContextNodePresenter + { + ContextMenuBuilderProvider = TestContextMenuBuilderProvider.Create(mockRepository, nodeMock, true) + }; + mockRepository.ReplayAll(); + // Call ContextMenuStrip contextMenu = nodePresenter.GetContextMenu(nodeMock, nodeData); // Assert Assert.IsNotNull(contextMenu); - Assert.AreEqual(3, contextMenu.Items.Count); + Assert.AreEqual(11, contextMenu.Items.Count); ToolStripItem clearOutputItem = contextMenu.Items[contextMenuClearIndex]; Assert.IsTrue(clearOutputItem.Enabled); @@ -572,22 +643,28 @@ var expectedValidationMessageCount = 2; // No surfaceline or soil profile selected for calculation var observer = mockRepository.StrictMock(); - mockRepository.ReplayAll(); var calculateContextMenuItemIndex = 1; var calculation = new PipingCalculation(); calculation.Attach(observer); var activityRunner = new ActivityRunner(); + ITreeNode treeNodeMock = mockRepository.StrictMock(); + var nodePresenter = new PipingCalculationContextNodePresenter { - RunActivityAction = activity => activityRunner.Enqueue(activity) + RunActivityAction = activity => activityRunner.Enqueue(activity), + ContextMenuBuilderProvider = TestContextMenuBuilderProvider.Create(mockRepository, treeNodeMock, true) }; - var contextMenuAdapter = nodePresenter.GetContextMenu(null, new PipingCalculationContext(calculation, + + mockRepository.ReplayAll(); + + var contextMenuAdapter = nodePresenter.GetContextMenu(treeNodeMock, new PipingCalculationContext(calculation, Enumerable.Empty(), Enumerable.Empty())); - + + // When Action action = () => { @@ -628,13 +705,19 @@ var validateContextMenuItemIndex = 0; var calculation = new PipingCalculation(); var observer = mockRepository.StrictMock(); - var nodePresenter = new PipingCalculationContextNodePresenter(); observer.Expect(o => o.UpdateObserver()).Repeat.Never(); calculation.Attach(observer); + ITreeNode treeNodeMock = mockRepository.StrictMock(); + + var nodePresenter = new PipingCalculationContextNodePresenter + { + ContextMenuBuilderProvider = TestContextMenuBuilderProvider.Create(mockRepository, treeNodeMock, true) + }; + mockRepository.ReplayAll(); - var contextMenuAdapter = nodePresenter.GetContextMenu(null, new PipingCalculationContext(calculation, + var contextMenuAdapter = nodePresenter.GetContextMenu(treeNodeMock, new PipingCalculationContext(calculation, Enumerable.Empty(), Enumerable.Empty())); @@ -681,12 +764,18 @@ observer.Expect(o => o.UpdateObserver()); calculation.Attach(observer); + ITreeNode treeNodeMock = mockRepository.StrictMock(); + + var nodePresenter = new PipingCalculationContextNodePresenter + { + ContextMenuBuilderProvider = TestContextMenuBuilderProvider.Create(mockRepository, treeNodeMock, true) + }; + mockRepository.ReplayAll(); var activityRunner = new ActivityRunner(); - var nodePresenter = new PipingCalculationContextNodePresenter(); - var contextMenuAdapter = nodePresenter.GetContextMenu(null, new PipingCalculationContext(calculation, + var contextMenuAdapter = nodePresenter.GetContextMenu(treeNodeMock, new PipingCalculationContext(calculation, Enumerable.Empty(), Enumerable.Empty())); nodePresenter.RunActivityAction = activity => activityRunner.Enqueue(activity); @@ -731,10 +820,16 @@ calculation.Output = new TestPipingOutput(); calculation.Attach(observer); + ITreeNode treeNodeMock = mockRepository.StrictMock(); + + var nodePresenter = new PipingCalculationContextNodePresenter + { + ContextMenuBuilderProvider = TestContextMenuBuilderProvider.Create(mockRepository, treeNodeMock, true) + }; + mockRepository.ReplayAll(); - var nodePresenter = new PipingCalculationContextNodePresenter(); - var contextMenuAdapter = nodePresenter.GetContextMenu(null, new PipingCalculationContext(calculation, + var contextMenuAdapter = nodePresenter.GetContextMenu(treeNodeMock, new PipingCalculationContext(calculation, Enumerable.Empty(), Enumerable.Empty())); Index: Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/NodePresenters/PipingSoilProfileCollectionNodePresenterTest.cs =================================================================== diff -u -rf9a6da5a0a62e484e46775cc57ee6f8fe412694f -reff8c57b5a5243e2c723f117b46bf8b4094ca4c6 --- Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/NodePresenters/PipingSoilProfileCollectionNodePresenterTest.cs (.../PipingSoilProfileCollectionNodePresenterTest.cs) (revision f9a6da5a0a62e484e46775cc57ee6f8fe412694f) +++ Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/NodePresenters/PipingSoilProfileCollectionNodePresenterTest.cs (.../PipingSoilProfileCollectionNodePresenterTest.cs) (revision eff8c57b5a5243e2c723f117b46bf8b4094ca4c6) @@ -4,6 +4,7 @@ using Core.Common.Controls; using Core.Common.Gui; using Core.Common.Gui.ContextMenu; +using Core.Common.Gui.TestUtils; using Core.Common.TestUtils; using NUnit.Framework; @@ -147,20 +148,14 @@ var mocks = new MockRepository(); var nodeMock = mocks.StrictMock(); var dataMock = mocks.StrictMock>(); - var menuBuilderProviderMock = mocks.StrictMock(); - var commandHandlerMock = mocks.StrictMock(); - menuBuilderProviderMock.Expect(mbp => mbp.Get(null)).IgnoreArguments().Return(new ContextMenuBuilder(commandHandlerMock, nodeMock)); - commandHandlerMock.Expect(ch => ch.CanExportFromGuiSelection()).Return(importExportEnabled); - commandHandlerMock.Expect(ch => ch.CanImportToGuiSelection()).Return(importExportEnabled); - - mocks.ReplayAll(); - var nodePresenter = new PipingSoilProfileCollectionNodePresenter { - ContextMenuBuilderProvider = menuBuilderProviderMock + ContextMenuBuilderProvider = TestContextMenuBuilderProvider.Create(mocks, nodeMock, importExportEnabled) }; + mocks.ReplayAll(); + // Call var returnedContextMenu = nodePresenter.GetContextMenu(nodeMock, dataMock); Index: Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/NodePresenters/PipingSurfaceLineCollectionNodePresenterTest.cs =================================================================== diff -u -r5bdfe106fefb36f7e677da7e75afec1eba7eedd3 -reff8c57b5a5243e2c723f117b46bf8b4094ca4c6 --- Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/NodePresenters/PipingSurfaceLineCollectionNodePresenterTest.cs (.../PipingSurfaceLineCollectionNodePresenterTest.cs) (revision 5bdfe106fefb36f7e677da7e75afec1eba7eedd3) +++ Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/NodePresenters/PipingSurfaceLineCollectionNodePresenterTest.cs (.../PipingSurfaceLineCollectionNodePresenterTest.cs) (revision eff8c57b5a5243e2c723f117b46bf8b4094ca4c6) @@ -7,6 +7,7 @@ using Core.Common.Controls; using Core.Common.Gui; using Core.Common.Gui.ContextMenu; +using Core.Common.Gui.TestUtils; using Core.Common.TestUtils; using Core.Common.Utils.Collections; using NUnit.Framework; @@ -315,20 +316,14 @@ var mocks = new MockRepository(); var nodeMock = mocks.StrictMock(); var dataMock = mocks.StrictMock>(); - var menuBuilderProviderMock = mocks.StrictMock(); - var commandHandlerMock = mocks.StrictMock(); - menuBuilderProviderMock.Expect(mbp => mbp.Get(null)).IgnoreArguments().Return(new ContextMenuBuilder(commandHandlerMock, nodeMock)); - commandHandlerMock.Expect(ch => ch.CanExportFromGuiSelection()).Return(importExportEnabled); - commandHandlerMock.Expect(ch => ch.CanImportToGuiSelection()).Return(importExportEnabled); - - mocks.ReplayAll(); - var nodePresenter = new PipingSurfaceLineCollectionNodePresenter { - ContextMenuBuilderProvider = menuBuilderProviderMock + ContextMenuBuilderProvider = TestContextMenuBuilderProvider.Create(mocks, nodeMock, importExportEnabled) }; + mocks.ReplayAll(); + // Call var returnedContextMenu = nodePresenter.GetContextMenu(nodeMock, dataMock); Index: Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/Ringtoets.Piping.Forms.Test.csproj =================================================================== diff -u -r495647ee1c652fecc15eea7fefeab29ae01347fe -reff8c57b5a5243e2c723f117b46bf8b4094ca4c6 --- Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/Ringtoets.Piping.Forms.Test.csproj (.../Ringtoets.Piping.Forms.Test.csproj) (revision 495647ee1c652fecc15eea7fefeab29ae01347fe) +++ Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/Ringtoets.Piping.Forms.Test.csproj (.../Ringtoets.Piping.Forms.Test.csproj) (revision eff8c57b5a5243e2c723f117b46bf8b4094ca4c6) @@ -107,6 +107,10 @@ {f49bd8b2-332a-4c91-a196-8cce0a2c7d98} Core.Common.Utils + + {26214BD0-DAFB-4CFC-8EB2-80C5D53C859E} + Core.Common.Gui.TestUtils + {d749ee4c-ce50-4c17-bf01-9a953028c126} Core.Common.TestUtils Index: packages/repositories.config =================================================================== diff -u -r2705c81f73c3fee936ccc31385625a30d6a3a10f -reff8c57b5a5243e2c723f117b46bf8b4094ca4c6 --- packages/repositories.config (.../repositories.config) (revision 2705c81f73c3fee936ccc31385625a30d6a3a10f) +++ packages/repositories.config (.../repositories.config) (revision eff8c57b5a5243e2c723f117b46bf8b4094ca4c6) @@ -8,6 +8,7 @@ +