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);