Index: Ringtoets/Integration/test/Ringtoets.Integration.Test/FileImporters/ForeshoreProfileUpdateDataStrategyIntegrationTest.cs
===================================================================
diff -u
--- Ringtoets/Integration/test/Ringtoets.Integration.Test/FileImporters/ForeshoreProfileUpdateDataStrategyIntegrationTest.cs (revision 0)
+++ Ringtoets/Integration/test/Ringtoets.Integration.Test/FileImporters/ForeshoreProfileUpdateDataStrategyIntegrationTest.cs (revision 73f750ed255e5084397520aa04a5c855257e7b73)
@@ -0,0 +1,628 @@
+// 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 Core.Common.Base;
+using Core.Common.Base.Data;
+using Core.Common.Base.Geometry;
+using Core.Common.TestUtil;
+using NUnit.Framework;
+using Ringtoets.ClosingStructures.Data;
+using Ringtoets.ClosingStructures.Data.TestUtil;
+using Ringtoets.Common.Data.Calculation;
+using Ringtoets.Common.Data.DikeProfiles;
+using Ringtoets.Common.Data.TestUtil;
+using Ringtoets.GrassCoverErosionOutwards.Data;
+using Ringtoets.HeightStructures.Data;
+using Ringtoets.HeightStructures.Data.TestUtil;
+using Ringtoets.Integration.Plugin.FileImporters;
+using Ringtoets.Integration.TestUtils;
+using Ringtoets.Revetment.TestUtil;
+using Ringtoets.StabilityPointStructures.Data;
+using Ringtoets.StabilityPointStructures.Data.TestUtil;
+using Ringtoets.StabilityStoneCover.Data;
+using Ringtoets.WaveImpactAsphaltCover.Data;
+
+namespace Ringtoets.Integration.Test.FileImporters
+{
+ [TestFixture]
+ public class ForeshoreProfileUpdateDataStrategyIntegrationTest
+ {
+ private const string sourceFilePath = "path/to/foreshoreProfiles";
+
+ [Test]
+ public void UpdateForeshoreProfilesWithImportedData_FullyConfiguredWaveImpactAsphaltCoverFailureMechanism_UpdatesAffectedCalculation()
+ {
+ // Setup
+ WaveImpactAsphaltCoverFailureMechanism failureMechanism =
+ TestDataGenerator.GetWaveImpactAsphaltCoverFailureMechanismWithAllCalculationConfigurations();
+
+ ForeshoreProfile profileToBeUpdated = failureMechanism.ForeshoreProfiles[0];
+ ForeshoreProfile profileToUpdateFrom = DeepCloneAndModify(profileToBeUpdated);
+ ForeshoreProfile profileToBeRemoved = failureMechanism.ForeshoreProfiles[1];
+
+ const string unaffectedProfileName = "Custom Profile";
+ const string unaffectedProfileId = "Custom ID";
+ var unaffectedProfile = new TestForeshoreProfile(unaffectedProfileName, unaffectedProfileId);
+ failureMechanism.ForeshoreProfiles.AddRange(new[]
+ {
+ unaffectedProfile
+ }, sourceFilePath);
+ var unaffectedCalculation = new WaveImpactAsphaltCoverWaveConditionsCalculation
+ {
+ InputParameters =
+ {
+ ForeshoreProfile = unaffectedProfile
+ },
+ Output = new WaveImpactAsphaltCoverWaveConditionsOutput(new[]
+ {
+ new TestWaveConditionsOutput()
+ })
+ };
+ failureMechanism.WaveConditionsCalculationGroup.Children.Add(unaffectedCalculation);
+
+ var strategy = new ForeshoreProfileUpdateDataStrategy(failureMechanism);
+
+ ICalculation[] calculationsWithUpdatedForeshoreProfile =
+ failureMechanism.Calculations
+ .Cast>()
+ .Where(calc => ReferenceEquals(((IHasForeshoreProfile) calc.InputParameters).ForeshoreProfile,
+ profileToBeUpdated))
+ .ToArray();
+
+ ICalculation[] calculationsWithUpdatedForeshoreProfileWithOutputs =
+ calculationsWithUpdatedForeshoreProfile.Where(calc => calc.HasOutput)
+ .ToArray();
+
+ ICalculation[] calculationsWithRemovedForeshoreProfile =
+ failureMechanism.Calculations
+ .Cast>()
+ .Where(calc => ReferenceEquals(((IHasForeshoreProfile) calc.InputParameters).ForeshoreProfile,
+ profileToBeRemoved))
+ .ToArray();
+
+ ICalculation[] calculationsWithRemovedForeshoreProfileWithOutputs =
+ calculationsWithRemovedForeshoreProfile.Where(calc => calc.HasOutput)
+ .ToArray();
+
+ // Call
+ IEnumerable affectedObjects =
+ strategy.UpdateForeshoreProfilesWithImportedData(failureMechanism.ForeshoreProfiles,
+ new[]
+ {
+ profileToUpdateFrom,
+ new TestForeshoreProfile(unaffectedProfileName,
+ unaffectedProfileId)
+ },
+ sourceFilePath);
+
+ // Assert
+ Assert.IsTrue(unaffectedCalculation.HasOutput);
+ Assert.AreSame(unaffectedProfile, unaffectedCalculation.InputParameters.ForeshoreProfile);
+
+ Assert.IsTrue(calculationsWithUpdatedForeshoreProfile.All(calc => !calc.HasOutput));
+ Assert.IsTrue(calculationsWithUpdatedForeshoreProfile.All(calc => ReferenceEquals(GetForeshoreProfile(calc),
+ profileToBeUpdated)));
+
+ Assert.IsTrue(calculationsWithRemovedForeshoreProfile.All(calc => !calc.HasOutput));
+ Assert.IsTrue(calculationsWithRemovedForeshoreProfile.All(calc => GetForeshoreProfile(calc) == null));
+
+ var expectedAffectedObjects = new List
+ {
+ failureMechanism.ForeshoreProfiles,
+ profileToBeUpdated
+ };
+ expectedAffectedObjects.AddRange(calculationsWithUpdatedForeshoreProfileWithOutputs);
+ expectedAffectedObjects.AddRange(calculationsWithRemovedForeshoreProfileWithOutputs);
+ expectedAffectedObjects.AddRange(calculationsWithUpdatedForeshoreProfile.Select(calc => calc.InputParameters));
+ expectedAffectedObjects.AddRange(calculationsWithRemovedForeshoreProfile.Select(calc => calc.InputParameters));
+
+ CollectionAssert.AreEquivalent(expectedAffectedObjects, affectedObjects);
+ }
+
+ [Test]
+ public void UpdateForeshoreProfilesWithImportedData_FullyConfiguredGrassCoverOutwardsFailureMechanism_UpdatesAffectedCalculation()
+ {
+ // Setup
+ GrassCoverErosionOutwardsFailureMechanism failureMechanism =
+ TestDataGenerator.GetGrassCoverErosionOutwardsFailureMechanismWithAllCalculationConfigurations();
+
+ ForeshoreProfile profileToBeUpdated = failureMechanism.ForeshoreProfiles[0];
+ ForeshoreProfile profileToUpdateFrom = DeepCloneAndModify(profileToBeUpdated);
+ ForeshoreProfile profileToBeRemoved = failureMechanism.ForeshoreProfiles[1];
+
+ const string unaffectedProfileName = "Custom Profile";
+ const string unaffectedProfileId = "Custom ID";
+ var unaffectedProfile = new TestForeshoreProfile(unaffectedProfileName, unaffectedProfileId);
+ failureMechanism.ForeshoreProfiles.AddRange(new[]
+ {
+ unaffectedProfile
+ }, sourceFilePath);
+ var unaffectedCalculation = new GrassCoverErosionOutwardsWaveConditionsCalculation
+ {
+ InputParameters =
+ {
+ ForeshoreProfile = unaffectedProfile
+ },
+ Output = new GrassCoverErosionOutwardsWaveConditionsOutput(new[]
+ {
+ new TestWaveConditionsOutput()
+ })
+ };
+ failureMechanism.WaveConditionsCalculationGroup.Children.Add(unaffectedCalculation);
+
+ var strategy = new ForeshoreProfileUpdateDataStrategy(failureMechanism);
+
+ ICalculation[] calculationsWithUpdatedForeshoreProfile =
+ failureMechanism.Calculations
+ .Cast>()
+ .Where(calc => ReferenceEquals(((IHasForeshoreProfile) calc.InputParameters).ForeshoreProfile,
+ profileToBeUpdated))
+ .ToArray();
+
+ ICalculation[] calculationsWithUpdatedForeshoreProfileWithOutputs =
+ calculationsWithUpdatedForeshoreProfile.Where(calc => calc.HasOutput)
+ .ToArray();
+
+ ICalculation[] calculationsWithRemovedForeshoreProfile =
+ failureMechanism.Calculations
+ .Cast>()
+ .Where(calc => ReferenceEquals(((IHasForeshoreProfile) calc.InputParameters).ForeshoreProfile,
+ profileToBeRemoved))
+ .ToArray();
+
+ ICalculation[] calculationsWithRemovedForeshoreProfileWithOutputs =
+ calculationsWithRemovedForeshoreProfile.Where(calc => calc.HasOutput)
+ .ToArray();
+
+ // Call
+ IEnumerable affectedObjects =
+ strategy.UpdateForeshoreProfilesWithImportedData(failureMechanism.ForeshoreProfiles,
+ new[]
+ {
+ profileToUpdateFrom,
+ new TestForeshoreProfile(unaffectedProfileName,
+ unaffectedProfileId)
+ },
+ sourceFilePath);
+
+ // Assert
+ Assert.IsTrue(unaffectedCalculation.HasOutput);
+ Assert.AreSame(unaffectedProfile, unaffectedCalculation.InputParameters.ForeshoreProfile);
+
+ Assert.IsTrue(calculationsWithUpdatedForeshoreProfile.All(calc => !calc.HasOutput));
+ Assert.IsTrue(calculationsWithUpdatedForeshoreProfile.All(calc => ReferenceEquals(GetForeshoreProfile(calc),
+ profileToBeUpdated)));
+
+ Assert.IsTrue(calculationsWithRemovedForeshoreProfile.All(calc => !calc.HasOutput));
+ Assert.IsTrue(calculationsWithRemovedForeshoreProfile.All(calc => GetForeshoreProfile(calc) == null));
+
+ var expectedAffectedObjects = new List
+ {
+ failureMechanism.ForeshoreProfiles,
+ profileToBeUpdated
+ };
+ expectedAffectedObjects.AddRange(calculationsWithUpdatedForeshoreProfileWithOutputs);
+ expectedAffectedObjects.AddRange(calculationsWithRemovedForeshoreProfileWithOutputs);
+ expectedAffectedObjects.AddRange(calculationsWithUpdatedForeshoreProfile.Select(calc => calc.InputParameters));
+ expectedAffectedObjects.AddRange(calculationsWithRemovedForeshoreProfile.Select(calc => calc.InputParameters));
+
+ CollectionAssert.AreEquivalent(expectedAffectedObjects, affectedObjects);
+ }
+
+ [Test]
+ public void UpdateForeshoreProfilesWithImportedData_FullyConfiguredStabilityStoneCoverFailureMechanism_UpdatesAffectedCalculation()
+ {
+ // Setup
+ StabilityStoneCoverFailureMechanism failureMechanism =
+ TestDataGenerator.GetStabilityStoneCoverFailureMechanismWithAllCalculationConfigurations();
+
+ ForeshoreProfile profileToBeUpdated = failureMechanism.ForeshoreProfiles[0];
+ ForeshoreProfile profileToUpdateFrom = DeepCloneAndModify(profileToBeUpdated);
+ ForeshoreProfile profileToBeRemoved = failureMechanism.ForeshoreProfiles[1];
+
+ const string unaffectedProfileName = "Custom Profile";
+ const string unaffectedProfileId = "Custom ID";
+ var unaffectedProfile = new TestForeshoreProfile(unaffectedProfileName, unaffectedProfileId);
+ failureMechanism.ForeshoreProfiles.AddRange(new[]
+ {
+ unaffectedProfile
+ }, sourceFilePath);
+ var unaffectedCalculation = new StabilityStoneCoverWaveConditionsCalculation
+ {
+ InputParameters =
+ {
+ ForeshoreProfile = unaffectedProfile
+ },
+ Output = new StabilityStoneCoverWaveConditionsOutput(new[]
+ {
+ new TestWaveConditionsOutput()
+ }, new[]
+ {
+ new TestWaveConditionsOutput()
+ })
+ };
+ failureMechanism.WaveConditionsCalculationGroup.Children.Add(unaffectedCalculation);
+
+ var strategy = new ForeshoreProfileUpdateDataStrategy(failureMechanism);
+
+ ICalculation[] calculationsWithUpdatedForeshoreProfile =
+ failureMechanism.Calculations
+ .Cast>()
+ .Where(calc => ReferenceEquals(((IHasForeshoreProfile) calc.InputParameters).ForeshoreProfile,
+ profileToBeUpdated))
+ .ToArray();
+
+ ICalculation[] calculationsWithUpdatedForeshoreProfileWithOutputs =
+ calculationsWithUpdatedForeshoreProfile.Where(calc => calc.HasOutput)
+ .ToArray();
+
+ ICalculation[] calculationsWithRemovedForeshoreProfile =
+ failureMechanism.Calculations
+ .Cast>()
+ .Where(calc => ReferenceEquals(((IHasForeshoreProfile) calc.InputParameters).ForeshoreProfile,
+ profileToBeRemoved))
+ .ToArray();
+
+ ICalculation[] calculationsWithRemovedForeshoreProfileWithOutputs =
+ calculationsWithRemovedForeshoreProfile.Where(calc => calc.HasOutput)
+ .ToArray();
+
+ // Call
+ IEnumerable affectedObjects =
+ strategy.UpdateForeshoreProfilesWithImportedData(failureMechanism.ForeshoreProfiles,
+ new[]
+ {
+ profileToUpdateFrom,
+ new TestForeshoreProfile(unaffectedProfileName,
+ unaffectedProfileId)
+ },
+ sourceFilePath);
+
+ // Assert
+ Assert.IsTrue(unaffectedCalculation.HasOutput);
+ Assert.AreSame(unaffectedProfile, unaffectedCalculation.InputParameters.ForeshoreProfile);
+
+ Assert.IsTrue(calculationsWithUpdatedForeshoreProfile.All(calc => !calc.HasOutput));
+ Assert.IsTrue(calculationsWithUpdatedForeshoreProfile.All(calc => ReferenceEquals(GetForeshoreProfile(calc),
+ profileToBeUpdated)));
+
+ Assert.IsTrue(calculationsWithRemovedForeshoreProfile.All(calc => !calc.HasOutput));
+ Assert.IsTrue(calculationsWithRemovedForeshoreProfile.All(calc => GetForeshoreProfile(calc) == null));
+
+ var expectedAffectedObjects = new List
+ {
+ failureMechanism.ForeshoreProfiles,
+ profileToBeUpdated
+ };
+ expectedAffectedObjects.AddRange(calculationsWithUpdatedForeshoreProfileWithOutputs);
+ expectedAffectedObjects.AddRange(calculationsWithRemovedForeshoreProfileWithOutputs);
+ expectedAffectedObjects.AddRange(calculationsWithUpdatedForeshoreProfile.Select(calc => calc.InputParameters));
+ expectedAffectedObjects.AddRange(calculationsWithRemovedForeshoreProfile.Select(calc => calc.InputParameters));
+
+ CollectionAssert.AreEquivalent(expectedAffectedObjects, affectedObjects);
+ }
+
+ [Test]
+ public void UpdateForeshoreProfilesWithImportedData_FullyConfiguredHeightStructuresFailureMechanism_UpdatesAffectedCalculation()
+ {
+ // Setup
+ HeightStructuresFailureMechanism failureMechanism =
+ TestDataGenerator.GetHeightStructuresFailureMechanismWithAlLCalculationConfigurations();
+
+ ForeshoreProfile profileToBeUpdated = failureMechanism.ForeshoreProfiles[0];
+ ForeshoreProfile profileToUpdateFrom = DeepCloneAndModify(profileToBeUpdated);
+ ForeshoreProfile profileToBeRemoved = failureMechanism.ForeshoreProfiles[1];
+
+ const string unaffectedProfileName = "Custom Profile";
+ const string unaffectedProfileId = "Custom ID";
+ var unaffectedProfile = new TestForeshoreProfile(unaffectedProfileName, unaffectedProfileId);
+ failureMechanism.ForeshoreProfiles.AddRange(new[]
+ {
+ unaffectedProfile
+ }, sourceFilePath);
+ var unaffectedCalculation = new TestHeightStructuresCalculation
+ {
+ InputParameters =
+ {
+ ForeshoreProfile = unaffectedProfile
+ },
+ Output = new TestStructuresOutput()
+ };
+ failureMechanism.CalculationsGroup.Children.Add(unaffectedCalculation);
+
+ var strategy = new ForeshoreProfileUpdateDataStrategy(failureMechanism);
+
+ ICalculation[] calculationsWithUpdatedForeshoreProfile =
+ failureMechanism.Calculations
+ .Cast>()
+ .Where(calc => ReferenceEquals(((IHasForeshoreProfile) calc.InputParameters).ForeshoreProfile,
+ profileToBeUpdated))
+ .ToArray();
+
+ ICalculation[] calculationsWithUpdatedForeshoreProfileWithOutputs =
+ calculationsWithUpdatedForeshoreProfile.Where(calc => calc.HasOutput)
+ .ToArray();
+
+ ICalculation[] calculationsWithRemovedForeshoreProfile =
+ failureMechanism.Calculations
+ .Cast>()
+ .Where(calc => ReferenceEquals(((IHasForeshoreProfile) calc.InputParameters).ForeshoreProfile,
+ profileToBeRemoved))
+ .ToArray();
+
+ ICalculation[] calculationsWithRemovedForeshoreProfileWithOutputs =
+ calculationsWithRemovedForeshoreProfile.Where(calc => calc.HasOutput)
+ .ToArray();
+
+ // Call
+ IEnumerable affectedObjects =
+ strategy.UpdateForeshoreProfilesWithImportedData(failureMechanism.ForeshoreProfiles,
+ new[]
+ {
+ profileToUpdateFrom,
+ new TestForeshoreProfile(unaffectedProfileName,
+ unaffectedProfileId)
+ },
+ sourceFilePath);
+
+ // Assert
+ Assert.IsTrue(unaffectedCalculation.HasOutput);
+ Assert.AreSame(unaffectedProfile, unaffectedCalculation.InputParameters.ForeshoreProfile);
+
+ Assert.IsTrue(calculationsWithUpdatedForeshoreProfile.All(calc => !calc.HasOutput));
+ Assert.IsTrue(calculationsWithUpdatedForeshoreProfile.All(calc => ReferenceEquals(GetForeshoreProfile(calc),
+ profileToBeUpdated)));
+
+ Assert.IsTrue(calculationsWithRemovedForeshoreProfile.All(calc => !calc.HasOutput));
+ Assert.IsTrue(calculationsWithRemovedForeshoreProfile.All(calc => GetForeshoreProfile(calc) == null));
+
+ var expectedAffectedObjects = new List
+ {
+ failureMechanism.ForeshoreProfiles,
+ profileToBeUpdated
+ };
+ expectedAffectedObjects.AddRange(calculationsWithUpdatedForeshoreProfileWithOutputs);
+ expectedAffectedObjects.AddRange(calculationsWithRemovedForeshoreProfileWithOutputs);
+ expectedAffectedObjects.AddRange(calculationsWithUpdatedForeshoreProfile.Select(calc => calc.InputParameters));
+ expectedAffectedObjects.AddRange(calculationsWithRemovedForeshoreProfile.Select(calc => calc.InputParameters));
+
+ CollectionAssert.AreEquivalent(expectedAffectedObjects, affectedObjects);
+ }
+
+ [Test]
+ public void UpdateForeshoreProfilesWithImportedData_FullyConfiguredStabilityPointStructuresFailureMechanism_UpdatesAffectedCalculation()
+ {
+ // Setup
+ StabilityPointStructuresFailureMechanism failureMechanism =
+ TestDataGenerator.GetStabilityPointStructuresFailureMechanismWithAllCalculationConfigurations();
+
+ ForeshoreProfile profileToBeUpdated = failureMechanism.ForeshoreProfiles[0];
+ ForeshoreProfile profileToUpdateFrom = DeepCloneAndModify(profileToBeUpdated);
+ ForeshoreProfile profileToBeRemoved = failureMechanism.ForeshoreProfiles[1];
+
+ const string unaffectedProfileName = "Custom Profile";
+ const string unaffectedProfileId = "Custom ID";
+ var unaffectedProfile = new TestForeshoreProfile(unaffectedProfileName, unaffectedProfileId);
+ failureMechanism.ForeshoreProfiles.AddRange(new[]
+ {
+ unaffectedProfile
+ }, sourceFilePath);
+ var unaffectedCalculation = new TestStabilityPointStructuresCalculation
+ {
+ InputParameters =
+ {
+ ForeshoreProfile = unaffectedProfile
+ },
+ Output = new TestStructuresOutput()
+ };
+ failureMechanism.CalculationsGroup.Children.Add(unaffectedCalculation);
+
+ var strategy = new ForeshoreProfileUpdateDataStrategy(failureMechanism);
+
+ ICalculation[] calculationsWithUpdatedForeshoreProfile =
+ failureMechanism.Calculations
+ .Cast>()
+ .Where(calc => ReferenceEquals(((IHasForeshoreProfile) calc.InputParameters).ForeshoreProfile,
+ profileToBeUpdated))
+ .ToArray();
+
+ ICalculation[] calculationsWithUpdatedForeshoreProfileWithOutputs =
+ calculationsWithUpdatedForeshoreProfile.Where(calc => calc.HasOutput)
+ .ToArray();
+
+ ICalculation[] calculationsWithRemovedForeshoreProfile =
+ failureMechanism.Calculations
+ .Cast>()
+ .Where(calc => ReferenceEquals(((IHasForeshoreProfile) calc.InputParameters).ForeshoreProfile,
+ profileToBeRemoved))
+ .ToArray();
+
+ ICalculation[] calculationsWithRemovedForeshoreProfileWithOutputs =
+ calculationsWithRemovedForeshoreProfile.Where(calc => calc.HasOutput)
+ .ToArray();
+
+ // Call
+ IEnumerable affectedObjects =
+ strategy.UpdateForeshoreProfilesWithImportedData(failureMechanism.ForeshoreProfiles,
+ new[]
+ {
+ profileToUpdateFrom,
+ new TestForeshoreProfile(unaffectedProfileName,
+ unaffectedProfileId)
+ },
+ sourceFilePath);
+
+ // Assert
+ Assert.IsTrue(unaffectedCalculation.HasOutput);
+ Assert.AreSame(unaffectedProfile, unaffectedCalculation.InputParameters.ForeshoreProfile);
+
+ Assert.IsTrue(calculationsWithUpdatedForeshoreProfile.All(calc => !calc.HasOutput));
+ Assert.IsTrue(calculationsWithUpdatedForeshoreProfile.All(calc => ReferenceEquals(GetForeshoreProfile(calc),
+ profileToBeUpdated)));
+
+ Assert.IsTrue(calculationsWithRemovedForeshoreProfile.All(calc => !calc.HasOutput));
+ Assert.IsTrue(calculationsWithRemovedForeshoreProfile.All(calc => GetForeshoreProfile(calc) == null));
+
+ var expectedAffectedObjects = new List
+ {
+ failureMechanism.ForeshoreProfiles,
+ profileToBeUpdated
+ };
+ expectedAffectedObjects.AddRange(calculationsWithUpdatedForeshoreProfileWithOutputs);
+ expectedAffectedObjects.AddRange(calculationsWithRemovedForeshoreProfileWithOutputs);
+ expectedAffectedObjects.AddRange(calculationsWithUpdatedForeshoreProfile.Select(calc => calc.InputParameters));
+ expectedAffectedObjects.AddRange(calculationsWithRemovedForeshoreProfile.Select(calc => calc.InputParameters));
+
+ CollectionAssert.AreEquivalent(expectedAffectedObjects, affectedObjects);
+ }
+
+ [Test]
+ public void UpdateForeshoreProfilesWithImportedData_FullyConfiguredClosingStructuresFailureMechanism_UpdatesAffectedCalculation()
+ {
+ // Setup
+ ClosingStructuresFailureMechanism failureMechanism =
+ TestDataGenerator.GetClosingStructuresFailureMechanismWithAllCalculationConfigurations();
+
+ ForeshoreProfile profileToBeUpdated = failureMechanism.ForeshoreProfiles[0];
+ ForeshoreProfile profileToUpdateFrom = DeepCloneAndModify(profileToBeUpdated);
+ ForeshoreProfile profileToBeRemoved = failureMechanism.ForeshoreProfiles[1];
+
+ const string unaffectedProfileName = "Custom Profile";
+ const string unaffectedProfileId = "Custom ID";
+ var unaffectedProfile = new TestForeshoreProfile(unaffectedProfileName, unaffectedProfileId);
+ failureMechanism.ForeshoreProfiles.AddRange(new[]
+ {
+ unaffectedProfile
+ }, sourceFilePath);
+ var unaffectedCalculation = new TestClosingStructuresCalculation
+ {
+ InputParameters =
+ {
+ ForeshoreProfile = unaffectedProfile
+ },
+ Output = new TestStructuresOutput()
+ };
+ failureMechanism.CalculationsGroup.Children.Add(unaffectedCalculation);
+
+ var strategy = new ForeshoreProfileUpdateDataStrategy(failureMechanism);
+
+ ICalculation[] calculationsWithUpdatedForeshoreProfile =
+ failureMechanism.Calculations
+ .Cast>()
+ .Where(calc => ReferenceEquals(((IHasForeshoreProfile) calc.InputParameters).ForeshoreProfile,
+ profileToBeUpdated))
+ .ToArray();
+
+ ICalculation[] calculationsWithUpdatedForeshoreProfileWithOutputs =
+ calculationsWithUpdatedForeshoreProfile.Where(calc => calc.HasOutput)
+ .ToArray();
+
+ ICalculation[] calculationsWithRemovedForeshoreProfile =
+ failureMechanism.Calculations
+ .Cast>()
+ .Where(calc => ReferenceEquals(((IHasForeshoreProfile) calc.InputParameters).ForeshoreProfile,
+ profileToBeRemoved))
+ .ToArray();
+
+ ICalculation[] calculationsWithRemovedForeshoreProfileWithOutputs =
+ calculationsWithRemovedForeshoreProfile.Where(calc => calc.HasOutput)
+ .ToArray();
+
+ // Call
+ IEnumerable affectedObjects =
+ strategy.UpdateForeshoreProfilesWithImportedData(failureMechanism.ForeshoreProfiles,
+ new[]
+ {
+ profileToUpdateFrom,
+ new TestForeshoreProfile(unaffectedProfileName,
+ unaffectedProfileId)
+ },
+ sourceFilePath);
+
+ // Assert
+ Assert.IsTrue(unaffectedCalculation.HasOutput);
+ Assert.AreSame(unaffectedProfile, unaffectedCalculation.InputParameters.ForeshoreProfile);
+
+ Assert.IsTrue(calculationsWithUpdatedForeshoreProfile.All(calc => !calc.HasOutput));
+ Assert.IsTrue(calculationsWithUpdatedForeshoreProfile.All(calc => ReferenceEquals(GetForeshoreProfile(calc),
+ profileToBeUpdated)));
+
+ Assert.IsTrue(calculationsWithRemovedForeshoreProfile.All(calc => !calc.HasOutput));
+ Assert.IsTrue(calculationsWithRemovedForeshoreProfile.All(calc => GetForeshoreProfile(calc) == null));
+
+ var expectedAffectedObjects = new List
+ {
+ failureMechanism.ForeshoreProfiles,
+ profileToBeUpdated
+ };
+ expectedAffectedObjects.AddRange(calculationsWithUpdatedForeshoreProfileWithOutputs);
+ expectedAffectedObjects.AddRange(calculationsWithRemovedForeshoreProfileWithOutputs);
+ expectedAffectedObjects.AddRange(calculationsWithUpdatedForeshoreProfile.Select(calc => calc.InputParameters));
+ expectedAffectedObjects.AddRange(calculationsWithRemovedForeshoreProfile.Select(calc => calc.InputParameters));
+
+ CollectionAssert.AreEquivalent(expectedAffectedObjects, affectedObjects);
+ }
+
+ private static ForeshoreProfile GetForeshoreProfile(ICalculation calc)
+ {
+ return ((IHasForeshoreProfile) calc.InputParameters).ForeshoreProfile;
+ }
+
+ ///
+ /// Makes a deep clone of the foreshore profile and modifies all the properties,
+ /// except the .
+ ///
+ /// The foreshore profile to deep clone.
+ /// A deep clone of the .
+ private static ForeshoreProfile DeepCloneAndModify(ForeshoreProfile foreshoreProfile)
+ {
+ var random = new Random(21);
+
+ Point2D originalWorldCoordinate = foreshoreProfile.WorldReferencePoint;
+ var modifiedWorldCoordinate = new Point2D(originalWorldCoordinate.X + random.NextDouble(),
+ originalWorldCoordinate.Y + random.NextDouble());
+
+ List modifiedForeshoreGeometry = foreshoreProfile.Geometry.ToList();
+ modifiedForeshoreGeometry.Add(new Point2D(1, 2));
+
+ RoundedDouble originalBreakWaterHeight = foreshoreProfile.BreakWater?.Height ?? (RoundedDouble) 0.0;
+ var modifiedBreakWater = new BreakWater(random.NextEnumValue(),
+ originalBreakWaterHeight + random.NextDouble());
+
+ string modifiedName = $"new_name_{foreshoreProfile.Name}";
+ double modifiedOrientation = foreshoreProfile.Orientation + random.NextDouble();
+ double modifiedX0 = foreshoreProfile.X0 + random.NextDouble();
+
+ return new ForeshoreProfile(modifiedWorldCoordinate, modifiedForeshoreGeometry,
+ modifiedBreakWater,
+ new ForeshoreProfile.ConstructionProperties
+ {
+ Name = modifiedName,
+ Id = foreshoreProfile.Id,
+ Orientation = modifiedOrientation,
+ X0 = modifiedX0
+ });
+ }
+ }
+}
\ No newline at end of file
Index: Ringtoets/Integration/test/Ringtoets.Integration.Test/Ringtoets.Integration.Test.csproj
===================================================================
diff -u -r9b0af3f940ae57b373ab4edfd7da944090255fde -r73f750ed255e5084397520aa04a5c855257e7b73
--- Ringtoets/Integration/test/Ringtoets.Integration.Test/Ringtoets.Integration.Test.csproj (.../Ringtoets.Integration.Test.csproj) (revision 9b0af3f940ae57b373ab4edfd7da944090255fde)
+++ Ringtoets/Integration/test/Ringtoets.Integration.Test/Ringtoets.Integration.Test.csproj (.../Ringtoets.Integration.Test.csproj) (revision 73f750ed255e5084397520aa04a5c855257e7b73)
@@ -60,6 +60,7 @@
Properties\GlobalAssembly.cs
+