Index: Riskeer/Integration/src/Riskeer.Integration.Plugin/Merge/AssessmentSectionMergeHandler.cs =================================================================== diff -u -r6bb3c5039c95b9056e5ec7c293a5b3f31eddf986 -r95ef54e2348b92a2b9c0c7d0737e2508f8fc3ac4 --- Riskeer/Integration/src/Riskeer.Integration.Plugin/Merge/AssessmentSectionMergeHandler.cs (.../AssessmentSectionMergeHandler.cs) (revision 6bb3c5039c95b9056e5ec7c293a5b3f31eddf986) +++ Riskeer/Integration/src/Riskeer.Integration.Plugin/Merge/AssessmentSectionMergeHandler.cs (.../AssessmentSectionMergeHandler.cs) (revision 95ef54e2348b92a2b9c0c7d0737e2508f8fc3ac4) @@ -95,7 +95,6 @@ sourceAssessmentSection.WaterLevelCalculationsForLowerLimitNorm)); changedObjects.AddRange(MergeHydraulicBoundaryLocationCalculations(targetAssessmentSection.WaterLevelCalculationsForFactorizedLowerLimitNorm, sourceAssessmentSection.WaterLevelCalculationsForFactorizedLowerLimitNorm)); - changedObjects.AddRange(MergeHydraulicBoundaryLocationCalculations(targetAssessmentSection.WaveHeightCalculationsForFactorizedSignalingNorm, sourceAssessmentSection.WaveHeightCalculationsForFactorizedSignalingNorm)); changedObjects.AddRange(MergeHydraulicBoundaryLocationCalculations(targetAssessmentSection.WaveHeightCalculationsForSignalingNorm, @@ -105,13 +104,48 @@ changedObjects.AddRange(MergeHydraulicBoundaryLocationCalculations(targetAssessmentSection.WaveHeightCalculationsForFactorizedLowerLimitNorm, sourceAssessmentSection.WaveHeightCalculationsForFactorizedLowerLimitNorm)); + ObservableList sourceProbabilities = sourceAssessmentSection.WaterLevelCalculationsForUserDefinedTargetProbabilities; + + HydraulicBoundaryLocationCalculationsForTargetProbability[] probabilitiesToMerge = sourceAssessmentSection.WaterLevelCalculationsForUserDefinedTargetProbabilities + .Where(sp => targetAssessmentSection.WaterLevelCalculationsForUserDefinedTargetProbabilities + .Select(c => c.TargetProbability) + .Contains(sp.TargetProbability)).ToArray(); + + foreach (HydraulicBoundaryLocationCalculationsForTargetProbability sourceProbability in probabilitiesToMerge) + { + HydraulicBoundaryLocationCalculationsForTargetProbability targetProbability = targetAssessmentSection.WaterLevelCalculationsForUserDefinedTargetProbabilities.First(c => c.TargetProbability.Equals(sourceProbability.TargetProbability)); + + changedObjects.AddRange(MergeHydraulicBoundaryLocationCalculations(targetProbability.HydraulicBoundaryLocationCalculations, sourceProbability.HydraulicBoundaryLocationCalculations)); + } + + IEnumerable targetProbabilities = sourceProbabilities.Except(probabilitiesToMerge); + + MergeUniqueProbabilities(targetAssessmentSection, targetProbabilities); + log.Info(changedObjects.Any() ? Resources.AssessmentSectionMergeHandler_MergeHydraulicBoundaryLocations_HydraulicBoundaryLocations_merged : Resources.AssessmentSectionMergeHandler_MergeHydraulicBoundaryLocations_HydraulicBoundaryLocations_not_merged); return changedObjects; } + private static void MergeUniqueProbabilities(IAssessmentSection targetAssessmentSection, IEnumerable targetProbabilities) + { + foreach (HydraulicBoundaryLocationCalculationsForTargetProbability targetProbability in targetProbabilities) + { + var newTargetProbability = new HydraulicBoundaryLocationCalculationsForTargetProbability + { + TargetProbability = targetProbability.TargetProbability + }; + + newTargetProbability.HydraulicBoundaryLocationCalculations.AddRange(targetProbability.HydraulicBoundaryLocationCalculations + .Select(calculation => new HydraulicBoundaryLocationCalculation(GetHydraulicBoundaryLocation(calculation.HydraulicBoundaryLocation, targetAssessmentSection.HydraulicBoundaryDatabase.Locations))) + .ToArray()); + + targetAssessmentSection.WaterLevelCalculationsForUserDefinedTargetProbabilities.Add(newTargetProbability); + } + } + private static IEnumerable MergeHydraulicBoundaryLocationCalculations(IEnumerable targetCalculations, IEnumerable sourceCalculations) { Index: Riskeer/Integration/test/Riskeer.Integration.Plugin.Test/Merge/AssessmentSectionMergeHandlerTest.cs =================================================================== diff -u -r3e0814af5f0045f57ab89723d8d55db530c8f6f5 -r95ef54e2348b92a2b9c0c7d0737e2508f8fc3ac4 --- Riskeer/Integration/test/Riskeer.Integration.Plugin.Test/Merge/AssessmentSectionMergeHandlerTest.cs (.../AssessmentSectionMergeHandlerTest.cs) (revision 3e0814af5f0045f57ab89723d8d55db530c8f6f5) +++ Riskeer/Integration/test/Riskeer.Integration.Plugin.Test/Merge/AssessmentSectionMergeHandlerTest.cs (.../AssessmentSectionMergeHandlerTest.cs) (revision 95ef54e2348b92a2b9c0c7d0737e2508f8fc3ac4) @@ -395,6 +395,95 @@ targetLocations); } + [Test] + public void GivenEqualUserDefinedTargetProbabilities_WhenMerging_ThenCalculationsMerged() + { + // Given + var handler = new AssessmentSectionMergeHandler(); + + 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); + + // When + handler.PerformMerge(targetAssessmentSection, new AssessmentSectionMergeData( + sourceAssessmentSection, + new AssessmentSectionMergeData.ConstructionProperties + { + MergePiping = false, + MergeGrassCoverErosionInwards = false, + MergeMacroStabilityInwards = false, + MergeStabilityStoneCover = false, + MergeWaveImpactAsphaltCover = false, + MergeGrassCoverErosionOutwards = false, + MergeHeightStructures = false, + MergeClosingStructures = false, + MergeStabilityPointStructures = false + })); + + // Then + foreach (HydraulicBoundaryLocationCalculationsForTargetProbability tp in sourceAssessmentSection.WaterLevelCalculationsForUserDefinedTargetProbabilities) + { + HydraulicBoundaryLocationCalculationsForTargetProbability targetProbability = targetAssessmentSection.WaterLevelCalculationsForUserDefinedTargetProbabilities.First(c => c.TargetProbability.Equals(tp.TargetProbability)); + + AssertHydraulicBoundaryCalculations(tp.HydraulicBoundaryLocationCalculations, targetProbability.HydraulicBoundaryLocationCalculations, targetLocations); + } + } + + [Test] + public void GivenDifferentUserDefinedTargetProbabilities_WhenMerging_ThenCalculationsMerged() + { + // Given + var handler = new AssessmentSectionMergeHandler(); + + 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.WaterLevelCalculationsForUserDefinedTargetProbabilities[0].TargetProbability = 0.01; + + // When + handler.PerformMerge(targetAssessmentSection, new AssessmentSectionMergeData( + sourceAssessmentSection, + new AssessmentSectionMergeData.ConstructionProperties + { + MergePiping = false, + MergeGrassCoverErosionInwards = false, + MergeMacroStabilityInwards = false, + MergeStabilityStoneCover = false, + MergeWaveImpactAsphaltCover = false, + MergeGrassCoverErosionOutwards = false, + MergeHeightStructures = false, + MergeClosingStructures = false, + MergeStabilityPointStructures = false + })); + + // Then + Assert.AreEqual(targetAssessmentSection.WaterLevelCalculationsForUserDefinedTargetProbabilities.Count(c => c.TargetProbability.Equals(0.01)), 1); + } + private static void AssertHydraulicBoundaryCalculations(IEnumerable sourceCalculations, IEnumerable targetCalculations, IEnumerable targetLocations) @@ -416,6 +505,21 @@ private static AssessmentSection CreateAssessmentSection(HydraulicBoundaryLocation[] locations) { var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike); + assessmentSection.WaterLevelCalculationsForUserDefinedTargetProbabilities.Add(new HydraulicBoundaryLocationCalculationsForTargetProbability + { + HydraulicBoundaryLocationCalculations = + { + new HydraulicBoundaryLocationCalculation(locations[0]) + } + }); + + assessmentSection.WaveHeightCalculationsForUserDefinedTargetProbabilities.Add(new HydraulicBoundaryLocationCalculationsForTargetProbability + { + HydraulicBoundaryLocationCalculations = + { + new HydraulicBoundaryLocationCalculation(locations[1]) + } + }); assessmentSection.HydraulicBoundaryDatabase.Locations.AddRange(locations); assessmentSection.SetHydraulicBoundaryLocationCalculations(locations); return assessmentSection;