Index: Ringtoets/DuneErosion/src/Ringtoets.DuneErosion.Plugin/DuneErosionPlugin.cs =================================================================== diff -u -rb1b17b2e21cbcffc6fc5f123c83a17cf29f8dced -r4b5d266243d639f335d4026627c9a8f264779f79 --- Ringtoets/DuneErosion/src/Ringtoets.DuneErosion.Plugin/DuneErosionPlugin.cs (.../DuneErosionPlugin.cs) (revision b1b17b2e21cbcffc6fc5f123c83a17cf29f8dced) +++ Ringtoets/DuneErosion/src/Ringtoets.DuneErosion.Plugin/DuneErosionPlugin.cs (.../DuneErosionPlugin.cs) (revision 4b5d266243d639f335d4026627c9a8f264779f79) @@ -20,6 +20,7 @@ // All rights reserved. using System.Collections.Generic; +using System.Windows.Forms; using Core.Common.Controls.TreeView; using Core.Common.Gui.Plugin; using Ringtoets.Common.Forms.TreeNodeInfos; @@ -38,8 +39,8 @@ yield return RingtoetsTreeNodeInfoFactory.CreateFailureMechanismContextTreeNodeInfo( FailureMechanismEnabledChildNodeObjects, FailureMechanismDisabledChildNodeObjects, - null, - null + FailureMechanismEnabledContextMenuStrip, + FailureMechanismDisabledContextMenuStrip ); } @@ -52,9 +53,49 @@ private static object[] FailureMechanismDisabledChildNodeObjects(DuneErosionFailureMechanismContext failureMechanismContext) { - return new object[0]; + return new object[] + { + failureMechanismContext.WrappedData.NotRelevantComments + }; } + private ContextMenuStrip FailureMechanismEnabledContextMenuStrip(DuneErosionFailureMechanismContext closingStructuresFailureMechanismContext, + object parentData, + TreeViewControl treeViewControl) + { + var builder = new RingtoetsContextMenuBuilder(Gui.Get(closingStructuresFailureMechanismContext, treeViewControl)); + + return builder.AddOpenItem() + .AddSeparator() + .AddToggleRelevancyOfFailureMechanismItem(closingStructuresFailureMechanismContext, RemoveAllViewsForItem) + .AddSeparator() + .AddExpandAllItem() + .AddCollapseAllItem() + .AddSeparator() + .AddPropertiesItem() + .Build(); + } + + private ContextMenuStrip FailureMechanismDisabledContextMenuStrip(DuneErosionFailureMechanismContext failureMechanismContext, + object parentData, + TreeViewControl treeViewControl) + { + var builder = new RingtoetsContextMenuBuilder(Gui.Get(failureMechanismContext, + treeViewControl)); + + return builder.AddToggleRelevancyOfFailureMechanismItem(failureMechanismContext, + RemoveAllViewsForItem) + .AddSeparator() + .AddExpandAllItem() + .AddCollapseAllItem() + .Build(); + } + + private void RemoveAllViewsForItem(DuneErosionFailureMechanismContext failureMechanismContext) + { + Gui.ViewCommands.RemoveAllViewsForItem(failureMechanismContext); + } + #endregion } } \ No newline at end of file Index: Ringtoets/DuneErosion/test/Ringtoets.DuneErosion.Forms.Test/Ringtoets.DuneErosion.Forms.Test.csproj =================================================================== diff -u -rb1b17b2e21cbcffc6fc5f123c83a17cf29f8dced -r4b5d266243d639f335d4026627c9a8f264779f79 --- Ringtoets/DuneErosion/test/Ringtoets.DuneErosion.Forms.Test/Ringtoets.DuneErosion.Forms.Test.csproj (.../Ringtoets.DuneErosion.Forms.Test.csproj) (revision b1b17b2e21cbcffc6fc5f123c83a17cf29f8dced) +++ Ringtoets/DuneErosion/test/Ringtoets.DuneErosion.Forms.Test/Ringtoets.DuneErosion.Forms.Test.csproj (.../Ringtoets.DuneErosion.Forms.Test.csproj) (revision 4b5d266243d639f335d4026627c9a8f264779f79) @@ -91,6 +91,10 @@ {F49BD8B2-332A-4C91-A196-8CCE0A2C7D98} Core.Common.Utils + + {26214BD0-DAFB-4CFC-8EB2-80C5D53C859E} + Core.Common.Gui.TestUtil + {D749EE4C-CE50-4C17-BF01-9A953028C126} Core.Common.TestUtil Index: Ringtoets/DuneErosion/test/Ringtoets.DuneErosion.Forms.Test/TreeNodeInfos/DuneErosionFailureMechanismContextTreeNodeInfoTest.cs =================================================================== diff -u -rb1b17b2e21cbcffc6fc5f123c83a17cf29f8dced -r4b5d266243d639f335d4026627c9a8f264779f79 --- Ringtoets/DuneErosion/test/Ringtoets.DuneErosion.Forms.Test/TreeNodeInfos/DuneErosionFailureMechanismContextTreeNodeInfoTest.cs (.../DuneErosionFailureMechanismContextTreeNodeInfoTest.cs) (revision b1b17b2e21cbcffc6fc5f123c83a17cf29f8dced) +++ Ringtoets/DuneErosion/test/Ringtoets.DuneErosion.Forms.Test/TreeNodeInfos/DuneErosionFailureMechanismContextTreeNodeInfoTest.cs (.../DuneErosionFailureMechanismContextTreeNodeInfoTest.cs) (revision 4b5d266243d639f335d4026627c9a8f264779f79) @@ -20,17 +20,30 @@ // All rights reserved. using System.Linq; +using System.Windows.Forms; using Core.Common.Controls.TreeView; +using Core.Common.Gui; +using Core.Common.Gui.Commands; +using Core.Common.Gui.ContextMenu; +using Core.Common.Gui.TestUtil.ContextMenu; +using Core.Common.TestUtil; using NUnit.Framework; using Rhino.Mocks; +using Ringtoets.Common.Data; +using Ringtoets.Common.Data.AssessmentSection; +using Ringtoets.DuneErosion.Data; using Ringtoets.DuneErosion.Forms.PresentationObjects; using Ringtoets.DuneErosion.Plugin; +using RingtoetsCommonFormsResources = Ringtoets.Common.Forms.Properties.Resources; namespace Ringtoets.DuneErosion.Forms.Test.TreeNodeInfos { [TestFixture] public class DuneErosionFailureMechanismContextTreeNodeInfoTest { + private const int contextMenuRelevancyIndexWhenRelevant = 2; + private const int contextMenuRelevancyIndexWhenNotRelevant = 0; + private MockRepository mocksRepository; private DuneErosionPlugin plugin; private TreeNodeInfo info; @@ -77,5 +90,232 @@ Assert.IsNull(info.CanInsert); Assert.IsNull(info.OnDrop); } + + [Test] + public void ChildNodeObjects_FailureMechanismIsNotRelevant_ReturnOnlyFailureMechanismNotRelevantComments() + { + // Setup + var assessmentSectionStub = mocksRepository.Stub(); + mocksRepository.ReplayAll(); + + var failureMechanism = new DuneErosionFailureMechanism + { + IsRelevant = false + }; + var failureMechanismContext = new DuneErosionFailureMechanismContext(failureMechanism, assessmentSectionStub); + + // Call + var children = info.ChildNodeObjects(failureMechanismContext).ToArray(); + + // Assert + Assert.AreEqual(1, children.Length); + var comment = (Comment)children[0]; + Assert.AreSame(failureMechanism.NotRelevantComments, comment); + } + + [Test] + public void ContextMenuStrip_FailureMechanismIsRelevant_CallsContextMenuBuilderMethods() + { + // Setup + var failureMechanism = new DuneErosionFailureMechanism(); + var assessmentSectionMock = mocksRepository.Stub(); + var failureMechanismContext = new DuneErosionFailureMechanismContext(failureMechanism, assessmentSectionMock); + var guiMock = mocksRepository.StrictMock(); + var menuBuilderMock = mocksRepository.StrictMock(); + + menuBuilderMock.Expect(mb => mb.AddOpenItem()).Return(menuBuilderMock); + menuBuilderMock.Expect(mb => mb.AddSeparator()).Return(menuBuilderMock); + menuBuilderMock.Expect(mb => mb.AddCustomItem(null)).IgnoreArguments().Return(menuBuilderMock); + menuBuilderMock.Expect(mb => mb.AddSeparator()).Return(menuBuilderMock); + menuBuilderMock.Expect(mb => mb.AddExpandAllItem()).Return(menuBuilderMock); + menuBuilderMock.Expect(mb => mb.AddCollapseAllItem()).Return(menuBuilderMock); + menuBuilderMock.Expect(mb => mb.AddSeparator()).Return(menuBuilderMock); + menuBuilderMock.Expect(mb => mb.AddPropertiesItem()).Return(menuBuilderMock); + menuBuilderMock.Expect(mb => mb.Build()).Return(null); + + using (var treeViewControl = new TreeViewControl()) + { + guiMock.Expect(cmp => cmp.Get(failureMechanismContext, treeViewControl)).Return(menuBuilderMock); + mocksRepository.ReplayAll(); + + plugin.Gui = guiMock; + + // Call + info.ContextMenuStrip(failureMechanismContext, null, treeViewControl); + } + + // Assert + // Assert is done in TearDown + } + + [Test] + public void ContextMenuStrip_FailureMechanismIsNotRelevant_CallsContextMenuBuilderMethods() + { + // Setup + var failureMechanism = new DuneErosionFailureMechanism + { + IsRelevant = false + }; + var assessmentSectionMock = mocksRepository.Stub(); + var failureMechanismContext = new DuneErosionFailureMechanismContext(failureMechanism, assessmentSectionMock); + var guiMock = mocksRepository.StrictMock(); + var menuBuilderMock = mocksRepository.StrictMock(); + + menuBuilderMock.Expect(mb => mb.AddCustomItem(null)).IgnoreArguments().Return(menuBuilderMock); + menuBuilderMock.Expect(mb => mb.AddSeparator()).Return(menuBuilderMock); + menuBuilderMock.Expect(mb => mb.AddExpandAllItem()).Return(menuBuilderMock); + menuBuilderMock.Expect(mb => mb.AddCollapseAllItem()).Return(menuBuilderMock); + menuBuilderMock.Expect(mb => mb.Build()).Return(null); + + using (var treeViewControl = new TreeViewControl()) + { + guiMock.Expect(cmp => cmp.Get(failureMechanismContext, treeViewControl)).Return(menuBuilderMock); + mocksRepository.ReplayAll(); + + plugin.Gui = guiMock; + + // Call + info.ContextMenuStrip(failureMechanismContext, null, treeViewControl); + } + + // Assert + // Assert is done in TearDown + } + + [Test] + public void ContextMenuStrip_FailureMechanismIsRelevant_AddCustomItems() + { + // Setup + using (var treeView = new TreeViewControl()) + { + var assessmentSectionMock = mocksRepository.Stub(); + var failureMechanism = new DuneErosionFailureMechanism(); + var failureMechanismContext = new DuneErosionFailureMechanismContext(failureMechanism, assessmentSectionMock); + var menuBuilder = new CustomItemsOnlyContextMenuBuilder(); + var guiMock = mocksRepository.StrictMock(); + + guiMock.Expect(cmp => cmp.Get(failureMechanismContext, treeView)).Return(menuBuilder); + guiMock.Stub(g => g.ProjectOpened += null).IgnoreArguments(); + guiMock.Stub(g => g.ProjectOpened -= null).IgnoreArguments(); + + mocksRepository.ReplayAll(); + plugin.Gui = guiMock; + + // Call + using (ContextMenuStrip menu = info.ContextMenuStrip(failureMechanismContext, assessmentSectionMock, treeView)) + { + // Assert + Assert.AreEqual(8, menu.Items.Count); + + TestHelper.AssertContextMenuStripContainsItem(menu, contextMenuRelevancyIndexWhenRelevant, + "I&s relevant", + "Geeft aan of dit toetsspoor relevant is of niet.", + RingtoetsCommonFormsResources.Checkbox_ticked); + } + } + } + + [Test] + public void ContextMenuStrip_FailureMechanismIsNotRelevant_AddCustomItems() + { + // Setup + using (var treeView = new TreeViewControl()) + { + var assessmentSectionMock = mocksRepository.Stub(); + var failureMechanism = new DuneErosionFailureMechanism + { + IsRelevant = false + }; + var failureMechanismContext = new DuneErosionFailureMechanismContext(failureMechanism, assessmentSectionMock); + var menuBuilder = new CustomItemsOnlyContextMenuBuilder(); + var guiMock = mocksRepository.StrictMock(); + + guiMock.Expect(cmp => cmp.Get(failureMechanismContext, treeView)).Return(menuBuilder); + guiMock.Stub(g => g.ProjectOpened += null).IgnoreArguments(); + guiMock.Stub(g => g.ProjectOpened -= null).IgnoreArguments(); + + mocksRepository.ReplayAll(); + plugin.Gui = guiMock; + + // Call + using (ContextMenuStrip menu = info.ContextMenuStrip(failureMechanismContext, assessmentSectionMock, treeView)) + { + // Assert + Assert.AreEqual(4, menu.Items.Count); + + TestHelper.AssertContextMenuStripContainsItem(menu, contextMenuRelevancyIndexWhenNotRelevant, + "I&s relevant", + "Geeft aan of dit toetsspoor relevant is of niet.", + RingtoetsCommonFormsResources.Checkbox_empty); + } + } + } + + [Test] + public void ContextMenuStrip_FailureMechanismIsRelevantAndClickOnIsRelevantItem_MakeFailureMechanismNotRelevantAndRemovesAllViewsForItem() + { + // Setup + var failureMechanism = new DuneErosionFailureMechanism(); + var assessmentSectionStub = mocksRepository.Stub(); + var failureMechanismContext = new DuneErosionFailureMechanismContext(failureMechanism, assessmentSectionStub); + var viewCommandsMock = mocksRepository.StrictMock(); + var menuBuilder = new CustomItemsOnlyContextMenuBuilder(); + var guiMock = mocksRepository.StrictMock(); + + viewCommandsMock.Expect(vs => vs.RemoveAllViewsForItem(failureMechanismContext)); + guiMock.Stub(g => g.ViewCommands).Return(viewCommandsMock); + + using (var treeViewControl = new TreeViewControl()) + { + guiMock.Expect(g => g.Get(failureMechanismContext, treeViewControl)).Return(menuBuilder); + + mocksRepository.ReplayAll(); + plugin.Gui = guiMock; + + using (ContextMenuStrip contextMenu = info.ContextMenuStrip(failureMechanismContext, null, treeViewControl)) + { + // Call + contextMenu.Items[contextMenuRelevancyIndexWhenRelevant].PerformClick(); + + // Assert + Assert.IsFalse(failureMechanism.IsRelevant); + } + } + } + + [Test] + public void ContextMenuStrip_FailureMechanismIsNotRelevantAndClickOnIsRelevantItem_MakeFailureMechanismRelevantAndRemovesAllViewsForItem() + { + // Setup + var failureMechanism = new DuneErosionFailureMechanism + { + IsRelevant = false + }; + var assessmentSectionStub = mocksRepository.Stub(); + var failureMechanismContext = new DuneErosionFailureMechanismContext(failureMechanism, assessmentSectionStub); + var viewCommandsMock = mocksRepository.StrictMock(); + var menuBuilder = new CustomItemsOnlyContextMenuBuilder(); + var guiMock = mocksRepository.StrictMock(); + + viewCommandsMock.Expect(vs => vs.RemoveAllViewsForItem(failureMechanismContext)); + guiMock.Stub(g => g.ViewCommands).Return(viewCommandsMock); + + using (var treeViewControl = new TreeViewControl()) + { + guiMock.Expect(g => g.Get(failureMechanismContext, treeViewControl)).Return(menuBuilder); + + mocksRepository.ReplayAll(); + plugin.Gui = guiMock; + + using (ContextMenuStrip contextMenu = info.ContextMenuStrip(failureMechanismContext, null, treeViewControl)) + { + // Call + contextMenu.Items[contextMenuRelevancyIndexWhenNotRelevant].PerformClick(); + + // Assert + Assert.IsTrue(failureMechanism.IsRelevant); + } + } + } } } \ No newline at end of file