Index: Demo/Ringtoets/src/Demo.Ringtoets/Commands/AddNewDemoAssessmentSectionCommand.cs =================================================================== diff -u -r20a3e0fe462e2afb58034a32ac56c063c7d9b5e2 -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Demo/Ringtoets/src/Demo.Ringtoets/Commands/AddNewDemoAssessmentSectionCommand.cs (.../AddNewDemoAssessmentSectionCommand.cs) (revision 20a3e0fe462e2afb58034a32ac56c063c7d9b5e2) +++ Demo/Ringtoets/src/Demo.Ringtoets/Commands/AddNewDemoAssessmentSectionCommand.cs (.../AddNewDemoAssessmentSectionCommand.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -27,6 +27,7 @@ using Core.Common.Base.Geometry; using Core.Common.Controls.Commands; using Core.Common.Gui; +using Core.Common.Gui.Commands; using Core.Common.Utils.IO; using Ringtoets.ClosingStructures.Data; using Ringtoets.Common.Data.AssessmentSection; @@ -55,10 +56,12 @@ public class AddNewDemoAssessmentSectionCommand : ICommand { private readonly IProjectOwner projectOwner; + private readonly IViewCommands viewCommands; - public AddNewDemoAssessmentSectionCommand(IProjectOwner projectOwner) + public AddNewDemoAssessmentSectionCommand(IProjectOwner projectOwner, IViewCommands viewCommands) { this.projectOwner = projectOwner; + this.viewCommands = viewCommands; } public bool Checked @@ -109,7 +112,7 @@ "traject_6-3.shx")) { var importer = new ReferenceLineImporter(demoAssessmentSection, - new ReferenceLineReplacementHandler(), + new ReferenceLineReplacementHandler(viewCommands), Path.Combine(embeddedResourceFileWriter.TargetFolderPath, "traject_6-3.shp")); importer.Import(); Index: Demo/Ringtoets/src/Demo.Ringtoets/Commands/OpenChartViewCommand.cs =================================================================== diff -u -rfea3ed82dfb6dfcad535eef16efcbaa9c01564ed -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Demo/Ringtoets/src/Demo.Ringtoets/Commands/OpenChartViewCommand.cs (.../OpenChartViewCommand.cs) (revision fea3ed82dfb6dfcad535eef16efcbaa9c01564ed) +++ Demo/Ringtoets/src/Demo.Ringtoets/Commands/OpenChartViewCommand.cs (.../OpenChartViewCommand.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -23,7 +23,7 @@ using System.Drawing.Drawing2D; using Core.Common.Base.Geometry; using Core.Common.Controls.Commands; -using Core.Common.Gui; +using Core.Common.Gui.Commands; using Core.Components.Charting.Data; using Core.Components.Charting.Styles; using Demo.Ringtoets.Properties; @@ -35,15 +35,15 @@ /// public class OpenChartViewCommand : ICommand { - private readonly IViewController viewController; + private readonly IViewCommands viewCommands; /// /// Creates a new instance of . /// - /// The to use internally. - public OpenChartViewCommand(IViewController viewController) + /// The to use internally. + public OpenChartViewCommand(IViewCommands viewCommands) { - this.viewController = viewController; + this.viewCommands = viewCommands; } public bool Checked @@ -252,7 +252,7 @@ chartDataCollection.Add(points1); chartDataCollection.Add(points2); - viewController.DocumentViewController.OpenViewForData(chartDataCollection); + viewCommands.OpenView(chartDataCollection); } } } \ No newline at end of file Index: Demo/Ringtoets/src/Demo.Ringtoets/Commands/OpenMapViewCommand.cs =================================================================== diff -u -rfea3ed82dfb6dfcad535eef16efcbaa9c01564ed -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Demo/Ringtoets/src/Demo.Ringtoets/Commands/OpenMapViewCommand.cs (.../OpenMapViewCommand.cs) (revision fea3ed82dfb6dfcad535eef16efcbaa9c01564ed) +++ Demo/Ringtoets/src/Demo.Ringtoets/Commands/OpenMapViewCommand.cs (.../OpenMapViewCommand.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -21,7 +21,7 @@ using Core.Common.Base.Geometry; using Core.Common.Controls.Commands; -using Core.Common.Gui; +using Core.Common.Gui.Commands; using Core.Components.Gis.Data; using Core.Components.Gis.Features; using Core.Components.Gis.Geometries; @@ -34,15 +34,15 @@ /// public class OpenMapViewCommand : ICommand { - private readonly IViewController viewController; + private readonly IViewCommands viewCommands; /// /// Creates a new instance of . /// - /// The to use internally. - public OpenMapViewCommand(IViewController viewController) + /// The to use internally. + public OpenMapViewCommand(IViewCommands viewCommands) { - this.viewController = viewController; + this.viewCommands = viewCommands; } public bool Checked @@ -198,7 +198,7 @@ }) }); - viewController.DocumentViewController.OpenViewForData(mapDataCollection); + viewCommands.OpenView(mapDataCollection); } private static MapFeature[] GetFeatureWithPoints(Point2D[] points) Index: Demo/Ringtoets/src/Demo.Ringtoets/GUIs/DemoProjectPlugin.cs =================================================================== diff -u -r1a49563c568eaef8b84743fec1f04ee119bf5c9c -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Demo/Ringtoets/src/Demo.Ringtoets/GUIs/DemoProjectPlugin.cs (.../DemoProjectPlugin.cs) (revision 1a49563c568eaef8b84743fec1f04ee119bf5c9c) +++ Demo/Ringtoets/src/Demo.Ringtoets/GUIs/DemoProjectPlugin.cs (.../DemoProjectPlugin.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -40,7 +40,7 @@ { get { - return new RingtoetsDemoProjectRibbon(Gui, Gui); + return new RingtoetsDemoProjectRibbon(Gui, Gui.ViewCommands); } } Index: Demo/Ringtoets/src/Demo.Ringtoets/Ribbons/RingtoetsDemoProjectRibbon.xaml.cs =================================================================== diff -u -rfea3ed82dfb6dfcad535eef16efcbaa9c01564ed -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Demo/Ringtoets/src/Demo.Ringtoets/Ribbons/RingtoetsDemoProjectRibbon.xaml.cs (.../RingtoetsDemoProjectRibbon.xaml.cs) (revision fea3ed82dfb6dfcad535eef16efcbaa9c01564ed) +++ Demo/Ringtoets/src/Demo.Ringtoets/Ribbons/RingtoetsDemoProjectRibbon.xaml.cs (.../RingtoetsDemoProjectRibbon.xaml.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -22,6 +22,7 @@ using System.Windows; using Core.Common.Controls.Commands; using Core.Common.Gui; +using Core.Common.Gui.Commands; using Core.Common.Gui.Forms; using Demo.Ringtoets.Commands; using Fluent; @@ -35,13 +36,13 @@ { private readonly ICommand addNewAssessmentSection, openMapViewCommand, openChartViewCommand; - public RingtoetsDemoProjectRibbon(IProjectOwner projectOwner, IViewController viewController) + public RingtoetsDemoProjectRibbon(IProjectOwner projectOwner, IViewCommands viewCommands) { InitializeComponent(); - addNewAssessmentSection = new AddNewDemoAssessmentSectionCommand(projectOwner); - openChartViewCommand = new OpenChartViewCommand(viewController); - openMapViewCommand = new OpenMapViewCommand(viewController); + addNewAssessmentSection = new AddNewDemoAssessmentSectionCommand(projectOwner, viewCommands); + openChartViewCommand = new OpenChartViewCommand(viewCommands); + openMapViewCommand = new OpenMapViewCommand(viewCommands); } public Ribbon GetRibbonControl() Index: Demo/Ringtoets/test/Demo.Ringtoets.Test/Commands/AddNewDemoAssessmentSectionCommandTest.cs =================================================================== diff -u -rd641f7a03b05f5d7e48f9adeffabafdcb48e1c14 -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Demo/Ringtoets/test/Demo.Ringtoets.Test/Commands/AddNewDemoAssessmentSectionCommandTest.cs (.../AddNewDemoAssessmentSectionCommandTest.cs) (revision d641f7a03b05f5d7e48f9adeffabafdcb48e1c14) +++ Demo/Ringtoets/test/Demo.Ringtoets.Test/Commands/AddNewDemoAssessmentSectionCommandTest.cs (.../AddNewDemoAssessmentSectionCommandTest.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -28,6 +28,7 @@ using Core.Common.Base.Geometry; using Core.Common.Controls.Commands; using Core.Common.Gui; +using Core.Common.Gui.Commands; using Demo.Ringtoets.Commands; using NUnit.Framework; using Rhino.Mocks; @@ -60,10 +61,11 @@ // Setup var mocks = new MockRepository(); var projectOwner = mocks.Stub(); + var viewCommands = mocks.Stub(); mocks.ReplayAll(); // Call - var command = new AddNewDemoAssessmentSectionCommand(projectOwner); + var command = new AddNewDemoAssessmentSectionCommand(projectOwner, viewCommands); // Assert Assert.IsInstanceOf(command); @@ -83,9 +85,11 @@ var observerMock = mocks.StrictMock(); observerMock.Expect(o => o.UpdateObserver()); + + var viewCommands = mocks.Stub(); mocks.ReplayAll(); - var command = new AddNewDemoAssessmentSectionCommand(projectOwnerStub); + var command = new AddNewDemoAssessmentSectionCommand(projectOwnerStub, viewCommands); project.Attach(observerMock); // Call Index: Demo/Ringtoets/test/Demo.Ringtoets.Test/Commands/OpenChartViewCommandTest.cs =================================================================== diff -u -rfea3ed82dfb6dfcad535eef16efcbaa9c01564ed -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Demo/Ringtoets/test/Demo.Ringtoets.Test/Commands/OpenChartViewCommandTest.cs (.../OpenChartViewCommandTest.cs) (revision fea3ed82dfb6dfcad535eef16efcbaa9c01564ed) +++ Demo/Ringtoets/test/Demo.Ringtoets.Test/Commands/OpenChartViewCommandTest.cs (.../OpenChartViewCommandTest.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -19,8 +19,7 @@ // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. -using Core.Common.Gui; -using Core.Common.Gui.Forms.ViewHost; +using Core.Common.Gui.Commands; using Demo.Ringtoets.Commands; using NUnit.Framework; using Rhino.Mocks; @@ -35,14 +34,11 @@ { // Setup var mocks = new MockRepository(); - var viewController = mocks.StrictMock(); - var documentViewController = mocks.StrictMock(); - viewController.Expect(g => g.DocumentViewController).Return(documentViewController); - documentViewController.Expect(vr => vr.OpenViewForData(null)).IgnoreArguments().Return(true); - + var viewCommands = mocks.StrictMock(); + viewCommands.Expect(g => g.OpenView(Arg.Is.NotNull)); mocks.ReplayAll(); - var command = new OpenChartViewCommand(viewController); + var command = new OpenChartViewCommand(viewCommands); // Call command.Execute(); @@ -56,10 +52,10 @@ { // Setup var mocks = new MockRepository(); - var viewController = mocks.Stub(); + var viewCommands = mocks.Stub(); mocks.ReplayAll(); - var command = new OpenChartViewCommand(viewController); + var command = new OpenChartViewCommand(viewCommands); // Call var isChecked = command.Checked; Index: Demo/Ringtoets/test/Demo.Ringtoets.Test/Commands/OpenMapViewCommandTest.cs =================================================================== diff -u -rfea3ed82dfb6dfcad535eef16efcbaa9c01564ed -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Demo/Ringtoets/test/Demo.Ringtoets.Test/Commands/OpenMapViewCommandTest.cs (.../OpenMapViewCommandTest.cs) (revision fea3ed82dfb6dfcad535eef16efcbaa9c01564ed) +++ Demo/Ringtoets/test/Demo.Ringtoets.Test/Commands/OpenMapViewCommandTest.cs (.../OpenMapViewCommandTest.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -20,8 +20,7 @@ // All rights reserved. using Core.Common.Controls.Commands; -using Core.Common.Gui; -using Core.Common.Gui.Forms.ViewHost; +using Core.Common.Gui.Commands; using Demo.Ringtoets.Commands; using NUnit.Framework; using Rhino.Mocks; @@ -36,11 +35,11 @@ { // Setup var mocks = new MockRepository(); - var viewController = mocks.Stub(); + var viewCommands = mocks.Stub(); mocks.ReplayAll(); // Call - var command = new OpenMapViewCommand(viewController); + var command = new OpenMapViewCommand(viewCommands); // Assert Assert.IsInstanceOf(command); @@ -53,14 +52,11 @@ { // Setup var mocks = new MockRepository(); - var viewController = mocks.StrictMock(); - var documentViewController = mocks.StrictMock(); - viewController.Expect(g => g.DocumentViewController).Return(documentViewController); - documentViewController.Expect(vr => vr.OpenViewForData(null)).IgnoreArguments().Return(true); - + var viewCommands = mocks.StrictMock(); + viewCommands.Expect(g => g.OpenView(Arg.Is.NotNull)); mocks.ReplayAll(); - var command = new OpenMapViewCommand(viewController); + var command = new OpenMapViewCommand(viewCommands); // Call command.Execute(); @@ -74,11 +70,11 @@ { // Setup var mocks = new MockRepository(); - var viewController = mocks.Stub(); + var viewCommands = mocks.Stub(); mocks.ReplayAll(); // Call - var command = new OpenMapViewCommand(viewController); + var command = new OpenMapViewCommand(viewCommands); // Assert Assert.IsFalse(command.Checked); Index: Demo/Ringtoets/test/Demo.Ringtoets.Test/GUIs/DemoProjectPluginTest.cs =================================================================== diff -u -rfea3ed82dfb6dfcad535eef16efcbaa9c01564ed -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Demo/Ringtoets/test/Demo.Ringtoets.Test/GUIs/DemoProjectPluginTest.cs (.../DemoProjectPluginTest.cs) (revision fea3ed82dfb6dfcad535eef16efcbaa9c01564ed) +++ Demo/Ringtoets/test/Demo.Ringtoets.Test/GUIs/DemoProjectPluginTest.cs (.../DemoProjectPluginTest.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -20,13 +20,15 @@ // All rights reserved. using System.Linq; +using Core.Common.Gui; using Core.Common.Gui.Forms; using Core.Common.Gui.Plugin; using Core.Components.Charting.Data; using Core.Components.Gis.Data; using Demo.Ringtoets.GUIs; using Demo.Ringtoets.Views; using NUnit.Framework; +using Rhino.Mocks; namespace Demo.Ringtoets.Test.GUIs { @@ -37,13 +39,22 @@ [RequiresSTA] public void DefaultConstructor_DefaultValues() { + // Setup + var mocks = new MockRepository(); + var gui = mocks.Stub(); + mocks.ReplayAll(); + // Call - using (var plugin = new DemoProjectPlugin()) + using (var plugin = new DemoProjectPlugin { + Gui = gui + }) + { // Assert Assert.IsInstanceOf(plugin); Assert.IsInstanceOf(plugin.RibbonCommandHandler); } + mocks.VerifyAll(); } [Test] Index: Demo/Ringtoets/test/Demo.Ringtoets.Test/Ribbons/RingtoetsDemoProjectRibbonTest.cs =================================================================== diff -u -r30332db4c8d709bbb543c5085345fb22a9e4809e -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Demo/Ringtoets/test/Demo.Ringtoets.Test/Ribbons/RingtoetsDemoProjectRibbonTest.cs (.../RingtoetsDemoProjectRibbonTest.cs) (revision 30332db4c8d709bbb543c5085345fb22a9e4809e) +++ Demo/Ringtoets/test/Demo.Ringtoets.Test/Ribbons/RingtoetsDemoProjectRibbonTest.cs (.../RingtoetsDemoProjectRibbonTest.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -23,6 +23,7 @@ using System.Windows.Controls; using System.Windows.Controls.Primitives; using Core.Common.Gui; +using Core.Common.Gui.Commands; using Core.Common.Gui.Forms.ViewHost; using Demo.Ringtoets.Ribbons; using NUnit.Framework; @@ -40,11 +41,11 @@ // Setup var mocks = new MockRepository(); var projectOwner = mocks.Stub(); - var viewController = mocks.Stub(); + var viewCommands = mocks.Stub(); mocks.ReplayAll(); // Call - var ribbon = new RingtoetsDemoProjectRibbon(projectOwner, viewController); + var ribbon = new RingtoetsDemoProjectRibbon(projectOwner, viewCommands); // Assert Assert.IsNotNull(ribbon); @@ -58,16 +59,13 @@ { // Setup var mocks = new MockRepository(); - var documentViewController = mocks.StrictMock(); - documentViewController.Expect(vr => vr.OpenViewForData(null)).IgnoreArguments().Return(true); - var projectOwner = mocks.Stub(); - var viewController = mocks.Stub(); - viewController.Expect(vc => vc.DocumentViewController).Return(documentViewController); + var viewCommands = mocks.Stub(); + viewCommands.Expect(vc => vc.OpenView(null)).IgnoreArguments(); mocks.ReplayAll(); - var ribbon = new RingtoetsDemoProjectRibbon(projectOwner, viewController); + var ribbon = new RingtoetsDemoProjectRibbon(projectOwner, viewCommands); var button = ribbon.GetRibbonControl().FindName("OpenChartViewButton") as Button; // Precondition @@ -86,16 +84,13 @@ { // Setup var mocks = new MockRepository(); - var documentViewController = mocks.StrictMock(); - documentViewController.Expect(vr => vr.OpenViewForData(null)).IgnoreArguments().Return(true); - var projectOwner = mocks.Stub(); - var viewController = mocks.Stub(); - viewController.Expect(vc => vc.DocumentViewController).Return(documentViewController); + var viewCommands = mocks.Stub(); + viewCommands.Expect(vc => vc.OpenView(null)).IgnoreArguments(); mocks.ReplayAll(); - var ribbon = new RingtoetsDemoProjectRibbon(projectOwner, viewController); + var ribbon = new RingtoetsDemoProjectRibbon(projectOwner, viewCommands); var button = ribbon.GetRibbonControl().FindName("OpenMapViewButton") as Button; Index: Ringtoets/ClosingStructures/src/Ringtoets.ClosingStructures.Service/ClosingStructuresDataSynchronizationService.cs =================================================================== diff -u -re182f6f394aa75e739467a77e7bcacd9a8b25429 -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/ClosingStructures/src/Ringtoets.ClosingStructures.Service/ClosingStructuresDataSynchronizationService.cs (.../ClosingStructuresDataSynchronizationService.cs) (revision e182f6f394aa75e739467a77e7bcacd9a8b25429) +++ Ringtoets/ClosingStructures/src/Ringtoets.ClosingStructures.Service/ClosingStructuresDataSynchronizationService.cs (.../ClosingStructuresDataSynchronizationService.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -25,6 +25,7 @@ using System.Linq; using Core.Common.Base; using Ringtoets.ClosingStructures.Data; +using Ringtoets.Common.Data.Calculation; using Ringtoets.Common.Data.Hydraulics; using Ringtoets.Common.Data.Structures; using Ringtoets.Common.Service; @@ -89,29 +90,37 @@ /// Clears all data dependent, either directly or indirectly, on the parent reference line. /// /// The failure mechanism to be cleared. - /// All objects that have been changed. - public static IEnumerable ClearReferenceLineDependentData(ClosingStructuresFailureMechanism failureMechanism) + /// The results of the clear action. + /// Thrown when + /// is null. + public static ClearResults ClearReferenceLineDependentData(ClosingStructuresFailureMechanism failureMechanism) { if (failureMechanism == null) { throw new ArgumentNullException("failureMechanism"); } - var observables = new Collection(); + var changedObjects = new Collection(); + var removedObjects = failureMechanism.Sections.OfType() + .Concat(failureMechanism.SectionResults) + .Concat(failureMechanism.CalculationsGroup.GetAllChildrenRecursive()) + .Concat(failureMechanism.ForeshoreProfiles) + .Concat(failureMechanism.ClosingStructures) + .ToArray(); failureMechanism.ClearAllSections(); - observables.Add(failureMechanism); + changedObjects.Add(failureMechanism); failureMechanism.CalculationsGroup.Children.Clear(); - observables.Add(failureMechanism.CalculationsGroup); + changedObjects.Add(failureMechanism.CalculationsGroup); failureMechanism.ForeshoreProfiles.Clear(); - observables.Add(failureMechanism.ForeshoreProfiles); + changedObjects.Add(failureMechanism.ForeshoreProfiles); failureMechanism.ClosingStructures.Clear(); - observables.Add(failureMechanism.ClosingStructures); + changedObjects.Add(failureMechanism.ClosingStructures); - return observables; + return new ClearResults(changedObjects, removedObjects); } /// Index: Ringtoets/ClosingStructures/test/Ringtoets.ClosingStructures.Service.Test/ClosingStructureDataSynchronizationServiceTest.cs =================================================================== diff -u -r8905298103eb01ce13dd5c1a2f267f879d4fda3e -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/ClosingStructures/test/Ringtoets.ClosingStructures.Service.Test/ClosingStructureDataSynchronizationServiceTest.cs (.../ClosingStructureDataSynchronizationServiceTest.cs) (revision 8905298103eb01ce13dd5c1a2f267f879d4fda3e) +++ Ringtoets/ClosingStructures/test/Ringtoets.ClosingStructures.Service.Test/ClosingStructureDataSynchronizationServiceTest.cs (.../ClosingStructureDataSynchronizationServiceTest.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -33,6 +33,7 @@ using Ringtoets.Common.Data.Probability; using Ringtoets.Common.Data.Structures; using Ringtoets.Common.Data.TestUtil; +using Ringtoets.Common.Service; namespace Ringtoets.ClosingStructures.Service.Test { @@ -277,24 +278,31 @@ // Setup ClosingStructuresFailureMechanism failureMechanism = CreateFullyConfiguredFailureMechanism(); + var expectedRemovedObjects = failureMechanism.Sections.OfType() + .Concat(failureMechanism.SectionResults) + .Concat(failureMechanism.CalculationsGroup.GetAllChildrenRecursive()) + .Concat(failureMechanism.ForeshoreProfiles) + .Concat(failureMechanism.ClosingStructures) + .ToArray(); + // Call - IEnumerable observables = ClosingStructuresDataSynchronizationService.ClearReferenceLineDependentData(failureMechanism); + ClearResults results = ClosingStructuresDataSynchronizationService.ClearReferenceLineDependentData(failureMechanism); // Assert - // Note: To make sure the clear is performed regardless of what is done with - // the return result, no ToArray() should be called before these assertions: CollectionAssert.IsEmpty(failureMechanism.Sections); CollectionAssert.IsEmpty(failureMechanism.SectionResults); CollectionAssert.IsEmpty(failureMechanism.CalculationsGroup.Children); CollectionAssert.IsEmpty(failureMechanism.ForeshoreProfiles); CollectionAssert.IsEmpty(failureMechanism.ClosingStructures); - IObservable[] array = observables.ToArray(); + IObservable[] array = results.ChangedObjects.ToArray(); Assert.AreEqual(4, array.Length); CollectionAssert.Contains(array, failureMechanism); CollectionAssert.Contains(array, failureMechanism.CalculationsGroup); CollectionAssert.Contains(array, failureMechanism.ForeshoreProfiles); CollectionAssert.Contains(array, failureMechanism.ClosingStructures); + + CollectionAssert.AreEquivalent(expectedRemovedObjects, results.DeletedObjects); } [Test] Index: Ringtoets/ClosingStructures/test/Ringtoets.ClosingStructures.Service.Test/Ringtoets.ClosingStructures.Service.Test.csproj =================================================================== diff -u -r586d097de0087256cb5cf3dda3a3c612721fee9c -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/ClosingStructures/test/Ringtoets.ClosingStructures.Service.Test/Ringtoets.ClosingStructures.Service.Test.csproj (.../Ringtoets.ClosingStructures.Service.Test.csproj) (revision 586d097de0087256cb5cf3dda3a3c612721fee9c) +++ Ringtoets/ClosingStructures/test/Ringtoets.ClosingStructures.Service.Test/Ringtoets.ClosingStructures.Service.Test.csproj (.../Ringtoets.ClosingStructures.Service.Test.csproj) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -80,6 +80,10 @@ {D4200F43-3F72-4F42-AF0A-8CED416A38EC} Ringtoets.Common.Data + + {d951d6da-fe83-4920-9fdb-63bf96480b54} + Ringtoets.Common.Service + {4843D6E5-066F-4795-94F5-1D53932DD03C} Ringtoets.Common.Data.TestUtil Index: Ringtoets/Common/src/Ringtoets.Common.Data/Calculation/CalculationGroupExtensions.cs =================================================================== diff -u -r34a892d5a6359899794f3fb44fcc5a900abaf697 -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/Common/src/Ringtoets.Common.Data/Calculation/CalculationGroupExtensions.cs (.../CalculationGroupExtensions.cs) (revision 34a892d5a6359899794f3fb44fcc5a900abaf697) +++ Ringtoets/Common/src/Ringtoets.Common.Data/Calculation/CalculationGroupExtensions.cs (.../CalculationGroupExtensions.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -31,9 +31,31 @@ { /// /// Recursively enumerates across the contents of a calculation group, - /// yielding all calculations found. + /// returning all children found. /// /// The calculation group to be evaluated. + /// Returns all contained children as an enumerable result. + public static IEnumerable GetAllChildrenRecursive(this CalculationGroup calculationGroup) + { + var children = new List(); + foreach (ICalculationBase calculationItem in calculationGroup.Children) + { + children.Add(calculationItem); + + var nestedCalculationGroup = calculationItem as CalculationGroup; + if (nestedCalculationGroup != null) + { + children.AddRange(GetAllChildrenRecursive(nestedCalculationGroup)); + } + } + return children; + } + + /// + /// Recursively enumerates across the contents of a calculation group, + /// returning all calculations found. + /// + /// The calculation group to be evaluated. /// Returns all contained calculations as an enumerable result. public static IEnumerable GetCalculations(this CalculationGroup calculationGroup) { Index: Ringtoets/Common/src/Ringtoets.Common.IO/ReferenceLines/IReferenceLineReplaceHandler.cs =================================================================== diff -u -rffe405e6b0f8b4d10e6be78cf7735c554eb42a93 -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/Common/src/Ringtoets.Common.IO/ReferenceLines/IReferenceLineReplaceHandler.cs (.../IReferenceLineReplaceHandler.cs) (revision ffe405e6b0f8b4d10e6be78cf7735c554eb42a93) +++ Ringtoets/Common/src/Ringtoets.Common.IO/ReferenceLines/IReferenceLineReplaceHandler.cs (.../IReferenceLineReplaceHandler.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -46,5 +46,10 @@ /// The new reference line. /// All objects that have been affected by the replacement. IEnumerable Replace(IAssessmentSection section, ReferenceLine newReferenceLine); + + /// + /// Perform post-replacement updates. + /// + void DoPostReplacementUpdates(); } } \ No newline at end of file Index: Ringtoets/Common/src/Ringtoets.Common.IO/ReferenceLines/ReferenceLineImporter.cs =================================================================== diff -u -r0324c332753d36bb804a804b9757ef1cd336435f -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/Common/src/Ringtoets.Common.IO/ReferenceLines/ReferenceLineImporter.cs (.../ReferenceLineImporter.cs) (revision 0324c332753d36bb804a804b9757ef1cd336435f) +++ Ringtoets/Common/src/Ringtoets.Common.IO/ReferenceLines/ReferenceLineImporter.cs (.../ReferenceLineImporter.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -87,6 +87,12 @@ return true; } + public override void DoPostImportUpdates() + { + replacementHandler.DoPostReplacementUpdates(); + base.DoPostImportUpdates(); + } + protected override IEnumerable AffectedNonTargetObservableInstances { get Index: Ringtoets/Common/src/Ringtoets.Common.Service/ClearResults.cs =================================================================== diff -u --- Ringtoets/Common/src/Ringtoets.Common.Service/ClearResults.cs (revision 0) +++ Ringtoets/Common/src/Ringtoets.Common.Service/ClearResults.cs (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -0,0 +1,64 @@ +// Copyright (C) Stichting Deltares 2016. All rights reserved. +// +// This file is part of Ringtoets. +// +// Ringtoets is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// All names, logos, and references to "Deltares" are registered trademarks of +// Stichting Deltares and remain full property of Stichting Deltares at all times. +// All rights reserved. + +using System; +using System.Collections.Generic; +using Core.Common.Base; + +namespace Ringtoets.Common.Service +{ + /// + /// Class that stores the affected objects by a clear action. + /// + public class ClearResults + { + /// + /// Creates a new instances of . + /// + /// All objects that have been changed by the clear action. + /// All objects that have been removed by the clear action. + /// Thrown when any input argument is null. + public ClearResults(IEnumerable changedObjects, IEnumerable removedObjects) + { + if (changedObjects == null) + { + throw new ArgumentNullException("changedObjects"); + } + if (removedObjects == null) + { + throw new ArgumentNullException("removedObjects"); + } + + ChangedObjects = changedObjects; + DeletedObjects = removedObjects; + } + + /// + /// The changed objects. + /// + public IEnumerable ChangedObjects { get; private set; } + + /// + /// The removed objects. + /// + public IEnumerable DeletedObjects { get; private set; } + } +} \ No newline at end of file Index: Ringtoets/Common/src/Ringtoets.Common.Service/Ringtoets.Common.Service.csproj =================================================================== diff -u -r23d1e296e2da4364fbfe346e68d582dfcf966bb0 -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/Common/src/Ringtoets.Common.Service/Ringtoets.Common.Service.csproj (.../Ringtoets.Common.Service.csproj) (revision 23d1e296e2da4364fbfe346e68d582dfcf966bb0) +++ Ringtoets/Common/src/Ringtoets.Common.Service/Ringtoets.Common.Service.csproj (.../Ringtoets.Common.Service.csproj) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -44,6 +44,7 @@ Properties\GlobalAssembly.cs + Index: Ringtoets/Common/test/Ringtoets.Common.Data.Test/Calculation/CalculationGroupExtensionsTest.cs =================================================================== diff -u -rf64dceaa32788bad28dcf09f4a1c3150595f1327 -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/Common/test/Ringtoets.Common.Data.Test/Calculation/CalculationGroupExtensionsTest.cs (.../CalculationGroupExtensionsTest.cs) (revision f64dceaa32788bad28dcf09f4a1c3150595f1327) +++ Ringtoets/Common/test/Ringtoets.Common.Data.Test/Calculation/CalculationGroupExtensionsTest.cs (.../CalculationGroupExtensionsTest.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -221,5 +221,83 @@ Assert.IsTrue(hasOutput); mocks.VerifyAll(); } + + [Test] + public void GetAllChildrenRecursive_EmptyGroup_ReturnEmpty() + { + // Setup + var group = new CalculationGroup(); + + // Call + IEnumerable children = group.GetAllChildrenRecursive(); + + // Assert + CollectionAssert.IsEmpty(children); + } + + + [Test] + public void GetAllChildrenRecursive_GroupWithNestedGroupsWithCalculations_ReturnAllNestedGroupsAndCalculations() + { + // Setup + var mocks = new MockRepository(); + var calculation1 = mocks.Stub(); + var calculation2 = mocks.Stub(); + var calculation3 = mocks.Stub(); + var calculation4 = mocks.Stub(); + mocks.ReplayAll(); + + var nestedChildGroup = new CalculationGroup + { + Children = + { + calculation3 + } + }; + + var childGroup1 = new CalculationGroup + { + Children = + { + calculation2 + } + }; + var childGroup2 = new CalculationGroup + { + Children = + { + nestedChildGroup, + calculation4 + } + }; + + var rootGroup = new CalculationGroup + { + Children = + { + calculation1, + childGroup1, + childGroup2 + } + }; + + var expectedChildren = new ICalculationBase[] + { + calculation1, + calculation2, + calculation3, + calculation4, + childGroup1, + childGroup2, + nestedChildGroup + }; + + // Call + IEnumerable children = rootGroup.GetAllChildrenRecursive(); + + // Assert + CollectionAssert.AreEquivalent(expectedChildren, children); + mocks.VerifyAll(); + } } } \ No newline at end of file Index: Ringtoets/Common/test/Ringtoets.Common.IO.Test/ReferenceLines/ReferenceLineImporterTest.cs =================================================================== diff -u -rdee01f6d6c15af0cc124816bfe99c7658af8995d -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/Common/test/Ringtoets.Common.IO.Test/ReferenceLines/ReferenceLineImporterTest.cs (.../ReferenceLineImporterTest.cs) (revision dee01f6d6c15af0cc124816bfe99c7658af8995d) +++ Ringtoets/Common/test/Ringtoets.Common.IO.Test/ReferenceLines/ReferenceLineImporterTest.cs (.../ReferenceLineImporterTest.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -332,7 +332,7 @@ handler.Expect(h => h.Replace(Arg.Is.Same(assessmentSection), Arg.Is.NotNull)) .Return(observables); - + handler.Expect(h => h.DoPostReplacementUpdates()); mocks.ReplayAll(); var path = TestHelper.GetTestDataPath(TestDataPath.Ringtoets.Common.IO, @@ -367,6 +367,8 @@ assessmentSection.Expect(section => section.Attach(contextObserver)); var handler = mocks.StrictMock(); + handler.Expect(h => h.DoPostReplacementUpdates()); + var importer = new ReferenceLineImporter(assessmentSection, handler, path); handler.Expect(h => h.ConfirmReplace()) .WhenCalled(invocation => importer.Cancel()) @@ -421,6 +423,7 @@ handler.Expect(h => h.Replace(Arg.Is.Same(assessmentSection), Arg.Is.NotNull)) .Return(observables); + handler.Expect(h => h.DoPostReplacementUpdates()); mocks.ReplayAll(); Index: Ringtoets/Common/test/Ringtoets.Common.Service.Test/ClearResultsTest.cs =================================================================== diff -u --- Ringtoets/Common/test/Ringtoets.Common.Service.Test/ClearResultsTest.cs (revision 0) +++ Ringtoets/Common/test/Ringtoets.Common.Service.Test/ClearResultsTest.cs (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -0,0 +1,76 @@ +// Copyright (C) Stichting Deltares 2016. All rights reserved. +// +// This file is part of Ringtoets. +// +// Ringtoets is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// All names, logos, and references to "Deltares" are registered trademarks of +// Stichting Deltares and remain full property of Stichting Deltares at all times. +// All rights reserved. + +using System; +using Core.Common.Base; +using NUnit.Framework; + +namespace Ringtoets.Common.Service.Test +{ + [TestFixture] + public class ClearResultsTest + { + [Test] + public void ConstructorTest_ValidArguments_ExpectedValues() + { + // Setup + var changedObjectsArray = new IObservable[0]; + var deletedObjectsArray = new object[0]; + + // Call + var results = new ClearResults(changedObjectsArray, deletedObjectsArray); + + // Assert + Assert.AreSame(changedObjectsArray, results.ChangedObjects); + Assert.AreSame(deletedObjectsArray, results.DeletedObjects); + } + + + [Test] + public void Constructor_ChangedObjectsNull_ThrowArgumentNullException() + { + // Setup + var deletedObjectsArray = new object[0]; + + // Call + TestDelegate call = () => new ClearResults(null, deletedObjectsArray); + + // Assert + string paramName = Assert.Throws(call).ParamName; + Assert.AreEqual("changedObjects", paramName); + } + + + [Test] + public void Constructor_DeletedObjectsNull_ThrowArgumentNullException() + { + // Setup + var changedObjectsArray = new IObservable[0]; + + // Call + TestDelegate call = () => new ClearResults(changedObjectsArray, null); + + // Assert + string paramName = Assert.Throws(call).ParamName; + Assert.AreEqual("removedObjects", paramName); + } + } +} \ No newline at end of file Index: Ringtoets/Common/test/Ringtoets.Common.Service.Test/Ringtoets.Common.Service.Test.csproj =================================================================== diff -u -r586d097de0087256cb5cf3dda3a3c612721fee9c -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/Common/test/Ringtoets.Common.Service.Test/Ringtoets.Common.Service.Test.csproj (.../Ringtoets.Common.Service.Test.csproj) (revision 586d097de0087256cb5cf3dda3a3c612721fee9c) +++ Ringtoets/Common/test/Ringtoets.Common.Service.Test/Ringtoets.Common.Service.Test.csproj (.../Ringtoets.Common.Service.Test.csproj) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -57,6 +57,7 @@ Properties\GlobalAssembly.cs + Index: Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Plugin/GrassCoverErosionInwardsPlugin.cs =================================================================== diff -u -rca3449dbec4170e0321aa3f0612a26419e70d6ec -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Plugin/GrassCoverErosionInwardsPlugin.cs (.../GrassCoverErosionInwardsPlugin.cs) (revision ca3449dbec4170e0321aa3f0612a26419e70d6ec) +++ Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Plugin/GrassCoverErosionInwardsPlugin.cs (.../GrassCoverErosionInwardsPlugin.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -279,6 +279,11 @@ { return ReferenceEquals(view.Data, calculationContext.WrappedData); } + var calculation = o as GrassCoverErosionInwardsCalculation; + if (calculation != null) + { + return ReferenceEquals(view.Data, calculation); + } IEnumerable calculations = null; Index: Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Service/GrassCoverErosionInwardsDataSynchronizationService.cs =================================================================== diff -u -re182f6f394aa75e739467a77e7bcacd9a8b25429 -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Service/GrassCoverErosionInwardsDataSynchronizationService.cs (.../GrassCoverErosionInwardsDataSynchronizationService.cs) (revision e182f6f394aa75e739467a77e7bcacd9a8b25429) +++ Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Service/GrassCoverErosionInwardsDataSynchronizationService.cs (.../GrassCoverErosionInwardsDataSynchronizationService.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -23,7 +23,9 @@ using System.Collections.Generic; using System.Linq; using Core.Common.Base; +using Ringtoets.Common.Data.Calculation; using Ringtoets.Common.Data.Hydraulics; +using Ringtoets.Common.Service; using Ringtoets.GrassCoverErosionInwards.Data; namespace Ringtoets.GrassCoverErosionInwards.Service @@ -111,17 +113,22 @@ /// Clears all data dependent, either directly or indirectly, on the parent reference line. /// /// The failure mechanism to be cleared. - /// All objects that have been changed. + /// The results of the clear action. /// Thrown when /// is null. - public static IEnumerable ClearReferenceLineDependentData(GrassCoverErosionInwardsFailureMechanism failureMechanism) + public static ClearResults ClearReferenceLineDependentData(GrassCoverErosionInwardsFailureMechanism failureMechanism) { if (failureMechanism == null) { throw new ArgumentNullException("failureMechanism"); } var observables = new List(); + var removedObjects = failureMechanism.Sections.OfType() + .Concat(failureMechanism.SectionResults) + .Concat(failureMechanism.CalculationsGroup.GetAllChildrenRecursive()) + .Concat(failureMechanism.DikeProfiles) + .ToArray(); failureMechanism.ClearAllSections(); observables.Add(failureMechanism); @@ -132,7 +139,7 @@ failureMechanism.DikeProfiles.Clear(); observables.Add(failureMechanism.DikeProfiles); - return observables; + return new ClearResults(observables, removedObjects); } private static IEnumerable ClearHydraulicBoundaryLocation(GrassCoverErosionInwardsInput input) Index: Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Plugin.Test/ViewInfos/GrassCoverErosionInwardsInputViewInfoTest.cs =================================================================== diff -u -r6c3a074511922fb175a1aa7f20168bbb6d63a688 -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Plugin.Test/ViewInfos/GrassCoverErosionInwardsInputViewInfoTest.cs (.../GrassCoverErosionInwardsInputViewInfoTest.cs) (revision 6c3a074511922fb175a1aa7f20168bbb6d63a688) +++ Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Plugin.Test/ViewInfos/GrassCoverErosionInwardsInputViewInfoTest.cs (.../GrassCoverErosionInwardsInputViewInfoTest.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -101,7 +101,7 @@ } [Test] - public void CloseForData_ViewCorrespondingToRemovedCalculationScenarioContext_ReturnsTrue() + public void CloseForData_ViewCorrespondingToRemovedCalculationContext_ReturnsTrue() { // Setup IAssessmentSection assessmentSection = mocks.StrictMock(); @@ -127,7 +127,7 @@ } [Test] - public void CloseForData_ViewNotCorrespondingToRemovedCalculationScenarioContext_ReturnsFalse() + public void CloseForData_ViewNotCorrespondingToRemovedCalculationContext_ReturnsFalse() { // Setup IAssessmentSection assessmentSection = mocks.StrictMock(); @@ -155,6 +155,47 @@ } [Test] + public void CloseForData_ViewCorrespondingToRemovedCalculation_ReturnsTrue() + { + // Setup + GrassCoverErosionInwardsCalculation calculation = new GrassCoverErosionInwardsCalculation(); + + using (GrassCoverErosionInwardsInputView view = new GrassCoverErosionInwardsInputView + { + Data = calculation + }) + { + // Call + bool closeForData = info.CloseForData(view, calculation); + + // Assert + Assert.IsTrue(closeForData); + mocks.VerifyAll(); + } + } + + [Test] + public void CloseForData_ViewNotCorrespondingToRemovedCalculation_ReturnsFalse() + { + // Setup + GrassCoverErosionInwardsCalculation calculation = new GrassCoverErosionInwardsCalculation(); + GrassCoverErosionInwardsCalculation calculationToRemove = new GrassCoverErosionInwardsCalculation(); + + using (GrassCoverErosionInwardsInputView view = new GrassCoverErosionInwardsInputView + { + Data = calculation + }) + { + // Call + bool closeForData = info.CloseForData(view, calculationToRemove); + + // Assert + Assert.IsFalse(closeForData); + mocks.VerifyAll(); + } + } + + [Test] public void CloseForData_ViewCorrespondingWithRemovedCalculationGroupContext_ReturnsTrue() { // Setup Index: Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Utils.Test/GrassCoverErosionInwardsDataSynchronizationServiceTest.cs =================================================================== diff -u -rd56bec747401ad6676fac64af5eef6d5fd89c47c -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Utils.Test/GrassCoverErosionInwardsDataSynchronizationServiceTest.cs (.../GrassCoverErosionInwardsDataSynchronizationServiceTest.cs) (revision d56bec747401ad6676fac64af5eef6d5fd89c47c) +++ Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Utils.Test/GrassCoverErosionInwardsDataSynchronizationServiceTest.cs (.../GrassCoverErosionInwardsDataSynchronizationServiceTest.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -27,6 +27,7 @@ using Ringtoets.Common.Data.Calculation; using Ringtoets.Common.Data.Hydraulics; using Ringtoets.Common.Data.Probability; +using Ringtoets.Common.Service; using Ringtoets.GrassCoverErosionInwards.Data; using Ringtoets.GrassCoverErosionInwards.Data.TestUtil; using Ringtoets.GrassCoverErosionInwards.Service; @@ -180,22 +181,28 @@ // Setup GrassCoverErosionInwardsFailureMechanism failureMechanism = CreateFullyConfiguredFailureMechanism(); + var expectedRemovedObjectInstances = failureMechanism.Sections.OfType() + .Concat(failureMechanism.SectionResults) + .Concat(failureMechanism.CalculationsGroup.GetAllChildrenRecursive()) + .Concat(failureMechanism.DikeProfiles) + .ToArray(); + // Call - IEnumerable observables = GrassCoverErosionInwardsDataSynchronizationService.ClearReferenceLineDependentData(failureMechanism); + ClearResults result = GrassCoverErosionInwardsDataSynchronizationService.ClearReferenceLineDependentData(failureMechanism); // Assert - // Note: To make sure the clear is performed regardless of what is done with - // the return result, no ToArray() should be called before these assertions: CollectionAssert.IsEmpty(failureMechanism.Sections); CollectionAssert.IsEmpty(failureMechanism.SectionResults); CollectionAssert.IsEmpty(failureMechanism.CalculationsGroup.Children); CollectionAssert.IsEmpty(failureMechanism.DikeProfiles); - IObservable[] array = observables.ToArray(); + IObservable[] array = result.ChangedObjects.ToArray(); Assert.AreEqual(3, array.Length); CollectionAssert.Contains(array, failureMechanism); CollectionAssert.Contains(array, failureMechanism.CalculationsGroup); CollectionAssert.Contains(array, failureMechanism.DikeProfiles); + + CollectionAssert.AreEquivalent(expectedRemovedObjectInstances, result.DeletedObjects); } private static GrassCoverErosionInwardsFailureMechanism CreateFullyConfiguredFailureMechanism() Index: Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Utils.Test/Ringtoets.GrassCoverErosionInwards.Utils.Test.csproj =================================================================== diff -u -r23d1e296e2da4364fbfe346e68d582dfcf966bb0 -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Utils.Test/Ringtoets.GrassCoverErosionInwards.Utils.Test.csproj (.../Ringtoets.GrassCoverErosionInwards.Utils.Test.csproj) (revision 23d1e296e2da4364fbfe346e68d582dfcf966bb0) +++ Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Utils.Test/Ringtoets.GrassCoverErosionInwards.Utils.Test.csproj (.../Ringtoets.GrassCoverErosionInwards.Utils.Test.csproj) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -73,6 +73,10 @@ {D4200F43-3F72-4F42-AF0A-8CED416A38EC} Ringtoets.Common.Data + + {d951d6da-fe83-4920-9fdb-63bf96480b54} + Ringtoets.Common.Service + {4843d6e5-066f-4795-94f5-1d53932dd03c} Ringtoets.Common.Data.TestUtil Index: Ringtoets/GrassCoverErosionOutwards/src/Ringtoets.GrassCoverErosionOutwards.Service/GrassCoverErosionOutwardsDataSynchronizationService.cs =================================================================== diff -u -re182f6f394aa75e739467a77e7bcacd9a8b25429 -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/GrassCoverErosionOutwards/src/Ringtoets.GrassCoverErosionOutwards.Service/GrassCoverErosionOutwardsDataSynchronizationService.cs (.../GrassCoverErosionOutwardsDataSynchronizationService.cs) (revision e182f6f394aa75e739467a77e7bcacd9a8b25429) +++ Ringtoets/GrassCoverErosionOutwards/src/Ringtoets.GrassCoverErosionOutwards.Service/GrassCoverErosionOutwardsDataSynchronizationService.cs (.../GrassCoverErosionOutwardsDataSynchronizationService.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -23,7 +23,10 @@ using System.Collections.Generic; using System.Linq; using Core.Common.Base; +using Ringtoets.Common.Data.Calculation; +using Ringtoets.Common.Data.FailureMechanism; using Ringtoets.Common.Data.Hydraulics; +using Ringtoets.Common.Service; using Ringtoets.GrassCoverErosionOutwards.Data; using Ringtoets.Revetment.Data; @@ -114,28 +117,33 @@ /// Clears all data dependent, either directly or indirectly, on the parent reference line. /// /// The failure mechanism to be cleared. - /// All objects that have been changed. + /// The results of the clear action. /// Thrown when /// is null. - public static IEnumerable ClearReferenceLineDependentData(GrassCoverErosionOutwardsFailureMechanism failureMechanism) + public static ClearResults ClearReferenceLineDependentData(GrassCoverErosionOutwardsFailureMechanism failureMechanism) { if (failureMechanism == null) { throw new ArgumentNullException("failureMechanism"); } - var observables = new List(); + var changedObjects = new List(); + var removedObjects = failureMechanism.Sections.OfType() + .Concat(failureMechanism.SectionResults) + .Concat(failureMechanism.WaveConditionsCalculationGroup.GetAllChildrenRecursive()) + .Concat(failureMechanism.ForeshoreProfiles) + .ToArray(); failureMechanism.ClearAllSections(); - observables.Add(failureMechanism); + changedObjects.Add(failureMechanism); failureMechanism.WaveConditionsCalculationGroup.Children.Clear(); - observables.Add(failureMechanism.WaveConditionsCalculationGroup); + changedObjects.Add(failureMechanism.WaveConditionsCalculationGroup); failureMechanism.ForeshoreProfiles.Clear(); - observables.Add(failureMechanism.ForeshoreProfiles); + changedObjects.Add(failureMechanism.ForeshoreProfiles); - return observables; + return new ClearResults(changedObjects, removedObjects); } private static IEnumerable ClearHydraulicBoundaryLocation(WaveConditionsInput input) Index: Ringtoets/GrassCoverErosionOutwards/test/Ringtoets.GrassCoverErosionOutwards.Service.Test/GrassCoverErosionOutwardsDataSynchronizationServiceTest.cs =================================================================== diff -u -re182f6f394aa75e739467a77e7bcacd9a8b25429 -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/GrassCoverErosionOutwards/test/Ringtoets.GrassCoverErosionOutwards.Service.Test/GrassCoverErosionOutwardsDataSynchronizationServiceTest.cs (.../GrassCoverErosionOutwardsDataSynchronizationServiceTest.cs) (revision e182f6f394aa75e739467a77e7bcacd9a8b25429) +++ Ringtoets/GrassCoverErosionOutwards/test/Ringtoets.GrassCoverErosionOutwards.Service.Test/GrassCoverErosionOutwardsDataSynchronizationServiceTest.cs (.../GrassCoverErosionOutwardsDataSynchronizationServiceTest.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -26,6 +26,7 @@ using NUnit.Framework; using Ringtoets.Common.Data.Calculation; using Ringtoets.Common.Data.Hydraulics; +using Ringtoets.Common.Service; using Ringtoets.GrassCoverErosionOutwards.Data; using Ringtoets.Revetment.Data; @@ -176,22 +177,28 @@ // Setup GrassCoverErosionOutwardsFailureMechanism failureMechanism = CreateFullyConfiguredFailureMechanism(); + var expectedRemovedObjects = failureMechanism.Sections.OfType() + .Concat(failureMechanism.SectionResults) + .Concat(failureMechanism.WaveConditionsCalculationGroup.GetAllChildrenRecursive()) + .Concat(failureMechanism.ForeshoreProfiles) + .ToArray(); + // Call - IEnumerable observables = GrassCoverErosionOutwardsDataSynchronizationService.ClearReferenceLineDependentData(failureMechanism); + ClearResults results = GrassCoverErosionOutwardsDataSynchronizationService.ClearReferenceLineDependentData(failureMechanism); // Assert - // Note: To make sure the clear is performed regardless of what is done with - // the return result, no ToArray() should be called before these assertions: CollectionAssert.IsEmpty(failureMechanism.Sections); CollectionAssert.IsEmpty(failureMechanism.SectionResults); CollectionAssert.IsEmpty(failureMechanism.WaveConditionsCalculationGroup.Children); CollectionAssert.IsEmpty(failureMechanism.ForeshoreProfiles); - IObservable[] array = observables.ToArray(); + IObservable[] array = results.ChangedObjects.ToArray(); Assert.AreEqual(3, array.Length); CollectionAssert.Contains(array, failureMechanism); CollectionAssert.Contains(array, failureMechanism.WaveConditionsCalculationGroup); CollectionAssert.Contains(array, failureMechanism.ForeshoreProfiles); + + CollectionAssert.AreEquivalent(expectedRemovedObjects, results.DeletedObjects); } private static GrassCoverErosionOutwardsFailureMechanism CreateFullyConfiguredFailureMechanism() Index: Ringtoets/HeightStructures/src/Ringtoets.HeightStructures.Service/HeightStructuresDataSynchronizationService.cs =================================================================== diff -u -re182f6f394aa75e739467a77e7bcacd9a8b25429 -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/HeightStructures/src/Ringtoets.HeightStructures.Service/HeightStructuresDataSynchronizationService.cs (.../HeightStructuresDataSynchronizationService.cs) (revision e182f6f394aa75e739467a77e7bcacd9a8b25429) +++ Ringtoets/HeightStructures/src/Ringtoets.HeightStructures.Service/HeightStructuresDataSynchronizationService.cs (.../HeightStructuresDataSynchronizationService.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -23,6 +23,7 @@ using System.Collections.Generic; using System.Linq; using Core.Common.Base; +using Ringtoets.Common.Data.Calculation; using Ringtoets.Common.Data.Hydraulics; using Ringtoets.Common.Data.Structures; using Ringtoets.Common.Service; @@ -87,31 +88,37 @@ /// Clears all data dependent, either directly or indirectly, on the parent reference line. /// /// The failure mechanism to be cleared. - /// All objects that have been changed. + /// The results of the clear action. /// Thrown when /// is null. - public static IEnumerable ClearReferenceLineDependentData(HeightStructuresFailureMechanism failureMechanism) + public static ClearResults ClearReferenceLineDependentData(HeightStructuresFailureMechanism failureMechanism) { if (failureMechanism == null) { throw new ArgumentNullException("failureMechanism"); } - var observables = new List(); + var changedObjects = new List(); + var removedObjects = failureMechanism.Sections.OfType() + .Concat(failureMechanism.SectionResults) + .Concat(failureMechanism.CalculationsGroup.GetAllChildrenRecursive()) + .Concat(failureMechanism.ForeshoreProfiles) + .Concat(failureMechanism.HeightStructures) + .ToArray(); failureMechanism.ClearAllSections(); - observables.Add(failureMechanism); + changedObjects.Add(failureMechanism); failureMechanism.CalculationsGroup.Children.Clear(); - observables.Add(failureMechanism.CalculationsGroup); + changedObjects.Add(failureMechanism.CalculationsGroup); failureMechanism.ForeshoreProfiles.Clear(); - observables.Add(failureMechanism.ForeshoreProfiles); + changedObjects.Add(failureMechanism.ForeshoreProfiles); failureMechanism.HeightStructures.Clear(); - observables.Add(failureMechanism.HeightStructures); + changedObjects.Add(failureMechanism.HeightStructures); - return observables; + return new ClearResults(changedObjects, removedObjects); } /// Index: Ringtoets/HeightStructures/test/Ringtoets.HeightStructures.Service.Test/HeightStructuresDataSynchronizationServiceTest.cs =================================================================== diff -u -re182f6f394aa75e739467a77e7bcacd9a8b25429 -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/HeightStructures/test/Ringtoets.HeightStructures.Service.Test/HeightStructuresDataSynchronizationServiceTest.cs (.../HeightStructuresDataSynchronizationServiceTest.cs) (revision e182f6f394aa75e739467a77e7bcacd9a8b25429) +++ Ringtoets/HeightStructures/test/Ringtoets.HeightStructures.Service.Test/HeightStructuresDataSynchronizationServiceTest.cs (.../HeightStructuresDataSynchronizationServiceTest.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -31,6 +31,7 @@ using Ringtoets.Common.Data.Probability; using Ringtoets.Common.Data.Structures; using Ringtoets.Common.Data.TestUtil; +using Ringtoets.Common.Service; using Ringtoets.HeightStructures.Data; using Ringtoets.HeightStructures.Data.TestUtil; @@ -277,8 +278,15 @@ // Setup HeightStructuresFailureMechanism failureMechanism = CreateFullyConfiguredFailureMechanism(); + var expectedRemovedObjects = failureMechanism.Sections.OfType() + .Concat(failureMechanism.SectionResults) + .Concat(failureMechanism.CalculationsGroup.GetAllChildrenRecursive()) + .Concat(failureMechanism.ForeshoreProfiles) + .Concat(failureMechanism.HeightStructures) + .ToArray(); + // Call - IEnumerable observables = HeightStructuresDataSynchronizationService.ClearReferenceLineDependentData(failureMechanism); + ClearResults results = HeightStructuresDataSynchronizationService.ClearReferenceLineDependentData(failureMechanism); // Assert // Note: To make sure the clear is performed regardless of what is done with @@ -289,12 +297,14 @@ CollectionAssert.IsEmpty(failureMechanism.ForeshoreProfiles); CollectionAssert.IsEmpty(failureMechanism.HeightStructures); - IObservable[] array = observables.ToArray(); + IObservable[] array = results.ChangedObjects.ToArray(); Assert.AreEqual(4, array.Length); CollectionAssert.Contains(array, failureMechanism); CollectionAssert.Contains(array, failureMechanism.CalculationsGroup); CollectionAssert.Contains(array, failureMechanism.ForeshoreProfiles); CollectionAssert.Contains(array, failureMechanism.HeightStructures); + + CollectionAssert.AreEquivalent(expectedRemovedObjects, results.DeletedObjects); } [Test] Index: Ringtoets/HeightStructures/test/Ringtoets.HeightStructures.Service.Test/Ringtoets.HeightStructures.Service.Test.csproj =================================================================== diff -u -r586d097de0087256cb5cf3dda3a3c612721fee9c -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/HeightStructures/test/Ringtoets.HeightStructures.Service.Test/Ringtoets.HeightStructures.Service.Test.csproj (.../Ringtoets.HeightStructures.Service.Test.csproj) (revision 586d097de0087256cb5cf3dda3a3c612721fee9c) +++ Ringtoets/HeightStructures/test/Ringtoets.HeightStructures.Service.Test/Ringtoets.HeightStructures.Service.Test.csproj (.../Ringtoets.HeightStructures.Service.Test.csproj) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -79,6 +79,10 @@ {d4200f43-3f72-4f42-af0a-8ced416a38ec} Ringtoets.Common.Data + + {d951d6da-fe83-4920-9fdb-63bf96480b54} + Ringtoets.Common.Service + {4843D6E5-066F-4795-94F5-1D53932DD03C} Ringtoets.Common.Data.TestUtil Index: Ringtoets/Integration/src/Ringtoets.Integration.Plugin/Handlers/ReferenceLineReplacementHandler.cs =================================================================== diff -u -r666de532f451548d6fcf1c61f661a6715852ac5d -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/Integration/src/Ringtoets.Integration.Plugin/Handlers/ReferenceLineReplacementHandler.cs (.../ReferenceLineReplacementHandler.cs) (revision 666de532f451548d6fcf1c61f661a6715852ac5d) +++ Ringtoets/Integration/src/Ringtoets.Integration.Plugin/Handlers/ReferenceLineReplacementHandler.cs (.../ReferenceLineReplacementHandler.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -19,11 +19,14 @@ // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. +using System; using System.Collections.Generic; using System.Windows.Forms; using Core.Common.Base; +using Core.Common.Gui.Commands; using Ringtoets.Common.Data.AssessmentSection; using Ringtoets.Common.IO.ReferenceLines; +using Ringtoets.Common.Service; using Ringtoets.Integration.Plugin.Properties; using Ringtoets.Integration.Service; using CoreCommonBaseResources = Core.Common.Base.Properties.Resources; @@ -35,6 +38,24 @@ /// public class ReferenceLineReplacementHandler : IReferenceLineReplaceHandler { + private readonly IViewCommands viewCommands; + private readonly Queue removedObjects = new Queue(); + + /// + /// Creates a new instance of . + /// + /// The view commands used to close views for removed data. + /// Thrown when + /// is null. + public ReferenceLineReplacementHandler(IViewCommands viewCommands) + { + if (viewCommands == null) + { + throw new ArgumentNullException("viewCommands"); + } + this.viewCommands = viewCommands; + } + public bool ConfirmReplace() { DialogResult result = MessageBox.Show(Resources.ReferenceLineReplacementHandler_Confirm_clear_referenceLine_dependent_data, @@ -45,9 +66,24 @@ public IEnumerable Replace(IAssessmentSection section, ReferenceLine newReferenceLine) { - IEnumerable affectedObjects = RingtoetsDataSynchronizationService.ClearReferenceLine(section); + removedObjects.Clear(); + + ClearResults results = RingtoetsDataSynchronizationService.ClearReferenceLine(section); + foreach (object deletedObject in results.DeletedObjects) + { + removedObjects.Enqueue(deletedObject); + } + section.ReferenceLine = newReferenceLine; - return affectedObjects; + return results.ChangedObjects; } + + public void DoPostReplacementUpdates() + { + while (removedObjects.Count > 0) + { + viewCommands.RemoveAllViewsForItem(removedObjects.Dequeue()); + } + } } } \ No newline at end of file Index: Ringtoets/Integration/src/Ringtoets.Integration.Plugin/RingtoetsPlugin.cs =================================================================== diff -u -r1b04d8b730017db5c2a205203432f0b13f8d4192 -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/Integration/src/Ringtoets.Integration.Plugin/RingtoetsPlugin.cs (.../RingtoetsPlugin.cs) (revision 1b04d8b730017db5c2a205203432f0b13f8d4192) +++ Ringtoets/Integration/src/Ringtoets.Integration.Plugin/RingtoetsPlugin.cs (.../RingtoetsPlugin.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -419,7 +419,7 @@ Image = RingtoetsCommonFormsResources.ReferenceLineIcon, FileFilter = RingtoetsCommonIoResources.DataTypeDisplayName_shape_file_filter, CreateFileImporter = (context, filePath) => new ReferenceLineImporter(context.WrappedData, - new ReferenceLineReplacementHandler(), + new ReferenceLineReplacementHandler(Gui.ViewCommands), filePath) }; Index: Ringtoets/Integration/src/Ringtoets.Integration.Service/RingtoetsDataSynchronizationService.cs =================================================================== diff -u -rd0996c2eb38e607698ffe7f57e6e1847f8550a8f -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/Integration/src/Ringtoets.Integration.Service/RingtoetsDataSynchronizationService.cs (.../RingtoetsDataSynchronizationService.cs) (revision d0996c2eb38e607698ffe7f57e6e1847f8550a8f) +++ Ringtoets/Integration/src/Ringtoets.Integration.Service/RingtoetsDataSynchronizationService.cs (.../RingtoetsDataSynchronizationService.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -213,71 +213,38 @@ /// Clears the reference line and all data that depends on it, either directly or indirectly. /// /// The assessment section. - /// All observable objects affected by this method. + /// The results of the clear action. /// Thrown when /// is null. - public static IEnumerable ClearReferenceLine(IAssessmentSection assessmentSection) + public static ClearResults ClearReferenceLine(IAssessmentSection assessmentSection) { if (assessmentSection == null) { throw new ArgumentNullException("assessmentSection"); } - var list = new List(); + var changedObjects = new List(); + var removedObjects = new List(); foreach (IFailureMechanism failureMechanism in assessmentSection.GetFailureMechanisms()) { - var pipingFailureMechanism = failureMechanism as PipingFailureMechanism; - var grassCoverErosionInwardsFailureMechanism = failureMechanism as GrassCoverErosionInwardsFailureMechanism; - var stabilityStoneCoverFailureMechanism = failureMechanism as StabilityStoneCoverFailureMechanism; - var heightStructuresFailureMechanism = failureMechanism as HeightStructuresFailureMechanism; - var closingStructuresFailureMechanism = failureMechanism as ClosingStructuresFailureMechanism; - var stabilityPointStructuresFailureMechanism = failureMechanism as StabilityPointStructuresFailureMechanism; - var grassCoverErosionOutwardsFailureMechanism = failureMechanism as GrassCoverErosionOutwardsFailureMechanism; - var waveImpactAsphaltCoverFailureMechanism = failureMechanism as WaveImpactAsphaltCoverFailureMechanism; + Func clearAction = GetClearMethodForFailureMechanism(failureMechanism); - if (pipingFailureMechanism != null) - { - list.AddRange(PipingDataSynchronizationService.ClearReferenceLineDependentData(pipingFailureMechanism)); - } - else if (grassCoverErosionInwardsFailureMechanism != null) - { - list.AddRange(GrassCoverErosionInwardsDataSynchronizationService.ClearReferenceLineDependentData(grassCoverErosionInwardsFailureMechanism)); - } - else if (stabilityStoneCoverFailureMechanism != null) - { - list.AddRange(StabilityStoneCoverDataSynchronizationService.ClearReferenceLineDependentData(stabilityStoneCoverFailureMechanism)); - } - else if (waveImpactAsphaltCoverFailureMechanism != null) - { - list.AddRange(WaveImpactAsphaltCoverDataSynchronizationService.ClearReferenceLineDependentData(waveImpactAsphaltCoverFailureMechanism)); - } - else if (grassCoverErosionOutwardsFailureMechanism != null) - { - list.AddRange(GrassCoverErosionOutwardsDataSynchronizationService.ClearReferenceLineDependentData(grassCoverErosionOutwardsFailureMechanism)); - } - else if (heightStructuresFailureMechanism != null) - { - list.AddRange(HeightStructuresDataSynchronizationService.ClearReferenceLineDependentData(heightStructuresFailureMechanism)); - } - else if (closingStructuresFailureMechanism != null) - { - list.AddRange(ClosingStructuresDataSynchronizationService.ClearReferenceLineDependentData(closingStructuresFailureMechanism)); - } - else if (stabilityPointStructuresFailureMechanism != null) - { - list.AddRange(StabilityPointStructuresDataSynchronizationService.ClearReferenceLineDependentData(stabilityPointStructuresFailureMechanism)); - } - else - { - list.AddRange(ClearReferenceLineDependentData(failureMechanism)); - } + ClearResults results = clearAction(); + + changedObjects.AddRange(results.ChangedObjects); + removedObjects.AddRange(results.DeletedObjects); } - assessmentSection.ReferenceLine = null; - list.Add(assessmentSection); + if (assessmentSection.ReferenceLine != null) + { + removedObjects.Add(assessmentSection.ReferenceLine); + assessmentSection.ReferenceLine = null; + } - return list; + changedObjects.Add(assessmentSection); + + return new ClearResults(changedObjects, removedObjects); } /// @@ -521,13 +488,74 @@ return changedObservables; } - private static IEnumerable ClearReferenceLineDependentData(IFailureMechanism failureMechanism) + private static Func GetClearMethodForFailureMechanism(IFailureMechanism failureMechanism) { + var pipingFailureMechanism = failureMechanism as PipingFailureMechanism; + if (pipingFailureMechanism != null) + { + return () => PipingDataSynchronizationService.ClearReferenceLineDependentData(pipingFailureMechanism); + } + + var grassCoverErosionInwardsFailureMechanism = failureMechanism as GrassCoverErosionInwardsFailureMechanism; + if (grassCoverErosionInwardsFailureMechanism != null) + { + return () => GrassCoverErosionInwardsDataSynchronizationService.ClearReferenceLineDependentData(grassCoverErosionInwardsFailureMechanism); + } + + var stabilityStoneCoverFailureMechanism = failureMechanism as StabilityStoneCoverFailureMechanism; + if (stabilityStoneCoverFailureMechanism != null) + { + return () => StabilityStoneCoverDataSynchronizationService.ClearReferenceLineDependentData(stabilityStoneCoverFailureMechanism); + } + + var waveImpactAsphaltCoverFailureMechanism = failureMechanism as WaveImpactAsphaltCoverFailureMechanism; + if (waveImpactAsphaltCoverFailureMechanism != null) + { + return () => WaveImpactAsphaltCoverDataSynchronizationService.ClearReferenceLineDependentData(waveImpactAsphaltCoverFailureMechanism); + } + + var grassCoverErosionOutwardsFailureMechanism = failureMechanism as GrassCoverErosionOutwardsFailureMechanism; + if (grassCoverErosionOutwardsFailureMechanism != null) + { + return () => GrassCoverErosionOutwardsDataSynchronizationService.ClearReferenceLineDependentData(grassCoverErosionOutwardsFailureMechanism); + } + + var heightStructuresFailureMechanism = failureMechanism as HeightStructuresFailureMechanism; + if (heightStructuresFailureMechanism != null) + { + return () => HeightStructuresDataSynchronizationService.ClearReferenceLineDependentData(heightStructuresFailureMechanism); + } + + var closingStructuresFailureMechanism = failureMechanism as ClosingStructuresFailureMechanism; + if (closingStructuresFailureMechanism != null) + { + return () => ClosingStructuresDataSynchronizationService.ClearReferenceLineDependentData(closingStructuresFailureMechanism); + } + + var stabilityPointStructuresFailureMechanism = failureMechanism as StabilityPointStructuresFailureMechanism; + if (stabilityPointStructuresFailureMechanism != null) + { + return () => StabilityPointStructuresDataSynchronizationService.ClearReferenceLineDependentData(stabilityPointStructuresFailureMechanism); + } + return () => ClearReferenceLineDependentData(failureMechanism); + } + + private static ClearResults ClearReferenceLineDependentData(IFailureMechanism failureMechanism) + { + var removedObjects = new List(); + removedObjects.AddRange(failureMechanism.Sections); + var failureMechanismWithSectionResults = failureMechanism as IHasSectionResults; + if (failureMechanismWithSectionResults != null) + { + removedObjects.AddRange(failureMechanismWithSectionResults.SectionResults); + } + failureMechanism.ClearAllSections(); - return new[] + + return new ClearResults(new[] { failureMechanism - }; + }, removedObjects); } private static IEnumerable OnWaveConditionsInputForeshoreProfileRemoved(ForeshoreProfile profile, WaveConditionsInput[] calculationInputs) Index: Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/Handlers/ReferenceLineReplacementHandlerTest.cs =================================================================== diff -u -ra4cd22ab000aa81906e43b5fd2898e52fee0e366 -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/Handlers/ReferenceLineReplacementHandlerTest.cs (.../ReferenceLineReplacementHandlerTest.cs) (revision a4cd22ab000aa81906e43b5fd2898e52fee0e366) +++ Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/Handlers/ReferenceLineReplacementHandlerTest.cs (.../ReferenceLineReplacementHandlerTest.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -22,8 +22,10 @@ using System; using System.Linq; using Core.Common.Base; +using Core.Common.Gui.Commands; using NUnit.Extensions.Forms; using NUnit.Framework; +using Rhino.Mocks; using Ringtoets.ClosingStructures.Data; using Ringtoets.Common.Data.AssessmentSection; using Ringtoets.Common.IO.ReferenceLines; @@ -46,14 +48,34 @@ [TestFixture] public class ReferenceLineReplacementHandlerTest : NUnitFormTest { + [Test] + public void Constructor_ViewCommandsNull_ThrowArgumentNullException() + { + // Setup + + // Call + TestDelegate call = () => new ReferenceLineReplacementHandler(null); + + // Assert + string paramName = Assert.Throws(call).ParamName; + Assert.AreEqual("viewCommands", paramName); + } + + [Test] public void Constructor_ExpectedValues() { + // Setup + var mocks = new MockRepository(); + var viewCommands = mocks.Stub(); + mocks.ReplayAll(); + // Call - var handler = new ReferenceLineReplacementHandler(); + var handler = new ReferenceLineReplacementHandler(viewCommands); // Assert Assert.IsInstanceOf(handler); + mocks.VerifyAll(); } [Test] @@ -62,6 +84,10 @@ public void ConfirmReplace_ClickDialog_ReturnTrueIfOkAndFalseIfCancel(bool clickOk) { // Setup + var mocks = new MockRepository(); + var viewCommands = mocks.Stub(); + mocks.ReplayAll(); + string dialogTitle = null, dialogMessage = null; DialogBoxHandler = (name, wnd) => { @@ -78,7 +104,7 @@ } }; - var handler = new ReferenceLineReplacementHandler(); + var handler = new ReferenceLineReplacementHandler(viewCommands); // Call bool result = handler.ConfirmReplace(); @@ -91,25 +117,40 @@ Environment.NewLine + "Wilt u doorgaan?", dialogMessage); + mocks.VerifyAll(); } + [Test] - public void ClearReferenceLine_AssessmentSectionNull_ThrowArgumentNullException() + public void Replace_AssessmentSectionNull_ThrownArgumentNullException() { + // Setup + var mocks = new MockRepository(); + var viewCommands = mocks.Stub(); + mocks.ReplayAll(); + + var handler = new ReferenceLineReplacementHandler(viewCommands); + + var referenceLine = new ReferenceLine(); + // Call - TestDelegate call = () => RingtoetsDataSynchronizationService.ClearReferenceLine(null); + TestDelegate call = () => handler.Replace(null, referenceLine); // Assert string paramName = Assert.Throws(call).ParamName; Assert.AreEqual("assessmentSection", paramName); } [Test] - public void ClearReferenceLine_FullyConfiguredAssessmentSection_AllReferenceLineDependentDataCleared() + public void Replace_FullyConfiguredAssessmentSection_AllReferenceLineDependentDataCleared() { // Setup + var mocks = new MockRepository(); + var viewCommands = mocks.Stub(); + mocks.ReplayAll(); + AssessmentSection assessmentSection = TestDataGenerator.GetFullyConfiguredAssessmentSection(); - var handler = new ReferenceLineReplacementHandler(); + var handler = new ReferenceLineReplacementHandler(viewCommands); var referenceLine = new ReferenceLine(); @@ -251,6 +292,75 @@ Assert.AreSame(referenceLine, assessmentSection.ReferenceLine); CollectionAssert.Contains(observables, assessmentSection); + + mocks.VerifyAll(); } + + [Test] + public void DoPostReplacementUpdates_NoReplaceCalled_DoNothing() + { + // Setup + var mocks = new MockRepository(); + var viewCommands = mocks.StrictMock(); + mocks.ReplayAll(); + + var handler = new ReferenceLineReplacementHandler(viewCommands); + + // Call + handler.DoPostReplacementUpdates(); + + // Assert + mocks.VerifyAll(); // Expect not calls in 'viewCommands' + } + + + [Test] + public void DoPostReplacementUpdates_AfterReplacingReferenceLine_CloseViewsForRemovedData() + { + // Setup + const int expectedNumberOfRemovedInstances = 95; + + var mocks = new MockRepository(); + var viewCommands = mocks.StrictMock(); + viewCommands.Expect(vc => vc.RemoveAllViewsForItem(Arg.Is.NotNull)) + .Repeat.Times(expectedNumberOfRemovedInstances); + mocks.ReplayAll(); + + var handler = new ReferenceLineReplacementHandler(viewCommands); + + AssessmentSection assessmentSection = TestDataGenerator.GetFullyConfiguredAssessmentSection(); + handler.Replace(assessmentSection, new ReferenceLine()); + + // Call + handler.DoPostReplacementUpdates(); + + // Assert + mocks.VerifyAll(); + } + + [Test] + public void DoPostReplacementUpdates_CalledSecondTimeAfterReplaceAndUpdateCycle_DoNothing() + { + // Setup + const int expectedNumberOfRemovedInstances = 95; + + var mocks = new MockRepository(); + var viewCommands = mocks.StrictMock(); + viewCommands.Expect(vc => vc.RemoveAllViewsForItem(Arg.Is.NotNull)) + .Repeat.Times(expectedNumberOfRemovedInstances); + mocks.ReplayAll(); + + var handler = new ReferenceLineReplacementHandler(viewCommands); + + AssessmentSection assessmentSection = TestDataGenerator.GetFullyConfiguredAssessmentSection(); + handler.Replace(assessmentSection, new ReferenceLine()); + handler.DoPostReplacementUpdates(); + + // Call + handler.DoPostReplacementUpdates(); // Expected number should be identical to that of DoPostReplacementUpdates_AfterReplacingReferenceLine_CloseViewsForRemovedData + + // Assert + mocks.VerifyAll(); + } } } \ No newline at end of file Index: Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/ImportInfos/ReferenceLineContextImportInfoTest.cs =================================================================== diff -u -rffe405e6b0f8b4d10e6be78cf7735c554eb42a93 -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/ImportInfos/ReferenceLineContextImportInfoTest.cs (.../ReferenceLineContextImportInfoTest.cs) (revision ffe405e6b0f8b4d10e6be78cf7735c554eb42a93) +++ Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/ImportInfos/ReferenceLineContextImportInfoTest.cs (.../ReferenceLineContextImportInfoTest.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -23,6 +23,8 @@ using System.IO; using System.Linq; using Core.Common.Base.IO; +using Core.Common.Gui; +using Core.Common.Gui.Commands; using Core.Common.Gui.Plugin; using Core.Common.TestUtil; using NUnit.Framework; @@ -37,20 +39,32 @@ [TestFixture] public class ReferenceLineContextImportInfoTest { + private MockRepository mocks; private ImportInfo importInfo; private RingtoetsPlugin plugin; [SetUp] public void SetUp() { - plugin = new RingtoetsPlugin(); + mocks = new MockRepository(); + var gui = mocks.Stub(); + gui.Stub(g => g.ViewCommands).Return(mocks.Stub()); + gui.Stub(g => g.ProjectOpened += null).IgnoreArguments(); + gui.Stub(g => g.ProjectOpened -= null).IgnoreArguments(); + mocks.ReplayAll(); + + plugin = new RingtoetsPlugin + { + Gui = gui + }; importInfo = plugin.GetImportInfos().First(i => i.DataType == typeof(ReferenceLineContext)); } [TearDown] public void TearDown() { plugin.Dispose(); + mocks.VerifyAll(); } [Test] Index: Ringtoets/Integration/test/Ringtoets.Integration.Service.Test/RingtoetsDataSynchronizationServiceTest.cs =================================================================== diff -u -ra4cd22ab000aa81906e43b5fd2898e52fee0e366 -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/Integration/test/Ringtoets.Integration.Service.Test/RingtoetsDataSynchronizationServiceTest.cs (.../RingtoetsDataSynchronizationServiceTest.cs) (revision a4cd22ab000aa81906e43b5fd2898e52fee0e366) +++ Ringtoets/Integration/test/Ringtoets.Integration.Service.Test/RingtoetsDataSynchronizationServiceTest.cs (.../RingtoetsDataSynchronizationServiceTest.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -29,9 +29,11 @@ using Ringtoets.Common.Data.AssessmentSection; using Ringtoets.Common.Data.Calculation; using Ringtoets.Common.Data.DikeProfiles; +using Ringtoets.Common.Data.FailureMechanism; using Ringtoets.Common.Data.Hydraulics; using Ringtoets.Common.Data.Structures; using Ringtoets.Common.Data.TestUtil; +using Ringtoets.Common.Service; using Ringtoets.DuneErosion.Data; using Ringtoets.GrassCoverErosionInwards.Data; using Ringtoets.GrassCoverErosionOutwards.Data; @@ -40,6 +42,7 @@ using Ringtoets.Integration.Data.StandAlone; using Ringtoets.Integration.TestUtils; using Ringtoets.Piping.Data; +using Ringtoets.Piping.Primitives; using Ringtoets.StabilityPointStructures.Data; using Ringtoets.StabilityStoneCover.Data; using Ringtoets.WaveImpactAsphaltCover.Data; @@ -537,95 +540,199 @@ } [Test] - public void ClearReferenceLine_FullyConfiguredAssessmentSection_AllAffectedObservableObjectsReturned() + public void ClearReferenceLine_FullyConfiguredAssessmentSection_ClearResultsContainAllAffectedObjectsAndAllDeletedObjects() { // Setup AssessmentSection assessmentSection = TestDataGenerator.GetFullyConfiguredAssessmentSection(); + IList expectedRemovedObjects = GetExpectedRemovedObjectsWhenClearingReferenceLine(assessmentSection); + // Call - var observables = RingtoetsDataSynchronizationService.ClearReferenceLine(assessmentSection).ToArray(); + ClearResults results = RingtoetsDataSynchronizationService.ClearReferenceLine(assessmentSection); // Assert - Assert.AreEqual(39, observables.Length); + IObservable[] changedObjects = results.ChangedObjects.ToArray(); + Assert.AreEqual(39, changedObjects.Length); PipingFailureMechanism pipingFailureMechanism = assessmentSection.PipingFailureMechanism; - CollectionAssert.Contains(observables, pipingFailureMechanism); - CollectionAssert.Contains(observables, pipingFailureMechanism.CalculationsGroup); - CollectionAssert.Contains(observables, pipingFailureMechanism.StochasticSoilModels); - CollectionAssert.Contains(observables, pipingFailureMechanism.SurfaceLines); + CollectionAssert.Contains(changedObjects, pipingFailureMechanism); + CollectionAssert.Contains(changedObjects, pipingFailureMechanism.CalculationsGroup); + CollectionAssert.Contains(changedObjects, pipingFailureMechanism.StochasticSoilModels); + CollectionAssert.Contains(changedObjects, pipingFailureMechanism.SurfaceLines); GrassCoverErosionInwardsFailureMechanism grassCoverErosionInwardsFailureMechanism = assessmentSection.GrassCoverErosionInwards; - CollectionAssert.Contains(observables, grassCoverErosionInwardsFailureMechanism); - CollectionAssert.Contains(observables, grassCoverErosionInwardsFailureMechanism.CalculationsGroup); - CollectionAssert.Contains(observables, grassCoverErosionInwardsFailureMechanism.DikeProfiles); + CollectionAssert.Contains(changedObjects, grassCoverErosionInwardsFailureMechanism); + CollectionAssert.Contains(changedObjects, grassCoverErosionInwardsFailureMechanism.CalculationsGroup); + CollectionAssert.Contains(changedObjects, grassCoverErosionInwardsFailureMechanism.DikeProfiles); GrassCoverErosionOutwardsFailureMechanism grassCoverErosionOutwardsFailureMechanism = assessmentSection.GrassCoverErosionOutwards; - CollectionAssert.Contains(observables, grassCoverErosionOutwardsFailureMechanism); - CollectionAssert.Contains(observables, grassCoverErosionOutwardsFailureMechanism.WaveConditionsCalculationGroup); - CollectionAssert.Contains(observables, grassCoverErosionOutwardsFailureMechanism.ForeshoreProfiles); + CollectionAssert.Contains(changedObjects, grassCoverErosionOutwardsFailureMechanism); + CollectionAssert.Contains(changedObjects, grassCoverErosionOutwardsFailureMechanism.WaveConditionsCalculationGroup); + CollectionAssert.Contains(changedObjects, grassCoverErosionOutwardsFailureMechanism.ForeshoreProfiles); WaveImpactAsphaltCoverFailureMechanism waveImpactAsphaltCoverFailureMechanism = assessmentSection.WaveImpactAsphaltCover; - CollectionAssert.Contains(observables, waveImpactAsphaltCoverFailureMechanism); - CollectionAssert.Contains(observables, waveImpactAsphaltCoverFailureMechanism.WaveConditionsCalculationGroup); - CollectionAssert.Contains(observables, waveImpactAsphaltCoverFailureMechanism.ForeshoreProfiles); + CollectionAssert.Contains(changedObjects, waveImpactAsphaltCoverFailureMechanism); + CollectionAssert.Contains(changedObjects, waveImpactAsphaltCoverFailureMechanism.WaveConditionsCalculationGroup); + CollectionAssert.Contains(changedObjects, waveImpactAsphaltCoverFailureMechanism.ForeshoreProfiles); StabilityStoneCoverFailureMechanism stabilityStoneCoverFailureMechanism = assessmentSection.StabilityStoneCover; - CollectionAssert.Contains(observables, stabilityStoneCoverFailureMechanism); - CollectionAssert.Contains(observables, stabilityStoneCoverFailureMechanism.WaveConditionsCalculationGroup); - CollectionAssert.Contains(observables, stabilityStoneCoverFailureMechanism.ForeshoreProfiles); + CollectionAssert.Contains(changedObjects, stabilityStoneCoverFailureMechanism); + CollectionAssert.Contains(changedObjects, stabilityStoneCoverFailureMechanism.WaveConditionsCalculationGroup); + CollectionAssert.Contains(changedObjects, stabilityStoneCoverFailureMechanism.ForeshoreProfiles); ClosingStructuresFailureMechanism closingStructuresFailureMechanism = assessmentSection.ClosingStructures; - CollectionAssert.Contains(observables, closingStructuresFailureMechanism); - CollectionAssert.Contains(observables, closingStructuresFailureMechanism.CalculationsGroup); - CollectionAssert.Contains(observables, closingStructuresFailureMechanism.ForeshoreProfiles); - CollectionAssert.Contains(observables, closingStructuresFailureMechanism.ClosingStructures); + CollectionAssert.Contains(changedObjects, closingStructuresFailureMechanism); + CollectionAssert.Contains(changedObjects, closingStructuresFailureMechanism.CalculationsGroup); + CollectionAssert.Contains(changedObjects, closingStructuresFailureMechanism.ForeshoreProfiles); + CollectionAssert.Contains(changedObjects, closingStructuresFailureMechanism.ClosingStructures); HeightStructuresFailureMechanism heightStructuresFailureMechanism = assessmentSection.HeightStructures; - CollectionAssert.Contains(observables, heightStructuresFailureMechanism); - CollectionAssert.Contains(observables, heightStructuresFailureMechanism.CalculationsGroup); - CollectionAssert.Contains(observables, heightStructuresFailureMechanism.ForeshoreProfiles); - CollectionAssert.Contains(observables, heightStructuresFailureMechanism.HeightStructures); + CollectionAssert.Contains(changedObjects, heightStructuresFailureMechanism); + CollectionAssert.Contains(changedObjects, heightStructuresFailureMechanism.CalculationsGroup); + CollectionAssert.Contains(changedObjects, heightStructuresFailureMechanism.ForeshoreProfiles); + CollectionAssert.Contains(changedObjects, heightStructuresFailureMechanism.HeightStructures); StabilityPointStructuresFailureMechanism stabilityPointStructuresFailureMechanism = assessmentSection.StabilityPointStructures; - CollectionAssert.Contains(observables, stabilityPointStructuresFailureMechanism); - CollectionAssert.Contains(observables, stabilityPointStructuresFailureMechanism.CalculationsGroup); - CollectionAssert.Contains(observables, stabilityPointStructuresFailureMechanism.ForeshoreProfiles); - CollectionAssert.Contains(observables, stabilityPointStructuresFailureMechanism.StabilityPointStructures); + CollectionAssert.Contains(changedObjects, stabilityPointStructuresFailureMechanism); + CollectionAssert.Contains(changedObjects, stabilityPointStructuresFailureMechanism.CalculationsGroup); + CollectionAssert.Contains(changedObjects, stabilityPointStructuresFailureMechanism.ForeshoreProfiles); + CollectionAssert.Contains(changedObjects, stabilityPointStructuresFailureMechanism.StabilityPointStructures); DuneErosionFailureMechanism duneErosionFailureMechanism = assessmentSection.DuneErosion; - CollectionAssert.Contains(observables, duneErosionFailureMechanism); + CollectionAssert.Contains(changedObjects, duneErosionFailureMechanism); MacrostabilityInwardsFailureMechanism macrostabilityInwardsFailureMechanism = assessmentSection.MacrostabilityInwards; - CollectionAssert.Contains(observables, macrostabilityInwardsFailureMechanism); + CollectionAssert.Contains(changedObjects, macrostabilityInwardsFailureMechanism); MacrostabilityOutwardsFailureMechanism macrostabilityOutwardsFailureMechanism = assessmentSection.MacrostabilityOutwards; - CollectionAssert.Contains(observables, macrostabilityOutwardsFailureMechanism); + CollectionAssert.Contains(changedObjects, macrostabilityOutwardsFailureMechanism); MicrostabilityFailureMechanism microstabilityFailureMechanism = assessmentSection.Microstability; - CollectionAssert.Contains(observables, microstabilityFailureMechanism); + CollectionAssert.Contains(changedObjects, microstabilityFailureMechanism); WaterPressureAsphaltCoverFailureMechanism waterPressureAsphaltCoverFailureMechanism = assessmentSection.WaterPressureAsphaltCover; - CollectionAssert.Contains(observables, waterPressureAsphaltCoverFailureMechanism); + CollectionAssert.Contains(changedObjects, waterPressureAsphaltCoverFailureMechanism); GrassCoverSlipOffOutwardsFailureMechanism grassCoverSlipOffOutwardsFailureMechanism = assessmentSection.GrassCoverSlipOffOutwards; - CollectionAssert.Contains(observables, grassCoverSlipOffOutwardsFailureMechanism); + CollectionAssert.Contains(changedObjects, grassCoverSlipOffOutwardsFailureMechanism); GrassCoverSlipOffInwardsFailureMechanism grassCoverSlipOffInwardsFailureMechanism = assessmentSection.GrassCoverSlipOffInwards; - CollectionAssert.Contains(observables, grassCoverSlipOffInwardsFailureMechanism); + CollectionAssert.Contains(changedObjects, grassCoverSlipOffInwardsFailureMechanism); StrengthStabilityLengthwiseConstructionFailureMechanism stabilityLengthwiseConstructionFailureMechanism = assessmentSection.StrengthStabilityLengthwiseConstruction; - CollectionAssert.Contains(observables, stabilityLengthwiseConstructionFailureMechanism); + CollectionAssert.Contains(changedObjects, stabilityLengthwiseConstructionFailureMechanism); PipingStructureFailureMechanism pipingStructureFailureMechanism = assessmentSection.PipingStructure; - CollectionAssert.Contains(observables, pipingStructureFailureMechanism); + CollectionAssert.Contains(changedObjects, pipingStructureFailureMechanism); TechnicalInnovationFailureMechanism technicalInnovationFailureMechanism = assessmentSection.TechnicalInnovation; - CollectionAssert.Contains(observables, technicalInnovationFailureMechanism); + CollectionAssert.Contains(changedObjects, technicalInnovationFailureMechanism); - CollectionAssert.Contains(observables, assessmentSection); + CollectionAssert.Contains(changedObjects, assessmentSection); + + CollectionAssert.AreEquivalent(expectedRemovedObjects, results.DeletedObjects); + CollectionAssert.DoesNotContain(results.DeletedObjects, null); } [Test] + public void ClearReferenceLine_FullyConfiguredAssessmentSectionWithoutReferenceLine_ClearResultsDoesNotContainReferenceLineNorNullForDeletedObjects() + { + // Setup + AssessmentSection assessmentSection = TestDataGenerator.GetFullyConfiguredAssessmentSection(); + ReferenceLine originalReferenceLine = assessmentSection.ReferenceLine; + assessmentSection.ReferenceLine = null; + + IList expectedRemovedObjects = GetExpectedRemovedObjectsWhenClearingReferenceLine(assessmentSection); + + // Call + ClearResults results = RingtoetsDataSynchronizationService.ClearReferenceLine(assessmentSection); + + // Assert + IObservable[] changedObjects = results.ChangedObjects.ToArray(); + Assert.AreEqual(39, changedObjects.Length); + + PipingFailureMechanism pipingFailureMechanism = assessmentSection.PipingFailureMechanism; + CollectionAssert.Contains(changedObjects, pipingFailureMechanism); + CollectionAssert.Contains(changedObjects, pipingFailureMechanism.CalculationsGroup); + CollectionAssert.Contains(changedObjects, pipingFailureMechanism.StochasticSoilModels); + CollectionAssert.Contains(changedObjects, pipingFailureMechanism.SurfaceLines); + + GrassCoverErosionInwardsFailureMechanism grassCoverErosionInwardsFailureMechanism = assessmentSection.GrassCoverErosionInwards; + CollectionAssert.Contains(changedObjects, grassCoverErosionInwardsFailureMechanism); + CollectionAssert.Contains(changedObjects, grassCoverErosionInwardsFailureMechanism.CalculationsGroup); + CollectionAssert.Contains(changedObjects, grassCoverErosionInwardsFailureMechanism.DikeProfiles); + + GrassCoverErosionOutwardsFailureMechanism grassCoverErosionOutwardsFailureMechanism = assessmentSection.GrassCoverErosionOutwards; + CollectionAssert.Contains(changedObjects, grassCoverErosionOutwardsFailureMechanism); + CollectionAssert.Contains(changedObjects, grassCoverErosionOutwardsFailureMechanism.WaveConditionsCalculationGroup); + CollectionAssert.Contains(changedObjects, grassCoverErosionOutwardsFailureMechanism.ForeshoreProfiles); + + WaveImpactAsphaltCoverFailureMechanism waveImpactAsphaltCoverFailureMechanism = assessmentSection.WaveImpactAsphaltCover; + CollectionAssert.Contains(changedObjects, waveImpactAsphaltCoverFailureMechanism); + CollectionAssert.Contains(changedObjects, waveImpactAsphaltCoverFailureMechanism.WaveConditionsCalculationGroup); + CollectionAssert.Contains(changedObjects, waveImpactAsphaltCoverFailureMechanism.ForeshoreProfiles); + + StabilityStoneCoverFailureMechanism stabilityStoneCoverFailureMechanism = assessmentSection.StabilityStoneCover; + CollectionAssert.Contains(changedObjects, stabilityStoneCoverFailureMechanism); + CollectionAssert.Contains(changedObjects, stabilityStoneCoverFailureMechanism.WaveConditionsCalculationGroup); + CollectionAssert.Contains(changedObjects, stabilityStoneCoverFailureMechanism.ForeshoreProfiles); + + ClosingStructuresFailureMechanism closingStructuresFailureMechanism = assessmentSection.ClosingStructures; + CollectionAssert.Contains(changedObjects, closingStructuresFailureMechanism); + CollectionAssert.Contains(changedObjects, closingStructuresFailureMechanism.CalculationsGroup); + CollectionAssert.Contains(changedObjects, closingStructuresFailureMechanism.ForeshoreProfiles); + CollectionAssert.Contains(changedObjects, closingStructuresFailureMechanism.ClosingStructures); + + HeightStructuresFailureMechanism heightStructuresFailureMechanism = assessmentSection.HeightStructures; + CollectionAssert.Contains(changedObjects, heightStructuresFailureMechanism); + CollectionAssert.Contains(changedObjects, heightStructuresFailureMechanism.CalculationsGroup); + CollectionAssert.Contains(changedObjects, heightStructuresFailureMechanism.ForeshoreProfiles); + CollectionAssert.Contains(changedObjects, heightStructuresFailureMechanism.HeightStructures); + + StabilityPointStructuresFailureMechanism stabilityPointStructuresFailureMechanism = assessmentSection.StabilityPointStructures; + CollectionAssert.Contains(changedObjects, stabilityPointStructuresFailureMechanism); + CollectionAssert.Contains(changedObjects, stabilityPointStructuresFailureMechanism.CalculationsGroup); + CollectionAssert.Contains(changedObjects, stabilityPointStructuresFailureMechanism.ForeshoreProfiles); + CollectionAssert.Contains(changedObjects, stabilityPointStructuresFailureMechanism.StabilityPointStructures); + + DuneErosionFailureMechanism duneErosionFailureMechanism = assessmentSection.DuneErosion; + CollectionAssert.Contains(changedObjects, duneErosionFailureMechanism); + + MacrostabilityInwardsFailureMechanism macrostabilityInwardsFailureMechanism = assessmentSection.MacrostabilityInwards; + CollectionAssert.Contains(changedObjects, macrostabilityInwardsFailureMechanism); + + MacrostabilityOutwardsFailureMechanism macrostabilityOutwardsFailureMechanism = assessmentSection.MacrostabilityOutwards; + CollectionAssert.Contains(changedObjects, macrostabilityOutwardsFailureMechanism); + + MicrostabilityFailureMechanism microstabilityFailureMechanism = assessmentSection.Microstability; + CollectionAssert.Contains(changedObjects, microstabilityFailureMechanism); + + WaterPressureAsphaltCoverFailureMechanism waterPressureAsphaltCoverFailureMechanism = assessmentSection.WaterPressureAsphaltCover; + CollectionAssert.Contains(changedObjects, waterPressureAsphaltCoverFailureMechanism); + + GrassCoverSlipOffOutwardsFailureMechanism grassCoverSlipOffOutwardsFailureMechanism = assessmentSection.GrassCoverSlipOffOutwards; + CollectionAssert.Contains(changedObjects, grassCoverSlipOffOutwardsFailureMechanism); + + GrassCoverSlipOffInwardsFailureMechanism grassCoverSlipOffInwardsFailureMechanism = assessmentSection.GrassCoverSlipOffInwards; + CollectionAssert.Contains(changedObjects, grassCoverSlipOffInwardsFailureMechanism); + + StrengthStabilityLengthwiseConstructionFailureMechanism stabilityLengthwiseConstructionFailureMechanism = assessmentSection.StrengthStabilityLengthwiseConstruction; + CollectionAssert.Contains(changedObjects, stabilityLengthwiseConstructionFailureMechanism); + + PipingStructureFailureMechanism pipingStructureFailureMechanism = assessmentSection.PipingStructure; + CollectionAssert.Contains(changedObjects, pipingStructureFailureMechanism); + + TechnicalInnovationFailureMechanism technicalInnovationFailureMechanism = assessmentSection.TechnicalInnovation; + CollectionAssert.Contains(changedObjects, technicalInnovationFailureMechanism); + + CollectionAssert.Contains(changedObjects, assessmentSection); + + CollectionAssert.AreEquivalent(expectedRemovedObjects, results.DeletedObjects); + CollectionAssert.DoesNotContain(results.DeletedObjects, originalReferenceLine); + CollectionAssert.DoesNotContain(results.DeletedObjects, null); + } + + [Test] public void RemoveForeshoreProfile_StabilityStoneCoverFailureMechanismNull_ThrowsArgumentNullException() { // Setup @@ -1088,5 +1195,189 @@ Assert.AreEqual(originalNumberOfSectionResultAssignments - sectionResults.Length, failureMechanism.SectionResults.Count(sr => sr.Calculation != null), "Other section results with a different calculation/dikeprofile should still have their association."); } + + private IList GetExpectedRemovedObjectsWhenClearingReferenceLine(AssessmentSection assessmentSection) + { + var expectedRemovedObjects = new List(); + expectedRemovedObjects.AddRange(GetExpectedRemovedObjectsWhenClearingReferenceLine(assessmentSection.PipingFailureMechanism)); + expectedRemovedObjects.AddRange(GetExpectedRemovedObjectsWhenClearingReferenceLine(assessmentSection.GrassCoverErosionInwards)); + expectedRemovedObjects.AddRange(GetExpectedRemovedObjectsWhenClearingReferenceLine(assessmentSection.MacrostabilityInwards)); + expectedRemovedObjects.AddRange(GetExpectedRemovedObjectsWhenClearingReferenceLine(assessmentSection.MacrostabilityOutwards)); + expectedRemovedObjects.AddRange(GetExpectedRemovedObjectsWhenClearingReferenceLine(assessmentSection.Microstability)); + expectedRemovedObjects.AddRange(GetExpectedRemovedObjectsWhenClearingReferenceLine(assessmentSection.StabilityStoneCover)); + expectedRemovedObjects.AddRange(GetExpectedRemovedObjectsWhenClearingReferenceLine(assessmentSection.WaveImpactAsphaltCover)); + expectedRemovedObjects.AddRange(GetExpectedRemovedObjectsWhenClearingReferenceLine(assessmentSection.WaterPressureAsphaltCover)); + expectedRemovedObjects.AddRange(GetExpectedRemovedObjectsWhenClearingReferenceLine(assessmentSection.GrassCoverErosionOutwards)); + expectedRemovedObjects.AddRange(GetExpectedRemovedObjectsWhenClearingReferenceLine(assessmentSection.GrassCoverSlipOffOutwards)); + expectedRemovedObjects.AddRange(GetExpectedRemovedObjectsWhenClearingReferenceLine(assessmentSection.GrassCoverSlipOffInwards)); + expectedRemovedObjects.AddRange(GetExpectedRemovedObjectsWhenClearingReferenceLine(assessmentSection.HeightStructures)); + expectedRemovedObjects.AddRange(GetExpectedRemovedObjectsWhenClearingReferenceLine(assessmentSection.ClosingStructures)); + expectedRemovedObjects.AddRange(GetExpectedRemovedObjectsWhenClearingReferenceLine(assessmentSection.PipingStructure)); + expectedRemovedObjects.AddRange(GetExpectedRemovedObjectsWhenClearingReferenceLine(assessmentSection.StabilityPointStructures)); + expectedRemovedObjects.AddRange(GetExpectedRemovedObjectsWhenClearingReferenceLine(assessmentSection.StrengthStabilityLengthwiseConstruction)); + expectedRemovedObjects.AddRange(GetExpectedRemovedObjectsWhenClearingReferenceLine(assessmentSection.DuneErosion)); + expectedRemovedObjects.AddRange(GetExpectedRemovedObjectsWhenClearingReferenceLine(assessmentSection.TechnicalInnovation)); + if (assessmentSection.ReferenceLine != null) + { + expectedRemovedObjects.Add(assessmentSection.ReferenceLine); + } + return expectedRemovedObjects; + } + + private IEnumerable GetExpectedRemovedObjectsWhenClearingReferenceLine(PipingFailureMechanism failureMechanism) + { + foreach (object failureMechanismObject in GetExpectedRemovedObjectsWhenClearingReferenceLine(failureMechanism)) + { + yield return failureMechanismObject; + } + foreach (ICalculationBase calculationBase in failureMechanism.CalculationsGroup.GetAllChildrenRecursive()) + { + yield return calculationBase; + } + foreach (StochasticSoilModel stochasticSoilModel in failureMechanism.StochasticSoilModels) + { + yield return stochasticSoilModel; + } + foreach (RingtoetsPipingSurfaceLine surfaceLine in failureMechanism.SurfaceLines) + { + yield return surfaceLine; + } + } + + private IEnumerable GetExpectedRemovedObjectsWhenClearingReferenceLine(GrassCoverErosionInwardsFailureMechanism failureMechanism) + { + foreach (object failureMechanismObject in GetExpectedRemovedObjectsWhenClearingReferenceLine(failureMechanism)) + { + yield return failureMechanismObject; + } + foreach (ICalculationBase calculationBase in failureMechanism.CalculationsGroup.GetAllChildrenRecursive()) + { + yield return calculationBase; + } + foreach (DikeProfile profile in failureMechanism.DikeProfiles) + { + yield return profile; + } + } + + private IEnumerable GetExpectedRemovedObjectsWhenClearingReferenceLine(StabilityStoneCoverFailureMechanism failureMechanism) + { + foreach (object failureMechanismObject in GetExpectedRemovedObjectsWhenClearingReferenceLine(failureMechanism)) + { + yield return failureMechanismObject; + } + foreach (ICalculationBase calculationBase in failureMechanism.WaveConditionsCalculationGroup.GetAllChildrenRecursive()) + { + yield return calculationBase; + } + foreach (ForeshoreProfile profile in failureMechanism.ForeshoreProfiles) + { + yield return profile; + } + } + + private IEnumerable GetExpectedRemovedObjectsWhenClearingReferenceLine(WaveImpactAsphaltCoverFailureMechanism failureMechanism) + { + foreach (object failureMechanismObject in GetExpectedRemovedObjectsWhenClearingReferenceLine(failureMechanism)) + { + yield return failureMechanismObject; + } + foreach (ICalculationBase calculationBase in failureMechanism.WaveConditionsCalculationGroup.GetAllChildrenRecursive()) + { + yield return calculationBase; + } + foreach (ForeshoreProfile profile in failureMechanism.ForeshoreProfiles) + { + yield return profile; + } + } + + private IEnumerable GetExpectedRemovedObjectsWhenClearingReferenceLine(GrassCoverErosionOutwardsFailureMechanism failureMechanism) + { + foreach (object failureMechanismObject in GetExpectedRemovedObjectsWhenClearingReferenceLine(failureMechanism)) + { + yield return failureMechanismObject; + } + foreach (ICalculationBase calculationBase in failureMechanism.WaveConditionsCalculationGroup.GetAllChildrenRecursive()) + { + yield return calculationBase; + } + foreach (ForeshoreProfile profile in failureMechanism.ForeshoreProfiles) + { + yield return profile; + } + } + + private IEnumerable GetExpectedRemovedObjectsWhenClearingReferenceLine(HeightStructuresFailureMechanism failureMechanism) + { + foreach (object failureMechanismObject in GetExpectedRemovedObjectsWhenClearingReferenceLine(failureMechanism)) + { + yield return failureMechanismObject; + } + foreach (ICalculationBase calculationBase in failureMechanism.CalculationsGroup.GetAllChildrenRecursive()) + { + yield return calculationBase; + } + foreach (ForeshoreProfile profile in failureMechanism.ForeshoreProfiles) + { + yield return profile; + } + foreach (HeightStructure structure in failureMechanism.HeightStructures) + { + yield return structure; + } + } + + private IEnumerable GetExpectedRemovedObjectsWhenClearingReferenceLine(ClosingStructuresFailureMechanism failureMechanism) + { + foreach (object failureMechanismObject in GetExpectedRemovedObjectsWhenClearingReferenceLine(failureMechanism)) + { + yield return failureMechanismObject; + } + foreach (ICalculationBase calculationBase in failureMechanism.CalculationsGroup.GetAllChildrenRecursive()) + { + yield return calculationBase; + } + foreach (ForeshoreProfile profile in failureMechanism.ForeshoreProfiles) + { + yield return profile; + } + foreach (ClosingStructure structure in failureMechanism.ClosingStructures) + { + yield return structure; + } + } + + private IEnumerable GetExpectedRemovedObjectsWhenClearingReferenceLine(StabilityPointStructuresFailureMechanism failureMechanism) + { + foreach (object failureMechanismObject in GetExpectedRemovedObjectsWhenClearingReferenceLine(failureMechanism)) + { + yield return failureMechanismObject; + } + foreach (ICalculationBase calculationBase in failureMechanism.CalculationsGroup.GetAllChildrenRecursive()) + { + yield return calculationBase; + } + foreach (ForeshoreProfile profile in failureMechanism.ForeshoreProfiles) + { + yield return profile; + } + foreach (StabilityPointStructure structure in failureMechanism.StabilityPointStructures) + { + yield return structure; + } + } + + private IEnumerable GetExpectedRemovedObjectsWhenClearingReferenceLine(T failureMechanism) where T : IFailureMechanism, IHasSectionResults + { + foreach (FailureMechanismSection section in failureMechanism.Sections) + { + yield return section; + } + foreach (FailureMechanismSectionResult sectionResult in failureMechanism.SectionResults) + { + yield return sectionResult; + } + } } } \ No newline at end of file Index: Ringtoets/Integration/test/Ringtoets.Integration.Test/ReferenceLineImporterIntegrationTest.cs =================================================================== diff -u -rd27087d79e3bf708f5910f95d0e92b0dc269cebf -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/Integration/test/Ringtoets.Integration.Test/ReferenceLineImporterIntegrationTest.cs (.../ReferenceLineImporterIntegrationTest.cs) (revision d27087d79e3bf708f5910f95d0e92b0dc269cebf) +++ Ringtoets/Integration/test/Ringtoets.Integration.Test/ReferenceLineImporterIntegrationTest.cs (.../ReferenceLineImporterIntegrationTest.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -24,6 +24,7 @@ using System.Linq; using Core.Common.Base; using Core.Common.Base.Geometry; +using Core.Common.Gui.Commands; using Core.Common.TestUtil; using NUnit.Extensions.Forms; using NUnit.Framework; @@ -44,14 +45,18 @@ public void GivenAssessmentSectionWithReferenceLine_WhenCancellingReferenceLineImport_ThenKeepOriginalReferenceLine() { // Given + var mocks = new MockRepository(); + var viewCommands = mocks.Stub(); + mocks.ReplayAll(); + var originalReferenceLine = new ReferenceLine(); var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike) { ReferenceLine = originalReferenceLine }; - var handler = new ReferenceLineReplacementHandler(); + var handler = new ReferenceLineReplacementHandler(viewCommands); var path = TestHelper.GetTestDataPath(TestDataPath.Ringtoets.Common.IO, "traject_10-2.shp"); var importer = new ReferenceLineImporter(assessmentSection, handler, path); @@ -77,6 +82,7 @@ var expectedText = "Na het importeren van een aangepaste ligging van de referentielijn zullen alle geïmporteerde en berekende gegevens van alle toetssporen worden gewist." + Environment.NewLine + Environment.NewLine + "Wilt u doorgaan?"; Assert.AreEqual(expectedText, messageBoxText); + mocks.VerifyAll(); } [Test] @@ -86,6 +92,7 @@ var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike); var mocks = new MockRepository(); + var viewCommands = mocks.Stub(); var failureMechanismObserver = mocks.StrictMock(); failureMechanismObserver.Expect(o => o.UpdateObserver()) .Repeat.Times(assessmentSection.GetFailureMechanisms().Count()); @@ -104,7 +111,7 @@ ReferenceLine originalReferenceLine = assessmentSection.ReferenceLine; - var handler = new ReferenceLineReplacementHandler(); + var handler = new ReferenceLineReplacementHandler(viewCommands); var path = TestHelper.GetTestDataPath(TestDataPath.Ringtoets.Common.IO, Path.Combine("ReferenceLine", "traject_10-2.shp")); Index: Ringtoets/Integration/test/Ringtoets.Integration.Test/Ringtoets.Integration.Test.csproj =================================================================== diff -u -r23d1e296e2da4364fbfe346e68d582dfcf966bb0 -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/Integration/test/Ringtoets.Integration.Test/Ringtoets.Integration.Test.csproj (.../Ringtoets.Integration.Test.csproj) (revision 23d1e296e2da4364fbfe346e68d582dfcf966bb0) +++ Ringtoets/Integration/test/Ringtoets.Integration.Test/Ringtoets.Integration.Test.csproj (.../Ringtoets.Integration.Test.csproj) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -73,6 +73,10 @@ {3bbfd65b-b277-4e50-ae6d-bd24c3434609} Core.Common.Base + + {30e4c2ae-719e-4d70-9fa9-668a9767fbfa} + Core.Common.Gui + {d749ee4c-ce50-4c17-bf01-9a953028c126} Core.Common.TestUtil Index: Ringtoets/Integration/test/Ringtoets.Integration.TestUtils/DataImportHelper.cs =================================================================== diff -u -rd27087d79e3bf708f5910f95d0e92b0dc269cebf -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/Integration/test/Ringtoets.Integration.TestUtils/DataImportHelper.cs (.../DataImportHelper.cs) (revision d27087d79e3bf708f5910f95d0e92b0dc269cebf) +++ Ringtoets/Integration/test/Ringtoets.Integration.TestUtils/DataImportHelper.cs (.../DataImportHelper.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -24,7 +24,9 @@ using System.Linq; using Core.Common.Base.Geometry; using Core.Common.Base.Service; +using Core.Common.Gui.Commands; using Core.Common.Utils.IO; +using Rhino.Mocks; using Ringtoets.Common.Data.AssessmentSection; using Ringtoets.Common.Data.FailureMechanism; using Ringtoets.Common.Data.Hydraulics; @@ -57,12 +59,16 @@ "traject_6-3.shx")) { string filePath = Path.Combine(embeddedResourceFileWriter.TargetFolderPath, "traject_6-3.shp"); + var mocks = new MockRepository(); + var viewCommands = mocks.Stub(); + mocks.ReplayAll(); var activity = new FileImportActivity(new ReferenceLineImporter(assessmentSection, - new ReferenceLineReplacementHandler(), + new ReferenceLineReplacementHandler(viewCommands), filePath), "ReferenceLineImporter"); activity.Run(); activity.Finish(); + mocks.VerifyAll(); } } Index: Ringtoets/Integration/test/Ringtoets.Integration.TestUtils/Ringtoets.Integration.TestUtils.csproj =================================================================== diff -u -r23d1e296e2da4364fbfe346e68d582dfcf966bb0 -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/Integration/test/Ringtoets.Integration.TestUtils/Ringtoets.Integration.TestUtils.csproj (.../Ringtoets.Integration.TestUtils.csproj) (revision 23d1e296e2da4364fbfe346e68d582dfcf966bb0) +++ Ringtoets/Integration/test/Ringtoets.Integration.TestUtils/Ringtoets.Integration.TestUtils.csproj (.../Ringtoets.Integration.TestUtils.csproj) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -41,6 +41,10 @@ MinimumRecommendedRules.ruleset + + ..\..\..\..\packages\RhinoMocks.3.6.1\lib\net\Rhino.Mocks.dll + True + @@ -75,12 +79,17 @@ + {3bbfd65b-b277-4e50-ae6d-bd24c3434609} Core.Common.Base + + {30e4c2ae-719e-4d70-9fa9-668a9767fbfa} + Core.Common.Gui + {f49bd8b2-332a-4c91-a196-8cce0a2c7d98} Core.Common.Utils Index: Ringtoets/Integration/test/Ringtoets.Integration.TestUtils/TestDataGenerator.cs =================================================================== diff -u -rd56bec747401ad6676fac64af5eef6d5fd89c47c -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/Integration/test/Ringtoets.Integration.TestUtils/TestDataGenerator.cs (.../TestDataGenerator.cs) (revision d56bec747401ad6676fac64af5eef6d5fd89c47c) +++ Ringtoets/Integration/test/Ringtoets.Integration.TestUtils/TestDataGenerator.cs (.../TestDataGenerator.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -52,19 +52,23 @@ /// public static AssessmentSection GetFullyConfiguredAssessmentSection() { - var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike); var hydraulicBoundaryLocation = new HydraulicBoundaryLocation(1, string.Empty, 0, 0) { DesignWaterLevelOutput = new HydraulicBoundaryLocationOutput( 1.1, double.NaN, double.NaN, double.NaN, double.NaN, CalculationConvergence.CalculatedConverged), WaveHeightOutput = new HydraulicBoundaryLocationOutput( 2.2, double.NaN, double.NaN, double.NaN, double.NaN, CalculationConvergence.CalculatedConverged) }; - assessmentSection.HydraulicBoundaryDatabase = new HydraulicBoundaryDatabase + + var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike) { - Locations = + ReferenceLine = new ReferenceLine(), + HydraulicBoundaryDatabase = new HydraulicBoundaryDatabase { - hydraulicBoundaryLocation + Locations = + { + hydraulicBoundaryLocation + } } }; Index: Ringtoets/Integration/test/Ringtoets.Integration.TestUtils/packages.config =================================================================== diff -u --- Ringtoets/Integration/test/Ringtoets.Integration.TestUtils/packages.config (revision 0) +++ Ringtoets/Integration/test/Ringtoets.Integration.TestUtils/packages.config (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -0,0 +1,26 @@ + + + + + \ No newline at end of file Index: Ringtoets/Piping/src/Ringtoets.Piping.Plugin/PipingPlugin.cs =================================================================== diff -u -rf423289729b381361eed8bb5eacc7596a710d78a -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/Piping/src/Ringtoets.Piping.Plugin/PipingPlugin.cs (.../PipingPlugin.cs) (revision f423289729b381361eed8bb5eacc7596a710d78a) +++ Ringtoets/Piping/src/Ringtoets.Piping.Plugin/PipingPlugin.cs (.../PipingPlugin.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -396,6 +396,11 @@ { return ReferenceEquals(view.Data, pipingCalculationScenarioContext.WrappedData); } + var pipingCalculationScenario = o as PipingCalculationScenario; + if (pipingCalculationScenario != null) + { + return ReferenceEquals(view.Data, pipingCalculationScenario); + } IEnumerable calculations = null; Index: Ringtoets/Piping/src/Ringtoets.Piping.Service/PipingDataSynchronizationService.cs =================================================================== diff -u -re60dbf2fd41434270cad4efba20446e19ede0d2e -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/Piping/src/Ringtoets.Piping.Service/PipingDataSynchronizationService.cs (.../PipingDataSynchronizationService.cs) (revision e60dbf2fd41434270cad4efba20446e19ede0d2e) +++ Ringtoets/Piping/src/Ringtoets.Piping.Service/PipingDataSynchronizationService.cs (.../PipingDataSynchronizationService.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -24,7 +24,9 @@ using System.Collections.ObjectModel; using System.Linq; using Core.Common.Base; +using Ringtoets.Common.Data.Calculation; using Ringtoets.Common.Data.Hydraulics; +using Ringtoets.Common.Service; using Ringtoets.Piping.Data; using Ringtoets.Piping.Primitives; @@ -105,31 +107,37 @@ /// Clears all data dependent, either directly or indirectly, on the parent reference line. /// /// The failure mechanism to be cleared. - /// All objects that have been changed. + /// The results of the clear action. /// Thrown when /// is null. - public static IEnumerable ClearReferenceLineDependentData(PipingFailureMechanism failureMechanism) + public static ClearResults ClearReferenceLineDependentData(PipingFailureMechanism failureMechanism) { if (failureMechanism == null) { throw new ArgumentNullException("failureMechanism"); } - var observables = new Collection(); + var changedObjects = new Collection(); + var removedObjects = failureMechanism.Sections.OfType() + .Concat(failureMechanism.SectionResults) + .Concat(failureMechanism.CalculationsGroup.GetAllChildrenRecursive()) + .Concat(failureMechanism.StochasticSoilModels) + .Concat(failureMechanism.SurfaceLines) + .ToArray(); failureMechanism.ClearAllSections(); - observables.Add(failureMechanism); + changedObjects.Add(failureMechanism); failureMechanism.CalculationsGroup.Children.Clear(); - observables.Add(failureMechanism.CalculationsGroup); + changedObjects.Add(failureMechanism.CalculationsGroup); failureMechanism.StochasticSoilModels.Clear(); - observables.Add(failureMechanism.StochasticSoilModels); + changedObjects.Add(failureMechanism.StochasticSoilModels); failureMechanism.SurfaceLines.Clear(); - observables.Add(failureMechanism.SurfaceLines); + changedObjects.Add(failureMechanism.SurfaceLines); - return observables; + return new ClearResults(changedObjects, removedObjects); } /// Index: Ringtoets/Piping/test/Ringtoets.Piping.Service.Test/PipingDataSynchronizationServiceTest.cs =================================================================== diff -u -rdee01f6d6c15af0cc124816bfe99c7658af8995d -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/Piping/test/Ringtoets.Piping.Service.Test/PipingDataSynchronizationServiceTest.cs (.../PipingDataSynchronizationServiceTest.cs) (revision dee01f6d6c15af0cc124816bfe99c7658af8995d) +++ Ringtoets/Piping/test/Ringtoets.Piping.Service.Test/PipingDataSynchronizationServiceTest.cs (.../PipingDataSynchronizationServiceTest.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -25,6 +25,7 @@ using Core.Common.Base; using NUnit.Framework; using Ringtoets.Common.Data.Calculation; +using Ringtoets.Common.Service; using Ringtoets.Piping.Data; using Ringtoets.Piping.Data.TestUtil; using Ringtoets.Piping.Integration.TestUtils; @@ -179,8 +180,15 @@ // Setup PipingFailureMechanism failureMechanism = PipingTestDataGenerator.GetFullyConfiguredPipingFailureMechanism(); + var expectedRemovedObjects = failureMechanism.Sections.OfType() + .Concat(failureMechanism.SectionResults) + .Concat(failureMechanism.CalculationsGroup.GetAllChildrenRecursive()) + .Concat(failureMechanism.StochasticSoilModels) + .Concat(failureMechanism.SurfaceLines) + .ToArray(); + // Call - IEnumerable observables = PipingDataSynchronizationService.ClearReferenceLineDependentData(failureMechanism); + ClearResults results = PipingDataSynchronizationService.ClearReferenceLineDependentData(failureMechanism); // Assert // Note: To make sure the clear is performed regardless of what is done with @@ -191,12 +199,14 @@ CollectionAssert.IsEmpty(failureMechanism.StochasticSoilModels); CollectionAssert.IsEmpty(failureMechanism.SurfaceLines); - IObservable[] array = observables.ToArray(); + IObservable[] array = results.ChangedObjects.ToArray(); Assert.AreEqual(4, array.Length); CollectionAssert.Contains(array, failureMechanism); CollectionAssert.Contains(array, failureMechanism.CalculationsGroup); CollectionAssert.Contains(array, failureMechanism.StochasticSoilModels); CollectionAssert.Contains(array, failureMechanism.SurfaceLines); + + CollectionAssert.AreEquivalent(expectedRemovedObjects, results.DeletedObjects); } [Test] Index: Ringtoets/Piping/test/Ringtoets.Piping.Service.Test/Ringtoets.Piping.Service.Test.csproj =================================================================== diff -u -r23d1e296e2da4364fbfe346e68d582dfcf966bb0 -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/Piping/test/Ringtoets.Piping.Service.Test/Ringtoets.Piping.Service.Test.csproj (.../Ringtoets.Piping.Service.Test.csproj) (revision 23d1e296e2da4364fbfe346e68d582dfcf966bb0) +++ Ringtoets/Piping/test/Ringtoets.Piping.Service.Test/Ringtoets.Piping.Service.Test.csproj (.../Ringtoets.Piping.Service.Test.csproj) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -77,6 +77,10 @@ Ringtoets.Common.Data True + + {d951d6da-fe83-4920-9fdb-63bf96480b54} + Ringtoets.Common.Service + {4843d6e5-066f-4795-94f5-1d53932dd03c} Ringtoets.Common.Data.TestUtil Index: Ringtoets/StabilityPointStructures/src/Ringtoets.StabilityPointStructures.Service/StabilityPointStructuresDataSynchronizationService.cs =================================================================== diff -u -re182f6f394aa75e739467a77e7bcacd9a8b25429 -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/StabilityPointStructures/src/Ringtoets.StabilityPointStructures.Service/StabilityPointStructuresDataSynchronizationService.cs (.../StabilityPointStructuresDataSynchronizationService.cs) (revision e182f6f394aa75e739467a77e7bcacd9a8b25429) +++ Ringtoets/StabilityPointStructures/src/Ringtoets.StabilityPointStructures.Service/StabilityPointStructuresDataSynchronizationService.cs (.../StabilityPointStructuresDataSynchronizationService.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -23,6 +23,7 @@ using System.Collections.Generic; using System.Linq; using Core.Common.Base; +using Ringtoets.Common.Data.Calculation; using Ringtoets.Common.Data.Hydraulics; using Ringtoets.Common.Data.Structures; using Ringtoets.Common.Service; @@ -90,29 +91,37 @@ /// Clears all data dependent, either directly or indirectly, on the parent reference line. /// /// The failure mechanism to be cleared. - /// All objects that have been changed. - public static IEnumerable ClearReferenceLineDependentData(StabilityPointStructuresFailureMechanism failureMechanism) + /// The results of the clear action. + /// Thrown when + /// is null. + public static ClearResults ClearReferenceLineDependentData(StabilityPointStructuresFailureMechanism failureMechanism) { if (failureMechanism == null) { throw new ArgumentNullException("failureMechanism"); } - var observables = new List(); + var changedObjects = new List(); + var removedObjects = failureMechanism.Sections.OfType() + .Concat(failureMechanism.SectionResults) + .Concat(failureMechanism.CalculationsGroup.GetAllChildrenRecursive()) + .Concat(failureMechanism.ForeshoreProfiles) + .Concat(failureMechanism.StabilityPointStructures) + .ToArray(); failureMechanism.ClearAllSections(); - observables.Add(failureMechanism); + changedObjects.Add(failureMechanism); failureMechanism.CalculationsGroup.Children.Clear(); - observables.Add(failureMechanism.CalculationsGroup); + changedObjects.Add(failureMechanism.CalculationsGroup); failureMechanism.ForeshoreProfiles.Clear(); - observables.Add(failureMechanism.ForeshoreProfiles); + changedObjects.Add(failureMechanism.ForeshoreProfiles); failureMechanism.StabilityPointStructures.Clear(); - observables.Add(failureMechanism.StabilityPointStructures); + changedObjects.Add(failureMechanism.StabilityPointStructures); - return observables; + return new ClearResults(changedObjects, removedObjects); } /// Index: Ringtoets/StabilityPointStructures/test/Ringtoets.StabilityPointStructures.Service.Test/Ringtoets.StabilityPointStructures.Service.Test.csproj =================================================================== diff -u -r586d097de0087256cb5cf3dda3a3c612721fee9c -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/StabilityPointStructures/test/Ringtoets.StabilityPointStructures.Service.Test/Ringtoets.StabilityPointStructures.Service.Test.csproj (.../Ringtoets.StabilityPointStructures.Service.Test.csproj) (revision 586d097de0087256cb5cf3dda3a3c612721fee9c) +++ Ringtoets/StabilityPointStructures/test/Ringtoets.StabilityPointStructures.Service.Test/Ringtoets.StabilityPointStructures.Service.Test.csproj (.../Ringtoets.StabilityPointStructures.Service.Test.csproj) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -81,6 +81,10 @@ {d4200f43-3f72-4f42-af0a-8ced416a38ec} Ringtoets.Common.Data + + {d951d6da-fe83-4920-9fdb-63bf96480b54} + Ringtoets.Common.Service + {4843D6E5-066F-4795-94F5-1D53932DD03C} Ringtoets.Common.Data.TestUtil Index: Ringtoets/StabilityPointStructures/test/Ringtoets.StabilityPointStructures.Service.Test/StabilityPointStructuresDataSynchronizationServiceTest.cs =================================================================== diff -u -r8905298103eb01ce13dd5c1a2f267f879d4fda3e -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/StabilityPointStructures/test/Ringtoets.StabilityPointStructures.Service.Test/StabilityPointStructuresDataSynchronizationServiceTest.cs (.../StabilityPointStructuresDataSynchronizationServiceTest.cs) (revision 8905298103eb01ce13dd5c1a2f267f879d4fda3e) +++ Ringtoets/StabilityPointStructures/test/Ringtoets.StabilityPointStructures.Service.Test/StabilityPointStructuresDataSynchronizationServiceTest.cs (.../StabilityPointStructuresDataSynchronizationServiceTest.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -29,6 +29,7 @@ using Ringtoets.Common.Data.FailureMechanism; using Ringtoets.Common.Data.Structures; using Ringtoets.Common.Data.TestUtil; +using Ringtoets.Common.Service; using Ringtoets.StabilityPointStructures.Data; using Ringtoets.StabilityPointStructures.Data.TestUtil; @@ -124,8 +125,15 @@ // Setup StabilityPointStructuresFailureMechanism failureMechanism = CreateFullyConfiguredFailureMechanism(); + var expectedRemovedObjects = failureMechanism.Sections.OfType() + .Concat(failureMechanism.SectionResults) + .Concat(failureMechanism.CalculationsGroup.GetAllChildrenRecursive()) + .Concat(failureMechanism.ForeshoreProfiles) + .Concat(failureMechanism.StabilityPointStructures) + .ToArray(); + // Call - IEnumerable observables = StabilityPointStructuresDataSynchronizationService.ClearReferenceLineDependentData(failureMechanism); + ClearResults results = StabilityPointStructuresDataSynchronizationService.ClearReferenceLineDependentData(failureMechanism); // Assert // Note: To make sure the clear is performed regardless of what is done with @@ -136,12 +144,14 @@ CollectionAssert.IsEmpty(failureMechanism.ForeshoreProfiles); CollectionAssert.IsEmpty(failureMechanism.StabilityPointStructures); - IObservable[] array = observables.ToArray(); + IObservable[] array = results.ChangedObjects.ToArray(); Assert.AreEqual(4, array.Length); CollectionAssert.Contains(array, failureMechanism); CollectionAssert.Contains(array, failureMechanism.CalculationsGroup); CollectionAssert.Contains(array, failureMechanism.ForeshoreProfiles); CollectionAssert.Contains(array, failureMechanism.StabilityPointStructures); + + CollectionAssert.AreEquivalent(expectedRemovedObjects, results.DeletedObjects); } [Test] Index: Ringtoets/StabilityStoneCover/src/Ringtoets.StabilityStoneCover.Service/StabilityStoneCoverDataSynchronizationService.cs =================================================================== diff -u -re182f6f394aa75e739467a77e7bcacd9a8b25429 -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/StabilityStoneCover/src/Ringtoets.StabilityStoneCover.Service/StabilityStoneCoverDataSynchronizationService.cs (.../StabilityStoneCoverDataSynchronizationService.cs) (revision e182f6f394aa75e739467a77e7bcacd9a8b25429) +++ Ringtoets/StabilityStoneCover/src/Ringtoets.StabilityStoneCover.Service/StabilityStoneCoverDataSynchronizationService.cs (.../StabilityStoneCoverDataSynchronizationService.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -23,7 +23,9 @@ using System.Collections.Generic; using System.Linq; using Core.Common.Base; +using Ringtoets.Common.Data.Calculation; using Ringtoets.Common.Data.Hydraulics; +using Ringtoets.Common.Service; using Ringtoets.Revetment.Data; using Ringtoets.StabilityStoneCover.Data; @@ -113,28 +115,33 @@ /// Clears all data dependent, either directly or indirectly, on the parent reference line. /// /// The failure mechanism to be cleared. - /// All objects that have been changed. + /// The results of the clear action. /// Thrown when /// is null. - public static IEnumerable ClearReferenceLineDependentData(StabilityStoneCoverFailureMechanism failureMechanism) + public static ClearResults ClearReferenceLineDependentData(StabilityStoneCoverFailureMechanism failureMechanism) { if (failureMechanism == null) { throw new ArgumentNullException("failureMechanism"); } - var observables = new List(); + var changedObjects = new List(); + var removedObjects = failureMechanism.Sections.OfType() + .Concat(failureMechanism.SectionResults) + .Concat(failureMechanism.WaveConditionsCalculationGroup.GetAllChildrenRecursive()) + .Concat(failureMechanism.ForeshoreProfiles) + .ToArray(); failureMechanism.ClearAllSections(); - observables.Add(failureMechanism); + changedObjects.Add(failureMechanism); failureMechanism.WaveConditionsCalculationGroup.Children.Clear(); - observables.Add(failureMechanism.WaveConditionsCalculationGroup); + changedObjects.Add(failureMechanism.WaveConditionsCalculationGroup); failureMechanism.ForeshoreProfiles.Clear(); - observables.Add(failureMechanism.ForeshoreProfiles); + changedObjects.Add(failureMechanism.ForeshoreProfiles); - return observables; + return new ClearResults(changedObjects, removedObjects); } private static IEnumerable ClearHydraulicBoundaryLocation(WaveConditionsInput input) Index: Ringtoets/StabilityStoneCover/test/Ringtoets.StabilityStoneCover.Service.Test/Ringtoets.StabilityStoneCover.Service.Test.csproj =================================================================== diff -u -r586d097de0087256cb5cf3dda3a3c612721fee9c -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/StabilityStoneCover/test/Ringtoets.StabilityStoneCover.Service.Test/Ringtoets.StabilityStoneCover.Service.Test.csproj (.../Ringtoets.StabilityStoneCover.Service.Test.csproj) (revision 586d097de0087256cb5cf3dda3a3c612721fee9c) +++ Ringtoets/StabilityStoneCover/test/Ringtoets.StabilityStoneCover.Service.Test/Ringtoets.StabilityStoneCover.Service.Test.csproj (.../Ringtoets.StabilityStoneCover.Service.Test.csproj) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -81,6 +81,10 @@ {d4200f43-3f72-4f42-af0a-8ced416a38ec} Ringtoets.Common.Data + + {d951d6da-fe83-4920-9fdb-63bf96480b54} + Ringtoets.Common.Service + {4843D6E5-066F-4795-94F5-1D53932DD03C} Ringtoets.Common.Data.TestUtil Index: Ringtoets/StabilityStoneCover/test/Ringtoets.StabilityStoneCover.Service.Test/StabilityStoneCoverDataSynchronizationServiceTest.cs =================================================================== diff -u -rf2e108cd25b68267d9484249eac3c6ea0db6a7b6 -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/StabilityStoneCover/test/Ringtoets.StabilityStoneCover.Service.Test/StabilityStoneCoverDataSynchronizationServiceTest.cs (.../StabilityStoneCoverDataSynchronizationServiceTest.cs) (revision f2e108cd25b68267d9484249eac3c6ea0db6a7b6) +++ Ringtoets/StabilityStoneCover/test/Ringtoets.StabilityStoneCover.Service.Test/StabilityStoneCoverDataSynchronizationServiceTest.cs (.../StabilityStoneCoverDataSynchronizationServiceTest.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -26,6 +26,7 @@ using NUnit.Framework; using Ringtoets.Common.Data.Calculation; using Ringtoets.Common.Data.Hydraulics; +using Ringtoets.Common.Service; using Ringtoets.Revetment.Data; using Ringtoets.Revetment.TestUtil; using Ringtoets.StabilityStoneCover.Data; @@ -197,8 +198,14 @@ // Setup StabilityStoneCoverFailureMechanism failureMechanism = CreateFullyConfiguredFailureMechanism(); + var expectedRemovedObjects = failureMechanism.Sections.OfType() + .Concat(failureMechanism.SectionResults) + .Concat(failureMechanism.WaveConditionsCalculationGroup.GetAllChildrenRecursive()) + .Concat(failureMechanism.ForeshoreProfiles) + .ToArray(); + // Call - IEnumerable observables = StabilityStoneCoverDataSynchronizationService.ClearReferenceLineDependentData(failureMechanism); + ClearResults results = StabilityStoneCoverDataSynchronizationService.ClearReferenceLineDependentData(failureMechanism); // Assert // Note: To make sure the clear is performed regardless of what is done with @@ -208,11 +215,13 @@ CollectionAssert.IsEmpty(failureMechanism.WaveConditionsCalculationGroup.Children); CollectionAssert.IsEmpty(failureMechanism.ForeshoreProfiles); - IObservable[] array = observables.ToArray(); + IObservable[] array = results.ChangedObjects.ToArray(); Assert.AreEqual(3, array.Length); CollectionAssert.Contains(array, failureMechanism); CollectionAssert.Contains(array, failureMechanism.WaveConditionsCalculationGroup); CollectionAssert.Contains(array, failureMechanism.ForeshoreProfiles); + + CollectionAssert.AreEquivalent(expectedRemovedObjects, results.DeletedObjects); } private static StabilityStoneCoverFailureMechanism CreateFullyConfiguredFailureMechanism() Index: Ringtoets/WaveImpactAsphaltCover/src/Ringtoets.WaveImpactAsphaltCover.Service/WaveImpactAsphaltCoverDataSynchronizationService.cs =================================================================== diff -u -re182f6f394aa75e739467a77e7bcacd9a8b25429 -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/WaveImpactAsphaltCover/src/Ringtoets.WaveImpactAsphaltCover.Service/WaveImpactAsphaltCoverDataSynchronizationService.cs (.../WaveImpactAsphaltCoverDataSynchronizationService.cs) (revision e182f6f394aa75e739467a77e7bcacd9a8b25429) +++ Ringtoets/WaveImpactAsphaltCover/src/Ringtoets.WaveImpactAsphaltCover.Service/WaveImpactAsphaltCoverDataSynchronizationService.cs (.../WaveImpactAsphaltCoverDataSynchronizationService.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -23,7 +23,9 @@ using System.Collections.Generic; using System.Linq; using Core.Common.Base; +using Ringtoets.Common.Data.Calculation; using Ringtoets.Common.Data.Hydraulics; +using Ringtoets.Common.Service; using Ringtoets.Revetment.Data; using Ringtoets.WaveImpactAsphaltCover.Data; @@ -113,26 +115,32 @@ /// Clears all data dependent, either directly or indirectly, on the parent reference line. /// /// The failure mechanism to be cleared. - /// All objects that have been changed. - public static IEnumerable ClearReferenceLineDependentData(WaveImpactAsphaltCoverFailureMechanism failureMechanism) + /// The results of the clear action. + /// Thrown when is null. + public static ClearResults ClearReferenceLineDependentData(WaveImpactAsphaltCoverFailureMechanism failureMechanism) { if (failureMechanism == null) { throw new ArgumentNullException("failureMechanism"); } - var observables = new List(); + var changedObjects = new List(); + var removedObjects = failureMechanism.Sections.OfType() + .Concat(failureMechanism.SectionResults) + .Concat(failureMechanism.WaveConditionsCalculationGroup.GetAllChildrenRecursive()) + .Concat(failureMechanism.ForeshoreProfiles) + .ToArray(); failureMechanism.ClearAllSections(); - observables.Add(failureMechanism); + changedObjects.Add(failureMechanism); failureMechanism.WaveConditionsCalculationGroup.Children.Clear(); - observables.Add(failureMechanism.WaveConditionsCalculationGroup); + changedObjects.Add(failureMechanism.WaveConditionsCalculationGroup); failureMechanism.ForeshoreProfiles.Clear(); - observables.Add(failureMechanism.ForeshoreProfiles); + changedObjects.Add(failureMechanism.ForeshoreProfiles); - return observables; + return new ClearResults(changedObjects, removedObjects); } private static IEnumerable ClearHydraulicBoundaryLocation(WaveConditionsInput input) Index: Ringtoets/WaveImpactAsphaltCover/test/Ringtoets.WaveImpactAsphaltCover.Service.Test/Ringtoets.WaveImpactAsphaltCover.Service.Test.csproj =================================================================== diff -u -r586d097de0087256cb5cf3dda3a3c612721fee9c -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/WaveImpactAsphaltCover/test/Ringtoets.WaveImpactAsphaltCover.Service.Test/Ringtoets.WaveImpactAsphaltCover.Service.Test.csproj (.../Ringtoets.WaveImpactAsphaltCover.Service.Test.csproj) (revision 586d097de0087256cb5cf3dda3a3c612721fee9c) +++ Ringtoets/WaveImpactAsphaltCover/test/Ringtoets.WaveImpactAsphaltCover.Service.Test/Ringtoets.WaveImpactAsphaltCover.Service.Test.csproj (.../Ringtoets.WaveImpactAsphaltCover.Service.Test.csproj) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -81,6 +81,10 @@ {d4200f43-3f72-4f42-af0a-8ced416a38ec} Ringtoets.Common.Data + + {d951d6da-fe83-4920-9fdb-63bf96480b54} + Ringtoets.Common.Service + {4843D6E5-066F-4795-94F5-1D53932DD03C} Ringtoets.Common.Data.TestUtil Index: Ringtoets/WaveImpactAsphaltCover/test/Ringtoets.WaveImpactAsphaltCover.Service.Test/WaveImpactAsphaltCoverDataSynchronizationServiceTest.cs =================================================================== diff -u -r8905298103eb01ce13dd5c1a2f267f879d4fda3e -rce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b --- Ringtoets/WaveImpactAsphaltCover/test/Ringtoets.WaveImpactAsphaltCover.Service.Test/WaveImpactAsphaltCoverDataSynchronizationServiceTest.cs (.../WaveImpactAsphaltCoverDataSynchronizationServiceTest.cs) (revision 8905298103eb01ce13dd5c1a2f267f879d4fda3e) +++ Ringtoets/WaveImpactAsphaltCover/test/Ringtoets.WaveImpactAsphaltCover.Service.Test/WaveImpactAsphaltCoverDataSynchronizationServiceTest.cs (.../WaveImpactAsphaltCoverDataSynchronizationServiceTest.cs) (revision ce9e1d476f00cfb42ce2a8ab6c762baf5abfd97b) @@ -26,6 +26,7 @@ using NUnit.Framework; using Ringtoets.Common.Data.Calculation; using Ringtoets.Common.Data.Hydraulics; +using Ringtoets.Common.Service; using Ringtoets.Revetment.Data; using Ringtoets.WaveImpactAsphaltCover.Data; @@ -176,8 +177,14 @@ // Setup WaveImpactAsphaltCoverFailureMechanism failureMechanism = CreateFullyConfiguredFailureMechanism(); + var expectedRemovedObjects = failureMechanism.Sections.OfType() + .Concat(failureMechanism.SectionResults) + .Concat(failureMechanism.WaveConditionsCalculationGroup.GetAllChildrenRecursive()) + .Concat(failureMechanism.ForeshoreProfiles) + .ToArray(); + // Call - IEnumerable observables = WaveImpactAsphaltCoverDataSynchronizationService.ClearReferenceLineDependentData(failureMechanism); + ClearResults results = WaveImpactAsphaltCoverDataSynchronizationService.ClearReferenceLineDependentData(failureMechanism); // Assert // Note: To make sure the clear is performed regardless of what is done with @@ -187,11 +194,13 @@ CollectionAssert.IsEmpty(failureMechanism.WaveConditionsCalculationGroup.Children); CollectionAssert.IsEmpty(failureMechanism.ForeshoreProfiles); - IObservable[] array = observables.ToArray(); + IObservable[] array = results.ChangedObjects.ToArray(); Assert.AreEqual(3, array.Length); CollectionAssert.Contains(array, failureMechanism); CollectionAssert.Contains(array, failureMechanism.WaveConditionsCalculationGroup); CollectionAssert.Contains(array, failureMechanism.ForeshoreProfiles); + + CollectionAssert.AreEquivalent(expectedRemovedObjects, results.DeletedObjects); } private static WaveImpactAsphaltCoverFailureMechanism CreateFullyConfiguredFailureMechanism()