Index: src/Plugins/Ringtoets/Piping/src/Ringtoets.Piping.Data/PipingFailureMechanism.cs =================================================================== diff -u -r300a33d9acf653458b834b296becbf9ae552de8e -rdf0cc3cc798c0d57715d9dbe78b71387066913b5 --- src/Plugins/Ringtoets/Piping/src/Ringtoets.Piping.Data/PipingFailureMechanism.cs (.../PipingFailureMechanism.cs) (revision 300a33d9acf653458b834b296becbf9ae552de8e) +++ src/Plugins/Ringtoets/Piping/src/Ringtoets.Piping.Data/PipingFailureMechanism.cs (.../PipingFailureMechanism.cs) (revision df0cc3cc798c0d57715d9dbe78b71387066913b5) @@ -20,7 +20,7 @@ { SurfaceLines = new ObservableList(); SoilProfiles = Enumerable.Empty(); - PipingData = new PipingData(); + Calculations = new List { new PipingData() }; } /// @@ -29,14 +29,14 @@ public IEnumerable SurfaceLines { get; private set; } /// - /// Gets the , which contains input and output of a piping calculation. + /// Gets the available profiles within the scope of the piping failure mechanism. /// - public PipingData PipingData { get; private set; } + public IEnumerable SoilProfiles { get; private set; } /// - /// Gets the available profiles within the scope of the piping failure mechanism. + /// Gets all available piping calculations. /// - public IEnumerable SoilProfiles { get; private set; } + public ICollection Calculations { get; private set; } public void Attach(IObserver observer) { Index: src/Plugins/Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingFailureMechanismNodePresenter.cs =================================================================== diff -u -r300a33d9acf653458b834b296becbf9ae552de8e -rdf0cc3cc798c0d57715d9dbe78b71387066913b5 --- src/Plugins/Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingFailureMechanismNodePresenter.cs (.../PipingFailureMechanismNodePresenter.cs) (revision 300a33d9acf653458b834b296becbf9ae552de8e) +++ src/Plugins/Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingFailureMechanismNodePresenter.cs (.../PipingFailureMechanismNodePresenter.cs) (revision df0cc3cc798c0d57715d9dbe78b71387066913b5) @@ -6,7 +6,7 @@ using DelftTools.Utils.Collections; using Ringtoets.Piping.Data; - +using Ringtoets.Piping.Forms.Extensions; using Ringtoets.Piping.Forms.PresentationObjects; using Ringtoets.Piping.Forms.Properties; @@ -36,11 +36,11 @@ yield return failureMechanism.SoilProfiles; yield return failureMechanism.SurfaceLines; - if (failureMechanism.PipingData != null) + foreach (var calculation in failureMechanism.Calculations) { yield return new PipingCalculationInputs { - PipingData = failureMechanism.PipingData, + PipingData = calculation, AvailablePipingSurfaceLines = failureMechanism.SurfaceLines }; } @@ -84,7 +84,17 @@ public ContextMenuStrip GetContextMenu(ITreeNode sender, object nodeData) { - return null; + var rootMenu = new ContextMenuStrip(); + + rootMenu.AddMenuItem("Berekening toevoegen", "Voeg een nieuwe piping berekening toe aan het faalmechanisme.", + Resources.PipingIcon, (o, args) => + { + var failureMechanism = (PipingFailureMechanism)nodeData; + failureMechanism.Calculations.Add(new PipingData()); + failureMechanism.NotifyObservers(); + }); + + return rootMenu; } public void OnPropertyChanged(object sender, ITreeNode node, PropertyChangedEventArgs e) {} Index: src/Plugins/Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/PipingFailureMechanismTest.cs =================================================================== diff -u -r300a33d9acf653458b834b296becbf9ae552de8e -rdf0cc3cc798c0d57715d9dbe78b71387066913b5 --- src/Plugins/Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/PipingFailureMechanismTest.cs (.../PipingFailureMechanismTest.cs) (revision 300a33d9acf653458b834b296becbf9ae552de8e) +++ src/Plugins/Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/PipingFailureMechanismTest.cs (.../PipingFailureMechanismTest.cs) (revision df0cc3cc798c0d57715d9dbe78b71387066913b5) @@ -2,8 +2,6 @@ using NUnit.Framework; using Rhino.Mocks; -using Ringtoets.Piping.Data; - namespace Ringtoets.Piping.Data.Test { [TestFixture] @@ -27,7 +25,7 @@ CollectionAssert.IsEmpty(piping.SurfaceLines); Assert.IsInstanceOf>(piping.SurfaceLines); CollectionAssert.IsEmpty(piping.SoilProfiles); - Assert.IsNotNull(piping.PipingData); + Assert.AreEqual(1, piping.Calculations.Count); } [Test] Index: src/Plugins/Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/NodePresenters/PipingFailureMechanismNodePresenterTest.cs =================================================================== diff -u -r300a33d9acf653458b834b296becbf9ae552de8e -rdf0cc3cc798c0d57715d9dbe78b71387066913b5 --- src/Plugins/Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/NodePresenters/PipingFailureMechanismNodePresenterTest.cs (.../PipingFailureMechanismNodePresenterTest.cs) (revision 300a33d9acf653458b834b296becbf9ae552de8e) +++ src/Plugins/Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/NodePresenters/PipingFailureMechanismNodePresenterTest.cs (.../PipingFailureMechanismNodePresenterTest.cs) (revision df0cc3cc798c0d57715d9dbe78b71387066913b5) @@ -2,6 +2,7 @@ using System.ComponentModel; using System.Linq; using DelftTools.Controls; +using DelftTools.Shell.Core; using DelftTools.Utils.Collections; using NUnit.Framework; using Rhino.Mocks; @@ -61,17 +62,25 @@ var nodePresenter = new PipingFailureMechanismNodePresenter(); var pipingFailureMechanism = new PipingFailureMechanism(); + pipingFailureMechanism.Calculations.Add(new PipingData()); + pipingFailureMechanism.Calculations.Add(new PipingData()); // Call var children = nodePresenter.GetChildNodeObjects(pipingFailureMechanism, nodeMock).OfType().ToArray(); // Assert - Assert.AreEqual(3, children.Length); + Assert.AreEqual(5, children.Length); Assert.AreSame(pipingFailureMechanism.SoilProfiles, children[0]); Assert.AreSame(pipingFailureMechanism.SurfaceLines, children[1]); - var pipingCalculationInputsObject = (PipingCalculationInputs)children[2]; - Assert.AreSame(pipingFailureMechanism.PipingData, pipingCalculationInputsObject.PipingData); - Assert.AreSame(pipingFailureMechanism.SurfaceLines, pipingCalculationInputsObject.AvailablePipingSurfaceLines); + var pipingCalculationInputsChildObjects = children.Skip(2) + .Take(pipingFailureMechanism.Calculations.Count) + .Cast() + .ToArray(); + CollectionAssert.AreEqual(pipingFailureMechanism.Calculations, pipingCalculationInputsChildObjects.Select(pci => pci.PipingData).ToArray()); + foreach (var pipingData in pipingCalculationInputsChildObjects) + { + Assert.AreSame(pipingFailureMechanism.SurfaceLines, pipingData.AvailablePipingSurfaceLines); + } mocks.VerifyAll(); // Expect no calls on tree node } @@ -258,11 +267,43 @@ var contextMenu = nodePresenter.GetContextMenu(nodeMock, dataMock); // Assert - Assert.IsNull(contextMenu); + Assert.AreEqual(1, contextMenu.Items.Count); + var addCalculationItem = contextMenu.Items[0]; + Assert.AreEqual("Berekening toevoegen", addCalculationItem.Text); + Assert.AreEqual("Voeg een nieuwe piping berekening toe aan het faalmechanisme.", addCalculationItem.ToolTipText); + Assert.AreEqual(16, addCalculationItem.Image.Width); + Assert.AreEqual(16, addCalculationItem.Image.Height); mocks.VerifyAll(); // Expect no calls on arguments } [Test] + public void GetContextMenu_ClickOnAddCalculationItem_NewPipingDataInstanceAddedToCalculationAndNotifyObservers() + { + // Setup + var mocks = new MockRepository(); + var nodeMock = mocks.StrictMock(); + var observerMock = mocks.StrictMock(); + observerMock.Expect(o => o.UpdateObserver()); + mocks.ReplayAll(); + + var failureMechanism = new PipingFailureMechanism(); + failureMechanism.Attach(observerMock); + var nodePresenter = new PipingFailureMechanismNodePresenter(); + + // Precondition + Assert.AreEqual(1, failureMechanism.Calculations.Count); + + // Call + var contextMenu = nodePresenter.GetContextMenu(nodeMock, failureMechanism); + var addCalculationItem = contextMenu.Items[0]; + addCalculationItem.PerformClick(); + + // Assert + Assert.AreEqual(2, failureMechanism.Calculations.Count); + mocks.VerifyAll(); + } + + [Test] public void OnPropertyChange_Always_DoNothing() { // Setup