Index: Ringtoets/Common/src/Ringtoets.Common.Forms/PropertyClasses/FailureMechanismSectionsProperties.cs =================================================================== diff -u -rb19983374f4a64979bbb5167bcab288a921aa5e5 -r23a6dd9ff6a575884879762e0e4aff01e21611ea --- Ringtoets/Common/src/Ringtoets.Common.Forms/PropertyClasses/FailureMechanismSectionsProperties.cs (.../FailureMechanismSectionsProperties.cs) (revision b19983374f4a64979bbb5167bcab288a921aa5e5) +++ Ringtoets/Common/src/Ringtoets.Common.Forms/PropertyClasses/FailureMechanismSectionsProperties.cs (.../FailureMechanismSectionsProperties.cs) (revision 23a6dd9ff6a575884879762e0e4aff01e21611ea) @@ -23,6 +23,7 @@ using System.Collections.Generic; using System.ComponentModel; using System.Linq; +using Core.Common.Base; using Core.Common.Gui.Attributes; using Core.Common.Gui.Converters; using Core.Common.Gui.PropertyBag; @@ -37,19 +38,31 @@ /// public class FailureMechanismSectionsProperties : ObjectProperties> { + private readonly Observer failureMechanismObserver; + /// /// Creates a new instance of . /// /// The sections to show the properties for. - /// Thrown when - /// is null. - public FailureMechanismSectionsProperties(IEnumerable sections) + /// The failure mechanisms which the sections belong to. + /// Thrown when any parameter is null. + public FailureMechanismSectionsProperties(IEnumerable sections, IFailureMechanism failureMechanism) { if (sections == null) { throw new ArgumentNullException(nameof(sections)); } + if (failureMechanism == null) + { + throw new ArgumentNullException(nameof(failureMechanism)); + } + + failureMechanismObserver = new Observer(OnRefreshRequired) + { + Observable = failureMechanism + }; + Data = sections; } @@ -65,5 +78,12 @@ return data.Select(section => new FailureMechanismSectionProperties(section)).ToArray(); } } + + public override void Dispose() + { + failureMechanismObserver.Dispose(); + + base.Dispose(); + } } } \ No newline at end of file Index: Ringtoets/Common/test/Ringtoets.Common.Forms.Test/PropertyClasses/FailureMechanismSectionsPropertiesTest.cs =================================================================== diff -u -rf5df90d2b494f01b2b7daf90e8453e0e010688b5 -r23a6dd9ff6a575884879762e0e4aff01e21611ea --- Ringtoets/Common/test/Ringtoets.Common.Forms.Test/PropertyClasses/FailureMechanismSectionsPropertiesTest.cs (.../FailureMechanismSectionsPropertiesTest.cs) (revision f5df90d2b494f01b2b7daf90e8453e0e010688b5) +++ Ringtoets/Common/test/Ringtoets.Common.Forms.Test/PropertyClasses/FailureMechanismSectionsPropertiesTest.cs (.../FailureMechanismSectionsPropertiesTest.cs) (revision 23a6dd9ff6a575884879762e0e4aff01e21611ea) @@ -27,7 +27,9 @@ using Core.Common.Gui.PropertyBag; using Core.Common.TestUtil; using NUnit.Framework; +using Rhino.Mocks; using Ringtoets.Common.Data.FailureMechanism; +using Ringtoets.Common.Data.TestUtil; using Ringtoets.Common.Forms.PropertyClasses; namespace Ringtoets.Common.Forms.Test.PropertyClasses @@ -38,22 +40,46 @@ [Test] public void Constructor_FailureMechanismSectionsNull_ThrowsArgumentNullException() { + // Setup + var mocks = new MockRepository(); + var failureMechanism = mocks.Stub(); + mocks.ReplayAll(); + // Call - TestDelegate call = () => new FailureMechanismSectionsProperties(null); + TestDelegate call = () => new FailureMechanismSectionsProperties(null, failureMechanism); // Assert var exception = Assert.Throws(call); Assert.AreEqual("sections", exception.ParamName); + mocks.VerifyAll(); } [Test] + public void Constructor_FailureMechanismNull_ThrowsArgumentNullException() + { + // Setup + IEnumerable sections = Enumerable.Empty(); + + // Call + TestDelegate call = () => new FailureMechanismSectionsProperties(sections, null); + + // Assert + var exception = Assert.Throws(call); + Assert.AreEqual("failureMechanism", exception.ParamName); + } + + [Test] public void Constructor_ExpectedValues() { // Setup + var mocks = new MockRepository(); + var failureMechanism = mocks.Stub(); + mocks.ReplayAll(); + IEnumerable sections = Enumerable.Empty(); // Call - var properties = new FailureMechanismSectionsProperties(sections); + var properties = new FailureMechanismSectionsProperties(sections, failureMechanism); // Assert Assert.IsInstanceOf>>(properties); @@ -63,16 +89,21 @@ nameof(FailureMechanismSectionsProperties.Sections)); Assert.IsNotNull(properties.Sections); Assert.AreEqual(sections.Count(), properties.Sections.Length); + mocks.VerifyAll(); } [Test] public void Constructor_Always_PropertiesHaveExpectedAttributesValues() { // Setup + var mocks = new MockRepository(); + var failureMechanism = mocks.Stub(); + mocks.ReplayAll(); + IEnumerable sections = Enumerable.Empty(); // Call - var properties = new FailureMechanismSectionsProperties(sections); + var properties = new FailureMechanismSectionsProperties(sections, failureMechanism); // Assert PropertyDescriptorCollection dynamicProperties = PropertiesTestHelper.GetAllVisiblePropertyDescriptors(properties); @@ -84,6 +115,26 @@ "Vakindeling", "Vakindeling waarmee de waterkering voor dit toetsspoor is geschematiseerd ten behoeve van de beoordeling.", true); + mocks.VerifyAll(); } + + [Test] + public void GivenPropertyControlWithData_WhenFailureMechanismUpdated_RefreshRequiredEventRaised() + { + // Given + var failureMechanism = new TestFailureMechanism(); + IEnumerable sections = Enumerable.Empty(); + + var properties = new FailureMechanismSectionsProperties(sections, failureMechanism); + + var refreshRequiredRaised = 0; + properties.RefreshRequired += (sender, args) => refreshRequiredRaised++; + + // When + failureMechanism.NotifyObservers(); + + // Then + Assert.AreEqual(1, refreshRequiredRaised); + } } } \ No newline at end of file Index: Ringtoets/Integration/src/Ringtoets.Integration.Plugin/RingtoetsPlugin.cs =================================================================== diff -u -r9a848a7f52c953e8a44544609d919ea45ac84c6e -r23a6dd9ff6a575884879762e0e4aff01e21611ea --- Ringtoets/Integration/src/Ringtoets.Integration.Plugin/RingtoetsPlugin.cs (.../RingtoetsPlugin.cs) (revision 9a848a7f52c953e8a44544609d919ea45ac84c6e) +++ Ringtoets/Integration/src/Ringtoets.Integration.Plugin/RingtoetsPlugin.cs (.../RingtoetsPlugin.cs) (revision 23a6dd9ff6a575884879762e0e4aff01e21611ea) @@ -361,7 +361,7 @@ }; yield return new PropertyInfo { - CreateInstance = context => new FailureMechanismSectionsProperties(context.WrappedData.Sections) + CreateInstance = context => new FailureMechanismSectionsProperties(context.WrappedData.Sections, context.WrappedData) }; yield return new PropertyInfo { Index: Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/PropertyInfos/FailureMechanismSectionsPropertyInfoTest.cs =================================================================== diff -u -r7aff630a7c9bb21707781ca2bd0f977d4715891d -r23a6dd9ff6a575884879762e0e4aff01e21611ea --- Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/PropertyInfos/FailureMechanismSectionsPropertyInfoTest.cs (.../FailureMechanismSectionsPropertyInfoTest.cs) (revision 7aff630a7c9bb21707781ca2bd0f977d4715891d) +++ Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/PropertyInfos/FailureMechanismSectionsPropertyInfoTest.cs (.../FailureMechanismSectionsPropertyInfoTest.cs) (revision 23a6dd9ff6a575884879762e0e4aff01e21611ea) @@ -65,6 +65,8 @@ var mocks = new MockRepository(); var failureMechanism = mocks.Stub(); failureMechanism.Stub(fm => fm.Sections).Return(Enumerable.Empty()); + failureMechanism.Stub(fm => fm.Attach(null)).IgnoreArguments(); + failureMechanism.Stub(fm => fm.Detach(null)).IgnoreArguments(); var assessmentSection = mocks.Stub(); mocks.ReplayAll();