Index: Riskeer/Integration/src/Riskeer.Integration.Forms/PropertyClasses/IFailureMechanismContributionNormChangeHandler.cs =================================================================== diff -u --- Riskeer/Integration/src/Riskeer.Integration.Forms/PropertyClasses/IFailureMechanismContributionNormChangeHandler.cs (revision 0) +++ Riskeer/Integration/src/Riskeer.Integration.Forms/PropertyClasses/IFailureMechanismContributionNormChangeHandler.cs (revision a18a961b395ee6b46324cc00b022074eb091ff19) @@ -0,0 +1,58 @@ +// Copyright (C) Stichting Deltares 2021. All rights reserved. +// +// This file is part of Riskeer. +// +// Riskeer is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// All names, logos, and references to "Deltares" are registered trademarks of +// Stichting Deltares and remain full property of Stichting Deltares at all times. +// All rights reserved. + +using System; +using Riskeer.Common.Data.AssessmentSection; +using Riskeer.Common.Data.Contribution; + +namespace Riskeer.Integration.Forms.PropertyClasses +{ + /// + /// Interface for an object that can properly change the + /// of an . + /// + public interface IFailureMechanismContributionNormChangeHandler + { + /// + /// Change the normative norm type. + /// + /// The action to perform. + /// Thrown when + /// is null. + void ChangeNormativeNormType(Action action); + + /// + /// Change the normative norm. + /// + /// The action to perform. + /// Thrown when + /// is null. + void ChangeNormativeNorm(Action action); + + /// + /// Change the norm. + /// + /// The action to perform. + /// Thrown when + /// is null. + void ChangeNorm(Action action); + } +} \ No newline at end of file Index: Riskeer/Integration/src/Riskeer.Integration.Plugin/Handlers/FailureMechanismContributionNormChangeHandler.cs =================================================================== diff -u -r637f1c4a9c53bbc1968c7a2336ff9ebc892d5ea3 -ra18a961b395ee6b46324cc00b022074eb091ff19 --- Riskeer/Integration/src/Riskeer.Integration.Plugin/Handlers/FailureMechanismContributionNormChangeHandler.cs (.../FailureMechanismContributionNormChangeHandler.cs) (revision 637f1c4a9c53bbc1968c7a2336ff9ebc892d5ea3) +++ Riskeer/Integration/src/Riskeer.Integration.Plugin/Handlers/FailureMechanismContributionNormChangeHandler.cs (.../FailureMechanismContributionNormChangeHandler.cs) (revision a18a961b395ee6b46324cc00b022074eb091ff19) @@ -28,6 +28,7 @@ using Riskeer.Common.Data.AssessmentSection; using Riskeer.Common.Data.Calculation; using Riskeer.Common.Data.Contribution; +using Riskeer.Integration.Forms.PropertyClasses; using Riskeer.Integration.Plugin.Properties; using Riskeer.Integration.Service; using CoreCommonBaseResources = Core.Common.Base.Properties.Resources; @@ -62,29 +63,42 @@ public void ChangeNormativeNormType(Action action) { - // Clear only Piping and macro without manual assessment level PerformAction(action, "Als u de norm aanpast, dan worden de rekenresultaten van semi-probabilistische berekeningen zonder handmatig toetspeil verwijderd. " + Environment.NewLine + Environment.NewLine + "Weet u zeker dat u wilt doorgaan?", - () => new IObservable[0]); + () => + { + var affectedObjects = new List(); + affectedObjects.AddRange(ClearAllNormDependentSemiProbabilisticCalculationOutput()); + return affectedObjects; + }); } public void ChangeNormativeNorm(Action action) { - // Clear only locations depending on this norm and Piping and macro without manual assessment level PerformAction(action, "Als u de norm aanpast, dan worden de rekenresultaten van alle hydraulische belastingenlocaties behorende bij deze norm en semi-probabilistische berekeningen zonder handmatig toetspeil verwijderd. " + Environment.NewLine + Environment.NewLine + "Weet u zeker dat u wilt doorgaan?", - () => new IObservable[0]); + () => + { + var affectedObjects = new List(); + affectedObjects.AddRange(ClearNormDependingHydraulicBoundaryLocationCalculationOutput()); + affectedObjects.AddRange(ClearAllNormDependentSemiProbabilisticCalculationOutput()); + return affectedObjects; + }); } public void ChangeNorm(Action action) { - // Clear only locations depending on this norm PerformAction(action, "Als u de norm aanpast, dan worden de rekenresultaten van alle hydraulische belastingenlocaties behorende bij deze norm verwijderd. " + Environment.NewLine + Environment.NewLine + "Weet u zeker dat u wilt doorgaan?", - () => new IObservable[0]); + () => + { + var affectedObjects = new List(); + affectedObjects.AddRange(ClearNormDependingHydraulicBoundaryLocationCalculationOutput()); + return affectedObjects; + }); } private void PerformAction(Action action, string confirmationMessage, Func> clearDataFunc) @@ -123,40 +137,28 @@ } } - private IEnumerable ClearAllNormDependentCalculationOutput() + private IEnumerable ClearAllNormDependentSemiProbabilisticCalculationOutput() { - List affectedObjects = RiskeerDataSynchronizationService.ClearFailureMechanismCalculationOutputs(assessmentSection).ToList(); - if (affectedObjects.Count > 0) + IEnumerable affectedObjects = RiskeerDataSynchronizationService.ClearAllSemiProbabilisticCalculationOutput(assessmentSection); + if (affectedObjects.Any()) { - log.InfoFormat(Resources.ChangeHandler_Results_of_NumberOfCalculations_0_calculations_cleared, - affectedObjects.OfType().Count()); + log.InfoFormat(Resources.FailureMechanismContributionNormChangeHandler_ClearAllNormDependentSemiProbabilisticCalculationOutput_Results_of_NumberOfCalculations_0_calculations_cleared, + affectedObjects.OfType().Count()); } - affectedObjects.AddRange(ClearAllHydraulicBoundaryLocationCalculationOutput()); - return affectedObjects; } - private IEnumerable ClearAllHydraulicBoundaryLocationCalculationOutput() + private IEnumerable ClearNormDependingHydraulicBoundaryLocationCalculationOutput() { - IEnumerable affectedObjects = RiskeerDataSynchronizationService.ClearHydraulicBoundaryLocationCalculationOutput(assessmentSection); + IEnumerable affectedObjects = RiskeerDataSynchronizationService.ClearHydraulicBoundaryLocationCalculationOutputForNormativeNorm(assessmentSection); if (affectedObjects.Any()) { - log.Info(Resources.FailureMechanismContributionNormChangeHandler_Waveheight_and_design_water_level_results_cleared); - return affectedObjects; + log.Info(Resources.FailureMechanismContributionNormChangeHandler_ClearNormDependingHydraulicBoundaryLocationCalculationOutput_Calculation_results_cleared); } - return Enumerable.Empty(); + return affectedObjects; } } - - public interface IFailureMechanismContributionNormChangeHandler - { - void ChangeNormativeNormType(Action action); - - void ChangeNormativeNorm(Action action); - - void ChangeNorm(Action action); - } } \ No newline at end of file Index: Riskeer/Integration/src/Riskeer.Integration.Plugin/Properties/Resources.Designer.cs =================================================================== diff -u -r426bffa17b9f5056b2f1399c76326f8eb84405b1 -ra18a961b395ee6b46324cc00b022074eb091ff19 --- Riskeer/Integration/src/Riskeer.Integration.Plugin/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision 426bffa17b9f5056b2f1399c76326f8eb84405b1) +++ Riskeer/Integration/src/Riskeer.Integration.Plugin/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision a18a961b395ee6b46324cc00b022074eb091ff19) @@ -1,4 +1,4 @@ -// Copyright (C) Stichting Deltares 2021. All rights reserved. +// Copyright (C) Stichting Deltares 2021. All rights reserved. // // This file is part of Riskeer. // @@ -281,24 +281,35 @@ } /// - /// Looks up a localized string similar to De resultaten van {0} berekeningen zijn verwijderd.. + /// Looks up a localized string similar to Opmerkingen. /// - public static string ChangeHandler_Results_of_NumberOfCalculations_0_calculations_cleared { + public static string Comment_DisplayName { get { - return ResourceManager.GetString("ChangeHandler_Results_of_NumberOfCalculations_0_calculations_cleared", resourceCulture); + return ResourceManager.GetString("Comment_DisplayName", resourceCulture); } } /// - /// Looks up a localized string similar to Opmerkingen. + /// Looks up a localized string similar to De resultaten van {0} semi-probabilistische berekeningen zonder handmatige waterstand zijn verwijderd.. /// - public static string Comment_DisplayName { + public static string FailureMechanismContributionNormChangeHandler_ClearAllNormDependentSemiProbabilisticCalculationOutput_Results_of_NumberOfCalculations_0_calculations_cleared { get { - return ResourceManager.GetString("Comment_DisplayName", resourceCulture); + return ResourceManager.GetString("FailureMechanismContributionNormChangeHandler_ClearAllNormDependentSemiProbabilis" + + "ticCalculationOutput_Results_of_NumberOfCalculations_0_calculations_cleared", resourceCulture); } } /// + /// Looks up a localized string similar to Alle berekende hydraulische belastingen behorende bij de gewijzigde norm zijn verwijderd.. + /// + public static string FailureMechanismContributionNormChangeHandler_ClearNormDependingHydraulicBoundaryLocationCalculationOutput_Calculation_results_cleared { + get { + return ResourceManager.GetString("FailureMechanismContributionNormChangeHandler_ClearNormDependingHydraulicBoundary" + + "LocationCalculationOutput_Calculation_results_cleared", resourceCulture); + } + } + + /// /// Looks up a localized string similar to Als u de norm aanpast, dan worden alle rekenresultaten van alle hydraulische belastingenlocaties en toetssporen verwijderd. /// ///Weet u zeker dat u wilt doorgaan?. @@ -311,16 +322,6 @@ } /// - /// Looks up a localized string similar to Alle berekende hydraulische belastingen zijn verwijderd.. - /// - public static string FailureMechanismContributionNormChangeHandler_Waveheight_and_design_water_level_results_cleared { - get { - return ResourceManager.GetString("FailureMechanismContributionNormChangeHandler_Waveheight_and_design_water_level_r" + - "esults_cleared", resourceCulture); - } - } - - /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// public static System.Drawing.Bitmap Foreshore { Index: Riskeer/Integration/src/Riskeer.Integration.Plugin/Properties/Resources.resx =================================================================== diff -u -r426bffa17b9f5056b2f1399c76326f8eb84405b1 -ra18a961b395ee6b46324cc00b022074eb091ff19 --- Riskeer/Integration/src/Riskeer.Integration.Plugin/Properties/Resources.resx (.../Resources.resx) (revision 426bffa17b9f5056b2f1399c76326f8eb84405b1) +++ Riskeer/Integration/src/Riskeer.Integration.Plugin/Properties/Resources.resx (.../Resources.resx) (revision a18a961b395ee6b46324cc00b022074eb091ff19) @@ -140,12 +140,12 @@ Wilt u doorgaan? - - De resultaten van {0} berekeningen zijn verwijderd. + + De resultaten van {0} semi-probabilistische berekeningen zonder handmatige waterstand zijn verwijderd. - - Alle berekende hydraulische belastingen zijn verwijderd. + Alle berekende hydraulische belastingen behorende bij de gewijzigde norm zijn verwijderd. Index: Riskeer/Integration/test/Riskeer.Integration.Plugin.Test/Handlers/FailureMechanismContributionNormChangeHandlerTest.cs =================================================================== diff -u -rb3501173ad479cdddcd0b8a2dcc97826a1ff0edd -ra18a961b395ee6b46324cc00b022074eb091ff19 --- Riskeer/Integration/test/Riskeer.Integration.Plugin.Test/Handlers/FailureMechanismContributionNormChangeHandlerTest.cs (.../FailureMechanismContributionNormChangeHandlerTest.cs) (revision b3501173ad479cdddcd0b8a2dcc97826a1ff0edd) +++ Riskeer/Integration/test/Riskeer.Integration.Plugin.Test/Handlers/FailureMechanismContributionNormChangeHandlerTest.cs (.../FailureMechanismContributionNormChangeHandlerTest.cs) (revision a18a961b395ee6b46324cc00b022074eb091ff19) @@ -24,18 +24,18 @@ using System.Linq; using Core.Common.Base; using Core.Common.TestUtil; +using Core.Common.Util.Extensions; using NUnit.Extensions.Forms; using NUnit.Framework; using Rhino.Mocks; using Riskeer.Common.Data.AssessmentSection; using Riskeer.Common.Data.Calculation; -using Riskeer.Common.Data.Hydraulics; -using Riskeer.Common.Forms.PropertyClasses; -using Riskeer.DuneErosion.Data; -using Riskeer.DuneErosion.Data.TestUtil; using Riskeer.Integration.Data; +using Riskeer.Integration.Forms.PropertyClasses; using Riskeer.Integration.Plugin.Handlers; using Riskeer.Integration.TestUtil; +using Riskeer.MacroStabilityInwards.Data; +using Riskeer.Piping.Data.SemiProbabilistic; namespace Riskeer.Integration.Plugin.Test.Handlers { @@ -54,7 +54,7 @@ var handler = new FailureMechanismContributionNormChangeHandler(assessmentSection); // Assert - Assert.IsInstanceOf(handler); + Assert.IsInstanceOf(handler); mocks.VerifyAll(); } @@ -70,22 +70,26 @@ } [Test] - public void SetPropertyValueAfterConfirmation_SetValueNull_ThrowArgumentNullException() + public void ChangeNormativeNormType_ActionNull_ThrowsArgumentNullException() { // Setup - AssessmentSection assessmentSection = TestDataGenerator.GetAssessmentSectionWithAllCalculationConfigurationsWithoutHydraulicBoundaryLocationAndDuneOutput(); + var mocks = new MockRepository(); + var assessmentSection = mocks.Stub(); + mocks.ReplayAll(); + var handler = new FailureMechanismContributionNormChangeHandler(assessmentSection); // Call - void Call() => handler.SetPropertyValueAfterConfirmation(null); + void Call() => handler.ChangeNormativeNormType(null); // Assert var exception = Assert.Throws(Call); - Assert.AreEqual("setValue", exception.ParamName); + Assert.AreEqual("action", exception.ParamName); + mocks.VerifyAll(); } [Test] - public void SetPropertyValueAfterConfirmation_Always_ConfirmationRequired() + public void ChangeNormativeNormType_WithAction_ConfirmationRequired() { // Setup var title = ""; @@ -99,257 +103,418 @@ tester.ClickCancel(); }; - AssessmentSection assessmentSection = TestDataGenerator.GetAssessmentSectionWithAllCalculationConfigurationsWithoutHydraulicBoundaryLocationAndDuneOutput(); + var mocks = new MockRepository(); + var assessmentSection = mocks.Stub(); + mocks.ReplayAll(); + var handler = new FailureMechanismContributionNormChangeHandler(assessmentSection); // Call - handler.SetPropertyValueAfterConfirmation(() => {}); + handler.ChangeNormativeNormType(() => {}); // Assert Assert.AreEqual("Bevestigen", title); - string expectedMessage = "Als u de norm aanpast, dan worden alle rekenresultaten van alle hydraulische belastingenlocaties en toetssporen verwijderd." + string expectedMessage = "Als u de norm aanpast, dan worden de rekenresultaten van semi-probabilistische berekeningen zonder handmatig toetspeil verwijderd. " + Environment.NewLine - + Environment.NewLine + - "Weet u zeker dat u wilt doorgaan?"; + + Environment.NewLine + + "Weet u zeker dat u wilt doorgaan?"; Assert.AreEqual(expectedMessage, message); + mocks.VerifyAll(); } [Test] - public void SetPropertyValueAfterConfirmation_FullyConfiguredAssessmentSectionConfirmationGiven_AllCalculationOutputClearedAndContributionsUpdatedAndReturnsAllAffectedObjects() + public void GivenCalculationsWithOutput_WhenChangingNormativeNormType_ThenAllDependingOutputClearedAndActionPerformedAndAllAffectedObjectsNotified() { - // Setup + // Given DialogBoxHandler = (name, wnd) => { var tester = new MessageBoxTester(wnd); tester.ClickOk(); }; AssessmentSection assessmentSection = TestDataGenerator.GetAssessmentSectionWithAllCalculationConfigurations(); - ICalculation[] expectedAffectedCalculations = assessmentSection.GetFailureMechanisms() - .SelectMany(fm => fm.Calculations) - .Where(c => c.HasOutput) + ICalculation[] expectedAffectedCalculations = assessmentSection.Piping + .Calculations + .OfType() + .Where(c => c.HasOutput && !c.InputParameters.UseAssessmentLevelManualInput) + .Concat( + assessmentSection.MacroStabilityInwards + .Calculations + .OfType() + .Where(c => c.HasOutput && !c.InputParameters.UseAssessmentLevelManualInput)) .ToArray(); - IEnumerable userDefinedCalculations = GetUserDefinedCalculations(assessmentSection); - IEnumerable expectedAffectedObjects = - expectedAffectedCalculations.Cast() - .Concat(assessmentSection.GetFailureMechanisms()) - .Concat(assessmentSection.WaterLevelCalculationsForSignalingNorm) - .Concat(assessmentSection.WaterLevelCalculationsForLowerLimitNorm) - .Concat(userDefinedCalculations) - .Concat(GetAllAffectedDuneLocationCalculations(assessmentSection.DuneErosion)) - .Concat(new IObservable[] + expectedAffectedCalculations.Concat(new IObservable[] { assessmentSection.FailureMechanismContribution - }).ToArray(); + }) + .ToArray(); - var handler = new FailureMechanismContributionNormChangeHandler(assessmentSection); + var mocks = new MockRepository(); + var observer = mocks.StrictMock(); + observer.Expect(o => o.UpdateObserver()).Repeat.Times(expectedAffectedObjects.Count()); + mocks.ReplayAll(); - IEnumerable affectedObjects = null; + expectedAffectedObjects.ForEachElementDo(obj => obj.Attach(observer)); - // Call - void Call() => affectedObjects = handler.SetPropertyValueAfterConfirmation(() => {}); + var handler = new FailureMechanismContributionNormChangeHandler(assessmentSection); - // Assert + // When + var actionPerformed = false; + void Call() => handler.ChangeNormativeNormType(() => actionPerformed = true); + + // Then var expectedMessages = new[] { - "De resultaten van 36 berekeningen zijn verwijderd.", - "Alle berekende hydraulische belastingen zijn verwijderd." + $"De resultaten van {expectedAffectedCalculations.Length} semi-probabilistische berekeningen zonder handmatige waterstand zijn verwijderd." }; - TestHelper.AssertLogMessagesAreGenerated(Call, expectedMessages, 2); - - CollectionAssert.IsEmpty(assessmentSection.GetFailureMechanisms().SelectMany(fm => fm.Calculations).Where(c => c.HasOutput), - "There should be no calculations with output."); - - AssertHydraulicBoundaryLocationCalculationOutput(assessmentSection, false); - DuneLocationsTestHelper.AssertDuneLocationCalculationsHaveNoOutputs(assessmentSection.DuneErosion); - - CollectionAssert.AreEquivalent(expectedAffectedObjects, affectedObjects); + TestHelper.AssertLogMessagesAreGenerated(Call, expectedMessages, 1); + Assert.IsTrue(actionPerformed); + CollectionAssert.IsEmpty(expectedAffectedCalculations.Where(c => c.HasOutput)); + mocks.VerifyAll(); } [Test] - public void SetPropertyValueAfterConfirmation_FullyConfiguredAssessmentSectionWithoutCalculationOutputConfirmationGiven_NormChangedContributionsUpdatedAndReturnsAllAffectedObjects() + public void GivenCalculationsWithoutOutput_WhenChangingNormativeNormType_ThenActionPerformedAndContributionNotified() { - // Setup + // Given DialogBoxHandler = (name, wnd) => { var tester = new MessageBoxTester(wnd); tester.ClickOk(); }; - AssessmentSection assessmentSection = TestDataGenerator.GetAssessmentSectionWithAllCalculationConfigurationsWithoutCalculationOutput(); + AssessmentSection assessmentSection = TestDataGenerator.GetAssessmentSectionWithAllCalculationConfigurations(); + ICalculation[] calculations = assessmentSection.Piping + .Calculations + .OfType() + .Where(c => c.HasOutput && !c.InputParameters.UseAssessmentLevelManualInput) + .Concat( + assessmentSection.MacroStabilityInwards + .Calculations + .OfType() + .Where(c => c.HasOutput && !c.InputParameters.UseAssessmentLevelManualInput)) + .ToArray(); - IEnumerable userDefinedCalculations = GetUserDefinedCalculations(assessmentSection); + calculations.ForEachElementDo(c => c.ClearOutput()); - List expectedAffectedObjects = - assessmentSection.GetFailureMechanisms().Cast() - .Concat(assessmentSection.WaterLevelCalculationsForSignalingNorm) - .Concat(assessmentSection.WaterLevelCalculationsForLowerLimitNorm) - .Concat(userDefinedCalculations) - .Concat(GetAllAffectedDuneLocationCalculations(assessmentSection.DuneErosion)) - .Concat(new IObservable[] - { - assessmentSection.FailureMechanismContribution - }).ToList(); + var mocks = new MockRepository(); + var observer = mocks.StrictMock(); + observer.Expect(o => o.UpdateObserver()).Repeat.Once(); + mocks.ReplayAll(); + assessmentSection.FailureMechanismContribution.Attach(observer); + var handler = new FailureMechanismContributionNormChangeHandler(assessmentSection); - IEnumerable affectedObjects = null; + // When + var actionPerformed = false; + void Call() => handler.ChangeNormativeNormType(() => actionPerformed = true); - // Call - void Call() => affectedObjects = handler.SetPropertyValueAfterConfirmation(() => {}); + // Then + TestHelper.AssertLogMessagesCount(Call, 0); + Assert.IsTrue(actionPerformed); + mocks.VerifyAll(); + } - // Assert - TestHelper.AssertLogMessageIsGenerated(Call, "Alle berekende hydraulische belastingen zijn verwijderd.", 1); + [Test] + public void ChangeNormativeNormActionNull_ThrowsArgumentNullException() + { + // Setup + var mocks = new MockRepository(); + var assessmentSection = mocks.Stub(); + mocks.ReplayAll(); - AssertHydraulicBoundaryLocationCalculationOutput(assessmentSection, false); - DuneLocationsTestHelper.AssertDuneLocationCalculationsHaveNoOutputs(assessmentSection.DuneErosion); + var handler = new FailureMechanismContributionNormChangeHandler(assessmentSection); - CollectionAssert.AreEquivalent(expectedAffectedObjects, affectedObjects); + // Call + void Call() => handler.ChangeNormativeNorm(null); + + // Assert + var exception = Assert.Throws(Call); + Assert.AreEqual("action", exception.ParamName); + mocks.VerifyAll(); } [Test] - public void SetPropertyValueAfterConfirmation_FullyConfiguredAssessmentSectionWithoutCalculatedHydraulicBoundaryLocationsConfirmationGiven_AllFailureMechanismCalculationOutputClearedAndContributionsUpdatedAndReturnsAllAffectedObjects() + public void ChangeNormativeNorm_WithAction_ConfirmationRequired() { // Setup + var title = ""; + var message = ""; DialogBoxHandler = (name, wnd) => { var tester = new MessageBoxTester(wnd); - tester.ClickOk(); + title = tester.Title; + message = tester.Text; + + tester.ClickCancel(); }; - AssessmentSection assessmentSection = TestDataGenerator.GetAssessmentSectionWithAllCalculationConfigurationsWithoutHydraulicBoundaryLocationAndDuneOutput(); + var mocks = new MockRepository(); + var assessmentSection = mocks.Stub(); + mocks.ReplayAll(); - ICalculation[] expectedAffectedCalculations = assessmentSection.GetFailureMechanisms() - .SelectMany(fm => fm.Calculations) - .Where(c => c.HasOutput) - .ToArray(); var handler = new FailureMechanismContributionNormChangeHandler(assessmentSection); - IEnumerable affectedObjects = null; - // Call - void Call() => affectedObjects = handler.SetPropertyValueAfterConfirmation(() => {}); + handler.ChangeNormativeNorm(() => {}); // Assert - TestHelper.AssertLogMessageIsGenerated(Call, "De resultaten van 36 berekeningen zijn verwijderd.", 1); - - CollectionAssert.IsEmpty(assessmentSection.GetFailureMechanisms().SelectMany(fm => fm.Calculations).Where(c => c.HasOutput), - "There should be no calculations with output."); - - IEnumerable expectedAffectedObjects = expectedAffectedCalculations.Cast() - .Concat(assessmentSection.GetFailureMechanisms()) - .Concat(new IObservable[] - { - assessmentSection.FailureMechanismContribution - }); - CollectionAssert.AreEquivalent(expectedAffectedObjects, affectedObjects); + Assert.AreEqual("Bevestigen", title); + string expectedMessage = "Als u de norm aanpast, dan worden de rekenresultaten van alle hydraulische belastingenlocaties behorende bij deze norm en semi-probabilistische berekeningen zonder handmatig toetspeil verwijderd. " + + Environment.NewLine + + Environment.NewLine + + "Weet u zeker dat u wilt doorgaan?"; + Assert.AreEqual(expectedMessage, message); + mocks.VerifyAll(); } [Test] - public void SetPropertyValueAfterConfirmation_FullyConfiguredAssessmentSectionConfirmationGiven_HandlerExecuted() + public void GivenCalculationsWithOutput_WhenChangingNormativeNorm_ThenAllDependingOutputClearedAndActionPerformedAndAllAffectedObjectsNotified() { - // Setup + // Given DialogBoxHandler = (name, wnd) => { var tester = new MessageBoxTester(wnd); tester.ClickOk(); }; AssessmentSection assessmentSection = TestDataGenerator.GetAssessmentSectionWithAllCalculationConfigurations(); + ICalculation[] expectedAffectedCalculations = assessmentSection.Piping + .Calculations + .OfType() + .Where(c => c.HasOutput && !c.InputParameters.UseAssessmentLevelManualInput) + .Concat( + assessmentSection.MacroStabilityInwards + .Calculations + .OfType() + .Where(c => c.HasOutput && !c.InputParameters.UseAssessmentLevelManualInput)) + .ToArray(); + IEnumerable expectedAffectedObjects = + expectedAffectedCalculations.Concat(new IObservable[] + { + assessmentSection.FailureMechanismContribution + }) + .Concat(assessmentSection.WaterLevelCalculationsForLowerLimitNorm) + .ToArray(); + + var mocks = new MockRepository(); + var observer = mocks.StrictMock(); + observer.Expect(o => o.UpdateObserver()).Repeat.Times(expectedAffectedObjects.Count()); + mocks.ReplayAll(); + + expectedAffectedObjects.ForEachElementDo(obj => obj.Attach(observer)); + var handler = new FailureMechanismContributionNormChangeHandler(assessmentSection); - var handlerExecuted = false; + // Precondition + CollectionAssert.IsNotEmpty(assessmentSection.WaterLevelCalculationsForLowerLimitNorm.Where(c => c.HasOutput)); - // Call - handler.SetPropertyValueAfterConfirmation(() => handlerExecuted = true); + // When + var actionPerformed = false; + void Call() => handler.ChangeNormativeNorm(() => actionPerformed = true); - // Assert - Assert.IsTrue(handlerExecuted); + // Then + var expectedMessages = new[] + { + "Alle berekende hydraulische belastingen behorende bij de gewijzigde norm zijn verwijderd.", + $"De resultaten van {expectedAffectedCalculations.Length} semi-probabilistische berekeningen zonder handmatige waterstand zijn verwijderd." + }; + TestHelper.AssertLogMessagesAreGenerated(Call, expectedMessages, 2); + + Assert.IsTrue(actionPerformed); + CollectionAssert.IsEmpty(expectedAffectedCalculations.Where(c => c.HasOutput)); + CollectionAssert.IsEmpty(assessmentSection.WaterLevelCalculationsForLowerLimitNorm.Where(c => c.HasOutput)); + mocks.VerifyAll(); } [Test] - public void SetPropertyValueAfterConfirmation_ConfirmationNotGiven_SetValueNotCalledNoAffectedObjects() + public void GivenCalculationsWithoutOutput_WhenChangingNormativeNorm_ThenActionPerformedAndContributionNotified() { - // Setup + // Given DialogBoxHandler = (name, wnd) => { var tester = new MessageBoxTester(wnd); - tester.ClickCancel(); + tester.ClickOk(); }; AssessmentSection assessmentSection = TestDataGenerator.GetAssessmentSectionWithAllCalculationConfigurations(); + ICalculation[] calculations = assessmentSection.Piping + .Calculations + .OfType() + .Where(c => c.HasOutput && !c.InputParameters.UseAssessmentLevelManualInput) + .Concat( + assessmentSection.MacroStabilityInwards + .Calculations + .OfType() + .Where(c => c.HasOutput && !c.InputParameters.UseAssessmentLevelManualInput)) + .ToArray(); + var mocks = new MockRepository(); + var observer = mocks.StrictMock(); + observer.Expect(o => o.UpdateObserver()).Repeat.Once(); + mocks.ReplayAll(); + + calculations.ForEachElementDo(c => + { + c.ClearOutput(); + c.Attach(observer); + }); + assessmentSection.WaterLevelCalculationsForLowerLimitNorm.ForEachElementDo(c => + { + c.Output = null; + c.Attach(observer); + }); + assessmentSection.FailureMechanismContribution.Attach(observer); + var handler = new FailureMechanismContributionNormChangeHandler(assessmentSection); - var propertySet = 0; + // When + var actionPerformed = false; + void Call() => handler.ChangeNormativeNorm(() => actionPerformed = true); - // Call - IEnumerable affectedObjects = handler.SetPropertyValueAfterConfirmation(() => propertySet++); + // Then + TestHelper.AssertLogMessagesCount(Call, 0); + Assert.IsTrue(actionPerformed); + mocks.VerifyAll(); + } - // Assert - Assert.AreEqual(0, propertySet); + [Test] + public void ChangeNormActionNull_ThrowsArgumentNullException() + { + // Setup + var mocks = new MockRepository(); + var assessmentSection = mocks.Stub(); + mocks.ReplayAll(); - AssertHydraulicBoundaryLocationCalculationOutput(assessmentSection, true); + var handler = new FailureMechanismContributionNormChangeHandler(assessmentSection); - Assert.IsNotNull(assessmentSection.DuneErosion.CalculationsForMechanismSpecificFactorizedSignalingNorm.First().Output); - Assert.IsNotNull(assessmentSection.DuneErosion.CalculationsForMechanismSpecificSignalingNorm.First().Output); - Assert.IsNotNull(assessmentSection.DuneErosion.CalculationsForMechanismSpecificLowerLimitNorm.First().Output); - Assert.IsNotNull(assessmentSection.DuneErosion.CalculationsForLowerLimitNorm.First().Output); - Assert.IsNotNull(assessmentSection.DuneErosion.CalculationsForFactorizedLowerLimitNorm.First().Output); + // Call + void Call() => handler.ChangeNorm(null); - CollectionAssert.IsEmpty(affectedObjects); + // Assert + var exception = Assert.Throws(Call); + Assert.AreEqual("action", exception.ParamName); + mocks.VerifyAll(); } [Test] - public void SetPropertyValueAfterConfirmation_ConfirmationGivenExceptionInSetValue_ExceptionBubbled() + public void ChangeNorm_WithAction_ConfirmationRequired() { // Setup + var title = ""; + var message = ""; DialogBoxHandler = (name, wnd) => { var tester = new MessageBoxTester(wnd); - tester.ClickOk(); + title = tester.Title; + message = tester.Text; + + tester.ClickCancel(); }; - AssessmentSection assessmentSection = TestDataGenerator.GetAssessmentSectionWithAllCalculationConfigurations(); + var mocks = new MockRepository(); + var assessmentSection = mocks.Stub(); + mocks.ReplayAll(); + var handler = new FailureMechanismContributionNormChangeHandler(assessmentSection); - var expectedException = new Exception(); // Call - void Call() => handler.SetPropertyValueAfterConfirmation(() => throw expectedException); + handler.ChangeNorm(() => {}); // Assert - var exception = Assert.Throws(Call); - Assert.AreSame(expectedException, exception); + Assert.AreEqual("Bevestigen", title); + string expectedMessage = "Als u de norm aanpast, dan worden de rekenresultaten van alle hydraulische belastingenlocaties behorende bij deze norm verwijderd. " + + Environment.NewLine + + Environment.NewLine + + "Weet u zeker dat u wilt doorgaan?"; + Assert.AreEqual(expectedMessage, message); + mocks.VerifyAll(); } - private static IEnumerable GetUserDefinedCalculations(IAssessmentSection assessmentSection) + [Test] + public void GivenCalculationsWithOutput_WhenChangingNorm_ThenAllDependingOutputClearedAndActionPerformedAndAllAffectedObjectsNotified() { - var userDefinedCalculations = new List(); - - foreach (ObservableList element in assessmentSection.WaterLevelCalculationsForUserDefinedTargetProbabilities.Select(c => c.HydraulicBoundaryLocationCalculations)) + // Given + DialogBoxHandler = (name, wnd) => { - userDefinedCalculations.AddRange(element); - } + var tester = new MessageBoxTester(wnd); + tester.ClickOk(); + }; - foreach (ObservableList element in assessmentSection.WaveHeightCalculationsForUserDefinedTargetProbabilities.Select(c => c.HydraulicBoundaryLocationCalculations)) + AssessmentSection assessmentSection = TestDataGenerator.GetAssessmentSectionWithAllCalculationConfigurations(); + + IEnumerable expectedAffectedObjects = new IObservable[] + { + assessmentSection.FailureMechanismContribution + } + .Concat(assessmentSection.WaterLevelCalculationsForLowerLimitNorm) + .ToArray(); + + var mocks = new MockRepository(); + var observer = mocks.StrictMock(); + observer.Expect(o => o.UpdateObserver()).Repeat.Times(expectedAffectedObjects.Count()); + mocks.ReplayAll(); + + expectedAffectedObjects.ForEachElementDo(obj => obj.Attach(observer)); + + var handler = new FailureMechanismContributionNormChangeHandler(assessmentSection); + + // Precondition + CollectionAssert.IsNotEmpty(assessmentSection.WaterLevelCalculationsForLowerLimitNorm.Where(c => c.HasOutput)); + + // When + var actionPerformed = false; + void Call() => handler.ChangeNorm(() => actionPerformed = true); + + // Then + var expectedMessages = new[] { - userDefinedCalculations.AddRange(element); - } + "Alle berekende hydraulische belastingen behorende bij de gewijzigde norm zijn verwijderd." + }; + TestHelper.AssertLogMessagesAreGenerated(Call, expectedMessages, 1); - return userDefinedCalculations; + Assert.IsTrue(actionPerformed); + CollectionAssert.IsEmpty(assessmentSection.WaterLevelCalculationsForLowerLimitNorm.Where(c => c.HasOutput)); + mocks.VerifyAll(); } - private static IEnumerable GetAllAffectedDuneLocationCalculations(DuneErosionFailureMechanism failureMechanism) + [Test] + public void GivenCalculationsWithoutOutput_WhenChangingNorm_ThenActionPerformedAndContributionNotified() { - return DuneLocationsTestHelper.GetAllDuneLocationCalculationsWithOutput(failureMechanism); - } + // Given + DialogBoxHandler = (name, wnd) => + { + var tester = new MessageBoxTester(wnd); + tester.ClickOk(); + }; - private static void AssertHydraulicBoundaryLocationCalculationOutput(AssessmentSection assessmentSection, bool hasOutput) - { - Assert.IsTrue(assessmentSection.WaterLevelCalculationsForSignalingNorm.All(c => c.HasOutput == hasOutput)); - Assert.IsTrue(assessmentSection.WaterLevelCalculationsForLowerLimitNorm.All(c => c.HasOutput == hasOutput)); + AssessmentSection assessmentSection = TestDataGenerator.GetAssessmentSectionWithAllCalculationConfigurations(); + + var mocks = new MockRepository(); + var observer = mocks.StrictMock(); + observer.Expect(o => o.UpdateObserver()).Repeat.Once(); + mocks.ReplayAll(); + + assessmentSection.WaterLevelCalculationsForLowerLimitNorm.ForEachElementDo(c => + { + c.Output = null; + c.Attach(observer); + }); + assessmentSection.FailureMechanismContribution.Attach(observer); + + var handler = new FailureMechanismContributionNormChangeHandler(assessmentSection); + + // When + var actionPerformed = false; + void Call() => handler.ChangeNorm(() => actionPerformed = true); + + // Then + TestHelper.AssertLogMessagesCount(Call, 0); + Assert.IsTrue(actionPerformed); + mocks.VerifyAll(); } } } \ No newline at end of file