Index: Riskeer/HeightStructures/src/Riskeer.HeightStructures.Data/HeightStructuresFailureMechanismSectionResultDetailedAssessmentExtensions.cs =================================================================== diff -u -rb0d25d2dab3c6ba9b1aff684a0cf41f842e0ec29 -rffa91975e2aa4e0c52b704eceef9a609ddd827b4 --- Riskeer/HeightStructures/src/Riskeer.HeightStructures.Data/HeightStructuresFailureMechanismSectionResultDetailedAssessmentExtensions.cs (.../HeightStructuresFailureMechanismSectionResultDetailedAssessmentExtensions.cs) (revision b0d25d2dab3c6ba9b1aff684a0cf41f842e0ec29) +++ Riskeer/HeightStructures/src/Riskeer.HeightStructures.Data/HeightStructuresFailureMechanismSectionResultDetailedAssessmentExtensions.cs (.../HeightStructuresFailureMechanismSectionResultDetailedAssessmentExtensions.cs) (revision ffa91975e2aa4e0c52b704eceef9a609ddd827b4) @@ -21,7 +21,11 @@ using System; using System.Collections.Generic; +using System.Linq; +using Core.Common.Base.Data; +using Core.Common.Base.Geometry; using Riskeer.Common.Data.AssessmentSection; +using Riskeer.Common.Data.Calculation; using Riskeer.Common.Data.Probability; using Riskeer.Common.Data.Structures; @@ -78,5 +82,57 @@ return derivedOutput.Probability; } + + /// + /// Gets the total contribution of all relevant calculation scenarios. + /// + /// The section result to get the total contribution for. + /// The calculation scenarios to get the total contribution for. + /// The total contribution of all relevant calculation scenarios. + /// Thrown when any parameter is null. + public static RoundedDouble GetTotalContribution(this HeightStructuresFailureMechanismSectionResult sectionResult, + IEnumerable> calculationScenarios) + { + if (sectionResult == null) + { + throw new ArgumentNullException(nameof(sectionResult)); + } + + if (calculationScenarios == null) + { + throw new ArgumentNullException(nameof(calculationScenarios)); + } + + return (RoundedDouble) sectionResult + .GetCalculationScenarios(calculationScenarios) + .Aggregate(0, (current, calculationScenario) => current + calculationScenario.Contribution); + } + + /// + /// Gets a collection of the relevant . + /// + /// The section result to get the relevant scenarios for. + /// The calculation scenarios to get the relevant scenarios from. + /// A collection of relevant calculation scenarios. + /// Thrown when any parameter is null. + public static IEnumerable> GetCalculationScenarios( + this HeightStructuresFailureMechanismSectionResult sectionResult, + IEnumerable> calculationScenarios) + { + if (sectionResult == null) + { + throw new ArgumentNullException(nameof(sectionResult)); + } + + if (calculationScenarios == null) + { + throw new ArgumentNullException(nameof(calculationScenarios)); + } + + IEnumerable lineSegments = Math2D.ConvertPointsToLineSegments(sectionResult.Section.Points); + + return calculationScenarios + .Where(cs => cs.IsRelevant && cs.IsStructureIntersectionWithReferenceLineInSection(lineSegments)); + } } } \ No newline at end of file Index: Riskeer/HeightStructures/test/Riskeer.HeightStructures.Data.Test/HeightStructuresFailureMechanismSectionResultDetailedAssessmentExtensionsTest.cs =================================================================== diff -u -rb0d25d2dab3c6ba9b1aff684a0cf41f842e0ec29 -rffa91975e2aa4e0c52b704eceef9a609ddd827b4 --- Riskeer/HeightStructures/test/Riskeer.HeightStructures.Data.Test/HeightStructuresFailureMechanismSectionResultDetailedAssessmentExtensionsTest.cs (.../HeightStructuresFailureMechanismSectionResultDetailedAssessmentExtensionsTest.cs) (revision b0d25d2dab3c6ba9b1aff684a0cf41f842e0ec29) +++ Riskeer/HeightStructures/test/Riskeer.HeightStructures.Data.Test/HeightStructuresFailureMechanismSectionResultDetailedAssessmentExtensionsTest.cs (.../HeightStructuresFailureMechanismSectionResultDetailedAssessmentExtensionsTest.cs) (revision ffa91975e2aa4e0c52b704eceef9a609ddd827b4) @@ -20,7 +20,10 @@ // All rights reserved. using System; +using System.Collections.Generic; using System.Linq; +using Core.Common.Base.Data; +using Core.Common.Base.Geometry; using NUnit.Framework; using Rhino.Mocks; using Riskeer.Common.Data.AssessmentSection; @@ -185,5 +188,132 @@ Assert.AreEqual(0.21185539858339669, detailedAssessmentProbability); mocks.VerifyAll(); } + + [Test] + public void GetTotalContribution_SectionResultNull_ThrowsArgumentNullException() + { + // Call + void Call() => ((HeightStructuresFailureMechanismSectionResult) null).GetTotalContribution(Enumerable.Empty>()); + + // Assert + var exception = Assert.Throws(Call); + Assert.AreEqual("sectionResult", exception.ParamName); + } + + [Test] + public void GetTotalContribution_CalculationScenariosNull_ThrowsArgumentNullException() + { + // Setup + FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection(); + var sectionResult = new HeightStructuresFailureMechanismSectionResult(section); + + // Call + void Call() => sectionResult.GetTotalContribution(null); + + // Assert + var exception = Assert.Throws(Call); + Assert.AreEqual("calculationScenarios", exception.ParamName); + } + + [Test] + public void GetTotalContribution_WithScenarios_ReturnsTotalRelevantScenarioContribution() + { + // Setup + FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection(); + var failureMechanismSectionResult = new HeightStructuresFailureMechanismSectionResult(section); + + StructuresCalculationScenario calculationScenario = HeightStructuresCalculationScenarioTestFactory.CreateNotCalculatedHeightStructuresCalculationScenario(section); + calculationScenario.Contribution = (RoundedDouble) 0.3211; + + StructuresCalculationScenario calculationScenario2 = HeightStructuresCalculationScenarioTestFactory.CreateNotCalculatedHeightStructuresCalculationScenario(section); + calculationScenario2.Contribution = (RoundedDouble) 0.5435; + + StructuresCalculationScenario calculationScenario3 = HeightStructuresCalculationScenarioTestFactory.CreateNotCalculatedHeightStructuresCalculationScenario(section); + calculationScenario3.IsRelevant = false; + + StructuresCalculationScenario[] calculationScenarios = + { + calculationScenario, + calculationScenario2, + calculationScenario3 + }; + + // Call + RoundedDouble totalContribution = failureMechanismSectionResult.GetTotalContribution(calculationScenarios); + + // Assert + Assert.AreEqual((RoundedDouble) 0.8646, totalContribution); + } + + [Test] + public void GetCalculationScenarios_SectionResultNull_ThrowsArgumentNullException() + { + // Call + void Call() => ((HeightStructuresFailureMechanismSectionResult) null).GetCalculationScenarios(Enumerable.Empty>()); + + // Assert + var exception = Assert.Throws(Call); + Assert.AreEqual("sectionResult", exception.ParamName); + } + + [Test] + public void GetCalculationScenarios_CalculationScenariosNull_ThrowsArgumentNullException() + { + // Setup + FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection(); + var sectionResult = new HeightStructuresFailureMechanismSectionResult(section); + + // Call + void Call() => sectionResult.GetCalculationScenarios(null); + + // Assert + var exception = Assert.Throws(Call); + Assert.AreEqual("calculationScenarios", exception.ParamName); + } + + [Test] + public void GetCalculationScenarios_WithRelevantAndIrrelevantScenarios_ReturnsRelevantCalculationScenarios() + { + // Setup + FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection(); + var sectionResult = new HeightStructuresFailureMechanismSectionResult(section); + StructuresCalculationScenario calculationScenario = HeightStructuresCalculationScenarioTestFactory.CreateNotCalculatedHeightStructuresCalculationScenario(section); + StructuresCalculationScenario calculationScenario2 = HeightStructuresCalculationScenarioTestFactory.CreateNotCalculatedHeightStructuresCalculationScenario(section); + calculationScenario2.IsRelevant = false; + + // Call + IEnumerable> relevantScenarios = sectionResult.GetCalculationScenarios(new[] + { + calculationScenario, + calculationScenario2 + }); + + // AssertJep + + Assert.AreEqual(calculationScenario, relevantScenarios.Single()); + } + + [Test] + public void GetCalculationScenarios_WithoutScenarioIntersectingSection_ReturnsNoCalculationScenarios() + { + // Setup + FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection(new[] + { + new Point2D(999, 999), + new Point2D(998, 998) + }); + var sectionResult = new HeightStructuresFailureMechanismSectionResult(section); + StructuresCalculationScenario calculationScenario = HeightStructuresCalculationScenarioTestFactory.CreateNotCalculatedHeightStructuresCalculationScenario( + FailureMechanismSectionTestFactory.CreateFailureMechanismSection()); + + // Call + IEnumerable> relevantScenarios = sectionResult.GetCalculationScenarios(new[] + { + calculationScenario + }); + + // Assert + CollectionAssert.IsEmpty(relevantScenarios); + } } } \ No newline at end of file