Index: Ringtoets/Common/src/Ringtoets.Common.Forms/Views/FailureMechanismResultView.cs =================================================================== diff -u -rc47cc3d2e42f1cb69ccf6e47ee0922f05dfd68dd -rc4d1fab26e8a8a24845606047d51628f6bf4fe5e --- Ringtoets/Common/src/Ringtoets.Common.Forms/Views/FailureMechanismResultView.cs (.../FailureMechanismResultView.cs) (revision c47cc3d2e42f1cb69ccf6e47ee0922f05dfd68dd) +++ Ringtoets/Common/src/Ringtoets.Common.Forms/Views/FailureMechanismResultView.cs (.../FailureMechanismResultView.cs) (revision c4d1fab26e8a8a24845606047d51628f6bf4fe5e) @@ -20,6 +20,7 @@ // All rights reserved. using System; +using System.Collections.Generic; using System.Linq; using System.Windows.Forms; using Core.Common.Base; @@ -95,8 +96,10 @@ { base.OnLoad(e); AddDataGridColumns(); - } + DataGridViewControl.CellFormatting += OnCellFormatting; + } + /// /// Creates a display object for which is added to the /// on the . @@ -111,6 +114,8 @@ failureMechanismSectionResultObserver.Dispose(); failureMechanismSectionResultsObserver.Dispose(); + DataGridViewControl.CellFormatting -= OnCellFormatting; + if (disposing) { components?.Dispose(); @@ -147,5 +152,27 @@ /// Adds the columns to the view. /// protected abstract void AddDataGridColumns(); + + protected virtual IEnumerable> GetFormattingRules() + { + yield break; + } + + private void OnCellFormatting(object sender, DataGridViewCellFormattingEventArgs e) + { + TSectionResultRow row = GetDataAtRow(e.RowIndex); + IEnumerable> rules = GetFormattingRules(); + + foreach (DataGridViewColumnFormattingRule formattingRule in rules.Where(r => r.ColumnIndices.Contains(e.ColumnIndex))) + { + if (formattingRule.Rules.All(func => func(row))) + { + formattingRule.RulesMeetAction(e.RowIndex, e.ColumnIndex); + break; + } + + formattingRule.RulesDoNotMeetAction?.Invoke(e.RowIndex, e.ColumnIndex); + } + } } } \ No newline at end of file Index: Ringtoets/Common/test/Ringtoets.Common.Data.TestUtil.Test/FailureMechanismSectionResultTestFactoryTest.cs =================================================================== diff -u -r1a65cb67261da126d57a2c890acfb78b4347eb3d -rc4d1fab26e8a8a24845606047d51628f6bf4fe5e --- Ringtoets/Common/test/Ringtoets.Common.Data.TestUtil.Test/FailureMechanismSectionResultTestFactoryTest.cs (.../FailureMechanismSectionResultTestFactoryTest.cs) (revision 1a65cb67261da126d57a2c890acfb78b4347eb3d) +++ Ringtoets/Common/test/Ringtoets.Common.Data.TestUtil.Test/FailureMechanismSectionResultTestFactoryTest.cs (.../FailureMechanismSectionResultTestFactoryTest.cs) (revision c4d1fab26e8a8a24845606047d51628f6bf4fe5e) @@ -29,7 +29,7 @@ public class FailureMechanismSectionResultTestFactoryTest { [Test] - public void CreateFailureMechanismSectionResult_ReturnsExpectedValues() + public void CreateFailureMechanismSectionResult_WithoutName_ReturnsExpectedValues() { // Call TestFailureMechanismSectionResult sectionResult = FailureMechanismSectionResultTestFactory.CreateFailureMechanismSectionResult(); @@ -43,5 +43,24 @@ new Point2D(1, 0) }, sectionResult.Section.Points); } + + [Test] + public void CreateFailureMechanismSectionResult_WithName_ReturnsExpectedValues() + { + // Setup + const string name = "Vak 1"; + + // Call + TestFailureMechanismSectionResult sectionResult = FailureMechanismSectionResultTestFactory.CreateFailureMechanismSectionResult(name); + + // Assert + Assert.AreEqual(AssessmentLayerOneState.NotAssessed, sectionResult.AssessmentLayerOne); + Assert.AreEqual(name, sectionResult.Section.Name); + CollectionAssert.AreEqual(new[] + { + new Point2D(0, 0), + new Point2D(1, 0) + }, sectionResult.Section.Points); + } } } \ No newline at end of file Index: Ringtoets/Common/test/Ringtoets.Common.Data.TestUtil/FailureMechanismSectionResultTestFactory.cs =================================================================== diff -u -r1a65cb67261da126d57a2c890acfb78b4347eb3d -rc4d1fab26e8a8a24845606047d51628f6bf4fe5e --- Ringtoets/Common/test/Ringtoets.Common.Data.TestUtil/FailureMechanismSectionResultTestFactory.cs (.../FailureMechanismSectionResultTestFactory.cs) (revision 1a65cb67261da126d57a2c890acfb78b4347eb3d) +++ Ringtoets/Common/test/Ringtoets.Common.Data.TestUtil/FailureMechanismSectionResultTestFactory.cs (.../FailureMechanismSectionResultTestFactory.cs) (revision c4d1fab26e8a8a24845606047d51628f6bf4fe5e) @@ -32,10 +32,11 @@ /// /// Creates a default . /// + /// The name of the section. /// A valid . - public static TestFailureMechanismSectionResult CreateFailureMechanismSectionResult() + public static TestFailureMechanismSectionResult CreateFailureMechanismSectionResult(string name = "test") { - return new TestFailureMechanismSectionResult(FailureMechanismSectionTestFactory.CreateFailureMechanismSection()); + return new TestFailureMechanismSectionResult(FailureMechanismSectionTestFactory.CreateFailureMechanismSection(name)); } } } \ No newline at end of file Index: Ringtoets/Common/test/Ringtoets.Common.Data.TestUtil/FailureMechanismSectionTestFactory.cs =================================================================== diff -u -rf2c1d92559e378e4dab2a0c40592ef8f0f1801cc -rc4d1fab26e8a8a24845606047d51628f6bf4fe5e --- Ringtoets/Common/test/Ringtoets.Common.Data.TestUtil/FailureMechanismSectionTestFactory.cs (.../FailureMechanismSectionTestFactory.cs) (revision f2c1d92559e378e4dab2a0c40592ef8f0f1801cc) +++ Ringtoets/Common/test/Ringtoets.Common.Data.TestUtil/FailureMechanismSectionTestFactory.cs (.../FailureMechanismSectionTestFactory.cs) (revision c4d1fab26e8a8a24845606047d51628f6bf4fe5e) @@ -37,8 +37,6 @@ /// /// The name of the section. /// A valid . - /// Thrown when - /// is null. public static FailureMechanismSection CreateFailureMechanismSection(string name = "test") { return CreateFailureMechanismSection(name, new[] Index: Ringtoets/Common/test/Ringtoets.Common.Forms.Test/Views/FailureMechanismResultViewTest.cs =================================================================== diff -u -rbc1babf3ccf2bc4e1fed91210f2cc5d2b7dea774 -rc4d1fab26e8a8a24845606047d51628f6bf4fe5e --- Ringtoets/Common/test/Ringtoets.Common.Forms.Test/Views/FailureMechanismResultViewTest.cs (.../FailureMechanismResultViewTest.cs) (revision bc1babf3ccf2bc4e1fed91210f2cc5d2b7dea774) +++ Ringtoets/Common/test/Ringtoets.Common.Forms.Test/Views/FailureMechanismResultViewTest.cs (.../FailureMechanismResultViewTest.cs) (revision c4d1fab26e8a8a24845606047d51628f6bf4fe5e) @@ -20,8 +20,10 @@ // All rights reserved. using System; +using System.Collections.Generic; using System.Windows.Forms; using Core.Common.Base; +using Core.Common.Controls.DataGrid; using Core.Common.Controls.Views; using NUnit.Extensions.Forms; using NUnit.Framework; @@ -61,10 +63,22 @@ Assert.IsInstanceOf(view); Assert.IsInstanceOf(view); Assert.IsNull(view.Data); + Assert.AreSame(failureMechanism, view.FailureMechanism); } } [Test] + public void Constructor_FailureMechanismSectionResultsNull_ThrowsArgumentNullException() + { + // Call + TestDelegate call = () => new TestFailureMechanismResultView(null, new TestFailureMechanism()); + + // Assert + var exception = Assert.Throws(call); + Assert.AreEqual("failureMechanismSectionResults", exception.ParamName); + } + + [Test] public void Constructor_FailureMechanismNull_ThrowsArgumentNullException() { // Call @@ -116,7 +130,7 @@ } [Test] - public void GivenFailureMechanismResultView_WhenSingleFailureMechanismSectionResultNotifiesObservers_ThenCellFormattingEventFired() + public void GivenFailureMechanismResultView_WhenSingleFailureMechanismSectionResultNotifiesObservers_ThenDataGridViewInvalidated() { // Given TestFailureMechanismSectionResult sectionResult = FailureMechanismSectionResultTestFactory.CreateFailureMechanismSectionResult(); @@ -128,18 +142,126 @@ using (ShowFailureMechanismResultsView(sectionResults)) { + var invalidatedCounter = 0; var dataGridView = (DataGridView) new ControlTester("dataGridView").TheObject; - var cellFormattingEventFired = false; - dataGridView.CellFormatting += (sender, args) => cellFormattingEventFired = true; + dataGridView.Invalidated += (sender, args) => invalidatedCounter++; // When sectionResult.NotifyObservers(); // Then - Assert.IsTrue(cellFormattingEventFired); + Assert.AreEqual(1, invalidatedCounter); } } + [Test] + public void GivenFailureMechanismResultViewWithFormattingRules_WhenCellFormattingEventFired_ThenFormattingRulesEvaluated() + { + // Given + TestFailureMechanismSectionResult sectionResult = FailureMechanismSectionResultTestFactory.CreateFailureMechanismSectionResult(); + + var sectionResults = new ObservableList + { + sectionResult + }; + + using (TestFailureMechanismResultView view = ShowFailureMechanismResultsView(sectionResults)) + { + var dataGridView = (DataGridView) new ControlTester("dataGridView").TheObject; + + //Precondition + Assert.IsFalse(view.Evaluated); + + // When + dataGridView.Refresh(); + + // Then + Assert.IsTrue(view.Evaluated); + } + } + + [Test] + public void GivenFailureMechanismResultViewWithFormatting_WhenRulesMeet_ThenRuleMeetActionPerformed() + { + // Given + TestFailureMechanismSectionResult sectionResult = FailureMechanismSectionResultTestFactory.CreateFailureMechanismSectionResult(); + + var sectionResults = new ObservableList + { + sectionResult + }; + + using (TestFailureMechanismResultView view = ShowFailureMechanismResultsView(sectionResults)) + { + var dataGridView = (DataGridView) new ControlTester("dataGridView").TheObject; + + //Precondition + Assert.IsFalse(view.RulesMeetActionPerformed); + Assert.IsFalse(view.RulesDoNotMeetActionPerformed); + + // When + dataGridView.Refresh(); + + // Then + Assert.IsTrue(view.RulesMeetActionPerformed); + Assert.IsFalse(view.RulesDoNotMeetActionPerformed); + } + } + + [Test] + public void GivenFailureMechanismResultViewWithFormatting_WhenRulesDoNotMeet_ThenRuleDoNotMeetActionPerformed() + { + // Given + TestFailureMechanismSectionResult sectionResult = FailureMechanismSectionResultTestFactory.CreateFailureMechanismSectionResult("Other name"); + + var sectionResults = new ObservableList + { + sectionResult + }; + + using (TestFailureMechanismResultView view = ShowFailureMechanismResultsView(sectionResults)) + { + var dataGridView = (DataGridView) new ControlTester("dataGridView").TheObject; + + //Precondition + Assert.IsFalse(view.RulesMeetActionPerformed); + Assert.IsFalse(view.RulesDoNotMeetActionPerformed); + + // When + dataGridView.Refresh(); + + // Then + Assert.IsFalse(view.RulesMeetActionPerformed); + Assert.IsTrue(view.RulesDoNotMeetActionPerformed); + } + } + + [Test] + public void GivenFailureMechanismResultViewWithFormatting_WhenRulesDoNotMeetAndNoActionGiven_ThenNoActionPerformed() + { + // Given + TestFailureMechanismSectionResult sectionResult = FailureMechanismSectionResultTestFactory.CreateFailureMechanismSectionResult(); + + var sectionResults = new ObservableList + { + sectionResult + }; + + using (TestFailureMechanismResultView view = ShowFailureMechanismResultsView(sectionResults)) + { + var dataGridView = (DataGridView) new ControlTester("dataGridView").TheObject; + + //Precondition + Assert.IsFalse(view.RulesDoNotMeetActionPerformed); + + // When + dataGridView.Refresh(); + + // Then + Assert.IsFalse(view.RulesDoNotMeetActionPerformed); + } + } + private TestFailureMechanismResultView ShowFailureMechanismResultsView(IObservableEnumerable sectionResults) { var failureMechanismResultView = new TestFailureMechanismResultView(sectionResults, new TestFailureMechanism()); @@ -167,6 +289,37 @@ { DataGridViewControl.AddTextBoxColumn("Name", "Test", true); } + + protected override IEnumerable>> GetFormattingRules() + { + yield return new DataGridViewColumnFormattingRule>( + new [] { 0 }, + new Func, bool>[] + { + row => + { + Evaluated = true; + return row.Name.Equals("test"); + } + }, + (i, i1) => RulesMeetActionPerformed = true, + (i, i1) => RulesDoNotMeetActionPerformed = true); + + yield return new DataGridViewColumnFormattingRule>( + new [] { 0 }, + new Func, bool>[] + { + row => row.Name.Equals("Vak 1") + }, + (i, i1) => {}, + null); + } + + public bool Evaluated { get; private set; } + + public bool RulesMeetActionPerformed { get; private set; } + + public bool RulesDoNotMeetActionPerformed { get; private set; } } public class TestRow : FailureMechanismSectionResultRow