Index: Ringtoets/Integration/src/Ringtoets.Integration.Service/RingtoetsDataSynchronizationService.cs =================================================================== diff -u -rc3e50cc2ac745b628c2809fa709647641b14d512 -r15d708dd6d9cceee5573169f2bdf96f497a31247 --- Ringtoets/Integration/src/Ringtoets.Integration.Service/RingtoetsDataSynchronizationService.cs (.../RingtoetsDataSynchronizationService.cs) (revision c3e50cc2ac745b628c2809fa709647641b14d512) +++ Ringtoets/Integration/src/Ringtoets.Integration.Service/RingtoetsDataSynchronizationService.cs (.../RingtoetsDataSynchronizationService.cs) (revision 15d708dd6d9cceee5573169f2bdf96f497a31247) @@ -314,7 +314,8 @@ if (duneErosionFailureMechanism != null) { IEnumerable affectedDuneLocations = - DuneErosionDataSynchronizationService.ClearDuneLocationOutput(duneErosionFailureMechanism.DuneLocations); + DuneErosionDataSynchronizationService.ClearDuneLocationOutput(duneErosionFailureMechanism.DuneLocations) + .Concat(DuneErosionDataSynchronizationService.ClearDuneCalculationOutputs(duneErosionFailureMechanism)); if (affectedDuneLocations.Any()) { Index: Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/Handlers/FailureMechanismContributionNormChangeHandlerTest.cs =================================================================== diff -u -r14ec2ab7889eccf1d88fd68036b96bfcade83eff -r15d708dd6d9cceee5573169f2bdf96f497a31247 --- Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/Handlers/FailureMechanismContributionNormChangeHandlerTest.cs (.../FailureMechanismContributionNormChangeHandlerTest.cs) (revision 14ec2ab7889eccf1d88fd68036b96bfcade83eff) +++ Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/Handlers/FailureMechanismContributionNormChangeHandlerTest.cs (.../FailureMechanismContributionNormChangeHandlerTest.cs) (revision 15d708dd6d9cceee5573169f2bdf96f497a31247) @@ -142,6 +142,11 @@ .Concat(assessmentSection.WaveHeightCalculationsForFactorizedLowerLimitNorm) .Concat(assessmentSection.GrassCoverErosionOutwards.HydraulicBoundaryLocations) .Concat(assessmentSection.DuneErosion.DuneLocations.Where(dl => dl.Calculation.Output != null)) + .Concat(assessmentSection.DuneErosion.CalculationsForMechanismSpecificFactorizedSignalingNorm.Where(HasDuneErosionLocationCalculationOutput)) + .Concat(assessmentSection.DuneErosion.CalculationsForMechanismSpecificSignalingNorm.Where(HasDuneErosionLocationCalculationOutput)) + .Concat(assessmentSection.DuneErosion.CalculationsForMechanismSpecificLowerLimitNorm.Where(HasDuneErosionLocationCalculationOutput)) + .Concat(assessmentSection.DuneErosion.CalculationsForLowerLimitNorm.Where(HasDuneErosionLocationCalculationOutput)) + .Concat(assessmentSection.DuneErosion.CalculationsForFactorizedLowerLimitNorm.Where(HasDuneErosionLocationCalculationOutput)) .Concat(new IObservable[] { assessmentSection.FailureMechanismContribution @@ -166,12 +171,8 @@ "There should be no calculations with output."); AssertHydraulicBoundaryLocationOutput(assessmentSection, false); + AssertDuneErosionLocationCalculationOutputRemoved(assessmentSection.DuneErosion); - foreach (DuneLocation duneLocation in assessmentSection.DuneErosion.DuneLocations) - { - Assert.IsNull(duneLocation.Calculation.Output); - } - CollectionAssert.AreEquivalent(expectedAffectedObjects, affectedObjects); } @@ -199,6 +200,11 @@ .Concat(assessmentSection.WaveHeightCalculationsForFactorizedLowerLimitNorm) .Concat(assessmentSection.GrassCoverErosionOutwards.HydraulicBoundaryLocations) .Concat(assessmentSection.DuneErosion.DuneLocations.Where(dl => dl.Calculation.Output != null)) + .Concat(assessmentSection.DuneErosion.CalculationsForMechanismSpecificFactorizedSignalingNorm.Where(HasDuneErosionLocationCalculationOutput)) + .Concat(assessmentSection.DuneErosion.CalculationsForMechanismSpecificSignalingNorm.Where(HasDuneErosionLocationCalculationOutput)) + .Concat(assessmentSection.DuneErosion.CalculationsForMechanismSpecificLowerLimitNorm.Where(HasDuneErosionLocationCalculationOutput)) + .Concat(assessmentSection.DuneErosion.CalculationsForLowerLimitNorm.Where(HasDuneErosionLocationCalculationOutput)) + .Concat(assessmentSection.DuneErosion.CalculationsForFactorizedLowerLimitNorm.Where(HasDuneErosionLocationCalculationOutput)) .Concat(new IObservable[] { assessmentSection.FailureMechanismContribution @@ -215,12 +221,8 @@ TestHelper.AssertLogMessageIsGenerated(call, "Alle berekende resultaten voor alle hydraulische randvoorwaardenlocaties zijn verwijderd.", 1); AssertHydraulicBoundaryLocationOutput(assessmentSection, false); + AssertDuneErosionLocationCalculationOutputRemoved(assessmentSection.DuneErosion); - foreach (DuneLocation duneLocation in assessmentSection.DuneErosion.DuneLocations) - { - Assert.IsNull(duneLocation.Calculation.Output); - } - CollectionAssert.AreEquivalent(expectedAffectedObjects, affectedObjects); } @@ -309,6 +311,12 @@ AssertHydraulicBoundaryLocationOutput(assessmentSection, true); Assert.IsNotNull(assessmentSection.DuneErosion.DuneLocations[0].Calculation.Output); + Assert.IsNotNull(assessmentSection.DuneErosion.CalculationsForMechanismSpecificFactorizedSignalingNorm.First().Output); + Assert.IsNotNull(assessmentSection.DuneErosion.CalculationsForMechanismSpecificSignalingNorm.First().Output); + Assert.IsNotNull(assessmentSection.DuneErosion.CalculationsForMechanismSpecificLowerLimitNorm.First().Output); + Assert.IsNotNull(assessmentSection.DuneErosion.CalculationsForLowerLimitNorm.First().Output); + Assert.IsNotNull(assessmentSection.DuneErosion.CalculationsForFactorizedLowerLimitNorm.First().Output); + CollectionAssert.IsEmpty(affectedObjects); } @@ -351,5 +359,21 @@ Assert.AreEqual(hasOutput, location.WaveHeightCalculation1.HasOutput); } } + + private static void AssertDuneErosionLocationCalculationOutputRemoved(DuneErosionFailureMechanism failureMechanism) + { + Assert.True(failureMechanism.DuneLocations.All(dl => dl.Calculation.Output == null)); + + Assert.True(failureMechanism.CalculationsForMechanismSpecificFactorizedSignalingNorm.All(calc => calc.Output == null)); + Assert.True(failureMechanism.CalculationsForMechanismSpecificSignalingNorm.All(calc => calc.Output == null)); + Assert.True(failureMechanism.CalculationsForMechanismSpecificLowerLimitNorm.All(calc => calc.Output == null)); + Assert.True(failureMechanism.CalculationsForLowerLimitNorm.All(calc => calc.Output == null)); + Assert.True(failureMechanism.CalculationsForFactorizedLowerLimitNorm.All(calc => calc.Output == null)); + } + + private static bool HasDuneErosionLocationCalculationOutput(DuneLocationCalculation calculation) + { + return calculation.Output != null; + } } } \ No newline at end of file Index: Ringtoets/Integration/test/Ringtoets.Integration.Service.Test/RingtoetsDataSynchronizationServiceTest.cs =================================================================== diff -u -r2e0339f70613ba026382083119faea454d141ca0 -r15d708dd6d9cceee5573169f2bdf96f497a31247 --- Ringtoets/Integration/test/Ringtoets.Integration.Service.Test/RingtoetsDataSynchronizationServiceTest.cs (.../RingtoetsDataSynchronizationServiceTest.cs) (revision 2e0339f70613ba026382083119faea454d141ca0) +++ Ringtoets/Integration/test/Ringtoets.Integration.Service.Test/RingtoetsDataSynchronizationServiceTest.cs (.../RingtoetsDataSynchronizationServiceTest.cs) (revision 15d708dd6d9cceee5573169f2bdf96f497a31247) @@ -300,19 +300,16 @@ } [Test] - [TestCaseSource(nameof(GetGrassAndDuneLocations), new object[] + [TestCaseSource(nameof(GetClearHydraulicLocationDependentData))] + public void ClearHydraulicBoundaryLocationOutputForFailureMechanisms_AssessmentSectionWithGrassCoverErosionOutwardsAndDuneLocations_ClearDataAndReturnAffectedLocations( + ClearHydraulicLocationDependentTestCase testCase) { - "Location1" - })] - public void ClearHydraulicBoundaryLocationOutputForFailureMechanisms_GrassCoverErosionOutwardsAndDuneLocations_ClearDataAndReturnAffectedLocations( - HydraulicBoundaryLocation grassCoverErosionLocation, DuneLocation duneLocation) - { // Setup + HydraulicBoundaryLocation grassCoverErosionLocation = testCase.HydraulicBoundaryLocation; var grassCoverErosionOutwardsFailureMechanism = new GrassCoverErosionOutwardsFailureMechanism(); grassCoverErosionOutwardsFailureMechanism.HydraulicBoundaryLocations.Add(grassCoverErosionLocation); - var duneErosionFailureMechanism = new DuneErosionFailureMechanism(); - duneErosionFailureMechanism.DuneLocations.Add(duneLocation); + DuneErosionFailureMechanism duneErosionFailureMechanism = testCase.DuneErosionFailureMechanism; var mockRepository = new MockRepository(); var assessmentSection = mockRepository.Stub(); @@ -323,28 +320,23 @@ }); mockRepository.ReplayAll(); - var expectedAffectedItems = new List(); - if (HasHydraulicBoundaryLocationOutput(grassCoverErosionLocation)) - { - expectedAffectedItems.Add(grassCoverErosionLocation); - } - - if (duneLocation.Calculation.Output != null) - { - expectedAffectedItems.Add(duneLocation); - } - // Call IEnumerable affectedObjects = RingtoetsDataSynchronizationService.ClearHydraulicBoundaryLocationOutputOfFailureMechanisms(assessmentSection); // 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.AreEquivalent(expectedAffectedItems, affectedObjects); + CollectionAssert.AreEquivalent(testCase.ExpectedAffectedObjects, affectedObjects); Assert.IsFalse(grassCoverErosionLocation.DesignWaterLevelCalculation1.HasOutput); Assert.IsFalse(grassCoverErosionLocation.WaveHeightCalculation1.HasOutput); - Assert.IsNull(duneLocation.Calculation.Output); + Assert.IsNull(duneErosionFailureMechanism.DuneLocations.Single().Calculation.Output); + Assert.IsNull(duneErosionFailureMechanism.CalculationsForMechanismSpecificFactorizedSignalingNorm.Single().Output); + Assert.IsNull(duneErosionFailureMechanism.CalculationsForMechanismSpecificSignalingNorm.Single().Output); + Assert.IsNull(duneErosionFailureMechanism.CalculationsForMechanismSpecificLowerLimitNorm.Single().Output); + Assert.IsNull(duneErosionFailureMechanism.CalculationsForLowerLimitNorm.Single().Output); + Assert.IsNull(duneErosionFailureMechanism.CalculationsForFactorizedLowerLimitNorm.Single().Output); + mockRepository.VerifyAll(); } @@ -374,31 +366,17 @@ } [Test] - [TestCaseSource(nameof(GetGrassAndDuneLocations), new object[] - { - "Location2" - })] + [TestCaseSource(nameof(GetClearHydraulicLocationDependentData))] public void ClearHydraulicBoundaryLocationOutputForFailureMechanisms_FailureMechanismsGrassCoverErosionOutwardsAndDuneLocations_ClearDataAndReturnAffectedLocations( - HydraulicBoundaryLocation grassCoverErosionLocation, DuneLocation duneLocation) + ClearHydraulicLocationDependentTestCase testCase) { // Setup + HydraulicBoundaryLocation grassCoverErosionLocation = testCase.HydraulicBoundaryLocation; var grassCoverErosionOutwardsFailureMechanism = new GrassCoverErosionOutwardsFailureMechanism(); grassCoverErosionOutwardsFailureMechanism.HydraulicBoundaryLocations.Add(grassCoverErosionLocation); - var duneErosionFailureMechanism = new DuneErosionFailureMechanism(); - duneErosionFailureMechanism.DuneLocations.Add(duneLocation); + DuneErosionFailureMechanism duneErosionFailureMechanism = testCase.DuneErosionFailureMechanism; - var expectedAffectedItems = new List(); - if (HasHydraulicBoundaryLocationOutput(grassCoverErosionLocation)) - { - expectedAffectedItems.Add(grassCoverErosionLocation); - } - - if (duneLocation.Calculation.Output != null) - { - expectedAffectedItems.Add(duneLocation); - } - // Call IEnumerable affectedObjects = RingtoetsDataSynchronizationService.ClearHydraulicBoundaryLocationOutputOfFailureMechanisms(new IFailureMechanism[] { @@ -409,10 +387,16 @@ // 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.AreEquivalent(expectedAffectedItems, affectedObjects); + CollectionAssert.AreEquivalent(testCase.ExpectedAffectedObjects, affectedObjects); Assert.IsFalse(grassCoverErosionLocation.DesignWaterLevelCalculation1.HasOutput); Assert.IsFalse(grassCoverErosionLocation.WaveHeightCalculation1.HasOutput); - Assert.IsNull(duneLocation.Calculation.Output); + + Assert.IsNull(duneErosionFailureMechanism.DuneLocations.Single().Calculation.Output); + Assert.IsNull(duneErosionFailureMechanism.CalculationsForMechanismSpecificFactorizedSignalingNorm.Single().Output); + Assert.IsNull(duneErosionFailureMechanism.CalculationsForMechanismSpecificSignalingNorm.Single().Output); + Assert.IsNull(duneErosionFailureMechanism.CalculationsForMechanismSpecificLowerLimitNorm.Single().Output); + Assert.IsNull(duneErosionFailureMechanism.CalculationsForLowerLimitNorm.Single().Output); + Assert.IsNull(duneErosionFailureMechanism.CalculationsForFactorizedLowerLimitNorm.Single().Output); } [Test] @@ -491,6 +475,24 @@ hydraulicBoundaryLocationCalculation7.Output = new TestHydraulicBoundaryLocationOutput(random.NextDouble()); hydraulicBoundaryLocationCalculation8.Output = new TestHydraulicBoundaryLocationOutput(random.NextDouble()); + assessmentSection.DuneErosion.SetDuneLocationCalculations(new[] + { + duneLocation1, + duneLocation2 + }); + + DuneLocationCalculation duneLocationCalculation1 = assessmentSection.DuneErosion.CalculationsForMechanismSpecificFactorizedSignalingNorm.First(c => ReferenceEquals(c.DuneLocation, duneLocation1)); + DuneLocationCalculation duneLocationCalculation2 = assessmentSection.DuneErosion.CalculationsForMechanismSpecificSignalingNorm.First(c => ReferenceEquals(c.DuneLocation, duneLocation1)); + DuneLocationCalculation duneLocationCalculation3 = assessmentSection.DuneErosion.CalculationsForMechanismSpecificLowerLimitNorm.First(c => ReferenceEquals(c.DuneLocation, duneLocation1)); + DuneLocationCalculation duneLocationCalculation4 = assessmentSection.DuneErosion.CalculationsForLowerLimitNorm.First(c => ReferenceEquals(c.DuneLocation, duneLocation1)); + DuneLocationCalculation duneLocationCalculation5 = assessmentSection.DuneErosion.CalculationsForFactorizedLowerLimitNorm.First(c => ReferenceEquals(c.DuneLocation, duneLocation1)); + + duneLocationCalculation1.Output = new TestDuneLocationOutput(); + duneLocationCalculation2.Output = new TestDuneLocationOutput(); + duneLocationCalculation3.Output = new TestDuneLocationOutput(); + duneLocationCalculation4.Output = new TestDuneLocationOutput(); + duneLocationCalculation5.Output = new TestDuneLocationOutput(); + var expectedAffectedItems = new List { hydraulicBoundaryLocationCalculation1, @@ -502,7 +504,12 @@ hydraulicBoundaryLocationCalculation7, hydraulicBoundaryLocationCalculation8, hydraulicBoundaryLocation1, - duneLocation1 + duneLocation1, + duneLocationCalculation1, + duneLocationCalculation2, + duneLocationCalculation3, + duneLocationCalculation4, + duneLocationCalculation5 }; // Call @@ -520,7 +527,13 @@ Assert.IsFalse(hydraulicBoundaryLocationCalculation8.HasOutput); Assert.IsFalse(hydraulicBoundaryLocation1.DesignWaterLevelCalculation1.HasOutput); Assert.IsFalse(hydraulicBoundaryLocation1.WaveHeightCalculation1.HasOutput); + Assert.IsNull(duneLocation1.Calculation.Output); + Assert.IsNull(duneLocationCalculation1.Output); + Assert.IsNull(duneLocationCalculation2.Output); + Assert.IsNull(duneLocationCalculation3.Output); + Assert.IsNull(duneLocationCalculation4.Output); + Assert.IsNull(duneLocationCalculation5.Output); } [Test] @@ -1631,43 +1644,115 @@ } } - private static bool HasHydraulicBoundaryLocationOutput(HydraulicBoundaryLocation hydraulicBoundaryLocation) + #region TestData + + public class ClearHydraulicLocationDependentTestCase { - return hydraulicBoundaryLocation.DesignWaterLevelCalculation1.HasOutput || hydraulicBoundaryLocation.WaveHeightCalculation1.HasOutput; + public ClearHydraulicLocationDependentTestCase(HydraulicBoundaryLocation hydraulicBoundaryLocation, + DuneErosionFailureMechanism duneErosionFailureMechanism) + { + HydraulicBoundaryLocation = hydraulicBoundaryLocation; + DuneErosionFailureMechanism = duneErosionFailureMechanism; + + var expectedAffectedObjects = new List(); + if (HasHydraulicBoundaryLocationOutput(hydraulicBoundaryLocation)) + { + expectedAffectedObjects.Add(hydraulicBoundaryLocation); + } + + expectedAffectedObjects.AddRange(GetAffectedDuneErosionFailureMechanismItems(duneErosionFailureMechanism)); + + ExpectedAffectedObjects = expectedAffectedObjects; + } + + public HydraulicBoundaryLocation HydraulicBoundaryLocation { get; } + + public DuneErosionFailureMechanism DuneErosionFailureMechanism { get; } + + public IEnumerable ExpectedAffectedObjects { get; } + + private static IEnumerable GetAffectedDuneErosionFailureMechanismItems(DuneErosionFailureMechanism duneErosionFailureMechanism) + { + var affectedObjects = new List(); + affectedObjects.AddRange(duneErosionFailureMechanism.DuneLocations.Where(loc => loc.Calculation.Output != null)); + affectedObjects.AddRange(duneErosionFailureMechanism.CalculationsForMechanismSpecificFactorizedSignalingNorm.Where(HasDuneErosionLocationCalculationOutput)); + affectedObjects.AddRange(duneErosionFailureMechanism.CalculationsForMechanismSpecificSignalingNorm.Where(HasDuneErosionLocationCalculationOutput)); + affectedObjects.AddRange(duneErosionFailureMechanism.CalculationsForMechanismSpecificLowerLimitNorm.Where(HasDuneErosionLocationCalculationOutput)); + affectedObjects.AddRange(duneErosionFailureMechanism.CalculationsForLowerLimitNorm.Where(HasDuneErosionLocationCalculationOutput)); + affectedObjects.AddRange(duneErosionFailureMechanism.CalculationsForFactorizedLowerLimitNorm.Where(HasDuneErosionLocationCalculationOutput)); + + return affectedObjects; + } + + private static bool HasDuneErosionLocationCalculationOutput(DuneLocationCalculation calculation) + { + return calculation.Output != null; + } + + private static bool HasHydraulicBoundaryLocationOutput(HydraulicBoundaryLocation hydraulicBoundaryLocation) + { + return hydraulicBoundaryLocation.DesignWaterLevelCalculation1.HasOutput || hydraulicBoundaryLocation.WaveHeightCalculation1.HasOutput; + } + } - #region TestData + private static IEnumerable GetClearHydraulicLocationDependentData() + { + var duneErosionFailureMechanism = new DuneErosionFailureMechanism(); + ConfigureDuneErosionFailureMechanism(duneErosionFailureMechanism, false); + yield return new TestCaseData(new ClearHydraulicLocationDependentTestCase( + new TestHydraulicBoundaryLocation(), + duneErosionFailureMechanism)) + .SetName("GrassAndDuneLocationNoOutput"); - private static IEnumerable GetGrassAndDuneLocations(string testName) + duneErosionFailureMechanism = new DuneErosionFailureMechanism(); + ConfigureDuneErosionFailureMechanism(duneErosionFailureMechanism, false); + yield return new TestCaseData(new ClearHydraulicLocationDependentTestCase( + TestHydraulicBoundaryLocation.CreateFullyCalculated(), + duneErosionFailureMechanism)) + .SetName("DuneLocationWithoutOutputGrassLocationWithOutput"); + + duneErosionFailureMechanism = new DuneErosionFailureMechanism(); + ConfigureDuneErosionFailureMechanism(duneErosionFailureMechanism, true); + yield return new TestCaseData(new ClearHydraulicLocationDependentTestCase( + new TestHydraulicBoundaryLocation(), + duneErosionFailureMechanism)) + .SetName("GrassLocationWithoutOutputDuneLocationWithOutput"); + + duneErosionFailureMechanism = new DuneErosionFailureMechanism(); + ConfigureDuneErosionFailureMechanism(duneErosionFailureMechanism, true); + yield return new TestCaseData(new ClearHydraulicLocationDependentTestCase( + TestHydraulicBoundaryLocation.CreateFullyCalculated(), + duneErosionFailureMechanism)) + .SetName("GrassAndDuneLocationWithOutput"); + } + + private static void ConfigureDuneErosionFailureMechanism(DuneErosionFailureMechanism failureMechanism, bool hasOutput) { - yield return new TestCaseData( - new TestHydraulicBoundaryLocation(), - new TestDuneLocation() - ).SetName($"GrassAndDuneLocationNoOutput_{testName}"); - yield return new TestCaseData( - TestHydraulicBoundaryLocation.CreateFullyCalculated(), - new TestDuneLocation() - ).SetName($"DuneLocationWithoutOutputGrassLocationWithOutput_{testName}"); - yield return new TestCaseData( - new TestHydraulicBoundaryLocation(), - new TestDuneLocation + var duneLocation = new TestDuneLocation + { + Calculation = { - Calculation = - { - Output = new TestDuneLocationOutput() - } + Output = hasOutput ? new TestDuneLocationOutput() : null } - ).SetName($"GrassLocationWithoutOutputDuneLocationWithOutput_{testName}"); - yield return new TestCaseData( - TestHydraulicBoundaryLocation.CreateFullyCalculated(), - new TestDuneLocation - { - Calculation = - { - Output = new TestDuneLocationOutput() - } - } - ).SetName($"GrassAndDuneLocationWithOutput_{testName}"); + }; + + var duneLocations = new[] + { + duneLocation + }; + + failureMechanism.DuneLocations.AddRange(duneLocations); + failureMechanism.SetDuneLocationCalculations(duneLocations); + + if (hasOutput) + { + failureMechanism.CalculationsForMechanismSpecificFactorizedSignalingNorm.First().Output = new TestDuneLocationOutput(); + failureMechanism.CalculationsForMechanismSpecificSignalingNorm.First().Output = new TestDuneLocationOutput(); + failureMechanism.CalculationsForMechanismSpecificLowerLimitNorm.First().Output = new TestDuneLocationOutput(); + failureMechanism.CalculationsForLowerLimitNorm.First().Output = new TestDuneLocationOutput(); + failureMechanism.CalculationsForFactorizedLowerLimitNorm.First().Output = new TestDuneLocationOutput(); + } } #endregion