Index: src/Plugins/Wti/Wti.Data/PipingFailureMechanism.cs =================================================================== diff -u -r49b7320ad56bfa60788e8792b79dd537318f68ff -r5f7007ed48dccd78b0a07db987bf234a6705ec9b --- src/Plugins/Wti/Wti.Data/PipingFailureMechanism.cs (.../PipingFailureMechanism.cs) (revision 49b7320ad56bfa60788e8792b79dd537318f68ff) +++ src/Plugins/Wti/Wti.Data/PipingFailureMechanism.cs (.../PipingFailureMechanism.cs) (revision 5f7007ed48dccd78b0a07db987bf234a6705ec9b) @@ -26,7 +26,7 @@ public IEnumerable SurfaceLines { get; private set; } /// - /// Gets the input data which contains input and output of a piping calculation + /// Gets the , which contains input and output of a piping calculation. /// public PipingData PipingData { get; set; } Index: src/Plugins/Wti/Wti.Data/WtiProject.cs =================================================================== diff -u -r197fbe469c4b157c584994358432370a45110bff -r5f7007ed48dccd78b0a07db987bf234a6705ec9b --- src/Plugins/Wti/Wti.Data/WtiProject.cs (.../WtiProject.cs) (revision 197fbe469c4b157c584994358432370a45110bff) +++ src/Plugins/Wti/Wti.Data/WtiProject.cs (.../WtiProject.cs) (revision 5f7007ed48dccd78b0a07db987bf234a6705ec9b) @@ -20,15 +20,31 @@ } /// + /// Gets or sets the . + /// + public PipingFailureMechanism PipingFailureMechanism { get; private set; } + + /// /// The name of the . /// public string Name { get; set; } /// - /// Gets or sets the . + /// Removes the assigned to the . /// - public PipingFailureMechanism PipingFailureMechanism { get; set; } + public void ClearPipingFailureMechanism() + { + PipingFailureMechanism = null; + } + /// + /// Creates a new and assign it to the . + /// + public void InitializePipingFailureMechanism() + { + PipingFailureMechanism = new PipingFailureMechanism(); + } + #region IObservable public void Attach(IObserver observer) Index: src/Plugins/Wti/Wti.Forms/NodePresenters/PipingDataNodePresenter.cs =================================================================== diff -u -r335a4e23bb561e53214954d40f79eca9a654ce99 -r5f7007ed48dccd78b0a07db987bf234a6705ec9b --- src/Plugins/Wti/Wti.Forms/NodePresenters/PipingDataNodePresenter.cs (.../PipingDataNodePresenter.cs) (revision 335a4e23bb561e53214954d40f79eca9a654ce99) +++ src/Plugins/Wti/Wti.Forms/NodePresenters/PipingDataNodePresenter.cs (.../PipingDataNodePresenter.cs) (revision 5f7007ed48dccd78b0a07db987bf234a6705ec9b) @@ -52,7 +52,10 @@ return false; } - public void OnNodeRenamed(object nodeData, string newName) {} + public void OnNodeRenamed(object nodeData, string newName) + { + throw new InvalidOperationException(string.Format("Cannot rename tree node of type {0}.", GetType().Name)); + } public void OnNodeChecked(ITreeNode node) {} @@ -92,16 +95,12 @@ public bool CanRemove(object parentNodeData, object nodeData) { - return true; + return false; } public bool RemoveNodeData(object parentNodeData, object nodeData) { - var failureMechanism = (PipingFailureMechanism) parentNodeData; - - failureMechanism.PipingData = null; - failureMechanism.NotifyObservers(); - return true; + throw new InvalidOperationException(String.Format("Cannot delete node of type {0}.", GetType().Name)); } private void PerformPipingValidation(PipingData pipingData) Index: src/Plugins/Wti/Wti.Forms/NodePresenters/PipingFailureMechanismNodePresenter.cs =================================================================== diff -u -r325410362b50750d3c291d19c1526799c9b1c583 -r5f7007ed48dccd78b0a07db987bf234a6705ec9b --- src/Plugins/Wti/Wti.Forms/NodePresenters/PipingFailureMechanismNodePresenter.cs (.../PipingFailureMechanismNodePresenter.cs) (revision 325410362b50750d3c291d19c1526799c9b1c583) +++ src/Plugins/Wti/Wti.Forms/NodePresenters/PipingFailureMechanismNodePresenter.cs (.../PipingFailureMechanismNodePresenter.cs) (revision 5f7007ed48dccd78b0a07db987bf234a6705ec9b) @@ -45,7 +45,10 @@ return false; } - public void OnNodeRenamed(object nodeData, string newName) {} + public void OnNodeRenamed(object nodeData, string newName) + { + throw new InvalidOperationException(string.Format("Cannot rename tree node of type {0}.", GetType().Name)); + } public void OnNodeChecked(ITreeNode node) {} @@ -79,7 +82,7 @@ public bool CanRemove(object parentNodeData, object nodeData) { - return true; + return nodeData is PipingFailureMechanism; } public bool RemoveNodeData(object parentNodeData, object nodeData) @@ -88,7 +91,7 @@ { var wtiProject = (WtiProject) parentNodeData; - wtiProject.PipingFailureMechanism = null; + wtiProject.ClearPipingFailureMechanism(); wtiProject.NotifyObservers(); return true; Index: src/Plugins/Wti/Wti.Forms/NodePresenters/WtiProjectNodePresenter.cs =================================================================== diff -u -rd6424435444e760d052fe6d8c8786e01bddf9d2b -r5f7007ed48dccd78b0a07db987bf234a6705ec9b --- src/Plugins/Wti/Wti.Forms/NodePresenters/WtiProjectNodePresenter.cs (.../WtiProjectNodePresenter.cs) (revision d6424435444e760d052fe6d8c8786e01bddf9d2b) +++ src/Plugins/Wti/Wti.Forms/NodePresenters/WtiProjectNodePresenter.cs (.../WtiProjectNodePresenter.cs) (revision 5f7007ed48dccd78b0a07db987bf234a6705ec9b) @@ -84,19 +84,34 @@ var addPipingFailureMechanismItem = contextMenu.Items.Add(Resources.AddPipingFailureMechanismContextMenuItem); var contextMenuAdapter = new MenuItemContextMenuStripAdapter(contextMenu); - addPipingFailureMechanismItem.Tag = nodeData; - addPipingFailureMechanismItem.Click += InitializePipingFailureMechanismForWtiProject; + if (CanAddPipingFailureMechanism(nodeData)) + { + addPipingFailureMechanismItem.Tag = nodeData; + addPipingFailureMechanismItem.Click += InitializePipingFailureMechanismForWtiProject; + addPipingFailureMechanismItem.ToolTipText = Resources.WtiProjectTooltipAddPipingFailureMechanism; + } + else + { + addPipingFailureMechanismItem.Enabled = false; + addPipingFailureMechanismItem.ToolTipText = Resources.WtiProjectTooltipPipingFailureMechanismAlreadyAdded; + } return contextMenuAdapter; } + private bool CanAddPipingFailureMechanism(object nodeData) + { + var wtiProject = nodeData as WtiProject; + return wtiProject != null && wtiProject.PipingFailureMechanism == null; + } + private void InitializePipingFailureMechanismForWtiProject(object sender, EventArgs e) { var treeNode = (ToolStripItem) sender; if (treeNode != null) { var wtiProject = (WtiProject) treeNode.Tag; - wtiProject.PipingFailureMechanism = new PipingFailureMechanism(); + wtiProject.InitializePipingFailureMechanism(); wtiProject.NotifyObservers(); } } Index: src/Plugins/Wti/Wti.Forms/Properties/Resources.Designer.cs =================================================================== diff -u -r49b7320ad56bfa60788e8792b79dd537318f68ff -r5f7007ed48dccd78b0a07db987bf234a6705ec9b --- src/Plugins/Wti/Wti.Forms/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision 49b7320ad56bfa60788e8792b79dd537318f68ff) +++ src/Plugins/Wti/Wti.Forms/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision 5f7007ed48dccd78b0a07db987bf234a6705ec9b) @@ -748,5 +748,23 @@ return ResourceManager.GetString("WtiProjectPropertiesDisplayName", resourceCulture); } } + + /// + /// Looks up a localized string similar to Start een nieuwe piping toetsing voor dit project.. + /// + public static string WtiProjectTooltipAddPipingFailureMechanism { + get { + return ResourceManager.GetString("WtiProjectTooltipAddPipingFailureMechanism", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Kan geen nieuwe piping toetsing starten, omdat er al een piping toetsing is gestart voor dit project.. + /// + public static string WtiProjectTooltipPipingFailureMechanismAlreadyAdded { + get { + return ResourceManager.GetString("WtiProjectTooltipPipingFailureMechanismAlreadyAdded", resourceCulture); + } + } } } Index: src/Plugins/Wti/Wti.Forms/Properties/Resources.resx =================================================================== diff -u -r49b7320ad56bfa60788e8792b79dd537318f68ff -r5f7007ed48dccd78b0a07db987bf234a6705ec9b --- src/Plugins/Wti/Wti.Forms/Properties/Resources.resx (.../Resources.resx) (revision 49b7320ad56bfa60788e8792b79dd537318f68ff) +++ src/Plugins/Wti/Wti.Forms/Properties/Resources.resx (.../Resources.resx) (revision 5f7007ed48dccd78b0a07db987bf234a6705ec9b) @@ -346,4 +346,10 @@ Importeer nieuwe dwarsdoorsnedes van een *.csv bestand. + + Start een nieuwe piping toetsing voor dit project. + + + Kan geen nieuwe piping toetsing starten, omdat er al een piping toetsing is gestart voor dit project. + \ No newline at end of file Index: test/Plugins/Wti/Wti.Data.Test/WtiProjectTest.cs =================================================================== diff -u -ra8605fbec9c103f6b54775d479ec3c6078b484a2 -r5f7007ed48dccd78b0a07db987bf234a6705ec9b --- test/Plugins/Wti/Wti.Data.Test/WtiProjectTest.cs (.../WtiProjectTest.cs) (revision a8605fbec9c103f6b54775d479ec3c6078b484a2) +++ test/Plugins/Wti/Wti.Data.Test/WtiProjectTest.cs (.../WtiProjectTest.cs) (revision 5f7007ed48dccd78b0a07db987bf234a6705ec9b) @@ -21,6 +21,72 @@ } [Test] + public void InitializePipingFailureMechanism_WithoutFailureMechanismSet_SetNewFailureMechanism() + { + // Setup + var project = new WtiProject(); + + // Call + project.InitializePipingFailureMechanism(); + + // Assert + Assert.NotNull(project.PipingFailureMechanism); + + } + + [Test] + public void InitializePipingFailureMechanism_WithFailureMechanismSet_SetNewFailureMechanism() + { + // Setup + var project = new WtiProject(); + project.InitializePipingFailureMechanism(); + PipingFailureMechanism notExpectedFailureMechanism = project.PipingFailureMechanism; + + // Precondition + Assert.NotNull(notExpectedFailureMechanism); + + // Call + project.InitializePipingFailureMechanism(); + + // Assert + Assert.AreNotSame(notExpectedFailureMechanism, project.PipingFailureMechanism); + } + + [Test] + public void ClearPipingFailureMechanism_WithFailureMechanismSet_FailureMechanismUnassigned() + { + // Setup + var project = new WtiProject(); + project.InitializePipingFailureMechanism(); + PipingFailureMechanism notExpectedFailureMechanism = project.PipingFailureMechanism; + + // Precondition + Assert.NotNull(notExpectedFailureMechanism); + + // Call + project.ClearPipingFailureMechanism(); + + // Assert + Assert.IsNull(project.PipingFailureMechanism); + } + + [Test] + public void ClearPipingFailureMechanism_WithoutFailureMechanismSet_PipingFailureMechanismStillUnassigned() + { + // Setup + var project = new WtiProject(); + + // Precondition + Assert.Null(project.PipingFailureMechanism); + + // Call + project.ClearPipingFailureMechanism(); + + // Assert + Assert.IsNull(project.PipingFailureMechanism); + } + + [Test] public void NotifyObservers_ObserverAttachedToProject_ObserverIsNotified() { // Setup Index: test/Plugins/Wti/Wti.Forms.Test/NodePresenters/PipingDataNodePresenterTest.cs =================================================================== diff -u -r49b7320ad56bfa60788e8792b79dd537318f68ff -r5f7007ed48dccd78b0a07db987bf234a6705ec9b --- test/Plugins/Wti/Wti.Forms.Test/NodePresenters/PipingDataNodePresenterTest.cs (.../PipingDataNodePresenterTest.cs) (revision 49b7320ad56bfa60788e8792b79dd537318f68ff) +++ test/Plugins/Wti/Wti.Forms.Test/NodePresenters/PipingDataNodePresenterTest.cs (.../PipingDataNodePresenterTest.cs) (revision 5f7007ed48dccd78b0a07db987bf234a6705ec9b) @@ -143,7 +143,28 @@ mocks.ReplayAll(); // Expect no calls on tree node } + [Test] + public void OnNodeRenamed_Always_ThrowInvalidOperationException() + { + // Setup + var mocks = new MockRepository(); + var nodeMock = mocks.StrictMock(); + mocks.ReplayAll(); + + var nodePresenter = new PipingDataNodePresenter(); + + // Call + TestDelegate call = () => { nodePresenter.OnNodeRenamed(nodeMock, ""); }; + + // Assert + var exception = Assert.Throws(call); + var expectedMessage = string.Format("Cannot rename tree node of type {0}.", nodePresenter.GetType().Name); + Assert.AreEqual(expectedMessage, exception.Message); + mocks.ReplayAll(); // Expect no calls on tree node + } + + [Test] public void OnNodeChecked_Always_DoNothing() { // Setup @@ -330,27 +351,23 @@ bool removalAllowed = nodePresenter.CanRemove(dataMock, nodeMock); // Assert - Assert.IsTrue(removalAllowed); + Assert.IsFalse(removalAllowed); mocks.VerifyAll(); // Expect no calls on arguments } [Test] - public void RemoveNodeData_Always_PipingDataRemovedFromPipingFailureMechanism() + public void RemoveNodeData_Always_ThrowsInvalidOperationException() { // Setup - var pipingData = new PipingData(); - - var pipingFailureMechanism = new PipingFailureMechanism(); - pipingFailureMechanism.PipingData = pipingData; - var nodePresenter = new PipingDataNodePresenter(); // Call - bool removalSuccesful = nodePresenter.RemoveNodeData(pipingFailureMechanism, pipingData); + TestDelegate removeAction = () => nodePresenter.RemoveNodeData(null, null); // Assert - Assert.IsTrue(removalSuccesful); - Assert.IsNull(pipingFailureMechanism.PipingData); + var exception = Assert.Throws(removeAction); + var expectedMessage = string.Format("Cannot delete node of type {0}.", nodePresenter.GetType().Name); + Assert.AreEqual(expectedMessage, exception.Message); } [Test] Index: test/Plugins/Wti/Wti.Forms.Test/NodePresenters/PipingFailureMechanismNodePresenterTest.cs =================================================================== diff -u -r4542e40b4cb286cb08038b3efff449a5b74a9874 -r5f7007ed48dccd78b0a07db987bf234a6705ec9b --- test/Plugins/Wti/Wti.Forms.Test/NodePresenters/PipingFailureMechanismNodePresenterTest.cs (.../PipingFailureMechanismNodePresenterTest.cs) (revision 4542e40b4cb286cb08038b3efff449a5b74a9874) +++ test/Plugins/Wti/Wti.Forms.Test/NodePresenters/PipingFailureMechanismNodePresenterTest.cs (.../PipingFailureMechanismNodePresenterTest.cs) (revision 5f7007ed48dccd78b0a07db987bf234a6705ec9b) @@ -1,4 +1,5 @@ -using System.ComponentModel; +using System; +using System.ComponentModel; using DelftTools.Controls; using DelftTools.Utils.Collections; using System.Linq; @@ -36,10 +37,7 @@ var nodePresenter = new PipingFailureMechanismNodePresenter(); - var pipingData = new PipingData - { - AssessmentLevel = 2.0 - }; + var pipingData = new PipingData(); // Call nodePresenter.UpdateNode(null, pipingNode, pipingData); @@ -109,6 +107,26 @@ } [Test] + public void OnNodeRenamed_Always_ThrowInvalidOperationException() + { + // Setup + var mocks = new MockRepository(); + var nodeMock = mocks.StrictMock(); + mocks.ReplayAll(); + + var nodePresenter = new PipingFailureMechanismNodePresenter(); + + // Call + TestDelegate call = () => { nodePresenter.OnNodeRenamed(nodeMock, ""); }; + + // Assert + var exception = Assert.Throws(call); + var expectedMessage = string.Format("Cannot rename tree node of type {0}.", nodePresenter.GetType().Name); + Assert.AreEqual(expectedMessage, exception.Message); + mocks.ReplayAll(); // Expect no calls on tree node + } + + [Test] public void OnNodeChecked_Always_DoNothing() { // Setup @@ -277,12 +295,12 @@ } [Test] - public void CanRemove_Always_ReturnTrue() + public void CanRemove_PipingFailureMechanism_ReturnTrue() { // Setup var mocks = new MockRepository(); var dataMock = mocks.StrictMock(); - var nodeMock = mocks.StrictMock(); + var nodeMock = mocks.StrictMock(); mocks.ReplayAll(); var nodePresenter = new PipingFailureMechanismNodePresenter(); @@ -296,22 +314,57 @@ } [Test] - public void RemoveNodeData_Always_PipingFailureMechanismRemovedFromWtiProject() + public void CanRemove_NotPipingFailureMechanism_ReturnFalse() { // Setup - var failureMechanism = new PipingFailureMechanism(); + var mocks = new MockRepository(); + var dataMock = mocks.StrictMock(); + var nodeMock = mocks.StrictMock(); + mocks.ReplayAll(); + var nodePresenter = new PipingFailureMechanismNodePresenter(); + + // Call + bool removalAllowed = nodePresenter.CanRemove(dataMock, nodeMock); + + // Assert + Assert.IsFalse(removalAllowed); + mocks.VerifyAll(); // Expect no calls on arguments + } + + [Test] + public void RemoveNodeData_PipingFailureMechanism_PipingFailureMechanismRemovedFromWtiProject() + { + // Setup var project = new WtiProject(); - project.PipingFailureMechanism = failureMechanism; + project.InitializePipingFailureMechanism(); var nodePresenter = new PipingFailureMechanismNodePresenter(); // Call - bool removalSuccesful = nodePresenter.RemoveNodeData(project, failureMechanism); + bool removalSuccesful = nodePresenter.RemoveNodeData(project, new PipingFailureMechanism()); // Assert Assert.IsTrue(removalSuccesful); Assert.IsNull(project.PipingFailureMechanism); } + + [Test] + public void RemoveNodeData_NotPipingFailureMechanism_PipingFailureMechanismStillAssignedToWtiProject() + { + // Setup + var project = new WtiProject(); + project.InitializePipingFailureMechanism(); + var expectedFailureMechanism = project.PipingFailureMechanism; + + var nodePresenter = new PipingFailureMechanismNodePresenter(); + + // Call + bool removalSuccesful = nodePresenter.RemoveNodeData(project, new object()); + + // Assert + Assert.IsFalse(removalSuccesful); + Assert.AreSame(expectedFailureMechanism, project.PipingFailureMechanism); + } } } \ No newline at end of file Index: test/Plugins/Wti/Wti.Forms.Test/NodePresenters/PipingOutputNodePresenterTest.cs =================================================================== diff -u -rbbc44cc497cf85875585c8aad671c49b6de4fbc3 -r5f7007ed48dccd78b0a07db987bf234a6705ec9b --- test/Plugins/Wti/Wti.Forms.Test/NodePresenters/PipingOutputNodePresenterTest.cs (.../PipingOutputNodePresenterTest.cs) (revision bbc44cc497cf85875585c8aad671c49b6de4fbc3) +++ test/Plugins/Wti/Wti.Forms.Test/NodePresenters/PipingOutputNodePresenterTest.cs (.../PipingOutputNodePresenterTest.cs) (revision 5f7007ed48dccd78b0a07db987bf234a6705ec9b) @@ -115,7 +115,7 @@ var nodeMock = mocks.StrictMock(); mocks.ReplayAll(); - var nodePresenter = new PipingSurfaceLineCollectionNodePresenter(); + var nodePresenter = new PipingOutputNodePresenter(); // Call TestDelegate call = () => { nodePresenter.OnNodeRenamed(nodeMock, ""); }; Index: test/Plugins/Wti/Wti.Forms.Test/NodePresenters/WtiProjectNodePresenterTest.cs =================================================================== diff -u -rd6424435444e760d052fe6d8c8786e01bddf9d2b -r5f7007ed48dccd78b0a07db987bf234a6705ec9b --- test/Plugins/Wti/Wti.Forms.Test/NodePresenters/WtiProjectNodePresenterTest.cs (.../WtiProjectNodePresenterTest.cs) (revision d6424435444e760d052fe6d8c8786e01bddf9d2b) +++ test/Plugins/Wti/Wti.Forms.Test/NodePresenters/WtiProjectNodePresenterTest.cs (.../WtiProjectNodePresenterTest.cs) (revision 5f7007ed48dccd78b0a07db987bf234a6705ec9b) @@ -1,4 +1,5 @@ using System.ComponentModel; +using System.Linq; using DelftTools.Controls; using DelftTools.Controls.Swf; using DelftTools.Shell.Core; @@ -53,7 +54,7 @@ } [Test] - public void GetChildNodeObjects_WithData_ReturnAllChildNodes() + public void GetChildNodeObjects_WithoutPipingFailureMechanism_ReturnsEmptyList() { // Setup var mocks = new MockRepository(); @@ -73,6 +74,28 @@ } [Test] + public void GetChildNodeObjects_WithPipingFailureMechanism_ReturnPipingFailureMechanism() + { + // Setup + var mocks = new MockRepository(); + var nodeMock = mocks.StrictMock(); + mocks.ReplayAll(); + + var nodePresenter = new WtiProjectNodePresenter(); + + var project = new WtiProject(); + project.InitializePipingFailureMechanism(); + + // Call + var children = nodePresenter.GetChildNodeObjects(project, nodeMock).Cast().AsList(); + + // Assert + Assert.AreEqual(1, children.Count); + Assert.AreSame(project.PipingFailureMechanism, children[0]); + mocks.VerifyAll(); // Expect no calls on tree node + } + + [Test] public void CanRenameNode_Always_ReturnTrue() { // Setup @@ -243,28 +266,55 @@ } [Test] - public void GetContextMenu_CreateWithData_ReturnsContextMenuWithOneItemWithDataAsTag() + public void GetContextMenu_WithNoPipingFailureMechanism_ReturnsContextMenuWithOneItemWithDataAsTag() { // Setup var mocks = new MockRepository(); var nodeMock = mocks.StrictMock(); - var dataMock = mocks.StrictMock(); + var wtiProject = new WtiProject(); mocks.ReplayAll(); var nodePresenter = new WtiProjectNodePresenter(); // Call - var contextMenu = nodePresenter.GetContextMenu(nodeMock, dataMock) as MenuItemContextMenuStripAdapter; + var contextMenu = nodePresenter.GetContextMenu(nodeMock, wtiProject) as MenuItemContextMenuStripAdapter; // Assert Assert.NotNull(contextMenu); Assert.AreEqual(1, contextMenu.ContextMenuStrip.Items.Count); Assert.AreEqual(WtiFormsResources.AddPipingFailureMechanismContextMenuItem, contextMenu.ContextMenuStrip.Items[0].Text); - Assert.AreSame(dataMock, contextMenu.ContextMenuStrip.Items[0].Tag); + Assert.AreEqual(WtiFormsResources.WtiProjectTooltipAddPipingFailureMechanism, contextMenu.ContextMenuStrip.Items[0].ToolTipText); + Assert.IsTrue(contextMenu.ContextMenuStrip.Items[0].Enabled); + Assert.AreSame(wtiProject, contextMenu.ContextMenuStrip.Items[0].Tag); mocks.VerifyAll(); // Expect no calls on arguments } [Test] + public void GetContextMenu_WithPipingFailureMechanismAlreadySet_ReturnsContextMenuWithOneDisabledItem() + { + // Setup + var mocks = new MockRepository(); + var nodeMock = mocks.StrictMock(); + var wtiProject = new WtiProject(); + wtiProject.InitializePipingFailureMechanism(); + mocks.ReplayAll(); + + var nodePresenter = new WtiProjectNodePresenter(); + + // Call + var contextMenu = nodePresenter.GetContextMenu(nodeMock, wtiProject) as MenuItemContextMenuStripAdapter; + + // Assert + Assert.NotNull(contextMenu); + Assert.AreEqual(1, contextMenu.ContextMenuStrip.Items.Count); + Assert.AreEqual(WtiFormsResources.AddPipingFailureMechanismContextMenuItem, contextMenu.ContextMenuStrip.Items[0].Text); + Assert.AreEqual(WtiFormsResources.WtiProjectTooltipPipingFailureMechanismAlreadyAdded, contextMenu.ContextMenuStrip.Items[0].ToolTipText); + Assert.IsFalse(contextMenu.ContextMenuStrip.Items[0].Enabled); + Assert.IsNull(contextMenu.ContextMenuStrip.Items[0].Tag); + mocks.VerifyAll(); // Expect no calls on arguments + } + + [Test] public void OnPropertyChange_Always_DoNothing() { // Setup @@ -338,5 +388,29 @@ Assert.IsTrue(removalSuccesful); CollectionAssert.DoesNotContain(project.Items, wtiProject); } + + [Test] + public void GivenWtiProjectWithoutPipingFailureMechanism_WhenAddPipingFailureMechanismThroughContextMenu_ThenWtiProjectHasPipingFailureMechanismAssigned() + { + // Setup + var mocks = new MockRepository(); + var nodeMock = mocks.StrictMock(); + var wtiProject = new WtiProject(); + mocks.ReplayAll(); + + var nodePresenter = new WtiProjectNodePresenter(); + var contextMenu = nodePresenter.GetContextMenu(nodeMock, wtiProject) as MenuItemContextMenuStripAdapter; + + // Preconditions + Assert.NotNull(contextMenu); + Assert.IsNull(wtiProject.PipingFailureMechanism); + Assert.AreEqual(1, contextMenu.ContextMenuStrip.Items.Count); + + // Call + contextMenu.ContextMenuStrip.Items[0].PerformClick(); + + // Assert + Assert.NotNull(wtiProject.PipingFailureMechanism); + } } } \ No newline at end of file