Index: Demo/Ringtoets/src/Demo.Ringtoets/Commands/AddNewDemoAssessmentSectionCommand.cs =================================================================== diff -u -r3d92d0715a889b25fcf76e04d6536168d670328c -r7135385a10443af1369b1b9e814b8b762366f64b --- Demo/Ringtoets/src/Demo.Ringtoets/Commands/AddNewDemoAssessmentSectionCommand.cs (.../AddNewDemoAssessmentSectionCommand.cs) (revision 3d92d0715a889b25fcf76e04d6536168d670328c) +++ Demo/Ringtoets/src/Demo.Ringtoets/Commands/AddNewDemoAssessmentSectionCommand.cs (.../AddNewDemoAssessmentSectionCommand.cs) (revision 7135385a10443af1369b1b9e814b8b762366f64b) @@ -140,19 +140,21 @@ for (var i = 0; i < failureMechanisms.Length; i++) { + IFailureMechanism failureMechanism = failureMechanisms[i]; + if (i == 0) { - - var importer = new FailureMechanismSectionsImporter(failureMechanisms[i], + var importer = new FailureMechanismSectionsImporter(failureMechanism, demoAssessmentSection.ReferenceLine, - filePath); + filePath, + new FailureMechanismSectionReplaceStrategy(failureMechanism)); importer.Import(); } else { // Copy same FailureMechanismSection instances to other failure mechanisms FailureMechanismSection[] clonedSections = failureMechanisms[0].Sections.Select(DeepCloneSection).ToArray(); - failureMechanisms[i].SetSections(clonedSections, filePath); + failureMechanism.SetSections(clonedSections, filePath); } } } Index: Ringtoets/Common/src/Ringtoets.Common.IO/FileImporters/FailureMechanismSectionReplaceStrategy.cs =================================================================== diff -u --- Ringtoets/Common/src/Ringtoets.Common.IO/FileImporters/FailureMechanismSectionReplaceStrategy.cs (revision 0) +++ Ringtoets/Common/src/Ringtoets.Common.IO/FileImporters/FailureMechanismSectionReplaceStrategy.cs (revision 7135385a10443af1369b1b9e814b8b762366f64b) @@ -0,0 +1,68 @@ +// Copyright (C) Stichting Deltares 2017. 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 Ringtoets.Common.Data.FailureMechanism; + +namespace Ringtoets.Common.IO.FileImporters +{ + /// + /// A replace strategy that can be used to replace failure mechanism sections with + /// imported failure mechanism sections. + /// + public class FailureMechanismSectionReplaceStrategy : IFailureMechanismSectionUpdateStrategy + { + private readonly IFailureMechanism failureMechanism; + + /// + /// Creates a new instance of . + /// + /// The to set the sections to. + /// Thrown when + /// is null. + public FailureMechanismSectionReplaceStrategy(IFailureMechanism failureMechanism) + { + if (failureMechanism == null) + { + throw new ArgumentNullException(nameof(failureMechanism)); + } + + this.failureMechanism = failureMechanism; + } + + public void UpdateSectionsWithImportedData(IEnumerable importedFailureMechanismSections, + string sourcePath) + { + if (importedFailureMechanismSections == null) + { + throw new ArgumentNullException(nameof(importedFailureMechanismSections)); + } + + if (sourcePath == null) + { + throw new ArgumentNullException(nameof(sourcePath)); + } + + failureMechanism.SetSections(importedFailureMechanismSections, sourcePath); + } + } +} \ No newline at end of file Index: Ringtoets/Common/src/Ringtoets.Common.IO/FileImporters/FailureMechanismSectionsImporter.cs =================================================================== diff -u -r88ba44b92caad86cf1343d9c191bc22761463c8c -r7135385a10443af1369b1b9e814b8b762366f64b --- Ringtoets/Common/src/Ringtoets.Common.IO/FileImporters/FailureMechanismSectionsImporter.cs (.../FailureMechanismSectionsImporter.cs) (revision 88ba44b92caad86cf1343d9c191bc22761463c8c) +++ Ringtoets/Common/src/Ringtoets.Common.IO/FileImporters/FailureMechanismSectionsImporter.cs (.../FailureMechanismSectionsImporter.cs) (revision 7135385a10443af1369b1b9e814b8b762366f64b) @@ -48,23 +48,35 @@ private const double lengthDifferenceTolerance = 1; private readonly ReferenceLine referenceLine; + private readonly IFailureMechanismSectionUpdateStrategy failureMechanismSectionUpdateStrategy; /// /// Initializes a new instance of the class. /// /// The failure mechanism to update. /// The reference line used to check correspondence with. /// The path to the file to import from. + /// The strategy to update the failure mechanism sections + /// with the imported data. /// Thrown when any input argument is null. /// - public FailureMechanismSectionsImporter(IFailureMechanism importTarget, ReferenceLine referenceLine, string filePath) : base(filePath, importTarget) + public FailureMechanismSectionsImporter(IFailureMechanism importTarget, + ReferenceLine referenceLine, + string filePath, + IFailureMechanismSectionUpdateStrategy failureMechanismSectionUpdateStrategy) : base(filePath, importTarget) { if (referenceLine == null) { throw new ArgumentNullException(nameof(referenceLine)); } + if (failureMechanismSectionUpdateStrategy == null) + { + throw new ArgumentNullException(nameof(failureMechanismSectionUpdateStrategy)); + } + this.referenceLine = referenceLine; + this.failureMechanismSectionUpdateStrategy = failureMechanismSectionUpdateStrategy; } protected override bool OnImport() @@ -227,7 +239,7 @@ { IEnumerable snappedSections = SnapReadSectionsToReferenceLine(failureMechanismSections, referenceLine); - ImportTarget.SetSections(snappedSections, FilePath); + failureMechanismSectionUpdateStrategy.UpdateSectionsWithImportedData(snappedSections, FilePath); } private static IEnumerable SnapReadSectionsToReferenceLine(IEnumerable failureMechanismSections, Index: Ringtoets/Common/src/Ringtoets.Common.IO/FileImporters/IFailureMechanismSectionUpdateStrategy.cs =================================================================== diff -u --- Ringtoets/Common/src/Ringtoets.Common.IO/FileImporters/IFailureMechanismSectionUpdateStrategy.cs (revision 0) +++ Ringtoets/Common/src/Ringtoets.Common.IO/FileImporters/IFailureMechanismSectionUpdateStrategy.cs (revision 7135385a10443af1369b1b9e814b8b762366f64b) @@ -0,0 +1,45 @@ +// Copyright (C) Stichting Deltares 2017. 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 System.Linq; +using Ringtoets.Common.Data.Exceptions; +using Ringtoets.Common.Data.FailureMechanism; + +namespace Ringtoets.Common.IO.FileImporters +{ + /// + /// Interface describing the method of updating the data model after new + /// failure mechanism sections have been imported. + /// + public interface IFailureMechanismSectionUpdateStrategy + { + /// + /// Updates the data model with data from . + /// + /// The imported failure mechanism sections. + /// The source path from where the failure mechanism sections were imported. + /// Thrown when any input argument is null. + void UpdateSectionsWithImportedData(IEnumerable importedFailureMechanismSections, + string sourcePath); + } +} \ No newline at end of file Index: Ringtoets/Common/src/Ringtoets.Common.IO/Ringtoets.Common.IO.csproj =================================================================== diff -u -reb0206bf27d75fbfeb403b365a4218a228f007e4 -r7135385a10443af1369b1b9e814b8b762366f64b --- Ringtoets/Common/src/Ringtoets.Common.IO/Ringtoets.Common.IO.csproj (.../Ringtoets.Common.IO.csproj) (revision eb0206bf27d75fbfeb403b365a4218a228f007e4) +++ Ringtoets/Common/src/Ringtoets.Common.IO/Ringtoets.Common.IO.csproj (.../Ringtoets.Common.IO.csproj) (revision 7135385a10443af1369b1b9e814b8b762366f64b) @@ -47,10 +47,13 @@ + + + Index: Ringtoets/Common/test/Ringtoets.Common.IO.Test/FileImporters/FailureMechanismSectionReplaceStrategyTest.cs =================================================================== diff -u --- Ringtoets/Common/test/Ringtoets.Common.IO.Test/FileImporters/FailureMechanismSectionReplaceStrategyTest.cs (revision 0) +++ Ringtoets/Common/test/Ringtoets.Common.IO.Test/FileImporters/FailureMechanismSectionReplaceStrategyTest.cs (revision 7135385a10443af1369b1b9e814b8b762366f64b) @@ -0,0 +1,98 @@ +// Copyright (C) Stichting Deltares 2017. 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.Linq; +using NUnit.Framework; +using Rhino.Mocks; +using Ringtoets.Common.Data.FailureMechanism; +using Ringtoets.Common.IO.FileImporters; + +namespace Ringtoets.Common.IO.Test.FileImporters +{ + [TestFixture] + public class FailureMechanismSectionReplaceStrategyTest + { + [Test] + public void Constructor_FailureMechanismNull_ThrowsArgumentNullException() + { + // Call + TestDelegate call = () => new FailureMechanismSectionReplaceStrategy(null); + + // Assert + string paramName = Assert.Throws(call).ParamName; + Assert.AreEqual("failureMechanism", paramName); + } + + [Test] + public void Constructor_ExpectedValues() + { + // Setup + var mocks = new MockRepository(); + var failureMechanism = mocks.Stub(); + mocks.ReplayAll(); + + // Call + var importer = new FailureMechanismSectionReplaceStrategy(failureMechanism); + + // Assert + Assert.IsInstanceOf(importer); + mocks.VerifyAll(); + } + + [Test] + public void UpdateSectionsWithImportedData_ImportedFailureMechanismSectionsNull_ThrowsArgumentNullException() + { + // Setup + var mocks = new MockRepository(); + var failureMechanism = mocks.Stub(); + mocks.ReplayAll(); + + // Call + TestDelegate call = () => new FailureMechanismSectionReplaceStrategy(failureMechanism).UpdateSectionsWithImportedData(null, ""); + + // Assert + string paramName = Assert.Throws(call).ParamName; + Assert.AreEqual("importedFailureMechanismSections", paramName); + mocks.VerifyAll(); + } + + [Test] + public void UpdateSectionsWithImportedData_SourcePathNull_ThrowsArgumentNullException() + { + // Setup + var mocks = new MockRepository(); + var failureMechanism = mocks.Stub(); + mocks.ReplayAll(); + + var failureMechanismSectionReplaceStrategy = new FailureMechanismSectionReplaceStrategy(failureMechanism); + + // Call + TestDelegate call = () => failureMechanismSectionReplaceStrategy.UpdateSectionsWithImportedData( + Enumerable.Empty(), null); + + // Assert + string paramName = Assert.Throws(call).ParamName; + Assert.AreEqual("sourcePath", paramName); + mocks.VerifyAll(); + } + } +} \ No newline at end of file Index: Ringtoets/Common/test/Ringtoets.Common.IO.Test/FileImporters/FailureMechanismSectionsImporterTest.cs =================================================================== diff -u -r67846d2c26e292748851a4ecbee2a050ffffa721 -r7135385a10443af1369b1b9e814b8b762366f64b --- Ringtoets/Common/test/Ringtoets.Common.IO.Test/FileImporters/FailureMechanismSectionsImporterTest.cs (.../FailureMechanismSectionsImporterTest.cs) (revision 67846d2c26e292748851a4ecbee2a050ffffa721) +++ Ringtoets/Common/test/Ringtoets.Common.IO.Test/FileImporters/FailureMechanismSectionsImporterTest.cs (.../FailureMechanismSectionsImporterTest.cs) (revision 7135385a10443af1369b1b9e814b8b762366f64b) @@ -42,33 +42,36 @@ public class FailureMechanismSectionsImporterTest { [Test] - public void Constructor_FailureMechanismNull_ThrowArgumentNullException() + public void Constructor_ReferenceLineNull_ThrowsArgumentNullException() { // Setup - var referenceLine = new ReferenceLine(); + var mocks = new MockRepository(); + var failureMechanism = mocks.Stub(); + mocks.ReplayAll(); // Call - TestDelegate call = () => new FailureMechanismSectionsImporter(null, referenceLine, ""); + TestDelegate call = () => new FailureMechanismSectionsImporter(failureMechanism, null, "", new TestFailureMechanismSectionUpdateStrategy()); // Assert string paramName = Assert.Throws(call).ParamName; - Assert.AreEqual("importTarget", paramName); + Assert.AreEqual("referenceLine", paramName); + mocks.VerifyAll(); } [Test] - public void Constructor_ReferenceLineNull_ThrowsArgumentNullException() + public void Constructor_FailureMechanismSectionUpdateStrategyNull_ThrowsArgumentNullException() { // Setup var mocks = new MockRepository(); var failureMechanism = mocks.Stub(); mocks.ReplayAll(); // Call - TestDelegate call = () => new FailureMechanismSectionsImporter(failureMechanism, null, ""); + TestDelegate call = () => new FailureMechanismSectionsImporter(failureMechanism, new ReferenceLine(), "", null); // Assert string paramName = Assert.Throws(call).ParamName; - Assert.AreEqual("referenceLine", paramName); + Assert.AreEqual("failureMechanismSectionUpdateStrategy", paramName); mocks.VerifyAll(); } @@ -83,7 +86,7 @@ var referenceLine = new ReferenceLine(); // Call - var importer = new FailureMechanismSectionsImporter(failureMechanism, referenceLine, ""); + var importer = new FailureMechanismSectionsImporter(failureMechanism, referenceLine, "", new TestFailureMechanismSectionUpdateStrategy()); // Assert Assert.IsInstanceOf>(importer); @@ -103,17 +106,19 @@ ReferenceLine importReferenceLine = ImportReferenceLine(referenceLineFilePath); var failureMechanism = new TestFailureMechanism(); - var importer = new FailureMechanismSectionsImporter(failureMechanism, importReferenceLine, sectionsFilePath); + var updateStrategy = new TestFailureMechanismSectionUpdateStrategy(); + var importer = new FailureMechanismSectionsImporter(failureMechanism, importReferenceLine, sectionsFilePath, updateStrategy); + // Call bool importSuccessful = importer.Import(); // Assert Assert.IsTrue(importSuccessful); - Assert.AreEqual(sectionsFilePath, failureMechanism.FailureMechanismSectionSourcePath); - FailureMechanismSection[] sections = failureMechanism.Sections.ToArray(); - Assert.AreEqual(sectionCount, sections.Length); + Assert.AreEqual(sectionsFilePath, updateStrategy.SourcePath); + IEnumerable sections = updateStrategy.ImportedFailureMechanismSections; + Assert.AreEqual(sectionCount, sections.Count()); AssertSectionsAreValidForReferenceLine(sections, importReferenceLine); } @@ -133,16 +138,18 @@ { new FailureMechanismSection("A", importReferenceLine.Points) }); - var importer = new FailureMechanismSectionsImporter(failureMechanism, importReferenceLine, sectionsFilePath); + var updateStrategy = new TestFailureMechanismSectionUpdateStrategy(); + var importer = new FailureMechanismSectionsImporter(failureMechanism, importReferenceLine, sectionsFilePath, updateStrategy); + // Call bool importSuccessful = importer.Import(); // Assert Assert.IsTrue(importSuccessful); - FailureMechanismSection[] sections = failureMechanism.Sections.ToArray(); - Assert.AreEqual(62, sections.Length); + IEnumerable sections = updateStrategy.ImportedFailureMechanismSections; + Assert.AreEqual(62, sections.Count()); AssertSectionsAreValidForReferenceLine(sections, importReferenceLine); } @@ -158,17 +165,18 @@ ReferenceLine importReferenceLine = ImportReferenceLine(referenceLineFilePath); var failureMechanism = new TestFailureMechanism(); + var updateStrategy = new TestFailureMechanismSectionUpdateStrategy(); - var importer = new FailureMechanismSectionsImporter(failureMechanism, importReferenceLine, sectionsFilePath); + var importer = new FailureMechanismSectionsImporter(failureMechanism, importReferenceLine, sectionsFilePath, updateStrategy); // Call bool importSuccessful = importer.Import(); // Assert Assert.IsTrue(importSuccessful); - FailureMechanismSection[] sections = failureMechanism.Sections.ToArray(); - Assert.AreEqual(7, sections.Length); + IEnumerable sections = updateStrategy.ImportedFailureMechanismSections; + Assert.AreEqual(7, sections.Count()); AssertSectionsAreValidForReferenceLine(sections, importReferenceLine); } @@ -189,17 +197,18 @@ ReferenceLine importReferenceLine = ImportReferenceLine(referenceLineFilePath); var failureMechanism = new TestFailureMechanism(); + var updateStrategy = new TestFailureMechanismSectionUpdateStrategy(); - var importer = new FailureMechanismSectionsImporter(failureMechanism, importReferenceLine, sectionsFilePath); + var importer = new FailureMechanismSectionsImporter(failureMechanism, importReferenceLine, sectionsFilePath, updateStrategy); // Call bool importSuccessful = importer.Import(); // Assert Assert.IsTrue(importSuccessful); - FailureMechanismSection[] sections = failureMechanism.Sections.ToArray(); - Assert.AreEqual(7, sections.Length); + IEnumerable sections = updateStrategy.ImportedFailureMechanismSections; + Assert.AreEqual(7, sections.Count()); AssertSectionsAreValidForReferenceLine(sections, importReferenceLine); } @@ -217,8 +226,9 @@ var progressChangeNotifications = new List(); var failureMechanism = new TestFailureMechanism(); + var updateStrategy = new TestFailureMechanismSectionUpdateStrategy(); - var importer = new FailureMechanismSectionsImporter(failureMechanism, importReferenceLine, sectionsFilePath); + var importer = new FailureMechanismSectionsImporter(failureMechanism, importReferenceLine, sectionsFilePath, updateStrategy); importer.SetProgressChanged((description, step, steps) => progressChangeNotifications.Add(new ProgressNotification(description, step, steps))); // Call @@ -248,8 +258,9 @@ ReferenceLine importReferenceLine = ImportReferenceLine(referenceLineFilePath); var failureMechanism = new TestFailureMechanism(); + var updateStrategy = new TestFailureMechanismSectionUpdateStrategy(); - var importer = new FailureMechanismSectionsImporter(failureMechanism, importReferenceLine, sectionsFilePath); + var importer = new FailureMechanismSectionsImporter(failureMechanism, importReferenceLine, sectionsFilePath, updateStrategy); // Call var importSuccessful = true; @@ -274,8 +285,9 @@ ReferenceLine importReferenceLine = ImportReferenceLine(referenceLineFilePath); var failureMechanism = new TestFailureMechanism(); + var updateStrategy = new TestFailureMechanismSectionUpdateStrategy(); - var importer = new FailureMechanismSectionsImporter(failureMechanism, importReferenceLine, sectionsFilePath); + var importer = new FailureMechanismSectionsImporter(failureMechanism, importReferenceLine, sectionsFilePath, updateStrategy); // Call var importSuccessful = true; @@ -302,8 +314,9 @@ ReferenceLine importReferenceLine = ImportReferenceLine(referenceLineFilePath); var failureMechanism = new TestFailureMechanism(); + var updateStrategy = new TestFailureMechanismSectionUpdateStrategy(); - var importer = new FailureMechanismSectionsImporter(failureMechanism, importReferenceLine, sectionsFilePath); + var importer = new FailureMechanismSectionsImporter(failureMechanism, importReferenceLine, sectionsFilePath, updateStrategy); // Call var importSuccessful = true; @@ -332,8 +345,9 @@ ReferenceLine importReferenceLine = ImportReferenceLine(referenceLineFilePath); var failureMechanism = new TestFailureMechanism(); + var updateStrategy = new TestFailureMechanismSectionUpdateStrategy(); - var importer = new FailureMechanismSectionsImporter(failureMechanism, importReferenceLine, sectionsFilePath); + var importer = new FailureMechanismSectionsImporter(failureMechanism, importReferenceLine, sectionsFilePath, updateStrategy); // Call var importSuccessful = true; @@ -362,8 +376,9 @@ ReferenceLine importReferenceLine = ImportReferenceLine(referenceLineFilePath); var failureMechanism = new TestFailureMechanism(); + var updateStrategy = new TestFailureMechanismSectionUpdateStrategy(); - var importer = new FailureMechanismSectionsImporter(failureMechanism, importReferenceLine, sectionsFilePath); + var importer = new FailureMechanismSectionsImporter(failureMechanism, importReferenceLine, sectionsFilePath, updateStrategy); // Call var importSuccessful = true; @@ -389,8 +404,9 @@ ReferenceLine importReferenceLine = ImportReferenceLine(referenceLineFilePath); var failureMechanism = new TestFailureMechanism(); + var updateStrategy = new TestFailureMechanismSectionUpdateStrategy(); - var importer = new FailureMechanismSectionsImporter(failureMechanism, importReferenceLine, sectionsFilePath); + var importer = new FailureMechanismSectionsImporter(failureMechanism, importReferenceLine, sectionsFilePath, updateStrategy); // Call var importSuccessful = true; @@ -416,8 +432,9 @@ ReferenceLine importReferenceLine = ImportReferenceLine(referenceLineFilePath); var failureMechanism = new TestFailureMechanism(); + var updateStrategy = new TestFailureMechanismSectionUpdateStrategy(); - var importer = new FailureMechanismSectionsImporter(failureMechanism, importReferenceLine, sectionsFilePath); + var importer = new FailureMechanismSectionsImporter(failureMechanism, importReferenceLine, sectionsFilePath, updateStrategy); // Call var importSuccessful = true; @@ -444,8 +461,9 @@ ReferenceLine importReferenceLine = ImportReferenceLine(referenceLineFilePath); var failureMechanism = new TestFailureMechanism(); + var updateStrategy = new TestFailureMechanismSectionUpdateStrategy(); - var importer = new FailureMechanismSectionsImporter(failureMechanism, importReferenceLine, sectionsFilePath); + var importer = new FailureMechanismSectionsImporter(failureMechanism, importReferenceLine, sectionsFilePath, updateStrategy); // Call var importSuccessful = true; @@ -467,8 +485,9 @@ Path.Combine("FailureMechanismSections", "vakindeling_Empty_Name_Value.shp")); var failureMechanism = new TestFailureMechanism(); + var updateStrategy = new TestFailureMechanismSectionUpdateStrategy(); - var importer = new FailureMechanismSectionsImporter(failureMechanism, new ReferenceLine(), sectionsFilePath); + var importer = new FailureMechanismSectionsImporter(failureMechanism, new ReferenceLine(), sectionsFilePath, updateStrategy); // Call var importSuccessful = true; @@ -494,8 +513,9 @@ ReferenceLine importReferenceLine = ImportReferenceLine(referenceLineFilePath); var failureMechanism = new TestFailureMechanism(); + var updateStrategy = new TestFailureMechanismSectionUpdateStrategy(); - var importer = new FailureMechanismSectionsImporter(failureMechanism, importReferenceLine, sectionsFilePath); + var importer = new FailureMechanismSectionsImporter(failureMechanism, importReferenceLine, sectionsFilePath, updateStrategy); importer.SetProgressChanged((description, step, steps) => { if (description.Contains("Inlezen vakindeling.")) @@ -527,8 +547,9 @@ ReferenceLine importReferenceLine = ImportReferenceLine(referenceLineFilePath); var failureMechanism = new TestFailureMechanism(); + var updateStrategy = new TestFailureMechanismSectionUpdateStrategy(); - var importer = new FailureMechanismSectionsImporter(failureMechanism, importReferenceLine, sectionsFilePath); + var importer = new FailureMechanismSectionsImporter(failureMechanism, importReferenceLine, sectionsFilePath, updateStrategy); importer.SetProgressChanged((description, step, steps) => { if (description.Contains("Valideren ingelezen vakindeling.")) @@ -560,8 +581,9 @@ ReferenceLine importReferenceLine = ImportReferenceLine(referenceLineFilePath); var failureMechanism = new TestFailureMechanism(); + var updateStrategy = new TestFailureMechanismSectionUpdateStrategy(); - var importer = new FailureMechanismSectionsImporter(failureMechanism, importReferenceLine, sectionsFilePath); + var importer = new FailureMechanismSectionsImporter(failureMechanism, importReferenceLine, sectionsFilePath, updateStrategy); importer.SetProgressChanged((description, step, steps) => { if (description.Contains("Geïmporteerde data toevoegen aan het toetsspoor.")) @@ -578,7 +600,7 @@ // Assert TestHelper.AssertLogMessageIsGenerated(call, "Huidige actie was niet meer te annuleren en is daarom voortgezet.", 1); Assert.IsTrue(importSuccessful); - CollectionAssert.IsNotEmpty(failureMechanism.Sections); + CollectionAssert.IsNotEmpty(updateStrategy.ImportedFailureMechanismSections); } [Test] @@ -593,8 +615,9 @@ ReferenceLine importReferenceLine = ImportReferenceLine(referenceLineFilePath); var failureMechanism = new TestFailureMechanism(); + var updateStrategy = new TestFailureMechanismSectionUpdateStrategy(); - var importer = new FailureMechanismSectionsImporter(failureMechanism, importReferenceLine, sectionsFilePath); + var importer = new FailureMechanismSectionsImporter(failureMechanism, importReferenceLine, sectionsFilePath, updateStrategy); importer.SetProgressChanged((description, step, steps) => importer.Cancel()); Assert.IsFalse(importer.Import()); @@ -606,8 +629,8 @@ // Assert Assert.IsTrue(importSuccessful); - FailureMechanismSection[] sections = failureMechanism.Sections.ToArray(); - Assert.AreEqual(62, sections.Length); + IEnumerable sections = updateStrategy.ImportedFailureMechanismSections; + Assert.AreEqual(62, sections.Count()); AssertSectionsAreValidForReferenceLine(sections, importReferenceLine); } @@ -628,8 +651,9 @@ ReferenceLine importReferenceLine = ImportReferenceLine(referenceLineFilePath); var failureMechanism = new TestFailureMechanism(); + var updateStrategy = new TestFailureMechanismSectionUpdateStrategy(); - var importer = new FailureMechanismSectionsImporter(failureMechanism, importReferenceLine, sectionsFilePath); + var importer = new FailureMechanismSectionsImporter(failureMechanism, importReferenceLine, sectionsFilePath, updateStrategy); importer.Import(); failureMechanism.SectionResults.Attach(observable); @@ -641,6 +665,22 @@ mocks.VerifyAll(); } + private class TestFailureMechanismSectionUpdateStrategy : IFailureMechanismSectionUpdateStrategy + { + public bool Updated { get; private set; } + + public string SourcePath { get; private set; } + + public IEnumerable ImportedFailureMechanismSections { get; private set; } + + public void UpdateSectionsWithImportedData(IEnumerable importedFailureMechanismSections, string sourcePath) + { + Updated = true; + SourcePath = sourcePath; + ImportedFailureMechanismSections = importedFailureMechanismSections; + } + } + private static ReferenceLine ImportReferenceLine(string referenceLineFilePath) { ReferenceLine importedReferenceLine = null; @@ -663,12 +703,12 @@ return importedReferenceLine; } - private void AssertSectionsAreValidForReferenceLine(FailureMechanismSection[] sections, ReferenceLine referenceLine) + private void AssertSectionsAreValidForReferenceLine(IEnumerable sections, ReferenceLine referenceLine) { Point2D[] referenceLineGeometry = referenceLine.Points.ToArray(); // 1. Start & End coherence: - Assert.AreEqual(referenceLineGeometry[0], sections[0].StartPoint, + Assert.AreEqual(referenceLineGeometry[0], sections.First().StartPoint, "Start of the sections should correspond to the Start of the reference line."); Assert.AreEqual(referenceLineGeometry.Last(), sections.Last().EndPoint, "End of the sections should correspond to the End of the reference line."); Index: Ringtoets/Common/test/Ringtoets.Common.IO.Test/Ringtoets.Common.IO.Test.csproj =================================================================== diff -u -reb0206bf27d75fbfeb403b365a4218a228f007e4 -r7135385a10443af1369b1b9e814b8b762366f64b --- Ringtoets/Common/test/Ringtoets.Common.IO.Test/Ringtoets.Common.IO.Test.csproj (.../Ringtoets.Common.IO.Test.csproj) (revision eb0206bf27d75fbfeb403b365a4218a228f007e4) +++ Ringtoets/Common/test/Ringtoets.Common.IO.Test/Ringtoets.Common.IO.Test.csproj (.../Ringtoets.Common.IO.Test.csproj) (revision 7135385a10443af1369b1b9e814b8b762366f64b) @@ -52,6 +52,7 @@ + Index: Ringtoets/Integration/src/Ringtoets.Integration.Plugin/RingtoetsPlugin.cs =================================================================== diff -u -r77f43b2f296c4b9515556f289d8b74bbb172f9cd -r7135385a10443af1369b1b9e814b8b762366f64b --- Ringtoets/Integration/src/Ringtoets.Integration.Plugin/RingtoetsPlugin.cs (.../RingtoetsPlugin.cs) (revision 77f43b2f296c4b9515556f289d8b74bbb172f9cd) +++ Ringtoets/Integration/src/Ringtoets.Integration.Plugin/RingtoetsPlugin.cs (.../RingtoetsPlugin.cs) (revision 7135385a10443af1369b1b9e814b8b762366f64b) @@ -649,7 +649,8 @@ IsEnabled = context => context.AssessmentSection.ReferenceLine != null, CreateFileImporter = (context, filePath) => new FailureMechanismSectionsImporter(context.WrappedData, context.AssessmentSection.ReferenceLine, - filePath) + filePath, + new FailureMechanismSectionReplaceStrategy(context.WrappedData)) }; yield return new ImportInfo { @@ -1332,6 +1333,7 @@ .AddOpenItem() .AddSeparator() .AddImportItem() + .AddUpdateItem() .AddSeparator() .AddPropertiesItem() .Build(); Index: Ringtoets/Integration/test/Ringtoets.Integration.TestUtil/DataImportHelper.cs =================================================================== diff -u -ra90ecfec7dc128234360d4a55ee646928c133b75 -r7135385a10443af1369b1b9e814b8b762366f64b --- Ringtoets/Integration/test/Ringtoets.Integration.TestUtil/DataImportHelper.cs (.../DataImportHelper.cs) (revision a90ecfec7dc128234360d4a55ee646928c133b75) +++ Ringtoets/Integration/test/Ringtoets.Integration.TestUtil/DataImportHelper.cs (.../DataImportHelper.cs) (revision 7135385a10443af1369b1b9e814b8b762366f64b) @@ -103,7 +103,10 @@ "traject_6-3_vakken.shx")) { string filePath = Path.Combine(embeddedResourceFileWriter.TargetFolderPath, "traject_6-3_vakken.shp"); - var activity = new FileImportActivity(new FailureMechanismSectionsImporter(failureMechanism, assessmentSection.ReferenceLine, filePath), + var activity = new FileImportActivity(new FailureMechanismSectionsImporter(failureMechanism, + assessmentSection.ReferenceLine, + filePath, + new FailureMechanismSectionReplaceStrategy(failureMechanism)), "FailureMechanismSectionsImporter"); activity.Run(); activity.Finish(); @@ -132,19 +135,21 @@ IFailureMechanism[] failureMechanisms = targetFailureMechanisms.ToArray(); for (var i = 0; i < failureMechanisms.Length; i++) { + IFailureMechanism failureMechanism = failureMechanisms[i]; if (i == 0) { string filePath = Path.Combine(embeddedResourceFileWriter.TargetFolderPath, "traject_6-3_vakken.shp"); - var importer = new FailureMechanismSectionsImporter(failureMechanisms[i], + var importer = new FailureMechanismSectionsImporter(failureMechanism, assessmentSection.ReferenceLine, - filePath); + filePath, + new FailureMechanismSectionReplaceStrategy(failureMechanism)); importer.Import(); } else { // Copy same FailureMechanismSection instances to other failure mechanisms - FailureMechanismTestHelper.SetSections(failureMechanisms[i], failureMechanisms[0].Sections.Select(DeepCloneSection).ToList()); + FailureMechanismTestHelper.SetSections(failureMechanism, failureMechanisms[0].Sections.Select(DeepCloneSection).ToList()); } } }