Index: Ringtoets/WaveImpactAsphaltCover/src/Ringtoets.WaveImpactAsphaltCover.Data/WaveImpactAsphaltCoverFailureMechanismSectionResultAssemblyFactory.cs =================================================================== diff -u -r85312e2d99d2624f57cbd1ce49c2a3122b00e5cf -ra0fa069ee0cffe79be5b43e56fc515472e2e8e24 --- Ringtoets/WaveImpactAsphaltCover/src/Ringtoets.WaveImpactAsphaltCover.Data/WaveImpactAsphaltCoverFailureMechanismSectionResultAssemblyFactory.cs (.../WaveImpactAsphaltCoverFailureMechanismSectionResultAssemblyFactory.cs) (revision 85312e2d99d2624f57cbd1ce49c2a3122b00e5cf) +++ Ringtoets/WaveImpactAsphaltCover/src/Ringtoets.WaveImpactAsphaltCover.Data/WaveImpactAsphaltCoverFailureMechanismSectionResultAssemblyFactory.cs (.../WaveImpactAsphaltCoverFailureMechanismSectionResultAssemblyFactory.cs) (revision a0fa069ee0cffe79be5b43e56fc515472e2e8e24) @@ -20,6 +20,7 @@ // All rights reserved. using System; +using System.Collections.Generic; using Ringtoets.AssemblyTool.Data; using Ringtoets.AssemblyTool.KernelWrapper.Calculators; using Ringtoets.AssemblyTool.KernelWrapper.Calculators.Assembly; @@ -168,5 +169,56 @@ throw new AssemblyException(e.Message, e); } } + + /// + /// Assembles the failure mechanism assembly. + /// + /// The failure mechanism section results to + /// get the assembly for. + /// Indicator whether the manual assembly should be used in the assembly. + /// A . + /// Thrown when + /// is null. + /// Thrown when the + /// could not be created. + public static FailureMechanismAssemblyCategoryGroup AssembleFailureMechanism( + IEnumerable failureMechanismSectionResults, + bool considerManualAssembly = true) + { + if (failureMechanismSectionResults == null) + { + throw new ArgumentNullException(nameof(failureMechanismSectionResults)); + } + + IAssemblyToolCalculatorFactory calculatorFactory = AssemblyToolCalculatorFactory.Instance; + IFailureMechanismSectionAssemblyCalculator sectionCalculator = + calculatorFactory.CreateFailureMechanismSectionAssemblyCalculator(AssemblyToolKernelFactory.Instance); + + var sectionAssemblies = new List(); + + try + { + foreach (WaveImpactAsphaltCoverFailureMechanismSectionResult sectionResult in failureMechanismSectionResults) + { + if (sectionResult.UseManualAssemblyCategoryGroup && considerManualAssembly) + { + sectionAssemblies.Add(sectionCalculator.AssembleTailorMadeAssessment(sectionResult.ManualAssemblyCategoryGroup)); + } + else + { + sectionAssemblies.Add(AssembleCombinedAssessment(sectionResult)); + } + } + + IFailureMechanismAssemblyCalculator calculator = + calculatorFactory.CreateFailureMechanismAssemblyCalculator(AssemblyToolKernelFactory.Instance); + + return calculator.AssembleFailureMechanism(sectionAssemblies); + } + catch (Exception e) when (e is FailureMechanismAssemblyCalculatorException || e is FailureMechanismSectionAssemblyCalculatorException) + { + throw new AssemblyException(e.Message, e); + } + } } } \ No newline at end of file Index: Ringtoets/WaveImpactAsphaltCover/test/Ringtoets.WaveImpactAsphaltCover.Data.Test/WaveImpactAsphaltCoverFailureMechanismSectionResultAssemblyFactoryTest.cs =================================================================== diff -u -rdfe89063627bf9208166e87a3da54fbbaeb9bda0 -ra0fa069ee0cffe79be5b43e56fc515472e2e8e24 --- Ringtoets/WaveImpactAsphaltCover/test/Ringtoets.WaveImpactAsphaltCover.Data.Test/WaveImpactAsphaltCoverFailureMechanismSectionResultAssemblyFactoryTest.cs (.../WaveImpactAsphaltCoverFailureMechanismSectionResultAssemblyFactoryTest.cs) (revision dfe89063627bf9208166e87a3da54fbbaeb9bda0) +++ Ringtoets/WaveImpactAsphaltCover/test/Ringtoets.WaveImpactAsphaltCover.Data.Test/WaveImpactAsphaltCoverFailureMechanismSectionResultAssemblyFactoryTest.cs (.../WaveImpactAsphaltCoverFailureMechanismSectionResultAssemblyFactoryTest.cs) (revision a0fa069ee0cffe79be5b43e56fc515472e2e8e24) @@ -20,6 +20,7 @@ // All rights reserved. using System; +using System.Linq; using Core.Common.TestUtil; using NUnit.Framework; using Ringtoets.AssemblyTool.Data; @@ -387,5 +388,166 @@ } #endregion + + #region Failure Mechanism Assembly + + [Test] + public void AssembleFailureMechanism_FailureMechanismSectionResultsNull_ThrowsArgumentNullException() + { + // Call + TestDelegate call = () => WaveImpactAsphaltCoverFailureMechanismSectionResultAssemblyFactory.AssembleFailureMechanism(null); + + // Assert + var exception = Assert.Throws(call); + Assert.AreEqual("failureMechanismSectionResults", exception.ParamName); + } + + [Test] + public void AssembleFailureMechanism_WithoutManualInput_SetsInputOnCalculator() + { + // Setup + var sectionResults = new[] + { + new WaveImpactAsphaltCoverFailureMechanismSectionResult(FailureMechanismSectionTestFactory.CreateFailureMechanismSection()) + }; + + using (new AssemblyToolCalculatorFactoryConfig()) + { + var calculatorFactory = (TestAssemblyToolCalculatorFactory) AssemblyToolCalculatorFactory.Instance; + FailureMechanismAssemblyCalculatorStub calculator = calculatorFactory.LastCreatedFailureMechanismAssemblyCalculator; + + // Call + WaveImpactAsphaltCoverFailureMechanismSectionResultAssemblyFactory.AssembleFailureMechanism(sectionResults); + + // Assert + FailureMechanismSectionAssemblyCategoryGroup assemblyCategory = + WaveImpactAsphaltCoverFailureMechanismSectionResultAssemblyFactory.AssembleCombinedAssessment(sectionResults.Single()); + Assert.AreEqual(assemblyCategory, calculator.FailureMechanismSectionCategories.Single()); + } + } + + [Test] + public void AssembleFailureMechanism_WithManualInputConsiderManualAssemblyTrue_SetsInputOnCalculator() + { + // Setup + var sectionResults = new[] + { + new WaveImpactAsphaltCoverFailureMechanismSectionResult(FailureMechanismSectionTestFactory.CreateFailureMechanismSection()) + { + UseManualAssemblyCategoryGroup = true, + ManualAssemblyCategoryGroup = new Random(39).NextEnumValue() + } + }; + + using (new AssemblyToolCalculatorFactoryConfig()) + { + var calculatorFactory = (TestAssemblyToolCalculatorFactory) AssemblyToolCalculatorFactory.Instance; + FailureMechanismAssemblyCalculatorStub calculator = calculatorFactory.LastCreatedFailureMechanismAssemblyCalculator; + + // Call + WaveImpactAsphaltCoverFailureMechanismSectionResultAssemblyFactory.AssembleFailureMechanism(sectionResults); + + // Assert + FailureMechanismSectionAssemblyCategoryGroup assemblyCategory = + WaveImpactAsphaltCoverFailureMechanismSectionResultAssemblyFactory.AssembleTailorMadeAssessment(sectionResults.Single()); + Assert.AreEqual(assemblyCategory, calculator.FailureMechanismSectionCategories.Single()); + } + } + + [Test] + public void AssembleFailureMechanism_WithManualInputConsiderManualAssemblyFalse_SetsInputOnCalculator() + { + // Setup + var sectionResults = new[] + { + new WaveImpactAsphaltCoverFailureMechanismSectionResult(FailureMechanismSectionTestFactory.CreateFailureMechanismSection()) + { + UseManualAssemblyCategoryGroup = true, + ManualAssemblyCategoryGroup = new Random(39).NextEnumValue() + } + }; + + using (new AssemblyToolCalculatorFactoryConfig()) + { + var calculatorFactory = (TestAssemblyToolCalculatorFactory) AssemblyToolCalculatorFactory.Instance; + FailureMechanismAssemblyCalculatorStub calculator = calculatorFactory.LastCreatedFailureMechanismAssemblyCalculator; + + // Call + WaveImpactAsphaltCoverFailureMechanismSectionResultAssemblyFactory.AssembleFailureMechanism(sectionResults, false); + + // Assert + FailureMechanismSectionAssemblyCategoryGroup assemblyCategory = + WaveImpactAsphaltCoverFailureMechanismSectionResultAssemblyFactory.AssembleCombinedAssessment(sectionResults.Single()); + Assert.AreEqual(assemblyCategory, calculator.FailureMechanismSectionCategories.Single()); + } + } + + [Test] + public void AssembleFailureMechanism_AssemblyRan_ReturnsOutput() + { + // Setup + using (new AssemblyToolCalculatorFactoryConfig()) + { + var calculatorFactory = (TestAssemblyToolCalculatorFactory) AssemblyToolCalculatorFactory.Instance; + FailureMechanismAssemblyCalculatorStub calculator = calculatorFactory.LastCreatedFailureMechanismAssemblyCalculator; + + // Call + FailureMechanismAssemblyCategoryGroup actualOutput = + WaveImpactAsphaltCoverFailureMechanismSectionResultAssemblyFactory.AssembleFailureMechanism( + Enumerable.Empty()); + + // Assert + Assert.AreEqual(calculator.FailureMechanismAssemblyCategoryGroupOutput, actualOutput); + } + } + + [Test] + public void AssembleFailureMechanism_FailureMechanismCalculatorThrowsException_ThrowsAssemblyException() + { + // Setup + using (new AssemblyToolCalculatorFactoryConfig()) + { + var calculatorfactory = (TestAssemblyToolCalculatorFactory) AssemblyToolCalculatorFactory.Instance; + FailureMechanismAssemblyCalculatorStub calculator = calculatorfactory.LastCreatedFailureMechanismAssemblyCalculator; + calculator.ThrowExceptionOnCalculate = true; + + // Call + TestDelegate call = () => WaveImpactAsphaltCoverFailureMechanismSectionResultAssemblyFactory.AssembleFailureMechanism( + Enumerable.Empty()); + + // Assert + var exception = Assert.Throws(call); + Exception innerException = exception.InnerException; + Assert.IsInstanceOf(innerException); + Assert.AreEqual(innerException.Message, exception.Message); + } + } + + [Test] + public void AssembleFailureMechanism_FailureMechanismSectionCalculatorThrowsException_ThrowsAssemblyException() + { + // Setup + using (new AssemblyToolCalculatorFactoryConfig()) + { + var calculatorfactory = (TestAssemblyToolCalculatorFactory) AssemblyToolCalculatorFactory.Instance; + FailureMechanismSectionAssemblyCalculatorStub calculator = calculatorfactory.LastCreatedFailureMechanismSectionAssemblyCalculator; + calculator.ThrowExceptionOnCalculateCombinedAssembly = true; + + // Call + TestDelegate call = () => WaveImpactAsphaltCoverFailureMechanismSectionResultAssemblyFactory.AssembleFailureMechanism( + new[] + { + new WaveImpactAsphaltCoverFailureMechanismSectionResult(FailureMechanismSectionTestFactory.CreateFailureMechanismSection()) + }); + + // Assert + var exception = Assert.Throws(call); + Exception innerException = exception.InnerException; + Assert.IsInstanceOf(innerException); + Assert.AreEqual(innerException.Message, exception.Message); + } + } + + #endregion } } \ No newline at end of file