Index: Riskeer/Common/test/Riskeer.Common.Forms.Test/Views/ScenariosViewTest.cs =================================================================== diff -u -r38fe4005808a683535285ad91b409561aa4a13be -r0da20a8ec5b382a649cf413a0de9c1e571e338a9 --- Riskeer/Common/test/Riskeer.Common.Forms.Test/Views/ScenariosViewTest.cs (.../ScenariosViewTest.cs) (revision 38fe4005808a683535285ad91b409561aa4a13be) +++ Riskeer/Common/test/Riskeer.Common.Forms.Test/Views/ScenariosViewTest.cs (.../ScenariosViewTest.cs) (revision 0da20a8ec5b382a649cf413a0de9c1e571e338a9) @@ -235,7 +235,6 @@ Assert.IsFalse(totalScenarioContributionLabel.Visible); } - [Test] public void Constructor_WithFailureMechanismSectionsAndWithoutRelevantCalculationScenarios_TotalContributionScenariosLabelCorrectlyInitialized() { @@ -249,15 +248,15 @@ new Point2D(5.0, 0.0) }) }); - + // Call ShowScenariosView(new CalculationGroup(), failureMechanism); // Assert var totalScenarioContributionLabel = (Label) new ControlTester("labelTotalScenarioContribution").TheObject; Assert.IsFalse(totalScenarioContributionLabel.Visible); } - + [Test] public void ScenariosView_ContributionValueInvalid_ShowsErrorTooltip() { @@ -585,7 +584,7 @@ // Then Assert.AreEqual($"De som van de bijdragen van de maatgevende scenario's voor dit vak is gelijk aan {newContribution:F2}%", totalScenarioContributionLabel.Text); - + Assert.AreEqual("De bijdragen van de maatgevende scenario's voor dit vak moeten opgeteld gelijk zijn aan 100%.", errorProvider.GetError(totalScenarioContributionLabel)); } Index: Riskeer/Piping/src/Riskeer.Piping.Forms/Views/PipingScenariosView.cs =================================================================== diff -u -r5447d74a2dd344fcde21e3e0b54069faa38153bd -r0da20a8ec5b382a649cf413a0de9c1e571e338a9 --- Riskeer/Piping/src/Riskeer.Piping.Forms/Views/PipingScenariosView.cs (.../PipingScenariosView.cs) (revision 5447d74a2dd344fcde21e3e0b54069faa38153bd) +++ Riskeer/Piping/src/Riskeer.Piping.Forms/Views/PipingScenariosView.cs (.../PipingScenariosView.cs) (revision 0da20a8ec5b382a649cf413a0de9c1e571e338a9) @@ -24,6 +24,7 @@ using System.Linq; using System.Windows.Forms; using Core.Common.Base; +using Core.Common.Base.Data; using Core.Common.Base.Geometry; using Core.Common.Controls.Views; using Core.Common.Util.Enums; @@ -111,6 +112,8 @@ UpdateSectionsListBox(); UpdateDataGridViewDataSource(); + UpdateTotalScenarioContributionLabel(); + UpdateVisibility(); } @@ -172,20 +175,24 @@ Observable = failureMechanism.ScenarioConfigurationsPerFailureMechanismSection }; - calculationGroupObserver = new RecursiveObserver(UpdateDataGridViewDataSource, pcg => pcg.Children) + calculationGroupObserver = new RecursiveObserver(UpdateScenarioControls, pcg => pcg.Children) { Observable = calculationGroup }; - calculationObserver = new RecursiveObserver>(UpdateScenarioRows, pcg => pcg.Children) + calculationObserver = new RecursiveObserver>(() => { + UpdateScenarioRows(); + UpdateTotalScenarioContributionLabel(); + }, pcg => pcg.Children) + { Observable = calculationGroup }; // The concat is needed to observe the input of calculations in child groups. - calculationInputObserver = new RecursiveObserver(UpdateDataGridViewDataSource, pcg => pcg.Children.Concat( - pcg.Children.OfType>() - .Select(c => c.InputParameters))) + calculationInputObserver = new RecursiveObserver(UpdateScenarioControls, pcg => pcg.Children.Concat( + pcg.Children.OfType>() + .Select(c => c.InputParameters))) { Observable = calculationGroup }; @@ -285,7 +292,13 @@ { selectedFailureMechanismSection = listBox.SelectedItem as PipingScenariosViewFailureMechanismSectionViewModel; UpdateRadioButtons(); + UpdateScenarioControls(); + } + + private void UpdateScenarioControls() + { UpdateDataGridViewDataSource(); + UpdateTotalScenarioContributionLabel(); } private void UpdateRadioButtons() @@ -368,5 +381,39 @@ UpdateDataGridViewDataSource(); checkedRadioButton = newCheckedRadioButton; } + + private void UpdateTotalScenarioContributionLabel() + { + ClearErrorMessage(); + + IEnumerable contributingScenarios = scenarioRows?.Where(r => r.IsRelevant); + if (contributingScenarios == null || !contributingScenarios.Any()) + { + labelTotalScenarioContribution.Visible = false; + return; + } + + labelTotalScenarioContribution.Visible = true; + + double totalScenarioContribution = contributingScenarios.Sum(r => r.Contribution); + var roundedTotalScenarioContribution = new RoundedDouble(2, totalScenarioContribution); + if (Math.Abs(totalScenarioContribution - 100) >= 1e-6) + { + SetErrorMessage(RiskeerCommonFormsResources.CalculationScenarios_Scenario_contribution_for_this_section_not_100); + } + + labelTotalScenarioContribution.Text = string.Format(RiskeerCommonFormsResources.ScenariosView_Total_contribution_of_relevant_scenarios_for_this_section_is_equal_to_total_scenario_contribution_0_, + roundedTotalScenarioContribution); + } + + private void SetErrorMessage(string errorMessage) + { + errorProvider.SetError(labelTotalScenarioContribution, errorMessage); + } + + private void ClearErrorMessage() + { + errorProvider.SetError(labelTotalScenarioContribution, string.Empty); + } } } \ No newline at end of file Index: Riskeer/Piping/test/Riskeer.Piping.Forms.Test/Views/PipingScenariosViewTest.cs =================================================================== diff -u -r5447d74a2dd344fcde21e3e0b54069faa38153bd -r0da20a8ec5b382a649cf413a0de9c1e571e338a9 --- Riskeer/Piping/test/Riskeer.Piping.Forms.Test/Views/PipingScenariosViewTest.cs (.../PipingScenariosViewTest.cs) (revision 5447d74a2dd344fcde21e3e0b54069faa38153bd) +++ Riskeer/Piping/test/Riskeer.Piping.Forms.Test/Views/PipingScenariosViewTest.cs (.../PipingScenariosViewTest.cs) (revision 0da20a8ec5b382a649cf413a0de9c1e571e338a9) @@ -20,6 +20,7 @@ // All rights reserved. using System; +using System.Drawing; using System.Globalization; using System.Linq; using System.Windows.Forms; @@ -339,6 +340,86 @@ } [Test] + [SetCulture("nl-NL")] + [TestCase(PipingScenarioConfigurationType.SemiProbabilistic, PipingScenarioConfigurationPerFailureMechanismSectionType.SemiProbabilistic)] + [TestCase(PipingScenarioConfigurationType.SemiProbabilistic, PipingScenarioConfigurationPerFailureMechanismSectionType.Probabilistic)] + [TestCase(PipingScenarioConfigurationType.Probabilistic, PipingScenarioConfigurationPerFailureMechanismSectionType.SemiProbabilistic)] + [TestCase(PipingScenarioConfigurationType.Probabilistic, PipingScenarioConfigurationPerFailureMechanismSectionType.Probabilistic)] + [TestCase(PipingScenarioConfigurationType.PerFailureMechanismSection, PipingScenarioConfigurationPerFailureMechanismSectionType.SemiProbabilistic)] + [TestCase(PipingScenarioConfigurationType.PerFailureMechanismSection, PipingScenarioConfigurationPerFailureMechanismSectionType.Probabilistic)] + public void Constructor_FailureMechanismWithSectionsAndWithVariousRelevantScenarios_TotalContributionScenariosCorrectlyInitialized(PipingScenarioConfigurationType scenarioConfigurationType, + PipingScenarioConfigurationPerFailureMechanismSectionType scenarioConfigurationPerFailureMechanismSectionType) + { + // Setup + var failureMechanism = new PipingFailureMechanism + { + ScenarioConfigurationType = scenarioConfigurationType + }; + ConfigureFailureMechanism(failureMechanism); + failureMechanism.ScenarioConfigurationsPerFailureMechanismSection.ForEachElementDo(sc => sc.ScenarioConfigurationType = scenarioConfigurationPerFailureMechanismSectionType); + + // Call + ShowPipingScenariosView(failureMechanism); + + // Assert + var totalScenarioContributionLabel = (Label) new ControlTester("labelTotalScenarioContribution").TheObject; + Assert.IsTrue(totalScenarioContributionLabel.Visible); + Assert.AreEqual(ContentAlignment.MiddleLeft, totalScenarioContributionLabel.TextAlign); + Assert.AreEqual("De som van de bijdragen van de maatgevende scenario's voor dit vak is gelijk aan 51,20%", + totalScenarioContributionLabel.Text); + } + + [Test] + [TestCase(PipingScenarioConfigurationType.SemiProbabilistic)] + [TestCase(PipingScenarioConfigurationType.Probabilistic)] + [TestCase(PipingScenarioConfigurationType.PerFailureMechanismSection)] + public void Constructor_FailureMechanismWithoutSectionsAndCalculationScenarios_TotalContributionScenariosLabelCorrectlyInitialized( + PipingScenarioConfigurationType scenarioConfigurationType) + { + // Setup + var failureMechanism = new PipingFailureMechanism + { + ScenarioConfigurationType = scenarioConfigurationType + }; + + // Call + ShowPipingScenariosView(failureMechanism); + + // Assert + var totalScenarioContributionLabel = (Label) new ControlTester("labelTotalScenarioContribution").TheObject; + Assert.IsFalse(totalScenarioContributionLabel.Visible); + } + + [Test] + [TestCase(PipingScenarioConfigurationType.SemiProbabilistic)] + [TestCase(PipingScenarioConfigurationType.Probabilistic)] + [TestCase(PipingScenarioConfigurationType.PerFailureMechanismSection)] + public void Constructor_FailureMechanismWithSectionsAndWithoutCalculationScenarios_TotalContributionScenariosLabelCorrectlyInitialized( + PipingScenarioConfigurationType scenarioConfigurationType) + { + // Setup + var failureMechanism = new PipingFailureMechanism + { + ScenarioConfigurationType = scenarioConfigurationType + }; + FailureMechanismTestHelper.SetSections(failureMechanism, new[] + { + new FailureMechanismSection("Section 1", new[] + { + new Point2D(0.0, 0.0), + new Point2D(5.0, 0.0) + }) + }); + + // Call + ShowPipingScenariosView(failureMechanism); + + // Assert + var totalScenarioContributionLabel = (Label) new ControlTester("labelTotalScenarioContribution").TheObject; + Assert.IsFalse(totalScenarioContributionLabel.Visible); + } + + [Test] public void PipingScenarioView_SemiProbabilisticCalculationsWithAllDataSet_DataGridViewCorrectlyInitialized() { // Call @@ -348,12 +429,12 @@ // Assert DataGridViewRowCollection rows = dataGridView.Rows; - Assert.AreEqual(2, rows.Count); + Assert.AreEqual(3, rows.Count); DataGridViewCellCollection cells = rows[0].Cells; Assert.AreEqual(8, cells.Count); Assert.IsTrue(Convert.ToBoolean(cells[isRelevantColumnIndex].FormattedValue)); - Assert.AreEqual(new RoundedDouble(2, 100).ToString(), cells[contributionColumnIndex].FormattedValue); + Assert.AreEqual(new RoundedDouble(2, 13.701).ToString(), cells[contributionColumnIndex].FormattedValue); Assert.AreEqual("Calculation 1", cells[nameColumnIndex].FormattedValue); Assert.AreEqual("-".ToString(CultureInfo.CurrentCulture), cells[failureProbabilityUpliftColumnIndex].FormattedValue); Assert.AreEqual("-".ToString(CultureInfo.CurrentCulture), cells[failureProbabilityHeaveColumnIndex].FormattedValue); @@ -363,9 +444,20 @@ cells = rows[1].Cells; Assert.AreEqual(8, cells.Count); - Assert.IsTrue(Convert.ToBoolean(cells[isRelevantColumnIndex].FormattedValue)); + Assert.IsFalse(Convert.ToBoolean(cells[isRelevantColumnIndex].FormattedValue)); Assert.AreEqual(new RoundedDouble(2, 100).ToString(), cells[contributionColumnIndex].FormattedValue); Assert.AreEqual("Calculation 2", cells[nameColumnIndex].FormattedValue); + Assert.AreEqual("-".ToString(CultureInfo.CurrentCulture), cells[failureProbabilityUpliftColumnIndex].FormattedValue); + Assert.AreEqual("-".ToString(CultureInfo.CurrentCulture), cells[failureProbabilityHeaveColumnIndex].FormattedValue); + Assert.AreEqual("-".ToString(CultureInfo.CurrentCulture), cells[failureProbabilitySellmeijerColumnIndex].FormattedValue); + Assert.AreEqual("-", cells[failureProbabilityPipingColumnIndex].FormattedValue); + Assert.AreEqual("-", cells[sectionFailureProbabilityPipingColumnIndex].FormattedValue); + + cells = rows[2].Cells; + Assert.AreEqual(8, cells.Count); + Assert.IsTrue(Convert.ToBoolean(cells[isRelevantColumnIndex].FormattedValue)); + Assert.AreEqual(new RoundedDouble(2, 37.503).ToString(), cells[contributionColumnIndex].FormattedValue); + Assert.AreEqual("Calculation 3", cells[nameColumnIndex].FormattedValue); Assert.AreEqual(ProbabilityFormattingHelper.Format(2.425418e-4), cells[failureProbabilityUpliftColumnIndex].FormattedValue); Assert.AreEqual(ProbabilityFormattingHelper.Format(0.038461838), cells[failureProbabilityHeaveColumnIndex].FormattedValue); Assert.AreEqual(ProbabilityFormattingHelper.Format(0.027777778), cells[failureProbabilitySellmeijerColumnIndex].FormattedValue); @@ -389,13 +481,13 @@ // Assert DataGridViewRowCollection rows = dataGridView.Rows; - Assert.AreEqual(2, rows.Count); + Assert.AreEqual(3, rows.Count); DataGridViewCellCollection cells = rows[0].Cells; Assert.AreEqual(8, cells.Count); Assert.IsTrue(Convert.ToBoolean(cells[isRelevantColumnIndex].FormattedValue)); - Assert.AreEqual(new RoundedDouble(2, 100).ToString(), cells[contributionColumnIndex].FormattedValue); - Assert.AreEqual("Calculation 3", cells[nameColumnIndex].FormattedValue); + Assert.AreEqual(new RoundedDouble(2, 13.701).ToString(), cells[contributionColumnIndex].FormattedValue); + Assert.AreEqual("Calculation 4", cells[nameColumnIndex].FormattedValue); Assert.AreEqual(null, cells[failureProbabilityUpliftColumnIndex].Value); Assert.AreEqual(null, cells[failureProbabilityHeaveColumnIndex].Value); Assert.AreEqual(null, cells[failureProbabilitySellmeijerColumnIndex].Value); @@ -404,12 +496,23 @@ cells = rows[1].Cells; Assert.AreEqual(8, cells.Count); - Assert.IsTrue(Convert.ToBoolean(cells[isRelevantColumnIndex].FormattedValue)); + Assert.IsFalse(Convert.ToBoolean(cells[isRelevantColumnIndex].FormattedValue)); Assert.AreEqual(new RoundedDouble(2, 100).ToString(), cells[contributionColumnIndex].FormattedValue); - Assert.AreEqual("Calculation 4", cells[nameColumnIndex].FormattedValue); + Assert.AreEqual("Calculation 5", cells[nameColumnIndex].FormattedValue); Assert.AreEqual(null, cells[failureProbabilityUpliftColumnIndex].Value); Assert.AreEqual(null, cells[failureProbabilityHeaveColumnIndex].Value); Assert.AreEqual(null, cells[failureProbabilitySellmeijerColumnIndex].Value); + Assert.AreEqual("-", cells[failureProbabilityPipingColumnIndex].FormattedValue); + Assert.AreEqual("-", cells[sectionFailureProbabilityPipingColumnIndex].FormattedValue); + + cells = rows[2].Cells; + Assert.AreEqual(8, cells.Count); + Assert.IsTrue(Convert.ToBoolean(cells[isRelevantColumnIndex].FormattedValue)); + Assert.AreEqual(new RoundedDouble(2, 37.503).ToString(), cells[contributionColumnIndex].FormattedValue); + Assert.AreEqual("Calculation 6", cells[nameColumnIndex].FormattedValue); + Assert.AreEqual(null, cells[failureProbabilityUpliftColumnIndex].Value); + Assert.AreEqual(null, cells[failureProbabilityHeaveColumnIndex].Value); + Assert.AreEqual(null, cells[failureProbabilitySellmeijerColumnIndex].Value); Assert.AreEqual(ProbabilityFormattingHelper.Format(0.25), cells[failureProbabilityPipingColumnIndex].FormattedValue); Assert.AreEqual(ProbabilityFormattingHelper.Format(0.25), cells[sectionFailureProbabilityPipingColumnIndex].FormattedValue); } @@ -984,8 +1087,405 @@ CollectionAssert.AreNotEquivalent(sectionResultRows, updatedRows); } - private void ConfigureFailureMechanism(PipingFailureMechanism failureMechanism) + [Test] + [SetCulture("nl-NL")] + [TestCase(PipingScenarioConfigurationType.SemiProbabilistic)] + [TestCase(PipingScenarioConfigurationType.Probabilistic)] + public void GivenPipingScenariosViewWithTotalContributionsNotValid_WhenEditingScenarioContributionToValidValue_ThenTotalContributionLabelUpdatedAndErrorNotShown( + PipingScenarioConfigurationType configurationType) { + // Given + var failureMechanism = new PipingFailureMechanism + { + ScenarioConfigurationType = configurationType + }; + ConfigureFailureMechanism(failureMechanism); + + CalculationGroup calculationGroup = failureMechanism.CalculationsGroup; + calculationGroup.Children.Clear(); + calculationGroup.Children.AddRange(new IPipingCalculationScenario[] + { + new SemiProbabilisticPipingCalculationScenario + { + InputParameters = + { + SurfaceLine = failureMechanism.SurfaceLines.First() + }, + Contribution = (RoundedDouble) 0.5011 + }, + new SemiProbabilisticPipingCalculationScenario + { + InputParameters = + { + SurfaceLine = failureMechanism.SurfaceLines.First() + }, + Contribution = (RoundedDouble) 0.75 + }, + new ProbabilisticPipingCalculationScenario + { + InputParameters = + { + SurfaceLine = failureMechanism.SurfaceLines.First() + }, + Contribution = (RoundedDouble) 0.5011 + }, + new ProbabilisticPipingCalculationScenario + { + InputParameters = + { + SurfaceLine = failureMechanism.SurfaceLines.First() + }, + Contribution = (RoundedDouble) 0.75 + } + }); + + PipingScenariosView view = ShowPipingScenariosView(failureMechanism); + + // Precondition + var totalScenarioContributionLabel = (Label) new ControlTester("labelTotalScenarioContribution").TheObject; + Assert.AreEqual("De som van de bijdragen van de maatgevende scenario's voor dit vak is gelijk aan 125,11%", + totalScenarioContributionLabel.Text); + + ErrorProvider errorProvider = GetErrorProvider(view); + Assert.AreEqual("De bijdragen van de maatgevende scenario's voor dit vak moeten opgeteld gelijk zijn aan 100%.", + errorProvider.GetError(totalScenarioContributionLabel)); + + // When + var dataGridView = (DataGridView) new ControlTester("dataGridView").TheObject; + dataGridView.Rows[0].Cells[contributionColumnIndex].Value = (RoundedDouble) 25; + + // Then + Assert.AreEqual("De som van de bijdragen van de maatgevende scenario's voor dit vak is gelijk aan 100,00%", + totalScenarioContributionLabel.Text); + Assert.IsEmpty(errorProvider.GetError(totalScenarioContributionLabel)); + } + + [Test] + [SetCulture("nl-NL")] + [Combinatorial] + public void GivenPipingScenariosViewWithTotalContributionsValid_WhenEditingScenarioContributionsToInvalidValue_ThenTotalContributionLabelUpdatedAndErrorShown( + [Values(25.01, 24.99, 50)] double newContribution, + [Values(PipingScenarioConfigurationType.SemiProbabilistic, PipingScenarioConfigurationType.Probabilistic)] + PipingScenarioConfigurationType configurationType) + { + // Given + var failureMechanism = new PipingFailureMechanism + { + ScenarioConfigurationType = configurationType + }; + ConfigureFailureMechanism(failureMechanism); + + CalculationGroup calculationGroup = failureMechanism.CalculationsGroup; + calculationGroup.Children.Clear(); + calculationGroup.Children.AddRange(new IPipingCalculationScenario[] + { + new SemiProbabilisticPipingCalculationScenario + { + InputParameters = + { + SurfaceLine = failureMechanism.SurfaceLines.First() + }, + Contribution = (RoundedDouble) 0.25 + }, + new SemiProbabilisticPipingCalculationScenario + { + InputParameters = + { + SurfaceLine = failureMechanism.SurfaceLines.First() + }, + Contribution = (RoundedDouble) 0.75 + }, + new ProbabilisticPipingCalculationScenario + { + InputParameters = + { + SurfaceLine = failureMechanism.SurfaceLines.First() + }, + Contribution = (RoundedDouble) 0.25 + }, + new ProbabilisticPipingCalculationScenario + { + InputParameters = + { + SurfaceLine = failureMechanism.SurfaceLines.First() + }, + Contribution = (RoundedDouble) 0.75 + } + }); + + PipingScenariosView view = ShowPipingScenariosView(failureMechanism); + + // Precondition + var totalScenarioContributionLabel = (Label) new ControlTester("labelTotalScenarioContribution").TheObject; + Assert.AreEqual("De som van de bijdragen van de maatgevende scenario's voor dit vak is gelijk aan 100,00%", + totalScenarioContributionLabel.Text); + + ErrorProvider errorProvider = GetErrorProvider(view); + Assert.IsEmpty(errorProvider.GetError(totalScenarioContributionLabel)); + + // When + var dataGridView = (DataGridView) new ControlTester("dataGridView").TheObject; + dataGridView.Rows[0].Cells[contributionColumnIndex].Value = (RoundedDouble) newContribution; + + // Then + Assert.AreEqual($"De som van de bijdragen van de maatgevende scenario's voor dit vak is gelijk aan {newContribution + 75:F2}%", + totalScenarioContributionLabel.Text); + + Assert.AreEqual("De bijdragen van de maatgevende scenario's voor dit vak moeten opgeteld gelijk zijn aan 100%.", + errorProvider.GetError(totalScenarioContributionLabel)); + } + + [Test] + [SetCulture("nl-NL")] + [TestCase(PipingScenarioConfigurationType.SemiProbabilistic)] + [TestCase(PipingScenarioConfigurationType.Probabilistic)] + public void GivenPipingScenariosViewWithoutContributingScenarios_WhenMakingScenarioRelevant_ThenTotalContributionLabelUpdatedAndShown( + PipingScenarioConfigurationType configurationType) + { + // Given + var failureMechanism = new PipingFailureMechanism + { + ScenarioConfigurationType = configurationType + }; + ConfigureFailureMechanism(failureMechanism); + + CalculationGroup calculationGroup = failureMechanism.CalculationsGroup; + calculationGroup.Children.Clear(); + calculationGroup.Children.AddRange(new IPipingCalculationScenario[] + { + new SemiProbabilisticPipingCalculationScenario + { + InputParameters = + { + SurfaceLine = failureMechanism.SurfaceLines.First() + }, + IsRelevant = false + }, + new ProbabilisticPipingCalculationScenario + { + InputParameters = + { + SurfaceLine = failureMechanism.SurfaceLines.First() + }, + IsRelevant = false + } + }); + + ShowPipingScenariosView(failureMechanism); + + // Precondition + var totalScenarioContributionLabel = (Label) new ControlTester("labelTotalScenarioContribution").TheObject; + Assert.IsFalse(totalScenarioContributionLabel.Visible); + + // When + var dataGridView = (DataGridView) new ControlTester("dataGridView").TheObject; + dataGridView.Rows[0].Cells[isRelevantColumnIndex].Value = true; + + // Then + Assert.IsTrue(totalScenarioContributionLabel.Visible); + + Assert.AreEqual("De som van de bijdragen van de maatgevende scenario's voor dit vak is gelijk aan 100,00%", + totalScenarioContributionLabel.Text); + } + + [Test] + [TestCase(PipingScenarioConfigurationType.SemiProbabilistic)] + [TestCase(PipingScenarioConfigurationType.Probabilistic)] + public void GivenPipingScenariosViewWithContributingScenarios_WhenMakingContributingScenarioIrrelevant_ThenTotalContributionLabelNotVisible( + PipingScenarioConfigurationType configurationType) + { + // Given + var failureMechanism = new PipingFailureMechanism + { + ScenarioConfigurationType = configurationType + }; + ConfigureFailureMechanism(failureMechanism); + + CalculationGroup calculationGroup = failureMechanism.CalculationsGroup; + calculationGroup.Children.Clear(); + calculationGroup.Children.AddRange(new IPipingCalculationScenario[] + { + new SemiProbabilisticPipingCalculationScenario + { + InputParameters = + { + SurfaceLine = failureMechanism.SurfaceLines.First() + } + }, + new ProbabilisticPipingCalculationScenario + { + InputParameters = + { + SurfaceLine = failureMechanism.SurfaceLines.First() + } + } + }); + + ShowPipingScenariosView(failureMechanism); + + // Precondition + var totalScenarioContributionLabel = (Label) new ControlTester("labelTotalScenarioContribution").TheObject; + Assert.IsTrue(totalScenarioContributionLabel.Visible); + + // When + var dataGridView = (DataGridView) new ControlTester("dataGridView").TheObject; + dataGridView.Rows[0].Cells[isRelevantColumnIndex].Value = false; + + // Then + Assert.IsFalse(totalScenarioContributionLabel.Visible); + } + + [Test] + [SetCulture("nl-NL")] + [TestCase(PipingScenarioConfigurationType.SemiProbabilistic)] + [TestCase(PipingScenarioConfigurationType.Probabilistic)] + public void GivenPipingScenariosViewWithoutScenarios_WhenAddingRelevantScenarioAndCalculationGroupNotifiesObservers_ThenTotalContributionLabelUpdatedAndShown( + PipingScenarioConfigurationType configurationType) + { + // Given + var failureMechanism = new PipingFailureMechanism + { + ScenarioConfigurationType = configurationType + }; + ConfigureFailureMechanism(failureMechanism); + failureMechanism.CalculationsGroup.Children.Clear(); + + ShowPipingScenariosView(failureMechanism); + + // Precondition + var totalScenarioContributionLabel = (Label) new ControlTester("labelTotalScenarioContribution").TheObject; + Assert.IsFalse(totalScenarioContributionLabel.Visible); + + // When + IPipingCalculationScenario calculationToAdd = + configurationType == PipingScenarioConfigurationType.SemiProbabilistic + ? (IPipingCalculationScenario) new SemiProbabilisticPipingCalculationScenario + { + InputParameters = + { + SurfaceLine = failureMechanism.SurfaceLines.First() + } + } + : new ProbabilisticPipingCalculationScenario + { + InputParameters = + { + SurfaceLine = failureMechanism.SurfaceLines.First() + } + }; + + CalculationGroup calculationGroup = failureMechanism.CalculationsGroup; + calculationGroup.Children.Add(calculationToAdd); + calculationGroup.NotifyObservers(); + + // Then + Assert.IsTrue(totalScenarioContributionLabel.Visible); + + Assert.AreEqual("De som van de bijdragen van de maatgevende scenario's voor dit vak is gelijk aan 100,00%", + totalScenarioContributionLabel.Text); + } + + [Test] + [TestCase(PipingScenarioConfigurationType.SemiProbabilistic)] + [TestCase(PipingScenarioConfigurationType.Probabilistic)] + public void GivenPipingScenariosViewWithScenarios_WhenCalculationsGroupClearedAndCalculationGroupNotifiesObservers_ThenTotalContributionLabelNotVisible( + PipingScenarioConfigurationType configurationType) + { + // Given + var failureMechanism = new PipingFailureMechanism + { + ScenarioConfigurationType = configurationType + }; + ConfigureFailureMechanism(failureMechanism); + + CalculationGroup calculationGroup = failureMechanism.CalculationsGroup; + calculationGroup.Children.Clear(); + calculationGroup.Children.AddRange(new IPipingCalculationScenario[] + { + new SemiProbabilisticPipingCalculationScenario + { + InputParameters = + { + SurfaceLine = failureMechanism.SurfaceLines.First() + } + }, + new ProbabilisticPipingCalculationScenario + { + InputParameters = + { + SurfaceLine = failureMechanism.SurfaceLines.First() + } + } + }); + + ShowPipingScenariosView(failureMechanism); + + // Precondition + var totalScenarioContributionLabel = (Label) new ControlTester("labelTotalScenarioContribution").TheObject; + Assert.IsTrue(totalScenarioContributionLabel.Visible); + + // When + calculationGroup.Children.Clear(); + calculationGroup.NotifyObservers(); + + // Then + Assert.IsFalse(totalScenarioContributionLabel.Visible); + } + + [Test] + [TestCase(PipingScenarioConfigurationType.SemiProbabilistic)] + [TestCase(PipingScenarioConfigurationType.Probabilistic)] + public void GivenPipingScenariosViewWithScenarios_WhenScenariosClearedAndFailureMechanismNotifiesObserver_ThenTotalContributionLabelNotVisible( + PipingScenarioConfigurationType configurationType) + { + // Given + var failureMechanism = new PipingFailureMechanism + { + ScenarioConfigurationType = configurationType + }; + ConfigureFailureMechanism(failureMechanism); + + CalculationGroup calculationGroup = failureMechanism.CalculationsGroup; + calculationGroup.Children.Clear(); + calculationGroup.Children.AddRange(new IPipingCalculationScenario[] + { + new SemiProbabilisticPipingCalculationScenario + { + InputParameters = + { + SurfaceLine = failureMechanism.SurfaceLines.First() + } + }, + new ProbabilisticPipingCalculationScenario + { + InputParameters = + { + SurfaceLine = failureMechanism.SurfaceLines.First() + } + } + }); + + ShowPipingScenariosView(failureMechanism); + + // Precondition + var totalScenarioContributionLabel = (Label) new ControlTester("labelTotalScenarioContribution").TheObject; + Assert.IsTrue(totalScenarioContributionLabel.Visible); + + // When + calculationGroup.Children.Clear(); + failureMechanism.NotifyObservers(); + + // Then + Assert.IsFalse(totalScenarioContributionLabel.Visible); + } + + private static ErrorProvider GetErrorProvider(PipingScenariosView view) + { + return TypeUtils.GetField(view, "errorProvider"); + } + + private static void ConfigureFailureMechanism(PipingFailureMechanism failureMechanism) + { var surfaceLine1 = new PipingSurfaceLine("Surface line 1") { ReferenceLineIntersectionWorldPoint = new Point2D(0.0, 0.0) @@ -1010,6 +1510,12 @@ new Point3D(5.0, -5.0, 0.0) }); + failureMechanism.SurfaceLines.AddRange(new[] + { + surfaceLine1, + surfaceLine2 + }, "Path"); + FailureMechanismTestHelper.SetSections(failureMechanism, new[] { new FailureMechanismSection("Section 1", new[] @@ -1042,7 +1548,8 @@ }, EntryPointL = (RoundedDouble) 3.3333, ExitPointL = (RoundedDouble) 4.4444 - } + }, + Contribution = (RoundedDouble) 0.13701 }, new SemiProbabilisticPipingCalculationScenario { @@ -1061,13 +1568,33 @@ EntryPointL = (RoundedDouble) 7.7777, ExitPointL = (RoundedDouble) 8.8888 }, - Output = PipingTestDataGenerator.GetSemiProbabilisticPipingOutput(0.26065, 0.81398, 0.38024) + IsRelevant = false }, - new ProbabilisticPipingCalculationScenario + new SemiProbabilisticPipingCalculationScenario { Name = "Calculation 3", InputParameters = { + SurfaceLine = surfaceLine2, + DampingFactorExit = + { + Mean = (RoundedDouble) 5.5555 + }, + PhreaticLevelExit = + { + Mean = (RoundedDouble) 6.6666 + }, + EntryPointL = (RoundedDouble) 7.7777, + ExitPointL = (RoundedDouble) 8.8888 + }, + Output = PipingTestDataGenerator.GetSemiProbabilisticPipingOutput(0.26065, 0.81398, 0.38024), + Contribution = (RoundedDouble) 0.37503 + }, + new ProbabilisticPipingCalculationScenario + { + Name = "Calculation 4", + InputParameters = + { SurfaceLine = surfaceLine1, DampingFactorExit = { @@ -1079,13 +1606,33 @@ }, EntryPointL = (RoundedDouble) 3.3333, ExitPointL = (RoundedDouble) 4.4444 - } + }, + Contribution = (RoundedDouble) 0.13701 }, new ProbabilisticPipingCalculationScenario { - Name = "Calculation 4", + Name = "Calculation 5", InputParameters = { + SurfaceLine = surfaceLine1, + DampingFactorExit = + { + Mean = (RoundedDouble) 1.1111 + }, + PhreaticLevelExit = + { + Mean = (RoundedDouble) 2.2222 + }, + EntryPointL = (RoundedDouble) 3.3333, + ExitPointL = (RoundedDouble) 4.4444 + }, + IsRelevant = false + }, + new ProbabilisticPipingCalculationScenario + { + Name = "Calculation 6", + InputParameters = + { SurfaceLine = surfaceLine2, DampingFactorExit = { @@ -1098,7 +1645,8 @@ EntryPointL = (RoundedDouble) 7.7777, ExitPointL = (RoundedDouble) 8.8888 }, - Output = PipingTestDataGenerator.GetRandomProbabilisticPipingOutputWithoutIllustrationPoints() + Output = PipingTestDataGenerator.GetRandomProbabilisticPipingOutputWithoutIllustrationPoints(), + Contribution = (RoundedDouble) 0.37503 } }); }