Index: Ringtoets/ClosingStructures/src/Ringtoets.ClosingStructures.Forms/PropertyClasses/ClosingStructuresFailureMechanismProperties.cs =================================================================== diff -u -rb9a59dd5f30c8de46d0cabb4e1609c09176a4246 -r5f8541d2a46730d67fc2d859caa6de2921bbc820 --- Ringtoets/ClosingStructures/src/Ringtoets.ClosingStructures.Forms/PropertyClasses/ClosingStructuresFailureMechanismProperties.cs (.../ClosingStructuresFailureMechanismProperties.cs) (revision b9a59dd5f30c8de46d0cabb4e1609c09176a4246) +++ Ringtoets/ClosingStructures/src/Ringtoets.ClosingStructures.Forms/PropertyClasses/ClosingStructuresFailureMechanismProperties.cs (.../ClosingStructuresFailureMechanismProperties.cs) (revision 5f8541d2a46730d67fc2d859caa6de2921bbc820) @@ -19,7 +19,9 @@ // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. +using System; using System.ComponentModel; +using Core.Common.Base; using Core.Common.Base.Data; using Core.Common.Gui.Attributes; using Core.Common.Gui.PropertyBag; @@ -49,6 +51,30 @@ private const int modelFactorSubCriticalFlowPropertyIndex = 9; private const int modelFactorInflowVolumePropertyIndex = 10; + private readonly IFailureMechanismPropertyChangeHandler propertyChangeHandler; + + /// + /// Creates a new instance of . + /// + /// The instance to show the properties of. + /// Handler responsible for handling effects of a property change. + /// Thrown when any input parameter is null. + public ClosingStructuresFailureMechanismProperties( + ClosingStructuresFailureMechanism data, + IFailureMechanismPropertyChangeHandler handler) + { + if (data == null) + { + throw new ArgumentNullException("data"); + } + if (handler == null) + { + throw new ArgumentNullException("handler"); + } + Data = data; + propertyChangeHandler = handler; + } + #region Length effect parameters [PropertyOrder(cPropertyIndex)] @@ -75,8 +101,11 @@ } set { - data.GeneralInput.N2A = value; - data.NotifyObservers(); + if (propertyChangeHandler.ConfirmPropertyChange()) + { + data.GeneralInput.N2A = value; + ClearOutputAndNotifyObservers(); + } } } @@ -197,5 +226,14 @@ } #endregion + + private void ClearOutputAndNotifyObservers() + { + foreach (IObservable changedObject in propertyChangeHandler.PropertyChanged(data)) + { + changedObject.NotifyObservers(); + } + data.NotifyObservers(); + } } } \ No newline at end of file Index: Ringtoets/ClosingStructures/src/Ringtoets.ClosingStructures.Plugin/ClosingStructuresPlugin.cs =================================================================== diff -u -rbdfdac3498b97ecf6bf04d53c581f557e7e87795 -r5f8541d2a46730d67fc2d859caa6de2921bbc820 --- Ringtoets/ClosingStructures/src/Ringtoets.ClosingStructures.Plugin/ClosingStructuresPlugin.cs (.../ClosingStructuresPlugin.cs) (revision bdfdac3498b97ecf6bf04d53c581f557e7e87795) +++ Ringtoets/ClosingStructures/src/Ringtoets.ClosingStructures.Plugin/ClosingStructuresPlugin.cs (.../ClosingStructuresPlugin.cs) (revision 5f8541d2a46730d67fc2d859caa6de2921bbc820) @@ -60,10 +60,9 @@ { yield return new PropertyInfo { - CreateInstance = context => new ClosingStructuresFailureMechanismProperties - { - Data = context.WrappedData - } + CreateInstance = context => new ClosingStructuresFailureMechanismProperties( + context.WrappedData, + new FailureMechanismPropertyChangeHandler()) }; yield return new PropertyInfo(); yield return new PropertyInfo(); Index: Ringtoets/ClosingStructures/test/Ringtoets.ClosingStructures.Forms.Test/PropertyClasses/ClosingStructuresFailureMechanismPropertiesTest.cs =================================================================== diff -u -rc53329fe1a36963d7e55abd8882b8eef43a685aa -r5f8541d2a46730d67fc2d859caa6de2921bbc820 --- Ringtoets/ClosingStructures/test/Ringtoets.ClosingStructures.Forms.Test/PropertyClasses/ClosingStructuresFailureMechanismPropertiesTest.cs (.../ClosingStructuresFailureMechanismPropertiesTest.cs) (revision c53329fe1a36963d7e55abd8882b8eef43a685aa) +++ Ringtoets/ClosingStructures/test/Ringtoets.ClosingStructures.Forms.Test/PropertyClasses/ClosingStructuresFailureMechanismPropertiesTest.cs (.../ClosingStructuresFailureMechanismPropertiesTest.cs) (revision 5f8541d2a46730d67fc2d859caa6de2921bbc820) @@ -19,43 +19,70 @@ // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. +using System; using System.ComponentModel; +using System.Linq; using Core.Common.Base; using Core.Common.Gui.PropertyBag; using Core.Common.TestUtil; using NUnit.Framework; using Rhino.Mocks; using Ringtoets.ClosingStructures.Data; using Ringtoets.ClosingStructures.Forms.PropertyClasses; +using Ringtoets.Common.Forms.PropertyClasses; namespace Ringtoets.ClosingStructures.Forms.Test.PropertyClasses { [TestFixture] public class ClosingStructuresFailureMechanismPropertiesTest { [Test] - public void Constructor_ExpectedValues() + public void Constructor_DataIsNull_ThrowArgumentNullException() { + // Setup + var mocks = new MockRepository(); + IFailureMechanismPropertyChangeHandler handler = CreateSimpleHandler(mocks); + mocks.ReplayAll(); + // Call - var properties = new ClosingStructuresFailureMechanismProperties(); + TestDelegate test = () => new ClosingStructuresFailureMechanismProperties(null, handler); // Assert - Assert.IsInstanceOf>(properties); - Assert.IsNull(properties.Data); + string paramName = Assert.Throws(test).ParamName; + Assert.AreEqual("data", paramName); + mocks.VerifyAll(); } [Test] - public void Data_SetNewFailureMechanismContext_ReturnCorrectPropertyValues() + public void Constructor_ChangeHandlerIsNull_ThrowArgumentNullException() { + // Call + TestDelegate test = () => new ClosingStructuresFailureMechanismProperties( + new ClosingStructuresFailureMechanism(), + null); + + // Assert + string paramName = Assert.Throws(test).ParamName; + Assert.AreEqual("handler", paramName); + } + + [Test] + public void Constructor_ValidValues_ExpectedValues() + { // Setup + MockRepository mocks = new MockRepository(); + IFailureMechanismPropertyChangeHandler changeHandler = CreateSimpleHandler(mocks); + mocks.ReplayAll(); + var failureMechanism = new ClosingStructuresFailureMechanism(); - var properties = new ClosingStructuresFailureMechanismProperties(); - // Call - properties.Data = failureMechanism; + var properties = new ClosingStructuresFailureMechanismProperties(failureMechanism, changeHandler); // Assert + Assert.IsInstanceOf>(properties); + Assert.AreSame(failureMechanism, properties.Data); + Assert.AreEqual("Kunstwerken - Betrouwbaarheid sluiting kunstwerk", properties.Name); Assert.AreEqual("BSKW", @@ -76,46 +103,22 @@ Assert.AreEqual(generalInput.ModelFactorSubCriticalFlow.Mean, properties.ModelFactorSubCriticalFlow.Mean); Assert.AreEqual(generalInput.ModelFactorSubCriticalFlow.CoefficientOfVariation, properties.ModelFactorSubCriticalFlow.CoefficientOfVariation); Assert.AreEqual(generalInput.ModelFactorInflowVolume.Value, properties.ModelFactorInflowVolume.Value); - } - [Test] - public void SetProperties_IndividualProperties_UpdateDataAndNotifyObservers() - { - // Setup - const int numberOfChangedProperties = 1; - var mockRepository = new MockRepository(); - var observerMock = mockRepository.StrictMock(); - observerMock.Expect(o => o.UpdateObserver()).Repeat.Times(numberOfChangedProperties); - mockRepository.ReplayAll(); - - var failureMechanism = new ClosingStructuresFailureMechanism(); - failureMechanism.Attach(observerMock); - var properties = new ClosingStructuresFailureMechanismProperties - { - Data = failureMechanism - }; - - const int newN2A = 10; - - // Call - properties.N2A = newN2A; - - // Assert - Assert.AreEqual(newN2A, failureMechanism.GeneralInput.N2A); - mockRepository.VerifyAll(); + mocks.VerifyAll(); } [Test] public void Constructor_Always_PropertiesHaveExpectedAttributesValues() { // Setup - var failureMechanism = new ClosingStructuresFailureMechanism(); + var mocks = new MockRepository(); + var changeHandler = CreateSimpleHandler(mocks); + mocks.ReplayAll(); // Call - var properties = new ClosingStructuresFailureMechanismProperties - { - Data = failureMechanism - }; + var properties = new ClosingStructuresFailureMechanismProperties( + new ClosingStructuresFailureMechanism(), + changeHandler); // Assert var generalCategory = "Algemeen"; @@ -196,6 +199,116 @@ "Modelfactor instromend volume [-]", "Modelfactor instromend volume.", true); + mocks.VerifyAll(); } + + [Test] + [TestCase(-10)] + [TestCase(-1)] + [TestCase(41)] + [TestCase(141)] + public void N2A_InvalidValueWithConfirmation_UpdateDataAndNotifyObservers(int value) + { + // Setup + + var mockRepository = new MockRepository(); + var observerMock = mockRepository.StrictMock(); + + var handler = mockRepository.Stub(); + handler.Expect(h => h.ConfirmPropertyChange()).Return(true); + + mockRepository.ReplayAll(); + + var failureMechanism = new ClosingStructuresFailureMechanism(); + failureMechanism.Attach(observerMock); + + var properties = new ClosingStructuresFailureMechanismProperties(failureMechanism, handler); + + // Call + TestDelegate test = () => properties.N2A = value; + + // Assert + Assert.Throws(test); + mockRepository.VerifyAll(); + } + + [Test] + [TestCase(0)] + [TestCase(5)] + [TestCase(21)] + [TestCase(40)] + public void N2A_SetValidValueWithConfirmation_UpdateDataAndNotifyObservers(int value) + { + // Setup + var failureMechanism = new ClosingStructuresFailureMechanism(); + + var mockRepository = new MockRepository(); + var observerMock = mockRepository.StrictMock(); + observerMock.Expect(o => o.UpdateObserver()); + + var observableMock = mockRepository.StrictMock(); + observableMock.Expect(o => o.NotifyObservers()); + + var handler = mockRepository.Stub(); + handler.Expect(h => h.ConfirmPropertyChange()).Return(true); + handler.Expect(h => h.PropertyChanged(failureMechanism)).Return(new[] { observableMock }); + + mockRepository.ReplayAll(); + + failureMechanism.Attach(observerMock); + + var properties = new ClosingStructuresFailureMechanismProperties(failureMechanism, handler); + + // Call + properties.N2A = value; + + // Assert + Assert.AreEqual(value, failureMechanism.GeneralInput.N2A); + mockRepository.VerifyAll(); + } + + [Test] + [TestCase(-10)] + [TestCase(-1)] + [TestCase(41)] + [TestCase(141)] + [TestCase(0)] + [TestCase(5)] + [TestCase(21)] + [TestCase(40)] + public void N2A_SetValueWithoutConfirmation_NoValueChangeNoUpdates(int value) + { + // Setup + var mockRepository = new MockRepository(); + var observerMock = mockRepository.StrictMock(); + + var handler = mockRepository.Stub(); + handler.Expect(h => h.ConfirmPropertyChange()).Return(false); + + mockRepository.ReplayAll(); + + var failureMechanism = new ClosingStructuresFailureMechanism(); + failureMechanism.Attach(observerMock); + + var properties = new ClosingStructuresFailureMechanismProperties(failureMechanism, handler); + + var oldN2A = failureMechanism.GeneralInput.N2A; + + // Call + properties.N2A = value; + + // Assert + Assert.AreEqual(oldN2A, failureMechanism.GeneralInput.N2A); + mockRepository.VerifyAll(); + } + + private IFailureMechanismPropertyChangeHandler CreateSimpleHandler(MockRepository mockRepository) + { + var handler = mockRepository.Stub(); + handler.Stub(h => h.ConfirmPropertyChange()).Return(true); + handler.Stub(h => h.PropertyChanged(Arg.Is.NotNull)).Return(Enumerable.Empty()); + + return handler; + } } } \ No newline at end of file Index: Ringtoets/ClosingStructures/test/Ringtoets.ClosingStructures.Plugin.Test/PropertyInfos/ClosingStructuresFailureMechanismContextPropertyInfoTest.cs =================================================================== diff -u --- Ringtoets/ClosingStructures/test/Ringtoets.ClosingStructures.Plugin.Test/PropertyInfos/ClosingStructuresFailureMechanismContextPropertyInfoTest.cs (revision 0) +++ Ringtoets/ClosingStructures/test/Ringtoets.ClosingStructures.Plugin.Test/PropertyInfos/ClosingStructuresFailureMechanismContextPropertyInfoTest.cs (revision 5f8541d2a46730d67fc2d859caa6de2921bbc820) @@ -0,0 +1,59 @@ +using System.Linq; +using Core.Common.Gui.Plugin; +using NUnit.Framework; +using Rhino.Mocks; +using Ringtoets.ClosingStructures.Data; +using Ringtoets.ClosingStructures.Forms.PresentationObjects; +using Ringtoets.ClosingStructures.Forms.PropertyClasses; +using Ringtoets.Common.Data.AssessmentSection; + +namespace Ringtoets.ClosingStructures.Plugin.Test.PropertyInfos +{ + public class ClosingStructuresFailureMechanismContextPropertyInfoTest + { + private ClosingStructuresPlugin plugin; + private PropertyInfo info; + + [SetUp] + public void SetUp() + { + plugin = new ClosingStructuresPlugin(); + info = plugin.GetPropertyInfos().First(tni => tni.PropertyObjectType == typeof(ClosingStructuresFailureMechanismProperties)); + } + + [TearDown] + public void TearDown() + { + plugin.Dispose(); + } + + [Test] + public void Initialized_Always_ExpectedPropertiesSet() + { + // Assert + Assert.AreEqual(typeof(ClosingStructuresFailureMechanismContext), info.DataType); + Assert.AreEqual(typeof(ClosingStructuresFailureMechanismProperties), info.PropertyObjectType); + } + + [Test] + public void CreateInstance_Always_NewPropertiesWithFailureMechanismContextAsData() + { + // Setup + var mocks = new MockRepository(); + var assessmentSection = mocks.StrictMock(); + mocks.ReplayAll(); + + var failureMechanism = new ClosingStructuresFailureMechanism(); + var context = new ClosingStructuresFailureMechanismContext(failureMechanism, assessmentSection); + + // Call + var objectProperties = info.CreateInstance(context); + + // Assert + Assert.IsInstanceOf(objectProperties); + Assert.AreSame(failureMechanism, objectProperties.Data); + + mocks.VerifyAll(); + } + } +} \ No newline at end of file Index: Ringtoets/ClosingStructures/test/Ringtoets.ClosingStructures.Plugin.Test/Ringtoets.ClosingStructures.Plugin.Test.csproj =================================================================== diff -u -r586d097de0087256cb5cf3dda3a3c612721fee9c -r5f8541d2a46730d67fc2d859caa6de2921bbc820 --- Ringtoets/ClosingStructures/test/Ringtoets.ClosingStructures.Plugin.Test/Ringtoets.ClosingStructures.Plugin.Test.csproj (.../Ringtoets.ClosingStructures.Plugin.Test.csproj) (revision 586d097de0087256cb5cf3dda3a3c612721fee9c) +++ Ringtoets/ClosingStructures/test/Ringtoets.ClosingStructures.Plugin.Test/Ringtoets.ClosingStructures.Plugin.Test.csproj (.../Ringtoets.ClosingStructures.Plugin.Test.csproj) (revision 5f8541d2a46730d67fc2d859caa6de2921bbc820) @@ -65,6 +65,7 @@ Properties\GlobalAssembly.cs + Index: Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Forms.Test/PropertyClasses/GrassCoverErosionInwardsFailureMechanismContextPropertiesTest.cs =================================================================== diff -u -r545b105a213ed85564861b4bcf6d2d6425dbde50 -r5f8541d2a46730d67fc2d859caa6de2921bbc820 --- Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Forms.Test/PropertyClasses/GrassCoverErosionInwardsFailureMechanismContextPropertiesTest.cs (.../GrassCoverErosionInwardsFailureMechanismContextPropertiesTest.cs) (revision 545b105a213ed85564861b4bcf6d2d6425dbde50) +++ Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Forms.Test/PropertyClasses/GrassCoverErosionInwardsFailureMechanismContextPropertiesTest.cs (.../GrassCoverErosionInwardsFailureMechanismContextPropertiesTest.cs) (revision 5f8541d2a46730d67fc2d859caa6de2921bbc820) @@ -122,75 +122,6 @@ } [Test] - [TestCase(1)] - [TestCase(10)] - [TestCase(20)] - public void LengthEffect_SetValidValue_UpdateDataAndNotifyObservers(int newLengthEffect) - { - // Setup - var observerMock = mockRepository.StrictMock(); - observerMock.Expect(o => o.UpdateObserver()); - - var observableMock = mockRepository.StrictMock(); - observableMock.Expect(o => o.NotifyObservers()); - - var changeHandler = mockRepository.StrictMock(); - changeHandler.Expect(h => h.ConfirmPropertyChange()).Return(true); - changeHandler.Expect(h => h.PropertyChanged(Arg.Is.NotNull)).Return(new[] { observableMock }); - - var assessmentSectionMock = mockRepository.StrictMock(); - - mockRepository.ReplayAll(); - - var failureMechanism = new GrassCoverErosionInwardsFailureMechanism(); - failureMechanism.Attach(observerMock); - - var properties = new GrassCoverErosionInwardsFailureMechanismContextProperties( - new GrassCoverErosionInwardsFailureMechanismContext(failureMechanism, assessmentSectionMock), - changeHandler); - - // Call - properties.LengthEffect = newLengthEffect; - - // Assert - Assert.AreEqual(newLengthEffect, failureMechanism.GeneralInput.N); - mockRepository.VerifyAll(); - } - - [Test] - [TestCase(1)] - [TestCase(10)] - [TestCase(20)] - public void LengthEffect_SetValidValueNoConfirmation_NoValueChangeNoUpdates(int newLengthEffect) - { - // Setup - var observerMock = mockRepository.StrictMock(); - - var changeHandler = mockRepository.StrictMock(); - changeHandler.Expect(h => h.ConfirmPropertyChange()).Return(false); - - var assessmentSectionMock = mockRepository.StrictMock(); - - mockRepository.ReplayAll(); - - var failureMechanism = new GrassCoverErosionInwardsFailureMechanism(); - - failureMechanism.Attach(observerMock); - - var properties = new GrassCoverErosionInwardsFailureMechanismContextProperties( - new GrassCoverErosionInwardsFailureMechanismContext(failureMechanism, assessmentSectionMock), - changeHandler); - var oldValue = properties.LengthEffect; - - // Call - properties.LengthEffect = newLengthEffect; - - // Assert - Assert.AreEqual(oldValue, failureMechanism.GeneralInput.N); - mockRepository.VerifyAll(); - } - - [Test] public void Constructor_Always_PropertiesHaveExpectedAttributesValues() { // Setup @@ -268,6 +199,108 @@ mockRepository.VerifyAll(); } + [Test] + [TestCase(0)] + [TestCase(-1)] + [TestCase(-20)] + public void LengthEffect_SetInvalidValueWithConfirmation_ThrowsArgumentOutOfRangeException(int newLengthEffect) + { + // Setup + var observerMock = mockRepository.StrictMock(); + var changeHandler = mockRepository.StrictMock(); + changeHandler.Expect(h => h.ConfirmPropertyChange()).Return(true); + + var assessmentSectionMock = mockRepository.StrictMock(); + + mockRepository.ReplayAll(); + + var failureMechanism = new GrassCoverErosionInwardsFailureMechanism(); + failureMechanism.Attach(observerMock); + + var properties = new GrassCoverErosionInwardsFailureMechanismContextProperties( + new GrassCoverErosionInwardsFailureMechanismContext(failureMechanism, assessmentSectionMock), + changeHandler); + + // Call + TestDelegate test = () => properties.LengthEffect = newLengthEffect; + + // Assert + Assert.Throws(test); + mockRepository.VerifyAll(); + } + + [Test] + [TestCase(1)] + [TestCase(10)] + [TestCase(20)] + public void LengthEffect_SetValidValueWithConfirmation_UpdateDataAndNotifyObservers(int newLengthEffect) + { + // Setup + var failureMechanism = new GrassCoverErosionInwardsFailureMechanism(); + + var observerMock = mockRepository.StrictMock(); + observerMock.Expect(o => o.UpdateObserver()); + + var observableMock = mockRepository.StrictMock(); + observableMock.Expect(o => o.NotifyObservers()); + + var changeHandler = mockRepository.StrictMock(); + changeHandler.Expect(h => h.ConfirmPropertyChange()).Return(true); + changeHandler.Expect(h => h.PropertyChanged(failureMechanism)).Return(new[] { observableMock }); + + var assessmentSectionMock = mockRepository.StrictMock(); + + mockRepository.ReplayAll(); + + failureMechanism.Attach(observerMock); + + var properties = new GrassCoverErosionInwardsFailureMechanismContextProperties( + new GrassCoverErosionInwardsFailureMechanismContext(failureMechanism, assessmentSectionMock), + changeHandler); + + // Call + properties.LengthEffect = newLengthEffect; + + // Assert + Assert.AreEqual(newLengthEffect, failureMechanism.GeneralInput.N); + mockRepository.VerifyAll(); + } + + [Test] + [TestCase(-10)] + [TestCase(-1)] + [TestCase(0)] + [TestCase(1)] + [TestCase(10)] + [TestCase(20)] + public void LengthEffect_SetValueWithoutConfirmation_NoValueChangeNoUpdates(int newLengthEffect) + { + // Setup + var observerMock = mockRepository.StrictMock(); + + var changeHandler = mockRepository.StrictMock(); + changeHandler.Expect(h => h.ConfirmPropertyChange()).Return(false); + + var assessmentSectionMock = mockRepository.StrictMock(); + + mockRepository.ReplayAll(); + + var failureMechanism = new GrassCoverErosionInwardsFailureMechanism(); + failureMechanism.Attach(observerMock); + + var properties = new GrassCoverErosionInwardsFailureMechanismContextProperties( + new GrassCoverErosionInwardsFailureMechanismContext(failureMechanism, assessmentSectionMock), + changeHandler); + var oldValue = properties.LengthEffect; + + // Call + properties.LengthEffect = newLengthEffect; + + // Assert + Assert.AreEqual(oldValue, failureMechanism.GeneralInput.N); + mockRepository.VerifyAll(); + } + private IFailureMechanismPropertyChangeHandler CreateSimpleHandler() { var handler = mockRepository.Stub(); Index: Ringtoets/GrassCoverErosionOutwards/test/Ringtoets.GrassCoverErosionOutwards.Forms.Test/PropertyClasses/GrassCoverErosionOutwardsFailureMechanismPropertiesTest.cs =================================================================== diff -u -r545b105a213ed85564861b4bcf6d2d6425dbde50 -r5f8541d2a46730d67fc2d859caa6de2921bbc820 --- Ringtoets/GrassCoverErosionOutwards/test/Ringtoets.GrassCoverErosionOutwards.Forms.Test/PropertyClasses/GrassCoverErosionOutwardsFailureMechanismPropertiesTest.cs (.../GrassCoverErosionOutwardsFailureMechanismPropertiesTest.cs) (revision 545b105a213ed85564861b4bcf6d2d6425dbde50) +++ Ringtoets/GrassCoverErosionOutwards/test/Ringtoets.GrassCoverErosionOutwards.Forms.Test/PropertyClasses/GrassCoverErosionOutwardsFailureMechanismPropertiesTest.cs (.../GrassCoverErosionOutwardsFailureMechanismPropertiesTest.cs) (revision 5f8541d2a46730d67fc2d859caa6de2921bbc820) @@ -24,11 +24,8 @@ using System.Linq; using Core.Common.Base; using Core.Common.Gui.PropertyBag; -using Core.Common.TestUtil; using NUnit.Framework; using Rhino.Mocks; -using Ringtoets.Common.Data.Hydraulics; -using Ringtoets.Common.Data.TestUtil; using Ringtoets.GrassCoverErosionOutwards.Data; using Ringtoets.GrassCoverErosionOutwards.Data.Properties; using Ringtoets.GrassCoverErosionOutwards.Forms.PropertyClasses; @@ -97,68 +94,6 @@ } [Test] - [TestCase(1)] - [TestCase(10)] - [TestCase(20)] - public void LengthEffect_SetValidValue_UpdateDataAndNotifyObservers(int newLengthEffect) - { - // Setup - var mockRepository = new MockRepository(); - var observerMock = mockRepository.StrictMock(); - observerMock.Expect(o => o.UpdateObserver()); - - var observableMock = mockRepository.StrictMock(); - observableMock.Expect(o => o.NotifyObservers()); - - var changeHandler = mockRepository.StrictMock(); - changeHandler.Expect(h => h.ConfirmPropertyChange()).Return(true); - changeHandler.Expect(h => h.PropertyChanged(Arg.Is.NotNull)).Return(new[] { observableMock }); - - mockRepository.ReplayAll(); - - var failureMechanism = new GrassCoverErosionOutwardsFailureMechanism(); - failureMechanism.Attach(observerMock); - - var properties = new GrassCoverErosionOutwardsFailureMechanismProperties(failureMechanism, changeHandler); - - // Call - properties.LengthEffect = newLengthEffect; - - // Assert - Assert.AreEqual(newLengthEffect, failureMechanism.GeneralInput.N); - mockRepository.VerifyAll(); - } - - [Test] - [TestCase(1)] - [TestCase(10)] - [TestCase(20)] - public void LengthEffect_SetValidValueNoConfirmation_NoValueChangeNoUpdates(int newLengthEffect) - { - // Setup - var mockRepository = new MockRepository(); - var observerMock = mockRepository.StrictMock(); - - var changeHandler = mockRepository.StrictMock(); - changeHandler.Expect(h => h.ConfirmPropertyChange()).Return(false); - - mockRepository.ReplayAll(); - - var failureMechanism = new GrassCoverErosionOutwardsFailureMechanism(); - failureMechanism.Attach(observerMock); - - var properties = new GrassCoverErosionOutwardsFailureMechanismProperties(failureMechanism, changeHandler); - var oldValue = properties.LengthEffect; - - // Call - properties.LengthEffect = newLengthEffect; - - // Assert - Assert.AreEqual(oldValue, failureMechanism.GeneralInput.N); - mockRepository.VerifyAll(); - } - - [Test] public void Constructor_Always_PropertiesHaveExpectedAttributesValues() { // Setup @@ -174,9 +109,9 @@ // Assert var dynamicPropertyBag = new DynamicPropertyBag(properties); PropertyDescriptorCollection dynamicProperties = dynamicPropertyBag.GetProperties(new Attribute[] - { - BrowsableAttribute.Yes - }); + { + BrowsableAttribute.Yes + }); Assert.AreEqual(6, dynamicProperties.Count); PropertyDescriptor nameProperty = dynamicProperties[namePropertyIndex]; @@ -222,7 +157,98 @@ Assert.AreEqual("De waarde van de parameter 'c' in de berekening voor golf condities.", cProperty.Description); mockRepository.VerifyAll(); } - + + [Test] + [TestCase(0)] + [TestCase(-1)] + [TestCase(-20)] + public void LengthEffect_SetInvalidValueWithConfirmation_ThrowsArgumentOutOfRangeException(int newLengthEffect) + { + // Setup + var failureMechanism = new GrassCoverErosionOutwardsFailureMechanism(); + + var mockRepository = new MockRepository(); + var observerMock = mockRepository.StrictMock(); + var changeHandler = mockRepository.StrictMock(); + changeHandler.Expect(h => h.ConfirmPropertyChange()).Return(true); + + mockRepository.ReplayAll(); + + failureMechanism.Attach(observerMock); + + var properties = new GrassCoverErosionOutwardsFailureMechanismProperties(failureMechanism, changeHandler); + + // Call + TestDelegate test = () => properties.LengthEffect = newLengthEffect; + + // Assert + Assert.Throws(test); + mockRepository.VerifyAll(); + } + + [Test] + [TestCase(1)] + [TestCase(10)] + [TestCase(20)] + public void LengthEffect_SetValidValueWithConfirmation_UpdateDataAndNotifyObservers(int newLengthEffect) + { + // Setup + var failureMechanism = new GrassCoverErosionOutwardsFailureMechanism(); + + var mockRepository = new MockRepository(); + var observerMock = mockRepository.StrictMock(); + observerMock.Expect(o => o.UpdateObserver()); + + var observableMock = mockRepository.StrictMock(); + observableMock.Expect(o => o.NotifyObservers()); + + var changeHandler = mockRepository.StrictMock(); + changeHandler.Expect(h => h.ConfirmPropertyChange()).Return(true); + changeHandler.Expect(h => h.PropertyChanged(failureMechanism)).Return(new[] { observableMock }); + + mockRepository.ReplayAll(); + + failureMechanism.Attach(observerMock); + + var properties = new GrassCoverErosionOutwardsFailureMechanismProperties(failureMechanism, changeHandler); + + // Call + properties.LengthEffect = newLengthEffect; + + // Assert + Assert.AreEqual(newLengthEffect, failureMechanism.GeneralInput.N); + mockRepository.VerifyAll(); + } + + [Test] + [TestCase(1)] + [TestCase(10)] + [TestCase(20)] + public void LengthEffect_SetValidValueNoConfirmation_NoValueChangeNoUpdates(int newLengthEffect) + { + // Setup + var mockRepository = new MockRepository(); + var observerMock = mockRepository.StrictMock(); + + var changeHandler = mockRepository.StrictMock(); + changeHandler.Expect(h => h.ConfirmPropertyChange()).Return(false); + + mockRepository.ReplayAll(); + + var failureMechanism = new GrassCoverErosionOutwardsFailureMechanism(); + failureMechanism.Attach(observerMock); + + var properties = new GrassCoverErosionOutwardsFailureMechanismProperties(failureMechanism, changeHandler); + var oldValue = properties.LengthEffect; + + // Call + properties.LengthEffect = newLengthEffect; + + // Assert + Assert.AreEqual(oldValue, failureMechanism.GeneralInput.N); + mockRepository.VerifyAll(); + } + private IGrassCoverErosionOutwardsFailureMechanismPropertyChangeHandler CreateSimpleHandler(MockRepository mockRepository) { var handler = mockRepository.Stub(); Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/PropertyClasses/PipingFailureMechanismContextProperties.cs =================================================================== diff -u -r816744aa249d90e7460b9c2844292b2e0cf13669 -r5f8541d2a46730d67fc2d859caa6de2921bbc820 --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/PropertyClasses/PipingFailureMechanismContextProperties.cs (.../PipingFailureMechanismContextProperties.cs) (revision 816744aa249d90e7460b9c2844292b2e0cf13669) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/PropertyClasses/PipingFailureMechanismContextProperties.cs (.../PipingFailureMechanismContextProperties.cs) (revision 5f8541d2a46730d67fc2d859caa6de2921bbc820) @@ -20,7 +20,6 @@ // All rights reserved. using System; -using System.Collections.Generic; using Core.Common.Base; using Core.Common.Base.Data; using Core.Common.Gui.Attributes; Index: Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/PropertyClasses/PipingFailureMechanismContextPropertiesTest.cs =================================================================== diff -u -r849754a9c56fc8ad4e2733f9ca04de7c01cbac3f -r5f8541d2a46730d67fc2d859caa6de2921bbc820 --- Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/PropertyClasses/PipingFailureMechanismContextPropertiesTest.cs (.../PipingFailureMechanismContextPropertiesTest.cs) (revision 849754a9c56fc8ad4e2733f9ca04de7c01cbac3f) +++ Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/PropertyClasses/PipingFailureMechanismContextPropertiesTest.cs (.../PipingFailureMechanismContextPropertiesTest.cs) (revision 5f8541d2a46730d67fc2d859caa6de2921bbc820) @@ -258,17 +258,23 @@ [TestCase(-0.1)] [TestCase(1.1)] [TestCase(8)] - public void A_SetInvalidValue_ThrowsArgumentException(double value) + public void A_SetInvalidValueWithConfirmation_ThrowsArgumentException(double value) { // Setup var mocks = new MockRepository(); + var assessmentSection = mocks.Stub(); var observerMock = mocks.StrictMock(); + var changeHandler = mocks.Stub(); + changeHandler.Expect(h => h.ConfirmPropertyChange()).Return(true); + + mocks.ReplayAll(); + var failureMechanism = new PipingFailureMechanism(); + var properties = new PipingFailureMechanismContextProperties( - new PipingFailureMechanismContext(failureMechanism, mocks.Stub()), - CreateSimpleHandler(mocks)); - mocks.ReplayAll(); + new PipingFailureMechanismContext(failureMechanism, assessmentSection), + changeHandler); failureMechanism.Attach(observerMock); @@ -288,30 +294,31 @@ [TestCase(1)] [TestCase(0.0000001)] [TestCase(0.9999999)] - public void A_SetValidValue_SetsValueAndUpdatesObservers(double value) + public void A_SetValidValueWithConfirmation_SetsValueAndUpdatesObservers(double value) { // Setup + var failureMechanism = new PipingFailureMechanism(); + var mocks = new MockRepository(); var observerMock = mocks.StrictMock(); observerMock.Expect(o => o.UpdateObserver()); var observableMock = mocks.StrictMock(); observableMock.Expect(o => o.NotifyObservers()); - var handler = mocks.Stub(); - handler.Expect(h => h.ConfirmPropertyChange()).Return(true); - handler.Expect(h => h.PropertyChanged(Arg.Is.NotNull)).Return(new [] { observableMock }); + var changeHandler = mocks.Stub(); + changeHandler.Expect(h => h.ConfirmPropertyChange()).Return(true); + changeHandler.Expect(h => h.PropertyChanged(failureMechanism)).Return(new [] { observableMock }); var assessmentSection = mocks.Stub(); mocks.ReplayAll(); - var failureMechanism = new PipingFailureMechanism(); failureMechanism.Attach(observerMock); var properties = new PipingFailureMechanismContextProperties( new PipingFailureMechanismContext(failureMechanism, assessmentSection), - handler); + changeHandler); // Call properties.A = value; @@ -322,10 +329,14 @@ } [Test] + [TestCase(-1)] + [TestCase(-0.1)] + [TestCase(1.1)] + [TestCase(8)] [TestCase(1)] [TestCase(10)] [TestCase(20)] - public void A_SetValidValueNoConfirmation_NoValueChangeNoUpdates(int newLengthEffect) + public void A_SetValidNoConfirmation_NoValueChangeNoUpdates(double value) { // Setup var mockRepository = new MockRepository(); @@ -347,37 +358,81 @@ var oldValue = properties.A; // Call - properties.A = newLengthEffect; + properties.A = value; // Assert Assert.AreEqual(oldValue, failureMechanism.PipingProbabilityAssessmentInput.A); mockRepository.VerifyAll(); } [Test] + [TestCase(double.NaN)] + [TestCase(double.NegativeInfinity)] + [TestCase(double.PositiveInfinity)] + [TestCase(-0.005)] + [TestCase(20.005)] + public void WaterVolumetricWeight_SetInvalidValueWithConfirmation_ThrowArgumentExceptionAndDoesNotUpdateObservers(double value) + { + // Setup + + var mocks = new MockRepository(); + var observerMock = mocks.StrictMock(); + var assessmentSection = mocks.Stub(); + + var changeHandler = mocks.Stub(); + changeHandler.Expect(h => h.ConfirmPropertyChange()).Return(true); + + mocks.ReplayAll(); + + var failureMechanism = new PipingFailureMechanism(); + failureMechanism.Attach(observerMock); + + var properties = new PipingFailureMechanismContextProperties( + new PipingFailureMechanismContext(failureMechanism, assessmentSection), + changeHandler); + + // Call + TestDelegate test = () => properties.WaterVolumetricWeight = (RoundedDouble) value; + + // Assert + TestHelper.AssertThrowsArgumentExceptionAndTestMessage(test, "De waarde moet binnen het bereik [0, 20] liggen."); + mocks.VerifyAll(); // Does not expect notify observers. + } + + [Test] [TestCase(5)] [TestCase(-0.004)] [TestCase(20.004)] - public void WaterVolumetricWeight_SetValidValue_SetsValueRoundedAndUpdatesObservers(double newValue) + public void WaterVolumetricWeight_SetValidValueWithConfirmation_SetsValueRoundedAndUpdatesObservers(double value) { // Setup + var failureMechanism = new PipingFailureMechanism(); + var mocks = new MockRepository(); + var assessmentSection = mocks.Stub(); var observerMock = mocks.StrictMock(); observerMock.Expect(o => o.UpdateObserver()); - var failureMechanism = new PipingFailureMechanism(); - var properties = new PipingFailureMechanismContextProperties( - new PipingFailureMechanismContext(failureMechanism, mocks.Stub()), - CreateSimpleHandler(mocks)); + var observableMock = mocks.StrictMock(); + observableMock.Expect(o => o.NotifyObservers()); + + var handler = mocks.Stub(); + handler.Expect(h => h.ConfirmPropertyChange()).Return(true); + handler.Expect(h => h.PropertyChanged(failureMechanism)).Return(new[] { observableMock }); + mocks.ReplayAll(); failureMechanism.Attach(observerMock); + var properties = new PipingFailureMechanismContextProperties( + new PipingFailureMechanismContext(failureMechanism, assessmentSection), + handler); + // Call - properties.WaterVolumetricWeight = (RoundedDouble) newValue; + properties.WaterVolumetricWeight = (RoundedDouble) value; // Assert - Assert.AreEqual(newValue, failureMechanism.GeneralInput.WaterVolumetricWeight.Value, failureMechanism.GeneralInput.WaterVolumetricWeight.GetAccuracy()); + Assert.AreEqual(value, failureMechanism.GeneralInput.WaterVolumetricWeight.Value, failureMechanism.GeneralInput.WaterVolumetricWeight.GetAccuracy()); mocks.VerifyAll(); } @@ -387,26 +442,36 @@ [TestCase(double.PositiveInfinity)] [TestCase(-0.005)] [TestCase(20.005)] - public void WaterVolumetricWeight_SetValidValue_ThrowArgumentExceptionAndDoesNotUpdateObservers(double newValue) + [TestCase(5)] + [TestCase(-0.004)] + [TestCase(20.004)] + public void WaterVolumetricWeight_SetValueNoConfirmation_NoValueChangeNoUpdates(double value) { // Setup var mocks = new MockRepository(); var observerMock = mocks.StrictMock(); + var assessmentSection = mocks.Stub(); - var failureMechanism = new PipingFailureMechanism(); - var properties = new PipingFailureMechanismContextProperties( - new PipingFailureMechanismContext(failureMechanism, mocks.Stub()), - CreateSimpleHandler(mocks)); + var changeHandler = mocks.StrictMock(); + changeHandler.Expect(h => h.ConfirmPropertyChange()).Return(false); + mocks.ReplayAll(); + var failureMechanism = new PipingFailureMechanism(); failureMechanism.Attach(observerMock); + var properties = new PipingFailureMechanismContextProperties( + new PipingFailureMechanismContext(failureMechanism, assessmentSection), + changeHandler); + + var oldValue = properties.WaterVolumetricWeight; + // Call - TestDelegate test = () => properties.WaterVolumetricWeight = (RoundedDouble) newValue; + properties.WaterVolumetricWeight = (RoundedDouble) value; // Assert - TestHelper.AssertThrowsArgumentExceptionAndTestMessage(test, "De waarde moet binnen het bereik [0, 20] liggen."); - mocks.VerifyAll(); // Does not expect notify observers. + Assert.AreEqual(oldValue, failureMechanism.GeneralInput.WaterVolumetricWeight.Value, failureMechanism.GeneralInput.WaterVolumetricWeight.GetAccuracy()); + mocks.VerifyAll(); } private IFailureMechanismPropertyChangeHandler CreateSimpleHandler(MockRepository mockRepository)