Index: Ringtoets/Common/src/Ringtoets.Common.Data/FailureMechanism/FailureMechanismSectionResult.cs =================================================================== diff -u -r58c0d0a9d882210f47175f62ef1e4c494fce140b -r8323c6cbe3f292646a254938161e17c42d13d10c --- Ringtoets/Common/src/Ringtoets.Common.Data/FailureMechanism/FailureMechanismSectionResult.cs (.../FailureMechanismSectionResult.cs) (revision 58c0d0a9d882210f47175f62ef1e4c494fce140b) +++ Ringtoets/Common/src/Ringtoets.Common.Data/FailureMechanism/FailureMechanismSectionResult.cs (.../FailureMechanismSectionResult.cs) (revision 8323c6cbe3f292646a254938161e17c42d13d10c) @@ -21,9 +21,11 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.Linq; using Core.Common.Base; using Core.Common.Base.Data; +using CoreCommonResources = Core.Common.Base.Properties.Resources; namespace Ringtoets.Common.Data.FailureMechanism { @@ -68,7 +70,7 @@ /// /// Gets and sets the value of assessment layer two a. /// - public RoundedDouble AssessmentLayerTwoA + public string AssessmentLayerTwoA { get { @@ -91,17 +93,21 @@ /// public List CalculationScenarios { get; private set; } - private RoundedDouble GetAssessmentResult() + private string GetAssessmentResult() { var relevantScenarios = CalculationScenarios.Where(cs => cs.IsRelevant).ToList(); double totalContribution = relevantScenarios.Aggregate(0, (current, calculationScenario) => current + calculationScenario.Contribution); if (relevantScenarios.Any() && Math.Abs(totalContribution - 1.0) > 1e-6) { - return (RoundedDouble) double.NaN; + return double.NaN.ToString(CultureInfo.InvariantCulture); } - return new RoundedDouble(); + var probability = relevantScenarios.Select(relevantScenario => relevantScenario.Contribution*relevantScenario.Probability).Aggregate(0.0, (current, probabilityContribution) => current + probabilityContribution); + + return double.IsNaN(probability) || Math.Abs(probability) < 1e-6 + ? "-" + : string.Format(CoreCommonResources.ProbabilityPerYearFormat, probability); } } } \ No newline at end of file Index: Ringtoets/Common/src/Ringtoets.Common.Data/FailureMechanism/ICalculationScenario.cs =================================================================== diff -u -r0b081b2391e73b7e3ff04ef31fafd2df1b1571e3 -r8323c6cbe3f292646a254938161e17c42d13d10c --- Ringtoets/Common/src/Ringtoets.Common.Data/FailureMechanism/ICalculationScenario.cs (.../ICalculationScenario.cs) (revision 0b081b2391e73b7e3ff04ef31fafd2df1b1571e3) +++ Ringtoets/Common/src/Ringtoets.Common.Data/FailureMechanism/ICalculationScenario.cs (.../ICalculationScenario.cs) (revision 8323c6cbe3f292646a254938161e17c42d13d10c) @@ -34,8 +34,13 @@ bool IsRelevant { get; set; } /// - /// Gets the contribution of the scenario. + /// Gets or sets the contribution of the scenario. /// RoundedDouble Contribution { get; set; } + + /// + /// Gets the probability of the scenario. + /// + RoundedDouble Probability { get; } } } \ No newline at end of file Index: Ringtoets/Common/src/Ringtoets.Common.Forms/Views/FailureMechanismResultView.cs =================================================================== diff -u -r58c0d0a9d882210f47175f62ef1e4c494fce140b -r8323c6cbe3f292646a254938161e17c42d13d10c --- Ringtoets/Common/src/Ringtoets.Common.Forms/Views/FailureMechanismResultView.cs (.../FailureMechanismResultView.cs) (revision 58c0d0a9d882210f47175f62ef1e4c494fce140b) +++ Ringtoets/Common/src/Ringtoets.Common.Forms/Views/FailureMechanismResultView.cs (.../FailureMechanismResultView.cs) (revision 8323c6cbe3f292646a254938161e17c42d13d10c) @@ -257,7 +257,7 @@ } } - public RoundedDouble AssessmentLayerTwoA + public string AssessmentLayerTwoA { get { @@ -328,13 +328,17 @@ private void DataGridViewCellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { - if (e.ColumnIndex == assessmentLayerTwoA.Index && e.Value != null && double.IsNaN((RoundedDouble) e.Value)) + double doubleValue = 0; + if (e.Value != null) { - dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].ErrorText = Resources.FailureMechanismResultView_DataGridViewCellFormatting_Scenario_contribution_for_this_section_not_100; + double.TryParse(e.Value.ToString(), out doubleValue); } - else + + if (e.ColumnIndex == assessmentLayerTwoA.Index) { - dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].ErrorText = string.Empty; + dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].ErrorText = double.IsNaN(doubleValue) + ? Resources.FailureMechanismResultView_DataGridViewCellFormatting_Scenario_contribution_for_this_section_not_100 + : string.Empty; } } Index: Ringtoets/Common/test/Ringtoets.Common.Data.Test/FailureMechanism/FailureMechanismSectionResultTest.cs =================================================================== diff -u -r06695b95184a4bc426e637ffc38c06e85fb01f6a -r8323c6cbe3f292646a254938161e17c42d13d10c --- Ringtoets/Common/test/Ringtoets.Common.Data.Test/FailureMechanism/FailureMechanismSectionResultTest.cs (.../FailureMechanismSectionResultTest.cs) (revision 06695b95184a4bc426e637ffc38c06e85fb01f6a) +++ Ringtoets/Common/test/Ringtoets.Common.Data.Test/FailureMechanism/FailureMechanismSectionResultTest.cs (.../FailureMechanismSectionResultTest.cs) (revision 8323c6cbe3f292646a254938161e17c42d13d10c) @@ -43,7 +43,7 @@ // Assert Assert.AreSame(section, sectionResult.Section); Assert.IsFalse(sectionResult.AssessmentLayerOne); - Assert.AreEqual((RoundedDouble)0, sectionResult.AssessmentLayerTwoA); + Assert.AreEqual("-", sectionResult.AssessmentLayerTwoA); Assert.AreEqual((RoundedDouble)0, sectionResult.AssessmentLayerTwoB); Assert.AreEqual((RoundedDouble)0, sectionResult.AssessmentLayerThree); CollectionAssert.IsEmpty(sectionResult.CalculationScenarios); @@ -70,20 +70,71 @@ var mocks = new MockRepository(); var calculationScenarioMock = mocks.StrictMock(); calculationScenarioMock.Expect(cs => cs.IsRelevant).Return(true); - calculationScenarioMock.Expect(cs => cs.Contribution).Return((RoundedDouble)50); + calculationScenarioMock.Expect(cs => cs.Contribution).Return((RoundedDouble)0.5); mocks.ReplayAll(); failureMechanismSectionResult.CalculationScenarios.Add(calculationScenarioMock); // Call - var assessmentLayerTwoA = failureMechanismSectionResult.AssessmentLayerTwoA; + double assessmentLayerTwoA; + double.TryParse(failureMechanismSectionResult.AssessmentLayerTwoA, out assessmentLayerTwoA); // Assert Assert.IsNaN(assessmentLayerTwoA); mocks.VerifyAll(); } + [Test] + public void AssessmentLayerTwoA_ScenariosAddUpToHunderdPercent_ReturnsValueAsString() + { + // Setup + var section = CreateSection(); + var failureMechanismSectionResult = new FailureMechanismSectionResult(section); + + var mocks = new MockRepository(); + var calculationScenarioMock = mocks.StrictMock(); + calculationScenarioMock.Expect(cs => cs.IsRelevant).Return(true); + calculationScenarioMock.Expect(cs => cs.Contribution).Return((RoundedDouble)1.0).Repeat.Twice(); + calculationScenarioMock.Expect(cs => cs.Probability).Return((RoundedDouble)41661830); + + mocks.ReplayAll(); + + failureMechanismSectionResult.CalculationScenarios.Add(calculationScenarioMock); + + // Call + var assessmentLayerTwoA = failureMechanismSectionResult.AssessmentLayerTwoA; + + // Assert + Assert.AreEqual("1/41,661,830", assessmentLayerTwoA); + mocks.VerifyAll(); + } + + [Test] + public void AssessmentLayerTwoA_ScenariosAddUpToHunderdPercentScenarioNotCalculated_ReturnsString() + { + // Setup + var section = CreateSection(); + var failureMechanismSectionResult = new FailureMechanismSectionResult(section); + + var mocks = new MockRepository(); + var calculationScenarioMock = mocks.StrictMock(); + calculationScenarioMock.Expect(cs => cs.IsRelevant).Return(true); + calculationScenarioMock.Expect(cs => cs.Contribution).Return((RoundedDouble)1.0).Repeat.Twice(); + calculationScenarioMock.Expect(cs => cs.Probability).Return((RoundedDouble)double.NaN); + + mocks.ReplayAll(); + + failureMechanismSectionResult.CalculationScenarios.Add(calculationScenarioMock); + + // Call + var assessmentLayerTwoA = failureMechanismSectionResult.AssessmentLayerTwoA; + + // Assert + Assert.AreEqual("-", assessmentLayerTwoA); + mocks.VerifyAll(); + } + private static FailureMechanismSection CreateSection() { var points = new[] Index: Ringtoets/Common/test/Ringtoets.Common.Forms.Test/Views/FailureMechanismResultViewTest.cs =================================================================== diff -u -r58c0d0a9d882210f47175f62ef1e4c494fce140b -r8323c6cbe3f292646a254938161e17c42d13d10c --- Ringtoets/Common/test/Ringtoets.Common.Forms.Test/Views/FailureMechanismResultViewTest.cs (.../FailureMechanismResultViewTest.cs) (revision 58c0d0a9d882210f47175f62ef1e4c494fce140b) +++ Ringtoets/Common/test/Ringtoets.Common.Forms.Test/Views/FailureMechanismResultViewTest.cs (.../FailureMechanismResultViewTest.cs) (revision 8323c6cbe3f292646a254938161e17c42d13d10c) @@ -186,15 +186,15 @@ Assert.AreEqual(5, cells.Count); Assert.AreEqual("Section 1", cells[nameColumnIndex].FormattedValue); Assert.IsFalse((bool) cells[assessmentLayerOneIndex].FormattedValue); - Assert.AreEqual(string.Format("{0}", 0), cells[assessmentLayerTwoAIndex].FormattedValue); + Assert.AreEqual("-", cells[assessmentLayerTwoAIndex].FormattedValue); Assert.AreEqual(string.Format("{0}", 0), cells[assessmentLayerTwoBIndex].FormattedValue); Assert.AreEqual(string.Format("{0}", 0), cells[assessmentLayerThreeIndex].FormattedValue); cells = rows[1].Cells; Assert.AreEqual(5, cells.Count); Assert.AreEqual("Section 2", cells[nameColumnIndex].FormattedValue); Assert.IsFalse((bool) cells[assessmentLayerOneIndex].FormattedValue); - Assert.AreEqual(string.Format("{0}", 0), cells[assessmentLayerTwoAIndex].FormattedValue); + Assert.AreEqual("-", cells[assessmentLayerTwoAIndex].FormattedValue); Assert.AreEqual(string.Format("{0}", 0), cells[assessmentLayerTwoBIndex].FormattedValue); Assert.AreEqual(string.Format("{0}", 0), cells[assessmentLayerThreeIndex].FormattedValue); } @@ -223,7 +223,7 @@ var cellAssessmentLayerThree = cells[assessmentLayerThreeIndex]; Assert.AreEqual(checkBoxSelected, (bool) cells[assessmentLayerOneIndex].FormattedValue); - Assert.AreEqual(string.Format("{0}", 0), cellAssessmentLayerTwoA.FormattedValue); + Assert.AreEqual("-", cellAssessmentLayerTwoA.FormattedValue); Assert.AreEqual(string.Format("{0}", 0), cellAssessmentLayerTwoB.FormattedValue); Assert.AreEqual(string.Format("{0}", 0), cellAssessmentLayerThree.FormattedValue); @@ -259,10 +259,8 @@ } [Test] - [TestCase("test", assessmentLayerTwoAIndex)] [TestCase("test", assessmentLayerTwoBIndex)] [TestCase("test", assessmentLayerThreeIndex)] - [TestCase(";/[].,~!@#$%^&*()_-+={}|?", assessmentLayerTwoAIndex)] [TestCase(";/[].,~!@#$%^&*()_-+={}|?", assessmentLayerTwoBIndex)] [TestCase(";/[].,~!@#$%^&*()_-+={}|?", assessmentLayerThreeIndex)] public void FailureMechanismResultView_EditValueInvalid_ShowsErrorTooltip(string newValue, int cellIndex) Index: Ringtoets/Piping/src/Ringtoets.Piping.Data/PipingCalculationScenario.cs =================================================================== diff -u -r0b081b2391e73b7e3ff04ef31fafd2df1b1571e3 -r8323c6cbe3f292646a254938161e17c42d13d10c --- Ringtoets/Piping/src/Ringtoets.Piping.Data/PipingCalculationScenario.cs (.../PipingCalculationScenario.cs) (revision 0b081b2391e73b7e3ff04ef31fafd2df1b1571e3) +++ Ringtoets/Piping/src/Ringtoets.Piping.Data/PipingCalculationScenario.cs (.../PipingCalculationScenario.cs) (revision 8323c6cbe3f292646a254938161e17c42d13d10c) @@ -45,14 +45,16 @@ IsRelevant = true; } - /// - /// Gets or sets whether this scenario is relevant or not. - /// public bool IsRelevant { get; set; } - /// - /// Gets the contribution of the scenario. - /// public RoundedDouble Contribution { get; set; } + + public RoundedDouble Probability + { + get + { + return SemiProbabilisticOutput != null ? SemiProbabilisticOutput.PipingProbability : (RoundedDouble) double.NaN; + } + } } } \ No newline at end of file Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/PipingCalculationConfigurationHelper.cs =================================================================== diff -u -r1279dcba187f56c0ba96dfdb962067304e333475 -r8323c6cbe3f292646a254938161e17c42d13d10c --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/PipingCalculationConfigurationHelper.cs (.../PipingCalculationConfigurationHelper.cs) (revision 1279dcba187f56c0ba96dfdb962067304e333475) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/PipingCalculationConfigurationHelper.cs (.../PipingCalculationConfigurationHelper.cs) (revision 8323c6cbe3f292646a254938161e17c42d13d10c) @@ -22,6 +22,7 @@ using System; using System.Collections.Generic; using System.Linq; +using Core.Common.Base.Data; using Core.Common.Base.Geometry; using log4net; using Ringtoets.Common.Forms.Helpers; @@ -149,7 +150,8 @@ SurfaceLine = surfaceLine, StochasticSoilModel = stochasticSoilModel, StochasticSoilProfile = stochasticSoilProfile - } + }, + Contribution = (RoundedDouble) stochasticSoilProfile.Probability }; } Index: Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/PipingCalculationScenarioTest.cs =================================================================== diff -u -rc7c07db38829afdc5965c331844e1d39123944ff -r8323c6cbe3f292646a254938161e17c42d13d10c --- Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/PipingCalculationScenarioTest.cs (.../PipingCalculationScenarioTest.cs) (revision c7c07db38829afdc5965c331844e1d39123944ff) +++ Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/PipingCalculationScenarioTest.cs (.../PipingCalculationScenarioTest.cs) (revision 8323c6cbe3f292646a254938161e17c42d13d10c) @@ -41,7 +41,8 @@ Assert.IsInstanceOf(scenario); Assert.AreSame(semiProbabilisticInputParameters, scenario.SemiProbabilisticParameters); Assert.IsTrue(scenario.IsRelevant); - Assert.AreEqual(new RoundedDouble(0, 0), scenario.Contribution); + Assert.AreEqual(new RoundedDouble(0), scenario.Contribution); + Assert.IsNaN(scenario.Probability); } [Test] @@ -81,5 +82,40 @@ // Assert Assert.AreEqual(roundedDouble, scenario.Contribution); } + + [Test] + public void Probability_PipingOutputSet_ReturnsPipingOutputProbability() + { + // Setup + RoundedDouble expectedProbability = new RoundedDouble(0, 49862180); + + var generalInputParameters = new GeneralPipingInput(); + var semiProbabilisticInputParameters = new SemiProbabilisticPipingInput(); + + var scenario = new PipingCalculationScenario(generalInputParameters, semiProbabilisticInputParameters); + scenario.SemiProbabilisticOutput = new PipingSemiProbabilisticOutput(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, expectedProbability, 0, 0); + + // Call + var probability = scenario.Probability; + + // Assert + Assert.AreEqual(expectedProbability, probability); + } + + [Test] + public void Probability_PipingOutputNull_ReturnsNaN() + { + // Setup + var generalInputParameters = new GeneralPipingInput(); + var semiProbabilisticInputParameters = new SemiProbabilisticPipingInput(); + + var scenario = new PipingCalculationScenario(generalInputParameters, semiProbabilisticInputParameters); + + // Call + var propability = scenario.Probability; + + // Assert + Assert.IsNaN(propability); + } } -} +} \ No newline at end of file Index: Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/PipingCalculationConfigurationHelperTest.cs =================================================================== diff -u -r1279dcba187f56c0ba96dfdb962067304e333475 -r8323c6cbe3f292646a254938161e17c42d13d10c --- Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/PipingCalculationConfigurationHelperTest.cs (.../PipingCalculationConfigurationHelperTest.cs) (revision 1279dcba187f56c0ba96dfdb962067304e333475) +++ Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/PipingCalculationConfigurationHelperTest.cs (.../PipingCalculationConfigurationHelperTest.cs) (revision 8323c6cbe3f292646a254938161e17c42d13d10c) @@ -22,6 +22,7 @@ using System; using System.Collections.Generic; using System.Linq; +using Core.Common.Base.Data; using Core.Common.Base.Geometry; using Core.Common.TestUtil; using NUnit.Framework; @@ -524,11 +525,17 @@ Assert.AreEqual(2, calculationGroup.Children.Count); CollectionAssert.AllItemsAreInstancesOfType(calculationGroup.Children, typeof(PipingCalculationScenario)); - var calculationInput1 = ((PipingCalculationScenario)calculationGroup.Children[0]).InputParameters; + var pipingCalculationScenario1 = (PipingCalculationScenario)calculationGroup.Children[0]; + Assert.AreEqual((RoundedDouble)soilProfile1.Probability, pipingCalculationScenario1.Contribution); + + var calculationInput1 = pipingCalculationScenario1.InputParameters; Assert.AreSame(soilProfile1, calculationInput1.StochasticSoilProfile); Assert.AreSame(surfaceLine, calculationInput1.SurfaceLine); - var calculationInput2 = ((PipingCalculationScenario)calculationGroup.Children[1]).InputParameters; + var pipingCalculationScenario2 = (PipingCalculationScenario)calculationGroup.Children[1]; + Assert.AreEqual((RoundedDouble)soilProfile2.Probability, pipingCalculationScenario2.Contribution); + + var calculationInput2 = pipingCalculationScenario2.InputParameters; Assert.AreSame(soilProfile2, calculationInput2.StochasticSoilProfile); Assert.AreSame(surfaceLine, calculationInput2.SurfaceLine); } @@ -743,11 +750,17 @@ Assert.AreEqual(2, calculationGroup.Children.Count); CollectionAssert.AllItemsAreInstancesOfType(calculationGroup.Children, typeof(PipingCalculationScenario)); - var calculationInput1 = ((PipingCalculationScenario)calculationGroup.Children[0]).InputParameters; + var pipingCalculationScenario1 = (PipingCalculationScenario)calculationGroup.Children[0]; + Assert.AreEqual((RoundedDouble)soilProfile1.Probability, pipingCalculationScenario1.Contribution); + + var calculationInput1 = pipingCalculationScenario1.InputParameters; Assert.AreSame(soilProfile1, calculationInput1.StochasticSoilProfile); Assert.AreSame(surfaceLine, calculationInput1.SurfaceLine); - var calculationInput2 = ((PipingCalculationScenario)calculationGroup.Children[1]).InputParameters; + var pipingCalculationScenario2 = ((PipingCalculationScenario)calculationGroup.Children[1]); + Assert.AreEqual((RoundedDouble)soilProfile2.Probability, pipingCalculationScenario2.Contribution); + + var calculationInput2 = pipingCalculationScenario2.InputParameters; Assert.AreSame(soilProfile2, calculationInput2.StochasticSoilProfile); Assert.AreSame(surfaceLine, calculationInput2.SurfaceLine); } @@ -846,11 +859,17 @@ Assert.AreEqual(2, calculationGroup1.Children.Count); CollectionAssert.AllItemsAreInstancesOfType(calculationGroup1.Children, typeof(PipingCalculationScenario)); - var calculationInput1 = ((PipingCalculationScenario)calculationGroup1.Children[0]).InputParameters; + var pipingCalculationScenario1 = (PipingCalculationScenario)calculationGroup1.Children[0]; + Assert.AreEqual((RoundedDouble)soilProfile1.Probability, pipingCalculationScenario1.Contribution); + + var calculationInput1 = pipingCalculationScenario1.InputParameters; Assert.AreSame(soilProfile1, calculationInput1.StochasticSoilProfile); Assert.AreSame(surfaceLine1, calculationInput1.SurfaceLine); - var calculationInput2 = ((PipingCalculationScenario)calculationGroup1.Children[1]).InputParameters; + var pipingCalculationScenario2 = (PipingCalculationScenario)calculationGroup1.Children[1]; + Assert.AreEqual((RoundedDouble)soilProfile2.Probability, pipingCalculationScenario1.Contribution); + + var calculationInput2 = pipingCalculationScenario2.InputParameters; Assert.AreSame(soilProfile2, calculationInput2.StochasticSoilProfile); Assert.AreSame(surfaceLine1, calculationInput2.SurfaceLine); @@ -860,7 +879,10 @@ Assert.AreEqual(1, calculationGroup2.Children.Count); CollectionAssert.AllItemsAreInstancesOfType(calculationGroup2.Children, typeof(PipingCalculationScenario)); - var calculationInput3 = ((PipingCalculationScenario)calculationGroup2.Children[0]).InputParameters; + var pipingCalculationScenario3 = (PipingCalculationScenario)calculationGroup2.Children[0]; + Assert.AreEqual((RoundedDouble)soilProfile2.Probability, pipingCalculationScenario1.Contribution); + + var calculationInput3 = pipingCalculationScenario3.InputParameters; Assert.AreSame(soilProfile2, calculationInput3.StochasticSoilProfile); Assert.AreSame(surfaceLine2, calculationInput3.SurfaceLine); } @@ -971,7 +993,10 @@ Assert.AreEqual(2, calculationGroup1.Children.Count); CollectionAssert.AllItemsAreInstancesOfType(calculationGroup1.Children, typeof(PipingCalculationScenario)); - var calculationInput1 = ((PipingCalculationScenario)calculationGroup1.Children[0]).InputParameters; + var pipingCalculationScenario1 = (PipingCalculationScenario)calculationGroup1.Children[0]; + Assert.AreEqual((RoundedDouble)soilProfile1.Probability, pipingCalculationScenario1.Contribution); + + var calculationInput1 = pipingCalculationScenario1.InputParameters; Assert.AreSame(soilProfile1, calculationInput1.StochasticSoilProfile); Assert.AreSame(surfaceLine1, calculationInput1.SurfaceLine);