Index: Ringtoets/Integration/src/Ringtoets.Integration.Forms/Properties/Resources.Designer.cs =================================================================== diff -u -rcdf0db780e289f3d6fc5a2a6db00f26517a3aec4 -rffa34dc6feb3d5fdf246cb89f7e1c11990ccc960 --- Ringtoets/Integration/src/Ringtoets.Integration.Forms/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision cdf0db780e289f3d6fc5a2a6db00f26517a3aec4) +++ Ringtoets/Integration/src/Ringtoets.Integration.Forms/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision ffa34dc6feb3d5fdf246cb89f7e1c11990ccc960) @@ -424,24 +424,6 @@ } /// - /// Looks up a localized string similar to Terugkeertijd van de norm, gelijk aan 1/norm.. - /// - public static string FailureMechanismContribution_ReturnPeriod_Description { - get { - return ResourceManager.GetString("FailureMechanismContribution_ReturnPeriod_Description", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Norm (terugkeertijd) [jaar]. - /// - public static string FailureMechanismContribution_ReturnPeriod_DisplayName { - get { - return ResourceManager.GetString("FailureMechanismContribution_ReturnPeriod_DisplayName", resourceCulture); - } - } - - /// /// Looks up a localized string similar to De waarde voor de 'Norm (terugkeertijd)' moet in het bereik {0} liggen.. /// public static string FailureMechanismContributionContextProperties_ReturnPeriod_Value_for_ReturnPeriod_Must_be_in_Range_0_ { Index: Ringtoets/Integration/src/Ringtoets.Integration.Forms/Properties/Resources.resx =================================================================== diff -u -rcdf0db780e289f3d6fc5a2a6db00f26517a3aec4 -rffa34dc6feb3d5fdf246cb89f7e1c11990ccc960 --- Ringtoets/Integration/src/Ringtoets.Integration.Forms/Properties/Resources.resx (.../Resources.resx) (revision cdf0db780e289f3d6fc5a2a6db00f26517a3aec4) +++ Ringtoets/Integration/src/Ringtoets.Integration.Forms/Properties/Resources.resx (.../Resources.resx) (revision ffa34dc6feb3d5fdf246cb89f7e1c11990ccc960) @@ -276,12 +276,6 @@ Trajecttype - - Terugkeertijd van de norm, gelijk aan 1/norm. - - - Norm (terugkeertijd) [jaar] - De waarde voor de 'Norm (terugkeertijd)' moet in het bereik {0} liggen. Index: Ringtoets/Integration/src/Ringtoets.Integration.Forms/PropertyClasses/FailureMechanismContributionProperties.cs =================================================================== diff -u -r2e265dc8a3c902ebdfdcdf0f1071f9c3c872d822 -rffa34dc6feb3d5fdf246cb89f7e1c11990ccc960 --- Ringtoets/Integration/src/Ringtoets.Integration.Forms/PropertyClasses/FailureMechanismContributionProperties.cs (.../FailureMechanismContributionProperties.cs) (revision 2e265dc8a3c902ebdfdcdf0f1071f9c3c872d822) +++ Ringtoets/Integration/src/Ringtoets.Integration.Forms/PropertyClasses/FailureMechanismContributionProperties.cs (.../FailureMechanismContributionProperties.cs) (revision ffa34dc6feb3d5fdf246cb89f7e1c11990ccc960) @@ -111,24 +111,6 @@ [PropertyOrder(2)] [ResourcesCategory(typeof(RingtoetsCommonFormsResources), nameof(RingtoetsCommonFormsResources.Categories_General))] - [ResourcesDisplayName(typeof(Resources), nameof(Resources.FailureMechanismContribution_ReturnPeriod_DisplayName))] - [ResourcesDescription(typeof(Resources), nameof(Resources.FailureMechanismContribution_ReturnPeriod_Description))] - public int ReturnPeriod - { - get - { - return Convert.ToInt32(1.0 / data.Norm); - } - set - { - double newNormValue = 1.0 / Convert.ToInt32(value); - - PropertyChangeHelper.ChangePropertyAndNotify(() => assessmentSection.FailureMechanismContribution.Norm = newNormValue, normChangeHandler); - } - } - - [PropertyOrder(2)] - [ResourcesCategory(typeof(RingtoetsCommonFormsResources), nameof(RingtoetsCommonFormsResources.Categories_General))] [ResourcesDisplayName(typeof(Resources), nameof(Resources.LowerLimitNorm_DisplayName))] [ResourcesDescription(typeof(Resources), nameof(Resources.LowerLimitNorm_Description))] public string LowerLimitNorm @@ -137,6 +119,10 @@ { return ProbabilityFormattingHelper.Format(data.LowerLimitNorm); } + set + { + PropertyChangeHelper.ChangePropertyAndNotify(() => data.LowerLimitNorm = double.Parse(value), normChangeHandler); + } } [PropertyOrder(3)] @@ -149,6 +135,10 @@ { return ProbabilityFormattingHelper.Format(data.SignalingNorm); } + set + { + PropertyChangeHelper.ChangePropertyAndNotify(() => data.SignalingNorm = double.Parse(value), normChangeHandler); + } } [PropertyOrder(4)] @@ -162,6 +152,10 @@ { return data.NormativeNorm; } + set + { + PropertyChangeHelper.ChangePropertyAndNotify(() => data.NormativeNorm = value, normChangeHandler); + } } } } \ No newline at end of file Index: Ringtoets/Integration/test/Ringtoets.Integration.Forms.Test/PropertyClasses/FailureMechanismContributionPropertiesIntegrationTest.cs =================================================================== diff -u -r2e265dc8a3c902ebdfdcdf0f1071f9c3c872d822 -rffa34dc6feb3d5fdf246cb89f7e1c11990ccc960 --- Ringtoets/Integration/test/Ringtoets.Integration.Forms.Test/PropertyClasses/FailureMechanismContributionPropertiesIntegrationTest.cs (.../FailureMechanismContributionPropertiesIntegrationTest.cs) (revision 2e265dc8a3c902ebdfdcdf0f1071f9c3c872d822) +++ Ringtoets/Integration/test/Ringtoets.Integration.Forms.Test/PropertyClasses/FailureMechanismContributionPropertiesIntegrationTest.cs (.../FailureMechanismContributionPropertiesIntegrationTest.cs) (revision ffa34dc6feb3d5fdf246cb89f7e1c11990ccc960) @@ -30,9 +30,9 @@ using Ringtoets.Common.Data.AssessmentSection; using Ringtoets.Common.Data.Contribution; using Ringtoets.Common.Data.Hydraulics; -using Ringtoets.Common.Data.Probability; using Ringtoets.Common.Data.Structures; using Ringtoets.Common.Data.TestUtil; +using Ringtoets.Common.Forms.Helpers; using Ringtoets.GrassCoverErosionInwards.Data; using Ringtoets.GrassCoverErosionInwards.Data.TestUtil; using Ringtoets.HeightStructures.Data; @@ -52,12 +52,167 @@ "Alle berekende resultaten voor alle hydraulische randvoorwaardenlocaties zijn verwijderd."; private const string messageCalculationsremoved = "De resultaten van {0} berekeningen zijn verwijderd."; + private const string newLowerLimitNorm = "0.01"; + private const string newSignalingNorm = "0.000001"; + private const NormType newNormativeNorm = NormType.Signaling; + #region AllDataAndOutputSet + [Test] - public void ReturnPeriodProperty_ValueChanged_ClearsDependentDataAndNotifiesObserversAndLogsMessages() + public void LowerLimitNorm_ValueChanged_ClearsDependentDataAndNotifiesObserversAndLogsMessages() { + SetPropertyAndVerifyNotifcationsAndOutputForAllDataSet(properties => properties.LowerLimitNorm = newLowerLimitNorm); + } + + [Test] + public void SignalingNorm_ValueChanged_ClearsDependentDataAndNotifiesObserversAndLogsMessages() + { + SetPropertyAndVerifyNotifcationsAndOutputForAllDataSet(properties => properties.SignalingNorm = newSignalingNorm); + } + + [Test] + public void NormativeNorm_ValueChanged_ClearsDependentDataAndNotifiesObserversAndLogsMessages() + { + SetPropertyAndVerifyNotifcationsAndOutputForAllDataSet(properties => properties.NormativeNorm = newNormativeNorm); + } + + #endregion + + #region NoPermissionGiven + + [Test] + public void LowerLimitNorm_PermissionNotGiven_DoesnotClearDependentDataNorNotifiesObserversAndLogsMessages() + { + ChangeValueNoPermissionGivenAndVerifyNoNotifcationsAndOutputForAllDataSet(properties => properties.LowerLimitNorm = newLowerLimitNorm); + } + + [Test] + public void SignalingNorm_PermissionNotGiven_DoesnotClearDependentDataNorNotifiesObserversAndLogsMessages() + { + ChangeValueNoPermissionGivenAndVerifyNoNotifcationsAndOutputForAllDataSet(properties => properties.SignalingNorm = newSignalingNorm); + } + + [Test] + public void NormativeNorm_PermissionNotGiven_DoesnotClearDependentDataNorNotifiesObserversAndLogsMessages() + { + ChangeValueNoPermissionGivenAndVerifyNoNotifcationsAndOutputForAllDataSet(properties => properties.NormativeNorm = newNormativeNorm); + } + + #endregion + + #region HydraulicBoundarySetAndCalculationsNoOutput + + [Test] + public void LowerLimitNorm_HydraulicBoundarySetAndCalculationsNoOutput_HydraulicBoundaryDatabaseObserversNotifiedAndMessagesLogged() + { + SetPropertyAndVerifyNotifcationsAndOutputForHydraulicBoundarySetAndCalculationsNoOutput(properties => properties.LowerLimitNorm = newLowerLimitNorm); + } + + [Test] + public void SignalingNorm_HydraulicBoundarySetAndCalculationsNoOutput_HydraulicBoundaryDatabaseObserversNotifiedAndMessagesLogged() + { + SetPropertyAndVerifyNotifcationsAndOutputForHydraulicBoundarySetAndCalculationsNoOutput(properties => properties.SignalingNorm = newSignalingNorm); + } + + [Test] + public void NormativeNorm_HydraulicBoundarySetAndCalculationsNoOutput_HydraulicBoundaryDatabaseObserversNotifiedAndMessagesLogged() + { + SetPropertyAndVerifyNotifcationsAndOutputForHydraulicBoundarySetAndCalculationsNoOutput(properties => properties.NormativeNorm = newNormativeNorm); + } + + #endregion + + #region HydraulicBoundaryLocationNoOutputAndCalculationWithOutput + + [Test] + public void LowerLimitNorm_HydraulicBoundaryLocationNoOutputAndCalculationWithOutputAndValueChanged_CalculationObserverNotifiedAndMessageLogged() + { + SetPropertyAndVerifyNotifcationsAndOutputForHydraulicBoundaryLocationNoOutputAndCalculationWithOutput(properties => properties.LowerLimitNorm = newLowerLimitNorm); + } + + [Test] + public void SignalingNorm_HydraulicBoundaryLocationNoOutputAndCalculationWithOutputAndValueChanged_CalculationObserverNotifiedAndMessageLogged() + { + SetPropertyAndVerifyNotifcationsAndOutputForHydraulicBoundaryLocationNoOutputAndCalculationWithOutput(properties => properties.SignalingNorm = newSignalingNorm); + } + + [Test] + public void NormativeNorm_HydraulicBoundaryLocationNoOutputAndCalculationWithOutputAndValueChanged_CalculationObserverNotifiedAndMessageLogged() + { + SetPropertyAndVerifyNotifcationsAndOutputForHydraulicBoundaryLocationNoOutputAndCalculationWithOutput(properties => properties.NormativeNorm = newNormativeNorm); + } + + #endregion + + #region NoHydraulicBoundaryLocationNoOutputAndCalculationWithOutput + + [Test] + public void LowerLimitNorm_NoHydraulicBoundaryLocationNoOutputAndCalculationWithOutputAndValueChanged_CalculationObserverNotifiedAndMessageLogged() + { + SetPropertyAndVerifyNotifcationsAndOutputForNoHydraulicBoundaryLocationNoOutputAndCalculationWithOutput(properties => properties.LowerLimitNorm = newLowerLimitNorm); + } + + [Test] + public void SignalingNorm_NoHydraulicBoundaryLocationNoOutputAndCalculationWithOutputAndValueChanged_CalculationObserverNotifiedAndMessageLogged() + { + SetPropertyAndVerifyNotifcationsAndOutputForNoHydraulicBoundaryLocationNoOutputAndCalculationWithOutput(properties => properties.SignalingNorm = newSignalingNorm); + } + + [Test] + public void NormativeNorm_NoHydraulicBoundaryLocationNoOutputAndCalculationWithOutputAndValueChanged_CalculationObserverNotifiedAndMessageLogged() + { + SetPropertyAndVerifyNotifcationsAndOutputForNoHydraulicBoundaryLocationNoOutputAndCalculationWithOutput(properties => properties.NormativeNorm = newNormativeNorm); + } + + #endregion + + #region HydraulicBoundaryLocationNoOutputAndNoCalculationsWithOutput + + [Test] + public void LowerLimitNorm_HydraulicBoundaryLocationNoOutputAndNoCalculationsWithOutputAndValueChanged_NoObserversNotifiedAndMessagesLogged() + { + SetPropertyAndVerifyNotifcationsAndOutputForHydraulicBoundaryLocationNoOutputAndNoCalculationsWithOutput(properties => properties.LowerLimitNorm = newLowerLimitNorm); + } + + [Test] + public void SignalingNorm_HydraulicBoundaryLocationNoOutputAndNoCalculationsWithOutputAndValueChanged_NoObserversNotifiedAndMessagesLogged() + { + SetPropertyAndVerifyNotifcationsAndOutputForHydraulicBoundaryLocationNoOutputAndNoCalculationsWithOutput(properties => properties.SignalingNorm = newSignalingNorm); + } + + [Test] + public void NormativeNorm_HydraulicBoundaryLocationNoOutputAndNoCalculationsWithOutputAndValueChanged_NoObserversNotifiedAndMessagesLogged() + { + SetPropertyAndVerifyNotifcationsAndOutputForHydraulicBoundaryLocationNoOutputAndNoCalculationsWithOutput(properties => properties.NormativeNorm = newNormativeNorm); + } + + #endregion + + #region NoHydraulicBoundaryDatabaseAndNoCalculationsWithOutput + + [Test] + public void LowerLimitNorm_NoHydraulicBoundaryDatabaseAndNoCalculationsWithOutputAndValueChanged_NoObserversNotifiedAndMessagesLogged() + { + SetPropertyAndVerifyNotifcationsAndOutputForNoHydraulicBoundaryDatabaseAndNoCalculationsWithOutput(properties => properties.LowerLimitNorm = newLowerLimitNorm); + } + + [Test] + public void SignalingNorm_NoHydraulicBoundaryDatabaseAndNoCalculationsWithOutputAndValueChanged_NoObserversNotifiedAndMessagesLogged() + { + SetPropertyAndVerifyNotifcationsAndOutputForNoHydraulicBoundaryDatabaseAndNoCalculationsWithOutput(properties => properties.SignalingNorm = newSignalingNorm); + } + + [Test] + public void NormativeNorm_NoHydraulicBoundaryDatabaseAndNoCalculationsWithOutputAndValueChanged_NoObserversNotifiedAndMessagesLogged() + { + SetPropertyAndVerifyNotifcationsAndOutputForNoHydraulicBoundaryDatabaseAndNoCalculationsWithOutput(properties => properties.NormativeNorm = newNormativeNorm); + } + + #endregion + + private void SetPropertyAndVerifyNotifcationsAndOutputForAllDataSet(Action setPropertyAction) + { // Setup - const int newReturnPeriod = 200; const int numberOfCalculations = 3; TestHydraulicBoundaryLocation hydraulicBoundaryLocation = TestHydraulicBoundaryLocation.CreateFullyCalculated(); @@ -105,8 +260,8 @@ FailureMechanismContribution failureMechanismContribution = assessmentSection.FailureMechanismContribution; var mockRepository = new MockRepository(); - var observer = mockRepository.StrictMock(); - observer.Expect(o => o.UpdateObserver()); + var failureMechanismContributionObserver = mockRepository.StrictMock(); + failureMechanismContributionObserver.Expect(o => o.UpdateObserver()); var pipingCalculationObserver = mockRepository.StrictMock(); pipingCalculationObserver.Expect(o => o.UpdateObserver()); @@ -126,7 +281,7 @@ var viewCommands = mockRepository.Stub(); mockRepository.ReplayAll(); - failureMechanismContribution.Attach(observer); + failureMechanismContribution.Attach(failureMechanismContributionObserver); hydraulicBoundaryDatabase.Attach(hydraulicBoundaryDatabaseObserver); emptyPipingCalculation.Attach(emptyPipingCalculationObserver); @@ -145,26 +300,14 @@ new FailureMechanismContributionNormChangeHandler(assessmentSection), new AssessmentSectionCompositionChangeHandler(viewCommands)); - // Precondition - int originalReturnPeriodValue = Convert.ToInt32(1.0 / failureMechanismContribution.Norm); - Assert.AreEqual(originalReturnPeriodValue, properties.ReturnPeriod); - Assert.IsTrue(hydraulicBoundaryLocation.WaveHeightCalculation.HasOutput); - Assert.IsTrue(hydraulicBoundaryLocation.DesignWaterLevelCalculation.HasOutput); - Assert.IsTrue(grassCoverErosionOutwardsHydraulicBoundaryLocation.WaveHeightCalculation.HasOutput); - Assert.IsTrue(grassCoverErosionOutwardsHydraulicBoundaryLocation.DesignWaterLevelCalculation.HasOutput); - Assert.IsNotNull(pipingCalculation.Output); - Assert.IsNotNull(pipingCalculation.SemiProbabilisticOutput); - Assert.IsNotNull(grassCoverErosionInwardsCalculation.Output); - Assert.IsNotNull(heightStructuresCalculation.Output); - DialogBoxHandler = (name, wnd) => { var dialogTester = new MessageBoxTester(wnd); dialogTester.ClickOk(); }; // Call - Action call = () => properties.ReturnPeriod = newReturnPeriod; + Action call = () => setPropertyAction(properties); // Assert TestHelper.AssertLogMessages(call, msgs => @@ -173,28 +316,135 @@ Assert.AreEqual(string.Format(messageCalculationsremoved, numberOfCalculations), messages[0]); Assert.AreEqual(messageAllHydraulicBoundaryLocationOutputCleared, messages[1]); }); - Assert.AreEqual(1.0 / 30000, failureMechanismContribution.Norm); - Assert.IsFalse(hydraulicBoundaryLocation.WaveHeightCalculation.HasOutput); - Assert.IsFalse(hydraulicBoundaryLocation.DesignWaterLevelCalculation.HasOutput); - Assert.IsFalse(grassCoverErosionOutwardsHydraulicBoundaryLocation.WaveHeightCalculation.HasOutput); - Assert.IsFalse(grassCoverErosionOutwardsHydraulicBoundaryLocation.DesignWaterLevelCalculation.HasOutput); - Assert.IsNull(pipingCalculation.Output); - Assert.IsNull(pipingCalculation.SemiProbabilisticOutput); - Assert.IsNull(grassCoverErosionInwardsCalculation.Output); - Assert.IsNull(heightStructuresCalculation.Output); + AssertNormValues(properties, failureMechanismContribution); + + AssertLocationsOutputClear(hydraulicBoundaryLocation, grassCoverErosionOutwardsHydraulicBoundaryLocation); + AssertCalculationsOutputClear(pipingCalculation, grassCoverErosionInwardsCalculation, heightStructuresCalculation); + mockRepository.VerifyAll(); } - [Test] - public void ReturnPeriodProperty_HydraulicBoundarySetAndCalculationsNoOutput_HydraulicBoundaryDatabaseObserversNotifiedAndMessagesLogged() + private void ChangeValueNoPermissionGivenAndVerifyNoNotifcationsAndOutputForAllDataSet(Action setPropertyAction) { // Setup - const int newReturnPeriod = 200; + TestHydraulicBoundaryLocation hydraulicBoundaryLocation = TestHydraulicBoundaryLocation.CreateFullyCalculated(); var hydraulicBoundaryDatabase = new HydraulicBoundaryDatabase { Locations = { + hydraulicBoundaryLocation + } + }; + + var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike) + { + HydraulicBoundaryDatabase = hydraulicBoundaryDatabase + }; + + var emptyPipingCalculation = new PipingCalculation(new GeneralPipingInput()); + var pipingCalculation = new PipingCalculation(new GeneralPipingInput()) + { + Output = new TestPipingOutput(), + SemiProbabilisticOutput = new TestPipingSemiProbabilisticOutput() + }; + var emptyGrassCoverErosionInwardsCalculation = new GrassCoverErosionInwardsCalculation(); + var grassCoverErosionInwardsCalculation = new GrassCoverErosionInwardsCalculation + { + Output = new TestGrassCoverErosionInwardsOutput() + }; + var emptyHeightStructuresCalculation = new StructuresCalculation(); + var heightStructuresCalculation = new StructuresCalculation + { + Output = new TestStructuresOutput() + }; + + TestHydraulicBoundaryLocation grassCoverErosionOutwardsHydraulicBoundaryLocation = TestHydraulicBoundaryLocation.CreateFullyCalculated(); + + assessmentSection.GrassCoverErosionOutwards.HydraulicBoundaryLocations.Add(grassCoverErosionOutwardsHydraulicBoundaryLocation); + + assessmentSection.PipingFailureMechanism.CalculationsGroup.Children.Add(emptyPipingCalculation); + assessmentSection.PipingFailureMechanism.CalculationsGroup.Children.Add(pipingCalculation); + assessmentSection.GrassCoverErosionInwards.CalculationsGroup.Children.Add(emptyGrassCoverErosionInwardsCalculation); + assessmentSection.GrassCoverErosionInwards.CalculationsGroup.Children.Add(grassCoverErosionInwardsCalculation); + assessmentSection.HeightStructures.CalculationsGroup.Children.Add(emptyHeightStructuresCalculation); + assessmentSection.HeightStructures.CalculationsGroup.Children.Add(heightStructuresCalculation); + + FailureMechanismContribution failureMechanismContribution = assessmentSection.FailureMechanismContribution; + + var mockRepository = new MockRepository(); + var failureMechanismContributionObserver = mockRepository.StrictMock(); + var pipingCalculationObserver = mockRepository.StrictMock(); + var grassCoverErosionInwardsCalculationObserver = mockRepository.StrictMock(); + var heightStructuresCalculationObserver = mockRepository.StrictMock(); + var emptyPipingCalculationObserver = mockRepository.StrictMock(); + var emptyGrassCoverErosionInwardsCalculationObserver = mockRepository.StrictMock(); + var emptyHeightStructuresCalculationObserver = mockRepository.StrictMock(); + var hydraulicBoundaryDatabaseObserver = mockRepository.StrictMock(); + var grassCoverErosionOutwardsObserver = mockRepository.StrictMock(); + + var viewCommands = mockRepository.Stub(); + mockRepository.ReplayAll(); + + failureMechanismContribution.Attach(failureMechanismContributionObserver); + hydraulicBoundaryDatabase.Attach(hydraulicBoundaryDatabaseObserver); + + emptyPipingCalculation.Attach(emptyPipingCalculationObserver); + emptyGrassCoverErosionInwardsCalculation.Attach(emptyGrassCoverErosionInwardsCalculationObserver); + emptyHeightStructuresCalculation.Attach(emptyHeightStructuresCalculationObserver); + + pipingCalculation.Attach(pipingCalculationObserver); + grassCoverErosionInwardsCalculation.Attach(grassCoverErosionInwardsCalculationObserver); + heightStructuresCalculation.Attach(heightStructuresCalculationObserver); + + assessmentSection.GrassCoverErosionOutwards.HydraulicBoundaryLocations.Attach(grassCoverErosionOutwardsObserver); + + var properties = new FailureMechanismContributionProperties( + failureMechanismContribution, + assessmentSection, + new FailureMechanismContributionNormChangeHandler(assessmentSection), + new AssessmentSectionCompositionChangeHandler(viewCommands)); + + double originalLowerLimitNorm = failureMechanismContribution.LowerLimitNorm; + double originalSignalingNorm = failureMechanismContribution.SignalingNorm; + NormType originalNormativeNorm = failureMechanismContribution.NormativeNorm; + double originalNorm = failureMechanismContribution.Norm; + + DialogBoxHandler = (name, wnd) => + { + var dialogTester = new MessageBoxTester(wnd); + dialogTester.ClickCancel(); + }; + + // Call + Action call = () => setPropertyAction(properties); + + // Assert + TestHelper.AssertLogMessagesCount(call, 0); + Assert.AreEqual(originalLowerLimitNorm, failureMechanismContribution.LowerLimitNorm); + Assert.AreEqual(originalSignalingNorm, failureMechanismContribution.SignalingNorm); + Assert.AreEqual(originalNormativeNorm, failureMechanismContribution.NormativeNorm); + Assert.AreEqual(originalNorm, failureMechanismContribution.Norm); + + Assert.IsTrue(hydraulicBoundaryLocation.WaveHeightCalculation.HasOutput); + Assert.IsTrue(hydraulicBoundaryLocation.DesignWaterLevelCalculation.HasOutput); + Assert.IsTrue(grassCoverErosionOutwardsHydraulicBoundaryLocation.WaveHeightCalculation.HasOutput); + Assert.IsTrue(grassCoverErosionOutwardsHydraulicBoundaryLocation.DesignWaterLevelCalculation.HasOutput); + Assert.IsNotNull(pipingCalculation.Output); + Assert.IsNotNull(pipingCalculation.SemiProbabilisticOutput); + Assert.IsNotNull(grassCoverErosionInwardsCalculation.Output); + Assert.IsNotNull(heightStructuresCalculation.Output); + + mockRepository.VerifyAll(); + } + + private void SetPropertyAndVerifyNotifcationsAndOutputForHydraulicBoundarySetAndCalculationsNoOutput(Action setPropertyAction) + { + // Setup + var hydraulicBoundaryDatabase = new HydraulicBoundaryDatabase + { + Locations = + { TestHydraulicBoundaryLocation.CreateFullyCalculated() } }; @@ -239,36 +489,27 @@ HydraulicBoundaryLocation hydraulicBoundaryLocation = assessmentSection.HydraulicBoundaryDatabase.Locations[0]; - // Precondition - int originalReturnPeriodValue = Convert.ToInt32(1.0 / failureMechanismContribution.Norm); - Assert.AreEqual(originalReturnPeriodValue, properties.ReturnPeriod); - Assert.IsFalse(double.IsNaN(hydraulicBoundaryLocation.WaveHeight)); - Assert.IsFalse(double.IsNaN(hydraulicBoundaryLocation.DesignWaterLevel)); - DialogBoxHandler = (name, wnd) => { var dialogTester = new MessageBoxTester(wnd); dialogTester.ClickOk(); }; // Call - Action call = () => properties.ReturnPeriod = newReturnPeriod; + Action call = () => setPropertyAction(properties); // Assert TestHelper.AssertLogMessageIsGenerated(call, messageAllHydraulicBoundaryLocationOutputCleared, 1); - Assert.AreEqual(1.0 / 30000, failureMechanismContribution.Norm); - Assert.IsNaN(hydraulicBoundaryLocation.WaveHeight); - Assert.IsNaN(hydraulicBoundaryLocation.DesignWaterLevel); + AssertNormValues(properties, failureMechanismContribution); + AssertLocationsOutputClear(hydraulicBoundaryLocation); mockRepository.VerifyAll(); } - [Test] - public void ReturnPeriodProperty_HydraulicBoundaryLocationNoOutputAndCalculationWithOutputAndValueChanged_CalculationObserverNotifiedAndMessageLogged() + private void SetPropertyAndVerifyNotifcationsAndOutputForHydraulicBoundaryLocationNoOutputAndCalculationWithOutput(Action setPropertyAction) { // Setup - const int newReturnPeriod = 200; const int numberOfCalculations = 3; var hydraulicBoundaryDatabase = new HydraulicBoundaryDatabase(); @@ -341,42 +582,29 @@ new FailureMechanismContributionNormChangeHandler(assessmentSection), new AssessmentSectionCompositionChangeHandler(viewCommands)); - // Precondition - int originalReturnPeriodValue = Convert.ToInt32(1.0 / failureMechanismContribution.Norm); - Assert.AreEqual(originalReturnPeriodValue, properties.ReturnPeriod); - Assert.IsNotNull(pipingCalculation.Output); - Assert.IsNotNull(pipingCalculation.SemiProbabilisticOutput); - Assert.IsNotNull(grassCoverErosionInwardsCalculation.Output); - Assert.IsNotNull(heightStructuresCalculation.Output); - DialogBoxHandler = (name, wnd) => { var dialogTester = new MessageBoxTester(wnd); dialogTester.ClickOk(); }; // Call - Action call = () => properties.ReturnPeriod = newReturnPeriod; + Action call = () => setPropertyAction(properties); // Assert string expectedMessage = string.Format(messageCalculationsremoved, numberOfCalculations); TestHelper.AssertLogMessageIsGenerated(call, expectedMessage, 1); - Assert.AreEqual(1.0 / 30000, failureMechanismContribution.Norm); - Assert.IsNull(pipingCalculation.Output); - Assert.IsNull(pipingCalculation.SemiProbabilisticOutput); - Assert.IsNull(grassCoverErosionInwardsCalculation.Output); - Assert.IsNull(heightStructuresCalculation.Output); + AssertNormValues(properties, failureMechanismContribution); + AssertCalculationsOutputClear(pipingCalculation, grassCoverErosionInwardsCalculation, heightStructuresCalculation); mockRepository.VerifyAll(); } - [Test] - public void ReturnPeriodProperty_NoHydraulicBoundaryLocationNoOutputAndCalculationWithOutputAndValueChanged_CalculationObserverNotifiedAndMessageLogged() + private void SetPropertyAndVerifyNotifcationsAndOutputForNoHydraulicBoundaryLocationNoOutputAndCalculationWithOutput(Action setPropertyAction) { // Setup - const int newReturnPeriod = 200; const int numberOfCalculations = 3; var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike); @@ -440,43 +668,29 @@ new FailureMechanismContributionNormChangeHandler(assessmentSection), new AssessmentSectionCompositionChangeHandler(viewCommands)); - // Precondition - int originalReturnPeriodValue = Convert.ToInt32(1.0 / failureMechanismContribution.Norm); - Assert.AreEqual(originalReturnPeriodValue, properties.ReturnPeriod); - Assert.IsNotNull(pipingCalculation.Output); - Assert.IsNotNull(pipingCalculation.SemiProbabilisticOutput); - Assert.IsNotNull(grassCoverErosionInwardsCalculation.Output); - Assert.IsNotNull(heightStructuresCalculation.Output); - DialogBoxHandler = (name, wnd) => { var dialogTester = new MessageBoxTester(wnd); dialogTester.ClickOk(); }; // Call - Action call = () => properties.ReturnPeriod = newReturnPeriod; + Action call = () => setPropertyAction(properties); // Assert string expectedMessage = string.Format(messageCalculationsremoved, numberOfCalculations); TestHelper.AssertLogMessageIsGenerated(call, expectedMessage, 1); - Assert.AreEqual(1.0 / 30000, failureMechanismContribution.Norm); - Assert.IsNull(pipingCalculation.Output); - Assert.IsNull(pipingCalculation.SemiProbabilisticOutput); - Assert.IsNull(grassCoverErosionInwardsCalculation.Output); - Assert.IsNull(heightStructuresCalculation.Output); + AssertNormValues(properties, failureMechanismContribution); + AssertCalculationsOutputClear(pipingCalculation, grassCoverErosionInwardsCalculation, heightStructuresCalculation); mockRepository.VerifyAll(); } - [Test] - public void ReturnPeriodProperty_HydraulicBoundaryLocationNoOutputAndNoCalculationsWithOutputAndValueChanged_NoObserversNotifiedAndMessagesLogged() + private void SetPropertyAndVerifyNotifcationsAndOutputForHydraulicBoundaryLocationNoOutputAndNoCalculationsWithOutput(Action setPropertyAction) { // Setup - const int newReturnPeriod = 200; - var hydraulicBoundaryDatabase = new HydraulicBoundaryDatabase(); hydraulicBoundaryDatabase.Locations.Add(new TestHydraulicBoundaryLocation()); @@ -516,36 +730,29 @@ new FailureMechanismContributionNormChangeHandler(assessmentSection), new AssessmentSectionCompositionChangeHandler(viewCommands)); - // Precondition - int originalReturnPeriodValue = Convert.ToInt32(1.0 / failureMechanismContribution.Norm); - Assert.AreEqual(originalReturnPeriodValue, properties.ReturnPeriod); - DialogBoxHandler = (name, wnd) => { var dialogTester = new MessageBoxTester(wnd); dialogTester.ClickOk(); }; // Call - Action call = () => properties.ReturnPeriod = newReturnPeriod; + Action call = () => setPropertyAction(properties); // Assert TestHelper.AssertLogMessagesCount(call, 0); - Assert.AreEqual(1.0 / 30000, failureMechanismContribution.Norm); + AssertNormValues(properties, failureMechanismContribution); mockRepository.VerifyAll(); // No update observer expected. } - [Test] - public void ReturnPeriodProperty_NoHydraulicBoundaryDatabaseAndNoCalculationsWithOutputAndValueChanged_NoObserversNotifiedAndMessagesLogged() + private void SetPropertyAndVerifyNotifcationsAndOutputForNoHydraulicBoundaryDatabaseAndNoCalculationsWithOutput(Action setPropertyAction) { // Setup var mockRepository = new MockRepository(); var viewCommands = mockRepository.Stub(); mockRepository.ReplayAll(); - const int newReturnPeriod = 200; - var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike); var emptyPipingCalculation = new PipingCalculation(new GeneralPipingInput()); @@ -564,18 +771,55 @@ new FailureMechanismContributionNormChangeHandler(assessmentSection), new AssessmentSectionCompositionChangeHandler(viewCommands)); - // Precondition - int originalReturnPeriodValue = Convert.ToInt32(1.0 / failureMechanismContribution.Norm); - Assert.AreEqual(originalReturnPeriodValue, properties.ReturnPeriod); + DialogBoxHandler = (name, wnd) => + { + var dialogTester = new MessageBoxTester(wnd); + dialogTester.ClickOk(); + }; // Call - failureMechanismContribution.Norm = 1.0 / newReturnPeriod; - Action call = () => failureMechanismContribution.NotifyObservers(); + Action call = () => setPropertyAction(properties); // Assert TestHelper.AssertLogMessagesCount(call, 0); - Assert.AreEqual(1.0 / 30000, failureMechanismContribution.Norm); + AssertNormValues(properties, failureMechanismContribution); mockRepository.VerifyAll(); } + + #region Asserts + + private static void AssertCalculationsOutputClear(PipingCalculation pipingCalculation, + GrassCoverErosionInwardsCalculation grassCoverErosionInwardsCalculation, + StructuresCalculation heightStructuresCalculation) + { + Assert.IsNull(pipingCalculation.Output); + Assert.IsNull(pipingCalculation.SemiProbabilisticOutput); + Assert.IsNull(grassCoverErosionInwardsCalculation.Output); + Assert.IsNull(heightStructuresCalculation.Output); + } + + private static void AssertLocationsOutputClear(params HydraulicBoundaryLocation[] hydraulicBoundaryLocations) + { + foreach (HydraulicBoundaryLocation hydraulicBoundaryLocation in hydraulicBoundaryLocations) + { + Assert.IsFalse(hydraulicBoundaryLocation.WaveHeightCalculation.HasOutput); + Assert.IsFalse(hydraulicBoundaryLocation.DesignWaterLevelCalculation.HasOutput); + } + } + + private static void AssertNormValues(FailureMechanismContributionProperties properties, FailureMechanismContribution failureMechanismContribution) + { + Assert.AreEqual(properties.LowerLimitNorm, ProbabilityFormattingHelper.Format(failureMechanismContribution.LowerLimitNorm)); + Assert.AreEqual(properties.SignalingNorm, ProbabilityFormattingHelper.Format(failureMechanismContribution.SignalingNorm)); + Assert.AreEqual(properties.NormativeNorm, failureMechanismContribution.NormativeNorm); + + double expectedNorm = failureMechanismContribution.NormativeNorm == NormType.LowerLimit + ? failureMechanismContribution.LowerLimitNorm + : failureMechanismContribution.SignalingNorm; + + Assert.AreEqual(expectedNorm, failureMechanismContribution.Norm); + } + + #endregion } } \ No newline at end of file Index: Ringtoets/Integration/test/Ringtoets.Integration.Forms.Test/PropertyClasses/FailureMechanismContributionPropertiesTest.cs =================================================================== diff -u -r2e265dc8a3c902ebdfdcdf0f1071f9c3c872d822 -rffa34dc6feb3d5fdf246cb89f7e1c11990ccc960 --- Ringtoets/Integration/test/Ringtoets.Integration.Forms.Test/PropertyClasses/FailureMechanismContributionPropertiesTest.cs (.../FailureMechanismContributionPropertiesTest.cs) (revision 2e265dc8a3c902ebdfdcdf0f1071f9c3c872d822) +++ Ringtoets/Integration/test/Ringtoets.Integration.Forms.Test/PropertyClasses/FailureMechanismContributionPropertiesTest.cs (.../FailureMechanismContributionPropertiesTest.cs) (revision ffa34dc6feb3d5fdf246cb89f7e1c11990ccc960) @@ -20,8 +20,8 @@ // All rights reserved. using System; -using System.Collections.Generic; using System.ComponentModel; +using System.Globalization; using System.Linq; using Core.Common.Base; using Core.Common.Gui.Commands; @@ -36,10 +36,10 @@ using Ringtoets.Common.Data.FailureMechanism; using Ringtoets.Common.Forms.Helpers; using Ringtoets.Common.Forms.PropertyClasses; +using Ringtoets.Common.Forms.TestUtil; using Ringtoets.Integration.Data; using Ringtoets.Integration.Forms.PropertyClasses; using Ringtoets.Integration.Plugin.Handlers; -using Ringtoets.Integration.TestUtils; namespace Ringtoets.Integration.Forms.Test.PropertyClasses { @@ -166,7 +166,7 @@ PropertyDescriptorCollection dynamicProperties = PropertiesTestHelper.GetAllVisiblePropertyDescriptors(properties); - Assert.AreEqual(5, dynamicProperties.Count); + Assert.AreEqual(4, dynamicProperties.Count); const string expectedCategory = "Algemeen"; @@ -176,33 +176,24 @@ "Trajecttype", "Selecteer het type traject, bepalend voor de faalkansbegroting."); - PropertyDescriptor returnPeriodProperty = dynamicProperties[1]; - PropertiesTestHelper.AssertRequiredPropertyDescriptorProperties(returnPeriodProperty, - expectedCategory, - "Norm (terugkeertijd) [jaar]", - "Terugkeertijd van de norm, gelijk aan 1/norm."); - - PropertyDescriptor lowerLevelNormProperty = dynamicProperties[2]; + PropertyDescriptor lowerLevelNormProperty = dynamicProperties[1]; PropertiesTestHelper.AssertRequiredPropertyDescriptorProperties(lowerLevelNormProperty, expectedCategory, "Ondergrens [1/jaar]", - "Overstromingskans van het dijktraject die hoort bij het minimale beschermingsniveau dat de kering moet bieden.", - true); + "Overstromingskans van het dijktraject die hoort bij het minimale beschermingsniveau dat de kering moet bieden."); - PropertyDescriptor signalingNormProperty = dynamicProperties[3]; + PropertyDescriptor signalingNormProperty = dynamicProperties[2]; PropertiesTestHelper.AssertRequiredPropertyDescriptorProperties(signalingNormProperty, expectedCategory, "Signaleringswaarde [1/jaar]", - "Overstromingskans van het dijktraject waarvan overschrijding gemeld moet worden aan de Minister van I en M.", - true); + "Overstromingskans van het dijktraject waarvan overschrijding gemeld moet worden aan de Minister van I en M."); - PropertyDescriptor normativeNormProperty = dynamicProperties[4]; + PropertyDescriptor normativeNormProperty = dynamicProperties[3]; Assert.IsInstanceOf(normativeNormProperty.Converter); PropertiesTestHelper.AssertRequiredPropertyDescriptorProperties(normativeNormProperty, expectedCategory, "Norm van het dijktraject", - "De kans die wordt gebruikt als de norm van het dijktraject.", - true); + "De kans die wordt gebruikt als de norm van het dijktraject."); } [Test] @@ -238,85 +229,21 @@ } [Test] - public void GivenReturnPeriod_WhenConfirmingReturnPeriodValueChange_ThenReturnPeriodSetAndNotifiesObserver() + public void LowerLimitNorm_Always_ContributionNotifiedAndPropertyChangedCalled() { - // Given - var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike); - FailureMechanismContribution failureMechanismContribution = assessmentSection.FailureMechanismContribution; - - var normChangeHandler = new FailureMechanismContributionNormChangeHandler(assessmentSection); - - var mocks = new MockRepository(); - var compositionChangeHandler = mocks.Stub(); - mocks.ReplayAll(); - - var observer = mocks.StrictMock(); - failureMechanismContribution.Attach(observer); - - observer.Expect(o => o.UpdateObserver()); - - mocks.ReplayAll(); - - var properties = new FailureMechanismContributionProperties( - failureMechanismContribution, - assessmentSection, - normChangeHandler, - compositionChangeHandler); - - DialogBoxHandler = (name, wnd) => - { - var messageBox = new MessageBoxTester(wnd); - messageBox.ClickOk(); - }; - - // When - const int newReturnPeriod = 200; - properties.ReturnPeriod = newReturnPeriod; - - // Then - Assert.AreEqual(30000, properties.ReturnPeriod); - Assert.AreEqual(1.0 / 30000, failureMechanismContribution.Norm); - mocks.VerifyAll(); + SetPropertyAndVerifyNotifcationsAndOutputForCalculation(properties => properties.LowerLimitNorm = 0.01.ToString(CultureInfo.CurrentCulture)); } [Test] - public void GivenReturnPeriod_WhenCancelingReturnPeriodValueChange_ThenDataSameObserversNotNotified() + public void SignalingNorm_Always_ContributionNotifiedAndPropertyChangedCalled() { - // Given - var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike); - FailureMechanismContribution failureMechanismContribution = assessmentSection.FailureMechanismContribution; - int originalReturnPeriod = Convert.ToInt32(1 / failureMechanismContribution.Norm); + SetPropertyAndVerifyNotifcationsAndOutputForCalculation(properties => properties.SignalingNorm = 0.00001.ToString(CultureInfo.CurrentCulture)); + } - var normChangeHandler = new FailureMechanismContributionNormChangeHandler(assessmentSection); - - var mocks = new MockRepository(); - var compositionChangeHandler = mocks.Stub(); - mocks.ReplayAll(); - - var observer = mocks.StrictMock(); - failureMechanismContribution.Attach(observer); - mocks.ReplayAll(); - - var properties = new FailureMechanismContributionProperties( - failureMechanismContribution, - assessmentSection, - normChangeHandler, - compositionChangeHandler); - - DialogBoxHandler = (name, wnd) => - { - var messageBox = new MessageBoxTester(wnd); - messageBox.ClickCancel(); - }; - - // When - const int newReturnPeriod = 200; - properties.ReturnPeriod = newReturnPeriod; - - // Then - Assert.AreEqual(originalReturnPeriod, properties.ReturnPeriod); - Assert.AreEqual(1.0 / originalReturnPeriod, failureMechanismContribution.Norm); - mocks.VerifyAll(); + [Test] + public void NormativeNorm_Always_ContributionNotifiedAndPropertyChangedCalled() + { + SetPropertyAndVerifyNotifcationsAndOutputForCalculation(properties => properties.NormativeNorm = NormType.Signaling); } [Test] @@ -402,82 +329,6 @@ } [Test] - public void ReturnPeriod_ValueChanges_NotifiesChangedObjectsInAssessmentSection() - { - // Setup - const int returnPeriod = 200; - - var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike); - - var mocks = new MockRepository(); - var observable1 = mocks.StrictMock(); - observable1.Expect(o => o.NotifyObservers()); - var observable2 = mocks.StrictMock(); - observable2.Expect(o => o.NotifyObservers()); - - var normChangeHandler = mocks.StrictMock(); - normChangeHandler.Expect(h => h.SetPropertyValueAfterConfirmation(null)).IgnoreArguments() - .Return(new[] - { - observable1, - observable2 - }); - var viewCommands = mocks.Stub(); - mocks.ReplayAll(); - - var properties = new FailureMechanismContributionProperties( - assessmentSection.FailureMechanismContribution, - assessmentSection, - normChangeHandler, - new AssessmentSectionCompositionChangeHandler(viewCommands)); - - // Call - properties.ReturnPeriod = returnPeriod; - - // Assert - mocks.VerifyAll(); - } - - [Test] - [TestCase(int.MinValue)] - [TestCase(int.MaxValue)] - [TestCase(9)] - [TestCase(1000001)] - [TestCase(0)] - [SetCulture("nl-NL")] - public void ReturnPeriod_InvalidValue_ThrowsArgumentOutOfRangeException(int invalidReturnPeriod) - { - // Setup - DialogBoxHandler = (name, wnd) => - { - var tester = new MessageBoxTester(wnd); - tester.ClickOk(); - }; - - AssessmentSection assessmentSection = TestDataGenerator.GetAssessmentSectionWithAllCalculationConfigurations(); - - var mocks = new MockRepository(); - var viewCommands = mocks.Stub(); - mocks.ReplayAll(); - - IEnumerable failureMechanisms = Enumerable.Empty(); - var contribution = new FailureMechanismContribution(failureMechanisms, 1.1); - - var properties = new FailureMechanismContributionProperties( - contribution, - assessmentSection, - new FailureMechanismContributionNormChangeHandler(assessmentSection), - new AssessmentSectionCompositionChangeHandler(viewCommands)); - - // Call - TestDelegate call = () => properties.ReturnPeriod = invalidReturnPeriod; - - // Assert - const string expectedMessage = "De waarde van de norm moet in het bereik [0,000001, 0,1] liggen."; - TestHelper.AssertThrowsArgumentExceptionAndTestMessage(call, expectedMessage); - } - - [Test] [TestCase(AssessmentSectionComposition.Dike, AssessmentSectionComposition.Dune)] [TestCase(AssessmentSectionComposition.Dike, AssessmentSectionComposition.DikeAndDune)] [TestCase(AssessmentSectionComposition.Dune, AssessmentSectionComposition.Dike)] @@ -520,6 +371,37 @@ mocks.VerifyAll(); } + private static void SetPropertyAndVerifyNotifcationsAndOutputForCalculation(Action setProperty) + { + // Setup + var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike); + FailureMechanismContribution failureMechanismContribution = assessmentSection.FailureMechanismContribution; + + var mocks = new MockRepository(); + var compositionChangeHandler = mocks.Stub(); + var observable = mocks.StrictMock(); + observable.Expect(o => o.NotifyObservers()); + mocks.ReplayAll(); + + var handler = new SetPropertyValueAfterConfirmationParameterTester(new[] + { + observable + }); + + var properties = new FailureMechanismContributionProperties( + failureMechanismContribution, + assessmentSection, + handler, + compositionChangeHandler); + + // Call + setProperty(properties); + + // Assert + Assert.IsTrue(handler.Called); + mocks.VerifyAll(); + } + private static FailureMechanismContribution CreateFailureMechanismContribution() { return new FailureMechanismContribution(Enumerable.Empty(), new Random(21).Next(0, 100)); Index: Ringtoets/Integration/test/Ringtoets.Integration.Forms.Test/Ringtoets.Integration.Forms.Test.csproj =================================================================== diff -u -r5b300c761d0d8b3748f2ebacb051ff695293e4c6 -rffa34dc6feb3d5fdf246cb89f7e1c11990ccc960 --- Ringtoets/Integration/test/Ringtoets.Integration.Forms.Test/Ringtoets.Integration.Forms.Test.csproj (.../Ringtoets.Integration.Forms.Test.csproj) (revision 5b300c761d0d8b3748f2ebacb051ff695293e4c6) +++ Ringtoets/Integration/test/Ringtoets.Integration.Forms.Test/Ringtoets.Integration.Forms.Test.csproj (.../Ringtoets.Integration.Forms.Test.csproj) (revision ffa34dc6feb3d5fdf246cb89f7e1c11990ccc960) @@ -212,6 +212,10 @@ {27E0A5C9-3ABF-426A-A3DA-7D0B83A218C8} Ringtoets.Piping.KernelWrapper.TestUtil + + {3D4B9740-8348-4434-8D77-B611FC6EE57F} + Ringtoets.StabilityPointStructures.Data + {11f1f874-45af-43e4-8ae5-15a5c9593e28} Ringtoets.Integration.Data