Index: Riskeer/StabilityStoneCover/src/Riskeer.StabilityStoneCover.Plugin/StabilityStoneCoverPlugin.cs =================================================================== diff -u -rfd572b1d0d0be95b5218314d9022665514b68caf -r84ebee0e270d4d9d38d2d8f23e8814022c13fc2c --- Riskeer/StabilityStoneCover/src/Riskeer.StabilityStoneCover.Plugin/StabilityStoneCoverPlugin.cs (.../StabilityStoneCoverPlugin.cs) (revision fd572b1d0d0be95b5218314d9022665514b68caf) +++ Riskeer/StabilityStoneCover/src/Riskeer.StabilityStoneCover.Plugin/StabilityStoneCoverPlugin.cs (.../StabilityStoneCoverPlugin.cs) (revision 84ebee0e270d4d9d38d2d8f23e8814022c13fc2c) @@ -45,6 +45,7 @@ using Riskeer.Common.Plugin; using Riskeer.Common.Service; using Riskeer.Revetment.Data; +using Riskeer.Revetment.Forms.ChangeHandlers; using Riskeer.Revetment.Forms.Views; using Riskeer.Revetment.Service; using Riskeer.StabilityStoneCover.Data; @@ -250,29 +251,25 @@ private static bool CloseStabilityStoneCoverFailureMechanismViewForData(StabilityStoneCoverFailureMechanismView view, object o) { - var assessmentSection = o as IAssessmentSection; var failureMechanism = o as StabilityStoneCoverFailureMechanism; - return assessmentSection != null + return o is IAssessmentSection assessmentSection ? ReferenceEquals(view.AssessmentSection, assessmentSection) : ReferenceEquals(view.FailureMechanism, failureMechanism); } private static bool CloseFailureMechanismResultViewForData(StabilityStoneCoverResultView view, object dataToCloseFor) { - var assessmentSection = dataToCloseFor as IAssessmentSection; - var failureMechanism = dataToCloseFor as StabilityStoneCoverFailureMechanism; - var failureMechanismContext = dataToCloseFor as IFailureMechanismContext; - - if (assessmentSection != null) + if (dataToCloseFor is IAssessmentSection assessmentSection) { return assessmentSection .GetFailureMechanisms() .OfType() .Any(fm => ReferenceEquals(view.FailureMechanism.SectionResults, fm.SectionResults)); } - if (failureMechanismContext != null) + var failureMechanism = dataToCloseFor as StabilityStoneCoverFailureMechanism; + if (dataToCloseFor is IFailureMechanismContext failureMechanismContext) { failureMechanism = failureMechanismContext.WrappedData; } @@ -393,17 +390,14 @@ foreach (ICalculationBase item in nodeData.WrappedData.Children) { - var calculation = item as StabilityStoneCoverWaveConditionsCalculation; - var group = item as CalculationGroup; - - if (calculation != null) + if (item is StabilityStoneCoverWaveConditionsCalculation calculation) { childNodeObjects.Add(new StabilityStoneCoverWaveConditionsCalculationContext(calculation, nodeData.WrappedData, nodeData.FailureMechanism, nodeData.AssessmentSection)); } - else if (group != null) + else if (item is CalculationGroup group) { childNodeObjects.Add(new StabilityStoneCoverWaveConditionsCalculationGroupContext(group, nodeData.WrappedData, @@ -458,17 +452,23 @@ builder.AddRenameItem(); } - builder.AddUpdateForeshoreProfileOfCalculationsItem(calculations, inquiryHelper, - SynchronizeCalculationWithForeshoreProfileHelper.UpdateForeshoreProfileDerivedCalculationInput) + builder.AddUpdateForeshoreProfileOfCalculationsItem( + calculations, inquiryHelper, + SynchronizeCalculationWithForeshoreProfileHelper.UpdateForeshoreProfileDerivedCalculationInput) .AddSeparator() - .AddValidateAllCalculationsInGroupItem(nodeData, - ValidateAllInCalculationGroup, - EnableValidateAndCalculateMenuItemForCalculationGroup) - .AddPerformAllCalculationsInGroupItem(nodeData, - CalculateAllInCalculationGroup, - EnableValidateAndCalculateMenuItemForCalculationGroup) + .AddValidateAllCalculationsInGroupItem( + nodeData, + ValidateAllInCalculationGroup, + EnableValidateAndCalculateMenuItemForCalculationGroup) + .AddPerformAllCalculationsInGroupItem( + nodeData, + CalculateAllInCalculationGroup, + EnableValidateAndCalculateMenuItemForCalculationGroup) .AddSeparator() - .AddClearAllCalculationOutputInGroupItem(group); + .AddClearAllCalculationOutputInGroupItem( + () => calculations.Any(c => c.HasOutput), + new WaveConditionsCalculationOutputChangeHandler( + calculations.Where(c => c.HasOutput), inquiryHelper)); if (isNestedGroup) { Index: Riskeer/StabilityStoneCover/test/Riskeer.StabilityStoneCover.Plugin.Test/TreeNodeInfos/StabilityStoneCoverWaveConditionsCalculationGroupContextTreeNodeInfoTest.cs =================================================================== diff -u -rc6e95a768f3d8e9e8309c2b68a3d8272904e79ab -r84ebee0e270d4d9d38d2d8f23e8814022c13fc2c --- Riskeer/StabilityStoneCover/test/Riskeer.StabilityStoneCover.Plugin.Test/TreeNodeInfos/StabilityStoneCoverWaveConditionsCalculationGroupContextTreeNodeInfoTest.cs (.../StabilityStoneCoverWaveConditionsCalculationGroupContextTreeNodeInfoTest.cs) (revision c6e95a768f3d8e9e8309c2b68a3d8272904e79ab) +++ Riskeer/StabilityStoneCover/test/Riskeer.StabilityStoneCover.Plugin.Test/TreeNodeInfos/StabilityStoneCoverWaveConditionsCalculationGroupContextTreeNodeInfoTest.cs (.../StabilityStoneCoverWaveConditionsCalculationGroupContextTreeNodeInfoTest.cs) (revision 84ebee0e270d4d9d38d2d8f23e8814022c13fc2c) @@ -1195,171 +1195,200 @@ } [Test] - public void ContextMenuStrip_NoCalculations_ClearAllOutputItemDisabled() + public void ContextMenuStrip_CalculationGroupWithCalculationsWithoutOutput_ContextMenuItemClearCalculationsOutputEnabled() { // Setup - var group = new CalculationGroup(); + var calculationGroup = new CalculationGroup + { + Children = + { + new StabilityStoneCoverWaveConditionsCalculation(), + new CalculationGroup + { + Children = + { + new StabilityStoneCoverWaveConditionsCalculation + { + Output = StabilityStoneCoverWaveConditionsOutputTestFactory.Create() + } + } + } + } + }; - var failureMechanism = new StabilityStoneCoverFailureMechanism(); - failureMechanism.WaveConditionsCalculationGroup.Children.Add(group); + IAssessmentSection assessmentSection = AssessmentSectionTestHelper.CreateAssessmentSectionStub(null, mocks, "invalidFilePath"); - IAssessmentSection assessmentSection = AssessmentSectionTestHelper.CreateAssessmentSectionStub( - failureMechanism, mocks, validFilePath); + var nodeData = new StabilityStoneCoverWaveConditionsCalculationGroupContext( + calculationGroup, null, new StabilityStoneCoverFailureMechanism(), assessmentSection); - var nodeData = new StabilityStoneCoverWaveConditionsCalculationGroupContext(group, - failureMechanism.WaveConditionsCalculationGroup, - failureMechanism, - assessmentSection); - var parentNodeData = new StabilityStoneCoverWaveConditionsCalculationGroupContext(failureMechanism.WaveConditionsCalculationGroup, - null, - failureMechanism, - assessmentSection); - var menuBuilder = new CustomItemsOnlyContextMenuBuilder(); using (var treeViewControl = new TreeViewControl()) { - var mainWindow = mocks.Stub(); - gui.Stub(g => g.Get(nodeData, treeViewControl)).Return(menuBuilder); - gui.Stub(g => g.MainWindow).Return(mainWindow); - - var calculatorFactory = mocks.Stub(); + 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 StabilityStoneCoverFailureMechanism(); + var calculationGroup = new CalculationGroup + { + Children = + { + new StabilityStoneCoverWaveConditionsCalculation() + } + }; - IAssessmentSection assessmentSection = AssessmentSectionTestHelper.CreateAssessmentSectionStub( - failureMechanism, mocks, validFilePath); + IAssessmentSection assessmentSection = AssessmentSectionTestHelper.CreateAssessmentSectionStub(null, mocks, "invalidFilePath"); - var group = new CalculationGroup(); - StabilityStoneCoverWaveConditionsCalculation calculationA = GetValidCalculation(assessmentSection.HydraulicBoundaryDatabase.Locations.First()); - StabilityStoneCoverWaveConditionsCalculation calculationB = GetValidCalculation(assessmentSection.HydraulicBoundaryDatabase.Locations.First()); - group.Children.Add(calculationA); - group.Children.Add(calculationB); + var nodeData = new StabilityStoneCoverWaveConditionsCalculationGroupContext( + calculationGroup, null, new StabilityStoneCoverFailureMechanism(), assessmentSection); - failureMechanism.WaveConditionsCalculationGroup.Children.Add(group); - var nodeData = new StabilityStoneCoverWaveConditionsCalculationGroupContext(group, - failureMechanism.WaveConditionsCalculationGroup, - failureMechanism, - assessmentSection); - var parentNodeData = new StabilityStoneCoverWaveConditionsCalculationGroupContext(failureMechanism.WaveConditionsCalculationGroup, - null, - failureMechanism, - assessmentSection); - var menuBuilder = new CustomItemsOnlyContextMenuBuilder(); using (var treeViewControl = new TreeViewControl()) { - var mainWindow = mocks.Stub(); - gui.Stub(g => g.Get(nodeData, treeViewControl)).Return(menuBuilder); - gui.Stub(g => g.MainWindow).Return(mainWindow); + gui.Stub(g => g.MainWindow).Return(mocks.Stub()); mocks.ReplayAll(); - 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_TwoCalculationsAndOutputClickClearAllOutput_ClearOutputAfterConfirmation(true)")] - [TestCase(false, TestName = "Menu_TwoCalculationsAndOutputClickClearAllOutput_ClearOutputAfterConfirmation(false)")] - public void ContextMenuStrip_TwoCalculationsWithOutputClickOnClearAllOutput_OutputRemovedForCalculationsAfterConfirmation(bool confirm) + public void GivenCalculationsWithOutput_WhenClearAllCalculationsOutputClickedAndAborted_ThenInquiryAndCalculationsOutputNotCleared() { - // Setup - var failureMechanism = new StabilityStoneCoverFailureMechanism(); - IAssessmentSection assessmentSection = AssessmentSectionTestHelper.CreateAssessmentSectionStub( - failureMechanism, mocks, validFilePath); + // Given + var calculationWithOutput = new StabilityStoneCoverWaveConditionsCalculation + { + Output = StabilityStoneCoverWaveConditionsOutputTestFactory.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 StabilityStoneCoverWaveConditionsCalculation() + } + }; - var group = new CalculationGroup(); - StabilityStoneCoverWaveConditionsCalculation calculationA = GetValidCalculation(assessmentSection.HydraulicBoundaryDatabase.Locations.First()); - calculationA.Output = StabilityStoneCoverWaveConditionsOutputTestFactory.Create(); - StabilityStoneCoverWaveConditionsCalculation calculationB = GetValidCalculation(assessmentSection.HydraulicBoundaryDatabase.Locations.First()); - calculationB.Output = StabilityStoneCoverWaveConditionsOutputTestFactory.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); - var nodeData = new StabilityStoneCoverWaveConditionsCalculationGroupContext(group, - failureMechanism.WaveConditionsCalculationGroup, - failureMechanism, - assessmentSection); - var parentNodeData = new StabilityStoneCoverWaveConditionsCalculationGroupContext(failureMechanism.WaveConditionsCalculationGroup, - null, - failureMechanism, - assessmentSection); + IAssessmentSection assessmentSection = AssessmentSectionTestHelper.CreateAssessmentSectionStub(null, mocks, "invalidFilePath"); + var nodeData = new StabilityStoneCoverWaveConditionsCalculationGroupContext( + calculationGroup, null, new StabilityStoneCoverFailureMechanism(), 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 StabilityStoneCoverWaveConditionsCalculation + { + Output = StabilityStoneCoverWaveConditionsOutputTestFactory.Create() + }; + + var calculationWithoutOutput = new StabilityStoneCoverWaveConditionsCalculation(); + 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 StabilityStoneCoverWaveConditionsCalculationGroupContext( + calculationGroup, null, new StabilityStoneCoverFailureMechanism(), 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); } } }