Index: Riskeer/Piping/src/Riskeer.Piping.Service/PipingDataSynchronizationService.cs =================================================================== diff -u -rc37eebd9171a53987f5929013edbe3d82e618ed0 -rf3889f7c9d59a70d2da5be02cdb3858435dad29f --- Riskeer/Piping/src/Riskeer.Piping.Service/PipingDataSynchronizationService.cs (.../PipingDataSynchronizationService.cs) (revision c37eebd9171a53987f5929013edbe3d82e618ed0) +++ Riskeer/Piping/src/Riskeer.Piping.Service/PipingDataSynchronizationService.cs (.../PipingDataSynchronizationService.cs) (revision f3889f7c9d59a70d2da5be02cdb3858435dad29f) @@ -31,6 +31,7 @@ using Riskeer.Common.Service; using Riskeer.Piping.Data; using Riskeer.Piping.Data.Probabilistic; +using Riskeer.Piping.Data.SemiProbabilistic; using Riskeer.Piping.Data.SoilProfile; using Riskeer.Piping.Primitives; @@ -86,6 +87,30 @@ } /// + /// Clears the output for all calculations in the , + /// except for the where + /// is true. + /// + /// The which contains the calculations. + /// An of calculations which are affected by clearing the output. + /// Thrown when is null. + public static IEnumerable ClearAllCalculationOutputWithoutManualAssessmentLevel(PipingFailureMechanism failureMechanism) + { + if (failureMechanism == null) + { + throw new ArgumentNullException(nameof(failureMechanism)); + } + + return failureMechanism.Calculations + .OfType>() + .Except(failureMechanism.Calculations + .OfType() + .Where(c => c.InputParameters.UseAssessmentLevelManualInput)) + .SelectMany(ClearCalculationOutput) + .ToArray(); + } + + /// /// Clears the output for all in the . /// /// The which contains the calculations. Index: Riskeer/Piping/test/Riskeer.Piping.Service.Test/PipingDataSynchronizationServiceTest.cs =================================================================== diff -u -rc37eebd9171a53987f5929013edbe3d82e618ed0 -rf3889f7c9d59a70d2da5be02cdb3858435dad29f --- Riskeer/Piping/test/Riskeer.Piping.Service.Test/PipingDataSynchronizationServiceTest.cs (.../PipingDataSynchronizationServiceTest.cs) (revision c37eebd9171a53987f5929013edbe3d82e618ed0) +++ Riskeer/Piping/test/Riskeer.Piping.Service.Test/PipingDataSynchronizationServiceTest.cs (.../PipingDataSynchronizationServiceTest.cs) (revision f3889f7c9d59a70d2da5be02cdb3858435dad29f) @@ -28,6 +28,7 @@ using Riskeer.Common.Service; using Riskeer.Piping.Data; using Riskeer.Piping.Data.Probabilistic; +using Riskeer.Piping.Data.SemiProbabilistic; using Riskeer.Piping.Data.SoilProfile; using Riskeer.Piping.Data.TestUtil; using Riskeer.Piping.Primitives; @@ -114,6 +115,73 @@ } [Test] + public void ClearAllCalculationOutputWithoutManualAssessmentLevel_FailureMechanismNull_ThrowsArgumentNullException() + { + // Call + void Call() => PipingDataSynchronizationService.ClearAllCalculationOutputWithoutManualAssessmentLevel(null); + + // Assert + var exception = Assert.Throws(Call); + Assert.AreEqual("failureMechanism", exception.ParamName); + } + + [Test] + public void ClearAllCalculationOutputWithoutManualAssessmentLevel_WithVariousCalculations_ClearsCalculationsOutputAndReturnsAffectedCalculations() + { + // Setup + PipingFailureMechanism failureMechanism = PipingTestDataGenerator.GetPipingFailureMechanismWithAllCalculationConfigurations(); + failureMechanism.CalculationsGroup.Children.AddRange(new IPipingCalculationScenario[] + { + new SemiProbabilisticPipingCalculationScenario + { + Output = PipingTestDataGenerator.GetRandomSemiProbabilisticPipingOutput() + }, + new SemiProbabilisticPipingCalculationScenario + { + InputParameters = + { + UseAssessmentLevelManualInput = true + }, + Output = PipingTestDataGenerator.GetRandomSemiProbabilisticPipingOutput() + }, + new SemiProbabilisticPipingCalculationScenario(), + new ProbabilisticPipingCalculationScenario(), + new ProbabilisticPipingCalculationScenario + { + Output = PipingTestDataGenerator.GetRandomProbabilisticPipingOutputWithIllustrationPoints() + }, + new ProbabilisticPipingCalculationScenario + { + Output = PipingTestDataGenerator.GetRandomProbabilisticPipingOutputWithoutIllustrationPoints() + } + }); + + SemiProbabilisticPipingCalculationScenario[] exceptCalculations = failureMechanism.Calculations + .OfType() + .Where(c => c.InputParameters.UseAssessmentLevelManualInput) + .ToArray(); + + IPipingCalculationScenario[] expectedAffectedCalculations = failureMechanism.Calculations + .OfType>() + .Except(exceptCalculations) + .Where(c => c.HasOutput) + .ToArray(); + + // Call + IEnumerable affectedItems = PipingDataSynchronizationService.ClearAllCalculationOutputWithoutManualAssessmentLevel(failureMechanism); + + // 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: + Assert.IsTrue(failureMechanism.Calculations + .OfType>() + .Except(exceptCalculations) + .All(c => !c.HasOutput)); + + CollectionAssert.AreEquivalent(expectedAffectedCalculations, affectedItems); + } + + [Test] public void ClearAllProbabilisticCalculationOutput_FailureMechanismNull_ThrowsArgumentNullException() { // Call