Index: Ringtoets/Integration/src/Ringtoets.Integration.Plugin/Merge/AssessmentSectionMergeHandler.cs =================================================================== diff -u -r7b95be6337f556bb904b20d02536b34d77cd0bc2 -rbbc8a9be41850f8de8086c8bdda711f52a6767e9 --- Ringtoets/Integration/src/Ringtoets.Integration.Plugin/Merge/AssessmentSectionMergeHandler.cs (.../AssessmentSectionMergeHandler.cs) (revision 7b95be6337f556bb904b20d02536b34d77cd0bc2) +++ Ringtoets/Integration/src/Ringtoets.Integration.Plugin/Merge/AssessmentSectionMergeHandler.cs (.../AssessmentSectionMergeHandler.cs) (revision bbc8a9be41850f8de8086c8bdda711f52a6767e9) @@ -22,18 +22,23 @@ using System; using System.Collections.Generic; using System.Linq; +using Core.Common.Base; using Core.Common.Gui.Commands; using log4net; using Ringtoets.ClosingStructures.Data; +using Ringtoets.Common.Data.Calculation; using Ringtoets.Common.Data.FailureMechanism; using Ringtoets.Common.Data.Hydraulics; +using Ringtoets.Common.Data.Structures; using Ringtoets.GrassCoverErosionInwards.Data; using Ringtoets.HeightStructures.Data; +using Ringtoets.HydraRing.Calculation.Data.Input.WaveConditions; using Ringtoets.Integration.Data; using Ringtoets.Integration.Data.StandAlone; using Ringtoets.Integration.Plugin.Properties; using Ringtoets.MacroStabilityInwards.Data; using Ringtoets.Piping.Data; +using Ringtoets.Revetment.Data; using Ringtoets.StabilityPointStructures.Data; using Ringtoets.StabilityStoneCover.Data; using Ringtoets.WaveImpactAsphaltCover.Data; @@ -160,28 +165,35 @@ #region FailureMechanisms - private void MergeFailureMechanisms(AssessmentSection targetAssessmentSection, IEnumerable failureMechanismsToMerge) + private static void MergeFailureMechanisms(AssessmentSection targetAssessmentSection, IEnumerable failureMechanismsToMerge) { + ObservableList hydraulicBoundaryLocations = targetAssessmentSection.HydraulicBoundaryDatabase.Locations; foreach (IFailureMechanism failureMechanism in failureMechanismsToMerge) { if (TryMergeFailureMechanism( targetAssessmentSection, failureMechanism, (section, mechanism) => section.Piping = mechanism)) { + UpdateHydraulicBoundaryLocationReferences( + targetAssessmentSection.Piping, hydraulicBoundaryLocations); continue; } if (TryMergeFailureMechanism( targetAssessmentSection, failureMechanism, (section, mechanism) => section.GrassCoverErosionInwards = mechanism)) { + UpdateHydraulicBoundaryLocationReferences( + targetAssessmentSection.GrassCoverErosionInwards, hydraulicBoundaryLocations); continue; } if (TryMergeFailureMechanism( targetAssessmentSection, failureMechanism, (section, mechanism) => section.MacroStabilityInwards = mechanism)) { + UpdateHydraulicBoundaryLocationReferences( + targetAssessmentSection.MacroStabilityInwards, hydraulicBoundaryLocations); continue; } @@ -203,13 +215,17 @@ targetAssessmentSection, failureMechanism, (section, mechanism) => section.StabilityStoneCover = mechanism)) { + UpdateHydraulicBoundaryLocationReferences( + targetAssessmentSection.StabilityStoneCover, hydraulicBoundaryLocations); continue; } if (TryMergeFailureMechanism( targetAssessmentSection, failureMechanism, (section, mechanism) => section.WaveImpactAsphaltCover = mechanism)) { + UpdateHydraulicBoundaryLocationReferences( + targetAssessmentSection.WaveImpactAsphaltCover, hydraulicBoundaryLocations); continue; } @@ -238,13 +254,17 @@ targetAssessmentSection, failureMechanism, (section, mechanism) => section.HeightStructures = mechanism)) { + UpdateHydraulicBoundaryLocationReferences, HeightStructuresInput>( + targetAssessmentSection.HeightStructures, hydraulicBoundaryLocations); continue; } if (TryMergeFailureMechanism( targetAssessmentSection, failureMechanism, (section, mechanism) => section.ClosingStructures = mechanism)) { + UpdateHydraulicBoundaryLocationReferences, ClosingStructuresInput>( + targetAssessmentSection.ClosingStructures, hydraulicBoundaryLocations); continue; } @@ -259,6 +279,8 @@ targetAssessmentSection, failureMechanism, (section, mechanism) => section.StabilityPointStructures = mechanism)) { + UpdateHydraulicBoundaryLocationReferences, StabilityPointStructuresInput>( + targetAssessmentSection.StabilityPointStructures, hydraulicBoundaryLocations); continue; } @@ -290,6 +312,27 @@ return false; } + private static void UpdateHydraulicBoundaryLocationReferences( + TFailureMechanism failureMechanism, IEnumerable locations) + where TFailureMechanism : IFailureMechanism + where TCalculation : ICalculation + where TCalculationInput : class, ICalculationInputWithLocation + { + foreach (TCalculation calculation in failureMechanism.Calculations.Cast()) + { + if (calculation.InputParameters.HydraulicBoundaryLocation != null) + { + calculation.InputParameters.HydraulicBoundaryLocation = GetHydraulicBoundaryLocation(calculation.InputParameters.HydraulicBoundaryLocation, + locations); + } + } + } + + private static HydraulicBoundaryLocation GetHydraulicBoundaryLocation(HydraulicBoundaryLocation location, IEnumerable locations) + { + return locations.Single(l => l.Name == location.Name && l.Id == location.Id && l.Location.Equals(location.Location)); + } + #endregion } } \ No newline at end of file Index: Ringtoets/Integration/src/Ringtoets.Integration.Plugin/Ringtoets.Integration.Plugin.csproj =================================================================== diff -u -r5825ffb616a18ec620e3544a8cd3583d9673c376 -rbbc8a9be41850f8de8086c8bdda711f52a6767e9 --- Ringtoets/Integration/src/Ringtoets.Integration.Plugin/Ringtoets.Integration.Plugin.csproj (.../Ringtoets.Integration.Plugin.csproj) (revision 5825ffb616a18ec620e3544a8cd3583d9673c376) +++ Ringtoets/Integration/src/Ringtoets.Integration.Plugin/Ringtoets.Integration.Plugin.csproj (.../Ringtoets.Integration.Plugin.csproj) (revision bbc8a9be41850f8de8086c8bdda711f52a6767e9) @@ -138,6 +138,16 @@ Ringtoets.MacroStabilityInwards.Forms False + + {e9b39743-2dc9-4922-9e0f-6ba3e0e54189} + Ringtoets.MacroStabilityInwards.Primitives + False + + + {87C2C553-C0BC-40BF-B1EA-B83BFF357F27} + Ringtoets.Revetment.Data + False + {3D4B9740-8348-4434-8D77-B611FC6EE57F} Ringtoets.StabilityPointStructures.Data Index: Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/Merge/AssessmentSectionMergeHandlerTest.cs =================================================================== diff -u -r7b95be6337f556bb904b20d02536b34d77cd0bc2 -rbbc8a9be41850f8de8086c8bdda711f52a6767e9 --- Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/Merge/AssessmentSectionMergeHandlerTest.cs (.../AssessmentSectionMergeHandlerTest.cs) (revision 7b95be6337f556bb904b20d02536b34d77cd0bc2) +++ Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/Merge/AssessmentSectionMergeHandlerTest.cs (.../AssessmentSectionMergeHandlerTest.cs) (revision bbc8a9be41850f8de8086c8bdda711f52a6767e9) @@ -28,13 +28,22 @@ using Core.Common.Util.Extensions; using NUnit.Framework; using Rhino.Mocks; +using Ringtoets.ClosingStructures.Data; using Ringtoets.Common.Data.AssessmentSection; using Ringtoets.Common.Data.FailureMechanism; using Ringtoets.Common.Data.Hydraulics; +using Ringtoets.Common.Data.Structures; using Ringtoets.Common.Data.TestUtil; using Ringtoets.Common.Data.TestUtil.IllustrationPoints; +using Ringtoets.GrassCoverErosionInwards.Data; +using Ringtoets.HeightStructures.Data; using Ringtoets.Integration.Data; using Ringtoets.Integration.Plugin.Merge; +using Ringtoets.MacroStabilityInwards.Data; +using Ringtoets.Piping.Data; +using Ringtoets.StabilityPointStructures.Data; +using Ringtoets.StabilityStoneCover.Data; +using Ringtoets.WaveImpactAsphaltCover.Data; namespace Ringtoets.Integration.Plugin.Test.Merge { @@ -285,8 +294,128 @@ }); } - private static AssessmentSection CreateAssessmentSection(TestHydraulicBoundaryLocation[] locations) + [Test] + public void GivenFailureMechanismWithWithCalculations_WhenCalculationHasReferenceToHydraulicBoundaryLocation_ThenReferenceUpdated() { + // Given + var mocks = new MockRepository(); + var viewCommands = mocks.Stub(); + mocks.ReplayAll(); + + var handler = new AssessmentSectionMergeHandler(viewCommands); + + var targetLocations = new[] + { + new HydraulicBoundaryLocation(1, "location 1", 1, 1), + new HydraulicBoundaryLocation(2, "location 2", 2, 2) + }; + + var sourceLocations = new[] + { + new HydraulicBoundaryLocation(1, "location 1", 1, 1), + new HydraulicBoundaryLocation(2, "location 2", 2, 2) + }; + + AssessmentSection targetAssessmentSection = CreateAssessmentSection(targetLocations); + AssessmentSection sourceAssessmentSection = CreateAssessmentSection(sourceLocations); + sourceAssessmentSection.Piping.CalculationsGroup.Children.Add(new PipingCalculationScenario(new GeneralPipingInput()) + { + InputParameters = + { + HydraulicBoundaryLocation = sourceLocations[0] + } + }); + sourceAssessmentSection.GrassCoverErosionInwards.CalculationsGroup.Children.Add(new GrassCoverErosionInwardsCalculation + { + InputParameters = + { + HydraulicBoundaryLocation = sourceLocations[1] + } + }); + sourceAssessmentSection.MacroStabilityInwards.CalculationsGroup.Children.Add(new MacroStabilityInwardsCalculationScenario + { + InputParameters = + { + HydraulicBoundaryLocation = sourceLocations[0] + } + }); + sourceAssessmentSection.HeightStructures.CalculationsGroup.Children.Add(new StructuresCalculation + { + InputParameters = + { + HydraulicBoundaryLocation = sourceLocations[1] + } + }); + sourceAssessmentSection.ClosingStructures.CalculationsGroup.Children.Add(new StructuresCalculation + { + InputParameters = + { + HydraulicBoundaryLocation = sourceLocations[0] + } + }); + sourceAssessmentSection.StabilityPointStructures.CalculationsGroup.Children.Add(new StructuresCalculation + { + InputParameters = + { + HydraulicBoundaryLocation = sourceLocations[1] + } + }); + sourceAssessmentSection.StabilityStoneCover.WaveConditionsCalculationGroup.Children.Add(new StabilityStoneCoverWaveConditionsCalculation + { + InputParameters = + { + HydraulicBoundaryLocation = sourceLocations[0] + } + }); + sourceAssessmentSection.WaveImpactAsphaltCover.WaveConditionsCalculationGroup.Children.Add(new WaveImpactAsphaltCoverWaveConditionsCalculation + { + InputParameters = + { + HydraulicBoundaryLocation = sourceLocations[1] + } + }); + + // When + handler.PerformMerge(targetAssessmentSection, sourceAssessmentSection, new IFailureMechanism[] + { + sourceAssessmentSection.Piping, + sourceAssessmentSection.GrassCoverErosionInwards, + sourceAssessmentSection.MacroStabilityInwards, + sourceAssessmentSection.HeightStructures, + sourceAssessmentSection.ClosingStructures, + sourceAssessmentSection.StabilityPointStructures, + sourceAssessmentSection.StabilityStoneCover, + sourceAssessmentSection.WaveImpactAsphaltCover + }); + + // Then + var pipingCalculation = (PipingCalculationScenario) targetAssessmentSection.Piping.Calculations.Single(); + Assert.AreSame(targetLocations[0], pipingCalculation.InputParameters.HydraulicBoundaryLocation); + + var grassInwardsCalculation = (GrassCoverErosionInwardsCalculation) targetAssessmentSection.GrassCoverErosionInwards.Calculations.Single(); + Assert.AreSame(targetLocations[1], grassInwardsCalculation.InputParameters.HydraulicBoundaryLocation); + + var macroStabilityInwardsCalculation = (MacroStabilityInwardsCalculation) targetAssessmentSection.MacroStabilityInwards.Calculations.Single(); + Assert.AreSame(targetLocations[0], macroStabilityInwardsCalculation.InputParameters.HydraulicBoundaryLocation); + + var heightStructuresCalculation = (StructuresCalculation) targetAssessmentSection.HeightStructures.Calculations.Single(); + Assert.AreSame(targetLocations[1], heightStructuresCalculation.InputParameters.HydraulicBoundaryLocation); + + var closingStructuresCalculation = (StructuresCalculation) targetAssessmentSection.ClosingStructures.Calculations.Single(); + Assert.AreSame(targetLocations[0], closingStructuresCalculation.InputParameters.HydraulicBoundaryLocation); + + var stabilityPointStructuresCalculation = (StructuresCalculation) targetAssessmentSection.StabilityPointStructures.Calculations.Single(); + Assert.AreSame(targetLocations[1], stabilityPointStructuresCalculation.InputParameters.HydraulicBoundaryLocation); + + var stabilityStoneCoverCalculation = (StabilityStoneCoverWaveConditionsCalculation) targetAssessmentSection.StabilityStoneCover.Calculations.Single(); + Assert.AreSame(targetLocations[0], stabilityStoneCoverCalculation.InputParameters.HydraulicBoundaryLocation); + + var waveImpactAsphatlCoverCalculation = (WaveImpactAsphaltCoverWaveConditionsCalculation) targetAssessmentSection.WaveImpactAsphaltCover.Calculations.Single(); + Assert.AreSame(targetLocations[1], waveImpactAsphatlCoverCalculation.InputParameters.HydraulicBoundaryLocation); + } + + private static AssessmentSection CreateAssessmentSection(HydraulicBoundaryLocation[] locations) + { var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike); assessmentSection.HydraulicBoundaryDatabase.Locations.AddRange(locations); assessmentSection.SetHydraulicBoundaryLocationCalculations(locations);