Index: Ringtoets/Demo/src/Ringtoets.Demo/Commands/AddNewDemoDikeAssessmentSectionCommand.cs =================================================================== diff -u -rd121feba5299c86d7ac04a366ee869b163e43ec7 -red0b4ea830beb801bcc0e3eb5b28993001ed2981 --- Ringtoets/Demo/src/Ringtoets.Demo/Commands/AddNewDemoDikeAssessmentSectionCommand.cs (.../AddNewDemoDikeAssessmentSectionCommand.cs) (revision d121feba5299c86d7ac04a366ee869b163e43ec7) +++ Ringtoets/Demo/src/Ringtoets.Demo/Commands/AddNewDemoDikeAssessmentSectionCommand.cs (.../AddNewDemoDikeAssessmentSectionCommand.cs) (revision ed0b4ea830beb801bcc0e3eb5b28993001ed2981) @@ -6,6 +6,7 @@ using Core.Common.Gui; using Ringtoets.Integration.Data; +using Ringtoets.Piping.Data; using Ringtoets.Piping.Plugin.FileImporter; namespace Ringtoets.Demo.Commands @@ -60,7 +61,7 @@ surfaceLinesImporter.ImportItem(tempPath.FilePath, pipingFailureMechanism.SoilProfiles); } - var calculation = pipingFailureMechanism.Calculations.First(); + var calculation = pipingFailureMechanism.Calculations.GetPipingCalculations().First(); calculation.InputParameters.SurfaceLine = pipingFailureMechanism.SurfaceLines.First(sl => sl.Name == "PK001_0001"); calculation.InputParameters.SoilProfile = pipingFailureMechanism.SoilProfiles.First(sl => sl.Name == "AD640M00_Segment_36005_1D2"); } Index: Ringtoets/Demo/test/Ringtoets.Demo.Test/Commands/AddNewDemoDikeAssessmentSectionCommandTest.cs =================================================================== diff -u -rd121feba5299c86d7ac04a366ee869b163e43ec7 -red0b4ea830beb801bcc0e3eb5b28993001ed2981 --- Ringtoets/Demo/test/Ringtoets.Demo.Test/Commands/AddNewDemoDikeAssessmentSectionCommandTest.cs (.../AddNewDemoDikeAssessmentSectionCommandTest.cs) (revision d121feba5299c86d7ac04a366ee869b163e43ec7) +++ Ringtoets/Demo/test/Ringtoets.Demo.Test/Commands/AddNewDemoDikeAssessmentSectionCommandTest.cs (.../AddNewDemoDikeAssessmentSectionCommandTest.cs) (revision ed0b4ea830beb801bcc0e3eb5b28993001ed2981) @@ -69,7 +69,7 @@ Assert.AreEqual(4, surfaceLines.Length); Assert.AreEqual(1, demoAssessmentSection.PipingFailureMechanism.Calculations.Count); - var calculation = demoAssessmentSection.PipingFailureMechanism.Calculations.First(); + var calculation = demoAssessmentSection.PipingFailureMechanism.Calculations.GetPipingCalculations().First(); AssertCalculationAbleToCalculate(calculation); mocks.VerifyAll(); } Index: Ringtoets/Piping/src/Ringtoets.Piping.Data/IPipingCalculationItem.cs =================================================================== diff -u --- Ringtoets/Piping/src/Ringtoets.Piping.Data/IPipingCalculationItem.cs (revision 0) +++ Ringtoets/Piping/src/Ringtoets.Piping.Data/IPipingCalculationItem.cs (revision ed0b4ea830beb801bcc0e3eb5b28993001ed2981) @@ -0,0 +1,20 @@ +using Core.Common.Base; + +namespace Ringtoets.Piping.Data +{ + /// + /// A piping calculation related object + /// + public interface IPipingCalculationItem : IObservable + { + /// + /// Gets or sets the name the user gave this this calculation object. + /// + string Name { get; set; } + + /// + /// Gets a value indicating whether this calculation item contains piping calculation outputs. + /// + bool HasOutput { get; } + } +} \ No newline at end of file Index: Ringtoets/Piping/src/Ringtoets.Piping.Data/IPipingCalculationItemExtensions.cs =================================================================== diff -u --- Ringtoets/Piping/src/Ringtoets.Piping.Data/IPipingCalculationItemExtensions.cs (revision 0) +++ Ringtoets/Piping/src/Ringtoets.Piping.Data/IPipingCalculationItemExtensions.cs (revision ed0b4ea830beb801bcc0e3eb5b28993001ed2981) @@ -0,0 +1,45 @@ +using System.Collections.Generic; +using System.Linq; + +namespace Ringtoets.Piping.Data +{ + /// + /// Defines extension methods dealing with with instances. + /// + public static class IPipingCalculationItemExtensions + { + /// + /// Recursively enumerates across over the contents of the piping calculation item, + /// yielding the piping calculations found within the calculation item. + /// + /// The calculation item to be evaluated. + /// Returns all contained piping calculations as an enumerable result. + public static IEnumerable GetPipingCalculations(this IPipingCalculationItem pipingCalculationItem) + { + var calculation = pipingCalculationItem as PipingCalculation; + if (calculation != null) + { + yield return calculation; + } + var group = pipingCalculationItem as PipingCalculationGroup; + if (group != null) + { + foreach (PipingCalculation calculationInGroup in group.Children.GetPipingCalculations()) + { + yield return calculationInGroup; + } + } + } + + /// + /// Recursively enumerates across over the contents of all the piping calculation + /// items, yielding the piping calculations found within those calculation items. + /// + /// The calculation items to be evaluated. + /// Returns all contained piping calculations as an enumerable result. + public static IEnumerable GetPipingCalculations(this IEnumerable pipingCalculationItems) + { + return pipingCalculationItems.SelectMany(GetPipingCalculations); + } + } +} \ No newline at end of file Index: Ringtoets/Piping/src/Ringtoets.Piping.Data/PipingCalculation.cs =================================================================== diff -u -rfb32e3411873a7b4c567792b9f335eba462e2702 -red0b4ea830beb801bcc0e3eb5b28993001ed2981 --- Ringtoets/Piping/src/Ringtoets.Piping.Data/PipingCalculation.cs (.../PipingCalculation.cs) (revision fb32e3411873a7b4c567792b9f335eba462e2702) +++ Ringtoets/Piping/src/Ringtoets.Piping.Data/PipingCalculation.cs (.../PipingCalculation.cs) (revision ed0b4ea830beb801bcc0e3eb5b28993001ed2981) @@ -8,7 +8,7 @@ /// /// This class holds the information which can be made visible in the graphical interface of the application. /// - public class PipingCalculation : Observable + public class PipingCalculation : Observable, IPipingCalculationItem { /// /// Constructs a new instance of with default values set for some of the parameters. @@ -23,11 +23,6 @@ } /// - /// Gets or sets the name the user gave this this calculation object. - /// - public string Name { get; set; } - - /// /// Gets the user notes for this calculation. /// public PlaceholderWithReadonlyName Comments { get; private set; } @@ -38,6 +33,18 @@ public PipingInput InputParameters { get; private set; } /// + /// Gets or sets , which contains the results of a Piping calculation. + /// + public PipingOutput Output { get; set; } + + /// + /// Gets the calculation report for the calculation that generated . + /// + public PlaceholderWithReadonlyName CalculationReport { get; private set; } + + public string Name { get; set; } + + /// /// Gets a value indicating whether the has . /// public bool HasOutput @@ -49,16 +56,6 @@ } /// - /// Gets or sets , which contains the results of a Piping calculation. - /// - public PipingOutput Output { get; set; } - - /// - /// Gets the calculation report for the calculation that generated . - /// - public PlaceholderWithReadonlyName CalculationReport { get; private set; } - - /// /// Clears the . /// public void ClearOutput() Index: Ringtoets/Piping/src/Ringtoets.Piping.Data/PipingCalculationGroup.cs =================================================================== diff -u --- Ringtoets/Piping/src/Ringtoets.Piping.Data/PipingCalculationGroup.cs (revision 0) +++ Ringtoets/Piping/src/Ringtoets.Piping.Data/PipingCalculationGroup.cs (revision ed0b4ea830beb801bcc0e3eb5b28993001ed2981) @@ -0,0 +1,37 @@ +using System.Collections.Generic; +using System.Linq; + +using Core.Common.Base; + +namespace Ringtoets.Piping.Data +{ + /// + /// Class to allow grouping one or multiple instances. + /// + public class PipingCalculationGroup : Observable, IPipingCalculationItem + { + /// + /// Initializes a new instance of the class. + /// + public PipingCalculationGroup() + { + Name = "Berekening groep"; + Children = new List(); + } + + /// + /// Gets the children that define this group. + /// + public ICollection Children { get; private set; } + + public string Name { get; set; } + + public bool HasOutput + { + get + { + return Children.Any(c => c.HasOutput); + } + } + } +} \ No newline at end of file Index: Ringtoets/Piping/src/Ringtoets.Piping.Data/PipingFailureMechanism.cs =================================================================== diff -u -rfb32e3411873a7b4c567792b9f335eba462e2702 -red0b4ea830beb801bcc0e3eb5b28993001ed2981 --- Ringtoets/Piping/src/Ringtoets.Piping.Data/PipingFailureMechanism.cs (.../PipingFailureMechanism.cs) (revision fb32e3411873a7b4c567792b9f335eba462e2702) +++ Ringtoets/Piping/src/Ringtoets.Piping.Data/PipingFailureMechanism.cs (.../PipingFailureMechanism.cs) (revision ed0b4ea830beb801bcc0e3eb5b28993001ed2981) @@ -1,4 +1,5 @@ using System.Collections.Generic; + using Core.Common.Base; using Ringtoets.Common.Data; @@ -22,7 +23,7 @@ SurfaceLines = new ObservableList(); SoilProfiles = new ObservableList(); BoundaryConditions = new InputPlaceholder(RingtoetsCommonDataResources.FailureMechanism_BoundaryConditions_DisplayName); - Calculations = new List { new PipingCalculation() }; + Calculations = new List { new PipingCalculation() }; AssessmentResult = new OutputPlaceholder(RingtoetsCommonDataResources.FailureMechanism_AssessmentResult_DisplayName); } @@ -49,7 +50,7 @@ /// /// Gets all available piping calculations. /// - public ICollection Calculations { get; private set; } + public ICollection Calculations { get; private set; } /// /// Gets the calculation results for this failure mechanism. Index: Ringtoets/Piping/src/Ringtoets.Piping.Data/Ringtoets.Piping.Data.csproj =================================================================== diff -u -r6819809d62f8609b8311b58dfef1b6ddef5701fe -red0b4ea830beb801bcc0e3eb5b28993001ed2981 --- Ringtoets/Piping/src/Ringtoets.Piping.Data/Ringtoets.Piping.Data.csproj (.../Ringtoets.Piping.Data.csproj) (revision 6819809d62f8609b8311b58dfef1b6ddef5701fe) +++ Ringtoets/Piping/src/Ringtoets.Piping.Data/Ringtoets.Piping.Data.csproj (.../Ringtoets.Piping.Data.csproj) (revision ed0b4ea830beb801bcc0e3eb5b28993001ed2981) @@ -63,7 +63,10 @@ + + + Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingFailureMechanismNodePresenter.cs =================================================================== diff -u -rfb32e3411873a7b4c567792b9f335eba462e2702 -red0b4ea830beb801bcc0e3eb5b28993001ed2981 --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingFailureMechanismNodePresenter.cs (.../PipingFailureMechanismNodePresenter.cs) (revision fb32e3411873a7b4c567792b9f335eba462e2702) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingFailureMechanismNodePresenter.cs (.../PipingFailureMechanismNodePresenter.cs) (revision ed0b4ea830beb801bcc0e3eb5b28993001ed2981) @@ -1,5 +1,6 @@ using System; using System.Collections; +using System.Collections.Generic; using System.Linq; using System.Windows.Forms; @@ -63,7 +64,7 @@ Resources.PipingFailureMechanism_Calculate_Tooltip, RingtoetsCommonFormsResources.CalculateAllIcon, (o, args) => { - foreach (var calc in failureMechanism.Calculations) + foreach (PipingCalculation calc in GetAllPipingCalculationsResursively(failureMechanism)) { RunActivityAction(new PipingCalculationActivity(calc)); } @@ -73,14 +74,14 @@ RingtoetsCommonFormsResources.Clear_all_output_ToolTip, RingtoetsCommonFormsResources.ClearIcon, (o, args) => { - foreach (var calc in failureMechanism.Calculations) + foreach (PipingCalculation calc in GetAllPipingCalculationsResursively(failureMechanism)) { calc.ClearOutput(); calc.NotifyObservers(); } }); - if (!failureMechanism.Calculations.Any(c => c.HasOutput)) + if (!GetAllPipingCalculationsResursively(failureMechanism).Any(c => c.HasOutput)) { clearOutputNode.Enabled = false; clearOutputNode.ToolTipText = Resources.ClearOutput_No_calculation_with_output_to_clear; @@ -101,5 +102,10 @@ { yield return failureMechanism.AssessmentResult; } + + private static IEnumerable GetAllPipingCalculationsResursively(PipingFailureMechanism failureMechanism) + { + return failureMechanism.Calculations.GetPipingCalculations().ToArray(); + } } } \ No newline at end of file Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/PresentationObjects/PipingCalculationsTreeFolder.cs =================================================================== diff -u -rfb32e3411873a7b4c567792b9f335eba462e2702 -red0b4ea830beb801bcc0e3eb5b28993001ed2981 --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/PresentationObjects/PipingCalculationsTreeFolder.cs (.../PipingCalculationsTreeFolder.cs) (revision fb32e3411873a7b4c567792b9f335eba462e2702) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/PresentationObjects/PipingCalculationsTreeFolder.cs (.../PipingCalculationsTreeFolder.cs) (revision ed0b4ea830beb801bcc0e3eb5b28993001ed2981) @@ -1,5 +1,4 @@ -using System.Collections.Generic; -using System.Linq; +using System.Collections; using Ringtoets.Common.Forms.PresentationObjects; using Ringtoets.Piping.Data; @@ -24,14 +23,25 @@ public PipingFailureMechanism ParentFailureMechanism { get; private set; } - private static IEnumerable WrapCalculationsInPresentationObjects(PipingFailureMechanism failureMechanism) + private static IEnumerable WrapCalculationsInPresentationObjects(PipingFailureMechanism failureMechanism) { - return failureMechanism.Calculations.Select(calculation => new PipingCalculationContext + foreach (var calculationItem in failureMechanism.Calculations) { - WrappedPipingCalculation = calculation, - AvailablePipingSurfaceLines = failureMechanism.SurfaceLines, - AvailablePipingSoilProfiles = failureMechanism.SoilProfiles - }); + var pipingCalculation = calculationItem as PipingCalculation; + if (pipingCalculation != null) + { + yield return new PipingCalculationContext + { + WrappedPipingCalculation = pipingCalculation, + AvailablePipingSurfaceLines = failureMechanism.SurfaceLines, + AvailablePipingSoilProfiles = failureMechanism.SoilProfiles + }; + } + else + { + yield return calculationItem; + } + } } } } \ No newline at end of file Index: Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/IPipingCalculationItemExtensionsTest.cs =================================================================== diff -u --- Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/IPipingCalculationItemExtensionsTest.cs (revision 0) +++ Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/IPipingCalculationItemExtensionsTest.cs (revision ed0b4ea830beb801bcc0e3eb5b28993001ed2981) @@ -0,0 +1,182 @@ +using System.Collections.Generic; +using System.Linq; + +using NUnit.Framework; + +namespace Ringtoets.Piping.Data.Test +{ + [TestFixture] + public class IPipingCalculationItemExtensionsTest + { + [Test] + public void GetPipingCalculations_FromPipingCalculation_ReturnThatCalculationInstance() + { + // Setup + IPipingCalculationItem calculation = new PipingCalculation(); + + // Call + IEnumerable result = calculation.GetPipingCalculations(); + + // Assert + CollectionAssert.AreEqual(new[]{calculation}, result); + } + + [Test] + public void GetPipingCalculations_FromPipingCalculationGroupWithoutChildren_ReturnEmpty() + { + // Setup + IPipingCalculationItem groupWithoutChildren = new PipingCalculationGroup(); + + // Call + IEnumerable result = groupWithoutChildren.GetPipingCalculations(); + + // Assert + CollectionAssert.IsEmpty(result); + } + + [Test] + public void GetPipingCalculations_FromPipingCalculationGroupWithEmptyGroups_ReturnEmpty() + { + // Setup + var rootGroup = new PipingCalculationGroup(); + rootGroup.Children.Add(new PipingCalculationGroup()); + rootGroup.Children.Add(new PipingCalculationGroup()); + rootGroup.Children.Add(new PipingCalculationGroup()); + + IPipingCalculationItem groupsWithoutChildren = rootGroup; + + // Call + IEnumerable result = groupsWithoutChildren.GetPipingCalculations(); + + // Assert + CollectionAssert.IsEmpty(result); + } + + [Test] + public void GetPipingCalculations_FromPipingCalculationGroupWithGroupsAndCalculations_ReturnAllCalculationsRecursiveslyInAnyOrder() + { + // Setup + var calculation1 = new PipingCalculation(); + var calculation2 = new PipingCalculation(); + var calculation3 = new PipingCalculation(); + var calculation4 = new PipingCalculation(); + + var subsubGroup = new PipingCalculationGroup(); + subsubGroup.Children.Add(calculation4); + + var subgroup1 = new PipingCalculationGroup(); + subgroup1.Children.Add(calculation2); + subgroup1.Children.Add(subsubGroup); + + var subgroup2 = new PipingCalculationGroup(); + subgroup2.Children.Add(calculation3); + + var rootGroup = new PipingCalculationGroup(); + rootGroup.Children.Add(subgroup1); + rootGroup.Children.Add(calculation1); + rootGroup.Children.Add(subgroup2); + + IPipingCalculationItem groupWithoutChildren = rootGroup; + + // Call + IEnumerable result = groupWithoutChildren.GetPipingCalculations(); + + // Assert + var itemsThatShouldBeFound = new[] + { + calculation1, + calculation2, + calculation3, + calculation4 + }; + CollectionAssert.AreEquivalent(itemsThatShouldBeFound, result); + } + + [Test] + public void GetPipingCalculations_FromEmptyEnummerable_ReturnEmpty() + { + // Setup + IEnumerable emptyEnumerable = Enumerable.Empty(); + + // Call + IEnumerable result = emptyEnumerable.GetPipingCalculations(); + + // Assert + CollectionAssert.IsEmpty(result); + } + + [Test] + public void GetPipingCalculations_FromArrayWithCalculations_ReturnAllThoseCalculationsInAnyOrder() + { + // Setup + var calculation1 = new PipingCalculation(); + var calculation2 = new PipingCalculation(); + IEnumerable calculationArray = new[] { calculation1, calculation2 }; + + // Call + IEnumerable result = calculationArray.GetPipingCalculations(); + + // Assert + CollectionAssert.AreEquivalent(calculationArray, result); + } + + [Test] + public void GetPipingCalculations_FromArrayWithEmptyGroups_ReturnEmpty() + { + // Setup + var emptyGroup1 = new PipingCalculationGroup(); + var emptyGroup2 = new PipingCalculationGroup(); + IEnumerable emptyEnumerable = new[] { emptyGroup1, emptyGroup2 }; + + // Call + IEnumerable result = emptyEnumerable.GetPipingCalculations(); + + // Assert + CollectionAssert.IsEmpty(result); + } + + [Test] + public void GetPipingCalculations_FromArrayWithMixedGroupsAndCalculations_ReturnAllCalculationsInAnyOrder() + { + // Setup + var rootcalculation = new PipingCalculation(); + var calculation1 = new PipingCalculation(); + var calculation2 = new PipingCalculation(); + var calculation3 = new PipingCalculation(); + var calculation4 = new PipingCalculation(); + + var subsubGroup = new PipingCalculationGroup(); + subsubGroup.Children.Add(calculation4); + + var subgroup1 = new PipingCalculationGroup(); + subgroup1.Children.Add(calculation2); + subgroup1.Children.Add(subsubGroup); + + var subgroup2 = new PipingCalculationGroup(); + subgroup2.Children.Add(calculation3); + + var rootGroup = new PipingCalculationGroup(); + rootGroup.Children.Add(subgroup1); + rootGroup.Children.Add(calculation1); + rootGroup.Children.Add(subgroup2); + + var emptyRootGroup = new PipingCalculationGroup(); + + IEnumerable mixedArray = new IPipingCalculationItem[] { emptyRootGroup, rootGroup, rootcalculation }; + + // Call + IEnumerable result = mixedArray.GetPipingCalculations(); + + // Assert + var expectedCalculationItems = new[] + { + rootcalculation, + calculation1, + calculation2, + calculation3, + calculation4 + }; + CollectionAssert.AreEquivalent(expectedCalculationItems, result); + } + } +} \ No newline at end of file Fisheye: Tag ed0b4ea830beb801bcc0e3eb5b28993001ed2981 refers to a dead (removed) revision in file `Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/PipingCalculationDataTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Index: Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/PipingCalculationGroupTest.cs =================================================================== diff -u --- Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/PipingCalculationGroupTest.cs (revision 0) +++ Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/PipingCalculationGroupTest.cs (revision ed0b4ea830beb801bcc0e3eb5b28993001ed2981) @@ -0,0 +1,152 @@ +using Core.Common.Base; + +using NUnit.Framework; + +using Rhino.Mocks; + +namespace Ringtoets.Piping.Data.Test +{ + [TestFixture] + public class PipingCalculationGroupTest + { + [Test] + public void DefaultConstructor_ExpectedValues() + { + // Call + var group = new PipingCalculationGroup(); + + // Assert + Assert.IsInstanceOf(group); + Assert.IsInstanceOf(group); + Assert.AreEqual("Berekening groep", group.Name); + Assert.IsFalse(group.HasOutput); + CollectionAssert.IsEmpty(group.Children); + } + + [Test] + public void Children_AddPipingCalculation_CalculationAddedToCollection() + { + // Setup + var calculation = new PipingCalculation(); + + var group = new PipingCalculationGroup(); + + // Call + group.Children.Add(calculation); + + // Assert + CollectionAssert.Contains(group.Children, calculation); + } + + [Test] + public void Children_RemovePipingCalculation_CalculationRemovedFromCollection() + { + // Setup + var calculation = new PipingCalculation(); + + var group = new PipingCalculationGroup(); + group.Children.Add(calculation); + + // Call + group.Children.Remove(calculation); + + // Assert + CollectionAssert.DoesNotContain(group.Children, calculation); + } + + [Test] + public void Children_AddPipingCalculationGroup_GroupAddedToCollection() + { + // Setup + var childGroup = new PipingCalculationGroup(); + + var group = new PipingCalculationGroup(); + + // Call + group.Children.Add(childGroup); + + // Assert + CollectionAssert.Contains(group.Children, childGroup); + } + + [Test] + public void Children_RemovePipingCalculationGroup_GroupRemovedFromCollection() + { + // Setup + var childGroup = new PipingCalculationGroup(); + + var group = new PipingCalculationGroup(); + group.Children.Add(childGroup); + + // Call + group.Children.Remove(childGroup); + + // Assert + CollectionAssert.DoesNotContain(group.Children, childGroup); + } + + [Test] + public void HasOutput_NoChildren_ReturnFalse() + { + // Setup + var group = new PipingCalculationGroup(); + + // Precondition + CollectionAssert.IsEmpty(group.Children); + + // Call + var hasOutput = group.HasOutput; + + // Assert + Assert.IsFalse(hasOutput); + } + + [Test] + public void HasOutput_HasChildWithOutput_ReturnTrue() + { + // Setup + var mocks = new MockRepository(); + var childWithoutOutput = mocks.Stub(); + childWithoutOutput.Stub(c => c.HasOutput).Return(false); + + var childWithOutput = mocks.Stub(); + childWithOutput.Stub(c => c.HasOutput).Return(true); + mocks.ReplayAll(); + + var group = new PipingCalculationGroup(); + group.Children.Add(childWithoutOutput); + group.Children.Add(childWithOutput); + + // Call + var hasOutput = group.HasOutput; + + // Assert + Assert.IsTrue(hasOutput); + mocks.VerifyAll(); + } + + [Test] + public void HasOutput_HasChildrenAllWithoutOutput_ReturnFalse() + { + // Setup + var mocks = new MockRepository(); + var child1WithoutOutput = mocks.Stub(); + child1WithoutOutput.Stub(c => c.HasOutput).Return(false); + + var child2WithoutOutput = mocks.Stub(); + child2WithoutOutput.Stub(c => c.HasOutput).Return(false); + mocks.ReplayAll(); + + var group = new PipingCalculationGroup(); + group.Children.Add(child1WithoutOutput); + group.Children.Add(child2WithoutOutput); + + // Call + var hasOutput = group.HasOutput; + + // Assert + Assert.IsFalse(hasOutput); + mocks.VerifyAll(); + } + } +} \ No newline at end of file Index: Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/PipingCalculationTest.cs =================================================================== diff -u --- Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/PipingCalculationTest.cs (revision 0) +++ Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/PipingCalculationTest.cs (revision ed0b4ea830beb801bcc0e3eb5b28993001ed2981) @@ -0,0 +1,168 @@ +using Core.Common.Base; +using NUnit.Framework; +using Rhino.Mocks; +using Ringtoets.Piping.Calculation.TestUtil; + +namespace Ringtoets.Piping.Data.Test +{ + public class PipingCalculationTest + { + private MockRepository mockRepository; + + [SetUp] + public void SetUp() + { + mockRepository = new MockRepository(); + } + + [Test] + public void DefaultConstructor_DefaultPropertyValuesAreSet() + { + // Call + var calculation = new PipingCalculation(); + + // Assert + Assert.IsInstanceOf(calculation); + + Assert.AreEqual("Berekening", calculation.Name); + + Assert.AreEqual("Commentaar", calculation.Comments.Name); + Assert.IsInstanceOf(calculation.InputParameters); + + Assert.IsFalse(calculation.HasOutput); + Assert.IsNull(calculation.Output); + Assert.AreEqual("Berekeningsverslag", calculation.CalculationReport.Name); + } + + [Test] + public void Notify_SingleListenerAttached_ListenerIsNotified() + { + // Setup + var observer = mockRepository.StrictMock(); + observer.Expect(o => o.UpdateObserver()); + + mockRepository.ReplayAll(); + + var calculation = new PipingCalculation(); + + calculation.Attach(observer); + + // Call & Assert + calculation.NotifyObservers(); + } + + [Test] + public void Notify_SingleListenerAttachedAndDeattached_ListenerIsNotNotified() + { + // Setup + var observer = mockRepository.StrictMock(); + observer.Expect(o => o.UpdateObserver()).Repeat.Never(); + mockRepository.ReplayAll(); + + var calculation = new PipingCalculation(); + + calculation.Attach(observer); + calculation.Detach(observer); + + // Call & Assert + calculation.NotifyObservers(); + } + + [Test] + public void Notify_TwoListenersAttached_BothAreNotified() + { + // Setup + var observerA = mockRepository.StrictMock(); + observerA.Expect(o => o.UpdateObserver()); + + var observerB = mockRepository.StrictMock(); + observerB.Expect(o => o.UpdateObserver()); + + mockRepository.ReplayAll(); + + var calculation = new PipingCalculation(); + + calculation.Attach(observerA); + calculation.Attach(observerB); + + // Call & Assert + calculation.NotifyObservers(); + } + + [Test] + public void Notify_TwoListenersAttachedOneDetached_InvokedOnce() + { + // Setup + var observerA = mockRepository.StrictMock(); + observerA.Expect(o => o.UpdateObserver()).Repeat.Never(); + + var observerB = mockRepository.StrictMock(); + observerB.Expect(o => o.UpdateObserver()); + + mockRepository.ReplayAll(); + + var calculation = new PipingCalculation(); + + calculation.Attach(observerA); + calculation.Attach(observerB); + calculation.Detach(observerA); + + // Call & Assert + calculation.NotifyObservers(); + } + + [Test] + public void Detach_DetachNonAttachedObserver_ThrowsNoException() + { + // Setup + var observer = mockRepository.StrictMock(); + + var calculation = new PipingCalculation(); + + // Call & Assert + calculation.Detach(observer); + } + + [Test] + public void ClearOutput_Always_SetsOutputToNull() + { + // Setup + var data = new PipingCalculation + { + Output = new TestPipingOutput() + }; + + // Call + data.ClearOutput(); + + // Assert + Assert.IsNull(data.Output); + } + + [Test] + public void HasOutput_OutputNull_ReturnsFalse() + { + // Setup + var data = new PipingCalculation + { + Output = null + }; + + // Call & Assert + Assert.IsFalse(data.HasOutput); + } + + [Test] + public void HasOutput_OutputSet_ReturnsTrue() + { + // Setup + var data = new PipingCalculation + { + Output = new TestPipingOutput() + }; + + // Call & Assert + Assert.IsTrue(data.HasOutput); + } + } +} \ No newline at end of file Index: Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/PipingFailureMechanismTest.cs =================================================================== diff -u -rc0e407c65daebe4f446f9414367593eff80af1b2 -red0b4ea830beb801bcc0e3eb5b28993001ed2981 --- Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/PipingFailureMechanismTest.cs (.../PipingFailureMechanismTest.cs) (revision c0e407c65daebe4f446f9414367593eff80af1b2) +++ Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/PipingFailureMechanismTest.cs (.../PipingFailureMechanismTest.cs) (revision ed0b4ea830beb801bcc0e3eb5b28993001ed2981) @@ -1,4 +1,6 @@ -using Core.Common.Base; +using System.Collections.Generic; + +using Core.Common.Base; using NUnit.Framework; using Rhino.Mocks; @@ -127,5 +129,67 @@ // Call & Assert pipingFailureMechanism.Detach(observer); } + + [Test] + public void Calculations_AddPipingCalculation_ItemIsAddedToCollection() + { + // Setup + var calculation = new PipingCalculation(); + + var failureMechanism = new PipingFailureMechanism(); + + // Call + failureMechanism.Calculations.Add(calculation); + + // Assert + CollectionAssert.Contains(failureMechanism.Calculations, calculation); + } + + [Test] + public void Calculations_RemovePipingCalculation_ItemIsRemovedFromCollection() + { + // Setup + var calculation = new PipingCalculation(); + + var failureMechanism = new PipingFailureMechanism(); + failureMechanism.Calculations.Add(calculation); + + // Call + failureMechanism.Calculations.Remove(calculation); + + // Assert + CollectionAssert.DoesNotContain(failureMechanism.Calculations, calculation); + } + + [Test] + public void Calculations_AddPipingCalculationFolder_ItemIsAddedToCollection() + { + // Setup + var folder = new PipingCalculationGroup(); + + var failureMechanism = new PipingFailureMechanism(); + + // Call + failureMechanism.Calculations.Add(folder); + + // Assert + CollectionAssert.Contains(failureMechanism.Calculations, folder); + } + + [Test] + public void Calculations_RemovePipingCalculationFolder_ItemIsRemovedFromCollection() + { + // Setup + var folder = new PipingCalculationGroup(); + + var failureMechanism = new PipingFailureMechanism(); + failureMechanism.Calculations.Add(folder); + + // Call + failureMechanism.Calculations.Remove(folder); + + // Assert + CollectionAssert.DoesNotContain(failureMechanism.Calculations, folder); + } } } \ No newline at end of file Index: Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/Ringtoets.Piping.Data.Test.csproj =================================================================== diff -u -r8ed458d0460c2bab956a7c3a75c2cdb5c1aae3e6 -red0b4ea830beb801bcc0e3eb5b28993001ed2981 --- Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/Ringtoets.Piping.Data.Test.csproj (.../Ringtoets.Piping.Data.Test.csproj) (revision 8ed458d0460c2bab956a7c3a75c2cdb5c1aae3e6) +++ Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/Ringtoets.Piping.Data.Test.csproj (.../Ringtoets.Piping.Data.Test.csproj) (revision ed0b4ea830beb801bcc0e3eb5b28993001ed2981) @@ -60,7 +60,9 @@ - + + + Index: Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/PresentationObjects/PipingCalculationsTreeFolderTest.cs =================================================================== diff -u -rfb32e3411873a7b4c567792b9f335eba462e2702 -red0b4ea830beb801bcc0e3eb5b28993001ed2981 --- Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/PresentationObjects/PipingCalculationsTreeFolderTest.cs (.../PipingCalculationsTreeFolderTest.cs) (revision fb32e3411873a7b4c567792b9f335eba462e2702) +++ Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/PresentationObjects/PipingCalculationsTreeFolderTest.cs (.../PipingCalculationsTreeFolderTest.cs) (revision ed0b4ea830beb801bcc0e3eb5b28993001ed2981) @@ -14,7 +14,7 @@ public class PipingCalculationsTreeFolderTest { [Test] - public void ParameteredConstructor_ExpectedValues() + public void ParameteredConstructor_FailureMechanismWithOneCalculation_ExpectedValues() { // Setup const string folderName = "Berekeningen"; @@ -29,9 +29,11 @@ Assert.IsInstanceOf(calculationsFolder); Assert.AreEqual(folderName, calculationsFolder.Name); Assert.AreSame(failureMechanism, calculationsFolder.ParentFailureMechanism); - var calculationPresentationObjects = calculationsFolder.Contents - .OfType() - .ToArray(); + + object[] contentsAsArray = calculationsFolder.Contents.OfType().ToArray(); + Assert.AreEqual(1, contentsAsArray.Length); + var calculationPresentationObjects = contentsAsArray.Cast() + .ToArray(); foreach (var pipingCalculationContext in calculationPresentationObjects) { CollectionAssert.AreEqual(failureMechanism.SurfaceLines, pipingCalculationContext.AvailablePipingSurfaceLines); @@ -43,6 +45,31 @@ Assert.AreEqual(TreeFolderCategory.General, calculationsFolder.Category); } + [Test] + public void ParameteredConstructor_FailureMechanismWithOneEmptyCalculationGroup_ExpectedValues() + { + // Setup + const string folderName = "Berekeningen"; + + var group = new PipingCalculationGroup(); + + var failureMechanism = new PipingFailureMechanism(); + failureMechanism.Calculations.Clear(); + failureMechanism.Calculations.Add(group); + + // Call + var calculationsFolder = new PipingCalculationsTreeFolder(folderName, failureMechanism); + + // Assert + Assert.IsInstanceOf(calculationsFolder); + Assert.AreEqual(folderName, calculationsFolder.Name); + Assert.AreSame(failureMechanism, calculationsFolder.ParentFailureMechanism); + + object[] contentsAsArray = calculationsFolder.Contents.OfType().ToArray(); + Assert.AreEqual(1, contentsAsArray.Length); + CollectionAssert.AreEqual(new[]{group}, contentsAsArray); + } + private void AddTestSurfaceLines(PipingFailureMechanism failureMechanism) { var collection = (ICollection)failureMechanism.SurfaceLines;