Index: Riskeer/WaveImpactAsphaltCover/src/Riskeer.WaveImpactAsphaltCover.Plugin/WaveImpactAsphaltCoverPlugin.cs =================================================================== diff -u -rfd572b1d0d0be95b5218314d9022665514b68caf -r52760c1ed98083bbd196a248ecd8e827c11d5841 --- Riskeer/WaveImpactAsphaltCover/src/Riskeer.WaveImpactAsphaltCover.Plugin/WaveImpactAsphaltCoverPlugin.cs (.../WaveImpactAsphaltCoverPlugin.cs) (revision fd572b1d0d0be95b5218314d9022665514b68caf) +++ Riskeer/WaveImpactAsphaltCover/src/Riskeer.WaveImpactAsphaltCover.Plugin/WaveImpactAsphaltCoverPlugin.cs (.../WaveImpactAsphaltCoverPlugin.cs) (revision 52760c1ed98083bbd196a248ecd8e827c11d5841) @@ -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.IO.Configurations; using Riskeer.Revetment.Service; @@ -250,29 +251,25 @@ private static bool CloseWaveImpactAsphaltCoverFailureMechanismViewForData(WaveImpactAsphaltCoverFailureMechanismView view, object o) { - var assessmentSection = o as IAssessmentSection; var failureMechanism = o as WaveImpactAsphaltCoverFailureMechanism; - return assessmentSection != null + return o is IAssessmentSection assessmentSection ? ReferenceEquals(view.AssessmentSection, assessmentSection) : ReferenceEquals(view.FailureMechanism, failureMechanism); } private static bool CloseFailureMechanismResultViewForData(WaveImpactAsphaltCoverFailureMechanismResultView view, object dataToCloseFor) { - var assessmentSection = dataToCloseFor as IAssessmentSection; - var failureMechanism = dataToCloseFor as WaveImpactAsphaltCoverFailureMechanism; - 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 WaveImpactAsphaltCoverFailureMechanism; + if (dataToCloseFor is IFailureMechanismContext failureMechanismContext) { failureMechanism = failureMechanismContext.WrappedData; } @@ -395,17 +392,14 @@ foreach (ICalculationBase item in nodeData.WrappedData.Children) { - var calculation = item as WaveImpactAsphaltCoverWaveConditionsCalculation; - var group = item as CalculationGroup; - - if (calculation != null) + if (item is WaveImpactAsphaltCoverWaveConditionsCalculation calculation) { childNodeObjects.Add(new WaveImpactAsphaltCoverWaveConditionsCalculationContext(calculation, nodeData.WrappedData, nodeData.FailureMechanism, nodeData.AssessmentSection)); } - else if (group != null) + else if (item is CalculationGroup group) { childNodeObjects.Add(new WaveImpactAsphaltCoverWaveConditionsCalculationGroupContext(group, nodeData.WrappedData, @@ -432,7 +426,8 @@ WaveImpactAsphaltCoverWaveConditionsCalculation[] calculations = group .GetCalculations() - .OfType().ToArray(); + .OfType() + .ToArray(); StrictContextMenuItem generateCalculationsItem = CreateGenerateWaveConditionsCalculationsItem(nodeData); @@ -460,17 +455,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/WaveImpactAsphaltCover/test/Riskeer.WaveImpactAsphaltCover.Plugin.Test/Riskeer.WaveImpactAsphaltCover.Plugin.Test.csproj =================================================================== diff -u -r08e8d26a0715f0f3db57c1d3e86256aa06934db4 -r52760c1ed98083bbd196a248ecd8e827c11d5841 --- Riskeer/WaveImpactAsphaltCover/test/Riskeer.WaveImpactAsphaltCover.Plugin.Test/Riskeer.WaveImpactAsphaltCover.Plugin.Test.csproj (.../Riskeer.WaveImpactAsphaltCover.Plugin.Test.csproj) (revision 08e8d26a0715f0f3db57c1d3e86256aa06934db4) +++ Riskeer/WaveImpactAsphaltCover/test/Riskeer.WaveImpactAsphaltCover.Plugin.Test/Riskeer.WaveImpactAsphaltCover.Plugin.Test.csproj (.../Riskeer.WaveImpactAsphaltCover.Plugin.Test.csproj) (revision 52760c1ed98083bbd196a248ecd8e827c11d5841) @@ -45,6 +45,7 @@ + Index: Riskeer/WaveImpactAsphaltCover/test/Riskeer.WaveImpactAsphaltCover.Plugin.Test/TreeNodeInfos/WaveImpactAsphaltCoverWaveConditionsCalculationGroupContextTreeNodeInfoTest.cs =================================================================== diff -u -rc6e95a768f3d8e9e8309c2b68a3d8272904e79ab -r52760c1ed98083bbd196a248ecd8e827c11d5841 --- Riskeer/WaveImpactAsphaltCover/test/Riskeer.WaveImpactAsphaltCover.Plugin.Test/TreeNodeInfos/WaveImpactAsphaltCoverWaveConditionsCalculationGroupContextTreeNodeInfoTest.cs (.../WaveImpactAsphaltCoverWaveConditionsCalculationGroupContextTreeNodeInfoTest.cs) (revision c6e95a768f3d8e9e8309c2b68a3d8272904e79ab) +++ Riskeer/WaveImpactAsphaltCover/test/Riskeer.WaveImpactAsphaltCover.Plugin.Test/TreeNodeInfos/WaveImpactAsphaltCoverWaveConditionsCalculationGroupContextTreeNodeInfoTest.cs (.../WaveImpactAsphaltCoverWaveConditionsCalculationGroupContextTreeNodeInfoTest.cs) (revision 52760c1ed98083bbd196a248ecd8e827c11d5841) @@ -50,6 +50,7 @@ using Riskeer.HydraRing.Calculation.TestUtil.Calculator; using Riskeer.Revetment.Data; using Riskeer.WaveImpactAsphaltCover.Data; +using Riskeer.WaveImpactAsphaltCover.Data.TestUtil; using Riskeer.WaveImpactAsphaltCover.Forms.PresentationObjects; using RiskeerCommonFormsResources = Riskeer.Common.Forms.Properties.Resources; using CoreCommonGuiResources = Core.Common.Gui.Properties.Resources; @@ -1220,170 +1221,200 @@ } [Test] - public void ContextMenuStrip_NoCalculations_ClearAllOutputItemDisabled() + public void ContextMenuStrip_CalculationGroupWithCalculationsWithoutOutput_ContextMenuItemClearCalculationsOutputEnabled() { // Setup - var failureMechanism = new WaveImpactAsphaltCoverFailureMechanism(); - IAssessmentSection assessmentSection = AssessmentSectionTestHelper.CreateAssessmentSectionStub( - failureMechanism, mocks, validFilePath); + var calculationGroup = new CalculationGroup + { + Children = + { + new WaveImpactAsphaltCoverWaveConditionsCalculation(), + new CalculationGroup + { + Children = + { + new WaveImpactAsphaltCoverWaveConditionsCalculation + { + Output = WaveImpactAsphaltCoverTestDataGenerator.GetRandomWaveImpactAsphaltCoverWaveConditionsOutput() + } + } + } + } + }; - var group = new CalculationGroup(); + IAssessmentSection assessmentSection = AssessmentSectionTestHelper.CreateAssessmentSectionStub(null, mocks, "invalidFilePath"); - failureMechanism.WaveConditionsCalculationGroup.Children.Add(group); - var nodeData = new WaveImpactAsphaltCoverWaveConditionsCalculationGroupContext(group, - failureMechanism.WaveConditionsCalculationGroup, - failureMechanism, - assessmentSection); - var parentNodeData = new WaveImpactAsphaltCoverWaveConditionsCalculationGroupContext(failureMechanism.WaveConditionsCalculationGroup, - null, - failureMechanism, - assessmentSection); + var nodeData = new WaveImpactAsphaltCoverWaveConditionsCalculationGroupContext( + calculationGroup, null, new WaveImpactAsphaltCoverFailureMechanism(), assessmentSection); var menuBuilder = new CustomItemsOnlyContextMenuBuilder(); using (var treeViewControl = new TreeViewControl()) { gui.Stub(g => g.Get(nodeData, treeViewControl)).Return(menuBuilder); gui.Stub(g => g.MainWindow).Return(mocks.Stub()); - - var calculatorFactory = 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 WaveImpactAsphaltCoverFailureMechanism(); - IAssessmentSection assessmentSection = AssessmentSectionTestHelper.CreateAssessmentSectionStub( - failureMechanism, mocks, validFilePath); + var calculationGroup = new CalculationGroup + { + Children = + { + new WaveImpactAsphaltCoverWaveConditionsCalculation() + } + }; - HydraulicBoundaryLocation hydraulicBoundaryLocation = assessmentSection.HydraulicBoundaryDatabase.Locations.First(); + IAssessmentSection assessmentSection = AssessmentSectionTestHelper.CreateAssessmentSectionStub(null, mocks, "invalidFilePath"); - var group = new CalculationGroup(); - WaveImpactAsphaltCoverWaveConditionsCalculation calculationA = GetValidCalculation(hydraulicBoundaryLocation); - WaveImpactAsphaltCoverWaveConditionsCalculation calculationB = GetValidCalculation(hydraulicBoundaryLocation); - group.Children.Add(calculationA); - group.Children.Add(calculationB); + var nodeData = new WaveImpactAsphaltCoverWaveConditionsCalculationGroupContext( + calculationGroup, null, new WaveImpactAsphaltCoverFailureMechanism(), assessmentSection); - failureMechanism.WaveConditionsCalculationGroup.Children.Add(group); - var nodeData = new WaveImpactAsphaltCoverWaveConditionsCalculationGroupContext(group, - failureMechanism.WaveConditionsCalculationGroup, - failureMechanism, - assessmentSection); - var parentNodeData = new WaveImpactAsphaltCoverWaveConditionsCalculationGroupContext(failureMechanism.WaveConditionsCalculationGroup, - null, - failureMechanism, - assessmentSection); - var menuBuilder = new CustomItemsOnlyContextMenuBuilder(); using (var treeViewControl = new TreeViewControl()) { gui.Stub(g => g.Get(nodeData, treeViewControl)).Return(menuBuilder); gui.Stub(g => g.MainWindow).Return(mocks.Stub()); - - var calculatorFactory = 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 WaveImpactAsphaltCoverFailureMechanism(); - IAssessmentSection assessmentSection = AssessmentSectionTestHelper.CreateAssessmentSectionStub( - failureMechanism, mocks, validFilePath); + // Given + var calculationWithOutput = new WaveImpactAsphaltCoverWaveConditionsCalculation + { + Output = WaveImpactAsphaltCoverTestDataGenerator.GetRandomWaveImpactAsphaltCoverWaveConditionsOutput() + }; - 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 WaveImpactAsphaltCoverWaveConditionsCalculation() + } + }; - HydraulicBoundaryLocation hydraulicBoundaryLocation = assessmentSection.HydraulicBoundaryDatabase.Locations.First(); + var calculationObserver = mocks.StrictMock(); + calculationWithOutput.Attach(calculationObserver); - var group = new CalculationGroup(); - WaveImpactAsphaltCoverWaveConditionsCalculation calculationA = GetValidCalculation(hydraulicBoundaryLocation); - calculationA.Output = new WaveImpactAsphaltCoverWaveConditionsOutput(Enumerable.Empty()); - WaveImpactAsphaltCoverWaveConditionsCalculation calculationB = GetValidCalculation(hydraulicBoundaryLocation); - calculationB.Output = new WaveImpactAsphaltCoverWaveConditionsOutput(Enumerable.Empty()); - group.Children.Add(calculationA); - group.Children.Add(calculationB); - calculationA.Attach(observerA); - calculationB.Attach(observerB); + IAssessmentSection assessmentSection = AssessmentSectionTestHelper.CreateAssessmentSectionStub(null, mocks, "invalidFilePath"); - failureMechanism.WaveConditionsCalculationGroup.Children.Add(group); - var nodeData = new WaveImpactAsphaltCoverWaveConditionsCalculationGroupContext(group, - failureMechanism.WaveConditionsCalculationGroup, - failureMechanism, - assessmentSection); - var parentNodeData = new WaveImpactAsphaltCoverWaveConditionsCalculationGroupContext(failureMechanism.WaveConditionsCalculationGroup, - null, - failureMechanism, - assessmentSection); + var nodeData = new WaveImpactAsphaltCoverWaveConditionsCalculationGroupContext( + calculationGroup, null, new WaveImpactAsphaltCoverFailureMechanism(), 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 WaveImpactAsphaltCoverWaveConditionsCalculation + { + Output = WaveImpactAsphaltCoverTestDataGenerator.GetRandomWaveImpactAsphaltCoverWaveConditionsOutput() + }; + + var calculationWithoutOutput = new WaveImpactAsphaltCoverWaveConditionsCalculation(); + var calculationGroup = new CalculationGroup + { + Children = { - dialog.ClickCancel(); + calculationWithOutput, + calculationWithoutOutput } }; + 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 WaveImpactAsphaltCoverWaveConditionsCalculationGroupContext( + calculationGroup, null, new WaveImpactAsphaltCoverFailureMechanism(), assessmentSection); + + var menuBuilder = new CustomItemsOnlyContextMenuBuilder(); + + var messageBoxText = ""; + DialogBoxHandler = (name, wnd) => + { + var helper = new MessageBoxTester(wnd); + messageBoxText = helper.Text; + + helper.ClickOk(); + }; + using (var treeViewControl = new TreeViewControl()) { gui.Stub(g => g.Get(nodeData, treeViewControl)).Return(menuBuilder); gui.Stub(g => g.MainWindow).Return(mocks.Stub()); - - var calculatorFactory = 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); } } }