Index: Riskeer/GrassCoverErosionOutwards/src/Riskeer.GrassCoverErosionOutwards.Plugin/GrassCoverErosionOutwardsPlugin.cs =================================================================== diff -u -rfd572b1d0d0be95b5218314d9022665514b68caf -r6c40c68047f2b468abbbb8a3c93703344d4ce373 --- Riskeer/GrassCoverErosionOutwards/src/Riskeer.GrassCoverErosionOutwards.Plugin/GrassCoverErosionOutwardsPlugin.cs (.../GrassCoverErosionOutwardsPlugin.cs) (revision fd572b1d0d0be95b5218314d9022665514b68caf) +++ Riskeer/GrassCoverErosionOutwards/src/Riskeer.GrassCoverErosionOutwards.Plugin/GrassCoverErosionOutwardsPlugin.cs (.../GrassCoverErosionOutwardsPlugin.cs) (revision 6c40c68047f2b468abbbb8a3c93703344d4ce373) @@ -61,6 +61,7 @@ using Riskeer.GrassCoverErosionOutwards.Plugin.FileImporters; using Riskeer.GrassCoverErosionOutwards.Service; using Riskeer.Revetment.Data; +using Riskeer.Revetment.Forms.ChangeHandlers; using Riskeer.Revetment.Forms.Views; using Riskeer.Revetment.Service; using RiskeerCommonDataResources = Riskeer.Common.Data.Properties.Resources; @@ -414,28 +415,25 @@ private static bool CloseGrassCoverErosionOutwardsFailureMechanismViewForData(GrassCoverErosionOutwardsFailureMechanismView view, object data) { - var assessmentSection = data as IAssessmentSection; var failureMechanism = data as GrassCoverErosionOutwardsFailureMechanism; - return assessmentSection != null + return data is IAssessmentSection assessmentSection ? ReferenceEquals(view.AssessmentSection, assessmentSection) : ReferenceEquals(view.FailureMechanism, failureMechanism); } private static bool CloseFailureMechanismResultViewForData(GrassCoverErosionOutwardsFailureMechanismResultView view, object o) { - var assessmentSection = o as IAssessmentSection; - var failureMechanism = o as GrassCoverErosionOutwardsFailureMechanism; - var failureMechanismContext = o as IFailureMechanismContext; - if (assessmentSection != null) + if (o is IAssessmentSection assessmentSection) { return assessmentSection .GetFailureMechanisms() .OfType() .Any(fm => ReferenceEquals(view.FailureMechanism.SectionResults, fm.SectionResults)); } - if (failureMechanismContext != null) + var failureMechanism = o as GrassCoverErosionOutwardsFailureMechanism; + if (o is IFailureMechanismContext failureMechanismContext) { failureMechanism = failureMechanismContext.WrappedData; } @@ -450,16 +448,14 @@ .OfType() .Single(); - var failureMechanismContext = dataToCloseFor as GrassCoverErosionOutwardsFailureMechanismContext; - var assessmentSection = dataToCloseFor as IAssessmentSection; var failureMechanism = dataToCloseFor as GrassCoverErosionOutwardsFailureMechanism; - if (assessmentSection != null) + if (dataToCloseFor is IAssessmentSection assessmentSection) { - failureMechanism = ((IAssessmentSection) dataToCloseFor).GetFailureMechanisms().OfType().Single(); + failureMechanism = assessmentSection.GetFailureMechanisms().OfType().Single(); } - if (failureMechanismContext != null) + if (dataToCloseFor is GrassCoverErosionOutwardsFailureMechanismContext failureMechanismContext) { failureMechanism = failureMechanismContext.Parent.GetFailureMechanisms().OfType().Single(); } @@ -697,17 +693,14 @@ foreach (ICalculationBase item in nodeData.WrappedData.Children) { - var calculation = item as GrassCoverErosionOutwardsWaveConditionsCalculation; - var group = item as CalculationGroup; - - if (calculation != null) + if (item is GrassCoverErosionOutwardsWaveConditionsCalculation calculation) { childNodeObjects.Add(new GrassCoverErosionOutwardsWaveConditionsCalculationContext(calculation, nodeData.WrappedData, nodeData.FailureMechanism, nodeData.AssessmentSection)); } - else if (group != null) + else if (item is CalculationGroup group) { childNodeObjects.Add(new GrassCoverErosionOutwardsWaveConditionsCalculationGroupContext(group, nodeData.WrappedData, @@ -763,8 +756,9 @@ builder.AddRenameItem(); } - builder.AddUpdateForeshoreProfileOfCalculationsItem(calculations, inquiryHelper, - SynchronizeCalculationWithForeshoreProfileHelper.UpdateForeshoreProfileDerivedCalculationInput) + builder.AddUpdateForeshoreProfileOfCalculationsItem( + calculations, inquiryHelper, + SynchronizeCalculationWithForeshoreProfileHelper.UpdateForeshoreProfileDerivedCalculationInput) .AddSeparator() .AddValidateAllCalculationsInGroupItem( nodeData, @@ -775,7 +769,10 @@ CalculateAllInCalculationGroup, EnableValidateAndCalculateMenuItemForCalculationGroup) .AddSeparator() - .AddClearAllCalculationOutputInGroupItem(group); + .AddClearAllCalculationOutputInGroupItem( + () => calculations.Any(c => c.HasOutput), + new WaveConditionsCalculationOutputChangeHandler( + calculations.Where(c => c.HasOutput), inquiryHelper)); if (isNestedGroup) { Index: Riskeer/GrassCoverErosionOutwards/test/Riskeer.GrassCoverErosionOutwards.Plugin.Test/TreeNodeInfos/GrassCoverErosionOutwardsWaveConditionsCalculationGroupContextTreeNodeInfoTest.cs =================================================================== diff -u -rc6e95a768f3d8e9e8309c2b68a3d8272904e79ab -r6c40c68047f2b468abbbb8a3c93703344d4ce373 --- Riskeer/GrassCoverErosionOutwards/test/Riskeer.GrassCoverErosionOutwards.Plugin.Test/TreeNodeInfos/GrassCoverErosionOutwardsWaveConditionsCalculationGroupContextTreeNodeInfoTest.cs (.../GrassCoverErosionOutwardsWaveConditionsCalculationGroupContextTreeNodeInfoTest.cs) (revision c6e95a768f3d8e9e8309c2b68a3d8272904e79ab) +++ Riskeer/GrassCoverErosionOutwards/test/Riskeer.GrassCoverErosionOutwards.Plugin.Test/TreeNodeInfos/GrassCoverErosionOutwardsWaveConditionsCalculationGroupContextTreeNodeInfoTest.cs (.../GrassCoverErosionOutwardsWaveConditionsCalculationGroupContextTreeNodeInfoTest.cs) (revision 6c40c68047f2b468abbbb8a3c93703344d4ce373) @@ -1243,176 +1243,200 @@ } [Test] - public void ContextMenuStrip_NoCalculations_ClearAllOutputItemDisabled() + public void ContextMenuStrip_CalculationGroupWithCalculationsWithoutOutput_ContextMenuItemClearCalculationsOutputEnabled() { // Setup - var group = new CalculationGroup(); + var calculationGroup = new CalculationGroup + { + Children = + { + new GrassCoverErosionOutwardsWaveConditionsCalculation(), + new CalculationGroup + { + Children = + { + new GrassCoverErosionOutwardsWaveConditionsCalculation + { + Output = GrassCoverErosionOutwardsWaveConditionsOutputTestFactory.Create() + } + } + } + } + }; - var failureMechanism = new GrassCoverErosionOutwardsFailureMechanism(); - failureMechanism.WaveConditionsCalculationGroup.Children.Add(group); + IAssessmentSection assessmentSection = AssessmentSectionTestHelper.CreateAssessmentSectionStub(null, mocks, "invalidFilePath"); - IAssessmentSection assessmentSection = AssessmentSectionTestHelper.CreateAssessmentSectionStub( - failureMechanism, mocks, validFilePath); + var nodeData = new GrassCoverErosionOutwardsWaveConditionsCalculationGroupContext( + calculationGroup, null, new GrassCoverErosionOutwardsFailureMechanism(), assessmentSection); - var nodeData = new GrassCoverErosionOutwardsWaveConditionsCalculationGroupContext(group, - failureMechanism.WaveConditionsCalculationGroup, - failureMechanism, - assessmentSection); - var parentNodeData = new GrassCoverErosionOutwardsWaveConditionsCalculationGroupContext(failureMechanism.WaveConditionsCalculationGroup, - null, - failureMechanism, - assessmentSection); - var menuBuilder = new CustomItemsOnlyContextMenuBuilder(); using (var treeViewControl = new TreeViewControl()) { - var mainWindow = mocks.Stub(); - - gui.Stub(cmp => cmp.Get(nodeData, treeViewControl)).Return(menuBuilder); - gui.Stub(g => g.MainWindow).Return(mainWindow); - - var calculatorFactory = mocks.Stub(); + gui.Stub(g => g.Get(nodeData, treeViewControl)).Return(menuBuilder); + gui.Stub(g => g.MainWindow).Return(mocks.Stub()); mocks.ReplayAll(); - using (new HydraRingCalculatorFactoryConfig(calculatorFactory)) - using (ContextMenuStrip contextMenu = info.ContextMenuStrip(nodeData, parentNodeData, treeViewControl)) + using (ContextMenuStrip contextMenu = info.ContextMenuStrip(nodeData, null, treeViewControl)) { // Call - ToolStripItem clearAllOutputItem = contextMenu.Items[contextMenuClearOutputIndexNestedGroup]; + ToolStripItem toolStripItem = contextMenu.Items[contextMenuClearOutputIndexRootGroup]; // Assert - Assert.IsFalse(clearAllOutputItem.Enabled); + Assert.IsTrue(toolStripItem.Enabled); } } } [Test] - public void ContextMenuStrip_TwoCalculationsWithoutOutput_ClearAllOutputItemDisabled() + public void ContextMenuStrip_CalculationGroupWithCalculationsWithoutOutput_ContextMenuItemClearCalculationsOutputDisabled() { // Setup - var failureMechanism = new GrassCoverErosionOutwardsFailureMechanism(); - IAssessmentSection assessmentSection = AssessmentSectionTestHelper.CreateAssessmentSectionStub( - failureMechanism, mocks, validFilePath); + var calculationGroup = new CalculationGroup + { + Children = + { + new GrassCoverErosionOutwardsWaveConditionsCalculation() + } + }; - HydraulicBoundaryDatabase hydraulicBoundaryDatabase = assessmentSection.HydraulicBoundaryDatabase; - var group = new CalculationGroup(); - GrassCoverErosionOutwardsWaveConditionsCalculation calculationA = GetValidCalculation(hydraulicBoundaryDatabase.Locations.First()); - GrassCoverErosionOutwardsWaveConditionsCalculation calculationB = GetValidCalculation(hydraulicBoundaryDatabase.Locations.First()); - group.Children.Add(calculationA); - group.Children.Add(calculationB); + IAssessmentSection assessmentSection = AssessmentSectionTestHelper.CreateAssessmentSectionStub(null, mocks, "invalidFilePath"); - failureMechanism.WaveConditionsCalculationGroup.Children.Add(group); + var nodeData = new GrassCoverErosionOutwardsWaveConditionsCalculationGroupContext( + calculationGroup, null, new GrassCoverErosionOutwardsFailureMechanism(), assessmentSection); - var nodeData = new GrassCoverErosionOutwardsWaveConditionsCalculationGroupContext(group, - failureMechanism.WaveConditionsCalculationGroup, - failureMechanism, - assessmentSection); - var parentNodeData = new GrassCoverErosionOutwardsWaveConditionsCalculationGroupContext(failureMechanism.WaveConditionsCalculationGroup, - null, - failureMechanism, - assessmentSection); - var menuBuilder = new CustomItemsOnlyContextMenuBuilder(); using (var treeViewControl = new TreeViewControl()) { - var mainWindow = mocks.Stub(); - - gui.Stub(cmp => cmp.Get(nodeData, treeViewControl)).Return(menuBuilder); - gui.Stub(g => g.MainWindow).Return(mainWindow); - - var calculatorFactory = mocks.Stub(); + gui.Stub(g => g.Get(nodeData, treeViewControl)).Return(menuBuilder); + gui.Stub(g => g.MainWindow).Return(mocks.Stub()); mocks.ReplayAll(); - using (new HydraRingCalculatorFactoryConfig(calculatorFactory)) - using (ContextMenuStrip contextMenu = info.ContextMenuStrip(nodeData, parentNodeData, treeViewControl)) + using (ContextMenuStrip contextMenu = info.ContextMenuStrip(nodeData, null, treeViewControl)) { // Call - ToolStripItem clearAllOutputItem = contextMenu.Items[contextMenuClearOutputIndexNestedGroup]; + ToolStripItem toolStripItem = contextMenu.Items[contextMenuClearOutputIndexRootGroup]; // Assert - Assert.IsFalse(clearAllOutputItem.Enabled); + Assert.IsFalse(toolStripItem.Enabled); } } } [Test] - [TestCase(true, TestName = "Menu_ClickClearAllOutput_ClearAllOutputAfterConfirmation(true)")] - [TestCase(false, TestName = "Menu_ClickClearAllOutput_ClearAllOutputAfterConfirmation(false)")] - public void ContextMenuStrip_TwoCalculationsWithOutputClickOnClearAllOutput_OutputRemovedForCalculationsAfterConfirmation(bool confirm) + public void GivenCalculationsWithOutput_WhenClearAllCalculationsOutputClickedAndAborted_ThenInquiryAndCalculationsOutputNotCleared() { - // Setup - var failureMechanism = new GrassCoverErosionOutwardsFailureMechanism(); - IAssessmentSection assessmentSection = AssessmentSectionTestHelper.CreateAssessmentSectionStub( - failureMechanism, mocks, validFilePath); + // Given + var calculationWithOutput = new GrassCoverErosionOutwardsWaveConditionsCalculation + { + Output = GrassCoverErosionOutwardsWaveConditionsOutputTestFactory.Create() + }; - var observerA = mocks.StrictMock(); - var observerB = mocks.StrictMock(); - if (confirm) + var calculationGroup = new CalculationGroup { - observerA.Expect(o => o.UpdateObserver()); - observerB.Expect(o => o.UpdateObserver()); - } + Children = + { + calculationWithOutput, + new GrassCoverErosionOutwardsWaveConditionsCalculation() + } + }; - var group = new CalculationGroup(); - GrassCoverErosionOutwardsWaveConditionsCalculation calculationA = GetValidCalculation(assessmentSection.HydraulicBoundaryDatabase.Locations.First()); - calculationA.Output = GrassCoverErosionOutwardsWaveConditionsOutputTestFactory.Create(); - GrassCoverErosionOutwardsWaveConditionsCalculation calculationB = GetValidCalculation(assessmentSection.HydraulicBoundaryDatabase.Locations.First()); - calculationB.Output = GrassCoverErosionOutwardsWaveConditionsOutputTestFactory.Create(); - group.Children.Add(calculationA); - group.Children.Add(calculationB); - calculationA.Attach(observerA); - calculationB.Attach(observerB); + var calculationObserver = mocks.StrictMock(); + calculationWithOutput.Attach(calculationObserver); - failureMechanism.WaveConditionsCalculationGroup.Children.Add(group); + IAssessmentSection assessmentSection = AssessmentSectionTestHelper.CreateAssessmentSectionStub(null, mocks, "invalidFilePath"); - var nodeData = new GrassCoverErosionOutwardsWaveConditionsCalculationGroupContext(group, - failureMechanism.WaveConditionsCalculationGroup, - failureMechanism, - assessmentSection); - var parentNodeData = new GrassCoverErosionOutwardsWaveConditionsCalculationGroupContext(failureMechanism.WaveConditionsCalculationGroup, - null, - failureMechanism, - assessmentSection); + var nodeData = new GrassCoverErosionOutwardsWaveConditionsCalculationGroupContext( + calculationGroup, null, new GrassCoverErosionOutwardsFailureMechanism(), assessmentSection); var menuBuilder = new CustomItemsOnlyContextMenuBuilder(); + var messageBoxText = ""; DialogBoxHandler = (name, wnd) => { - var dialog = new MessageBoxTester(wnd); - if (confirm) + var helper = new MessageBoxTester(wnd); + messageBoxText = helper.Text; + + helper.ClickCancel(); + }; + + using (var treeViewControl = new TreeViewControl()) + { + gui.Stub(g => g.Get(nodeData, treeViewControl)).Return(menuBuilder); + gui.Stub(g => g.MainWindow).Return(mocks.Stub()); + mocks.ReplayAll(); + + using (ContextMenuStrip contextMenu = info.ContextMenuStrip(nodeData, null, treeViewControl)) { - dialog.ClickOk(); + // When + contextMenu.Items[contextMenuClearOutputIndexRootGroup].PerformClick(); + + // Then + Assert.AreEqual("Weet u zeker dat u alle uitvoer wilt wissen?", messageBoxText); + + Assert.IsTrue(calculationWithOutput.HasOutput); } - else + } + } + + [Test] + public void GivenCalculationsWithOutput_WhenClearAllCalculationsOutputClickedAndContinued_ThenInquiryAndOutputViewsClosedAndCalculationsOutputCleared() + { + // Given + var calculationWithOutput = new GrassCoverErosionOutwardsWaveConditionsCalculation + { + Output = GrassCoverErosionOutwardsWaveConditionsOutputTestFactory.Create() + }; + + var calculationWithoutOutput = new GrassCoverErosionOutwardsWaveConditionsCalculation(); + var calculationGroup = new CalculationGroup + { + Children = { - dialog.ClickCancel(); + calculationWithOutput, + calculationWithoutOutput } }; - using (var treeViewControl = new TreeViewControl()) + var affectedCalculationObserver = mocks.StrictMock(); + affectedCalculationObserver.Expect(o => o.UpdateObserver()); + calculationWithOutput.Attach(affectedCalculationObserver); + + var unaffectedCalculationObserver = mocks.StrictMock(); + calculationWithoutOutput.Attach(unaffectedCalculationObserver); + + IAssessmentSection assessmentSection = AssessmentSectionTestHelper.CreateAssessmentSectionStub(null, mocks, "invalidFilePath"); + + var nodeData = new GrassCoverErosionOutwardsWaveConditionsCalculationGroupContext( + calculationGroup, null, new GrassCoverErosionOutwardsFailureMechanism(), assessmentSection); + + var menuBuilder = new CustomItemsOnlyContextMenuBuilder(); + + var messageBoxText = ""; + DialogBoxHandler = (name, wnd) => { - var mainWindow = mocks.Stub(); + var helper = new MessageBoxTester(wnd); + messageBoxText = helper.Text; - gui.Stub(g => g.Get(nodeData, treeViewControl)).Return(menuBuilder); - gui.Stub(g => g.MainWindow).Return(mainWindow); + helper.ClickOk(); + }; - var calculatorFactory = mocks.Stub(); + using (var treeViewControl = new TreeViewControl()) + { + gui.Stub(g => g.Get(nodeData, treeViewControl)).Return(menuBuilder); + gui.Stub(g => g.MainWindow).Return(mocks.Stub()); mocks.ReplayAll(); - using (new HydraRingCalculatorFactoryConfig(calculatorFactory)) - using (ContextMenuStrip contextMenu = info.ContextMenuStrip(nodeData, parentNodeData, treeViewControl)) + using (ContextMenuStrip contextMenu = info.ContextMenuStrip(nodeData, null, treeViewControl)) { - // Call - contextMenu.Items[contextMenuClearOutputIndexNestedGroup].PerformClick(); + // When + contextMenu.Items[contextMenuClearOutputIndexRootGroup].PerformClick(); - // Assert - if (confirm) - { - Assert.IsNull(calculationA.Output); - Assert.IsNull(calculationB.Output); - } + // Then + Assert.AreEqual("Weet u zeker dat u alle uitvoer wilt wissen?", messageBoxText); + + Assert.IsFalse(calculationWithOutput.HasOutput); } } }