Index: Riskeer/Integration/src/Riskeer.Integration.Data/Assembly/AssessmentSectionAssemblyFactory.cs
===================================================================
diff -u -r01c40dbdf75bccae38a7728556afe2f8968f55c0 -raab1efad3517fa9f1eb65a9625e9bb1a131d8bc3
--- Riskeer/Integration/src/Riskeer.Integration.Data/Assembly/AssessmentSectionAssemblyFactory.cs (.../AssessmentSectionAssemblyFactory.cs) (revision 01c40dbdf75bccae38a7728556afe2f8968f55c0)
+++ Riskeer/Integration/src/Riskeer.Integration.Data/Assembly/AssessmentSectionAssemblyFactory.cs (.../AssessmentSectionAssemblyFactory.cs) (revision aab1efad3517fa9f1eb65a9625e9bb1a131d8bc3)
@@ -63,12 +63,124 @@
throw new ArgumentNullException(nameof(assessmentSection));
}
+ return assessmentSection.AreFailureMechanismsCorrelated && AllCorrelatedFailureMechanismsInAssembly(assessmentSection)
+ ? AssembleAssessmentSectionWithCorrelatedFailureMechanisms(assessmentSection)
+ : AssembleAssessmentSectionWithoutCorrelatedFailureMechanisms(assessmentSection);
+ }
+
+ private static bool AllCorrelatedFailureMechanismsInAssembly(AssessmentSection assessmentSection)
+ {
+ return assessmentSection.GrassCoverErosionInwards.InAssembly && assessmentSection.HeightStructures.InAssembly;
+ }
+
+ ///
+ /// Gets the assessment section assembly result with correlated failure mechanisms.
+ ///
+ /// The to retrieve the assessment section assembly results
+ /// for.
+ /// The assessment section assembly result.
+ /// Thrown when the result could not be assembled.
+ private static AssessmentSectionAssemblyResultWrapper AssembleAssessmentSectionWithCorrelatedFailureMechanisms(AssessmentSection assessmentSection)
+ {
try
{
IAssemblyToolCalculatorFactory calculatorFactory = AssemblyToolCalculatorFactory.Instance;
IAssessmentSectionAssemblyCalculator calculator =
calculatorFactory.CreateAssessmentSectionAssemblyCalculator(AssemblyToolKernelFactory.Instance);
+ IEnumerable correlatedAssemblyResults = GetCorrelatedFailureMechanismAssemblyResults(assessmentSection);
+ IEnumerable uncorrelatedAssemblyResults = GetUncorrelatedFailureMechanismAssemblyResults(assessmentSection);
+ FailureMechanismContribution contribution = assessmentSection.FailureMechanismContribution;
+ return calculator.AssembleAssessmentSection(correlatedAssemblyResults, uncorrelatedAssemblyResults,
+ contribution.MaximumAllowableFloodingProbability, contribution.SignalFloodingProbability);
+ }
+ catch (AssessmentSectionAssemblyCalculatorException e)
+ {
+ throw new AssemblyException(e.Message, e);
+ }
+ catch (AssemblyException e)
+ {
+ throw new AssemblyException(Resources.AssessmentSectionAssemblyFactory_Error_while_assembling_failureMechanisms, e);
+ }
+ }
+
+ ///
+ /// Gets the correlated failure mechanism assembly results based on the input arguments.
+ ///
+ /// The to retrieve the correlated failure mechanism assembly
+ /// results for.
+ /// A collection of correlated failure mechanism assembly results.
+ /// Thrown when the results could not be assembled.
+ private static IEnumerable GetCorrelatedFailureMechanismAssemblyResults(AssessmentSection assessmentSection)
+ {
+ return new[]
+ {
+ GrassCoverErosionInwardsFailureMechanismAssemblyFactory.AssembleFailureMechanism(assessmentSection.GrassCoverErosionInwards, assessmentSection).AssemblyResult,
+ HeightStructuresFailureMechanismAssemblyFactory.AssembleFailureMechanism(assessmentSection.HeightStructures, assessmentSection).AssemblyResult
+ };
+ }
+
+ ///
+ /// Gets the uncorrelated failure mechanism assembly results based on the input arguments.
+ ///
+ /// The to retrieve the uncorrelated failure mechanism assembly
+ /// results for.
+ /// A collection of uncorrelated failure mechanism assembly results.
+ /// Thrown when the results could not be assembled.
+ private static IEnumerable GetUncorrelatedFailureMechanismAssemblyResults(AssessmentSection assessmentSection)
+ {
+ var failureMechanismAssemblies = new List();
+
+ AssembleWhenApplicable(failureMechanismAssemblies, assessmentSection.Piping, assessmentSection,
+ PipingFailureMechanismAssemblyFactory.AssembleFailureMechanism);
+ AssembleWhenApplicable(failureMechanismAssemblies, assessmentSection.MacroStabilityInwards, assessmentSection,
+ MacroStabilityInwardsFailureMechanismAssemblyFactory.AssembleFailureMechanism);
+ AssembleWhenApplicable(failureMechanismAssemblies, assessmentSection.ClosingStructures, assessmentSection,
+ ClosingStructuresFailureMechanismAssemblyFactory.AssembleFailureMechanism);
+ AssembleWhenApplicable(failureMechanismAssemblies, assessmentSection.StabilityPointStructures, assessmentSection,
+ StabilityPointStructuresFailureMechanismAssemblyFactory.AssembleFailureMechanism);
+ AssembleWhenApplicable(failureMechanismAssemblies, assessmentSection.GrassCoverErosionOutwards, assessmentSection,
+ GrassCoverErosionOutwardsFailureMechanismAssemblyFactory.AssembleFailureMechanism);
+ AssembleWhenApplicable(failureMechanismAssemblies, assessmentSection.StabilityStoneCover, assessmentSection,
+ StabilityStoneCoverFailureMechanismAssemblyFactory.AssembleFailureMechanism);
+ AssembleWhenApplicable(failureMechanismAssemblies, assessmentSection.WaveImpactAsphaltCover, assessmentSection,
+ WaveImpactAsphaltCoverFailureMechanismAssemblyFactory.AssembleFailureMechanism);
+ AssembleWhenApplicable(failureMechanismAssemblies, assessmentSection.DuneErosion, assessmentSection,
+ DuneErosionFailureMechanismAssemblyFactory.AssembleFailureMechanism);
+ AssembleWhenApplicable(failureMechanismAssemblies, assessmentSection.PipingStructure, assessmentSection,
+ PipingStructureFailureMechanismAssemblyFactory.AssembleFailureMechanism);
+ AssembleWhenApplicable(failureMechanismAssemblies, assessmentSection.GrassCoverSlipOffInwards, assessmentSection,
+ FailureMechanismAssemblyFactory.AssembleFailureMechanism);
+ AssembleWhenApplicable(failureMechanismAssemblies, assessmentSection.GrassCoverSlipOffOutwards, assessmentSection,
+ FailureMechanismAssemblyFactory.AssembleFailureMechanism);
+ AssembleWhenApplicable(failureMechanismAssemblies, assessmentSection.Microstability, assessmentSection,
+ FailureMechanismAssemblyFactory.AssembleFailureMechanism);
+ AssembleWhenApplicable(failureMechanismAssemblies, assessmentSection.WaterPressureAsphaltCover, assessmentSection,
+ FailureMechanismAssemblyFactory.AssembleFailureMechanism);
+
+ failureMechanismAssemblies.AddRange(assessmentSection.SpecificFailureMechanisms
+ .Where(fp => fp.InAssembly)
+ .Select(fp => FailureMechanismAssemblyFactory.AssembleFailureMechanism(fp, assessmentSection)
+ .AssemblyResult));
+
+ return failureMechanismAssemblies;
+ }
+
+ ///
+ /// Gets the assessment section assembly result without correlated failure mechanisms.
+ ///
+ /// The to retrieve the assessment section assembly results
+ /// for.
+ /// The assessment section assembly result.
+ /// Thrown when the result could not be assembled.
+ private static AssessmentSectionAssemblyResultWrapper AssembleAssessmentSectionWithoutCorrelatedFailureMechanisms(AssessmentSection assessmentSection)
+ {
+ try
+ {
+ IAssemblyToolCalculatorFactory calculatorFactory = AssemblyToolCalculatorFactory.Instance;
+ IAssessmentSectionAssemblyCalculator calculator =
+ calculatorFactory.CreateAssessmentSectionAssemblyCalculator(AssemblyToolKernelFactory.Instance);
+
IEnumerable assemblyResults = GetFailureMechanismAssemblyResults(assessmentSection);
FailureMechanismContribution contribution = assessmentSection.FailureMechanismContribution;
return calculator.AssembleAssessmentSection(assemblyResults, contribution.MaximumAllowableFloodingProbability, contribution.SignalFloodingProbability);
Index: Riskeer/Integration/test/Riskeer.Integration.Data.Test/Assembly/AssessmentSectionAssemblyFactoryTest.cs
===================================================================
diff -u -r01c40dbdf75bccae38a7728556afe2f8968f55c0 -raab1efad3517fa9f1eb65a9625e9bb1a131d8bc3
--- Riskeer/Integration/test/Riskeer.Integration.Data.Test/Assembly/AssessmentSectionAssemblyFactoryTest.cs (.../AssessmentSectionAssemblyFactoryTest.cs) (revision 01c40dbdf75bccae38a7728556afe2f8968f55c0)
+++ Riskeer/Integration/test/Riskeer.Integration.Data.Test/Assembly/AssessmentSectionAssemblyFactoryTest.cs (.../AssessmentSectionAssemblyFactoryTest.cs) (revision aab1efad3517fa9f1eb65a9625e9bb1a131d8bc3)
@@ -42,8 +42,6 @@
[TestFixture]
public class AssessmentSectionAssemblyFactoryTest
{
- #region Assemble Assessment Section
-
[Test]
public void AssembleAssessmentSection_AssessmentSectionNull_ThrowsArgumentNullException()
{
@@ -55,11 +53,14 @@
Assert.AreEqual("assessmentSection", exception.ParamName);
}
+ #region Assemble Assessment Section
+
[Test]
- public void AssembleAssessmentSection_AssessmentSectionContainingFailureMechanismsWithRandomInAssemblyState_SetsInputOnCalculator()
+ public void AssembleAssessmentSection_AssessmentSectionWithFailureMechanismsCorrelatedFalseAndContainingFailureMechanismsWithRandomInAssemblyState_SetsInputOnCalculator()
{
// Setup
AssessmentSection assessmentSection = CreateAssessmentSectionContainingFailureMechanismsWithRandomInAssemblyState();
+ assessmentSection.AreFailureMechanismsCorrelated = false;
using (new AssemblyToolCalculatorFactoryConfig())
{
@@ -84,14 +85,143 @@
{
Assert.AreEqual(failureMechanismAssemblyCalculator.AssemblyResultOutput.AssemblyResult, failureMechanismProbability);
}
+
+ Assert.IsNull(assessmentSectionAssemblyCalculator.CorrelatedFailureMechanismProbabilitiesInput);
+ Assert.IsNull(assessmentSectionAssemblyCalculator.UncorrelatedFailureMechanismProbabilitiesInput);
}
}
[Test]
- public void AssembleAssessmentSection_AssemblyRan_ReturnsOutput()
+ public void AssembleAssessmentSection_AssessmentSectionWithCorrelatedFailureMechanismsTrueAndAllCorrelatedFailureMechanismsInAssembly_SetsInputOnCalculator()
{
// Setup
+ AssessmentSection assessmentSection = CreateAssessmentSectionContainingFailureMechanismsWithRandomInAssemblyState();
+ assessmentSection.GrassCoverErosionInwards.InAssembly = true;
+ assessmentSection.HeightStructures.InAssembly = true;
+
+ using (new AssemblyToolCalculatorFactoryConfig())
+ {
+ var calculatorFactory = (TestAssemblyToolCalculatorFactory) AssemblyToolCalculatorFactory.Instance;
+ FailureMechanismAssemblyCalculatorStub failureMechanismAssemblyCalculator = calculatorFactory.LastCreatedFailureMechanismAssemblyCalculator;
+ AssessmentSectionAssemblyCalculatorStub assessmentSectionAssemblyCalculator = calculatorFactory.LastCreatedAssessmentSectionAssemblyCalculator;
+
+ // Call
+ AssessmentSectionAssemblyFactory.AssembleAssessmentSection(assessmentSection);
+
+ // Assert
+ FailureMechanismContribution contribution = assessmentSection.FailureMechanismContribution;
+ Assert.AreEqual(contribution.SignalFloodingProbability, assessmentSectionAssemblyCalculator.SignalFloodingProbability);
+ Assert.AreEqual(contribution.MaximumAllowableFloodingProbability, assessmentSectionAssemblyCalculator.MaximumAllowableFloodingProbabilityInput);
+
+ const int expectedNrOfCorrelatedProbabilities = 2;
+ IEnumerable correlatedFailureMechanismProbabilitiesInput = assessmentSectionAssemblyCalculator.CorrelatedFailureMechanismProbabilitiesInput;
+ Assert.AreEqual(expectedNrOfCorrelatedProbabilities, correlatedFailureMechanismProbabilitiesInput.Count());
+ foreach (double failureMechanismProbability in correlatedFailureMechanismProbabilitiesInput)
+ {
+ Assert.AreEqual(failureMechanismAssemblyCalculator.AssemblyResultOutput.AssemblyResult, failureMechanismProbability);
+ }
+
+ int expectedNrOfUncorrelatedProbabilities = assessmentSection.GetFailureMechanisms()
+ .Concat(assessmentSection.SpecificFailureMechanisms)
+ .Count(fp => fp != assessmentSection.HeightStructures && fp != assessmentSection.GrassCoverErosionInwards && fp.InAssembly);
+ IEnumerable uncorrelatedFailureMechanismProbabilitiesInput = assessmentSectionAssemblyCalculator.UncorrelatedFailureMechanismProbabilitiesInput;
+ Assert.AreEqual(expectedNrOfUncorrelatedProbabilities, uncorrelatedFailureMechanismProbabilitiesInput.Count());
+ foreach (double failureMechanismProbability in uncorrelatedFailureMechanismProbabilitiesInput)
+ {
+ Assert.AreEqual(failureMechanismAssemblyCalculator.AssemblyResultOutput.AssemblyResult, failureMechanismProbability);
+ }
+
+ Assert.IsNull(assessmentSectionAssemblyCalculator.FailureMechanismProbabilitiesInput);
+ }
+ }
+
+ [Test]
+ public void AssembleAssessmentSection_AssessmentSectionWithCorrelatedFailureMechanismsFalseAndAllCorrelatedFailureMechanismsInAssembly_SetsInputOnCalculator()
+ {
+ // Setup
+ AssessmentSection assessmentSection = CreateAssessmentSectionContainingFailureMechanismsWithRandomInAssemblyState();
+ assessmentSection.AreFailureMechanismsCorrelated = false;
+ assessmentSection.GrassCoverErosionInwards.InAssembly = true;
+ assessmentSection.HeightStructures.InAssembly = true;
+
+ using (new AssemblyToolCalculatorFactoryConfig())
+ {
+ var calculatorFactory = (TestAssemblyToolCalculatorFactory) AssemblyToolCalculatorFactory.Instance;
+ FailureMechanismAssemblyCalculatorStub failureMechanismAssemblyCalculator = calculatorFactory.LastCreatedFailureMechanismAssemblyCalculator;
+ AssessmentSectionAssemblyCalculatorStub assessmentSectionAssemblyCalculator = calculatorFactory.LastCreatedAssessmentSectionAssemblyCalculator;
+
+ // Call
+ AssessmentSectionAssemblyFactory.AssembleAssessmentSection(assessmentSection);
+
+ // Assert
+ FailureMechanismContribution contribution = assessmentSection.FailureMechanismContribution;
+ Assert.AreEqual(contribution.SignalFloodingProbability, assessmentSectionAssemblyCalculator.SignalFloodingProbability);
+ Assert.AreEqual(contribution.MaximumAllowableFloodingProbability, assessmentSectionAssemblyCalculator.MaximumAllowableFloodingProbabilityInput);
+
+ int expectedNrOfProbabilities = assessmentSection.GetFailureMechanisms()
+ .Concat(assessmentSection.SpecificFailureMechanisms)
+ .Count(fp => fp.InAssembly);
+ IEnumerable calculatorInput = assessmentSectionAssemblyCalculator.FailureMechanismProbabilitiesInput;
+ Assert.AreEqual(expectedNrOfProbabilities, calculatorInput.Count());
+ foreach (double failureMechanismProbability in calculatorInput)
+ {
+ Assert.AreEqual(failureMechanismAssemblyCalculator.AssemblyResultOutput.AssemblyResult, failureMechanismProbability);
+ }
+
+ Assert.IsNull(assessmentSectionAssemblyCalculator.CorrelatedFailureMechanismProbabilitiesInput);
+ Assert.IsNull(assessmentSectionAssemblyCalculator.UncorrelatedFailureMechanismProbabilitiesInput);
+ }
+ }
+
+ [Test]
+ [TestCase(false, false)]
+ [TestCase(true, false)]
+ [TestCase(false, true)]
+ public void AssembleAssessmentSection_AssessmentSectionWithCorrelatedFailureMechanismsTrueAndVariousCorrelatedFailureMechanismsNotInAssembly_SetsInputOnCalculator(
+ bool grassCoverErosionInwardsInAssembly, bool heightStructuresInAssembly)
+ {
+ // Setup
+ AssessmentSection assessmentSection = CreateAssessmentSectionContainingFailureMechanismsWithRandomInAssemblyState();
+ assessmentSection.GrassCoverErosionInwards.InAssembly = grassCoverErosionInwardsInAssembly;
+ assessmentSection.HeightStructures.InAssembly = heightStructuresInAssembly;
+
+ using (new AssemblyToolCalculatorFactoryConfig())
+ {
+ var calculatorFactory = (TestAssemblyToolCalculatorFactory) AssemblyToolCalculatorFactory.Instance;
+ FailureMechanismAssemblyCalculatorStub failureMechanismAssemblyCalculator = calculatorFactory.LastCreatedFailureMechanismAssemblyCalculator;
+ AssessmentSectionAssemblyCalculatorStub assessmentSectionAssemblyCalculator = calculatorFactory.LastCreatedAssessmentSectionAssemblyCalculator;
+
+ // Call
+ AssessmentSectionAssemblyFactory.AssembleAssessmentSection(assessmentSection);
+
+ // Assert
+ FailureMechanismContribution contribution = assessmentSection.FailureMechanismContribution;
+ Assert.AreEqual(contribution.SignalFloodingProbability, assessmentSectionAssemblyCalculator.SignalFloodingProbability);
+ Assert.AreEqual(contribution.MaximumAllowableFloodingProbability, assessmentSectionAssemblyCalculator.MaximumAllowableFloodingProbabilityInput);
+
+ int expectedNrOfProbabilities = assessmentSection.GetFailureMechanisms()
+ .Concat(assessmentSection.SpecificFailureMechanisms)
+ .Count(fp => fp.InAssembly);
+ IEnumerable calculatorInput = assessmentSectionAssemblyCalculator.FailureMechanismProbabilitiesInput;
+ Assert.AreEqual(expectedNrOfProbabilities, calculatorInput.Count());
+ foreach (double failureMechanismProbability in calculatorInput)
+ {
+ Assert.AreEqual(failureMechanismAssemblyCalculator.AssemblyResultOutput.AssemblyResult, failureMechanismProbability);
+ }
+
+ Assert.IsNull(assessmentSectionAssemblyCalculator.CorrelatedFailureMechanismProbabilitiesInput);
+ Assert.IsNull(assessmentSectionAssemblyCalculator.UncorrelatedFailureMechanismProbabilitiesInput);
+ }
+ }
+
+ [Test]
+ [TestCase(true)]
+ [TestCase(false)]
+ public void AssembleAssessmentSection_AssemblyRan_ReturnsOutput(bool areFailureMechanismsCorrelated)
+ {
+ // Setup
AssessmentSection assessmentSection = CreateAssessmentSectionContainingFailureMechanismsWithInAssemblyTrue();
+ assessmentSection.AreFailureMechanismsCorrelated = areFailureMechanismsCorrelated;
using (new AssemblyToolCalculatorFactoryConfig())
{
@@ -107,17 +237,22 @@
}
[Test]
- public void AssembleAssessmentSection_CalculatorThrowsException_ThrowsAssemblyException()
+ [TestCase(true)]
+ [TestCase(false)]
+ public void AssembleAssessmentSection_CalculatorThrowsException_ThrowsAssemblyException(bool areFailureMechanismsCorrelated)
{
// Setup
+ AssessmentSection assessmentSection = CreateAssessmentSectionContainingFailureMechanismsWithInAssemblyTrue();
+ assessmentSection.AreFailureMechanismsCorrelated = areFailureMechanismsCorrelated;
+
using (new AssemblyToolCalculatorFactoryConfig())
{
var calculatorFactory = (TestAssemblyToolCalculatorFactory) AssemblyToolCalculatorFactory.Instance;
AssessmentSectionAssemblyCalculatorStub calculator = calculatorFactory.LastCreatedAssessmentSectionAssemblyCalculator;
calculator.ThrowExceptionOnCalculate = true;
// Call
- void Call() => AssessmentSectionAssemblyFactory.AssembleAssessmentSection(CreateAssessmentSectionContainingFailureMechanismsWithInAssemblyTrue());
+ void Call() => AssessmentSectionAssemblyFactory.AssembleAssessmentSection(assessmentSection);
// Assert
var exception = Assert.Throws(Call);
@@ -128,17 +263,22 @@
}
[Test]
- public void AssembleAssessmentSection_FailureMechanismCalculatorThrowsException_ThrowsAssemblyException()
+ [TestCase(true)]
+ [TestCase(false)]
+ public void AssembleAssessmentSection_FailureMechanismCalculatorThrowsException_ThrowsAssemblyException(bool areFailureMechanismsCorrelated)
{
// Setup
+ AssessmentSection assessmentSection = CreateAssessmentSectionContainingFailureMechanismsWithInAssemblyTrue();
+ assessmentSection.AreFailureMechanismsCorrelated = areFailureMechanismsCorrelated;
+
using (new AssemblyToolCalculatorFactoryConfig())
{
var calculatorFactory = (TestAssemblyToolCalculatorFactory) AssemblyToolCalculatorFactory.Instance;
FailureMechanismAssemblyCalculatorStub calculator = calculatorFactory.LastCreatedFailureMechanismAssemblyCalculator;
calculator.ThrowExceptionOnCalculate = true;
// Call
- void Call() => AssessmentSectionAssemblyFactory.AssembleAssessmentSection(CreateAssessmentSectionContainingFailureMechanismsWithInAssemblyTrue());
+ void Call() => AssessmentSectionAssemblyFactory.AssembleAssessmentSection(assessmentSection);
// Assert
var exception = Assert.Throws(Call);