Index: Riskeer/Common/src/Riskeer.Common.Data/Helpers/CalculationScenarioHelper.cs =================================================================== diff -u -r0eed9aa596fb1a96e3ea45636aa5ee870a4bb48c -rf68e9405a0fd41124823662da365309faec0f988 --- Riskeer/Common/src/Riskeer.Common.Data/Helpers/CalculationScenarioHelper.cs (.../CalculationScenarioHelper.cs) (revision 0eed9aa596fb1a96e3ea45636aa5ee870a4bb48c) +++ Riskeer/Common/src/Riskeer.Common.Data/Helpers/CalculationScenarioHelper.cs (.../CalculationScenarioHelper.cs) (revision f68e9405a0fd41124823662da365309faec0f988) @@ -72,5 +72,20 @@ return (RoundedDouble) calculationScenarios.Aggregate(0, (current, calculationScenario) => current + calculationScenario.Contribution); } + + /// + /// Gets whether the calculation scenarios are valid. + /// + /// + /// The type of the calculation scenarios. + /// true when there are calculation scenarios, + /// they all have output and the total contribution is 1.0; false otherwise. + public static bool ScenariosAreValid(T[] relevantScenarios) + where T : ICalculationScenario + { + return relevantScenarios.Any() + && relevantScenarios.All(s => s.HasOutput) + && Math.Abs(GetTotalContribution(relevantScenarios) - 1.0) <= 1e-6; + } } } \ No newline at end of file Index: Riskeer/Common/test/Riskeer.Common.Data.Test/Helpers/CalculationScenarioHelperTest.cs =================================================================== diff -u -ra72a0c1fefeb2474c6838b6ffd504a8a7b6ac5a0 -rf68e9405a0fd41124823662da365309faec0f988 --- Riskeer/Common/test/Riskeer.Common.Data.Test/Helpers/CalculationScenarioHelperTest.cs (.../CalculationScenarioHelperTest.cs) (revision a72a0c1fefeb2474c6838b6ffd504a8a7b6ac5a0) +++ Riskeer/Common/test/Riskeer.Common.Data.Test/Helpers/CalculationScenarioHelperTest.cs (.../CalculationScenarioHelperTest.cs) (revision f68e9405a0fd41124823662da365309faec0f988) @@ -102,5 +102,100 @@ RoundedDouble expectedTotalContribution = calculationScenario1.Contribution + calculationScenario2.Contribution; Assert.AreEqual(expectedTotalContribution, totalContribution); } + + [Test] + public void ScenariosAreValid_ScenariosEmpty_ReturnsFalse() + { + // Call + bool valid = CalculationScenarioHelper.ScenariosAreValid(Array.Empty()); + + // Assert + Assert.IsFalse(valid); + } + + [Test] + public void ScenariosAreValid_ScenariosWithoutOutput_ReturnsFalse() + { + // Setup + var calculationScenario1 = new TestCalculationScenario + { + Contribution = (RoundedDouble) 0.4323, + Output = new object() + }; + var calculationScenario2 = new TestCalculationScenario + { + Contribution = (RoundedDouble) 0.1226 + }; + + // Call + bool valid = CalculationScenarioHelper.ScenariosAreValid(new[] + { + calculationScenario1, + calculationScenario2 + }); + + // Assert + Assert.IsFalse(valid); + } + + [Test] + [TestCase(0.4323, 0.1226)] + [TestCase(0.9000, 0.9000)] + [TestCase(1, 0.0001)] + [TestCase(0.0001, 0.9998)] + public void ScenariosAreValid_ScenariosContributionNotOne_ReturnsFalse(double scenarioContribution1, + double scenarioContribution2) + { + // Setup + var calculationScenario1 = new TestCalculationScenario + { + Contribution = (RoundedDouble) scenarioContribution1, + Output = new object() + }; + var calculationScenario2 = new TestCalculationScenario + { + Contribution = (RoundedDouble) scenarioContribution2, + Output = new object() + }; + + // Call + bool valid = CalculationScenarioHelper.ScenariosAreValid(new[] + { + calculationScenario1, + calculationScenario2 + }); + + // Assert + Assert.IsFalse(valid); + } + + [Test] + [TestCase(1, 0)] + [TestCase(0.0001, 0.9999)] + public void ScenariosAreValid_ScenariosWithOutputAndContributionOne_ReturnsTrue(double scenarioContribution1, + double scenarioContribution2) + { + // Setup + var calculationScenario1 = new TestCalculationScenario + { + Contribution = (RoundedDouble) scenarioContribution1, + Output = new object() + }; + var calculationScenario2 = new TestCalculationScenario + { + Contribution = (RoundedDouble) scenarioContribution2, + Output = new object() + }; + + // Call + bool valid = CalculationScenarioHelper.ScenariosAreValid(new[] + { + calculationScenario1, + calculationScenario2 + }); + + // Assert + Assert.IsTrue(valid); + } } } \ No newline at end of file Index: Riskeer/Piping/src/Riskeer.Piping.Data/PipingFailureMechanismSectionResultInitialFailureMechanismResultExtensions.cs =================================================================== diff -u -re2eb901c9bfce4975c5050dbbea4065dfdb41871 -rf68e9405a0fd41124823662da365309faec0f988 --- Riskeer/Piping/src/Riskeer.Piping.Data/PipingFailureMechanismSectionResultInitialFailureMechanismResultExtensions.cs (.../PipingFailureMechanismSectionResultInitialFailureMechanismResultExtensions.cs) (revision e2eb901c9bfce4975c5050dbbea4065dfdb41871) +++ Riskeer/Piping/src/Riskeer.Piping.Data/PipingFailureMechanismSectionResultInitialFailureMechanismResultExtensions.cs (.../PipingFailureMechanismSectionResultInitialFailureMechanismResultExtensions.cs) (revision f68e9405a0fd41124823662da365309faec0f988) @@ -31,7 +31,8 @@ namespace Riskeer.Piping.Data { /// - /// Extension methods for obtaining initial failure mechanism result probabilities from output for an assessment of the piping failure mechanism. + /// Extension methods for obtaining initial failure mechanism result probabilities + /// from output for an assessment of the piping failure mechanism. /// public static class PipingFailureMechanismSectionResultInitialFailureMechanismResultExtensions { @@ -69,7 +70,7 @@ (scenario, lineSegments) => scenario.IsSurfaceLineIntersectionWithReferenceLineInSection(lineSegments)) .ToArray(); - return ScenariosAreValid(relevantScenarios) + return CalculationScenarioHelper.ScenariosAreValid(relevantScenarios) ? relevantScenarios.Sum(scenario => StatisticsConverter.ReliabilityToProbability(getOutputFunc(scenario).Reliability) * (double) scenario.Contribution) : double.NaN; } @@ -103,7 +104,7 @@ (scenario, lineSegments) => scenario.IsSurfaceLineIntersectionWithReferenceLineInSection(lineSegments)) .ToArray(); - if (!ScenariosAreValid(relevantScenarios)) + if (!CalculationScenarioHelper.ScenariosAreValid(relevantScenarios)) { return double.NaN; } @@ -118,13 +119,5 @@ return totalInitialFailureMechanismResult; } - - private static bool ScenariosAreValid(T[] relevantScenarios) - where T : IPipingCalculationScenario - { - return relevantScenarios.Any() - && relevantScenarios.All(s => s.HasOutput) - && Math.Abs(CalculationScenarioHelper.GetTotalContribution(relevantScenarios) - 1.0) <= 1e-6; - } } } \ No newline at end of file