Index: Ringtoets/Common/src/Ringtoets.Common.Data/FailureMechanism/FailureMechanismSectionResult.cs =================================================================== diff -u -r0b081b2391e73b7e3ff04ef31fafd2df1b1571e3 -r58c0d0a9d882210f47175f62ef1e4c494fce140b --- Ringtoets/Common/src/Ringtoets.Common.Data/FailureMechanism/FailureMechanismSectionResult.cs (.../FailureMechanismSectionResult.cs) (revision 0b081b2391e73b7e3ff04ef31fafd2df1b1571e3) +++ Ringtoets/Common/src/Ringtoets.Common.Data/FailureMechanism/FailureMechanismSectionResult.cs (.../FailureMechanismSectionResult.cs) (revision 58c0d0a9d882210f47175f62ef1e4c494fce140b) @@ -21,6 +21,7 @@ using System; using System.Collections.Generic; +using System.Linq; using Core.Common.Base; using Core.Common.Base.Data; @@ -67,7 +68,13 @@ /// /// Gets and sets the value of assessment layer two a. /// - public RoundedDouble AssessmentLayerTwoA { get; set; } + public RoundedDouble AssessmentLayerTwoA + { + get + { + return GetAssessmentResult(); + } + } /// /// Gets and sets the value of assessment layer two b. @@ -83,5 +90,18 @@ /// Gets and sets a list of /// public List CalculationScenarios { get; private set; } + + private RoundedDouble 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 new RoundedDouble(); + } } } \ No newline at end of file Index: Ringtoets/Common/src/Ringtoets.Common.Forms/Properties/Resources.Designer.cs =================================================================== diff -u -r3abef5ccb0ba5386c65d4156b319970fc4337a29 -r58c0d0a9d882210f47175f62ef1e4c494fce140b --- Ringtoets/Common/src/Ringtoets.Common.Forms/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision 3abef5ccb0ba5386c65d4156b319970fc4337a29) +++ Ringtoets/Common/src/Ringtoets.Common.Forms/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision 58c0d0a9d882210f47175f62ef1e4c494fce140b) @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.18444 +// Runtime Version:4.0.30319.17929 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -239,6 +239,16 @@ } /// + /// 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 { + get { + return ResourceManager.GetString("FailureMechanismResultView_DataGridViewCellFormatting_Scenario_contribution_for_t" + + "his_section_not_100", resourceCulture); + } + } + + /// /// Looks up a localized string similar to Toetslaag 1. /// public static string FailureMechanismResultView_InitializeDataGridView_Assessment_layer_one { Index: Ringtoets/Common/src/Ringtoets.Common.Forms/Properties/Resources.resx =================================================================== diff -u -r3abef5ccb0ba5386c65d4156b319970fc4337a29 -r58c0d0a9d882210f47175f62ef1e4c494fce140b --- Ringtoets/Common/src/Ringtoets.Common.Forms/Properties/Resources.resx (.../Resources.resx) (revision 3abef5ccb0ba5386c65d4156b319970fc4337a29) +++ Ringtoets/Common/src/Ringtoets.Common.Forms/Properties/Resources.resx (.../Resources.resx) (revision 58c0d0a9d882210f47175f62ef1e4c494fce140b) @@ -241,4 +241,7 @@ ..\Resources\document-task.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + Bijdrage van de geselecteerde scenario's voor dit vak zijn opgeteld niet gelijk aan 100% + \ No newline at end of file Index: Ringtoets/Common/src/Ringtoets.Common.Forms/Views/FailureMechanismResultView.cs =================================================================== diff -u -rbe992ae906247ce3e6da6bd2bc31955610f1b528 -r58c0d0a9d882210f47175f62ef1e4c494fce140b --- Ringtoets/Common/src/Ringtoets.Common.Forms/Views/FailureMechanismResultView.cs (.../FailureMechanismResultView.cs) (revision be992ae906247ce3e6da6bd2bc31955610f1b528) +++ Ringtoets/Common/src/Ringtoets.Common.Forms/Views/FailureMechanismResultView.cs (.../FailureMechanismResultView.cs) (revision 58c0d0a9d882210f47175f62ef1e4c494fce140b) @@ -123,6 +123,7 @@ dataGridView.CurrentCellDirtyStateChanged += DataGridViewCurrentCellDirtyStateChanged; dataGridView.CellValidating += DataGridViewCellValidating; dataGridView.DataError += DataGridViewDataError; + dataGridView.CellFormatting += DataGridViewCellFormatting; var sectionName = new DataGridViewTextBoxColumn { @@ -142,7 +143,8 @@ { DataPropertyName = "AssessmentLayerTwoA", HeaderText = Resources.FailureMechanismResultView_InitializeDataGridView_Assessment_layer_two_a, - Name = "column_AssessmentLayerTwoA" + Name = "column_AssessmentLayerTwoA", + ReadOnly = true }; assessmentLayerTwoB = new DataGridViewTextBoxColumn @@ -197,7 +199,6 @@ private void SetRowEditMode(DataGridViewRow row, bool checkboxSelected) { - row.Cells[assessmentLayerTwoA.Index].ReadOnly = checkboxSelected; row.Cells[assessmentLayerTwoB.Index].ReadOnly = checkboxSelected; row.Cells[assessmentLayerThree.Index].ReadOnly = checkboxSelected; } @@ -262,10 +263,6 @@ { return failureMechanismSectionResult.AssessmentLayerTwoA; } - set - { - failureMechanismSectionResult.AssessmentLayerTwoA = value; - } } public RoundedDouble AssessmentLayerTwoB @@ -329,6 +326,18 @@ } } + private void DataGridViewCellFormatting(object sender, DataGridViewCellFormattingEventArgs e) + { + if (e.ColumnIndex == assessmentLayerTwoA.Index && e.Value != null && double.IsNaN((RoundedDouble) e.Value)) + { + dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].ErrorText = Resources.FailureMechanismResultView_DataGridViewCellFormatting_Scenario_contribution_for_this_section_not_100; + } + else + { + dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].ErrorText = string.Empty; + } + } + #endregion } } \ No newline at end of file Index: Ringtoets/Common/test/Ringtoets.Common.Data.Test/FailureMechanism/FailureMechanismSectionResultTest.cs =================================================================== diff -u -r3462d84f3304a35ba5ce26c7d3afc9c31cdf9205 -r58c0d0a9d882210f47175f62ef1e4c494fce140b --- Ringtoets/Common/test/Ringtoets.Common.Data.Test/FailureMechanism/FailureMechanismSectionResultTest.cs (.../FailureMechanismSectionResultTest.cs) (revision 3462d84f3304a35ba5ce26c7d3afc9c31cdf9205) +++ Ringtoets/Common/test/Ringtoets.Common.Data.Test/FailureMechanism/FailureMechanismSectionResultTest.cs (.../FailureMechanismSectionResultTest.cs) (revision 58c0d0a9d882210f47175f62ef1e4c494fce140b) @@ -20,8 +20,10 @@ // All rights reserved. using System; +using Core.Common.Base.Data; using Core.Common.Base.Geometry; using NUnit.Framework; +using Rhino.Mocks; using Ringtoets.Common.Data.FailureMechanism; namespace Ringtoets.Common.Data.Test.FailureMechanism @@ -40,6 +42,10 @@ // Assert Assert.AreSame(section, sectionResult.Section); + Assert.IsFalse(sectionResult.AssessmentLayerOne); + Assert.AreEqual((RoundedDouble)0, sectionResult.AssessmentLayerTwoA); + Assert.AreEqual((RoundedDouble)0, sectionResult.AssessmentLayerTwoB); + Assert.AreEqual((RoundedDouble)0, sectionResult.AssessmentLayerThree); CollectionAssert.IsEmpty(sectionResult.CalculationScenarios); } @@ -54,6 +60,31 @@ Assert.AreEqual("section", exception.ParamName); } + [Test] + public void AssessmentLayerTwoA_ScenariosDoNotAddUpToHunderdPercent_ThrowsArgumentException() + { + // 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)50); + + mocks.ReplayAll(); + + failureMechanismSectionResult.CalculationScenarios.Add(calculationScenarioMock); + + // Call + var assessmentLayerTwoA = new RoundedDouble(); + TestDelegate call = () => assessmentLayerTwoA = failureMechanismSectionResult.AssessmentLayerTwoA; + + // Assert + Assert.Throws(call); + mocks.VerifyAll(); + } + private static FailureMechanismSection CreateSection() { var points = new[] Index: Ringtoets/Common/test/Ringtoets.Common.Forms.Test/Views/FailureMechanismResultViewTest.cs =================================================================== diff -u -re4a720dc28a93c2357d7e1b9702227cc645d46fb -r58c0d0a9d882210f47175f62ef1e4c494fce140b --- Ringtoets/Common/test/Ringtoets.Common.Forms.Test/Views/FailureMechanismResultViewTest.cs (.../FailureMechanismResultViewTest.cs) (revision e4a720dc28a93c2357d7e1b9702227cc645d46fb) +++ Ringtoets/Common/test/Ringtoets.Common.Forms.Test/Views/FailureMechanismResultViewTest.cs (.../FailureMechanismResultViewTest.cs) (revision 58c0d0a9d882210f47175f62ef1e4c494fce140b) @@ -76,6 +76,7 @@ var dataGridView = (DataGridView) new ControlTester("dataGridView").TheObject; Assert.AreEqual(5, dataGridView.ColumnCount); + Assert.IsTrue(dataGridView.Columns[assessmentLayerTwoAIndex].ReadOnly); foreach (var column in dataGridView.Columns.OfType()) { @@ -252,7 +253,6 @@ Assert.AreEqual(Color.FromKnownColor(KnownColor.ControlText), cellAssessmentLayerThreeForeColor); } - Assert.AreEqual(checkBoxSelected, cellAssessmentLayerTwoA.ReadOnly); Assert.AreEqual(checkBoxSelected, cellAssessmentLayerTwoB.ReadOnly); Assert.AreEqual(checkBoxSelected, cellAssessmentLayerThree.ReadOnly); } @@ -281,10 +281,6 @@ } [Test] - [TestCase("1", assessmentLayerTwoAIndex, "AssessmentLayerTwoA")] - [TestCase("1e-6", assessmentLayerTwoAIndex, "AssessmentLayerTwoA")] - [TestCase("1e+6", assessmentLayerTwoAIndex, "AssessmentLayerTwoA")] - [TestCase("14.3", assessmentLayerTwoAIndex, "AssessmentLayerTwoA")] [TestCase("1", assessmentLayerTwoBIndex, "AssessmentLayerTwoB")] [TestCase("1e-6", assessmentLayerTwoBIndex, "AssessmentLayerTwoB")] [TestCase("1e+6", assessmentLayerTwoBIndex, "AssessmentLayerTwoB")] @@ -342,6 +338,68 @@ } } + [Test] + public void FailureMechanismResultView_AssessmentLayerTwoANaN_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); + + 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("Bijdrage van de geselecteerde scenario's voor dit vak zijn opgeteld niet gelijk aan 100%", dataGridViewCell.ErrorText); + } + } + + [Test] + public void FailureMechanismResultView_AssessmentLayerTwoAHasValue_DoesNotShowsErrorTooltip() + { + // 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); + + 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(string.Empty, dataGridViewCell.ErrorText); + } + } + private const int nameColumnIndex = 0; private const int assessmentLayerOneIndex = 1; private const int assessmentLayerTwoAIndex = 2;