Index: Riskeer/GrassCoverErosionInwards/src/Riskeer.GrassCoverErosionInwards.Forms/Views/GrassCoverErosionInwardsFailureMechanismSectionResultRow.cs =================================================================== diff -u -rafa2eda2dd59089149cf23c5dfc38f4d2965c1df -r4aaa3bae2b899be0c171803ef8111e7d84af1f01 --- Riskeer/GrassCoverErosionInwards/src/Riskeer.GrassCoverErosionInwards.Forms/Views/GrassCoverErosionInwardsFailureMechanismSectionResultRow.cs (.../GrassCoverErosionInwardsFailureMechanismSectionResultRow.cs) (revision afa2eda2dd59089149cf23c5dfc38f4d2965c1df) +++ Riskeer/GrassCoverErosionInwards/src/Riskeer.GrassCoverErosionInwards.Forms/Views/GrassCoverErosionInwardsFailureMechanismSectionResultRow.cs (.../GrassCoverErosionInwardsFailureMechanismSectionResultRow.cs) (revision 4aaa3bae2b899be0c171803ef8111e7d84af1f01) @@ -22,6 +22,7 @@ using System; using System.Collections.Generic; using System.ComponentModel; +using System.Linq; using Core.Common.Controls.DataGrid; using Riskeer.AssemblyTool.Data; using Riskeer.Common.Data.AssessmentSection; @@ -31,6 +32,7 @@ using Riskeer.Common.Forms.Views; using Riskeer.Common.Primitives; using Riskeer.GrassCoverErosionInwards.Data; +using RiskeerCommonFormsResources = Riskeer.Common.Forms.Properties.Resources; namespace Riskeer.GrassCoverErosionInwards.Forms.Views { @@ -267,12 +269,37 @@ } else { - ColumnStateDefinitions[detailedAssessmentProbabilityIndex].ErrorText = FailureMechanismSectionResultRowHelper.GetDetailedAssessmentError( - DetailedAssessmentProbability, - SectionResult.Calculation); + ColumnStateDefinitions[detailedAssessmentProbabilityIndex].ErrorText = GetDetailedAssessmentProbabilityError(); } } + private string GetDetailedAssessmentProbabilityError() + { + GrassCoverErosionInwardsCalculationScenario[] relevantScenarios = SectionResult.GetCalculationScenarios(calculationScenarios).ToArray(); + + if (relevantScenarios.Length == 0) + { + return RiskeerCommonFormsResources.FailureMechanismResultView_DataGridViewCellFormatting_Not_any_calculation_set; + } + + if (Math.Abs(SectionResult.GetTotalContribution(relevantScenarios) - 1.0) > 1e-6) + { + return RiskeerCommonFormsResources.FailureMechanismResultView_DataGridViewCellFormatting_Scenario_contribution_for_this_section_not_100; + } + + if (!relevantScenarios.All(s => s.HasOutput)) + { + return RiskeerCommonFormsResources.FailureMechanismResultView_DataGridViewCellFormatting_Not_all_calculations_have_been_executed; + } + + if (double.IsNaN(SectionResult.GetDetailedAssessmentProbability(calculationScenarios, failureMechanism, assessmentSection))) + { + return RiskeerCommonFormsResources.FailureMechanismResultView_DataGridViewCellFormatting_All_calculations_must_have_valid_output; + } + + return string.Empty; + } + private void CreateColumnStateDefinitions() { ColumnStateDefinitions.Add(simpleAssessmentResultIndex, new DataGridViewColumnStateDefinition()); Index: Riskeer/GrassCoverErosionInwards/test/Riskeer.GrassCoverErosionInwards.Forms.Test/Views/GrassCoverErosionInwardsFailureMechanismSectionResultRowTest.cs =================================================================== diff -u -rafa2eda2dd59089149cf23c5dfc38f4d2965c1df -r4aaa3bae2b899be0c171803ef8111e7d84af1f01 --- Riskeer/GrassCoverErosionInwards/test/Riskeer.GrassCoverErosionInwards.Forms.Test/Views/GrassCoverErosionInwardsFailureMechanismSectionResultRowTest.cs (.../GrassCoverErosionInwardsFailureMechanismSectionResultRowTest.cs) (revision afa2eda2dd59089149cf23c5dfc38f4d2965c1df) +++ Riskeer/GrassCoverErosionInwards/test/Riskeer.GrassCoverErosionInwards.Forms.Test/Views/GrassCoverErosionInwardsFailureMechanismSectionResultRowTest.cs (.../GrassCoverErosionInwardsFailureMechanismSectionResultRowTest.cs) (revision 4aaa3bae2b899be0c171803ef8111e7d84af1f01) @@ -24,6 +24,7 @@ using System.Drawing; using System.Linq; using Core.Common.Base; +using Core.Common.Base.Data; using Core.Common.Controls.DataGrid; using Core.Common.TestUtil; using NUnit.Framework; @@ -731,10 +732,137 @@ } } + // [Test] + // [TestCase(SimpleAssessmentValidityOnlyResultType.None)] + // [TestCase(SimpleAssessmentValidityOnlyResultType.Applicable)] + // public void Constructor_SectionResultWithoutCalculation_DetailedAssessmentProbabilityHasErrorText( + // SimpleAssessmentValidityOnlyResultType simpleAssessmentResult) + // { + // // Setup + // var failureMechanism = new GrassCoverErosionInwardsFailureMechanism(); + // + // var mocks = new MockRepository(); + // IAssessmentSection assessmentSection = AssessmentSectionTestHelper.CreateAssessmentSectionStub(failureMechanism, mocks); + // mocks.ReplayAll(); + // + // FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection(); + // var sectionResult = new GrassCoverErosionInwardsFailureMechanismSectionResult(section) + // { + // SimpleAssessmentResult = simpleAssessmentResult + // }; + // + // GrassCoverErosionInwardsCalculationScenario[] calculationScenarios = + // { + // GrassCoverErosionInwardsCalculationScenarioTestFactory.CreateGrassCoverErosionInwardsCalculationScenario(section) + // }; + // + // using (new AssemblyToolCalculatorFactoryConfig()) + // { + // // Call + // var resultRow = new GrassCoverErosionInwardsFailureMechanismSectionResultRow( + // sectionResult, calculationScenarios, failureMechanism, assessmentSection, ConstructionProperties); + // + // // Assert + // Assert.IsNaN(resultRow.DetailedAssessmentProbability); + // Assert.AreEqual("Er moet een maatgevende berekening voor dit vak worden geselecteerd.", + // resultRow.ColumnStateDefinitions[ConstructionProperties.DetailedAssessmentProbabilityIndex].ErrorText); + // mocks.VerifyAll(); + // } + // } + // + // [Test] + // [TestCase(SimpleAssessmentValidityOnlyResultType.None)] + // [TestCase(SimpleAssessmentValidityOnlyResultType.Applicable)] + // public void Constructor_SectionResultAndCalculationNotCalculated_DetailedAssessmentProbabilityHasErrorText( + // SimpleAssessmentValidityOnlyResultType simpleAssessmentResult) + // { + // // Setup + // var failureMechanism = new GrassCoverErosionInwardsFailureMechanism(); + // + // var mocks = new MockRepository(); + // IAssessmentSection assessmentSection = AssessmentSectionTestHelper.CreateAssessmentSectionStub(failureMechanism, mocks); + // mocks.ReplayAll(); + // + // FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection(); + // var sectionResult = new GrassCoverErosionInwardsFailureMechanismSectionResult(section) + // { + // Calculation = new GrassCoverErosionInwardsCalculation(), + // SimpleAssessmentResult = simpleAssessmentResult + // }; + // + // GrassCoverErosionInwardsCalculationScenario[] calculationScenarios = + // { + // GrassCoverErosionInwardsCalculationScenarioTestFactory.CreateNotCalculatedGrassCoverErosionInwardsCalculationScenario(section) + // }; + // + // using (new AssemblyToolCalculatorFactoryConfig()) + // { + // // Call + // var resultRow = new GrassCoverErosionInwardsFailureMechanismSectionResultRow( + // sectionResult, calculationScenarios, failureMechanism, assessmentSection, ConstructionProperties); + // + // // Assert + // Assert.IsNaN(resultRow.DetailedAssessmentProbability); + // Assert.AreEqual("De maatgevende berekening voor dit vak moet nog worden uitgevoerd.", + // resultRow.ColumnStateDefinitions[ConstructionProperties.DetailedAssessmentProbabilityIndex].ErrorText); + // mocks.VerifyAll(); + // } + // } + // + // [Test] + // [TestCase(SimpleAssessmentValidityOnlyResultType.None)] + // [TestCase(SimpleAssessmentValidityOnlyResultType.Applicable)] + // public void Constructor_SectionResultAndFailedCalculation_DetailedAssessmentProbabilityHasErrorText( + // SimpleAssessmentValidityOnlyResultType simpleAssessmentResult) + // { + // // Setup + // var failureMechanism = new GrassCoverErosionInwardsFailureMechanism(); + // + // var mocks = new MockRepository(); + // IAssessmentSection assessmentSection = AssessmentSectionTestHelper.CreateAssessmentSectionStub(failureMechanism, mocks); + // mocks.ReplayAll(); + // + // var calculation = new GrassCoverErosionInwardsCalculation + // { + // Output = new GrassCoverErosionInwardsOutput(new TestOvertoppingOutput(double.NaN), + // new TestDikeHeightOutput(double.NaN), + // new TestOvertoppingRateOutput(double.NaN)) + // }; + // FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection(); + // var sectionResult = new GrassCoverErosionInwardsFailureMechanismSectionResult(section) + // { + // Calculation = calculation, + // SimpleAssessmentResult = simpleAssessmentResult + // }; + // + // GrassCoverErosionInwardsCalculationScenario calculationScenario = GrassCoverErosionInwardsCalculationScenarioTestFactory.CreateNotCalculatedGrassCoverErosionInwardsCalculationScenario(section); + // calculationScenario.Output = new GrassCoverErosionInwardsOutput(new TestOvertoppingOutput(double.NaN), null, null); + // + // using (new AssemblyToolCalculatorFactoryConfig()) + // { + // // Call + // var resultRow = new GrassCoverErosionInwardsFailureMechanismSectionResultRow( + // sectionResult, + // new[] + // { + // calculationScenario + // }, + // failureMechanism, + // assessmentSection, + // ConstructionProperties); + // + // // Assert + // Assert.IsNaN(resultRow.DetailedAssessmentProbability); + // Assert.AreEqual("De maatgevende berekening voor dit vak moet een geldige uitkomst hebben.", + // resultRow.ColumnStateDefinitions[ConstructionProperties.DetailedAssessmentProbabilityIndex].ErrorText); + // mocks.VerifyAll(); + // } + // } + [Test] [TestCase(SimpleAssessmentValidityOnlyResultType.None)] [TestCase(SimpleAssessmentValidityOnlyResultType.Applicable)] - public void Constructor_SectionResultWithoutCalculation_DetailedAssessmentProbabilityHasErrorText( + public void Constructor_TotalContributionNotHundred_DetailedAssessmentProbabilityHasErrorText( SimpleAssessmentValidityOnlyResultType simpleAssessmentResult) { // Setup @@ -750,20 +878,25 @@ SimpleAssessmentResult = simpleAssessmentResult }; - GrassCoverErosionInwardsCalculationScenario[] calculationScenarios = - { - GrassCoverErosionInwardsCalculationScenarioTestFactory.CreateGrassCoverErosionInwardsCalculationScenario(section) - }; + GrassCoverErosionInwardsCalculationScenario calculationScenario = GrassCoverErosionInwardsCalculationScenarioTestFactory.CreateGrassCoverErosionInwardsCalculationScenario(section); + calculationScenario.Contribution = (RoundedDouble) 0.3; using (new AssemblyToolCalculatorFactoryConfig()) { // Call var resultRow = new GrassCoverErosionInwardsFailureMechanismSectionResultRow( - sectionResult, calculationScenarios, failureMechanism, assessmentSection, ConstructionProperties); + sectionResult, + new[] + { + calculationScenario + }, + failureMechanism, + assessmentSection, + ConstructionProperties); // Assert Assert.IsNaN(resultRow.DetailedAssessmentProbability); - Assert.AreEqual("Er moet een maatgevende berekening voor dit vak worden geselecteerd.", + Assert.AreEqual("Bijdrage van de geselecteerde scenario's voor dit vak moet opgeteld gelijk zijn aan 100%.", resultRow.ColumnStateDefinitions[ConstructionProperties.DetailedAssessmentProbabilityIndex].ErrorText); mocks.VerifyAll(); } @@ -772,7 +905,7 @@ [Test] [TestCase(SimpleAssessmentValidityOnlyResultType.None)] [TestCase(SimpleAssessmentValidityOnlyResultType.Applicable)] - public void Constructor_SectionResultAndCalculationNotCalculated_DetailedAssessmentProbabilityHasErrorText( + public void Constructor_NoCalculatedScenario_DetailedAssessmentProbabilityHasErrorText( SimpleAssessmentValidityOnlyResultType simpleAssessmentResult) { // Setup @@ -785,24 +918,69 @@ FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection(); var sectionResult = new GrassCoverErosionInwardsFailureMechanismSectionResult(section) { - Calculation = new GrassCoverErosionInwardsCalculation(), SimpleAssessmentResult = simpleAssessmentResult }; - GrassCoverErosionInwardsCalculationScenario[] calculationScenarios = + using (new AssemblyToolCalculatorFactoryConfig()) { - GrassCoverErosionInwardsCalculationScenarioTestFactory.CreateNotCalculatedGrassCoverErosionInwardsCalculationScenario(section) + // Call + var resultRow = new GrassCoverErosionInwardsFailureMechanismSectionResultRow( + sectionResult, + new[] + { + GrassCoverErosionInwardsCalculationScenarioTestFactory.CreateNotCalculatedGrassCoverErosionInwardsCalculationScenario(section) + }, + failureMechanism, + assessmentSection, + ConstructionProperties); + + // Assert + Assert.IsNaN(resultRow.DetailedAssessmentProbability); + Assert.AreEqual("Alle berekeningen voor dit vak moeten uitgevoerd zijn.", + resultRow.ColumnStateDefinitions[ConstructionProperties.DetailedAssessmentProbabilityIndex].ErrorText); + mocks.VerifyAll(); + } + } + + [Test] + [TestCase(SimpleAssessmentValidityOnlyResultType.None)] + [TestCase(SimpleAssessmentValidityOnlyResultType.Applicable)] + public void Constructor_DetailedAssessmentProbabilityNaN_DetailedAssessmentProbabilityHasErrorText( + SimpleAssessmentValidityOnlyResultType simpleAssessmentResult) + { + // Setup + var failureMechanism = new GrassCoverErosionInwardsFailureMechanism(); + + var mocks = new MockRepository(); + IAssessmentSection assessmentSection = AssessmentSectionTestHelper.CreateAssessmentSectionStub(failureMechanism, mocks); + mocks.ReplayAll(); + + FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection(); + var sectionResult = new GrassCoverErosionInwardsFailureMechanismSectionResult(section) + { + SimpleAssessmentResult = simpleAssessmentResult }; + GrassCoverErosionInwardsCalculationScenario calculationScenario = GrassCoverErosionInwardsCalculationScenarioTestFactory.CreateNotCalculatedGrassCoverErosionInwardsCalculationScenario( + section); + calculationScenario.Output = new GrassCoverErosionInwardsOutput(new TestOvertoppingOutput(double.NaN), null, null); + using (new AssemblyToolCalculatorFactoryConfig()) { // Call var resultRow = new GrassCoverErosionInwardsFailureMechanismSectionResultRow( - sectionResult, calculationScenarios, failureMechanism, assessmentSection, ConstructionProperties); + sectionResult, + new[] + { + calculationScenario + }, + failureMechanism, + assessmentSection, + ConstructionProperties); // Assert Assert.IsNaN(resultRow.DetailedAssessmentProbability); - Assert.AreEqual("De maatgevende berekening voor dit vak moet nog worden uitgevoerd.", + Assert.AreEqual("Alle berekeningen voor dit vak moeten een geldige uitkomst hebben.", resultRow.ColumnStateDefinitions[ConstructionProperties.DetailedAssessmentProbabilityIndex].ErrorText); mocks.VerifyAll(); } @@ -811,7 +989,7 @@ [Test] [TestCase(SimpleAssessmentValidityOnlyResultType.None)] [TestCase(SimpleAssessmentValidityOnlyResultType.Applicable)] - public void Constructor_SectionResultAndFailedCalculation_DetailedAssessmentProbabilityHasErrorText( + public void Constructor_NoCalculationScenarios_DetailedAssessmentProbabilityHasErrorText( SimpleAssessmentValidityOnlyResultType simpleAssessmentResult) { // Setup @@ -821,21 +999,51 @@ IAssessmentSection assessmentSection = AssessmentSectionTestHelper.CreateAssessmentSectionStub(failureMechanism, mocks); mocks.ReplayAll(); - var calculation = new GrassCoverErosionInwardsCalculation + FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection(); + var sectionResult = new GrassCoverErosionInwardsFailureMechanismSectionResult(section) { - Output = new GrassCoverErosionInwardsOutput(new TestOvertoppingOutput(double.NaN), - new TestDikeHeightOutput(double.NaN), - new TestOvertoppingRateOutput(double.NaN)) + SimpleAssessmentResult = simpleAssessmentResult }; + + using (new AssemblyToolCalculatorFactoryConfig()) + { + // Call + var resultRow = new GrassCoverErosionInwardsFailureMechanismSectionResultRow( + sectionResult, + Enumerable.Empty(), + failureMechanism, + assessmentSection, + ConstructionProperties); + + // Assert + Assert.IsNaN(resultRow.DetailedAssessmentProbability); + Assert.AreEqual("Er moet minimaal één maatgevende berekening voor dit vak worden geselecteerd.", + resultRow.ColumnStateDefinitions[ConstructionProperties.DetailedAssessmentProbabilityIndex].ErrorText); + mocks.VerifyAll(); + } + } + + [Test] + [TestCase(SimpleAssessmentValidityOnlyResultType.None)] + [TestCase(SimpleAssessmentValidityOnlyResultType.Applicable)] + public void Constructor_NoCalculationScenariosRelevant_DetailedAssessmentProbabilityHasErrorText( + SimpleAssessmentValidityOnlyResultType simpleAssessmentResult) + { + // Setup + var failureMechanism = new GrassCoverErosionInwardsFailureMechanism(); + + var mocks = new MockRepository(); + IAssessmentSection assessmentSection = AssessmentSectionTestHelper.CreateAssessmentSectionStub(failureMechanism, mocks); + mocks.ReplayAll(); + FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection(); var sectionResult = new GrassCoverErosionInwardsFailureMechanismSectionResult(section) { - Calculation = calculation, SimpleAssessmentResult = simpleAssessmentResult }; GrassCoverErosionInwardsCalculationScenario calculationScenario = GrassCoverErosionInwardsCalculationScenarioTestFactory.CreateNotCalculatedGrassCoverErosionInwardsCalculationScenario(section); - calculationScenario.Output = new GrassCoverErosionInwardsOutput(new TestOvertoppingOutput(double.NaN), null, null); + calculationScenario.IsRelevant = false; using (new AssemblyToolCalculatorFactoryConfig()) { @@ -844,15 +1052,15 @@ sectionResult, new[] { - calculationScenario - }, + calculationScenario + }, failureMechanism, assessmentSection, ConstructionProperties); // Assert Assert.IsNaN(resultRow.DetailedAssessmentProbability); - Assert.AreEqual("De maatgevende berekening voor dit vak moet een geldige uitkomst hebben.", + Assert.AreEqual("Er moet minimaal één maatgevende berekening voor dit vak worden geselecteerd.", resultRow.ColumnStateDefinitions[ConstructionProperties.DetailedAssessmentProbabilityIndex].ErrorText); mocks.VerifyAll(); } @@ -1243,7 +1451,7 @@ double detailedAssessmentProbability = resultRow.DetailedAssessmentProbability; // Assert - Assert.AreEqual(0.17105612630848185, detailedAssessmentProbability); + Assert.AreEqual(0.5, detailedAssessmentProbability); mocks.VerifyAll(); } }