Index: Ringtoets/Common/src/Ringtoets.Common.Data/FailureMechanism/FailureMechanismSectionResult.cs =================================================================== diff -u -r8323c6cbe3f292646a254938161e17c42d13d10c -rf7a9f7239374705ff1d732e9666c0cb62ebaafd0 --- Ringtoets/Common/src/Ringtoets.Common.Data/FailureMechanism/FailureMechanismSectionResult.cs (.../FailureMechanismSectionResult.cs) (revision 8323c6cbe3f292646a254938161e17c42d13d10c) +++ Ringtoets/Common/src/Ringtoets.Common.Data/FailureMechanism/FailureMechanismSectionResult.cs (.../FailureMechanismSectionResult.cs) (revision f7a9f7239374705ff1d732e9666c0cb62ebaafd0) @@ -21,11 +21,9 @@ 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 { @@ -70,11 +68,22 @@ /// /// Gets and sets the value of assessment layer two a. /// - public string AssessmentLayerTwoA + public RoundedDouble? AssessmentLayerTwoA { get { - return GetAssessmentResult(); + var totalProbablity = (RoundedDouble?) 0.0; + foreach (var scenario in CalculationScenarios.Where(cs => cs.IsRelevant)) + { + if (!scenario.Probability.HasValue) + { + return null; + } + + totalProbablity += (scenario.Contribution*scenario.Probability.Value); + } + + return totalProbablity; } } @@ -88,26 +97,17 @@ /// public RoundedDouble AssessmentLayerThree { get; set; } - /// - /// Gets and sets a list of - /// - public List CalculationScenarios { get; private set; } - - private string GetAssessmentResult() + public RoundedDouble TotalContribution { - 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) + get { - return double.NaN.ToString(CultureInfo.InvariantCulture); + return (RoundedDouble) CalculationScenarios.Where(cs => cs.IsRelevant).Aggregate(0, (current, calculationScenario) => current + calculationScenario.Contribution); } - - 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); } + + /// + /// Gets and sets a list of + /// + public List CalculationScenarios { get; private set; } } } \ No newline at end of file Index: Ringtoets/Common/src/Ringtoets.Common.Data/FailureMechanism/ICalculationScenario.cs =================================================================== diff -u -r8323c6cbe3f292646a254938161e17c42d13d10c -rf7a9f7239374705ff1d732e9666c0cb62ebaafd0 --- Ringtoets/Common/src/Ringtoets.Common.Data/FailureMechanism/ICalculationScenario.cs (.../ICalculationScenario.cs) (revision 8323c6cbe3f292646a254938161e17c42d13d10c) +++ Ringtoets/Common/src/Ringtoets.Common.Data/FailureMechanism/ICalculationScenario.cs (.../ICalculationScenario.cs) (revision f7a9f7239374705ff1d732e9666c0cb62ebaafd0) @@ -41,6 +41,6 @@ /// /// Gets the probability of the scenario. /// - RoundedDouble Probability { get; } + RoundedDouble? Probability { get; } } } \ No newline at end of file Index: Ringtoets/Common/src/Ringtoets.Common.Forms/Properties/Resources.Designer.cs =================================================================== diff -u -r58c0d0a9d882210f47175f62ef1e4c494fce140b -rf7a9f7239374705ff1d732e9666c0cb62ebaafd0 --- Ringtoets/Common/src/Ringtoets.Common.Forms/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision 58c0d0a9d882210f47175f62ef1e4c494fce140b) +++ Ringtoets/Common/src/Ringtoets.Common.Forms/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision f7a9f7239374705ff1d732e9666c0cb62ebaafd0) @@ -239,6 +239,26 @@ } /// + /// Looks up a localized string similar to Niet alle berekeningen voor dit vak zijn uitgevoerd.. + /// + public static string FailureMechanismResultView_DataGridViewCellFormatting_Not_all_calculations_are_executed { + get { + return ResourceManager.GetString("FailureMechanismResultView_DataGridViewCellFormatting_Not_all_calculations_are_ex" + + "ecuted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Niet alle berekeningen voor dit vak hebben een geldige uitkomst.. + /// + public static string FailureMechanismResultView_DataGridViewCellFormatting_Not_all_calculations_have_valid_output { + get { + return ResourceManager.GetString("FailureMechanismResultView_DataGridViewCellFormatting_Not_all_calculations_have_v" + + "alid_output", resourceCulture); + } + } + + /// /// Looks up a localized string similar to Bijdrage van de geselecteerde scenario's voor dit vak zijn opgeteld niet gelijk aan 100%. /// public static string FailureMechanismResultView_DataGridViewCellFormatting_Scenario_contribution_for_this_section_not_100 { @@ -304,6 +324,15 @@ } /// + /// Looks up a localized string similar to -. + /// + public static string FailureMechanismSectionResultRow_AssessmentLayerTwoA_No_result_dash { + get { + return ResourceManager.GetString("FailureMechanismSectionResultRow_AssessmentLayerTwoA_No_result_dash", resourceCulture); + } + } + + /// /// Looks up a localized string similar to eindpunten. /// public static string FailureMechanismSections_EndPoints_DisplayName { Index: Ringtoets/Common/src/Ringtoets.Common.Forms/Properties/Resources.resx =================================================================== diff -u -r58c0d0a9d882210f47175f62ef1e4c494fce140b -rf7a9f7239374705ff1d732e9666c0cb62ebaafd0 --- Ringtoets/Common/src/Ringtoets.Common.Forms/Properties/Resources.resx (.../Resources.resx) (revision 58c0d0a9d882210f47175f62ef1e4c494fce140b) +++ Ringtoets/Common/src/Ringtoets.Common.Forms/Properties/Resources.resx (.../Resources.resx) (revision f7a9f7239374705ff1d732e9666c0cb62ebaafd0) @@ -244,4 +244,13 @@ Bijdrage van de geselecteerde scenario's voor dit vak zijn opgeteld niet gelijk aan 100% + + Niet alle berekeningen voor dit vak zijn uitgevoerd. + + + Niet alle berekeningen voor dit vak hebben een geldige uitkomst. + + + - + \ No newline at end of file Index: Ringtoets/Common/src/Ringtoets.Common.Forms/Views/FailureMechanismResultView.cs =================================================================== diff -u -r8323c6cbe3f292646a254938161e17c42d13d10c -rf7a9f7239374705ff1d732e9666c0cb62ebaafd0 --- Ringtoets/Common/src/Ringtoets.Common.Forms/Views/FailureMechanismResultView.cs (.../FailureMechanismResultView.cs) (revision 8323c6cbe3f292646a254938161e17c42d13d10c) +++ Ringtoets/Common/src/Ringtoets.Common.Forms/Views/FailureMechanismResultView.cs (.../FailureMechanismResultView.cs) (revision f7a9f7239374705ff1d732e9666c0cb62ebaafd0) @@ -22,13 +22,15 @@ using System; using System.Collections.Generic; using System.Drawing; +using System.Globalization; using System.Linq; using System.Windows.Forms; using Core.Common.Base; using Core.Common.Base.Data; using Core.Common.Controls.Views; using Ringtoets.Common.Data.FailureMechanism; using Ringtoets.Common.Forms.Properties; +using CoreCommonResources = Core.Common.Base.Properties.Resources; namespace Ringtoets.Common.Forms.Views { @@ -45,6 +47,7 @@ private DataGridViewTextBoxColumn assessmentLayerTwoA; private DataGridViewTextBoxColumn assessmentLayerTwoB; private DataGridViewTextBoxColumn assessmentLayerThree; + private const double tolerance = 1e-6; /// /// Creates a new instance of . @@ -229,7 +232,7 @@ private class FailureMechanismSectionResultRow { - private readonly FailureMechanismSectionResult failureMechanismSectionResult; + public readonly FailureMechanismSectionResult failureMechanismSectionResult; public FailureMechanismSectionResultRow(FailureMechanismSectionResult failureMechanismSectionResult) { @@ -261,7 +264,19 @@ { get { - return failureMechanismSectionResult.AssessmentLayerTwoA; + if (failureMechanismSectionResult.CalculationScenarios.Any() && Math.Abs(failureMechanismSectionResult.TotalContribution - 1.0) > tolerance) + { + return double.NaN.ToString(CultureInfo.InvariantCulture); + } + + var layerTwoA = failureMechanismSectionResult.AssessmentLayerTwoA; + + if (!failureMechanismSectionResult.CalculationScenarios.Any() || !layerTwoA.HasValue || double.IsNaN(layerTwoA.Value)) + { + return Resources.FailureMechanismSectionResultRow_AssessmentLayerTwoA_No_result_dash; + } + + return string.Format(CoreCommonResources.ProbabilityPerYearFormat, layerTwoA.Value); } } @@ -328,18 +343,44 @@ private void DataGridViewCellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { - double doubleValue = 0; - if (e.Value != null) - { - double.TryParse(e.Value.ToString(), out doubleValue); - } + FailureMechanismSectionResultRow resultRow = dataGridView.Rows[e.RowIndex].DataBoundItem as FailureMechanismSectionResultRow; - if (e.ColumnIndex == assessmentLayerTwoA.Index) + if (resultRow != null && e.ColumnIndex == assessmentLayerTwoA.Index) { - dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].ErrorText = double.IsNaN(doubleValue) - ? Resources.FailureMechanismResultView_DataGridViewCellFormatting_Scenario_contribution_for_this_section_not_100 - : string.Empty; + FailureMechanismSectionResult rowObject = resultRow.failureMechanismSectionResult; + + if (rowObject.AssessmentLayerOne) + { + dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].ErrorText = string.Empty; + return; + } + + if (rowObject.CalculationScenarios.Any() && Math.Abs(rowObject.TotalContribution - 1.0) > tolerance) + { + dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].ErrorText = Resources.FailureMechanismResultView_DataGridViewCellFormatting_Scenario_contribution_for_this_section_not_100; + return; + } + + var layerTwoA = rowObject.AssessmentLayerTwoA; + + if (!layerTwoA.HasValue) + { + // Calculation not done. + dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].ErrorText = Resources.FailureMechanismResultView_DataGridViewCellFormatting_Not_all_calculations_are_executed; + return; + } + + if (double.IsNaN(layerTwoA.Value)) + { + // Calculation output not valid. + dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].ErrorText = Resources.FailureMechanismResultView_DataGridViewCellFormatting_Not_all_calculations_have_valid_output; + return; + } + + dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].ErrorText = string.Empty; } + + } #endregion Index: Ringtoets/Common/test/Ringtoets.Common.Data.Test/FailureMechanism/FailureMechanismSectionResultTest.cs =================================================================== diff -u -r8093a22c96deede9e51a3afa570de9a7cb2202a1 -rf7a9f7239374705ff1d732e9666c0cb62ebaafd0 --- Ringtoets/Common/test/Ringtoets.Common.Data.Test/FailureMechanism/FailureMechanismSectionResultTest.cs (.../FailureMechanismSectionResultTest.cs) (revision 8093a22c96deede9e51a3afa570de9a7cb2202a1) +++ Ringtoets/Common/test/Ringtoets.Common.Data.Test/FailureMechanism/FailureMechanismSectionResultTest.cs (.../FailureMechanismSectionResultTest.cs) (revision f7a9f7239374705ff1d732e9666c0cb62ebaafd0) @@ -43,7 +43,7 @@ // Assert Assert.AreSame(section, sectionResult.Section); Assert.IsFalse(sectionResult.AssessmentLayerOne); - Assert.AreEqual("-", sectionResult.AssessmentLayerTwoA); + Assert.AreEqual((RoundedDouble)0, sectionResult.AssessmentLayerTwoA); Assert.AreEqual((RoundedDouble)0, sectionResult.AssessmentLayerTwoB); Assert.AreEqual((RoundedDouble)0, sectionResult.AssessmentLayerThree); CollectionAssert.IsEmpty(sectionResult.CalculationScenarios); @@ -61,32 +61,49 @@ } [Test] - public void AssessmentLayerTwoA_ScenariosDoNotAddUpToHunderdPercent_ReturnsNaN() + [TestCase(true)] + [TestCase(false)] + public void AssessmentLayerOne_Always_ReturnsSetValue(bool newValue) { // Setup var section = CreateSection(); var failureMechanismSectionResult = new FailureMechanismSectionResult(section); + // Call + failureMechanismSectionResult.AssessmentLayerOne = newValue; + + // Assert + Assert.AreEqual(newValue, failureMechanismSectionResult.AssessmentLayerOne); + } + + [Test] + public void AssessmentLayerTwoA_ScenariosCalculated_ReturnsValue() + { + // 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)0.5); + calculationScenarioMock.Expect(cs => cs.Contribution).Return((RoundedDouble)1.0); + var expectedProbability = (RoundedDouble)41661830; + calculationScenarioMock.Expect(cs => cs.Probability).Return(expectedProbability).Repeat.Twice(); mocks.ReplayAll(); failureMechanismSectionResult.CalculationScenarios.Add(calculationScenarioMock); // Call - double assessmentLayerTwoA; - double.TryParse(failureMechanismSectionResult.AssessmentLayerTwoA, out assessmentLayerTwoA); + var assessmentLayerTwoA = failureMechanismSectionResult.AssessmentLayerTwoA; // Assert - Assert.IsNaN(assessmentLayerTwoA); + Assert.AreEqual(expectedProbability, assessmentLayerTwoA); mocks.VerifyAll(); } [Test] - public void AssessmentLayerTwoA_ScenariosAddUpToHunderdPercent_ReturnsValueAsString() + public void AssessmentLayerTwoA_ScenarioNotCalculated_ReturnsNull() { // Setup var section = CreateSection(); @@ -95,8 +112,7 @@ 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); + calculationScenarioMock.Expect(cs => cs.Probability).Return(null); mocks.ReplayAll(); @@ -106,12 +122,12 @@ var assessmentLayerTwoA = failureMechanismSectionResult.AssessmentLayerTwoA; // Assert - Assert.AreEqual(string.Format("1/{0:N0}", 41661830), assessmentLayerTwoA); + Assert.IsNull(assessmentLayerTwoA); mocks.VerifyAll(); } [Test] - public void AssessmentLayerTwoA_ScenariosAddUpToHunderdPercentScenarioNotCalculated_ReturnsString() + public void AssessmentLayerTwoA_ScenarioInvalidOutput_ReturnsNaN() { // Setup var section = CreateSection(); @@ -120,8 +136,8 @@ 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); + calculationScenarioMock.Expect(cs => cs.Probability).Return((RoundedDouble?) double.NaN).Repeat.Twice(); + calculationScenarioMock.Expect(cs => cs.Contribution).Return((RoundedDouble) 1.0); mocks.ReplayAll(); @@ -131,10 +147,116 @@ var assessmentLayerTwoA = failureMechanismSectionResult.AssessmentLayerTwoA; // Assert - Assert.AreEqual("-", assessmentLayerTwoA); + Assert.IsNaN(assessmentLayerTwoA); mocks.VerifyAll(); } + [Test] + public void AssessmentLayerTwoA_NoScenarios_ReturnsValue() + { + // Setup + var section = CreateSection(); + var failureMechanismSectionResult = new FailureMechanismSectionResult(section); + + // Call + var assessmentLayerTwoA = failureMechanismSectionResult.AssessmentLayerTwoA; + + // Assert + Assert.AreEqual((RoundedDouble)0.0, assessmentLayerTwoA); + } + + [Test] + public void TotalContribution_Always_ReturnsTotalRelevantScenarioContribution() + { + // 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)0.3); + + var calculationScenarioMock2 = mocks.StrictMock(); + calculationScenarioMock2.Expect(cs => cs.IsRelevant).Return(true); + calculationScenarioMock2.Expect(cs => cs.Contribution).Return((RoundedDouble)0.5); + + var calculationScenarioMock3 = mocks.StrictMock(); + calculationScenarioMock3.Expect(cs => cs.IsRelevant).Return(false); + + mocks.ReplayAll(); + + failureMechanismSectionResult.CalculationScenarios.Add(calculationScenarioMock); + failureMechanismSectionResult.CalculationScenarios.Add(calculationScenarioMock2); + failureMechanismSectionResult.CalculationScenarios.Add(calculationScenarioMock3); + + // Call + var totalContribution = failureMechanismSectionResult.TotalContribution; + + // Assert + Assert.AreEqual((RoundedDouble)0.8, totalContribution); + mocks.VerifyAll(); + } + + [Test] + public void AssessmentLayerTwoB_Always_ReturnsSetValue() + { + // Setup + var section = CreateSection(); + var failureMechanismSectionResult = new FailureMechanismSectionResult(section); + var assessmentLayerTwoBValue = (RoundedDouble) 3.0; + + // Call + failureMechanismSectionResult.AssessmentLayerTwoB = assessmentLayerTwoBValue; + + // Assert + Assert.AreEqual(assessmentLayerTwoBValue, failureMechanismSectionResult.AssessmentLayerTwoB); + } + + [Test] + public void AssessmentLayerThree_Always_ReturnsSetValue() + { + // Setup + var section = CreateSection(); + var failureMechanismSectionResult = new FailureMechanismSectionResult(section); + var assessmentLayerThreeValue = (RoundedDouble)3.0; + + // Call + failureMechanismSectionResult.AssessmentLayerThree = assessmentLayerThreeValue; + + // Assert + Assert.AreEqual(assessmentLayerThreeValue, failureMechanismSectionResult.AssessmentLayerThree); + } + + [Test] + public void CalculationScenarios_Always_ReturnsAddedCalculationScenarios() + { + // Setup + var section = CreateSection(); + var failureMechanismSectionResult = new FailureMechanismSectionResult(section); + + // Precondition + CollectionAssert.IsEmpty(failureMechanismSectionResult.CalculationScenarios); + + var mocks = new MockRepository(); + var calculationScenarioMock = mocks.StrictMock(); + var calculationScenarioMock2 = mocks.StrictMock(); + var calculationScenarioMock3 = mocks.StrictMock(); + + mocks.ReplayAll(); + + failureMechanismSectionResult.CalculationScenarios.Add(calculationScenarioMock); + failureMechanismSectionResult.CalculationScenarios.Add(calculationScenarioMock2); + failureMechanismSectionResult.CalculationScenarios.Add(calculationScenarioMock3); + + // Call + var scenarios = failureMechanismSectionResult.CalculationScenarios; + + // Assert + CollectionAssert.AreEqual(new[] {calculationScenarioMock, calculationScenarioMock2, calculationScenarioMock3}, scenarios); + mocks.VerifyAll(); + } + private static FailureMechanismSection CreateSection() { var points = new[] Index: Ringtoets/Common/test/Ringtoets.Common.Forms.Test/Views/FailureMechanismResultViewTest.cs =================================================================== diff -u -r8323c6cbe3f292646a254938161e17c42d13d10c -rf7a9f7239374705ff1d732e9666c0cb62ebaafd0 --- Ringtoets/Common/test/Ringtoets.Common.Forms.Test/Views/FailureMechanismResultViewTest.cs (.../FailureMechanismResultViewTest.cs) (revision 8323c6cbe3f292646a254938161e17c42d13d10c) +++ Ringtoets/Common/test/Ringtoets.Common.Forms.Test/Views/FailureMechanismResultViewTest.cs (.../FailureMechanismResultViewTest.cs) (revision f7a9f7239374705ff1d732e9666c0cb62ebaafd0) @@ -337,13 +337,14 @@ } [Test] - public void FailureMechanismResultView_AssessmentLayerTwoANaN_ShowsErrorTooltip() + public void FailureMechanismResultView_TotalContributionNotHundred_ShowsErrorTooltip() { // Setup var mocks = new MockRepository(); var calculationScenarioMock = mocks.StrictMock(); - calculationScenarioMock.Expect(cs => cs.Contribution).Return((RoundedDouble) 0.3); - calculationScenarioMock.Expect(cs => cs.IsRelevant).Return(true); + calculationScenarioMock.Expect(cs => cs.Contribution).Return((RoundedDouble) 0.3).Repeat.Any(); + calculationScenarioMock.Expect(cs => cs.IsRelevant).Return(true).Repeat.Any(); + calculationScenarioMock.Expect(cs => cs.Probability).Return((RoundedDouble) 1000).Repeat.Any(); mocks.ReplayAll(); @@ -364,6 +365,8 @@ // Assert Assert.AreEqual("Bijdrage van de geselecteerde scenario's voor dit vak zijn opgeteld niet gelijk aan 100%", dataGridViewCell.ErrorText); + Assert.AreEqual(double.NaN.ToString(), formattedValue); + mocks.VerifyAll(); } } @@ -373,8 +376,9 @@ // Setup var mocks = new MockRepository(); var calculationScenarioMock = mocks.StrictMock(); - calculationScenarioMock.Expect(cs => cs.Contribution).Return((RoundedDouble)1.0); - calculationScenarioMock.Expect(cs => cs.IsRelevant).Return(true); + calculationScenarioMock.Expect(cs => cs.Contribution).Return((RoundedDouble)1.0).Repeat.Any(); + calculationScenarioMock.Expect(cs => cs.IsRelevant).Return(true).Repeat.Any(); + calculationScenarioMock.Expect(cs => cs.Probability).Return((RoundedDouble?) 1000).Repeat.Any(); mocks.ReplayAll(); @@ -395,9 +399,136 @@ // Assert Assert.AreEqual(string.Empty, dataGridViewCell.ErrorText); + Assert.AreEqual(string.Format("1/{0:N0}", calculationScenarioMock.Probability), formattedValue); + mocks.VerifyAll(); } } + [Test] + public void FailureMechanismResultView_AssessmentLayerTwoANull_ShowsErrorTooltip() + { + // Setup + var mocks = new MockRepository(); + var calculationScenarioMock = mocks.StrictMock(); + calculationScenarioMock.Expect(cs => cs.Contribution).Return((RoundedDouble)1.0).Repeat.Any(); + calculationScenarioMock.Expect(cs => cs.IsRelevant).Return(true).Repeat.Any(); + calculationScenarioMock.Expect(cs => cs.Probability).Return(null).Repeat.Any(); + + mocks.ReplayAll(); + + var rowIndex = 0; + + using (var view = ShowFullyConfiguredFailureMechanismResultsView()) + { + var sections = (List)view.Data; + sections[0].CalculationScenarios.Add(calculationScenarioMock); + + var gridTester = new ControlTester("dataGridView"); + var dataGridView = (DataGridView)gridTester.TheObject; + + DataGridViewCell dataGridViewCell = dataGridView.Rows[rowIndex].Cells[assessmentLayerTwoAIndex]; + + // Call + var formattedValue = dataGridViewCell.FormattedValue; // Need to do this to fire the CellFormatting event. + + // Assert + Assert.AreEqual("Niet alle berekeningen voor dit vak zijn uitgevoerd.", dataGridViewCell.ErrorText); + Assert.AreEqual("-", formattedValue); + mocks.VerifyAll(); + } + } + + [Test] + public void FailureMechanismResultView_AssessmentLayerTwoANaN_ShowsErrorTooltip() + { + // Setup + var mocks = new MockRepository(); + var calculationScenarioMock = mocks.StrictMock(); + calculationScenarioMock.Expect(cs => cs.Contribution).Return((RoundedDouble)1.0).Repeat.Any(); + calculationScenarioMock.Expect(cs => cs.IsRelevant).Return(true).Repeat.Any(); + calculationScenarioMock.Expect(cs => cs.Probability).Return((RoundedDouble?) double.NaN).Repeat.Any(); + + mocks.ReplayAll(); + + var rowIndex = 0; + + using (var view = ShowFullyConfiguredFailureMechanismResultsView()) + { + var sections = (List)view.Data; + sections[0].CalculationScenarios.Add(calculationScenarioMock); + + var gridTester = new ControlTester("dataGridView"); + var dataGridView = (DataGridView)gridTester.TheObject; + + DataGridViewCell dataGridViewCell = dataGridView.Rows[rowIndex].Cells[assessmentLayerTwoAIndex]; + + // Call + var formattedValue = dataGridViewCell.FormattedValue; // Need to do this to fire the CellFormatting event. + + // Assert + Assert.AreEqual("Niet alle berekeningen voor dit vak hebben een geldige uitkomst.", dataGridViewCell.ErrorText); + Assert.AreEqual("-", formattedValue); + mocks.VerifyAll(); + } + } + + [Test] + public void FailureMechanismResultView_NoCalculationScenarios_DoesNotShowErrorTooltip() + { + // Setup + var rowIndex = 0; + + using (ShowFullyConfiguredFailureMechanismResultsView()) + { + var gridTester = new ControlTester("dataGridView"); + var dataGridView = (DataGridView)gridTester.TheObject; + + DataGridViewCell dataGridViewCell = dataGridView.Rows[rowIndex].Cells[assessmentLayerTwoAIndex]; + + // Call + var formattedValue = dataGridViewCell.FormattedValue; // Need to do this to fire the CellFormatting event. + + // Assert + Assert.AreEqual(string.Empty, dataGridViewCell.ErrorText); + Assert.AreEqual("-", formattedValue); + } + } + + [Test] + public void FailureMechanismResultView_AssessmentLayerTrueAndAssessmentLayerTwoAHasError_DoesNotShowError() + { + // Setup + var mocks = new MockRepository(); + var calculationScenarioMock = mocks.StrictMock(); + calculationScenarioMock.Expect(cs => cs.Contribution).Return((RoundedDouble)1.0).Repeat.Any(); + calculationScenarioMock.Expect(cs => cs.IsRelevant).Return(true).Repeat.Any(); + calculationScenarioMock.Expect(cs => cs.Probability).Return((RoundedDouble?)double.NaN).Repeat.Any(); + + mocks.ReplayAll(); + + var rowIndex = 0; + + using (var view = ShowFullyConfiguredFailureMechanismResultsView()) + { + var sections = (List)view.Data; + sections[0].CalculationScenarios.Add(calculationScenarioMock); + + var gridTester = new ControlTester("dataGridView"); + var dataGridView = (DataGridView)gridTester.TheObject; + + DataGridViewCell dataGridViewCell = dataGridView.Rows[rowIndex].Cells[assessmentLayerTwoAIndex]; + + // Call + dataGridView.Rows[rowIndex].Cells[assessmentLayerOneIndex].Value = true; + var formattedValue = dataGridViewCell.FormattedValue; // Need to do this to fire the CellFormatting event. + + // Assert + Assert.AreEqual(string.Empty, dataGridViewCell.ErrorText); + Assert.AreEqual("-", formattedValue); + mocks.VerifyAll(); + } + } + private const int nameColumnIndex = 0; private const int assessmentLayerOneIndex = 1; private const int assessmentLayerTwoAIndex = 2; Index: Ringtoets/Piping/src/Ringtoets.Piping.Data/PipingCalculationScenario.cs =================================================================== diff -u -r8323c6cbe3f292646a254938161e17c42d13d10c -rf7a9f7239374705ff1d732e9666c0cb62ebaafd0 --- Ringtoets/Piping/src/Ringtoets.Piping.Data/PipingCalculationScenario.cs (.../PipingCalculationScenario.cs) (revision 8323c6cbe3f292646a254938161e17c42d13d10c) +++ Ringtoets/Piping/src/Ringtoets.Piping.Data/PipingCalculationScenario.cs (.../PipingCalculationScenario.cs) (revision f7a9f7239374705ff1d732e9666c0cb62ebaafd0) @@ -49,11 +49,11 @@ public RoundedDouble Contribution { get; set; } - public RoundedDouble Probability + public RoundedDouble? Probability { get { - return SemiProbabilisticOutput != null ? SemiProbabilisticOutput.PipingProbability : (RoundedDouble) double.NaN; + return SemiProbabilisticOutput != null ? SemiProbabilisticOutput.PipingProbability : (RoundedDouble?) null; } } } Index: Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/PipingCalculationScenarioTest.cs =================================================================== diff -u -r8323c6cbe3f292646a254938161e17c42d13d10c -rf7a9f7239374705ff1d732e9666c0cb62ebaafd0 --- Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/PipingCalculationScenarioTest.cs (.../PipingCalculationScenarioTest.cs) (revision 8323c6cbe3f292646a254938161e17c42d13d10c) +++ Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/PipingCalculationScenarioTest.cs (.../PipingCalculationScenarioTest.cs) (revision f7a9f7239374705ff1d732e9666c0cb62ebaafd0) @@ -42,7 +42,7 @@ Assert.AreSame(semiProbabilisticInputParameters, scenario.SemiProbabilisticParameters); Assert.IsTrue(scenario.IsRelevant); Assert.AreEqual(new RoundedDouble(0), scenario.Contribution); - Assert.IsNaN(scenario.Probability); + Assert.IsNull(scenario.Probability); } [Test] @@ -103,7 +103,7 @@ } [Test] - public void Probability_PipingOutputNull_ReturnsNaN() + public void Probability_PipingOutputNull_ReturnsNull() { // Setup var generalInputParameters = new GeneralPipingInput(); @@ -115,7 +115,24 @@ var propability = scenario.Probability; // Assert - Assert.IsNaN(propability); + Assert.IsNull(propability); } + + [Test] + public void Probabilty_ScenarioInvalid_ReturnsNaN() + { + // Setup + 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, double.NaN, 0, 0); + + // Call + var propability = scenario.Probability; + + // Assert + Assert.IsNaN(propability.Value); + } } } \ No newline at end of file