Index: Ringtoets/Common/src/Ringtoets.Common.Data/Calculation/CalculationScenarioStatus.cs =================================================================== diff -u --- Ringtoets/Common/src/Ringtoets.Common.Data/Calculation/CalculationScenarioStatus.cs (revision 0) +++ Ringtoets/Common/src/Ringtoets.Common.Data/Calculation/CalculationScenarioStatus.cs (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -0,0 +1,44 @@ +// Copyright (C) Stichting Deltares 2016. All rights reserved. +// +// This file is part of Ringtoets. +// +// Ringtoets 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. + +namespace Ringtoets.Common.Data.Calculation +{ + /// + /// Status of a . + /// + public enum CalculationScenarioStatus + { + /// + /// Value which is returned when a calculation is failed. + /// + Failed, + + /// + /// Value which is returned when a calculation is succesfully done. + /// + Done, + + /// + /// Value which is returned when a scenario is not calculated. + /// + NotCalculated + } +} \ No newline at end of file Index: Ringtoets/Common/src/Ringtoets.Common.Data/Calculation/ICalculationBase.cs =================================================================== diff -u -r887b289acf19a81f62d78f371ab70c3f82812b95 -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/Common/src/Ringtoets.Common.Data/Calculation/ICalculationBase.cs (.../ICalculationBase.cs) (revision 887b289acf19a81f62d78f371ab70c3f82812b95) +++ Ringtoets/Common/src/Ringtoets.Common.Data/Calculation/ICalculationBase.cs (.../ICalculationBase.cs) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -31,6 +31,6 @@ /// /// Gets the name of this calculation object. /// - string Name { get; set; } + string Name { get; } } } \ No newline at end of file Index: Ringtoets/Common/src/Ringtoets.Common.Data/Calculation/ICalculationInput.cs =================================================================== diff -u -r4af59f05cb6ced6464d51c8dff8cb0b8bfca8edd -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/Common/src/Ringtoets.Common.Data/Calculation/ICalculationInput.cs (.../ICalculationInput.cs) (revision 4af59f05cb6ced6464d51c8dff8cb0b8bfca8edd) +++ Ringtoets/Common/src/Ringtoets.Common.Data/Calculation/ICalculationInput.cs (.../ICalculationInput.cs) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -24,7 +24,7 @@ namespace Ringtoets.Common.Data.Calculation { /// - /// A calculation input related item. + /// Interface describing an object that is the input to a . /// public interface ICalculationInput : IObservable {} } \ No newline at end of file Index: Ringtoets/Common/src/Ringtoets.Common.Data/Calculation/ICalculationScenario.cs =================================================================== diff -u -r8c60e937f4b8009fea80f3702879e100fe03b63f -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/Common/src/Ringtoets.Common.Data/Calculation/ICalculationScenario.cs (.../ICalculationScenario.cs) (revision 8c60e937f4b8009fea80f3702879e100fe03b63f) +++ Ringtoets/Common/src/Ringtoets.Common.Data/Calculation/ICalculationScenario.cs (.../ICalculationScenario.cs) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -41,6 +41,11 @@ /// /// Gets the probability of the scenario. /// - RoundedDouble? Probability { get; } + RoundedDouble Probability { get; } + + /// + /// Gets the status of the scenario. + /// + CalculationScenarioStatus CalculationScenarioStatus { get; } } } \ No newline at end of file Index: Ringtoets/Common/src/Ringtoets.Common.Data/Contribution/OtherFailureMechanism.cs =================================================================== diff -u -rfec99b77571cc0cf37b60f5ca257394714fde1d7 -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/Common/src/Ringtoets.Common.Data/Contribution/OtherFailureMechanism.cs (.../OtherFailureMechanism.cs) (revision fec99b77571cc0cf37b60f5ca257394714fde1d7) +++ Ringtoets/Common/src/Ringtoets.Common.Data/Contribution/OtherFailureMechanism.cs (.../OtherFailureMechanism.cs) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -45,6 +45,6 @@ } } - public override ICalculationGroup CalculationsGroup { get; protected set; } + public override CalculationGroup CalculationsGroup { get; protected set; } } } \ No newline at end of file Index: Ringtoets/Common/src/Ringtoets.Common.Data/FailureMechanism/FailureMechanismBase.cs =================================================================== diff -u -rfec99b77571cc0cf37b60f5ca257394714fde1d7 -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/Common/src/Ringtoets.Common.Data/FailureMechanism/FailureMechanismBase.cs (.../FailureMechanismBase.cs) (revision fec99b77571cc0cf37b60f5ca257394714fde1d7) +++ Ringtoets/Common/src/Ringtoets.Common.Data/FailureMechanism/FailureMechanismBase.cs (.../FailureMechanismBase.cs) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -104,7 +104,7 @@ /// /// Gets all available piping calculations. /// - public abstract ICalculationGroup CalculationsGroup { get; protected set; } + public abstract CalculationGroup CalculationsGroup { get; protected set; } public void AddSection(FailureMechanismSection section) { Index: Ringtoets/Common/src/Ringtoets.Common.Data/FailureMechanism/FailureMechanismSectionResult.cs =================================================================== diff -u -r8c60e937f4b8009fea80f3702879e100fe03b63f -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/Common/src/Ringtoets.Common.Data/FailureMechanism/FailureMechanismSectionResult.cs (.../FailureMechanismSectionResult.cs) (revision 8c60e937f4b8009fea80f3702879e100fe03b63f) +++ Ringtoets/Common/src/Ringtoets.Common.Data/FailureMechanism/FailureMechanismSectionResult.cs (.../FailureMechanismSectionResult.cs) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -69,22 +69,12 @@ /// /// Gets and sets the value of assessment layer two a. /// - public RoundedDouble? AssessmentLayerTwoA + public RoundedDouble AssessmentLayerTwoA { get { - var totalProbablity = (RoundedDouble?) 0.0; - foreach (var scenario in CalculationScenarios.Where(cs => cs.IsRelevant)) - { - if (!scenario.Probability.HasValue) - { - return null; - } - - totalProbablity += (scenario.Contribution*scenario.Probability.Value); - } - - return totalProbablity; + return CalculationScenarios.Where(cs => cs.IsRelevant && cs.CalculationScenarioStatus == CalculationScenarioStatus.Done) + .Aggregate((RoundedDouble) 0.0, (current, scenario) => (current + scenario.Contribution * scenario.Probability)); } } @@ -102,13 +92,39 @@ { get { - return (RoundedDouble) CalculationScenarios.Where(cs => cs.IsRelevant).Aggregate(0, (current, calculationScenario) => current + calculationScenario.Contribution); + return (RoundedDouble) CalculationScenarios.Where(cs => cs.IsRelevant) + .Aggregate(0, (current, calculationScenario) => current + calculationScenario.Contribution); } } /// /// Gets and sets a list of /// public List CalculationScenarios { get; private set; } + + /// + /// Gets the status of the section result depending on the calculation scenarios. + /// + public CalculationScenarioStatus CalculationScenarioStatus + { + get + { + foreach (var calculationScenario in CalculationScenarios.Where(cs => cs.IsRelevant)) + { + switch (calculationScenario.CalculationScenarioStatus) + { + case CalculationScenarioStatus.Failed: + return CalculationScenarioStatus.Failed; + case CalculationScenarioStatus.NotCalculated: + return CalculationScenarioStatus.NotCalculated; + case CalculationScenarioStatus.Done: + continue; + default: + throw new ArgumentOutOfRangeException(); + } + } + return CalculationScenarioStatus.Done; + } + } } } \ No newline at end of file Index: Ringtoets/Common/src/Ringtoets.Common.Data/FailureMechanism/IFailureMechanism.cs =================================================================== diff -u -rfec99b77571cc0cf37b60f5ca257394714fde1d7 -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/Common/src/Ringtoets.Common.Data/FailureMechanism/IFailureMechanism.cs (.../IFailureMechanism.cs) (revision fec99b77571cc0cf37b60f5ca257394714fde1d7) +++ Ringtoets/Common/src/Ringtoets.Common.Data/FailureMechanism/IFailureMechanism.cs (.../IFailureMechanism.cs) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -73,7 +73,7 @@ /// /// Gets all available piping calculations. /// - ICalculationGroup CalculationsGroup { get; } + CalculationGroup CalculationsGroup { get; } /// /// Adds a to . Index: Ringtoets/Common/src/Ringtoets.Common.Data/Ringtoets.Common.Data.csproj =================================================================== diff -u -r887b289acf19a81f62d78f371ab70c3f82812b95 -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/Common/src/Ringtoets.Common.Data/Ringtoets.Common.Data.csproj (.../Ringtoets.Common.Data.csproj) (revision 887b289acf19a81f62d78f371ab70c3f82812b95) +++ Ringtoets/Common/src/Ringtoets.Common.Data/Ringtoets.Common.Data.csproj (.../Ringtoets.Common.Data.csproj) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -42,6 +42,7 @@ + Index: Ringtoets/Common/src/Ringtoets.Common.Forms/Properties/Resources.Designer.cs =================================================================== diff -u -rbbe2a3488b33585ad13bebdaa7439f5c5bbfe079 -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/Common/src/Ringtoets.Common.Forms/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision bbe2a3488b33585ad13bebdaa7439f5c5bbfe079) +++ Ringtoets/Common/src/Ringtoets.Common.Forms/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -315,7 +315,7 @@ } /// - /// Looks up a localized string similar to Bijdrage van de geselecteerde scenario's voor dit vak zijn opgeteld niet gelijk aan 100%. + /// Looks up a localized string similar to Bijdrage van de geselecteerde scenario's voor dit vak zijn opgeteld niet gelijk aan 100%.. /// public static string FailureMechanismResultView_DataGridViewCellFormatting_Scenario_contribution_for_this_section_not_100 { get { Index: Ringtoets/Common/src/Ringtoets.Common.Forms/Properties/Resources.resx =================================================================== diff -u -rbbe2a3488b33585ad13bebdaa7439f5c5bbfe079 -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/Common/src/Ringtoets.Common.Forms/Properties/Resources.resx (.../Resources.resx) (revision bbe2a3488b33585ad13bebdaa7439f5c5bbfe079) +++ Ringtoets/Common/src/Ringtoets.Common.Forms/Properties/Resources.resx (.../Resources.resx) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -242,7 +242,7 @@ ..\Resources\document-task.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - Bijdrage van de geselecteerde scenario's voor dit vak zijn opgeteld niet gelijk aan 100% + Bijdrage van de geselecteerde scenario's voor dit vak zijn opgeteld niet gelijk aan 100%. Niet alle berekeningen voor dit vak zijn uitgevoerd. Index: Ringtoets/Common/src/Ringtoets.Common.Forms/Views/FailureMechanismResultView.cs =================================================================== diff -u -red71d00e40e0171a4d8b8335bbf577206b288e6b -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/Common/src/Ringtoets.Common.Forms/Views/FailureMechanismResultView.cs (.../FailureMechanismResultView.cs) (revision ed71d00e40e0171a4d8b8335bbf577206b288e6b) +++ Ringtoets/Common/src/Ringtoets.Common.Forms/Views/FailureMechanismResultView.cs (.../FailureMechanismResultView.cs) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -244,52 +244,53 @@ private class FailureMechanismSectionResultRow { - public readonly FailureMechanismSectionResult failureMechanismSectionResult; - public FailureMechanismSectionResultRow(FailureMechanismSectionResult failureMechanismSectionResult) { - this.failureMechanismSectionResult = failureMechanismSectionResult; + this.FailureMechanismSectionResult = failureMechanismSectionResult; } public string Name { get { - return failureMechanismSectionResult.Section.Name; + return FailureMechanismSectionResult.Section.Name; } } public bool AssessmentLayerOne { get { - return failureMechanismSectionResult.AssessmentLayerOne; + return FailureMechanismSectionResult.AssessmentLayerOne; } set { - failureMechanismSectionResult.AssessmentLayerOne = value; - failureMechanismSectionResult.NotifyObservers(); + FailureMechanismSectionResult.AssessmentLayerOne = value; + FailureMechanismSectionResult.NotifyObservers(); } } public string AssessmentLayerTwoA { get { - var relevantScenarios = failureMechanismSectionResult.CalculationScenarios.Where(cs => cs.IsRelevant).ToList(); + var relevantScenarios = FailureMechanismSectionResult.CalculationScenarios.Where(cs => cs.IsRelevant).ToArray(); + bool relevantScenarioAvailable = relevantScenarios.Length != 0; - if (relevantScenarios.Any() && Math.Abs(failureMechanismSectionResult.TotalContribution - 1.0) > tolerance) + if (relevantScenarioAvailable && Math.Abs(FailureMechanismSectionResult.TotalContribution - 1.0) > tolerance) { - return double.NaN.ToString(CultureInfo.InvariantCulture); + return double.NaN.ToString(CultureInfo.CurrentCulture); } - var layerTwoA = failureMechanismSectionResult.AssessmentLayerTwoA; - - if (!relevantScenarios.Any() || !layerTwoA.HasValue || double.IsNaN(layerTwoA.Value)) + if (!relevantScenarioAvailable + || FailureMechanismSectionResult.CalculationScenarioStatus == CalculationScenarioStatus.NotCalculated + || FailureMechanismSectionResult.CalculationScenarioStatus == CalculationScenarioStatus.Failed) { return Resources.FailureMechanismSectionResultRow_AssessmentLayerTwoA_No_result_dash; } + var layerTwoA = FailureMechanismSectionResult.AssessmentLayerTwoA; + return string.Format(CoreCommonResources.ProbabilityPerYearFormat, layerTwoA.Value); } } @@ -298,25 +299,27 @@ { get { - return failureMechanismSectionResult.AssessmentLayerTwoB; + return FailureMechanismSectionResult.AssessmentLayerTwoB; } set { - failureMechanismSectionResult.AssessmentLayerTwoB = value; + FailureMechanismSectionResult.AssessmentLayerTwoB = value; } } public RoundedDouble AssessmentLayerThree { get { - return failureMechanismSectionResult.AssessmentLayerThree; + return FailureMechanismSectionResult.AssessmentLayerThree; } set { - failureMechanismSectionResult.AssessmentLayerThree = value; + FailureMechanismSectionResult.AssessmentLayerThree = value; } } + + public FailureMechanismSectionResult FailureMechanismSectionResult { get; private set; } } #endregion @@ -357,43 +360,45 @@ private void DataGridViewCellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { - FailureMechanismSectionResultRow resultRow = dataGridView.Rows[e.RowIndex].DataBoundItem as FailureMechanismSectionResultRow; + var currentDataGridViewRow = dataGridView.Rows[e.RowIndex]; + var currentDataGridViewCell = currentDataGridViewRow.Cells[e.ColumnIndex]; + FailureMechanismSectionResultRow resultRow = (FailureMechanismSectionResultRow) currentDataGridViewRow.DataBoundItem; + if (resultRow != null && e.ColumnIndex == assessmentLayerTwoA.Index) { - FailureMechanismSectionResult rowObject = resultRow.failureMechanismSectionResult; + FailureMechanismSectionResult rowObject = resultRow.FailureMechanismSectionResult; - var relevantScenarios = rowObject.CalculationScenarios.Where(cs => cs.IsRelevant).ToList(); + var relevantScenarios = rowObject.CalculationScenarios.Where(cs => cs.IsRelevant).ToArray(); + bool relevantScenarioAvailable = relevantScenarios.Length != 0; - if (rowObject.AssessmentLayerOne || !relevantScenarios.Any()) + if (rowObject.AssessmentLayerOne || !relevantScenarioAvailable) { - dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].ErrorText = string.Empty; + currentDataGridViewCell.ErrorText = string.Empty; return; } - if (relevantScenarios.Any() && Math.Abs(rowObject.TotalContribution - 1.0) > tolerance) + if (Math.Abs(rowObject.TotalContribution - 1.0) > tolerance) { - dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].ErrorText = Resources.FailureMechanismResultView_DataGridViewCellFormatting_Scenario_contribution_for_this_section_not_100; + currentDataGridViewCell.ErrorText = Resources.FailureMechanismResultView_DataGridViewCellFormatting_Scenario_contribution_for_this_section_not_100; return; } - var layerTwoA = rowObject.AssessmentLayerTwoA; + var calculationScenarioStatus = rowObject.CalculationScenarioStatus; - if (!layerTwoA.HasValue) + if (calculationScenarioStatus == CalculationScenarioStatus.NotCalculated) { - // Calculation not done. - dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].ErrorText = Resources.FailureMechanismResultView_DataGridViewCellFormatting_Not_all_calculations_are_executed; + currentDataGridViewCell.ErrorText = Resources.FailureMechanismResultView_DataGridViewCellFormatting_Not_all_calculations_are_executed; return; } - if (double.IsNaN(layerTwoA.Value)) + if (calculationScenarioStatus == CalculationScenarioStatus.Failed) { - // Calculation output not valid. - dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].ErrorText = Resources.FailureMechanismResultView_DataGridViewCellFormatting_Not_all_calculations_have_valid_output; + currentDataGridViewCell.ErrorText = Resources.FailureMechanismResultView_DataGridViewCellFormatting_Not_all_calculations_have_valid_output; return; } - dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].ErrorText = string.Empty; + currentDataGridViewCell.ErrorText = string.Empty; } } Index: Ringtoets/Common/test/Ringtoets.Common.Data.Test/FailureMechanism/FailureMechanismBaseTest.cs =================================================================== diff -u -rfec99b77571cc0cf37b60f5ca257394714fde1d7 -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/Common/test/Ringtoets.Common.Data.Test/FailureMechanism/FailureMechanismBaseTest.cs (.../FailureMechanismBaseTest.cs) (revision fec99b77571cc0cf37b60f5ca257394714fde1d7) +++ Ringtoets/Common/test/Ringtoets.Common.Data.Test/FailureMechanism/FailureMechanismBaseTest.cs (.../FailureMechanismBaseTest.cs) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -317,7 +317,7 @@ } } - public override ICalculationGroup CalculationsGroup { get; protected set; } + public override CalculationGroup CalculationsGroup { get; protected set; } } } } \ No newline at end of file Index: Ringtoets/Common/test/Ringtoets.Common.Data.Test/FailureMechanism/FailureMechanismSectionResultTest.cs =================================================================== diff -u -r8c60e937f4b8009fea80f3702879e100fe03b63f -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/Common/test/Ringtoets.Common.Data.Test/FailureMechanism/FailureMechanismSectionResultTest.cs (.../FailureMechanismSectionResultTest.cs) (revision 8c60e937f4b8009fea80f3702879e100fe03b63f) +++ Ringtoets/Common/test/Ringtoets.Common.Data.Test/FailureMechanism/FailureMechanismSectionResultTest.cs (.../FailureMechanismSectionResultTest.cs) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -20,6 +20,7 @@ // All rights reserved. using System; +using System.Collections.Generic; using Core.Common.Base.Data; using Core.Common.Base.Geometry; using NUnit.Framework; @@ -36,10 +37,10 @@ public void Constructor_DefaultValues() { // Setup - var section = CreateSection(); + FailureMechanismSection section = CreateSection(); // Call - var sectionResult = new FailureMechanismSectionResult(section); + FailureMechanismSectionResult sectionResult = new FailureMechanismSectionResult(section); // Assert Assert.AreSame(section, sectionResult.Section); @@ -67,7 +68,7 @@ public void AssessmentLayerOne_Always_ReturnsSetValue(bool newValue) { // Setup - var section = CreateSection(); + FailureMechanismSection section = CreateSection(); var failureMechanismSectionResult = new FailureMechanismSectionResult(section); // Call @@ -81,109 +82,136 @@ public void AssessmentLayerTwoA_ScenariosCalculated_ReturnsValue() { // Setup - var section = CreateSection(); + FailureMechanismSection section = CreateSection(); var failureMechanismSectionResult = new FailureMechanismSectionResult(section); var mocks = new MockRepository(); var calculationScenarioMock = mocks.StrictMock(); - calculationScenarioMock.Expect(cs => cs.IsRelevant).Return(true); - calculationScenarioMock.Expect(cs => cs.Contribution).Return((RoundedDouble)1.0); + calculationScenarioMock.Stub(cs => cs.IsRelevant).Return(true); + calculationScenarioMock.Stub(cs => cs.Contribution).Return((RoundedDouble)1.0); var expectedProbability = (RoundedDouble)41661830; - calculationScenarioMock.Expect(cs => cs.Probability).Return(expectedProbability).Repeat.Twice(); + calculationScenarioMock.Stub(cs => cs.Probability).Return(expectedProbability); + calculationScenarioMock.Stub(cs => cs.CalculationScenarioStatus).Return(CalculationScenarioStatus.Done); mocks.ReplayAll(); failureMechanismSectionResult.CalculationScenarios.Add(calculationScenarioMock); // Call - var assessmentLayerTwoA = failureMechanismSectionResult.AssessmentLayerTwoA; + RoundedDouble? assessmentLayerTwoA = failureMechanismSectionResult.AssessmentLayerTwoA; // Assert Assert.AreEqual(expectedProbability, assessmentLayerTwoA); mocks.VerifyAll(); } [Test] - public void AssessmentLayerTwoA_ScenarioNotCalculated_ReturnsNull() + public void AssessmentLayerTwoA_ScenarioNotCalculated_ReturnsZero() { // Setup - var section = CreateSection(); + FailureMechanismSection section = CreateSection(); var failureMechanismSectionResult = new FailureMechanismSectionResult(section); var mocks = new MockRepository(); var calculationScenarioMock = mocks.StrictMock(); - calculationScenarioMock.Expect(cs => cs.IsRelevant).Return(true); - calculationScenarioMock.Expect(cs => cs.Probability).Return(null); + calculationScenarioMock.Stub(cs => cs.IsRelevant).Return(true); + calculationScenarioMock.Stub(cs => cs.CalculationScenarioStatus).Return(CalculationScenarioStatus.NotCalculated); mocks.ReplayAll(); failureMechanismSectionResult.CalculationScenarios.Add(calculationScenarioMock); // Call - var assessmentLayerTwoA = failureMechanismSectionResult.AssessmentLayerTwoA; + RoundedDouble assessmentLayerTwoA = failureMechanismSectionResult.AssessmentLayerTwoA; // Assert - Assert.IsNull(assessmentLayerTwoA); + Assert.AreEqual((RoundedDouble)0, assessmentLayerTwoA); mocks.VerifyAll(); } [Test] - public void AssessmentLayerTwoA_ScenarioInvalidOutput_ReturnsNaN() + public void AssessmentLayerTwoA_ScenarioInvalidOutput_ReturnsZero() { // Setup - var section = CreateSection(); + FailureMechanismSection section = CreateSection(); var failureMechanismSectionResult = new FailureMechanismSectionResult(section); var mocks = new MockRepository(); var calculationScenarioMock = mocks.StrictMock(); - calculationScenarioMock.Expect(cs => cs.IsRelevant).Return(true); - calculationScenarioMock.Expect(cs => cs.Probability).Return((RoundedDouble?) double.NaN).Repeat.Twice(); - calculationScenarioMock.Expect(cs => cs.Contribution).Return((RoundedDouble) 1.0); + calculationScenarioMock.Stub(cs => cs.IsRelevant).Return(true); + calculationScenarioMock.Stub(cs => cs.Probability).Return((RoundedDouble) double.NaN); + calculationScenarioMock.Stub(cs => cs.Contribution).Return((RoundedDouble)1.0); + calculationScenarioMock.Stub(cs => cs.CalculationScenarioStatus).Return(CalculationScenarioStatus.Failed); mocks.ReplayAll(); failureMechanismSectionResult.CalculationScenarios.Add(calculationScenarioMock); // Call - var assessmentLayerTwoA = failureMechanismSectionResult.AssessmentLayerTwoA; + RoundedDouble assessmentLayerTwoA = failureMechanismSectionResult.AssessmentLayerTwoA; // Assert - Assert.IsNaN(assessmentLayerTwoA); + Assert.AreEqual((RoundedDouble)0, assessmentLayerTwoA); mocks.VerifyAll(); } [Test] - public void AssessmentLayerTwoA_NoScenarios_ReturnsValue() + public void AssessmentLayerTwoA_NoScenarios_ReturnsZero() { // Setup - var section = CreateSection(); + FailureMechanismSection section = CreateSection(); var failureMechanismSectionResult = new FailureMechanismSectionResult(section); // Call - var assessmentLayerTwoA = failureMechanismSectionResult.AssessmentLayerTwoA; + RoundedDouble? assessmentLayerTwoA = failureMechanismSectionResult.AssessmentLayerTwoA; // Assert Assert.AreEqual((RoundedDouble)0.0, assessmentLayerTwoA); } [Test] + public void AssessmentLayerTwoA_NoRelevantScenarios_ReturnsZero() + { + // Setup + FailureMechanismSection section = CreateSection(); + var failureMechanismSectionResult = new FailureMechanismSectionResult(section); + + var mocks = new MockRepository(); + var calculationScenarioMock = mocks.StrictMock(); + calculationScenarioMock.Stub(cs => cs.IsRelevant).Return(false); + var calculationScenarioMock2 = mocks.StrictMock(); + calculationScenarioMock2.Stub(cs => cs.IsRelevant).Return(false); + + mocks.ReplayAll(); + + failureMechanismSectionResult.CalculationScenarios.Add(calculationScenarioMock); + failureMechanismSectionResult.CalculationScenarios.Add(calculationScenarioMock2); + + // Call + RoundedDouble? assessmentLayerTwoA = failureMechanismSectionResult.AssessmentLayerTwoA; + + // Assert + Assert.AreEqual((RoundedDouble)0.0, assessmentLayerTwoA); + } + + [Test] public void TotalContribution_Always_ReturnsTotalRelevantScenarioContribution() { // Setup - var section = CreateSection(); + FailureMechanismSection section = CreateSection(); var failureMechanismSectionResult = new FailureMechanismSectionResult(section); var mocks = new MockRepository(); var calculationScenarioMock = mocks.StrictMock(); - calculationScenarioMock.Expect(cs => cs.IsRelevant).Return(true); - calculationScenarioMock.Expect(cs => cs.Contribution).Return((RoundedDouble)0.3); + calculationScenarioMock.Stub(cs => cs.IsRelevant).Return(true); + calculationScenarioMock.Stub(cs => cs.Contribution).Return((RoundedDouble)0.3); var calculationScenarioMock2 = mocks.StrictMock(); - calculationScenarioMock2.Expect(cs => cs.IsRelevant).Return(true); - calculationScenarioMock2.Expect(cs => cs.Contribution).Return((RoundedDouble)0.5); + calculationScenarioMock2.Stub(cs => cs.IsRelevant).Return(true); + calculationScenarioMock2.Stub(cs => cs.Contribution).Return((RoundedDouble)0.5); var calculationScenarioMock3 = mocks.StrictMock(); - calculationScenarioMock3.Expect(cs => cs.IsRelevant).Return(false); + calculationScenarioMock3.Stub(cs => cs.IsRelevant).Return(false); mocks.ReplayAll(); @@ -192,7 +220,7 @@ failureMechanismSectionResult.CalculationScenarios.Add(calculationScenarioMock3); // Call - var totalContribution = failureMechanismSectionResult.TotalContribution; + RoundedDouble totalContribution = failureMechanismSectionResult.TotalContribution; // Assert Assert.AreEqual((RoundedDouble)0.8, totalContribution); @@ -203,7 +231,7 @@ public void AssessmentLayerTwoB_Always_ReturnsSetValue() { // Setup - var section = CreateSection(); + FailureMechanismSection section = CreateSection(); var failureMechanismSectionResult = new FailureMechanismSectionResult(section); var assessmentLayerTwoBValue = (RoundedDouble) 3.0; @@ -218,7 +246,7 @@ public void AssessmentLayerThree_Always_ReturnsSetValue() { // Setup - var section = CreateSection(); + FailureMechanismSection section = CreateSection(); var failureMechanismSectionResult = new FailureMechanismSectionResult(section); var assessmentLayerThreeValue = (RoundedDouble)3.0; @@ -233,7 +261,7 @@ public void CalculationScenarios_Always_ReturnsAddedCalculationScenarios() { // Setup - var section = CreateSection(); + FailureMechanismSection section = CreateSection(); var failureMechanismSectionResult = new FailureMechanismSectionResult(section); // Precondition @@ -251,13 +279,104 @@ failureMechanismSectionResult.CalculationScenarios.Add(calculationScenarioMock3); // Call - var scenarios = failureMechanismSectionResult.CalculationScenarios; + List scenarios = failureMechanismSectionResult.CalculationScenarios; // Assert CollectionAssert.AreEqual(new[] {calculationScenarioMock, calculationScenarioMock2, calculationScenarioMock3}, scenarios); mocks.VerifyAll(); } + [Test] + public void CalculationScenarioStatus_ScenarioNotCalculated_ReturnsStatusNotCalculated() + { + // Setup + FailureMechanismSection section = CreateSection(); + var failureMechanismSectionResult = new FailureMechanismSectionResult(section); + + var mocks = new MockRepository(); + var calculationScenarioMock = mocks.StrictMock(); + calculationScenarioMock.Stub(cs => cs.IsRelevant).Return(true); + calculationScenarioMock.Stub(cs => cs.CalculationScenarioStatus).Return(CalculationScenarioStatus.NotCalculated); + + mocks.ReplayAll(); + + failureMechanismSectionResult.CalculationScenarios.Add(calculationScenarioMock); + + // Call + CalculationScenarioStatus status = failureMechanismSectionResult.CalculationScenarioStatus; + + // Assert + Assert.AreEqual(CalculationScenarioStatus.NotCalculated, status); + mocks.VerifyAll(); + } + + [Test] + public void CalculationScenarioStatus_ScenarioInvalidOutput_ReturnsStatusFailed() + { + // Setup + FailureMechanismSection section = CreateSection(); + var failureMechanismSectionResult = new FailureMechanismSectionResult(section); + + var mocks = new MockRepository(); + var calculationScenarioMock = mocks.StrictMock(); + calculationScenarioMock.Stub(cs => cs.IsRelevant).Return(true); + calculationScenarioMock.Stub(cs => cs.Probability).Return((RoundedDouble)double.NaN); + calculationScenarioMock.Stub(cs => cs.Contribution).Return((RoundedDouble)1.0); + calculationScenarioMock.Stub(cs => cs.CalculationScenarioStatus).Return(CalculationScenarioStatus.Failed); + + mocks.ReplayAll(); + + failureMechanismSectionResult.CalculationScenarios.Add(calculationScenarioMock); + + // Call + CalculationScenarioStatus status = failureMechanismSectionResult.CalculationScenarioStatus; + + // Assert + Assert.AreEqual(CalculationScenarioStatus.Failed, status); + mocks.VerifyAll(); + } + + [Test] + public void CalculationScenarioStatus_ScenariosCalculated_ReturnsStatusDone() + { + // Setup + FailureMechanismSection section = CreateSection(); + var failureMechanismSectionResult = new FailureMechanismSectionResult(section); + + var mocks = new MockRepository(); + var calculationScenarioMock = mocks.StrictMock(); + calculationScenarioMock.Stub(cs => cs.IsRelevant).Return(true); + calculationScenarioMock.Stub(cs => cs.Contribution).Return((RoundedDouble)1.0); + var expectedProbability = (RoundedDouble)41661830; + calculationScenarioMock.Stub(cs => cs.Probability).Return(expectedProbability); + calculationScenarioMock.Stub(cs => cs.CalculationScenarioStatus).Return(CalculationScenarioStatus.Done); + + mocks.ReplayAll(); + + failureMechanismSectionResult.CalculationScenarios.Add(calculationScenarioMock); + + // Call + CalculationScenarioStatus status = failureMechanismSectionResult.CalculationScenarioStatus; + + // Assert + Assert.AreEqual(CalculationScenarioStatus.Done, status); + mocks.VerifyAll(); + } + + [Test] + public void CalculationScenarioStatus_NoScenarios_ReturnsStatusDone() + { + // Setup + FailureMechanismSection section = CreateSection(); + var failureMechanismSectionResult = new FailureMechanismSectionResult(section); + + // Call + CalculationScenarioStatus status = failureMechanismSectionResult.CalculationScenarioStatus; + + // Assert + Assert.AreEqual(CalculationScenarioStatus.Done, status); + } + private static FailureMechanismSection CreateSection() { var points = new[] @@ -266,7 +385,7 @@ new Point2D(3, 4) }; - var section = new FailureMechanismSection("test", points); + FailureMechanismSection section = new FailureMechanismSection("test", points); return section; } } Index: Ringtoets/Common/test/Ringtoets.Common.Data.Test/ICalculationBaseExtensionsTest.cs =================================================================== diff -u -r887b289acf19a81f62d78f371ab70c3f82812b95 -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/Common/test/Ringtoets.Common.Data.Test/ICalculationBaseExtensionsTest.cs (.../ICalculationBaseExtensionsTest.cs) (revision 887b289acf19a81f62d78f371ab70c3f82812b95) +++ Ringtoets/Common/test/Ringtoets.Common.Data.Test/ICalculationBaseExtensionsTest.cs (.../ICalculationBaseExtensionsTest.cs) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -20,9 +20,8 @@ // All rights reserved. using System.Collections.Generic; -using Core.Common.Base; -using Core.Common.Base.Data; using NUnit.Framework; +using Rhino.Mocks; using Ringtoets.Common.Data.Calculation; namespace Ringtoets.Common.Data.Test @@ -34,7 +33,9 @@ public void GetPipingCalculations_FromPipingCalculation_ReturnThatCalculationInstance() { // Setup - ICalculationBase calculationItem = new TestCalculationItem(); + var mocks = new MockRepository(); + ICalculationBase calculationItem = mocks.StrictMock(); + mocks.ReplayAll(); // Call IEnumerable result = calculationItem.GetCalculations(); @@ -44,6 +45,7 @@ { calculationItem }, result); + mocks.VerifyAll(); } [Test] @@ -81,10 +83,12 @@ public void GetPipingCalculations_FromCalculationGroupWithGroupsAndCalculations_ReturnAllCalculationsRecursiveslyInAnyOrder() { // Setup - var calculation1 = new TestCalculationItem(); - var calculation2 = new TestCalculationItem(); - var calculation3 = new TestCalculationItem(); - var calculation4 = new TestCalculationItem(); + var mocks = new MockRepository(); + ICalculationBase calculation1 = mocks.StrictMock(); + ICalculationBase calculation2 = mocks.StrictMock(); + ICalculationBase calculation3 = mocks.StrictMock(); + ICalculationBase calculation4 = mocks.StrictMock(); + mocks.ReplayAll(); var subsubGroup = new CalculationGroup(); subsubGroup.Children.Add(calculation4); @@ -117,45 +121,4 @@ CollectionAssert.AreEquivalent(itemsThatShouldBeFound, result); } } - - public class TestCalculationItem : ICalculationScenario - { - public TestCalculationItem() - { - - } - - public void Attach(IObserver observer) - { - throw new System.NotImplementedException(); - } - - public void Detach(IObserver observer) - { - throw new System.NotImplementedException(); - } - - public void NotifyObservers() - { - throw new System.NotImplementedException(); - } - - public string Name { get; set; } - public string Comments { get; set; } - public bool HasOutput { get; private set; } - public void ClearOutput() - { - throw new System.NotImplementedException(); - } - - public void ClearHydraulicBoundaryLocation() - { - throw new System.NotImplementedException(); - } - - public ICalculationInput Input { get; private set; } - public bool IsRelevant { get; set; } - public RoundedDouble Contribution { get; set; } - public RoundedDouble? Probability { get; private set; } - } } \ No newline at end of file Index: Ringtoets/Common/test/Ringtoets.Common.Forms.Test/Views/FailureMechanismResultViewTest.cs =================================================================== diff -u -rfec99b77571cc0cf37b60f5ca257394714fde1d7 -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/Common/test/Ringtoets.Common.Forms.Test/Views/FailureMechanismResultViewTest.cs (.../FailureMechanismResultViewTest.cs) (revision fec99b77571cc0cf37b60f5ca257394714fde1d7) +++ Ringtoets/Common/test/Ringtoets.Common.Forms.Test/Views/FailureMechanismResultViewTest.cs (.../FailureMechanismResultViewTest.cs) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -369,7 +369,7 @@ var formattedValue = dataGridViewCell.FormattedValue; // Need to do this to fire the CellFormatting event. // Assert - Assert.AreEqual("Bijdrage van de geselecteerde scenario's voor dit vak zijn opgeteld niet gelijk aan 100%", dataGridViewCell.ErrorText); + Assert.AreEqual("Bijdrage van de geselecteerde scenario's voor dit vak zijn opgeteld niet gelijk aan 100%.", dataGridViewCell.ErrorText); Assert.AreEqual(double.NaN.ToString(CultureInfo.InvariantCulture), formattedValue); mocks.VerifyAll(); } @@ -383,7 +383,8 @@ var calculationScenarioMock = mocks.StrictMock(); calculationScenarioMock.Stub(cs => cs.Contribution).Return((RoundedDouble) 1.0); calculationScenarioMock.Stub(cs => cs.IsRelevant).Return(true); - calculationScenarioMock.Stub(cs => cs.Probability).Return((RoundedDouble?) 1000); + calculationScenarioMock.Stub(cs => cs.Probability).Return((RoundedDouble) 1000); + calculationScenarioMock.Stub(cs => cs.CalculationScenarioStatus).Return(CalculationScenarioStatus.Done); mocks.ReplayAll(); @@ -417,7 +418,7 @@ var calculationScenarioMock = mocks.StrictMock(); calculationScenarioMock.Stub(cs => cs.Contribution).Return((RoundedDouble) 1.0); calculationScenarioMock.Stub(cs => cs.IsRelevant).Return(true); - calculationScenarioMock.Stub(cs => cs.Probability).Return(null); + calculationScenarioMock.Stub(cs => cs.CalculationScenarioStatus).Return(CalculationScenarioStatus.NotCalculated); mocks.ReplayAll(); @@ -451,7 +452,7 @@ var calculationScenarioMock = mocks.StrictMock(); calculationScenarioMock.Stub(cs => cs.Contribution).Return((RoundedDouble) 1.0); calculationScenarioMock.Stub(cs => cs.IsRelevant).Return(true); - calculationScenarioMock.Stub(cs => cs.Probability).Return((RoundedDouble?) double.NaN); + calculationScenarioMock.Stub(cs => cs.CalculationScenarioStatus).Return(CalculationScenarioStatus.Failed); mocks.ReplayAll(); @@ -507,7 +508,7 @@ var calculationScenarioMock = mocks.StrictMock(); calculationScenarioMock.Stub(cs => cs.Contribution).Return((RoundedDouble) 1.0); calculationScenarioMock.Stub(cs => cs.IsRelevant).Return(false); - calculationScenarioMock.Stub(cs => cs.Probability).Return((RoundedDouble?) double.NaN); + calculationScenarioMock.Stub(cs => cs.Probability).Return((RoundedDouble) double.NaN); mocks.ReplayAll(); @@ -533,14 +534,15 @@ } [Test] - public void FailureMechanismResultView_AssessmentLayerTrueAndAssessmentLayerTwoAHasError_DoesNotShowError() + public void FailureMechanismResultView_AssessmentLayerOneTrueAndAssessmentLayerTwoAHasError_DoesNotShowError() { // Setup var mocks = new MockRepository(); var calculationScenarioMock = mocks.StrictMock(); calculationScenarioMock.Stub(cs => cs.Contribution).Return((RoundedDouble) 1.0); calculationScenarioMock.Stub(cs => cs.IsRelevant).Return(true); - calculationScenarioMock.Stub(cs => cs.Probability).Return((RoundedDouble?) double.NaN); + calculationScenarioMock.Stub(cs => cs.Probability).Return((RoundedDouble) double.NaN); + calculationScenarioMock.Stub(cs => cs.CalculationScenarioStatus).Return(CalculationScenarioStatus.Failed); mocks.ReplayAll(); @@ -608,7 +610,7 @@ } } - public override ICalculationGroup CalculationsGroup { get; protected set; } + public override CalculationGroup CalculationsGroup { get; protected set; } } private FailureMechanismResultView ShowFailureMechanismResultsView() Index: Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Data/GrassCoverErosionInwardsFailureMechanism.cs =================================================================== diff -u -r0a3c7987645ee1993be6c16b26125355994ab1ff -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Data/GrassCoverErosionInwardsFailureMechanism.cs (.../GrassCoverErosionInwardsFailureMechanism.cs) (revision 0a3c7987645ee1993be6c16b26125355994ab1ff) +++ Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Data/GrassCoverErosionInwardsFailureMechanism.cs (.../GrassCoverErosionInwardsFailureMechanism.cs) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -49,7 +49,7 @@ } } - public override ICalculationGroup CalculationsGroup { get; protected set; } + public override CalculationGroup CalculationsGroup { get; protected set; } /// /// Length-effect parameters. Index: Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Forms/PresentationObjects/GrassCoverErosionInwardsCalculationGroupContext.cs =================================================================== diff -u -rabb2667229e96d5b8158981c890a5c7046e9ca66 -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Forms/PresentationObjects/GrassCoverErosionInwardsCalculationGroupContext.cs (.../GrassCoverErosionInwardsCalculationGroupContext.cs) (revision abb2667229e96d5b8158981c890a5c7046e9ca66) +++ Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Forms/PresentationObjects/GrassCoverErosionInwardsCalculationGroupContext.cs (.../GrassCoverErosionInwardsCalculationGroupContext.cs) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -31,15 +31,15 @@ /// Presentation object for all data required to configure an instance of /// in order be able to create configurable grass cover erosion inwards calculations. /// - public class GrassCoverErosionInwardsCalculationGroupContext : GrassCoverErosionInwardsContext + public class GrassCoverErosionInwardsCalculationGroupContext : GrassCoverErosionInwardsContext { /// /// Creates a new instance of . /// - /// The instance wrapped by this context object. + /// The instance wrapped by this context object. /// The failure mechanism which the context belongs to. /// The assessment section which the context belongs to. - public GrassCoverErosionInwardsCalculationGroupContext(ICalculationGroup calculationsGroup, GrassCoverErosionInwardsFailureMechanism grassCoverErosionInwardsFailureMechanism, IAssessmentSection assessmentSection) + public GrassCoverErosionInwardsCalculationGroupContext(CalculationGroup calculationsGroup, GrassCoverErosionInwardsFailureMechanism grassCoverErosionInwardsFailureMechanism, IAssessmentSection assessmentSection) : base(calculationsGroup, assessmentSection) { if (grassCoverErosionInwardsFailureMechanism == null) Index: Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Data.Test/GrassCoverErosionInwardsCalculationTest.cs =================================================================== diff -u -rd2de88a141d3ba20d1f3b301a3c38723b682b206 -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Data.Test/GrassCoverErosionInwardsCalculationTest.cs (.../GrassCoverErosionInwardsCalculationTest.cs) (revision d2de88a141d3ba20d1f3b301a3c38723b682b206) +++ Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Data.Test/GrassCoverErosionInwardsCalculationTest.cs (.../GrassCoverErosionInwardsCalculationTest.cs) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -241,7 +241,7 @@ { // Setup var calculation = new GrassCoverErosionInwardsCalculation(); - var inputParameters = calculation.InputParameters; + GrassCoverErosionInwardsInput inputParameters = calculation.InputParameters; // Call var input = calculation.Input; Index: Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Forms.Test/PresentationObjects/GrassCoverErosionInwardsCalculationGroupContextTest.cs =================================================================== diff -u -rabb2667229e96d5b8158981c890a5c7046e9ca66 -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Forms.Test/PresentationObjects/GrassCoverErosionInwardsCalculationGroupContextTest.cs (.../GrassCoverErosionInwardsCalculationGroupContextTest.cs) (revision abb2667229e96d5b8158981c890a5c7046e9ca66) +++ Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Forms.Test/PresentationObjects/GrassCoverErosionInwardsCalculationGroupContextTest.cs (.../GrassCoverErosionInwardsCalculationGroupContextTest.cs) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -56,7 +56,7 @@ // Assert Assert.IsInstanceOf(groupContext); - Assert.IsInstanceOf>(groupContext); + Assert.IsInstanceOf>(groupContext); Assert.AreSame(calculationGroup, groupContext.WrappedData); Assert.AreSame(failureMechanismMock, groupContext.GrassCoverErosionInwardsFailureMechanism); Assert.AreSame(assessmentSectionMock, groupContext.AssessmentSection); Index: Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Forms.Test/TreeNodeInfos/GrassCoverErosionInwardsCalculationGroupContextTreeNodeInfoTest.cs =================================================================== diff -u -re87c9b5011f0f941594f70f2384877351797d445 -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Forms.Test/TreeNodeInfos/GrassCoverErosionInwardsCalculationGroupContextTreeNodeInfoTest.cs (.../GrassCoverErosionInwardsCalculationGroupContextTreeNodeInfoTest.cs) (revision e87c9b5011f0f941594f70f2384877351797d445) +++ Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Forms.Test/TreeNodeInfos/GrassCoverErosionInwardsCalculationGroupContextTreeNodeInfoTest.cs (.../GrassCoverErosionInwardsCalculationGroupContextTreeNodeInfoTest.cs) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -379,7 +379,7 @@ assessmentSectionMock); var calculationItem = mocks.Stub(); - calculationItem.Name = "Nieuwe map"; + calculationItem.Stub(ci => ci.Name).Return("Nieuwe map"); var observer = mocks.StrictMock(); observer.Expect(o => o.UpdateObserver()); @@ -428,7 +428,7 @@ assessmentSectionMock); var calculationItem = mocks.Stub(); - calculationItem.Name = "Nieuwe berekening"; + calculationItem.Stub(ci => ci.Name).Return("Nieuwe berekening"); var observer = mocks.StrictMock(); observer.Expect(o => o.UpdateObserver()); @@ -876,7 +876,7 @@ CreateCalculationAndContext(draggedItemType, out draggedItem, out draggedItemContext, pipingFailureMechanismMock, assessmentSection, name); var existingItemStub = mocks.Stub(); - existingItemStub.Name = ""; + existingItemStub.Stub(ci => ci.Name).Return(""); CalculationGroup originalOwnerGroup; GrassCoverErosionInwardsCalculationGroupContext originalOwnerGroupContext; @@ -934,7 +934,7 @@ CreateCalculationGroupAndContext(out newOwnerGroup, out newOwnerGroupContext, pipingFailureMechanismMock, assessmentSection); var sameNamedItem = mocks.Stub(); - sameNamedItem.Name = draggedItem.Name; + sameNamedItem.Stub(sni => sni.Name).Return(draggedItem.Name); var originalOwnerObserver = mocks.StrictMock(); originalOwnerObserver.Expect(o => o.UpdateObserver()); Index: Ringtoets/Integration/src/Ringtoets.Integration.Data/Placeholders/FailureMechanismPlaceholder.cs =================================================================== diff -u -rfec99b77571cc0cf37b60f5ca257394714fde1d7 -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/Integration/src/Ringtoets.Integration.Data/Placeholders/FailureMechanismPlaceholder.cs (.../FailureMechanismPlaceholder.cs) (revision fec99b77571cc0cf37b60f5ca257394714fde1d7) +++ Ringtoets/Integration/src/Ringtoets.Integration.Data/Placeholders/FailureMechanismPlaceholder.cs (.../FailureMechanismPlaceholder.cs) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -52,7 +52,7 @@ } } - public override ICalculationGroup CalculationsGroup { get; protected set; } + public override CalculationGroup CalculationsGroup { get; protected set; } /// /// Gets the locations relevant for evaluating this failure mechanism. Index: Ringtoets/Integration/src/Ringtoets.Integration.Plugin/RingtoetsGuiPlugin.cs =================================================================== diff -u -r887b289acf19a81f62d78f371ab70c3f82812b95 -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/Integration/src/Ringtoets.Integration.Plugin/RingtoetsGuiPlugin.cs (.../RingtoetsGuiPlugin.cs) (revision 887b289acf19a81f62d78f371ab70c3f82812b95) +++ Ringtoets/Integration/src/Ringtoets.Integration.Plugin/RingtoetsGuiPlugin.cs (.../RingtoetsGuiPlugin.cs) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -327,7 +327,7 @@ private static bool CloseCommentViewForData(CommentView commentView, object o) { - var calculationContext = o as PipingCalculationContext; + var calculationContext = o as PipingCalculationScenarioContext; if (calculationContext != null) { return calculationContext.WrappedData == commentView.Data; Index: Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/FileImporters/FailureMechanismSectionsImporterTest.cs =================================================================== diff -u -rfec99b77571cc0cf37b60f5ca257394714fde1d7 -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/FileImporters/FailureMechanismSectionsImporterTest.cs (.../FailureMechanismSectionsImporterTest.cs) (revision fec99b77571cc0cf37b60f5ca257394714fde1d7) +++ Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/FileImporters/FailureMechanismSectionsImporterTest.cs (.../FailureMechanismSectionsImporterTest.cs) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -645,7 +645,7 @@ } } - public override ICalculationGroup CalculationsGroup { get; protected set; } + public override CalculationGroup CalculationsGroup { get; protected set; } } private class ProgressNotification Index: Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/ViewInfos/CommentViewInfoTest.cs =================================================================== diff -u -rc5f90c4f9b42d985f16f99ad8732576b9217267a -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/ViewInfos/CommentViewInfoTest.cs (.../CommentViewInfoTest.cs) (revision c5f90c4f9b42d985f16f99ad8732576b9217267a) +++ Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/ViewInfos/CommentViewInfoTest.cs (.../CommentViewInfoTest.cs) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -343,7 +343,7 @@ var viewDataCalculation = new PipingCalculationScenario(new GeneralPipingInput(), new NormProbabilityPipingInput()); var failureMechanism = new PipingFailureMechanism(); - var deletedCalculationContext = new PipingCalculationContext(viewDataCalculation, + var deletedCalculationContext = new PipingCalculationScenarioContext(viewDataCalculation, Enumerable.Empty(), Enumerable.Empty(), failureMechanism, @@ -376,7 +376,7 @@ var failureMechanism = new PipingFailureMechanism(); - var deletedCalculationContext = new PipingCalculationContext(calculation, + var deletedCalculationContext = new PipingCalculationScenarioContext(calculation, Enumerable.Empty(), Enumerable.Empty(), failureMechanism, Index: Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/ViewInfos/FailureMechanismResultViewInfoTest.cs =================================================================== diff -u -rfec99b77571cc0cf37b60f5ca257394714fde1d7 -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/ViewInfos/FailureMechanismResultViewInfoTest.cs (.../FailureMechanismResultViewInfoTest.cs) (revision fec99b77571cc0cf37b60f5ca257394714fde1d7) +++ Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/ViewInfos/FailureMechanismResultViewInfoTest.cs (.../FailureMechanismResultViewInfoTest.cs) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -233,7 +233,7 @@ } } - public override ICalculationGroup CalculationsGroup { get; protected set; } + public override CalculationGroup CalculationsGroup { get; protected set; } } } } \ No newline at end of file Index: Ringtoets/Piping/src/Ringtoets.Piping.Data/PipingCalculationScenario.cs =================================================================== diff -u -rc5f90c4f9b42d985f16f99ad8732576b9217267a -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/Piping/src/Ringtoets.Piping.Data/PipingCalculationScenario.cs (.../PipingCalculationScenario.cs) (revision c5f90c4f9b42d985f16f99ad8732576b9217267a) +++ Ringtoets/Piping/src/Ringtoets.Piping.Data/PipingCalculationScenario.cs (.../PipingCalculationScenario.cs) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -50,12 +50,30 @@ public RoundedDouble Contribution { get; set; } - public RoundedDouble? Probability + public RoundedDouble Probability { get { - return SemiProbabilisticOutput != null ? SemiProbabilisticOutput.PipingProbability : (RoundedDouble?) null; + if (CalculationScenarioStatus != CalculationScenarioStatus.Done) + { + throw new InvalidOperationException("The probability can only be accessed when the status is done."); + } + + return SemiProbabilisticOutput.PipingProbability; } } + + public CalculationScenarioStatus CalculationScenarioStatus + { + get + { + if (SemiProbabilisticOutput == null) + { + return CalculationScenarioStatus.NotCalculated; + } + + return double.IsNaN(SemiProbabilisticOutput.PipingProbability) ? CalculationScenarioStatus.Failed : CalculationScenarioStatus.Done; + } + } } } \ No newline at end of file Index: Ringtoets/Piping/src/Ringtoets.Piping.Data/PipingFailureMechanism.cs =================================================================== diff -u -rc5f90c4f9b42d985f16f99ad8732576b9217267a -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/Piping/src/Ringtoets.Piping.Data/PipingFailureMechanism.cs (.../PipingFailureMechanism.cs) (revision c5f90c4f9b42d985f16f99ad8732576b9217267a) +++ Ringtoets/Piping/src/Ringtoets.Piping.Data/PipingFailureMechanism.cs (.../PipingFailureMechanism.cs) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -71,7 +71,7 @@ /// /// Gets all available piping calculation groups. /// - public override ICalculationGroup CalculationsGroup { get; protected set; } + public override CalculationGroup CalculationsGroup { get; protected set; } /// /// Gets the available within the scope of the piping failure mechanism. Fisheye: Tag 23a37b025a5d0358c1f30fb31de41a2c284519a5 refers to a dead (removed) revision in file `Ringtoets/Piping/src/Ringtoets.Piping.Forms/PresentationObjects/PipingCalculationContext.cs'. Fisheye: No comparison available. Pass `N' to diff? Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/PresentationObjects/PipingCalculationGroupContext.cs =================================================================== diff -u -r887b289acf19a81f62d78f371ab70c3f82812b95 -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/PresentationObjects/PipingCalculationGroupContext.cs (.../PipingCalculationGroupContext.cs) (revision 887b289acf19a81f62d78f371ab70c3f82812b95) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/PresentationObjects/PipingCalculationGroupContext.cs (.../PipingCalculationGroupContext.cs) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -33,7 +33,7 @@ /// Presentation object for all data required to configure an instance of /// in order be able to create configurable piping calculations. /// - public class PipingCalculationGroupContext : PipingContext + public class PipingCalculationGroupContext : PipingContext { /// /// Initializes a new instance of the class. @@ -43,7 +43,7 @@ /// The stochastic soil models available within the piping context. /// The piping failure mechanism which the piping context belongs to. /// The assessment section which the piping context belongs to. - public PipingCalculationGroupContext(ICalculationGroup calculationGroup, IEnumerable surfaceLines, IEnumerable stochasticSoilModels, PipingFailureMechanism pipingFailureMechanism, IAssessmentSection assessmentSection) + public PipingCalculationGroupContext(CalculationGroup calculationGroup, IEnumerable surfaceLines, IEnumerable stochasticSoilModels, PipingFailureMechanism pipingFailureMechanism, IAssessmentSection assessmentSection) : base(calculationGroup, surfaceLines, stochasticSoilModels, assessmentSection) { if (pipingFailureMechanism == null) Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/PresentationObjects/PipingCalculationScenarioContext.cs =================================================================== diff -u --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/PresentationObjects/PipingCalculationScenarioContext.cs (revision 0) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/PresentationObjects/PipingCalculationScenarioContext.cs (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -0,0 +1,63 @@ +// Copyright (C) Stichting Deltares 2016. All rights reserved. +// +// This file is part of Ringtoets. +// +// Ringtoets 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 System.Collections.Generic; +using Ringtoets.Common.Data.AssessmentSection; +using Ringtoets.Piping.Data; +using Ringtoets.Piping.Forms.Properties; +using Ringtoets.Piping.Primitives; + +namespace Ringtoets.Piping.Forms.PresentationObjects +{ + /// + /// Presentation object for all data required to configure an instance of + /// in order to prepare it for performing a calculation. + /// + public class PipingCalculationScenarioContext : PipingContext + { + /// + /// Initializes a new instance of the class. + /// + /// The instance wrapped by this context object. + /// The surface lines available within the piping context. + /// The stochastic soil models available within the piping context. + /// The piping failure mechanism which the piping context belongs to. + /// The assessment section which the piping context belongs to. + public PipingCalculationScenarioContext(PipingCalculationScenario calculation, IEnumerable surfaceLines, IEnumerable stochasticSoilModels, PipingFailureMechanism pipingFailureMechanism, IAssessmentSection assessmentSection) + : base(calculation, surfaceLines, stochasticSoilModels, assessmentSection) + { + if (pipingFailureMechanism == null) + { + var message = String.Format(Resources.PipingContext_AssertInputsAreNotNull_DataDescription_0_cannot_be_null, + Resources.PipingContext_DataDescription_PipingFailureMechanism); + throw new ArgumentNullException("pipingFailureMechanism", message); + } + + PipingFailureMechanism = pipingFailureMechanism; + } + + /// + /// Gets the PipingFailureMechanism failure mechanism which the PipingFailureMechanism context belongs to. + /// + public PipingFailureMechanism PipingFailureMechanism { get; private set; } + } +} \ No newline at end of file Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/PropertyClasses/PipingCalculationContextProperties.cs =================================================================== diff -u -r4512af7782ee31b36941bb280b54d9da2953dd71 -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/PropertyClasses/PipingCalculationContextProperties.cs (.../PipingCalculationContextProperties.cs) (revision 4512af7782ee31b36941bb280b54d9da2953dd71) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/PropertyClasses/PipingCalculationContextProperties.cs (.../PipingCalculationContextProperties.cs) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -29,7 +29,7 @@ namespace Ringtoets.Piping.Forms.PropertyClasses { [ResourcesDisplayName(typeof(Resources), "PipingCalculationContextProperties_DisplayName")] - public class PipingCalculationContextProperties : ObjectProperties + public class PipingCalculationContextProperties : ObjectProperties { [ResourcesCategory(typeof(Resources), "Categories_General")] [ResourcesDisplayName(typeof(Resources), "PipingCalculation_Name_DisplayName")] Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/PropertyClasses/PipingInputContextProperties.cs =================================================================== diff -u -r4af59f05cb6ced6464d51c8dff8cb0b8bfca8edd -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/PropertyClasses/PipingInputContextProperties.cs (.../PipingInputContextProperties.cs) (revision 4af59f05cb6ced6464d51c8dff8cb0b8bfca8edd) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/PropertyClasses/PipingInputContextProperties.cs (.../PipingInputContextProperties.cs) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -64,31 +64,31 @@ #endregion /// - /// Gets the available surface lines on . + /// Gets the available surface lines on . /// public IEnumerable GetAvailableSurfaceLines() { return data.AvailablePipingSurfaceLines; } /// - /// Gets the available stochastic soil models on . + /// Gets the available stochastic soil models on . /// public IEnumerable GetAvailableStochasticSoilModels() { return PipingCalculationConfigurationHelper.GetStochasticSoilModelsForSurfaceLine(data.WrappedData.SurfaceLine, data.AvailableStochasticSoilModels); } /// - /// Gets the available stochastic soil profiles on . + /// Gets the available stochastic soil profiles on . /// public IEnumerable GetAvailableStochasticSoilProfiles() { return data.WrappedData.StochasticSoilModel != null ? data.WrappedData.StochasticSoilModel.StochasticSoilProfiles : new List(); } /// - /// Gets the available hydraulic boundary locations on . + /// Gets the available hydraulic boundary locations on . /// public IEnumerable GetAvailableHydraulicBoundaryLocations() { Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/Ringtoets.Piping.Forms.csproj =================================================================== diff -u -rabb2667229e96d5b8158981c890a5c7046e9ca66 -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/Ringtoets.Piping.Forms.csproj (.../Ringtoets.Piping.Forms.csproj) (revision abb2667229e96d5b8158981c890a5c7046e9ca66) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/Ringtoets.Piping.Forms.csproj (.../Ringtoets.Piping.Forms.csproj) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -62,7 +62,7 @@ - + Index: Ringtoets/Piping/src/Ringtoets.Piping.Plugin/PipingGuiPlugin.cs =================================================================== diff -u -re87c9b5011f0f941594f70f2384877351797d445 -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/Piping/src/Ringtoets.Piping.Plugin/PipingGuiPlugin.cs (.../PipingGuiPlugin.cs) (revision e87c9b5011f0f941594f70f2384877351797d445) +++ Ringtoets/Piping/src/Ringtoets.Piping.Plugin/PipingGuiPlugin.cs (.../PipingGuiPlugin.cs) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -66,7 +66,7 @@ public override IEnumerable GetPropertyInfos() { yield return new PropertyInfo(); - yield return new PropertyInfo(); + yield return new PropertyInfo(); yield return new PropertyInfo(); yield return new PropertyInfo(); yield return new PropertyInfo(); @@ -107,7 +107,7 @@ FailureMechanismContextMenuStrip, Gui); - yield return new TreeNodeInfo + yield return new TreeNodeInfo { Text = pipingCalculationContext => pipingCalculationContext.WrappedData.Name, Image = pipingCalculationContext => PipingFormsResources.PipingIcon, @@ -452,9 +452,9 @@ # endregion - # region PipingCalculationContext TreeNodeInfo + # region PipingCalculationScenarioContext TreeNodeInfo - private ContextMenuStrip PipingCalculationContextContextMenuStrip(PipingCalculationContext nodeData, object parentData, TreeViewControl treeViewControl) + private ContextMenuStrip PipingCalculationContextContextMenuStrip(PipingCalculationScenarioContext nodeData, object parentData, TreeViewControl treeViewControl) { PipingCalculation calculation = nodeData.WrappedData; var validateItem = new StrictContextMenuItem(RingtoetsCommonFormsResources.Validate, @@ -495,22 +495,22 @@ .Build(); } - private static object[] PipingCalculationContextChildNodeObjects(PipingCalculationContext pipingCalculationContext) + private static object[] PipingCalculationContextChildNodeObjects(PipingCalculationScenarioContext pipingCalculationScenarioContext) { var childNodes = new List { - new CommentContext(pipingCalculationContext.WrappedData), - new PipingInputContext(pipingCalculationContext.WrappedData.InputParameters, - pipingCalculationContext.WrappedData, - pipingCalculationContext.AvailablePipingSurfaceLines, - pipingCalculationContext.AvailableStochasticSoilModels, - pipingCalculationContext.PipingFailureMechanism, - pipingCalculationContext.AssessmentSection) + new CommentContext(pipingCalculationScenarioContext.WrappedData), + new PipingInputContext(pipingCalculationScenarioContext.WrappedData.InputParameters, + pipingCalculationScenarioContext.WrappedData, + pipingCalculationScenarioContext.AvailablePipingSurfaceLines, + pipingCalculationScenarioContext.AvailableStochasticSoilModels, + pipingCalculationScenarioContext.PipingFailureMechanism, + pipingCalculationScenarioContext.AssessmentSection) }; - if (pipingCalculationContext.WrappedData.HasOutput) + if (pipingCalculationScenarioContext.WrappedData.HasOutput) { - childNodes.Add(pipingCalculationContext.WrappedData.SemiProbabilisticOutput); + childNodes.Add(pipingCalculationScenarioContext.WrappedData.SemiProbabilisticOutput); childNodes.Add(new EmptyPipingCalculationReport()); } else @@ -522,27 +522,27 @@ return childNodes.ToArray(); } - private static void PipingCalculationContextOnNodeRenamed(PipingCalculationContext pipingCalculationContext, string newName) + private static void PipingCalculationContextOnNodeRenamed(PipingCalculationScenarioContext pipingCalculationScenarioContext, string newName) { - pipingCalculationContext.WrappedData.Name = newName; - pipingCalculationContext.WrappedData.NotifyObservers(); + pipingCalculationScenarioContext.WrappedData.Name = newName; + pipingCalculationScenarioContext.WrappedData.NotifyObservers(); } - private bool PipingCalculationContextCanRemove(PipingCalculationContext pipingCalculationContext, object parentNodeData) + private bool PipingCalculationContextCanRemove(PipingCalculationScenarioContext pipingCalculationScenarioContext, object parentNodeData) { var calculationGroupContext = parentNodeData as PipingCalculationGroupContext; - return calculationGroupContext != null && calculationGroupContext.WrappedData.Children.Contains(pipingCalculationContext.WrappedData); + return calculationGroupContext != null && calculationGroupContext.WrappedData.Children.Contains(pipingCalculationScenarioContext.WrappedData); } - private void PipingCalculationContextOnNodeRemoved(PipingCalculationContext pipingCalculationContext, object parentNodeData) + private void PipingCalculationContextOnNodeRemoved(PipingCalculationScenarioContext pipingCalculationScenarioContext, object parentNodeData) { var calculationGroupContext = parentNodeData as PipingCalculationGroupContext; if (calculationGroupContext != null) { - var succesfullyRemovedData = calculationGroupContext.WrappedData.Children.Remove(pipingCalculationContext.WrappedData); + var succesfullyRemovedData = calculationGroupContext.WrappedData.Children.Remove(pipingCalculationScenarioContext.WrappedData); if (succesfullyRemovedData) { - RemoveCalculationFromSectionResult(pipingCalculationContext.WrappedData, pipingCalculationContext.PipingFailureMechanism); + RemoveCalculationFromSectionResult(pipingCalculationScenarioContext.WrappedData, pipingCalculationScenarioContext.PipingFailureMechanism); calculationGroupContext.NotifyObservers(); } } @@ -574,7 +574,7 @@ if (calculation != null) { - childNodeObjects.Add(new PipingCalculationContext(calculation, + childNodeObjects.Add(new PipingCalculationScenarioContext(calculation, nodeData.AvailablePipingSurfaceLines, nodeData.AvailableStochasticSoilModels, nodeData.PipingFailureMechanism, @@ -840,7 +840,7 @@ private static ICalculationBase GetAsICalculationItem(object item) { - var calculationContext = item as PipingCalculationContext; + var calculationContext = item as PipingCalculationScenarioContext; if (calculationContext != null) { return calculationContext.WrappedData; @@ -860,7 +860,7 @@ private static PipingFailureMechanism GetParentFailureMechanism(object data) { - var calculationContext = data as PipingCalculationContext; + var calculationContext = data as PipingCalculationScenarioContext; if (calculationContext != null) { return calculationContext.PipingFailureMechanism; Index: Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/PipingCalculationScenarioTest.cs =================================================================== diff -u -rc5f90c4f9b42d985f16f99ad8732576b9217267a -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/PipingCalculationScenarioTest.cs (.../PipingCalculationScenarioTest.cs) (revision c5f90c4f9b42d985f16f99ad8732576b9217267a) +++ Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/PipingCalculationScenarioTest.cs (.../PipingCalculationScenarioTest.cs) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -19,8 +19,10 @@ // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. +using System; using Core.Common.Base.Data; using NUnit.Framework; +using Ringtoets.Common.Data.Calculation; namespace Ringtoets.Piping.Data.Test { @@ -35,14 +37,14 @@ var semiProbabilisticInputParameters = new NormProbabilityPipingInput(); // Call - var scenario = new PipingCalculationScenario(generalInputParameters, semiProbabilisticInputParameters); + PipingCalculationScenario scenario = new PipingCalculationScenario(generalInputParameters, semiProbabilisticInputParameters); // Assert Assert.IsInstanceOf(scenario); Assert.AreSame(semiProbabilisticInputParameters, scenario.NormProbabilityParameters); Assert.IsTrue(scenario.IsRelevant); Assert.AreEqual((RoundedDouble) 1.0, scenario.Contribution); - Assert.IsNull(scenario.Probability); + Assert.AreEqual(CalculationScenarioStatus.NotCalculated, scenario.CalculationScenarioStatus); } [Test] @@ -96,14 +98,14 @@ scenario.SemiProbabilisticOutput = new PipingSemiProbabilisticOutput(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, expectedProbability, 0, 0); // Call - var probability = scenario.Probability; + RoundedDouble probability = scenario.Probability; // Assert Assert.AreEqual(expectedProbability, probability); } [Test] - public void Probability_PipingOutputNull_ReturnsNull() + public void Probability_ScenarioStatusNotDOne_ThrowsInvalidOperationException() { // Setup var generalInputParameters = new GeneralPipingInput(); @@ -112,27 +114,65 @@ var scenario = new PipingCalculationScenario(generalInputParameters, semiProbabilisticInputParameters); // Call - var propability = scenario.Probability; + RoundedDouble probability; + TestDelegate call = () => probability = scenario.Probability; // Assert - Assert.IsNull(propability); + Assert.Throws(call); } [Test] - public void Probabilty_ScenarioInvalid_ReturnsNaN() + public void CalculationScenarioStatus_OutputNull_ReturnsStatusNotCalculated() { // Setup var generalInputParameters = new GeneralPipingInput(); var semiProbabilisticInputParameters = new NormProbabilityPipingInput(); var scenario = new PipingCalculationScenario(generalInputParameters, semiProbabilisticInputParameters); - scenario.SemiProbabilisticOutput = new PipingSemiProbabilisticOutput(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, double.NaN, 0, 0); // Call - var propability = scenario.Probability; + CalculationScenarioStatus status = scenario.CalculationScenarioStatus; // Assert - Assert.IsNaN(propability.Value); + Assert.AreEqual(CalculationScenarioStatus.NotCalculated, status); } + + [Test] + public void CalculationScenarioStatus_ScenarioInvalid_ReturnsStatusFailed() + { + // Setup + var generalInputParameters = new GeneralPipingInput(); + var semiProbabilisticInputParameters = new NormProbabilityPipingInput(); + + var scenario = new PipingCalculationScenario(generalInputParameters, semiProbabilisticInputParameters) + { + SemiProbabilisticOutput = new PipingSemiProbabilisticOutput(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, double.NaN, 0, 0) + }; + + // Call + CalculationScenarioStatus status = scenario.CalculationScenarioStatus; + + // Assert + Assert.AreEqual(CalculationScenarioStatus.Failed, status); + } + + [Test] + public void CalculationScenarioStatus_PipingOutputSet_ReturnsStatusDone() + { + // Setup + RoundedDouble expectedProbability = new RoundedDouble(0, 49862180); + + var generalInputParameters = new GeneralPipingInput(); + var semiProbabilisticInputParameters = new NormProbabilityPipingInput(); + + var scenario = new PipingCalculationScenario(generalInputParameters, semiProbabilisticInputParameters); + scenario.SemiProbabilisticOutput = new PipingSemiProbabilisticOutput(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, expectedProbability, 0, 0); + + // Call + CalculationScenarioStatus status = scenario.CalculationScenarioStatus; + + // Assert + Assert.AreEqual(CalculationScenarioStatus.Done, status); + } } } \ No newline at end of file Fisheye: Tag 23a37b025a5d0358c1f30fb31de41a2c284519a5 refers to a dead (removed) revision in file `Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/PresentationObjects/PipingCalculationContextTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Index: Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/PresentationObjects/PipingCalculationGroupContextTest.cs =================================================================== diff -u -rabb2667229e96d5b8158981c890a5c7046e9ca66 -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/PresentationObjects/PipingCalculationGroupContextTest.cs (.../PipingCalculationGroupContextTest.cs) (revision abb2667229e96d5b8158981c890a5c7046e9ca66) +++ Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/PresentationObjects/PipingCalculationGroupContextTest.cs (.../PipingCalculationGroupContextTest.cs) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -40,7 +40,7 @@ // Assert Assert.IsInstanceOf(groupContext); - Assert.IsInstanceOf>(groupContext); + Assert.IsInstanceOf>(groupContext); Assert.AreSame(calculationGroup, groupContext.WrappedData); Assert.AreSame(surfaceLines, groupContext.AvailablePipingSurfaceLines); Assert.AreSame(soilModels, groupContext.AvailableStochasticSoilModels); Index: Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/PresentationObjects/PipingCalculationScenarioContextTest.cs =================================================================== diff -u --- Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/PresentationObjects/PipingCalculationScenarioContextTest.cs (revision 0) +++ Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/PresentationObjects/PipingCalculationScenarioContextTest.cs (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -0,0 +1,193 @@ +using System; +using Core.Common.Base; +using Core.Common.TestUtil; +using NUnit.Framework; + +using Rhino.Mocks; +using Ringtoets.Common.Data.AssessmentSection; +using Ringtoets.Piping.Data; +using Ringtoets.Piping.Data.TestUtil; +using Ringtoets.Piping.Forms.PresentationObjects; +using Ringtoets.Piping.Primitives; + +namespace Ringtoets.Piping.Forms.Test.PresentationObjects +{ + [TestFixture] + public class PipingCalculationScenarioContextTest + { + [Test] + public void DefaultConstructor_ExpectedValues() + { + // Setup + var surfacelines = new[] + { + new RingtoetsPipingSurfaceLine() + }; + var soilModels = new[] + { + new TestStochasticSoilModel() + }; + var calculation = new PipingCalculationScenario(new GeneralPipingInput(), new NormProbabilityPipingInput()); + + var mocks = new MockRepository(); + var pipingFailureMechanismMock = mocks.StrictMock(); + var assessmentSectionMock = mocks.StrictMock(); + mocks.ReplayAll(); + + // Call + var presentationObject = new PipingCalculationScenarioContext(calculation, surfacelines, soilModels, pipingFailureMechanismMock, assessmentSectionMock); + + // Assert + Assert.IsInstanceOf(presentationObject); + Assert.IsInstanceOf>(presentationObject); + Assert.AreSame(calculation, presentationObject.WrappedData); + Assert.AreSame(surfacelines, presentationObject.AvailablePipingSurfaceLines); + Assert.AreSame(soilModels, presentationObject.AvailableStochasticSoilModels); + Assert.AreSame(pipingFailureMechanismMock, presentationObject.PipingFailureMechanism); + Assert.AreSame(assessmentSectionMock, presentationObject.AssessmentSection); + } + + [Test] + public void ParameteredConstructor_PipingFailureMechanismIsNull_ThrowArgumentNullException() + { + // Setup + var surfacelines = new[] + { + new RingtoetsPipingSurfaceLine() + }; + var soilModels = new[] + { + new TestStochasticSoilModel() + }; + var calculation = new PipingCalculationScenario(new GeneralPipingInput(), new NormProbabilityPipingInput()); + var mocks = new MockRepository(); + var assessmentSection = mocks.StrictMock(); + mocks.ReplayAll(); + + // Call + TestDelegate call = () => new PipingCalculationScenarioContext(calculation, surfacelines, soilModels, null, assessmentSection); + + // Assert + TestHelper.AssertThrowsArgumentExceptionAndTestMessage(call, "Het piping faalmechanisme mag niet 'null' zijn."); + } + + [Test] + public void ParameteredConstructor_AssessmentSectionIsNull_ThrowArgumentNullException() + { + // Setup + var surfacelines = new[] + { + new RingtoetsPipingSurfaceLine() + }; + var soilModels = new[] + { + new TestStochasticSoilModel() + }; + var calculation = new PipingCalculationScenario(new GeneralPipingInput(), new NormProbabilityPipingInput()); + var mocks = new MockRepository(); + var pipingFailureMechanismMock = mocks.StrictMock(); + mocks.ReplayAll(); + + // Call + TestDelegate call = () => new PipingCalculationScenarioContext(calculation, surfacelines, soilModels, pipingFailureMechanismMock, null); + + // Assert + TestHelper.AssertThrowsArgumentExceptionAndTestMessage(call, "Het traject mag niet 'null' zijn."); + } + + [Test] + public void Attach_Observer_ObserverAttachedToPipingCalculation() + { + // Setup + var mocks = new MockRepository(); + var pipingFailureMechanismMock = mocks.StrictMock(); + var assessmentSectionMock = mocks.StrictMock(); + var observer = mocks.StrictMock(); + observer.Expect(o => o.UpdateObserver()); + mocks.ReplayAll(); + + var surfacelines = new[] + { + new RingtoetsPipingSurfaceLine() + }; + var soilModels = new[] + { + new TestStochasticSoilModel() + }; + + var calculation = new PipingCalculationScenario(new GeneralPipingInput(), new NormProbabilityPipingInput()); + var context = new PipingCalculationScenarioContext(calculation, surfacelines, soilModels, pipingFailureMechanismMock, assessmentSectionMock); + + // Call + context.Attach(observer); + + // Assert + calculation.NotifyObservers(); // Notification on wrapped object + mocks.VerifyAll(); // Expected UpdateObserver call + } + + [Test] + public void Detach_Observer_ObserverDetachedFromPipingCalculation() + { + // Setup + var mocks = new MockRepository(); + var pipingFailureMechanismMock = mocks.StrictMock(); + var assessmentSectionMock = mocks.StrictMock(); + var observer = mocks.StrictMock(); + mocks.ReplayAll(); + + var surfacelines = new[] + { + new RingtoetsPipingSurfaceLine() + }; + var soilModels = new[] + { + new TestStochasticSoilModel() + }; + + var calculation = new PipingCalculationScenario(new GeneralPipingInput(), new NormProbabilityPipingInput()); + var context = new PipingCalculationScenarioContext(calculation, surfacelines, soilModels, pipingFailureMechanismMock, assessmentSectionMock); + + context.Attach(observer); + + // Call + context.Detach(observer); + + // Assert + calculation.NotifyObservers(); // Notification on wrapped object + mocks.VerifyAll(); // Expected no UpdateObserver call + } + + [Test] + public void NotifyObservers_ObserverAttachedToPipingCalculation_NotificationCorrectlyPropagated() + { + // Setup + var mocks = new MockRepository(); + var pipingFailureMechanismMock = mocks.StrictMock(); + var assessmentSectionMock = mocks.StrictMock(); + var observer = mocks.StrictMock(); + observer.Expect(o => o.UpdateObserver()); + mocks.ReplayAll(); + + var surfacelines = new[] + { + new RingtoetsPipingSurfaceLine() + }; + var soilModels = new[] + { + new TestStochasticSoilModel() + }; + + var calculation = new PipingCalculationScenario(new GeneralPipingInput(), new NormProbabilityPipingInput()); + var context = new PipingCalculationScenarioContext(calculation, surfacelines, soilModels, pipingFailureMechanismMock, assessmentSectionMock); + + calculation.Attach(observer); // Attach to wrapped object + + // Call + context.NotifyObservers(); // Notification on context + + // Assert + mocks.VerifyAll(); + } + } +} \ No newline at end of file Index: Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/PropertyClasses/PipingCalculationContextPropertiesTest.cs =================================================================== diff -u -rc5f90c4f9b42d985f16f99ad8732576b9217267a -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/PropertyClasses/PipingCalculationContextPropertiesTest.cs (.../PipingCalculationContextPropertiesTest.cs) (revision c5f90c4f9b42d985f16f99ad8732576b9217267a) +++ Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/PropertyClasses/PipingCalculationContextPropertiesTest.cs (.../PipingCalculationContextPropertiesTest.cs) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -21,7 +21,7 @@ var properties = new PipingCalculationContextProperties(); // Assert - Assert.IsInstanceOf>(properties); + Assert.IsInstanceOf>(properties); Assert.IsNull(properties.Data); } @@ -42,7 +42,7 @@ var properties = new PipingCalculationContextProperties { - Data = new PipingCalculationContext(calculation, + Data = new PipingCalculationScenarioContext(calculation, Enumerable.Empty(), Enumerable.Empty(), pipingFailureMechanismMock, @@ -69,7 +69,7 @@ var properties = new PipingCalculationContextProperties { - Data = new PipingCalculationContext(calculation, + Data = new PipingCalculationScenarioContext(calculation, Enumerable.Empty(), Enumerable.Empty(), pipingFailureMechanismMock, @@ -100,7 +100,7 @@ var properties = new PipingCalculationContextProperties { - Data = new PipingCalculationContext(calculation, + Data = new PipingCalculationScenarioContext(calculation, Enumerable.Empty(), Enumerable.Empty(), pipingFailureMechanismMock, Index: Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/Ringtoets.Piping.Forms.Test.csproj =================================================================== diff -u -rd515de49557312e4af41b1c051c900d39d1f9e2f -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/Ringtoets.Piping.Forms.Test.csproj (.../Ringtoets.Piping.Forms.Test.csproj) (revision d515de49557312e4af41b1c051c900d39d1f9e2f) +++ Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/Ringtoets.Piping.Forms.Test.csproj (.../Ringtoets.Piping.Forms.Test.csproj) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -76,14 +76,14 @@ - + - + Fisheye: Tag 23a37b025a5d0358c1f30fb31de41a2c284519a5 refers to a dead (removed) revision in file `Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/TreeNodeInfos/PipingCalculationContextTreeNodeInfoTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Index: Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/TreeNodeInfos/PipingCalculationGroupContextTreeNodeInfoTest.cs =================================================================== diff -u -rc5f90c4f9b42d985f16f99ad8732576b9217267a -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/TreeNodeInfos/PipingCalculationGroupContextTreeNodeInfoTest.cs (.../PipingCalculationGroupContextTreeNodeInfoTest.cs) (revision c5f90c4f9b42d985f16f99ad8732576b9217267a) +++ Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/TreeNodeInfos/PipingCalculationGroupContextTreeNodeInfoTest.cs (.../PipingCalculationGroupContextTreeNodeInfoTest.cs) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -195,7 +195,7 @@ // Assert Assert.AreEqual(group.Children.Count, children.Length); Assert.AreSame(calculationItem, children[0]); - var returnedCalculationContext = (PipingCalculationContext) children[1]; + var returnedCalculationContext = (PipingCalculationScenarioContext) children[1]; Assert.AreSame(childCalculation, returnedCalculationContext.WrappedData); Assert.AreSame(pipingFailureMechanismMock, returnedCalculationContext.PipingFailureMechanism); var returnedCalculationGroupContext = (PipingCalculationGroupContext) children[2]; @@ -710,7 +710,7 @@ assessmentSectionMock); var calculationItem = mocks.Stub(); - calculationItem.Name = "Nieuwe map"; + calculationItem.Stub(ci => ci.Name).Return("Nieuwe map"); var observer = mocks.StrictMock(); observer.Expect(o => o.UpdateObserver()); @@ -761,7 +761,7 @@ assessmentSectionMock); var calculationItem = mocks.Stub(); - calculationItem.Name = "Nieuwe berekening"; + calculationItem.Stub(ci => ci.Name).Return("Nieuwe berekening"); var observer = mocks.StrictMock(); observer.Expect(o => o.UpdateObserver()); @@ -1736,7 +1736,7 @@ CreatePipingCalculationAndContext(draggedItemType, out draggedItem, out draggedItemContext, pipingFailureMechanismMock, assessmentSection, name); var existingItemStub = mocks.Stub(); - existingItemStub.Name = ""; + existingItemStub.Stub(ci => ci.Name).Return(""); CalculationGroup originalOwnerGroup; PipingCalculationGroupContext originalOwnerGroupContext; @@ -1794,7 +1794,7 @@ CreatePipingCalculationGroupAndContext(out newOwnerGroup, out newOwnerGroupContext, pipingFailureMechanismMock, assessmentSection); var sameNamedItem = mocks.Stub(); - sameNamedItem.Name = draggedItem.Name; + sameNamedItem.Stub(sni => sni.Name).Return(draggedItem.Name); var originalOwnerObserver = mocks.StrictMock(); originalOwnerObserver.Expect(o => o.UpdateObserver()); @@ -1885,7 +1885,7 @@ calculation.Name = initialName; } data = calculation; - dataContext = new PipingCalculationContext(calculation, + dataContext = new PipingCalculationScenarioContext(calculation, Enumerable.Empty(), Enumerable.Empty(), pipingFailureMechanism, Index: Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/TreeNodeInfos/PipingCalculationScenarioContextTreeNodeInfoTest.cs =================================================================== diff -u --- Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/TreeNodeInfos/PipingCalculationScenarioContextTreeNodeInfoTest.cs (revision 0) +++ Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/TreeNodeInfos/PipingCalculationScenarioContextTreeNodeInfoTest.cs (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -0,0 +1,835 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Core.Common.Base; +using Core.Common.Base.Geometry; +using Core.Common.Controls.TreeView; +using Core.Common.Gui; +using Core.Common.Gui.ContextMenu; +using Core.Common.Gui.Forms.MainWindow; +using Core.Common.Gui.TestUtil.ContextMenu; +using Core.Common.TestUtil; +using NUnit.Extensions.Forms; +using NUnit.Framework; +using Rhino.Mocks; +using Ringtoets.Common.Data; +using Ringtoets.Common.Data.AssessmentSection; +using Ringtoets.Common.Data.Calculation; +using Ringtoets.Common.Data.FailureMechanism; +using Ringtoets.Common.Forms.PresentationObjects; +using Ringtoets.Piping.Data; +using Ringtoets.Piping.Data.TestUtil; +using Ringtoets.Piping.Forms.PresentationObjects; +using Ringtoets.Piping.KernelWrapper.TestUtil; +using Ringtoets.Piping.Plugin; +using Ringtoets.Piping.Primitives; +using PipingFormsResources = Ringtoets.Piping.Forms.Properties.Resources; +using RingtoetsCommonFormsResources = Ringtoets.Common.Forms.Properties.Resources; + +namespace Ringtoets.Piping.Forms.Test.TreeNodeInfos +{ + [TestFixture] + public class PipingCalculationScenarioContextTreeNodeInfoTest : NUnitFormTest + { + private MockRepository mocks; + private PipingGuiPlugin plugin; + private TreeNodeInfo info; + + [SetUp] + public void SetUp() + { + mocks = new MockRepository(); + plugin = new PipingGuiPlugin(); + info = plugin.GetTreeNodeInfos().First(tni => tni.TagType == typeof(PipingCalculationScenarioContext)); + } + + [Test] + public void Initialized_Always_ExpectedPropertiesSet() + { + // Assert + Assert.AreEqual(typeof(PipingCalculationScenarioContext), info.TagType); + Assert.IsNull(info.ForeColor); + Assert.IsNull(info.CanCheck); + Assert.IsNull(info.IsChecked); + Assert.IsNull(info.OnNodeChecked); + Assert.IsNull(info.CanDrop); + Assert.IsNull(info.CanInsert); + Assert.IsNull(info.OnDrop); + } + + [Test] + public void Text_Always_ReturnsWrappedDataName() + { + // Setup + var testname = "testName"; + var calculation = new PipingCalculationScenario(new GeneralPipingInput(), new NormProbabilityPipingInput()) + { + Name = testname + }; + + var pipingFailureMechanismMock = mocks.StrictMock(); + var assessmentSectionMock = mocks.StrictMock(); + mocks.ReplayAll(); + + var pipingCalculationContext = new PipingCalculationScenarioContext(calculation, + new[] + { + new RingtoetsPipingSurfaceLine() + }, + new[] + { + new TestStochasticSoilModel(), + }, + pipingFailureMechanismMock, + assessmentSectionMock); + // Call + var text = info.Text(pipingCalculationContext); + + // Assert + Assert.AreEqual(testname, text); + + mocks.VerifyAll(); + } + + [Test] + public void Image_Always_ReturnsPlaceHolderIcon() + { + // Call + var image = info.Image(null); + + // Assert + TestHelper.AssertImagesAreEqual(PipingFormsResources.PipingIcon, image); + } + + [Test] + public void EnsureVisibleOnCreate_Always_ReturnsTrue() + { + // Setup + var calculation = new PipingCalculationScenario(new GeneralPipingInput(), new NormProbabilityPipingInput()) + { + Output = new PipingOutput(0.0, 0.0, 0.0, 0.0, 0.0, 0.0) + }; + + var pipingFailureMechanismMock = mocks.StrictMock(); + var assessmentSectionMock = mocks.StrictMock(); + mocks.ReplayAll(); + + var pipingCalculationContext = new PipingCalculationScenarioContext(calculation, + new[] + { + new RingtoetsPipingSurfaceLine() + }, + new[] + { + new TestStochasticSoilModel() + }, + pipingFailureMechanismMock, + assessmentSectionMock); + + mocks.ReplayAll(); + + // Call + var result = info.EnsureVisibleOnCreate(pipingCalculationContext); + + // Assert + Assert.IsTrue(result); + + mocks.VerifyAll(); + } + + [Test] + public void ChildNodeObjects_WithOutputData_ReturnOutputChildNode() + { + // Setup + var calculation = new PipingCalculationScenario(new GeneralPipingInput(), new NormProbabilityPipingInput()) + { + Output = new PipingOutput(0.0, 0.0, 0.0, 0.0, 0.0, 0.0) + }; + + var pipingFailureMechanismMock = mocks.StrictMock(); + var assessmentSectionMock = mocks.StrictMock(); + mocks.ReplayAll(); + + var pipingCalculationContext = new PipingCalculationScenarioContext(calculation, + new[] + { + new RingtoetsPipingSurfaceLine() + }, + new[] + { + new TestStochasticSoilModel() + }, + pipingFailureMechanismMock, + assessmentSectionMock); + + // Call + var children = info.ChildNodeObjects(pipingCalculationContext).ToArray(); + + // Assert + Assert.AreEqual(4, children.Length); + var commentContext = children[0] as CommentContext; + Assert.IsNotNull(commentContext); + Assert.AreSame(pipingCalculationContext.WrappedData, commentContext.CommentContainer); + + var pipingInputContext = (PipingInputContext) children[1]; + Assert.AreSame(pipingCalculationContext.WrappedData.InputParameters, pipingInputContext.WrappedData); + CollectionAssert.AreEqual(pipingCalculationContext.AvailablePipingSurfaceLines, pipingInputContext.AvailablePipingSurfaceLines); + CollectionAssert.AreEqual(pipingCalculationContext.AvailableStochasticSoilModels, pipingInputContext.AvailableStochasticSoilModels); + Assert.AreSame(pipingCalculationContext.WrappedData.SemiProbabilisticOutput, children[2]); + Assert.IsInstanceOf(children[3]); + } + + [Test] + public void ChildNodeObjects_WithoutOutput_ReturnNoChildNodes() + { + // Setup + var pipingFailureMechanismMock = mocks.StrictMock(); + var assessmentSectionMock = mocks.StrictMock(); + mocks.ReplayAll(); + + var pipingCalculationContext = new PipingCalculationScenarioContext(new PipingCalculationScenario(new GeneralPipingInput(), new NormProbabilityPipingInput()), + Enumerable.Empty(), + Enumerable.Empty(), + pipingFailureMechanismMock, + assessmentSectionMock); + + // Precondition + Assert.IsFalse(pipingCalculationContext.WrappedData.HasOutput); + + // Call + var children = info.ChildNodeObjects(pipingCalculationContext).ToArray(); + + // Assert + Assert.AreEqual(4, children.Length); + var commentContext = children[0] as CommentContext; + Assert.IsNotNull(commentContext); + Assert.AreSame(pipingCalculationContext.WrappedData, commentContext.CommentContainer); + + var pipingInputContext = (PipingInputContext) children[1]; + Assert.AreSame(pipingCalculationContext.WrappedData.InputParameters, pipingInputContext.WrappedData); + CollectionAssert.AreEqual(pipingCalculationContext.AvailablePipingSurfaceLines, pipingInputContext.AvailablePipingSurfaceLines); + CollectionAssert.AreEqual(pipingCalculationContext.AvailableStochasticSoilModels, pipingInputContext.AvailableStochasticSoilModels); + + Assert.IsInstanceOf(children[2]); + Assert.IsInstanceOf(children[3]); + } + + [Test] + public void CanRenameNode_Always_ReturnTrue() + { + // Call + var renameAllowed = info.CanRename(null, null); + + // Assert + Assert.IsTrue(renameAllowed); + } + + [Test] + public void OnNodeRenamed_Always_SetNewNameToPipingCalculationScenario() + { + // Setup + var observerMock = mocks.StrictMock(); + observerMock.Expect(o => o.UpdateObserver()); + + var calculation = new PipingCalculationScenario(new GeneralPipingInput(), new NormProbabilityPipingInput()) + { + Name = "" + }; + + var pipingFailureMechanismMock = mocks.StrictMock(); + var assessmentSectionMock = mocks.StrictMock(); + mocks.ReplayAll(); + + var pipingCalculationsInputs = new PipingCalculationScenarioContext(calculation, + Enumerable.Empty(), + Enumerable.Empty(), + pipingFailureMechanismMock, + assessmentSectionMock); + pipingCalculationsInputs.Attach(observerMock); + + // Call + const string newName = ""; + info.OnNodeRenamed(pipingCalculationsInputs, newName); + + // Assert + Assert.AreEqual(newName, calculation.Name); + mocks.VerifyAll(); + } + + [Test] + public void CanDrag_Always_ReturnTrue() + { + // Call + var canDrag = info.CanDrag(null, null); + + // Assert + Assert.IsTrue(canDrag); + } + + [Test] + public void ContextMenuStrip_PipingCalculationWithoutOutput_ContextMenuItemClearOutputDisabled() + { + // Setup + var gui = mocks.StrictMock(); + var treeViewControlMock = mocks.StrictMock(); + var calculation = new PipingCalculationScenario(new GeneralPipingInput(), new NormProbabilityPipingInput()); + var pipingFailureMechanismMock = mocks.StrictMock(); + var assessmentSectionMock = mocks.StrictMock(); + var nodeData = new PipingCalculationScenarioContext(calculation, + Enumerable.Empty(), + Enumerable.Empty(), + pipingFailureMechanismMock, + assessmentSectionMock); + + gui.Expect(cmp => cmp.Get(nodeData, treeViewControlMock)).Return(new CustomItemsOnlyContextMenuBuilder()); + + mocks.ReplayAll(); + + plugin.Gui = gui; + + // Call + var contextMenu = info.ContextMenuStrip(nodeData, null, treeViewControlMock); + + // Assert + mocks.VerifyAll(); // Expect no calls on arguments + + TestHelper.AssertContextMenuStripContainsItem(contextMenu, 0, RingtoetsCommonFormsResources.Validate, RingtoetsCommonFormsResources.Validate_ToolTip, RingtoetsCommonFormsResources.ValidateIcon); + TestHelper.AssertContextMenuStripContainsItem(contextMenu, 1, RingtoetsCommonFormsResources.Calculate, RingtoetsCommonFormsResources.Calculate_ToolTip, RingtoetsCommonFormsResources.CalculateIcon); + TestHelper.AssertContextMenuStripContainsItem(contextMenu, 2, PipingFormsResources.Clear_output, PipingFormsResources.ClearOutput_No_output_to_clear, RingtoetsCommonFormsResources.ClearIcon, false); + } + + [Test] + public void ContextMenuStrip_PipingCalculationWithOutput_ContextMenuItemClearOutputEnabled() + { + var gui = mocks.StrictMock(); + var treeViewControlMock = mocks.StrictMock(); + var calculation = new PipingCalculationScenario(new GeneralPipingInput(), new NormProbabilityPipingInput()) + { + Output = new TestPipingOutput() + }; + var pipingFailureMechanismMock = mocks.StrictMock(); + var assessmentSectionMock = mocks.StrictMock(); + var nodeData = new PipingCalculationScenarioContext(calculation, + Enumerable.Empty(), + Enumerable.Empty(), + pipingFailureMechanismMock, + assessmentSectionMock); + + gui.Expect(cmp => cmp.Get(nodeData, treeViewControlMock)).Return(new CustomItemsOnlyContextMenuBuilder()); + + mocks.ReplayAll(); + + plugin.Gui = gui; + + // Call + var contextMenu = info.ContextMenuStrip(nodeData, null, treeViewControlMock); + + // Assert + mocks.VerifyAll(); // Expect no calls on arguments + + TestHelper.AssertContextMenuStripContainsItem(contextMenu, 0, RingtoetsCommonFormsResources.Validate, RingtoetsCommonFormsResources.Validate_ToolTip, RingtoetsCommonFormsResources.ValidateIcon); + TestHelper.AssertContextMenuStripContainsItem(contextMenu, 1, RingtoetsCommonFormsResources.Calculate, RingtoetsCommonFormsResources.Calculate_ToolTip, RingtoetsCommonFormsResources.CalculateIcon); + TestHelper.AssertContextMenuStripContainsItem(contextMenu, 2, PipingFormsResources.Clear_output, PipingFormsResources.Clear_output_ToolTip, RingtoetsCommonFormsResources.ClearIcon); + } + + [Test] + public void ContextMenuStrip_Always_CallsContextMenuBuilderMethods() + { + // Setup + var gui = mocks.StrictMock(); + var menuBuilderMock = mocks.Stub(); + var treeViewControlMock = mocks.StrictMock(); + var pipingFailureMechanismMock = mocks.StrictMock(); + var assessmentSectionMock = mocks.StrictMock(); + var nodeData = new PipingCalculationScenarioContext(new PipingCalculationScenario(new GeneralPipingInput(), new NormProbabilityPipingInput()), + Enumerable.Empty(), + Enumerable.Empty(), + pipingFailureMechanismMock, + assessmentSectionMock); + + menuBuilderMock.Expect(mb => mb.AddCustomItem(null)).IgnoreArguments().Return(menuBuilderMock); + menuBuilderMock.Expect(mb => mb.AddCustomItem(null)).IgnoreArguments().Return(menuBuilderMock); + menuBuilderMock.Expect(mb => mb.AddCustomItem(null)).IgnoreArguments().Return(menuBuilderMock); + menuBuilderMock.Expect(mb => mb.AddSeparator()).Return(menuBuilderMock); + menuBuilderMock.Expect(mb => mb.AddRenameItem()).Return(menuBuilderMock); + menuBuilderMock.Expect(mb => mb.AddDeleteItem()).Return(menuBuilderMock); + menuBuilderMock.Expect(mb => mb.AddSeparator()).Return(menuBuilderMock); + menuBuilderMock.Expect(mb => mb.AddImportItem()).Return(menuBuilderMock); + menuBuilderMock.Expect(mb => mb.AddExportItem()).Return(menuBuilderMock); + menuBuilderMock.Expect(mb => mb.AddSeparator()).Return(menuBuilderMock); + menuBuilderMock.Expect(mb => mb.AddExpandAllItem()).Return(menuBuilderMock); + menuBuilderMock.Expect(mb => mb.AddCollapseAllItem()).Return(menuBuilderMock); + menuBuilderMock.Expect(mb => mb.AddSeparator()).Return(menuBuilderMock); + menuBuilderMock.Expect(mb => mb.AddPropertiesItem()).Return(menuBuilderMock); + menuBuilderMock.Expect(mb => mb.Build()).Return(null); + + gui.Expect(cmp => cmp.Get(nodeData, treeViewControlMock)).Return(menuBuilderMock); + + mocks.ReplayAll(); + + plugin.Gui = gui; + + // Call + info.ContextMenuStrip(nodeData, null, treeViewControlMock); + + // Assert + mocks.VerifyAll(); // Expect no calls on arguments + } + + [Test] + [TestCase(true)] + [TestCase(false)] + public void CanRemove_ParentIsCalculationGroupWithCalculation_ReturnTrue(bool groupNameEditable) + { + // Setup + var calculationToBeRemoved = new PipingCalculationScenario(new GeneralPipingInput(), new NormProbabilityPipingInput()); + var group = new CalculationGroup("", groupNameEditable); + group.Children.Add(calculationToBeRemoved); + + var pipingFailureMechanismMock = mocks.StrictMock(); + var assessmentSectionMock = mocks.StrictMock(); + mocks.ReplayAll(); + + var calculationContext = new PipingCalculationScenarioContext(calculationToBeRemoved, + Enumerable.Empty(), + Enumerable.Empty(), + pipingFailureMechanismMock, + assessmentSectionMock); + var groupContext = new PipingCalculationGroupContext(group, + Enumerable.Empty(), + Enumerable.Empty(), + pipingFailureMechanismMock, + assessmentSectionMock); + + // Call + bool removalAllowed = info.CanRemove(calculationContext, groupContext); + + // Assert + Assert.IsTrue(removalAllowed); + } + + [Test] + [TestCase(true)] + [TestCase(false)] + public void CanRemove_ParentIsCalculationGroupWithoutCalculation_ReturnFalse(bool groupNameEditable) + { + // Setup + var calculationToBeRemoved = new PipingCalculationScenario(new GeneralPipingInput(), new NormProbabilityPipingInput()); + var group = new CalculationGroup("", groupNameEditable); + + var pipingFailureMechanismMock = mocks.StrictMock(); + var assessmentSectionMock = mocks.StrictMock(); + mocks.ReplayAll(); + + var calculationContext = new PipingCalculationScenarioContext(calculationToBeRemoved, + Enumerable.Empty(), + Enumerable.Empty(), + pipingFailureMechanismMock, + assessmentSectionMock); + var groupContext = new PipingCalculationGroupContext(group, + Enumerable.Empty(), + Enumerable.Empty(), + pipingFailureMechanismMock, + assessmentSectionMock); + + // Call + bool removalAllowed = info.CanRemove(calculationContext, groupContext); + + // Assert + Assert.IsFalse(removalAllowed); + } + + [Test] + public void CanRemove_EverythingElse_ReturnFalse() + { + // Setup + var dataMock = mocks.StrictMock(); + var pipingFailureMechanismMock = mocks.StrictMock(); + var assessmentSectionMock = mocks.StrictMock(); + mocks.ReplayAll(); + + var nodeMock = new PipingCalculationScenarioContext(new PipingCalculationScenario(new GeneralPipingInput(), new NormProbabilityPipingInput()), + Enumerable.Empty(), + Enumerable.Empty(), + pipingFailureMechanismMock, + assessmentSectionMock); + + // Call + bool removalAllowed = info.CanRemove(nodeMock, dataMock); + + // Assert + Assert.IsFalse(removalAllowed); + mocks.VerifyAll(); // Expect no calls on arguments + } + + [Test] + [TestCase(true)] + [TestCase(false)] + public void OnNodeRemoved_ParentIsPipingCalculationGroupContext_RemoveCalculationFromGroup(bool groupNameEditable) + { + // Setup + var observer = mocks.StrictMock(); + observer.Expect(o => o.UpdateObserver()); + + var elementToBeRemoved = new PipingCalculationScenario(new GeneralPipingInput(), new NormProbabilityPipingInput()); + + var group = new CalculationGroup("", groupNameEditable); + group.Children.Add(elementToBeRemoved); + group.Children.Add(new PipingCalculationScenario(new GeneralPipingInput(), new NormProbabilityPipingInput())); + group.Attach(observer); + + var pipingFailureMechanismMock = mocks.StrictMock(); + var assessmentSectionMock = mocks.StrictMock(); + mocks.ReplayAll(); + + var calculationContext = new PipingCalculationScenarioContext(elementToBeRemoved, + Enumerable.Empty(), + Enumerable.Empty(), + pipingFailureMechanismMock, + assessmentSectionMock); + var groupContext = new PipingCalculationGroupContext(group, + Enumerable.Empty(), + Enumerable.Empty(), + pipingFailureMechanismMock, + assessmentSectionMock); + + // Precondition + Assert.IsTrue(info.CanRemove(calculationContext, groupContext)); + Assert.AreEqual(2, group.Children.Count); + + // Call + info.OnNodeRemoved(calculationContext, groupContext); + + // Assert + Assert.AreEqual(1, group.Children.Count); + CollectionAssert.DoesNotContain(group.Children, elementToBeRemoved); + + mocks.VerifyAll(); + } + + [Test] + [TestCase(true)] + [TestCase(false)] + public void OnNodeRemoved_ParentIsPipingCalculationGroupContext_RemoveCalculationFromSectionResult(bool groupNameEditable) + { + // Setup + var observer = mocks.StrictMock(); + observer.Expect(o => o.UpdateObserver()); + + var pipingFailureMechanism = GetFailureMechanism(); + var surfaceLines = pipingFailureMechanism.SurfaceLines.ToArray(); + + var elementToBeRemoved = new PipingCalculationScenario(new GeneralPipingInput(), new NormProbabilityPipingInput()) + { + InputParameters = + { + SurfaceLine = surfaceLines[0] + } + }; + + var group = new CalculationGroup("", groupNameEditable); + group.Children.Add(elementToBeRemoved); + group.Children.Add(new PipingCalculationScenario(new GeneralPipingInput(), new NormProbabilityPipingInput())); + group.Attach(observer); + + var assessmentSectionMock = mocks.StrictMock(); + mocks.ReplayAll(); + + var calculationContext = new PipingCalculationScenarioContext(elementToBeRemoved, + Enumerable.Empty(), + Enumerable.Empty(), + pipingFailureMechanism, + assessmentSectionMock); + var groupContext = new PipingCalculationGroupContext(group, + Enumerable.Empty(), + Enumerable.Empty(), + pipingFailureMechanism, + assessmentSectionMock); + + group.AddCalculationScenariosToFailureMechanismSectionResult(pipingFailureMechanism); + + // Precondition + Assert.IsTrue(info.CanRemove(calculationContext, groupContext)); + Assert.AreEqual(2, group.Children.Count); + var sectionResults = pipingFailureMechanism.SectionResults.ToArray(); + CollectionAssert.Contains(sectionResults[0].CalculationScenarios, elementToBeRemoved); + + // Call + info.OnNodeRemoved(calculationContext, groupContext); + + // Assert + Assert.AreEqual(1, group.Children.Count); + CollectionAssert.DoesNotContain(group.Children, elementToBeRemoved); + CollectionAssert.DoesNotContain(sectionResults[0].CalculationScenarios, elementToBeRemoved); + + mocks.VerifyAll(); + } + + [Test] + public void GivenInvalidPipingCalculation_WhenCalculatingFromContextMenu_ThenPipingCalculationNotifiesObserversAndLogMessageAdded() + { + // Given + var gui = mocks.DynamicMock(); + var mainWindow = mocks.DynamicMock(); + var observer = mocks.StrictMock(); + var treeViewControlMock = mocks.StrictMock(); + var calculation = new PipingCalculationScenario(new GeneralPipingInput(), new NormProbabilityPipingInput()); + var pipingFailureMechanismMock = mocks.StrictMock(); + var assessmentSectionMock = mocks.StrictMock(); + var pipingCalculationContext = new PipingCalculationScenarioContext(calculation, + Enumerable.Empty(), + Enumerable.Empty(), + pipingFailureMechanismMock, + assessmentSectionMock); + + observer.Expect(o => o.UpdateObserver()); + + gui.Expect(cmp => cmp.Get(pipingCalculationContext, treeViewControlMock)).Return(new CustomItemsOnlyContextMenuBuilder()); + gui.Expect(g => g.MainWindow).Return(mainWindow); + + var expectedValidationMessageCount = 2; // No surfaceline or soil profile selected for calculation + var calculateContextMenuItemIndex = 1; + + mocks.ReplayAll(); + + plugin.Gui = gui; + + calculation.Attach(observer); + + var contextMenuAdapter = info.ContextMenuStrip(pipingCalculationContext, null, treeViewControlMock); + + DialogBoxHandler = (name, wnd) => + { + // Don't care about dialogs in this test. + }; + + // When + Action action = () => { contextMenuAdapter.Items[calculateContextMenuItemIndex].PerformClick(); }; + + // Then + TestHelper.AssertLogMessages(action, messages => + { + var msgs = messages.GetEnumerator(); + Assert.IsTrue(msgs.MoveNext()); + StringAssert.StartsWith("Validatie van 'Nieuwe berekening' gestart om: ", msgs.Current); + for (int i = 0; i < expectedValidationMessageCount; i++) + { + Assert.IsTrue(msgs.MoveNext()); + StringAssert.StartsWith("Validatie mislukt: ", msgs.Current); + } + Assert.IsTrue(msgs.MoveNext()); + StringAssert.StartsWith("Validatie van 'Nieuwe berekening' beëindigd om: ", msgs.Current); + }); + Assert.IsNull(calculation.Output); + + mocks.VerifyAll(); + } + + [Test] + public void GivenInvalidPipingCalculation_WhenValidatingFromContextMenu_ThenLogMessageAddedAndNoNotifyObserver() + { + // Given + var gui = mocks.DynamicMock(); + var observer = mocks.StrictMock(); + var treeViewControlMock = mocks.StrictMock(); + var calculation = new PipingCalculationScenario(new GeneralPipingInput(), new NormProbabilityPipingInput()); + var pipingFailureMechanismMock = mocks.StrictMock(); + var assessmentSectionMock = mocks.StrictMock(); + var pipingCalculationContext = new PipingCalculationScenarioContext(calculation, + Enumerable.Empty(), + Enumerable.Empty(), + pipingFailureMechanismMock, + assessmentSectionMock); + + gui.Expect(cmp => cmp.Get(pipingCalculationContext, treeViewControlMock)).Return(new CustomItemsOnlyContextMenuBuilder()); + + var expectedValidationMessageCount = 2; // No surfaceline or soil profile selected for calculation + var expectedStatusMessageCount = 2; + var expectedLogMessageCount = expectedValidationMessageCount + expectedStatusMessageCount; + + var validateContextMenuItemIndex = 0; + observer.Expect(o => o.UpdateObserver()).Repeat.Never(); + + mocks.ReplayAll(); + + plugin.Gui = gui; + + calculation.Attach(observer); + + var contextMenuAdapter = info.ContextMenuStrip(pipingCalculationContext, null, treeViewControlMock); + + // When + Action action = () => contextMenuAdapter.Items[validateContextMenuItemIndex].PerformClick(); + + // Then + TestHelper.AssertLogMessagesCount(action, expectedLogMessageCount); + + mocks.VerifyAll(); + } + + [Test] + public void GivenValidPipingCalculation_WhenCalculatingFromContextMenu_ThenPipingCalculationNotifiesObservers() + { + // Given + var gui = mocks.DynamicMock(); + var mainWindow = mocks.DynamicMock(); + var observer = mocks.StrictMock(); + var treeViewControlMock = mocks.StrictMock(); + var calculateContextMenuItemIndex = 1; + var calculation = PipingCalculationFactory.CreateCalculationWithValidInput(); + var pipingFailureMechanismMock = mocks.StrictMock(); + var assessmentSectionMock = mocks.StrictMock(); + var pipingCalculationContext = new PipingCalculationScenarioContext(calculation, + Enumerable.Empty(), + Enumerable.Empty(), + pipingFailureMechanismMock, + assessmentSectionMock); + + gui.Expect(g => g.Get(pipingCalculationContext, treeViewControlMock)).Return(new CustomItemsOnlyContextMenuBuilder()); + gui.Expect(g => g.MainWindow).Return(mainWindow); + + observer.Expect(o => o.UpdateObserver()); + + mocks.ReplayAll(); + + plugin.Gui = gui; + + calculation.Attach(observer); + + var contextMenuAdapter = info.ContextMenuStrip(pipingCalculationContext, null, treeViewControlMock); + + DialogBoxHandler = (name, wnd) => + { + // Don't care about dialogs in this test. + }; + + // When + Action action = () => { contextMenuAdapter.Items[calculateContextMenuItemIndex].PerformClick(); }; + + // Then + TestHelper.AssertLogMessages(action, messages => + { + var msgs = messages.GetEnumerator(); + Assert.IsTrue(msgs.MoveNext()); + StringAssert.StartsWith("Validatie van 'Nieuwe berekening' gestart om: ", msgs.Current); + Assert.IsTrue(msgs.MoveNext()); + StringAssert.StartsWith("Validatie van 'Nieuwe berekening' beëindigd om: ", msgs.Current); + + Assert.IsTrue(msgs.MoveNext()); + StringAssert.StartsWith("Berekening van 'Nieuwe berekening' gestart om: ", msgs.Current); + Assert.IsTrue(msgs.MoveNext()); + StringAssert.StartsWith("Berekening van 'Nieuwe berekening' beëindigd om: ", msgs.Current); + }); + Assert.IsNotNull(calculation.Output); + + mocks.VerifyAll(); + } + + [Test] + [TestCase(true)] + [TestCase(false)] + public void GivenPipingCalculationWithOutput_WhenClearingOutputFromContextMenu_ThenPipingCalculationOutputClearedAndNotified(bool confirm) + { + // Given + var gui = mocks.DynamicMock(); + var observer = mocks.StrictMock(); + var treeViewControlMock = mocks.StrictMock(); + var calculation = new PipingCalculationScenario(new GeneralPipingInput(), new NormProbabilityPipingInput()); + var pipingFailureMechanismMock = mocks.StrictMock(); + var assessmentSectionMock = mocks.StrictMock(); + var pipingCalculationContext = new PipingCalculationScenarioContext(calculation, + Enumerable.Empty(), + Enumerable.Empty(), + pipingFailureMechanismMock, + assessmentSectionMock); + + gui.Expect(cmp => cmp.Get(pipingCalculationContext, treeViewControlMock)).Return(new CustomItemsOnlyContextMenuBuilder()); + + int clearOutputItemPosition = 2; + if (confirm) + { + observer.Expect(o => o.UpdateObserver()); + } + + mocks.ReplayAll(); + + plugin.Gui = gui; + + calculation.Output = new TestPipingOutput(); + calculation.Attach(observer); + + var contextMenuAdapter = info.ContextMenuStrip(pipingCalculationContext, null, treeViewControlMock); + + string messageBoxText = null, messageBoxTitle = null; + DialogBoxHandler = (name, wnd) => + { + var messageBox = new MessageBoxTester(wnd); + messageBoxText = messageBox.Text; + messageBoxTitle = messageBox.Title; + if (confirm) + { + messageBox.ClickOk(); + } + else + { + messageBox.ClickCancel(); + } + }; + + // When + contextMenuAdapter.Items[clearOutputItemPosition].PerformClick(); + + // Then + Assert.AreNotEqual(confirm, calculation.HasOutput); + Assert.AreEqual("Bevestigen", messageBoxTitle); + Assert.AreEqual("Weet u zeker dat u de uitvoer van deze berekening wilt wissen?", messageBoxText); + mocks.VerifyAll(); + } + + /// + /// Creates a new instance of with sections and a surface line. + /// + /// A new instance of . + private static PipingFailureMechanism GetFailureMechanism() + { + var surfaceLine = new RingtoetsPipingSurfaceLine + { + Name = "Surface line", + ReferenceLineIntersectionWorldPoint = new Point2D(0.0, 0.0) + }; + + surfaceLine.SetGeometry(new[] + { + new Point3D(0.0, 5.0, 0.0), + new Point3D(0.0, 0.0, 1.0), + new Point3D(0.0, -5.0, 0.0) + }); + + var failureMechanism = new PipingFailureMechanism + { + SurfaceLines = + { + surfaceLine + }, + StochasticSoilModels = + { + new TestStochasticSoilModel + { + Geometry = + { + new Point2D(0.0, 0.0), new Point2D(5.0, 0.0) + }, + } + } + }; + + failureMechanism.AddSection(new FailureMechanismSection("Section", new List + { + new Point2D(0.0, 0.0), + new Point2D(5.0, 0.0) + })); + + return failureMechanism; + } + } +} \ No newline at end of file Index: Ringtoets/Piping/test/Ringtoets.Piping.Integration.Test/FailureMechanismResultViewIntegrationTest.cs =================================================================== diff -u -rc5f90c4f9b42d985f16f99ad8732576b9217267a -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/Piping/test/Ringtoets.Piping.Integration.Test/FailureMechanismResultViewIntegrationTest.cs (.../FailureMechanismResultViewIntegrationTest.cs) (revision c5f90c4f9b42d985f16f99ad8732576b9217267a) +++ Ringtoets/Piping/test/Ringtoets.Piping.Integration.Test/FailureMechanismResultViewIntegrationTest.cs (.../FailureMechanismResultViewIntegrationTest.cs) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -79,7 +79,7 @@ nestedPipingCalculationGroup.NotifyObservers(); assessmentSection.PipingFailureMechanism.CalculationsGroup.AddCalculationScenariosToFailureMechanismSectionResult(assessmentSection.PipingFailureMechanism); Assert.AreEqual(double.NaN.ToString(CultureInfo.InvariantCulture), dataGridView.Rows[22].Cells[assessmentLayerTwoAIndex].FormattedValue); - Assert.AreEqual("Bijdrage van de geselecteerde scenario's voor dit vak zijn opgeteld niet gelijk aan 100%", dataGridView.Rows[22].Cells[assessmentLayerTwoAIndex].ErrorText); + Assert.AreEqual("Bijdrage van de geselecteerde scenario's voor dit vak zijn opgeteld niet gelijk aan 100%.", dataGridView.Rows[22].Cells[assessmentLayerTwoAIndex].ErrorText); // Set the second calculation to not relevant and ensure the data grid view is updated pipingCalculation2.IsRelevant = false; @@ -106,13 +106,13 @@ PipingCalculationScenarioService.SyncCalculationScenarioWithNewSurfaceLine(pipingCalculation3, assessmentSection.PipingFailureMechanism, null); pipingCalculation3.InputParameters.NotifyObservers(); Assert.AreEqual(double.NaN.ToString(CultureInfo.InvariantCulture), dataGridView.Rows[22].Cells[assessmentLayerTwoAIndex].FormattedValue); - Assert.AreEqual("Bijdrage van de geselecteerde scenario's voor dit vak zijn opgeteld niet gelijk aan 100%", dataGridView.Rows[22].Cells[assessmentLayerTwoAIndex].ErrorText); + Assert.AreEqual("Bijdrage van de geselecteerde scenario's voor dit vak zijn opgeteld niet gelijk aan 100%.", dataGridView.Rows[22].Cells[assessmentLayerTwoAIndex].ErrorText); // Change the contribution of the calculation and make sure the data grid view is updated pipingCalculation3.Contribution = (RoundedDouble) 0.3; pipingCalculation3.NotifyObservers(); Assert.AreEqual(double.NaN.ToString(CultureInfo.InvariantCulture), dataGridView.Rows[22].Cells[assessmentLayerTwoAIndex].FormattedValue); - Assert.AreEqual("Bijdrage van de geselecteerde scenario's voor dit vak zijn opgeteld niet gelijk aan 100%", dataGridView.Rows[22].Cells[assessmentLayerTwoAIndex].ErrorText); + Assert.AreEqual("Bijdrage van de geselecteerde scenario's voor dit vak zijn opgeteld niet gelijk aan 100%.", dataGridView.Rows[22].Cells[assessmentLayerTwoAIndex].ErrorText); pipingCalculation1.Contribution = (RoundedDouble) 0.7; pipingCalculation1.NotifyObservers(); Index: Ringtoets/Piping/test/Ringtoets.Piping.Integration.Test/IntegrationTestHelper.cs =================================================================== diff -u -red71d00e40e0171a4d8b8335bbf577206b288e6b -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/Piping/test/Ringtoets.Piping.Integration.Test/IntegrationTestHelper.cs (.../IntegrationTestHelper.cs) (revision ed71d00e40e0171a4d8b8335bbf577206b288e6b) +++ Ringtoets/Piping/test/Ringtoets.Piping.Integration.Test/IntegrationTestHelper.cs (.../IntegrationTestHelper.cs) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -11,8 +11,15 @@ namespace Ringtoets.Piping.Integration.Test { + /// + /// Helper methods related to integration tests. + /// public static class IntegrationTestHelper { + /// + /// Imports the reference line on the . + /// + /// The to import the reference line on. public static void ImportReferenceLine(AssessmentSection assessmentSection) { using (var embeddedResourceFileWriter = new EmbeddedResourceFileWriter(typeof(IntegrationTestHelper).Assembly, @@ -31,6 +38,11 @@ } } + /// + /// Imports the failure mechanism sections. + /// + /// The to import on. + /// The to import on. public static void ImportFailureMechanismSections(AssessmentSection assessmentSection, IFailureMechanism failureMechanism) { using (var embeddedResourceFileWriter = new EmbeddedResourceFileWriter(typeof(IntegrationTestHelper).Assembly, @@ -49,6 +61,10 @@ } } + /// + /// Imports the hydraulic boundary database. + /// + /// The to import on. public static void ImportHydraulicBoundaryDatabase(AssessmentSection assessmentSection) { using (var embeddedResourceFileWriter = new EmbeddedResourceFileWriter(typeof(IntegrationTestHelper).Assembly, @@ -64,6 +80,10 @@ } } + /// + /// Imports the surface lines. + /// + /// The to import on. public static void ImportSurfaceLines(AssessmentSection assessmentSection) { using (var embeddedResourceFileWriter = new EmbeddedResourceFileWriter(typeof(IntegrationTestHelper).Assembly, @@ -80,6 +100,10 @@ } } + /// + /// Imports the soil profiles. + /// + /// The to import on. public static void ImportSoilProfiles(AssessmentSection assessmentSection) { using (var embeddedResourceFileWriter = new EmbeddedResourceFileWriter(typeof(IntegrationTestHelper).Assembly, Index: Ringtoets/Piping/test/Ringtoets.Piping.Plugin.Test/PipingGuiPluginTest.cs =================================================================== diff -u -rd8e2d6a982327c979ef74dcf7cc71a8a69314eef -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/Piping/test/Ringtoets.Piping.Plugin.Test/PipingGuiPluginTest.cs (.../PipingGuiPluginTest.cs) (revision d8e2d6a982327c979ef74dcf7cc71a8a69314eef) +++ Ringtoets/Piping/test/Ringtoets.Piping.Plugin.Test/PipingGuiPluginTest.cs (.../PipingGuiPluginTest.cs) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -75,7 +75,7 @@ Assert.IsNull(pipingFailureMechanismContextProperties.GetObjectPropertiesData); Assert.IsNull(pipingFailureMechanismContextProperties.AfterCreate); - var pipingCalculationContextProperties = propertyInfos.Single(pi => pi.DataType == typeof(PipingCalculationContext)); + var pipingCalculationContextProperties = propertyInfos.Single(pi => pi.DataType == typeof(PipingCalculationScenarioContext)); Assert.AreEqual(typeof(PipingCalculationContextProperties), pipingCalculationContextProperties.PropertyObjectType); Assert.IsNull(pipingCalculationContextProperties.AdditionalDataCheck); Assert.IsNull(pipingCalculationContextProperties.GetObjectPropertiesData); @@ -150,7 +150,7 @@ Assert.IsTrue(treeNodeInfos.Any(tni => tni.TagType == typeof(StochasticSoilModelContext))); Assert.IsTrue(treeNodeInfos.Any(tni => tni.TagType == typeof(StochasticSoilModel))); Assert.IsTrue(treeNodeInfos.Any(tni => tni.TagType == typeof(StochasticSoilProfile))); - Assert.IsTrue(treeNodeInfos.Any(tni => tni.TagType == typeof(PipingCalculationContext))); + Assert.IsTrue(treeNodeInfos.Any(tni => tni.TagType == typeof(PipingCalculationScenarioContext))); Assert.IsTrue(treeNodeInfos.Any(tni => tni.TagType == typeof(PipingCalculationGroupContext))); Assert.IsTrue(treeNodeInfos.Any(tni => tni.TagType == typeof(PipingInputContext))); Assert.IsTrue(treeNodeInfos.Any(tni => tni.TagType == typeof(PipingFailureMechanismContext))); Index: Ringtoets/Piping/test/Ringtoets.Piping.Service.Test/PipingCalculationScenarioServiceTest.cs =================================================================== diff -u -rc5f90c4f9b42d985f16f99ad8732576b9217267a -r23a37b025a5d0358c1f30fb31de41a2c284519a5 --- Ringtoets/Piping/test/Ringtoets.Piping.Service.Test/PipingCalculationScenarioServiceTest.cs (.../PipingCalculationScenarioServiceTest.cs) (revision c5f90c4f9b42d985f16f99ad8732576b9217267a) +++ Ringtoets/Piping/test/Ringtoets.Piping.Service.Test/PipingCalculationScenarioServiceTest.cs (.../PipingCalculationScenarioServiceTest.cs) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) @@ -82,8 +82,8 @@ var sectionResults = failureMechanism.SectionResults.ToArray(); - var sectionResultScenariosBeforeSync = sectionResults[0].CalculationScenarios.ToList(); - var sectionResultScenariosBeforeSync2 = sectionResults[1].CalculationScenarios.ToList(); + var sectionResultScenariosBeforeSync = sectionResults[0].CalculationScenarios.ToArray(); + var sectionResultScenariosBeforeSync2 = sectionResults[1].CalculationScenarios.ToArray(); // Call PipingCalculationScenarioService.SyncCalculationScenarioWithNewSurfaceLine(calculationToSync, failureMechanism, null); @@ -106,7 +106,7 @@ var sectionResults = failureMechanism.SectionResults.ToArray(); - var expectedSectionResultScenarios = sectionResults[0].CalculationScenarios.ToList(); + var expectedSectionResultScenarios = sectionResults[0].CalculationScenarios.ToArray(); // Call PipingCalculationScenarioService.SyncCalculationScenarioWithNewSurfaceLine(calculationToSync, failureMechanism, calculationToSync.InputParameters.SurfaceLine); @@ -134,8 +134,8 @@ var sectionResults = failureMechanism.SectionResults.ToArray(); - var sectionResultScenariosBeforeSync = sectionResults[0].CalculationScenarios.ToList(); - var sectionResultScenariosBeforeSync2 = sectionResults[1].CalculationScenarios.ToList(); + var sectionResultScenariosBeforeSync = sectionResults[0].CalculationScenarios.ToArray(); + var sectionResultScenariosBeforeSync2 = sectionResults[1].CalculationScenarios.ToArray(); // Call PipingCalculationScenarioService.SyncCalculationScenarioWithNewSurfaceLine(calculationToSync, failureMechanism, oldSurfaceLine); @@ -182,8 +182,8 @@ var calculationToRemove = new PipingCalculationScenario(new GeneralPipingInput(), new NormProbabilityPipingInput()); var sectionResults = failureMechanism.SectionResults.ToArray(); - var sectionResultScenariosBeforeRemove = sectionResults[0].CalculationScenarios.ToList(); - var sectionResultScenariosBeforeRemove2 = sectionResults[1].CalculationScenarios.ToList(); + var sectionResultScenariosBeforeRemove = sectionResults[0].CalculationScenarios.ToArray(); + var sectionResultScenariosBeforeRemove2 = sectionResults[1].CalculationScenarios.ToArray(); // Call PipingCalculationScenarioService.RemoveCalculationScenarioFromSectionResult(calculationToRemove, failureMechanism);