Index: Ringtoets/AssemblyTool/src/Ringtoets.AssemblyTool.KernelWrapper/Calculators/Assembly/FailureMechanismSectionAssemblyCalculator.cs =================================================================== diff -u -r2e324b133452743296fdec90f1e80af557c23c39 -r9ebd34ca30a20d1b480dd1c19df8a99f23ecbf28 --- Ringtoets/AssemblyTool/src/Ringtoets.AssemblyTool.KernelWrapper/Calculators/Assembly/FailureMechanismSectionAssemblyCalculator.cs (.../FailureMechanismSectionAssemblyCalculator.cs) (revision 2e324b133452743296fdec90f1e80af557c23c39) +++ Ringtoets/AssemblyTool/src/Ringtoets.AssemblyTool.KernelWrapper/Calculators/Assembly/FailureMechanismSectionAssemblyCalculator.cs (.../FailureMechanismSectionAssemblyCalculator.cs) (revision 9ebd34ca30a20d1b480dd1c19df8a99f23ecbf28) @@ -145,7 +145,9 @@ public FailureMechanismSectionAssembly AssembleTailorMadeAssessment(TailorMadeAssessmentResultType tailorMadeAssessmentResult, double probability, IEnumerable categories) { - throw new NotImplementedException(); + return FailureMechanismSectionAssemblyCreator.Create(new FailureMechanismSectionAssemblyCategoryResult( + FailureMechanismSectionCategoryGroup.VIIv, + new Probability(probability))); } } } \ No newline at end of file Index: Ringtoets/AssemblyTool/test/Ringtoets.AssemblyTool.KernelWrapper.Test/Calculators/Assembly/FailureMechanismSectionAssemblyCalculatorTest.cs =================================================================== diff -u -r5804285815fe6816e99dc8c1b4c86bd05752edfb -r9ebd34ca30a20d1b480dd1c19df8a99f23ecbf28 --- Ringtoets/AssemblyTool/test/Ringtoets.AssemblyTool.KernelWrapper.Test/Calculators/Assembly/FailureMechanismSectionAssemblyCalculatorTest.cs (.../FailureMechanismSectionAssemblyCalculatorTest.cs) (revision 5804285815fe6816e99dc8c1b4c86bd05752edfb) +++ Ringtoets/AssemblyTool/test/Ringtoets.AssemblyTool.KernelWrapper.Test/Calculators/Assembly/FailureMechanismSectionAssemblyCalculatorTest.cs (.../FailureMechanismSectionAssemblyCalculatorTest.cs) (revision 9ebd34ca30a20d1b480dd1c19df8a99f23ecbf28) @@ -68,6 +68,39 @@ Assert.AreEqual("factory", exception.ParamName); } + #region Tailor Made Assessment + + [Test] + public void AssembleTailorMadeAssessmentWithResult_Always_OutputCorrectlyReturnedByCalculator() + { + // Setup + var random = new Random(39); + double probability = random.NextDouble(); + var categories = new[] + { + new FailureMechanismSectionAssemblyCategory(random.NextDouble(0.0, 0.5), + random.NextDouble(0.6, 1.0), + FailureMechanismSectionAssemblyCategoryGroup.IIv) + }; + + using (new AssemblyToolKernelFactoryConfig()) + { + var factory = (TestAssemblyToolKernelFactory) AssemblyToolKernelFactory.Instance; + var calculator = new FailureMechanismSectionAssemblyCalculator(factory); + + // Call + FailureMechanismSectionAssembly assembly = calculator.AssembleTailorMadeAssessment(random.NextEnumValue(), + probability, + categories); + + // Assert + Assert.AreEqual(FailureMechanismSectionAssemblyCategoryGroup.VIIv, assembly.Group); + Assert.AreEqual(probability, assembly.Probability); + } + } + + #endregion + private static void AssertCalculatorOutput(CalculationOutput original, FailureMechanismSectionAssembly actual) { Assert.AreEqual(GetGroup(original.Result.CategoryGroup), actual.Group); Index: Ringtoets/Integration/src/Ringtoets.Integration.Data/StandAlone/AssemblyFactories/MacroStabilityOutwardsFailureMechanismSectionResultAssemblyFactory.cs =================================================================== diff -u -r5804285815fe6816e99dc8c1b4c86bd05752edfb -r9ebd34ca30a20d1b480dd1c19df8a99f23ecbf28 --- Ringtoets/Integration/src/Ringtoets.Integration.Data/StandAlone/AssemblyFactories/MacroStabilityOutwardsFailureMechanismSectionResultAssemblyFactory.cs (.../MacroStabilityOutwardsFailureMechanismSectionResultAssemblyFactory.cs) (revision 5804285815fe6816e99dc8c1b4c86bd05752edfb) +++ Ringtoets/Integration/src/Ringtoets.Integration.Data/StandAlone/AssemblyFactories/MacroStabilityOutwardsFailureMechanismSectionResultAssemblyFactory.cs (.../MacroStabilityOutwardsFailureMechanismSectionResultAssemblyFactory.cs) (revision 9ebd34ca30a20d1b480dd1c19df8a99f23ecbf28) @@ -125,5 +125,61 @@ throw new AssemblyException(e.Message, e); } } + + /// + /// Assembles the tailor made assessment result. + /// + /// The failure mechanism section result to + /// assemble the tailor made assembly for. + /// The failure mechanism belonging to this section. + /// The belonging to this section. + /// A . + /// Thrown when any parameter is null. + /// Thrown when the + /// could not be created. + public static FailureMechanismSectionAssembly AssembleTailorMadeAssembly( + MacroStabilityOutwardsFailureMechanismSectionResult failureMechanismSectionResult, + MacroStabilityOutwardsFailureMechanism failureMechanism, + IAssessmentSection assessmentSection) + { + if (failureMechanismSectionResult == null) + { + throw new ArgumentNullException(nameof(failureMechanismSectionResult)); + } + + if (failureMechanism == null) + { + throw new ArgumentNullException(nameof(failureMechanism)); + } + + if (assessmentSection == null) + { + throw new ArgumentNullException(nameof(assessmentSection)); + } + + IAssemblyToolCalculatorFactory calculatorFactory = AssemblyToolCalculatorFactory.Instance; + IFailureMechanismSectionAssemblyCalculator calculator = + calculatorFactory.CreateFailureMechanismSectionAssemblyCalculator(AssemblyToolKernelFactory.Instance); + + try + { + IEnumerable categories = + AssemblyToolCategoriesFactory.CreateFailureMechanismSectionAssemblyCategories( + assessmentSection.FailureMechanismContribution.SignalingNorm, + assessmentSection.FailureMechanismContribution.LowerLimitNorm, + failureMechanism.Contribution, + failureMechanism.MacroStabilityOutwardsProbabilityAssessmentInput.GetN( + failureMechanism.MacroStabilityOutwardsProbabilityAssessmentInput.SectionLength)); + + return calculator.AssembleTailorMadeAssessment( + failureMechanismSectionResult.TailorMadeAssessmentResult, + failureMechanismSectionResult.AssessmentLayerThree, + categories); + } + catch (FailureMechanismSectionAssemblyCalculatorException e) + { + throw new AssemblyException(e.Message, e); + } + } } } \ No newline at end of file Index: Ringtoets/Integration/src/Ringtoets.Integration.Data/StandAlone/SectionResults/MacroStabilityOutwardsFailureMechanismSectionResult.cs =================================================================== diff -u -r5804285815fe6816e99dc8c1b4c86bd05752edfb -r9ebd34ca30a20d1b480dd1c19df8a99f23ecbf28 --- Ringtoets/Integration/src/Ringtoets.Integration.Data/StandAlone/SectionResults/MacroStabilityOutwardsFailureMechanismSectionResult.cs (.../MacroStabilityOutwardsFailureMechanismSectionResult.cs) (revision 5804285815fe6816e99dc8c1b4c86bd05752edfb) +++ Ringtoets/Integration/src/Ringtoets.Integration.Data/StandAlone/SectionResults/MacroStabilityOutwardsFailureMechanismSectionResult.cs (.../MacroStabilityOutwardsFailureMechanismSectionResult.cs) (revision 9ebd34ca30a20d1b480dd1c19df8a99f23ecbf28) @@ -48,6 +48,7 @@ { SimpleAssessmentResult = SimpleAssessmentResultType.None; DetailedAssessmentResult = DetailedAssessmentResultType.Probability; + TailorMadeAssessmentResult = TailorMadeAssessmentResultType.None; AssessmentLayerTwoA = double.NaN; AssessmentLayerThree = RoundedDouble.NaN; } @@ -63,6 +64,11 @@ public DetailedAssessmentResultType DetailedAssessmentResult { get; set; } /// + /// Gets or sets the tailor made assessment result. + /// + public TailorMadeAssessmentResultType TailorMadeAssessmentResult { get; set; } + + /// /// Gets or sets the value for the detailed assessment of safety per failure mechanism section as a probability. /// /// Thrown when is not in range [0,1]. Index: Ringtoets/Integration/test/Ringtoets.Integration.Data.Test/StandAlone/AssemblyFactories/MacroStabilityOutwardsFailureMechanismSectionResultAssemblyFactoryTest.cs =================================================================== diff -u -r5804285815fe6816e99dc8c1b4c86bd05752edfb -r9ebd34ca30a20d1b480dd1c19df8a99f23ecbf28 --- Ringtoets/Integration/test/Ringtoets.Integration.Data.Test/StandAlone/AssemblyFactories/MacroStabilityOutwardsFailureMechanismSectionResultAssemblyFactoryTest.cs (.../MacroStabilityOutwardsFailureMechanismSectionResultAssemblyFactoryTest.cs) (revision 5804285815fe6816e99dc8c1b4c86bd05752edfb) +++ Ringtoets/Integration/test/Ringtoets.Integration.Data.Test/StandAlone/AssemblyFactories/MacroStabilityOutwardsFailureMechanismSectionResultAssemblyFactoryTest.cs (.../MacroStabilityOutwardsFailureMechanismSectionResultAssemblyFactoryTest.cs) (revision 9ebd34ca30a20d1b480dd1c19df8a99f23ecbf28) @@ -29,7 +29,6 @@ using Ringtoets.AssemblyTool.KernelWrapper.TestUtil.Calculators; using Ringtoets.AssemblyTool.KernelWrapper.TestUtil.Calculators.Assembly; using Ringtoets.AssemblyTool.KernelWrapper.TestUtil.Calculators.Categories; -using Ringtoets.AssemblyTool.KernelWrapper.TestUtil.Kernels; using Ringtoets.Common.Data.AssessmentSection; using Ringtoets.Common.Data.Exceptions; using Ringtoets.Common.Data.FailureMechanism; @@ -210,8 +209,9 @@ assessmentSection); // Assert - Assert.AreEqual(sectionResult.AssessmentLayerTwoA, - calculator.DetailedAssessmentProbabilityInput); + Assert.AreEqual(sectionResult.AssessmentLayerTwoA, calculator.DetailedAssessmentProbabilityInput); + Assert.AreEqual(sectionResult.DetailedAssessmentResult, calculator.DetailedAssessmentResultInput); + Assert.AreEqual(assessmentSection.FailureMechanismContribution.SignalingNorm, categoryCalculator.SignalingNorm); Assert.AreEqual(assessmentSection.FailureMechanismContribution.LowerLimitNorm, categoryCalculator.LowerLimitNorm); Assert.AreEqual(failureMechanism.Contribution, categoryCalculator.ProbabilityDistributionFactor); @@ -285,5 +285,162 @@ } #endregion + + #region Tailor Made Assessment + + [Test] + public void AssembleTailorMadeAssembly_FailureMechanismSectionResultNull_ThrowsArgumentNullException() + { + // Setup + var mocks = new MockRepository(); + var assessmentSection = mocks.Stub(); + mocks.ReplayAll(); + + // Call + TestDelegate call = () => MacroStabilityOutwardsFailureMechanismSectionResultAssemblyFactory.AssembleTailorMadeAssembly( + null, + new MacroStabilityOutwardsFailureMechanism(), + assessmentSection); + + // Assert + var exception = Assert.Throws(call); + Assert.AreEqual("failureMechanismSectionResult", exception.ParamName); + mocks.VerifyAll(); + } + + [Test] + public void AssembleTailorMadeAssembly_FailureMechanismNull_ThrowsArgumentNullException() + { + // Setup + var mocks = new MockRepository(); + var assessmentSection = mocks.Stub(); + mocks.ReplayAll(); + + // Call + TestDelegate call = () => MacroStabilityOutwardsFailureMechanismSectionResultAssemblyFactory.AssembleTailorMadeAssembly( + new MacroStabilityOutwardsFailureMechanismSectionResult(FailureMechanismSectionTestFactory.CreateFailureMechanismSection()), + null, + assessmentSection); + + // Assert + var exception = Assert.Throws(call); + Assert.AreEqual("failureMechanism", exception.ParamName); + mocks.VerifyAll(); + } + + [Test] + public void AssembleTailorMadeAssembly_AssessmentSectionNull_ThrowsArgumentNullException() + { + // Call + TestDelegate call = () => MacroStabilityOutwardsFailureMechanismSectionResultAssemblyFactory.AssembleTailorMadeAssembly( + new MacroStabilityOutwardsFailureMechanismSectionResult(FailureMechanismSectionTestFactory.CreateFailureMechanismSection()), + new MacroStabilityOutwardsFailureMechanism(), + null); + + // Assert + var exception = Assert.Throws(call); + Assert.AreEqual("assessmentSection", exception.ParamName); + } + + [Test] + public void AssembleTailorMadeAssembly_WithInput_SetsInputOnCalculator() + { + // Setup + var mocks = new MockRepository(); + var failureMechanism = new MacroStabilityOutwardsFailureMechanism(); + IAssessmentSection assessmentSection = AssessmentSectionHelper.CreateAssessmentSectionStub(failureMechanism, mocks); + mocks.ReplayAll(); + + var sectionResult = new MacroStabilityOutwardsFailureMechanismSectionResult(FailureMechanismSectionTestFactory.CreateFailureMechanismSection()); + + using (new AssemblyToolCalculatorFactoryConfig()) + { + var calculatorFactory = (TestAssemblyToolCalculatorFactory) AssemblyToolCalculatorFactory.Instance; + FailureMechanismSectionAssemblyCalculatorStub calculator = calculatorFactory.LastCreatedFailureMechanismSectionAssemblyCalculator; + AssemblyCategoriesCalculatorStub categoryCalculator = calculatorFactory.LastCreatedAssemblyCategoriesCalculator; + + // Call + MacroStabilityOutwardsFailureMechanismSectionResultAssemblyFactory.AssembleTailorMadeAssembly( + sectionResult, + failureMechanism, + assessmentSection); + + // Assert + Assert.AreEqual(sectionResult.AssessmentLayerThree, calculator.TailorMadeAssessmentProbabilityInput); + Assert.AreEqual(sectionResult.TailorMadeAssessmentResult, calculator.TailorMadeAssessmentResultInput); + + Assert.AreEqual(assessmentSection.FailureMechanismContribution.SignalingNorm, categoryCalculator.SignalingNorm); + Assert.AreEqual(assessmentSection.FailureMechanismContribution.LowerLimitNorm, categoryCalculator.LowerLimitNorm); + Assert.AreEqual(failureMechanism.Contribution, categoryCalculator.ProbabilityDistributionFactor); + Assert.AreEqual(failureMechanism.MacroStabilityOutwardsProbabilityAssessmentInput.GetN( + failureMechanism.MacroStabilityOutwardsProbabilityAssessmentInput.SectionLength), categoryCalculator.N); + Assert.AreSame(categoryCalculator.FailureMechanismSectionCategoriesOutput, calculator.TailorMadeAssessmentCategoriesInput); + mocks.VerifyAll(); + } + } + + [Test] + public void AssembleTailorMadeAssembly_AssemblyRan_ReturnsOutput() + { + // Setup + var mocks = new MockRepository(); + var failureMechanism = new MacroStabilityOutwardsFailureMechanism(); + IAssessmentSection assessmentSection = AssessmentSectionHelper.CreateAssessmentSectionStub(failureMechanism, mocks); + mocks.ReplayAll(); + + var sectionResult = new MacroStabilityOutwardsFailureMechanismSectionResult(FailureMechanismSectionTestFactory.CreateFailureMechanismSection()); + + using (new AssemblyToolCalculatorFactoryConfig()) + { + var calculatorFactory = (TestAssemblyToolCalculatorFactory) AssemblyToolCalculatorFactory.Instance; + FailureMechanismSectionAssemblyCalculatorStub calculator = calculatorFactory.LastCreatedFailureMechanismSectionAssemblyCalculator; + + // Call + FailureMechanismSectionAssembly actualOutput = + MacroStabilityOutwardsFailureMechanismSectionResultAssemblyFactory.AssembleTailorMadeAssembly( + sectionResult, + failureMechanism, + assessmentSection); + + // Assert + FailureMechanismSectionAssembly calculatorOutput = calculator.TailorMadeAssessmentAssemblyOutput; + Assert.AreSame(calculatorOutput, actualOutput); + mocks.VerifyAll(); + } + } + + [Test] + public void AssembleTailorMadeAssembly_CalculatorThrowsExceptions_ThrowsAssemblyException() + { + // Setup + var mocks = new MockRepository(); + var failureMechanism = new MacroStabilityOutwardsFailureMechanism(); + IAssessmentSection assessmentSection = AssessmentSectionHelper.CreateAssessmentSectionStub(failureMechanism, mocks); + mocks.ReplayAll(); + + var sectionResult = new MacroStabilityOutwardsFailureMechanismSectionResult(FailureMechanismSectionTestFactory.CreateFailureMechanismSection()); + + using (new AssemblyToolCalculatorFactoryConfig()) + { + var calculatorfactory = (TestAssemblyToolCalculatorFactory) AssemblyToolCalculatorFactory.Instance; + FailureMechanismSectionAssemblyCalculatorStub calculator = calculatorfactory.LastCreatedFailureMechanismSectionAssemblyCalculator; + calculator.ThrowExceptionOnCalculate = true; + + // Call + TestDelegate call = () => MacroStabilityOutwardsFailureMechanismSectionResultAssemblyFactory.AssembleTailorMadeAssembly( + sectionResult, + new MacroStabilityOutwardsFailureMechanism(), + assessmentSection); + + // Assert + var exception = Assert.Throws(call); + Exception innerException = exception.InnerException; + Assert.IsInstanceOf(innerException); + Assert.AreEqual(innerException.Message, exception.Message); + mocks.VerifyAll(); + } + } + + #endregion } } \ No newline at end of file Index: Ringtoets/Integration/test/Ringtoets.Integration.Data.Test/StandAlone/SectionResults/MacroStabilityOutwardsFailureMechanismSectionResultTest.cs =================================================================== diff -u -r5804285815fe6816e99dc8c1b4c86bd05752edfb -r9ebd34ca30a20d1b480dd1c19df8a99f23ecbf28 --- Ringtoets/Integration/test/Ringtoets.Integration.Data.Test/StandAlone/SectionResults/MacroStabilityOutwardsFailureMechanismSectionResultTest.cs (.../MacroStabilityOutwardsFailureMechanismSectionResultTest.cs) (revision 5804285815fe6816e99dc8c1b4c86bd05752edfb) +++ Ringtoets/Integration/test/Ringtoets.Integration.Data.Test/StandAlone/SectionResults/MacroStabilityOutwardsFailureMechanismSectionResultTest.cs (.../MacroStabilityOutwardsFailureMechanismSectionResultTest.cs) (revision 9ebd34ca30a20d1b480dd1c19df8a99f23ecbf28) @@ -46,6 +46,7 @@ Assert.AreSame(section, result.Section); Assert.AreEqual(SimpleAssessmentResultType.None, result.SimpleAssessmentResult); Assert.AreEqual(DetailedAssessmentResultType.Probability, result.DetailedAssessmentResult); + Assert.AreEqual(TailorMadeAssessmentResultType.None, result.TailorMadeAssessmentResult); Assert.IsNaN(result.AssessmentLayerTwoA); Assert.IsNaN(result.AssessmentLayerThree); }