public void ChangeNormativeProbability_WithAction_ConfirmationRequired()
        {
            // Setup
            var title   = "";
            var message = "";

            DialogBoxHandler = (name, wnd) =>
            {
                var tester = new MessageBoxTester(wnd);
                title   = tester.Title;
                message = tester.Text;

                tester.ClickCancel();
            };

            var mocks             = new MockRepository();
            var assessmentSection = mocks.Stub <IAssessmentSection>();

            mocks.ReplayAll();

            var handler = new FailureMechanismContributionNormChangeHandler(assessmentSection);

            // Call
            handler.ChangeNormativeProbability(() => {});

            // Assert
            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 handmatige waterstand verwijderd."
                                     + Environment.NewLine
                                     + Environment.NewLine
                                     + "Weet u zeker dat u wilt doorgaan?";

            Assert.AreEqual(expectedMessage, message);
            mocks.VerifyAll();
        }
        public void ChangeNormativeProbability_ActionNull_ThrowsArgumentNullException()
        {
            // Setup
            var mocks             = new MockRepository();
            var assessmentSection = mocks.Stub <IAssessmentSection>();

            mocks.ReplayAll();

            var handler = new FailureMechanismContributionNormChangeHandler(assessmentSection);

            // Call
            void Call() => handler.ChangeNormativeProbability(null);

            // Assert
            var exception = Assert.Throws <ArgumentNullException>(Call);

            Assert.AreEqual("action", exception.ParamName);
            mocks.VerifyAll();
        }
        public void GivenCalculationsWithoutOutput_WhenChangingNormativeProbability_ThenActionPerformedAndContributionNotified(
            NormativeProbabilityType normativeProbabilityType, Func <AssessmentSection, IEnumerable <HydraulicBoundaryLocationCalculation> > getLocationCalculationsFunc,
            WaveConditionsInputWaterLevelType waterLevelType)
        {
            // Given
            DialogBoxHandler = (name, wnd) =>
            {
                var tester = new MessageBoxTester(wnd);
                tester.ClickOk();
            };

            AssessmentSection assessmentSection = TestDataGenerator.GetAssessmentSectionWithAllCalculationConfigurations();

            assessmentSection.FailureMechanismContribution.NormativeProbabilityType = normativeProbabilityType;

            IEnumerable <HydraulicBoundaryLocationCalculation> calculationsBelongingToNorm = getLocationCalculationsFunc(assessmentSection);

            var waveConditionsCalculations = new List <ICalculation <WaveConditionsInput> >();

            waveConditionsCalculations.AddRange(assessmentSection.GrassCoverErosionOutwards.Calculations
                                                .Cast <GrassCoverErosionOutwardsWaveConditionsCalculation>());
            waveConditionsCalculations.AddRange(assessmentSection.StabilityStoneCover.Calculations
                                                .Cast <StabilityStoneCoverWaveConditionsCalculation>());
            waveConditionsCalculations.AddRange(assessmentSection.WaveImpactAsphaltCover.Calculations
                                                .Cast <WaveImpactAsphaltCoverWaveConditionsCalculation>());

            waveConditionsCalculations.ForEachElementDo(c => c.InputParameters.WaterLevelType = waterLevelType);

            var calculations = new List <ICalculation>();

            calculations.AddRange(assessmentSection.Piping.Calculations
                                  .OfType <SemiProbabilisticPipingCalculationScenario>()
                                  .Where(c => c.HasOutput && !c.InputParameters.UseAssessmentLevelManualInput));
            calculations.AddRange(assessmentSection.MacroStabilityInwards.Calculations
                                  .OfType <MacroStabilityInwardsCalculationScenario>()
                                  .Where(c => c.HasOutput && !c.InputParameters.UseAssessmentLevelManualInput));
            calculations.AddRange(waveConditionsCalculations);

            var mocks    = new MockRepository();
            var observer = mocks.StrictMock <IObserver>();

            observer.Expect(o => o.UpdateObserver()).Repeat.Once();
            mocks.ReplayAll();

            calculations.ForEachElementDo(c =>
            {
                c.ClearOutput();
                c.Attach(observer);
            });
            calculationsBelongingToNorm.ForEachElementDo(c =>
            {
                c.Output = null;
                c.Attach(observer);
            });
            assessmentSection.FailureMechanismContribution.Attach(observer);

            var handler = new FailureMechanismContributionNormChangeHandler(assessmentSection);

            // When
            var actionPerformed = false;

            void Call() => handler.ChangeNormativeProbability(() => actionPerformed = true);

            // Then
            TestHelper.AssertLogMessagesCount(Call, 0);
            Assert.IsTrue(actionPerformed);
            mocks.VerifyAll();
        }
        public void GivenCalculationsWithOutput_WhenChangingNormativeProbability_ThenAllDependingOutputClearedAndActionPerformedAndAllAffectedObjectsNotified(
            NormativeProbabilityType normativeProbabilityType, Func <AssessmentSection, IEnumerable <HydraulicBoundaryLocationCalculation> > getLocationCalculationsFunc,
            WaveConditionsInputWaterLevelType waterLevelType)
        {
            // Given
            DialogBoxHandler = (name, wnd) =>
            {
                var tester = new MessageBoxTester(wnd);
                tester.ClickOk();
            };

            AssessmentSection assessmentSection = TestDataGenerator.GetAssessmentSectionWithAllCalculationConfigurations();

            assessmentSection.FailureMechanismContribution.NormativeProbabilityType = normativeProbabilityType;

            IEnumerable <HydraulicBoundaryLocationCalculation> expectedLocationCalculationsToClear = getLocationCalculationsFunc(assessmentSection);

            var waveConditionsCalculations = new List <ICalculation <WaveConditionsInput> >();

            waveConditionsCalculations.AddRange(assessmentSection.GrassCoverErosionOutwards.Calculations
                                                .Cast <GrassCoverErosionOutwardsWaveConditionsCalculation>()
                                                .Where(c => c.HasOutput));
            waveConditionsCalculations.AddRange(assessmentSection.StabilityStoneCover.Calculations
                                                .Cast <StabilityStoneCoverWaveConditionsCalculation>()
                                                .Where(c => c.HasOutput));
            waveConditionsCalculations.AddRange(assessmentSection.WaveImpactAsphaltCover.Calculations
                                                .Cast <WaveImpactAsphaltCoverWaveConditionsCalculation>()
                                                .Where(c => c.HasOutput));

            waveConditionsCalculations.ForEachElementDo(c => c.InputParameters.WaterLevelType = waterLevelType);

            var expectedAffectedSemiProbabilisticCalculations = new List <ICalculation>();

            expectedAffectedSemiProbabilisticCalculations.AddRange(assessmentSection.Piping.Calculations
                                                                   .OfType <SemiProbabilisticPipingCalculationScenario>()
                                                                   .Where(c => c.HasOutput && !c.InputParameters.UseAssessmentLevelManualInput));
            expectedAffectedSemiProbabilisticCalculations.AddRange(assessmentSection.MacroStabilityInwards.Calculations
                                                                   .OfType <MacroStabilityInwardsCalculationScenario>()
                                                                   .Where(c => c.HasOutput && !c.InputParameters.UseAssessmentLevelManualInput));

            IEnumerable <IObservable> expectedAffectedObjects =
                expectedAffectedSemiProbabilisticCalculations.Concat(new IObservable[]
            {
                assessmentSection.FailureMechanismContribution
            })
                .Concat(expectedLocationCalculationsToClear)
                .Concat(waveConditionsCalculations)
                .ToArray();

            var mocks    = new MockRepository();
            var observer = mocks.StrictMock <IObserver>();

            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(expectedAffectedSemiProbabilisticCalculations.Where(c => c.HasOutput));
            CollectionAssert.IsNotEmpty(expectedLocationCalculationsToClear.Where(c => c.HasOutput));
            CollectionAssert.IsNotEmpty(waveConditionsCalculations.Where(c => c.HasOutput));

            // When
            var actionPerformed = false;

            void Call() => handler.ChangeNormativeProbability(() => actionPerformed = true);

            // Then
            var expectedMessages = new[]
            {
                "Alle berekende hydraulische belastingen behorende bij de gewijzigde norm zijn verwijderd.",
                $"De resultaten van {expectedAffectedSemiProbabilisticCalculations.Count} semi-probabilistische berekeningen zonder handmatige waterstand zijn verwijderd."
            };

            TestHelper.AssertLogMessagesAreGenerated(Call, expectedMessages, 2);

            Assert.IsTrue(actionPerformed);
            CollectionAssert.IsEmpty(expectedAffectedSemiProbabilisticCalculations.Where(c => c.HasOutput));
            CollectionAssert.IsEmpty(expectedLocationCalculationsToClear.Where(c => c.HasOutput));
            CollectionAssert.IsEmpty(waveConditionsCalculations.Where(c => c.HasOutput));
            mocks.VerifyAll();
        }