Index: Core/Common/src/Core.Common.Gui/ContextMenu/ContextMenuBuilder.cs =================================================================== diff -u -re388ea76d1d044298cc89156c8744fbea1bcb736 -ra80efa8773c3efec54ba44940945b03bc3f3ff7e --- Core/Common/src/Core.Common.Gui/ContextMenu/ContextMenuBuilder.cs (.../ContextMenuBuilder.cs) (revision e388ea76d1d044298cc89156c8744fbea1bcb736) +++ Core/Common/src/Core.Common.Gui/ContextMenu/ContextMenuBuilder.cs (.../ContextMenuBuilder.cs) (revision a80efa8773c3efec54ba44940945b03bc3f3ff7e) @@ -1,51 +1,112 @@ -using System.Windows.Forms; +using System; +using System.Windows.Forms; using Core.Common.Controls; +using Core.Common.Gui.Properties; namespace Core.Common.Gui.ContextMenu { + /// + /// This class represents a builder which can be used to create a context menu, which's items require information + /// on the in order to render or perform actions. + /// public class ContextMenuBuilder { - private readonly ContextMenuItemFactory itemsFactory; + private readonly GuiContextMenuItemFactory guiItemsFactory; + private readonly TreeViewContextMenuItemFactory treeViewItemsFactory; private readonly ContextMenuStrip contextMenu; private readonly ITreeNode treeNode; + /// + /// Creates a new instance of , which uses the given to + /// create a for the given . + /// + /// The from which to obtain information to render and bind actions + /// to the items of the . If null, this builder will not render items which + /// require this type of information. + /// The for which to create a . public ContextMenuBuilder(IGui gui, ITreeNode treeNode) { + if (treeNode == null) + { + throw new ArgumentNullException("treeNode", Resources.ContextMenuBuilder_ContextMenuBuilder_Can_not_build_context_menu_for_empty_tree_node); + } + if (gui != null) + { + guiItemsFactory = new GuiContextMenuItemFactory(gui); + } + treeViewItemsFactory = new TreeViewContextMenuItemFactory(); contextMenu = new ContextMenuStrip(); - itemsFactory = new ContextMenuItemFactory(gui); this.treeNode = treeNode; } + /// + /// Adds an item to the , which expands the . + /// + /// The itself, so that operations can be easily chained. public ContextMenuBuilder AddExpandAllItem() { - AddItem(itemsFactory.CreateExpandAllItem(treeNode)); + AddItem(treeViewItemsFactory.CreateExpandAllItem(treeNode)); return this; } + /// + /// Adds an item to the , which collapses the . + /// + /// The itself, so that operations can be easily chained. public ContextMenuBuilder AddCollapseAllItem() { - AddItem(itemsFactory.CreateCollapseAllItem(treeNode)); + AddItem(treeViewItemsFactory.CreateCollapseAllItem(treeNode)); return this; } + /// + /// Adds an item to the , which exports the data of the . + /// + /// The itself, so that operations can be easily chained. + /// If the was not passed on construction, this method will not add an item. public ContextMenuBuilder AddExportItem() { - AddItem(itemsFactory.CreateExportItem(treeNode)); + if (guiItemsFactory != null) + { + AddItem(guiItemsFactory.CreateExportItem(treeNode)); + } return this; } + /// + /// Adds an item to the , which imports the data of the . + /// + /// The itself, so that operations can be easily chained. + /// If the was not passed on construction, this method will not add an item. public ContextMenuBuilder AddImportItem() { - AddItem(itemsFactory.CreateImportItem(treeNode)); + if (guiItemsFactory != null) + { + AddItem(guiItemsFactory.CreateImportItem(treeNode)); + } return this; } + /// + /// Adds an item to the , which shows properties of the data of the . + /// + /// The itself, so that operations can be easily chained. + /// If the was not passed on construction, this method will not add an item. public ContextMenuBuilder AddPropertiesItem() { - AddItem(itemsFactory.CreatePropertiesItem(treeNode)); + if (guiItemsFactory != null) + { + AddItem(guiItemsFactory.CreatePropertiesItem(treeNode)); + } return this; } + /// + /// Adds a to the . A + /// is only added if the last item that was added to the exists and is not a + /// . + /// + /// The itself, so that operations can be easily chained. public ContextMenuBuilder AddSeparator() { if (MayAddSeparator()) @@ -55,26 +116,36 @@ return this; } - private bool MayAddSeparator() - { - if (contextMenu.Items.Count == 0) - { - return false; - } - return !(contextMenu.Items[contextMenu.Items.Count - 1] is ToolStripSeparator); - } - + /// + /// Adds a custom item to the . + /// + /// The custom to add to the . + /// The itself, so that operations can be easily chained. public ContextMenuBuilder AddCustomItem(ToolStripMenuItem item) { AddItem(item); return this; } + /// + /// Obtain the , which has been constructed by using the other methods of + /// . + /// + /// The constructed . public ContextMenuStrip Build() { return contextMenu; } + private bool MayAddSeparator() + { + if (contextMenu.Items.Count == 0) + { + return false; + } + return !(contextMenu.Items[contextMenu.Items.Count - 1] is ToolStripSeparator); + } + private void AddItem(ToolStripItem item) { if (item != null) Fisheye: Tag a80efa8773c3efec54ba44940945b03bc3f3ff7e refers to a dead (removed) revision in file `Core/Common/src/Core.Common.Gui/ContextMenu/ContextMenuItemFactory.cs'. Fisheye: No comparison available. Pass `N' to diff? Index: Core/Common/src/Core.Common.Gui/ContextMenu/GuiContextMenuItemFactory.cs =================================================================== diff -u --- Core/Common/src/Core.Common.Gui/ContextMenu/GuiContextMenuItemFactory.cs (revision 0) +++ Core/Common/src/Core.Common.Gui/ContextMenu/GuiContextMenuItemFactory.cs (revision a80efa8773c3efec54ba44940945b03bc3f3ff7e) @@ -0,0 +1,105 @@ +using System; +using System.Linq; +using System.Windows.Forms; +using Core.Common.Controls; +using Core.Common.Gui.Properties; + +namespace Core.Common.Gui.ContextMenu +{ + /// + /// This class represents a factory for creating . The + /// items the factory creates are dependent on a set for this + /// factory. + /// + internal class GuiContextMenuItemFactory + { + private readonly IGui gui; + + /// + /// Creates a new instance of , which uses the to create + /// . + /// + /// The which contains information for creating the . + /// Thrown when is null. + public GuiContextMenuItemFactory(IGui gui) + { + if (gui == null) + { + throw new ArgumentNullException("gui", Resources.GuiContextMenuItemFactory_GuiContextMenuItemFactory_Can_not_create_gui_context_menu_items_without_gui); + } + this.gui = gui; + } + + /// + /// Creates a which is bound to the action of exporting + /// the data of the given . + /// + /// The for which to create the + /// and for which to export its data if clicked. + /// + /// The created . + public ToolStripItem CreateExportItem(ITreeNode treeNode) + { + var data = treeNode.Tag; + var exporters = gui.ApplicationCore.GetSupportedFileExporters(data); + var newItem = new ToolStripMenuItem(Resources.Export) + { + ToolTipText = Resources.Export_ToolTip, + Image = Resources.ExportIcon, + Enabled = exporters.Any() + }; + + return newItem; + } + + /// + /// Creates a which is bound to the action of importing + /// the data of the given . + /// + /// The for which to create the + /// and for which to import its data if clicked. + /// + /// The created . + public ToolStripItem CreateImportItem(ITreeNode treeNode) + { + var data = treeNode.Tag; + var importers = gui.ApplicationCore.GetSupportedFileImporters(data); + var newItem = new ToolStripMenuItem(Resources.Import) + { + ToolTipText = Resources.Import_ToolTip, + Image = Resources.ImportIcon, + Enabled = importers.Any() + }; + + return newItem; + } + + /// + /// Creates a which is bound to the action of showing + /// the properties of the data of the given . + /// + /// The for which to create the + /// and for which to show the properties of its data if clicked. + /// + /// The created . + public ToolStripItem CreatePropertiesItem(ITreeNode treeNode) + { + var data = treeNode.Tag; + var propertyInfos = gui.Plugins.SelectMany(p => p.GetPropertyInfos()).Where(pi => pi.ObjectType == data.GetType()); + var newItem = new ToolStripMenuItem(Resources.Properties) + { + ToolTipText = Resources.Properties_ToolTip, + Image = Resources.PropertiesIcon, + Enabled = propertyInfos.Any() + }; + + var guiCommandHandler = gui.CommandHandler; + if (guiCommandHandler != null) + { + newItem.Click += (s, e) => guiCommandHandler.ShowProperties(); + } + + return newItem; + } + } +} \ No newline at end of file Index: Core/Common/src/Core.Common.Gui/ContextMenu/TreeViewContextMenuItemFactory.cs =================================================================== diff -u --- Core/Common/src/Core.Common.Gui/ContextMenu/TreeViewContextMenuItemFactory.cs (revision 0) +++ Core/Common/src/Core.Common.Gui/ContextMenu/TreeViewContextMenuItemFactory.cs (revision a80efa8773c3efec54ba44940945b03bc3f3ff7e) @@ -0,0 +1,50 @@ +using System.Windows.Forms; +using Core.Common.Controls; +using Core.Common.Gui.Properties; + +namespace Core.Common.Gui.ContextMenu +{ + /// + /// This class represents a factory for creating . The + /// items the factory creates are dependent on a set for + /// the . + /// + internal class TreeViewContextMenuItemFactory + { + /// + /// Creates a which is bound to the action of expanding + /// the . + /// + /// The for which to create the + /// and which to expand if clicked. + /// The created . + public ToolStripItem CreateExpandAllItem(ITreeNode treeNode) + { + var toolStripMenuItem = new ToolStripMenuItem(Resources.Expand_all) + { + ToolTipText = Resources.Expand_all_ToolTip, + Image = Resources.ExpandAllIcon + }; + toolStripMenuItem.Click += (s, e) => treeNode.TreeView.ExpandAll(treeNode); + return toolStripMenuItem; + } + + /// + /// Creates a which is bound to the action of collapsing + /// the . + /// + /// The for which to create the + /// and which to collapse if clicked. + /// The created . + public ToolStripItem CreateCollapseAllItem(ITreeNode treeNode) + { + var toolStripMenuItem = new ToolStripMenuItem(Resources.Collapse_all) + { + ToolTipText = Resources.Collapse_all_ToolTip, + Image = Resources.CollapseAllIcon + }; + toolStripMenuItem.Click += (s, e) => treeNode.TreeView.CollapseAll(treeNode); + return toolStripMenuItem; + } + } +} \ No newline at end of file Index: Core/Common/src/Core.Common.Gui/Core.Common.Gui.csproj =================================================================== diff -u -r2afad189e942019ef3da47d72e134f3a4c6c7884 -ra80efa8773c3efec54ba44940945b03bc3f3ff7e --- Core/Common/src/Core.Common.Gui/Core.Common.Gui.csproj (.../Core.Common.Gui.csproj) (revision 2afad189e942019ef3da47d72e134f3a4c6c7884) +++ Core/Common/src/Core.Common.Gui/Core.Common.Gui.csproj (.../Core.Common.Gui.csproj) (revision a80efa8773c3efec54ba44940945b03bc3f3ff7e) @@ -131,11 +131,12 @@ + - - + + Index: Core/Common/src/Core.Common.Gui/IContextMenuBuilderProvider.cs =================================================================== diff -u --- Core/Common/src/Core.Common.Gui/IContextMenuBuilderProvider.cs (revision 0) +++ Core/Common/src/Core.Common.Gui/IContextMenuBuilderProvider.cs (revision a80efa8773c3efec54ba44940945b03bc3f3ff7e) @@ -0,0 +1,22 @@ +using System.Windows.Forms; +using Core.Common.Controls; +using Core.Common.Gui.ContextMenu; + +namespace Core.Common.Gui +{ + /// + /// Interface which describes classes that are able to provide a . + /// + public interface IContextMenuBuilderProvider + { + /// + /// Returns a new for creating a + /// for the given . + /// + /// The to have the + /// create a for. + /// The which can be used to create a + /// for . + ContextMenuBuilder Get(ITreeNode treeNode); + } +} \ No newline at end of file Fisheye: Tag a80efa8773c3efec54ba44940945b03bc3f3ff7e refers to a dead (removed) revision in file `Core/Common/src/Core.Common.Gui/IContextMenuProvider.cs'. Fisheye: No comparison available. Pass `N' to diff? Index: Core/Common/src/Core.Common.Gui/Properties/Resources.Designer.cs =================================================================== diff -u -re388ea76d1d044298cc89156c8744fbea1bcb736 -ra80efa8773c3efec54ba44940945b03bc3f3ff7e --- Core/Common/src/Core.Common.Gui/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision e388ea76d1d044298cc89156c8744fbea1bcb736) +++ Core/Common/src/Core.Common.Gui/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision a80efa8773c3efec54ba44940945b03bc3f3ff7e) @@ -530,6 +530,16 @@ } /// + /// Looks up a localized string similar to Kan geen contextmenu opbouwen voor een lege knoop.. + /// + public static string ContextMenuBuilder_ContextMenuBuilder_Can_not_build_context_menu_for_empty_tree_node { + get { + return ResourceManager.GetString("ContextMenuBuilder_ContextMenuBuilder_Can_not_build_context_menu_for_empty_tree_n" + + "ode", resourceCulture); + } + } + + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// public static System.Drawing.Bitmap control_play { @@ -1113,6 +1123,16 @@ } /// + /// Looks up a localized string similar to Kan geen GUI-afhankelijk element in het contextmenu creëren zonder een GUI.. + /// + public static string GuiContextMenuItemFactory_GuiContextMenuItemFactory_Can_not_create_gui_context_menu_items_without_gui { + get { + return ResourceManager.GetString("GuiContextMenuItemFactory_GuiContextMenuItemFactory_Can_not_create_gui_context_me" + + "nu_items_without_gui", resourceCulture); + } + } + + /// /// Looks up a localized string similar to Exporteren mislukt.. /// public static string GuiExportHandler_ExporterItemUsingFileOpenDialog_Export_failed { Index: Core/Common/src/Core.Common.Gui/Properties/Resources.resx =================================================================== diff -u -re388ea76d1d044298cc89156c8744fbea1bcb736 -ra80efa8773c3efec54ba44940945b03bc3f3ff7e --- Core/Common/src/Core.Common.Gui/Properties/Resources.resx (.../Resources.resx) (revision e388ea76d1d044298cc89156c8744fbea1bcb736) +++ Core/Common/src/Core.Common.Gui/Properties/Resources.resx (.../Resources.resx) (revision a80efa8773c3efec54ba44940945b03bc3f3ff7e) @@ -860,4 +860,10 @@ Klap deze knoop en al zijn kinderen uit. + + Kan geen contextmenu opbouwen voor een lege knoop. + + + Kan geen GUI-afhankelijk element in het contextmenu creëren zonder een GUI. + \ No newline at end of file Index: Core/Common/src/Core.Common.Gui/RingtoetsGui.cs =================================================================== diff -u -re388ea76d1d044298cc89156c8744fbea1bcb736 -ra80efa8773c3efec54ba44940945b03bc3f3ff7e --- Core/Common/src/Core.Common.Gui/RingtoetsGui.cs (.../RingtoetsGui.cs) (revision e388ea76d1d044298cc89156c8744fbea1bcb736) +++ Core/Common/src/Core.Common.Gui/RingtoetsGui.cs (.../RingtoetsGui.cs) (revision a80efa8773c3efec54ba44940945b03bc3f3ff7e) @@ -33,7 +33,7 @@ /// /// Gui class provides graphical user functionality for a given IApplication. /// - public class RingtoetsGui : IGui, IContextMenuProvider, IDisposable + public class RingtoetsGui : IGui, IContextMenuBuilderProvider, IDisposable { public event EventHandler SelectionChanged; // TODO: make it weak @@ -1072,9 +1072,9 @@ Dispose(false); } - public ContextMenuBuilder Get(ITreeNode obj) + public ContextMenuBuilder Get(ITreeNode treeNode) { - return new ContextMenuBuilder(this, obj); + return new ContextMenuBuilder(this, treeNode); } } } \ No newline at end of file Index: Core/Common/test/Core.Common.Gui.Test/ContextMenu/ContextMenuBuilderTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.Gui.Test/ContextMenu/ContextMenuBuilderTest.cs (revision 0) +++ Core/Common/test/Core.Common.Gui.Test/ContextMenu/ContextMenuBuilderTest.cs (revision a80efa8773c3efec54ba44940945b03bc3f3ff7e) @@ -0,0 +1,219 @@ +using System; +using System.Windows.Forms; +using Core.Common.Base; +using Core.Common.Controls; +using Core.Common.Gui.ContextMenu; +using Core.Common.Gui.Properties; +using Core.Common.TestUtils; +using NUnit.Framework; +using Rhino.Mocks; + +namespace Core.Common.Gui.Tests.ContextMenu +{ + [TestFixture] + public class ContextMenuBuilderTest + { + private MockRepository mocks; + + [SetUp] + public void SetUp() + { + mocks = new MockRepository(); + } + + [Test] + public void Constructor_NoTreeNode_ThrowsArgumentNullException() + { + // Call + TestDelegate test = () => new ContextMenuBuilder(null, null); + + // Assert + Assert.Throws(test); + + } + + [Test] + public void Constructor_NoGui_NewInstance() + { + // Call + var builder = new ContextMenuBuilder(null, MockRepository.GenerateMock()); + + // Assert + Assert.IsInstanceOf(builder); + } + + [Test] + public void Constructor_Gui_NewInstance() + { + // Call + var builder = new ContextMenuBuilder(MockRepository.GenerateMock(), MockRepository.GenerateMock()); + + // Assert + Assert.IsInstanceOf(builder); + } + + [Test] + public void Build_NothingAdded_EmptyContextMenu() + { + // Setup + var builder = new ContextMenuBuilder(null, MockRepository.GenerateMock()); + + // Call + var result = builder.Build(); + + // Assert + Assert.IsInstanceOf(result); + CollectionAssert.IsEmpty(result.Items); + } + + [Test] + public void AddExpandAllItem_WhenBuild_ItemAddedToContextMenu() + { + // Setup + var builder = new ContextMenuBuilder(null, MockRepository.GenerateMock()); + + // Call + var result = builder.AddExpandAllItem().Build(); + + // Assert + Assert.IsInstanceOf(result); + Assert.AreEqual(1, result.Items.Count); + + var expandAllItem = result.Items[0]; + Assert.AreEqual(Resources.Expand_all, expandAllItem.Text); + Assert.AreEqual(Resources.Expand_all_ToolTip, expandAllItem.ToolTipText); + TestHelper.AssertImagesAreEqual(Resources.ExpandAllIcon, expandAllItem.Image); + } + + [Test] + public void AddCollapseAllItem_WhenBuild_ItemAddedToContextMenu() + { + // Setup + var builder = new ContextMenuBuilder(null, MockRepository.GenerateMock()); + + // Call + var result = builder.AddCollapseAllItem().Build(); + + // Assert + Assert.IsInstanceOf(result); + Assert.AreEqual(1, result.Items.Count); + + var collapseAll = result.Items[0]; + Assert.AreEqual(Resources.Collapse_all, collapseAll.Text); + Assert.AreEqual(Resources.Collapse_all_ToolTip, collapseAll.ToolTipText); + TestHelper.AssertImagesAreEqual(Resources.CollapseAllIcon, collapseAll.Image); + } + + [Test] + public void AddExportItem_WithoutGuiWhenBuild_ContextMenuEmpty() + { + // Setup + var builder = new ContextMenuBuilder(null, MockRepository.GenerateMock()); + + // Call + var result = builder.AddExportItem().Build(); + + // Assert + Assert.IsInstanceOf(result); + Assert.IsEmpty(result.Items); + } + + [Test] + public void AddExportItem_WithGuiWhenBuild_ItemAddedToContextMenu() + { + // Setup + var guiStub = mocks.StrictMock(); + guiStub.Expect(g => g.ApplicationCore).Return(new ApplicationCore()); + guiStub.Expect(g => g.Plugins).Return(new GuiPlugin[0]); + var builder = new ContextMenuBuilder(guiStub, MockRepository.GenerateMock()); + + // Call + var result = builder.AddExportItem().Build(); + + // Assert + Assert.IsInstanceOf(result); + Assert.AreEqual(1, result.Items.Count); + + var export = result.Items[0]; + Assert.AreEqual(Resources.Export, export.Text); + Assert.AreEqual(Resources.Export_ToolTip, export.ToolTipText); + TestHelper.AssertImagesAreEqual(Resources.ExportIcon, export.Image); + } + + [Test] + public void AddImportItem_WithoutGuiWhenBuild_ContextMenuEmpty() + { + // Setup + var builder = new ContextMenuBuilder(null, MockRepository.GenerateMock()); + + // Call + var result = builder.AddImportItem().Build(); + + // Assert + Assert.IsInstanceOf(result); + Assert.IsEmpty(result.Items); + } + + [Test] + public void AddImportItem_WithGuiWhenBuild_ItemAddedToContextMenu() + { + // Setup + var guiStub = mocks.StrictMock(); + guiStub.Expect(g => g.ApplicationCore).Return(new ApplicationCore()); + guiStub.Expect(g => g.Plugins).Return(new GuiPlugin[0]); + var builder = new ContextMenuBuilder(guiStub, MockRepository.GenerateMock()); + + // Call + var result = builder.AddImportItem().Build(); + + // Assert + Assert.IsInstanceOf(result); + Assert.AreEqual(1, result.Items.Count); + + var import = result.Items[0]; + Assert.AreEqual(Resources.Import, import.Text); + Assert.AreEqual(Resources.Import_ToolTip, import.ToolTipText); + TestHelper.AssertImagesAreEqual(Resources.ImportIcon, import.Image); + } + + [Test] + public void AddPropertiesItem_WithoutGuiWhenBuild_ContextMenuEmpty() + { + // Setup + var builder = new ContextMenuBuilder(null, MockRepository.GenerateMock()); + + // Call + var result = builder.AddPropertiesItem().Build(); + + // Assert + Assert.IsInstanceOf(result); + Assert.IsEmpty(result.Items); + } + + [Test] + public void AddPropertiesItem_WithGuiWhenBuild_ItemAddedToContextMenu() + { + // Setup + var guiStub = mocks.StrictMock(); + guiStub.Expect(g => g.Plugins).Return(new GuiPlugin[0]); + guiStub.Expect(g => g.CommandHandler).Return(null); + var builder = new ContextMenuBuilder(guiStub, MockRepository.GenerateMock()); + + mocks.ReplayAll(); + + // Call + var result = builder.AddPropertiesItem().Build(); + + // Assert + Assert.IsInstanceOf(result); + Assert.AreEqual(1, result.Items.Count); + + var properties = result.Items[0]; + Assert.AreEqual(Resources.Properties, properties.Text); + Assert.AreEqual(Resources.Properties_ToolTip, properties.ToolTipText); + TestHelper.AssertImagesAreEqual(Resources.PropertiesIcon, properties.Image); + + mocks.VerifyAll(); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.Gui.Test/ContextMenu/GuiContextMenuItemFactoryTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.Gui.Test/ContextMenu/GuiContextMenuItemFactoryTest.cs (revision 0) +++ Core/Common/test/Core.Common.Gui.Test/ContextMenu/GuiContextMenuItemFactoryTest.cs (revision a80efa8773c3efec54ba44940945b03bc3f3ff7e) @@ -0,0 +1,260 @@ +using System.Collections.Generic; +using Core.Common.Base; +using Core.Common.Controls; +using Core.Common.Gui.ContextMenu; +using Core.Common.TestUtils; +using NUnit.Framework; +using Rhino.Mocks; + +namespace Core.Common.Gui.Tests.ContextMenu +{ + [TestFixture] + public class ContextMenuItemFactoryTest + { + private MockRepository mocks; + private readonly IList pluginList = new GuiPlugin[] + { + new TestGuiPlugin() + }; + + [SetUp] + public void SetUp() + { + mocks = new MockRepository(); + } + + [Test] + public void CreateExportItem_NoImportersForType_Disabled() + { + // Setup + var guiMock = mocks.StrictMock(); + var treeNodeMock = mocks.Stub(); + treeNodeMock.Tag = ""; + var applicationCore = new ApplicationCore(); + applicationCore.AddPlugin(new TestApplicationPlugin(mocks)); + guiMock.Expect(g => g.ApplicationCore).Return(applicationCore); + var contextMenuFactory = new GuiContextMenuItemFactory(guiMock); + + mocks.ReplayAll(); + + // Call + var item = contextMenuFactory.CreateExportItem(treeNodeMock); + + // Assert + Assert.AreEqual(Properties.Resources.Export, item.Text); + Assert.AreEqual(Properties.Resources.Export_ToolTip, item.ToolTipText); + TestHelper.AssertImagesAreEqual(Properties.Resources.ExportIcon, item.Image); + Assert.IsFalse(item.Enabled); + } + + [Test] + public void CreateExportItem_ImportersForType_Enabled() + { + // Setup + var guiMock = mocks.StrictMock(); + var treeNodeMock = mocks.Stub(); + treeNodeMock.Tag = 0; + var applicationCore = new ApplicationCore(); + applicationCore.AddPlugin(new TestApplicationPlugin(mocks)); + guiMock.Expect(g => g.ApplicationCore).Return(applicationCore); + var contextMenuFactory = new GuiContextMenuItemFactory(guiMock); + + mocks.ReplayAll(); + + // Call + var item = contextMenuFactory.CreateExportItem(treeNodeMock); + + // Assert + Assert.AreEqual(Properties.Resources.Export, item.Text); + Assert.AreEqual(Properties.Resources.Export_ToolTip, item.ToolTipText); + TestHelper.AssertImagesAreEqual(Properties.Resources.ExportIcon, item.Image); + Assert.IsTrue(item.Enabled); + } + + [Test] + public void CreateImportItem_NoImportersForType_Disabled() + { + // Setup + var guiMock = mocks.StrictMock(); + var treeNodeMock = mocks.Stub(); + treeNodeMock.Tag = ""; + var applicationCore = new ApplicationCore(); + applicationCore.AddPlugin(new TestApplicationPlugin(mocks)); + guiMock.Expect(g => g.ApplicationCore).Return(applicationCore); + var contextMenuFactory = new GuiContextMenuItemFactory(guiMock); + + mocks.ReplayAll(); + + // Call + var item = contextMenuFactory.CreateImportItem(treeNodeMock); + + // Assert + Assert.AreEqual(Properties.Resources.Import, item.Text); + Assert.AreEqual(Properties.Resources.Import_ToolTip, item.ToolTipText); + TestHelper.AssertImagesAreEqual(Properties.Resources.ImportIcon, item.Image); + Assert.IsFalse(item.Enabled); + } + + [Test] + public void CreateImportItem_ImportersForType_Enabled() + { + // Setup + var guiMock = mocks.StrictMock(); + var treeNodeMock = mocks.Stub(); + treeNodeMock.Tag = 0; + var applicationCore = new ApplicationCore(); + applicationCore.AddPlugin(new TestApplicationPlugin(mocks)); + guiMock.Expect(g => g.ApplicationCore).Return(applicationCore); + var contextMenuFactory = new GuiContextMenuItemFactory(guiMock); + + mocks.ReplayAll(); + + // Call + var item = contextMenuFactory.CreateImportItem(treeNodeMock); + + // Assert + Assert.AreEqual(Properties.Resources.Import, item.Text); + Assert.AreEqual(Properties.Resources.Import_ToolTip, item.ToolTipText); + TestHelper.AssertImagesAreEqual(Properties.Resources.ImportIcon, item.Image); + Assert.IsTrue(item.Enabled); + } + + [Test] + public void CreatePropertiesItem_PropertieInfoForType_Enabled() + { + // Setup + var guiMock = mocks.StrictMock(); + var treeNodeMock = mocks.Stub(); + treeNodeMock.Tag = 0; + guiMock.Expect(g => g.Plugins).Return(pluginList); + guiMock.Expect(g => g.CommandHandler).Return(null); + var contextMenuFactory = new GuiContextMenuItemFactory(guiMock); + + mocks.ReplayAll(); + + // Call + var item = contextMenuFactory.CreatePropertiesItem(treeNodeMock); + + // Assert + Assert.AreEqual(Properties.Resources.Properties, item.Text); + Assert.AreEqual(Properties.Resources.Properties_ToolTip, item.ToolTipText); + TestHelper.AssertImagesAreEqual(Properties.Resources.PropertiesIcon, item.Image); + Assert.IsTrue(item.Enabled); + + mocks.VerifyAll(); + } + + [Test] + public void CreatePropertiesItem_NoPropertieInfoForType_Disabled() + { + // Setup + var guiMock = mocks.StrictMock(); + var treeNodeMock = mocks.Stub(); + treeNodeMock.Tag = ""; + guiMock.Expect(g => g.Plugins).Return(pluginList); + guiMock.Expect(g => g.CommandHandler).Return(null); + var contextMenuFactory = new GuiContextMenuItemFactory(guiMock); + + mocks.ReplayAll(); + + // Call + var item = contextMenuFactory.CreatePropertiesItem(treeNodeMock); + + // Assert + Assert.AreEqual(Properties.Resources.Properties, item.Text); + Assert.AreEqual(Properties.Resources.Properties_ToolTip, item.ToolTipText); + TestHelper.AssertImagesAreEqual(Properties.Resources.PropertiesIcon, item.Image); + Assert.IsFalse(item.Enabled); + + mocks.VerifyAll(); + } + + [Test] + public void CreatePropertiesItem_ClickWithoutHandler_NoExceptions() + { + // Setup + var guiMock = mocks.StrictMock(); + var treeNodeMock = mocks.Stub(); + treeNodeMock.Tag = 0; + guiMock.Expect(g => g.Plugins).Return(pluginList); + guiMock.Expect(g => g.CommandHandler).Return(null); + var contextMenuFactory = new GuiContextMenuItemFactory(guiMock); + + mocks.ReplayAll(); + + var item = contextMenuFactory.CreatePropertiesItem(treeNodeMock); + + // Call & Assert + item.PerformClick(); + + mocks.VerifyAll(); + } + + [Test] + public void CreatePropertiesItem_ClickWithHandler_NoExceptions() + { + // Setup + var guiMock = mocks.StrictMock(); + var treeNodeMock = mocks.Stub(); + treeNodeMock.Tag = 0; + var commandHandlerMock = mocks.StrictMock(); + guiMock.Expect(g => g.Plugins).Return(pluginList); + guiMock.Expect(g => g.CommandHandler).Return(commandHandlerMock); + commandHandlerMock.Expect(ch => ch.ShowProperties()); + var contextMenuFactory = new GuiContextMenuItemFactory(guiMock); + + mocks.ReplayAll(); + + var item = contextMenuFactory.CreatePropertiesItem(treeNodeMock); + + // Call & Assert + item.PerformClick(); + + mocks.VerifyAll(); + } + } + + public class TestApplicationPlugin : ApplicationPlugin + { + private readonly IFileExporter exporterMock; + private readonly IFileImporter importerMock; + + public TestApplicationPlugin(MockRepository mocks) + { + var typeList = new[] + { + 0.GetType(), + "".GetType() + }; + exporterMock = mocks.DynamicMock(); + exporterMock.Expect(e => e.CanExportFor(0)).Return(true); + exporterMock.Expect(e => e.CanExportFor("")).Return(false); + exporterMock.Expect(e => e.SourceTypes()).Return(typeList); + importerMock = mocks.DynamicMock(); + importerMock.Expect(e => e.CanImportOn(0)).Return(true); + importerMock.Expect(e => e.CanImportOn("")).Return(false); + importerMock.Expect(e => e.SupportedItemTypes).Return(typeList); + } + + public override IEnumerable GetFileExporters() + { + yield return exporterMock; + } + + public override IEnumerable GetFileImporters() + { + yield return importerMock; + } + } + + public class TestGuiPlugin : GuiPlugin + { + public override IEnumerable GetPropertyInfos() + { + yield return new PropertyInfo + { + ObjectType = typeof(int) + }; + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.Gui.Test/ContextMenu/TreeViewContextMenuItemFactoryTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.Gui.Test/ContextMenu/TreeViewContextMenuItemFactoryTest.cs (revision 0) +++ Core/Common/test/Core.Common.Gui.Test/ContextMenu/TreeViewContextMenuItemFactoryTest.cs (revision a80efa8773c3efec54ba44940945b03bc3f3ff7e) @@ -0,0 +1,71 @@ +using Core.Common.Controls; +using Core.Common.Gui.ContextMenu; +using Core.Common.Gui.Properties; +using Core.Common.TestUtils; +using NUnit.Framework; +using Rhino.Mocks; + +namespace Core.Common.Gui.Tests.ContextMenu +{ + [TestFixture] + public class TreeViewContextMenuItemFactoryTest + { + private MockRepository mocks; + + [SetUp] + public void SetUp() + { + mocks = new MockRepository(); + } + + [Test] + public void CreateExpandAllItem_Always_ItemWithExpandFunction() + { + // Setup + var treeNodeMock = mocks.StrictMock(); + var treeViewMock = mocks.StrictMock(); + treeNodeMock.Expect(tn => tn.TreeView).Return(treeViewMock); + treeViewMock.Expect(tv => tv.ExpandAll(treeNodeMock)); + + mocks.ReplayAll(); + + var factory = new TreeViewContextMenuItemFactory(); + + // Call + var item = factory.CreateExpandAllItem(treeNodeMock); + item.PerformClick(); + + // Assert + Assert.AreEqual(item.Text, Resources.Expand_all); + Assert.AreEqual(item.ToolTipText, Resources.Expand_all_ToolTip); + TestHelper.AssertImagesAreEqual(item.Image, Resources.ExpandAllIcon); + + mocks.VerifyAll(); + } + + [Test] + public void CreateCollapseAllItem_Always_ItemWithCollapseFunction() + { + // Setup + var treeNodeMock = mocks.StrictMock(); + var treeViewMock = mocks.StrictMock(); + treeNodeMock.Expect(tn => tn.TreeView).Return(treeViewMock); + treeViewMock.Expect(tv => tv.CollapseAll(treeNodeMock)); + + mocks.ReplayAll(); + + var factory = new TreeViewContextMenuItemFactory(); + + // Call + var item = factory.CreateCollapseAllItem(treeNodeMock); + item.PerformClick(); + + // Assert + Assert.AreEqual(item.Text, Resources.Collapse_all); + Assert.AreEqual(item.ToolTipText, Resources.Collapse_all_ToolTip); + TestHelper.AssertImagesAreEqual(item.Image, Resources.CollapseAllIcon); + + mocks.VerifyAll(); + } + } +} \ No newline at end of file Fisheye: Tag a80efa8773c3efec54ba44940945b03bc3f3ff7e refers to a dead (removed) revision in file `Core/Common/test/Core.Common.Gui.Test/ContextMenuItemFactoryTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Index: Core/Common/test/Core.Common.Gui.Test/Core.Common.Gui.Tests.csproj =================================================================== diff -u -r2f3973a8a6122be9d4c0a0db7a27dc3ca68580e3 -ra80efa8773c3efec54ba44940945b03bc3f3ff7e --- Core/Common/test/Core.Common.Gui.Test/Core.Common.Gui.Tests.csproj (.../Core.Common.Gui.Tests.csproj) (revision 2f3973a8a6122be9d4c0a0db7a27dc3ca68580e3) +++ Core/Common/test/Core.Common.Gui.Test/Core.Common.Gui.Tests.csproj (.../Core.Common.Gui.Tests.csproj) (revision a80efa8773c3efec54ba44940945b03bc3f3ff7e) @@ -54,7 +54,9 @@ - + + + Index: Ringtoets/Integration/src/Ringtoets.Integration.Forms/NodePresenters/FailureMechanismNodePresenter.cs =================================================================== diff -u -re388ea76d1d044298cc89156c8744fbea1bcb736 -ra80efa8773c3efec54ba44940945b03bc3f3ff7e --- Ringtoets/Integration/src/Ringtoets.Integration.Forms/NodePresenters/FailureMechanismNodePresenter.cs (.../FailureMechanismNodePresenter.cs) (revision e388ea76d1d044298cc89156c8744fbea1bcb736) +++ Ringtoets/Integration/src/Ringtoets.Integration.Forms/NodePresenters/FailureMechanismNodePresenter.cs (.../FailureMechanismNodePresenter.cs) (revision a80efa8773c3efec54ba44940945b03bc3f3ff7e) @@ -15,11 +15,11 @@ { public class FailureMechanismNodePresenter : RingtoetsNodePresenterBase { - private readonly IContextMenuProvider contextMenuProvider; + private readonly IContextMenuBuilderProvider contextMenuBuilderProvider; - public FailureMechanismNodePresenter(IContextMenuProvider contextMenuProvider) + public FailureMechanismNodePresenter(IContextMenuBuilderProvider contextMenuBuilderProvider) { - this.contextMenuProvider = contextMenuProvider; + this.contextMenuBuilderProvider = contextMenuBuilderProvider; } protected override void UpdateNode(ITreeNode parentNode, ITreeNode node, FailureMechanismPlaceholder nodeData) @@ -37,7 +37,7 @@ protected override ContextMenuStrip GetContextMenu(ITreeNode sender, FailureMechanismPlaceholder nodeData) { - ContextMenuBuilder menuBuilder = contextMenuProvider.Get(sender); + ContextMenuBuilder menuBuilder = contextMenuBuilderProvider.Get(sender); var calculateItem = new ToolStripMenuItem { Index: Ringtoets/Integration/src/Ringtoets.Integration.Forms/NodePresenters/PlaceholderWithReadonlyNameNodePresenter.cs =================================================================== diff -u -re388ea76d1d044298cc89156c8744fbea1bcb736 -ra80efa8773c3efec54ba44940945b03bc3f3ff7e --- Ringtoets/Integration/src/Ringtoets.Integration.Forms/NodePresenters/PlaceholderWithReadonlyNameNodePresenter.cs (.../PlaceholderWithReadonlyNameNodePresenter.cs) (revision e388ea76d1d044298cc89156c8744fbea1bcb736) +++ Ringtoets/Integration/src/Ringtoets.Integration.Forms/NodePresenters/PlaceholderWithReadonlyNameNodePresenter.cs (.../PlaceholderWithReadonlyNameNodePresenter.cs) (revision a80efa8773c3efec54ba44940945b03bc3f3ff7e) @@ -17,12 +17,12 @@ public class PlaceholderWithReadonlyNameNodePresenter : RingtoetsNodePresenterBase { private IGuiCommandHandler guiHandler; - private IContextMenuProvider contextMenuProvider; + private IContextMenuBuilderProvider contextMenuBuilderProvider; - public PlaceholderWithReadonlyNameNodePresenter(IContextMenuProvider contextMenuProvider, IGuiCommandHandler guiHandler = null) + public PlaceholderWithReadonlyNameNodePresenter(IContextMenuBuilderProvider contextMenuBuilderProvider, IGuiCommandHandler guiHandler = null) { this.guiHandler = guiHandler; - this.contextMenuProvider = contextMenuProvider; + this.contextMenuBuilderProvider = contextMenuBuilderProvider; } protected override void UpdateNode(ITreeNode parentNode, ITreeNode node, PlaceholderWithReadonlyName nodeData) @@ -43,7 +43,7 @@ protected override ContextMenuStrip GetContextMenu(ITreeNode sender, PlaceholderWithReadonlyName nodeData) { - ContextMenuBuilder menuBuilder = contextMenuProvider.Get(sender); + ContextMenuBuilder menuBuilder = contextMenuBuilderProvider.Get(sender); if (nodeData is InputPlaceholder || nodeData is OutputPlaceholder) { Index: Ringtoets/Integration/src/Ringtoets.Integration.Plugin/RingtoetsGuiPlugin.cs =================================================================== diff -u -re388ea76d1d044298cc89156c8744fbea1bcb736 -ra80efa8773c3efec54ba44940945b03bc3f3ff7e --- Ringtoets/Integration/src/Ringtoets.Integration.Plugin/RingtoetsGuiPlugin.cs (.../RingtoetsGuiPlugin.cs) (revision e388ea76d1d044298cc89156c8744fbea1bcb736) +++ Ringtoets/Integration/src/Ringtoets.Integration.Plugin/RingtoetsGuiPlugin.cs (.../RingtoetsGuiPlugin.cs) (revision a80efa8773c3efec54ba44940945b03bc3f3ff7e) @@ -32,8 +32,8 @@ public override IEnumerable GetProjectTreeViewNodePresenters() { yield return new AssessmentSectionBaseNodePresenter(); - yield return new FailureMechanismNodePresenter((IContextMenuProvider)Gui); - yield return new PlaceholderWithReadonlyNameNodePresenter((IContextMenuProvider)Gui, Gui.CommandHandler); + yield return new FailureMechanismNodePresenter((IContextMenuBuilderProvider)Gui); + yield return new PlaceholderWithReadonlyNameNodePresenter((IContextMenuBuilderProvider)Gui, Gui.CommandHandler); yield return new CategoryTreeFolderNodePresenter(); } } Index: Ringtoets/Integration/test/Ringtoets.Integration.Forms.Test/NodePresenters/FailureMechanismNodePresenterTest.cs =================================================================== diff -u -re388ea76d1d044298cc89156c8744fbea1bcb736 -ra80efa8773c3efec54ba44940945b03bc3f3ff7e --- Ringtoets/Integration/test/Ringtoets.Integration.Forms.Test/NodePresenters/FailureMechanismNodePresenterTest.cs (.../FailureMechanismNodePresenterTest.cs) (revision e388ea76d1d044298cc89156c8744fbea1bcb736) +++ Ringtoets/Integration/test/Ringtoets.Integration.Forms.Test/NodePresenters/FailureMechanismNodePresenterTest.cs (.../FailureMechanismNodePresenterTest.cs) (revision a80efa8773c3efec54ba44940945b03bc3f3ff7e) @@ -1,6 +1,7 @@ using System.Drawing; using System.Linq; using System.Windows.Forms; +using Core.Common.Base; using Core.Common.Controls; using Core.Common.Gui; using Core.Common.Gui.ContextMenu; @@ -36,7 +37,7 @@ public void DefaultConstructor_ExpectedValues() { // Call - var contextMenuProvider = mocks.StrictMock(); + var contextMenuProvider = mocks.StrictMock(); var nodePresenter = new FailureMechanismNodePresenter(contextMenuProvider); // Assert @@ -47,7 +48,7 @@ public void UpdateNode_ValidOutputPlaceholderData_UpdateTreeNode() { // Setup - var contextMenuProvider = mocks.StrictMock(); + var contextMenuProvider = mocks.StrictMock(); var parentNode = mocks.StrictMock(); var nodeToUpdate = mocks.Stub(); mocks.ReplayAll(); @@ -70,7 +71,7 @@ public void CanRenameNode_Always_ReturnFalse() { // Setup - var contextMenuProvider = mocks.StrictMock(); + var contextMenuProvider = mocks.StrictMock(); var nodePresenter = new FailureMechanismNodePresenter(contextMenuProvider); // Call @@ -84,7 +85,7 @@ public void CanRenameTo_Always_ReturnFalse() { // Setup - var contextMenuProvider = mocks.StrictMock(); + var contextMenuProvider = mocks.StrictMock(); var nodePresenter = new FailureMechanismNodePresenter(contextMenuProvider); // Call @@ -98,7 +99,7 @@ public void CanRemove_Always_ReturnFalse() { // Setup - var contextMenuProvider = mocks.StrictMock(); + var contextMenuProvider = mocks.StrictMock(); var nodePresenter = new FailureMechanismNodePresenter(contextMenuProvider); // Call @@ -112,7 +113,7 @@ public void GetChildNodeObjects_Always_ReturnInputAndOutput() { // Setup - var contextMenuProvider = mocks.StrictMock(); + var contextMenuProvider = mocks.StrictMock(); var nodePresenter = new FailureMechanismNodePresenter(contextMenuProvider); var failureMechanism = new FailureMechanismPlaceholder("test"); @@ -142,7 +143,7 @@ { // Setup var nodeMock = mocks.StrictMock(); - var contextMenuProvider = mocks.StrictMock(); + var contextMenuProvider = mocks.StrictMock(); contextMenuProvider.Expect(cmp => cmp.Get(null)).IgnoreArguments().Return(new ContextMenuBuilder(null, nodeMock)); var nodePresenter = new FailureMechanismNodePresenter(contextMenuProvider); @@ -154,11 +155,52 @@ var menu = nodePresenter.GetContextMenu(nodeMock, failureMechanism); // Assert - Assert.AreEqual(3, menu.Items.Count); + Assert.AreEqual(6, menu.Items.Count); TestHelper.AssertContextMenuStripContainsItem(menu, 0, RingtoetsCommonFormsResources.Calculate_all, RingtoetsCommonFormsResources.Calculate_all_ToolTip, RingtoetsCommonFormsResources.CalculateAllIcon, false); TestHelper.AssertContextMenuStripContainsItem(menu, 1, RingtoetsCommonFormsResources.Clear_all_output, RingtoetsCommonFormsResources.Clear_all_output_ToolTip, RingtoetsCommonFormsResources.ClearIcon, false); + TestHelper.AssertContextMenuStripContainsItem(menu, 3, CommonResources.Expand_all, CommonResources.Expand_all_ToolTip, CommonResources.ExpandAllIcon); + TestHelper.AssertContextMenuStripContainsItem(menu, 4, CommonResources.Collapse_all, CommonResources.Collapse_all_ToolTip, CommonResources.CollapseAllIcon); + CollectionAssert.AllItemsAreInstancesOfType(new []{menu.Items[2], menu.Items[5]}, typeof(ToolStripSeparator)); + + mocks.VerifyAll(); + } + + [Test] + public void GetContextMenu_WithGui_ReturnsContextMenuWithCommonItems() + { + // Setup + var nodeMock = mocks.Stub(); + var guiMock = mocks.DynamicMock(); + var guiHandlerMock = mocks.DynamicMock(); + guiMock.Expect(g => g.ApplicationCore).Return(new ApplicationCore()); + guiMock.Expect(g => g.CommandHandler).Return(guiHandlerMock); + guiMock.Expect(g => g.Plugins).Return(new GuiPlugin[0]); + + var contextMenuProvider = mocks.StrictMock(); + contextMenuProvider.Expect(cmp => cmp.Get(null)).IgnoreArguments().Return(new ContextMenuBuilder(guiMock, nodeMock)); + + var nodePresenter = new FailureMechanismNodePresenter(contextMenuProvider); + var failureMechanism = new FailureMechanismPlaceholder("test"); + nodeMock.Tag = failureMechanism; + + mocks.ReplayAll(); + + // Call + var menu = nodePresenter.GetContextMenu(nodeMock, failureMechanism); + + // Assert + Assert.AreEqual(10, menu.Items.Count); + + TestHelper.AssertContextMenuStripContainsItem(menu, 0, RingtoetsCommonFormsResources.Calculate_all, RingtoetsCommonFormsResources.Calculate_all_ToolTip, RingtoetsCommonFormsResources.CalculateAllIcon, false); + TestHelper.AssertContextMenuStripContainsItem(menu, 1, RingtoetsCommonFormsResources.Clear_all_output, RingtoetsCommonFormsResources.Clear_all_output_ToolTip, RingtoetsCommonFormsResources.ClearIcon, false); + TestHelper.AssertContextMenuStripContainsItem(menu, 3, CommonResources.Expand_all, CommonResources.Expand_all_ToolTip, CommonResources.ExpandAllIcon); + TestHelper.AssertContextMenuStripContainsItem(menu, 4, CommonResources.Collapse_all, CommonResources.Collapse_all_ToolTip, CommonResources.CollapseAllIcon); + TestHelper.AssertContextMenuStripContainsItem(menu, 6, CommonResources.Import, CommonResources.Import_ToolTip, CommonResources.ImportIcon, false); + TestHelper.AssertContextMenuStripContainsItem(menu, 7, CommonResources.Export, CommonResources.Export_ToolTip, CommonResources.ExportIcon, false); + TestHelper.AssertContextMenuStripContainsItem(menu, 9, CommonResources.Properties, CommonResources.Properties_ToolTip, CommonResources.PropertiesIcon, false); + CollectionAssert.AllItemsAreInstancesOfType(new []{menu.Items[2]}, typeof(ToolStripSeparator)); mocks.VerifyAll(); Index: Ringtoets/Integration/test/Ringtoets.Integration.Forms.Test/NodePresenters/PlaceholderWithReadonlyNameNodePresenterTest.cs =================================================================== diff -u -re388ea76d1d044298cc89156c8744fbea1bcb736 -ra80efa8773c3efec54ba44940945b03bc3f3ff7e --- Ringtoets/Integration/test/Ringtoets.Integration.Forms.Test/NodePresenters/PlaceholderWithReadonlyNameNodePresenterTest.cs (.../PlaceholderWithReadonlyNameNodePresenterTest.cs) (revision e388ea76d1d044298cc89156c8744fbea1bcb736) +++ Ringtoets/Integration/test/Ringtoets.Integration.Forms.Test/NodePresenters/PlaceholderWithReadonlyNameNodePresenterTest.cs (.../PlaceholderWithReadonlyNameNodePresenterTest.cs) (revision a80efa8773c3efec54ba44940945b03bc3f3ff7e) @@ -17,6 +17,7 @@ using RingtoetsFormsResources = Ringtoets.Integration.Forms.Properties.Resources; using RingtoetsCommonFormsResources = Ringtoets.Common.Forms.Properties.Resources; +using CommonResources = Core.Common.Gui.Properties.Resources; namespace Ringtoets.Integration.Forms.Test.NodePresenters { @@ -35,7 +36,7 @@ public void DefaultConstructor_ExpectedValues() { // Setup - var contextMenuProvider = mocks.StrictMock(); + var contextMenuProvider = mocks.StrictMock(); // Call var nodePresenter = new PlaceholderWithReadonlyNameNodePresenter(contextMenuProvider); @@ -48,7 +49,7 @@ public void UpdateNode_ValidNodeData_UpdateTreeNode() { // Setup - var contextMenuProvider = mocks.StrictMock(); + var contextMenuProvider = mocks.StrictMock(); var parentNode = mocks.StrictMock(); var nodeToUpdate = mocks.Stub(); mocks.ReplayAll(); @@ -71,7 +72,7 @@ public void UpdateNode_ValidInputPlaceholderData_UpdateTreeNode() { // Setup - var contextMenuProvider = mocks.StrictMock(); + var contextMenuProvider = mocks.StrictMock(); var parentNode = mocks.StrictMock(); var nodeToUpdate = mocks.Stub(); mocks.ReplayAll(); @@ -94,7 +95,7 @@ public void UpdateNode_ValidOutputPlaceholderData_UpdateTreeNode() { // Setup - var contextMenuProvider = mocks.StrictMock(); + var contextMenuProvider = mocks.StrictMock(); var parentNode = mocks.StrictMock(); var nodeToUpdate = mocks.Stub(); mocks.ReplayAll(); @@ -117,7 +118,7 @@ public void CanRenameNode_Always_ReturnFalse() { // Setup - var contextMenuProvider = mocks.StrictMock(); + var contextMenuProvider = mocks.StrictMock(); var nodePresenter = new PlaceholderWithReadonlyNameNodePresenter(contextMenuProvider); // Call @@ -131,7 +132,7 @@ public void CanRenamceTo_Always_ReturnFalse() { // Setup - var contextMenuProvider = mocks.StrictMock(); + var contextMenuProvider = mocks.StrictMock(); var nodePresenter = new PlaceholderWithReadonlyNameNodePresenter(contextMenuProvider); // Call @@ -145,7 +146,7 @@ public void CanRemove_Always_ReturnFalse() { // Setup - var contextMenuProvider = mocks.StrictMock(); + var contextMenuProvider = mocks.StrictMock(); var nodePresenter = new PlaceholderWithReadonlyNameNodePresenter(contextMenuProvider); // Call @@ -159,7 +160,7 @@ public void GetChildNodeObjects_Always_ReturnEmptyEnumerable() { // Setup - var contextMenuProvider = mocks.StrictMock(); + var contextMenuProvider = mocks.StrictMock(); var nodePresenter = new PlaceholderWithReadonlyNameNodePresenter(contextMenuProvider); // Call @@ -174,7 +175,7 @@ { // Setup var nodeMock = mocks.StrictMock(); - var contextMenuProvider = mocks.StrictMock(); + var contextMenuProvider = mocks.StrictMock(); contextMenuProvider.Expect(cmp => cmp.Get(null)).IgnoreArguments().Return(new ContextMenuBuilder(null, nodeMock)); ; var nodePresenter = new PlaceholderWithReadonlyNameNodePresenter(contextMenuProvider); @@ -196,7 +197,7 @@ { // Setup var nodeMock = mocks.StrictMock(); - var contextMenuProvider = mocks.StrictMock(); + var contextMenuProvider = mocks.StrictMock(); contextMenuProvider.Expect(cmp => cmp.Get(null)).IgnoreArguments().Return(new ContextMenuBuilder(null, nodeMock)); ; @@ -224,7 +225,7 @@ { // Setup var nodeMock = mocks.StrictMock(); - var contextMenuProvider = mocks.StrictMock(); + var contextMenuProvider = mocks.StrictMock(); contextMenuProvider.Expect(cmp => cmp.Get(null)).IgnoreArguments().Return(new ContextMenuBuilder(null, nodeMock)); @@ -246,5 +247,39 @@ mocks.VerifyAll(); } + + [Test] + public void GetContextMenu_PlaceholderWithReadonlyNameWithGui_ReturnsContextMenuWithItems() + { + // Setup + var nodeMock = mocks.Stub(); + var guiMock = mocks.DynamicMock(); + var guiHandlerMock = mocks.DynamicMock(); + guiMock.Expect(g => g.ApplicationCore).Return(new ApplicationCore()); + guiMock.Expect(g => g.CommandHandler).Return(guiHandlerMock); + guiMock.Expect(g => g.Plugins).Return(new GuiPlugin[0]); + + var contextMenuProvider = mocks.StrictMock(); + contextMenuProvider.Expect(cmp => cmp.Get(null)).IgnoreArguments().Return(new ContextMenuBuilder(guiMock, nodeMock)); + + var nodePresenter = new PlaceholderWithReadonlyNameNodePresenter(contextMenuProvider); + var placeholderData = new PlaceholderWithReadonlyName("test"); + + mocks.ReplayAll(); + + // Call + var menu = nodePresenter.GetContextMenu(nodeMock, placeholderData); + + // Assert + Assert.AreEqual(4, menu.Items.Count); + + TestHelper.AssertContextMenuStripContainsItem(menu, 0, CommonResources.Import, CommonResources.Import_ToolTip, CommonResources.ImportIcon, false); + TestHelper.AssertContextMenuStripContainsItem(menu, 1, CommonResources.Export, CommonResources.Export_ToolTip, CommonResources.ExportIcon, false); + TestHelper.AssertContextMenuStripContainsItem(menu, 3, CommonResources.Properties, CommonResources.Properties_ToolTip, CommonResources.PropertiesIcon, false); + + CollectionAssert.AllItemsAreInstancesOfType(new[] { menu.Items[2] }, typeof(ToolStripSeparator)); + + mocks.VerifyAll(); + } } } \ No newline at end of file Index: Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/RingtoetsGuiPluginTest.cs =================================================================== diff -u -re388ea76d1d044298cc89156c8744fbea1bcb736 -ra80efa8773c3efec54ba44940945b03bc3f3ff7e --- Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/RingtoetsGuiPluginTest.cs (.../RingtoetsGuiPluginTest.cs) (revision e388ea76d1d044298cc89156c8744fbea1bcb736) +++ Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/RingtoetsGuiPluginTest.cs (.../RingtoetsGuiPluginTest.cs) (revision a80efa8773c3efec54ba44940945b03bc3f3ff7e) @@ -55,7 +55,7 @@ var mocks = new MockRepository(); var applicationCore = new ApplicationCore(); - var guiStub = mocks.DynamicMultiMock(typeof(IGui), typeof(IContextMenuProvider)); + var guiStub = mocks.DynamicMultiMock(typeof(IGui), typeof(IContextMenuBuilderProvider)); Expect.Call(guiStub.ApplicationCore).Return(applicationCore).Repeat.Any();