Index: Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Data/GrassCoverErosionInwardsFailureMechanism.cs =================================================================== diff -u -r184de624feae0c0a051e34298d66e304d073daf5 -rd5dfad7e2e7b86747c393ffc9a82d774d7649a57 --- Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Data/GrassCoverErosionInwardsFailureMechanism.cs (.../GrassCoverErosionInwardsFailureMechanism.cs) (revision 184de624feae0c0a051e34298d66e304d073daf5) +++ Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Data/GrassCoverErosionInwardsFailureMechanism.cs (.../GrassCoverErosionInwardsFailureMechanism.cs) (revision d5dfad7e2e7b86747c393ffc9a82d774d7649a57) @@ -48,10 +48,7 @@ CalculationsGroup = new CalculationGroup(RingtoetsCommonDataResources.FailureMechanism_Calculations_DisplayName, false); GeneralInput = new GeneralGrassCoverErosionInwardsInput(); sectionResults = new List(); - DikeProfiles = new ObservableList - { -// new DikeProfile(new Point2D(1,0)) - }; + DikeProfiles = new ObservableList(); } public override IEnumerable Calculations Index: Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Plugin/GrassCoverErosionInwardsGuiPlugin.cs =================================================================== diff -u -r184de624feae0c0a051e34298d66e304d073daf5 -rd5dfad7e2e7b86747c393ffc9a82d774d7649a57 --- Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Plugin/GrassCoverErosionInwardsGuiPlugin.cs (.../GrassCoverErosionInwardsGuiPlugin.cs) (revision 184de624feae0c0a051e34298d66e304d073daf5) +++ Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Plugin/GrassCoverErosionInwardsGuiPlugin.cs (.../GrassCoverErosionInwardsGuiPlugin.cs) (revision d5dfad7e2e7b86747c393ffc9a82d774d7649a57) @@ -39,6 +39,7 @@ using Ringtoets.Common.Forms.PresentationObjects; using Ringtoets.Common.Forms.TreeNodeInfos; using Ringtoets.GrassCoverErosionInwards.Data; +using Ringtoets.GrassCoverErosionInwards.Forms; using Ringtoets.GrassCoverErosionInwards.Forms.PresentationObjects; using Ringtoets.GrassCoverErosionInwards.Forms.PropertyClasses; using Ringtoets.GrassCoverErosionInwards.Forms.Views; @@ -410,8 +411,29 @@ private void ShowDikeProfileSelectionDialog(GrassCoverErosionInwardsCalculationGroupContext nodeData) { + var view = new GrassCoverErosionInwardsDikeProfileSelectionDialog(Gui.MainWindow, nodeData.AvailableDikeProfiles); + view.ShowDialog(); + + GenerateCalculations(nodeData.WrappedData, view.SelectedDikeProfiles); + + nodeData.NotifyObservers(); } + private void GenerateCalculations(CalculationGroup target, IEnumerable dikeProfiles) + { + foreach (var profile in dikeProfiles) + { + target.Children.Add(new GrassCoverErosionInwardsCalculation + { + Name = NamingHelper.GetUniqueName(target.Children, profile.Name, c => c.Name), + InputParameters = + { + DikeProfile = profile + } + }); + } + } + private static void CalculationGroupContextOnNodeRemoved(GrassCoverErosionInwardsCalculationGroupContext context, object parentNodeData) { var parentGroupContext = (GrassCoverErosionInwardsCalculationGroupContext)parentNodeData; Index: Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Forms.Test/TreeNodeInfos/GrassCoverErosionInwardsCalculationGroupContextTreeNodeInfoTest.cs =================================================================== diff -u -r184de624feae0c0a051e34298d66e304d073daf5 -rd5dfad7e2e7b86747c393ffc9a82d774d7649a57 --- Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Forms.Test/TreeNodeInfos/GrassCoverErosionInwardsCalculationGroupContextTreeNodeInfoTest.cs (.../GrassCoverErosionInwardsCalculationGroupContextTreeNodeInfoTest.cs) (revision 184de624feae0c0a051e34298d66e304d073daf5) +++ Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Forms.Test/TreeNodeInfos/GrassCoverErosionInwardsCalculationGroupContextTreeNodeInfoTest.cs (.../GrassCoverErosionInwardsCalculationGroupContextTreeNodeInfoTest.cs) (revision d5dfad7e2e7b86747c393ffc9a82d774d7649a57) @@ -37,6 +37,7 @@ using Ringtoets.Common.Data.AssessmentSection; using Ringtoets.Common.Data.Calculation; using Ringtoets.Common.Data.FailureMechanism; +using Ringtoets.Common.Forms.Helpers; using Ringtoets.GrassCoverErosionInwards.Data; using Ringtoets.GrassCoverErosionInwards.Forms.PresentationObjects; using Ringtoets.GrassCoverErosionInwards.Plugin; @@ -776,6 +777,206 @@ } [Test] + public void GivenCalculationsViewGenerateScenariosButtonClicked_WhenDikeProfileSelectedAndDialogClosed_ThenCalculationsAddedWithProfileAssigned() + { + // Given + using (var treeViewControl = new TreeViewControl()) + { + var assessmentSectionMock = mocks.StrictMock(); + + var dikeProfile1 = new DikeProfile(new Point2D(0.0, 0.0)) + { + Name = "Dike profile 1", + }; + + var dikeProfile2 = new DikeProfile(new Point2D(5.0, 0.0)) + { + Name = "Dike profile 2", + }; + + var failureMechanism = new GrassCoverErosionInwardsFailureMechanism + { + DikeProfiles = + { + dikeProfile1, + dikeProfile2 + } + }; + + var nodeData = new GrassCoverErosionInwardsCalculationGroupContext(failureMechanism.CalculationsGroup, + failureMechanism, + assessmentSectionMock); + + var menuBuilder = new CustomItemsOnlyContextMenuBuilder(); + var mainWindow = mocks.Stub(); + + var gui = mocks.StrictMock(); + gui.Expect(cmp => cmp.Get(nodeData, treeViewControl)).Return(menuBuilder); + gui.Expect(g => g.MainWindow).Return(mainWindow); + + mocks.ReplayAll(); + + plugin.Gui = gui; + + DialogBoxHandler = (name, wnd) => + { + var selectionDialog = (GrassCoverErosionInwardsDikeProfileSelectionDialog)new FormTester(name).TheObject; + var grid = (DataGridView)new ControlTester("DikeProfileDataGrid", selectionDialog).TheObject; + + grid.Rows[0].Cells[0].Value = true; + + new ButtonTester("OkButton", selectionDialog).Click(); + }; + + var contextMenu = info.ContextMenuStrip(nodeData, null, treeViewControl); + + // When + contextMenu.Items[contextMenuGenerateCalculationsIndexRootGroup].PerformClick(); + + // Then + var grassCoverErosionInwardsCalculations = failureMechanism.Calculations.OfType().ToArray(); + Assert.AreEqual(1, grassCoverErosionInwardsCalculations.Length); + } + mocks.VerifyAll(); + } + + [Test] + public void GivenCalculationsViewGenerateScenariosButtonClicked_WhenCancelButtonClickedAndDialogClosed_ThenCalculationsNotUpdated() + { + // Given + using (var treeViewControl = new TreeViewControl()) + { + var assessmentSectionMock = mocks.StrictMock(); + + var dikeProfile1 = new DikeProfile(new Point2D(0.0, 0.0)) + { + Name = "Dike profile 1", + }; + + var dikeProfile2 = new DikeProfile(new Point2D(5.0, 0.0)) + { + Name = "Dike profile 2", + }; + + var failureMechanism = new GrassCoverErosionInwardsFailureMechanism + { + DikeProfiles = + { + dikeProfile1, + dikeProfile2 + } + }; + + var nodeData = new GrassCoverErosionInwardsCalculationGroupContext(failureMechanism.CalculationsGroup, + failureMechanism, + assessmentSectionMock); + + var menuBuilder = new CustomItemsOnlyContextMenuBuilder(); + var mainWindow = mocks.Stub(); + + var gui = mocks.StrictMock(); + gui.Expect(cmp => cmp.Get(nodeData, treeViewControl)).Return(menuBuilder); + gui.Expect(g => g.MainWindow).Return(mainWindow); + + mocks.ReplayAll(); + + plugin.Gui = gui; + + DialogBoxHandler = (name, wnd) => + { + var selectionDialog = (GrassCoverErosionInwardsDikeProfileSelectionDialog)new FormTester(name).TheObject; + var grid = (DataGridView)new ControlTester("DikeProfileDataGrid", selectionDialog).TheObject; + + grid.Rows[0].Cells[0].Value = true; + + new ButtonTester("CustomCancelButton", selectionDialog).Click(); + }; + + var contextMenu = info.ContextMenuStrip(nodeData, null, treeViewControl); + + // When + contextMenu.Items[contextMenuGenerateCalculationsIndexRootGroup].PerformClick(); + + // Then + var grassCoverErosionInwardsCalculations = failureMechanism.Calculations.OfType().ToArray(); + Assert.AreEqual(0, grassCoverErosionInwardsCalculations.Length); + } + mocks.VerifyAll(); + } + + [Test] + public void GivenScenariosWithExistingCalculationWithSameName_WhenOkButtonClickedAndDialogClosed_ThenCalculationWithUniqueNameAdded() + { + // Given + using (var treeViewControl = new TreeViewControl()) + { + var assessmentSectionMock = mocks.StrictMock(); + + var existingCalculationName = "Dike profile"; + var dikeProfile = new DikeProfile(new Point2D(0.0, 0.0)) + { + Name = existingCalculationName, + }; + + var failureMechanism = new GrassCoverErosionInwardsFailureMechanism + { + DikeProfiles = + { + dikeProfile, + }, + CalculationsGroup = + { + Children = + { + new GrassCoverErosionInwardsCalculation + { + Name = existingCalculationName + } + } + } + }; + + var nodeData = new GrassCoverErosionInwardsCalculationGroupContext(failureMechanism.CalculationsGroup, + failureMechanism, + assessmentSectionMock); + + var menuBuilder = new CustomItemsOnlyContextMenuBuilder(); + var mainWindow = mocks.Stub(); + + var gui = mocks.StrictMock(); + gui.Expect(cmp => cmp.Get(nodeData, treeViewControl)).Return(menuBuilder); + gui.Expect(g => g.MainWindow).Return(mainWindow); + + mocks.ReplayAll(); + + plugin.Gui = gui; + + DialogBoxHandler = (name, wnd) => + { + var selectionDialog = (GrassCoverErosionInwardsDikeProfileSelectionDialog)new FormTester(name).TheObject; + var grid = (DataGridView)new ControlTester("DikeProfileDataGrid", selectionDialog).TheObject; + + grid.Rows[0].Cells[0].Value = true; + + new ButtonTester("OkButton", selectionDialog).Click(); + }; + + var contextMenu = info.ContextMenuStrip(nodeData, null, treeViewControl); + + var expectedNewName = NamingHelper.GetUniqueName(failureMechanism.CalculationsGroup.Children, existingCalculationName, c => c.Name); + + // When + contextMenu.Items[contextMenuGenerateCalculationsIndexRootGroup].PerformClick(); + + // Then + var grassCoverErosionInwardsCalculations = failureMechanism.Calculations.OfType().ToArray(); + Assert.AreEqual(2, grassCoverErosionInwardsCalculations.Length); + Assert.AreEqual(expectedNewName, grassCoverErosionInwardsCalculations[1].Name); + } + mocks.VerifyAll(); + } + + [Test] public void OnNodeRemoved_NestedCalculationGroup_RemoveGroupAndNotifyObservers() { // Setup Index: Ringtoets/Integration/src/Ringtoets.Integration.Data/StandAlone/SectionResults/ClosingStructureFailureMechanismSectionResult.cs =================================================================== diff -u -r1cd3618f5f8916ef15992d69ec3b447b311c2f72 -rd5dfad7e2e7b86747c393ffc9a82d774d7649a57 --- Ringtoets/Integration/src/Ringtoets.Integration.Data/StandAlone/SectionResults/ClosingStructureFailureMechanismSectionResult.cs (.../ClosingStructureFailureMechanismSectionResult.cs) (revision 1cd3618f5f8916ef15992d69ec3b447b311c2f72) +++ Ringtoets/Integration/src/Ringtoets.Integration.Data/StandAlone/SectionResults/ClosingStructureFailureMechanismSectionResult.cs (.../ClosingStructureFailureMechanismSectionResult.cs) (revision d5dfad7e2e7b86747c393ffc9a82d774d7649a57) @@ -64,7 +64,7 @@ } set { - if (value < 0 || value > 1) + if (!double.IsNaN(value) && (value < 0 || value > 1)) { throw new ArgumentException(Resources.ArbitraryProbabilityFailureMechanismSectionResult_AssessmentLayerTwoA_Value_needs_to_be_between_0_and_1); } Index: Ringtoets/Integration/src/Ringtoets.Integration.Data/StandAlone/SectionResults/MacrostabilityInwardsFailureMechanismSectionResult.cs =================================================================== diff -u -rb4816e19c7167c26fad825b88dd72b59dcedc13a -rd5dfad7e2e7b86747c393ffc9a82d774d7649a57 --- Ringtoets/Integration/src/Ringtoets.Integration.Data/StandAlone/SectionResults/MacrostabilityInwardsFailureMechanismSectionResult.cs (.../MacrostabilityInwardsFailureMechanismSectionResult.cs) (revision b4816e19c7167c26fad825b88dd72b59dcedc13a) +++ Ringtoets/Integration/src/Ringtoets.Integration.Data/StandAlone/SectionResults/MacrostabilityInwardsFailureMechanismSectionResult.cs (.../MacrostabilityInwardsFailureMechanismSectionResult.cs) (revision d5dfad7e2e7b86747c393ffc9a82d774d7649a57) @@ -64,7 +64,7 @@ } set { - if (value < 0 || value > 1) + if (!double.IsNaN(value) && (value < 0 || value > 1)) { throw new ArgumentException(Resources.ArbitraryProbabilityFailureMechanismSectionResult_AssessmentLayerTwoA_Value_needs_to_be_between_0_and_1); } Index: Ringtoets/Integration/src/Ringtoets.Integration.Data/StandAlone/SectionResults/MacrostabilityOutwardsFailureMechanismSectionResult.cs =================================================================== diff -u -rb4816e19c7167c26fad825b88dd72b59dcedc13a -rd5dfad7e2e7b86747c393ffc9a82d774d7649a57 --- Ringtoets/Integration/src/Ringtoets.Integration.Data/StandAlone/SectionResults/MacrostabilityOutwardsFailureMechanismSectionResult.cs (.../MacrostabilityOutwardsFailureMechanismSectionResult.cs) (revision b4816e19c7167c26fad825b88dd72b59dcedc13a) +++ Ringtoets/Integration/src/Ringtoets.Integration.Data/StandAlone/SectionResults/MacrostabilityOutwardsFailureMechanismSectionResult.cs (.../MacrostabilityOutwardsFailureMechanismSectionResult.cs) (revision d5dfad7e2e7b86747c393ffc9a82d774d7649a57) @@ -64,7 +64,7 @@ } set { - if (value < 0 || value > 1) + if (!double.IsNaN(value) && (value < 0 || value > 1)) { throw new ArgumentException(Resources.ArbitraryProbabilityFailureMechanismSectionResult_AssessmentLayerTwoA_Value_needs_to_be_between_0_and_1); } Index: Ringtoets/Integration/src/Ringtoets.Integration.Data/StandAlone/SectionResults/StrengthStabilityPointConstructionFailureMechanismSectionResult.cs =================================================================== diff -u -r8a15fe6e429a0f177f25defaf1851c9963374dbe -rd5dfad7e2e7b86747c393ffc9a82d774d7649a57 --- Ringtoets/Integration/src/Ringtoets.Integration.Data/StandAlone/SectionResults/StrengthStabilityPointConstructionFailureMechanismSectionResult.cs (.../StrengthStabilityPointConstructionFailureMechanismSectionResult.cs) (revision 8a15fe6e429a0f177f25defaf1851c9963374dbe) +++ Ringtoets/Integration/src/Ringtoets.Integration.Data/StandAlone/SectionResults/StrengthStabilityPointConstructionFailureMechanismSectionResult.cs (.../StrengthStabilityPointConstructionFailureMechanismSectionResult.cs) (revision d5dfad7e2e7b86747c393ffc9a82d774d7649a57) @@ -59,7 +59,7 @@ } set { - if (value < 0 || value > 1) + if (!double.IsNaN(value) && (value < 0 || value > 1)) { throw new ArgumentException(Resources.ArbitraryProbabilityFailureMechanismSectionResult_AssessmentLayerTwoA_Value_needs_to_be_between_0_and_1); }