// 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 Core.Common.Base;
using Core.Common.Controls.TreeView;
using Core.Common.Gui.Commands;
using Core.Common.Gui.ContextMenu;
using Core.Common.TestUtil;
using NUnit.Extensions.Forms;
using NUnit.Framework;
using Rhino.Mocks;
using Ringtoets.Common.Data.Calculation;
using Ringtoets.Common.Data.FailureMechanism;
using Ringtoets.Common.Forms.PresentationObjects;
using Ringtoets.Common.Forms.TreeNodeInfos;
using BaseResources = Core.Common.Base.Properties.Resources;
using RingtoetsFormsResources = Ringtoets.Common.Forms.Properties.Resources;
namespace Ringtoets.Common.Forms.Test.TreeNodeInfos
{
[TestFixture]
public class RingtoetsContextMenuItemFactoryTest : NUnitFormTest
{
[Test]
public void AddCreateCalculationGroupItem_Always_CreatesDecoratedCalculationGroupItem()
{
// Setup
var mocks = new MockRepository();
var applicationFeatureCommandHandler = mocks.Stub();
var exportImportHandler = mocks.Stub();
var viewCommandsHandler = mocks.StrictMock();
var treeViewControl = mocks.StrictMock();
mocks.ReplayAll();
var calculationGroup = new CalculationGroup();
var menuBuilder = new ContextMenuBuilder(applicationFeatureCommandHandler, exportImportHandler, viewCommandsHandler, calculationGroup, treeViewControl);
// Call
RingtoetsContextMenuItemFactory.AddCreateCalculationGroupItem(menuBuilder, calculationGroup);
// Assert
TestHelper.AssertContextMenuStripContainsItem(menuBuilder.Build(), 0,
RingtoetsFormsResources.CalculationGroup_Add_CalculationGroup,
RingtoetsFormsResources.CalculationGroup_Add_CalculationGroup_Tooltip,
RingtoetsFormsResources.AddFolderIcon);
}
[Test]
public void AddCreateCalculationGroupItem_PerformClickOnCreatedItem_CalculationGroupAdded()
{
// Setup
var mocks = new MockRepository();
var applicationFeatureCommandHandler = mocks.Stub();
var exportImportHandler = mocks.Stub();
var viewCommandsHandler = mocks.StrictMock();
var treeViewControl = mocks.StrictMock();
mocks.ReplayAll();
var calculationGroup = new CalculationGroup();
var menuBuilder = new ContextMenuBuilder(applicationFeatureCommandHandler, exportImportHandler, viewCommandsHandler, calculationGroup, treeViewControl);
RingtoetsContextMenuItemFactory.AddCreateCalculationGroupItem(menuBuilder, calculationGroup);
var contextMenuItem = menuBuilder.Build().Items[0];
// Call
contextMenuItem.PerformClick();
// Assert
Assert.AreEqual(1, calculationGroup.Children.Count);
Assert.IsTrue(calculationGroup.Children[0] is CalculationGroup);
}
[Test]
public void AddCreateCalculationItem_Always_CreatesDecoratedCalculationItem()
{
// Setup
var mocks = new MockRepository();
var failureMechanism = mocks.Stub();
var applicationFeatureCommandHandler = mocks.Stub();
var exportImportHandler = mocks.Stub();
var viewCommandsHandler = mocks.StrictMock();
var treeViewControl = mocks.StrictMock();
mocks.ReplayAll();
var calculationGroup = new CalculationGroup();
var calculationGroupContext = new TestCalculationGroupContext(calculationGroup, failureMechanism);
var menuBuilder = new ContextMenuBuilder(applicationFeatureCommandHandler, exportImportHandler, viewCommandsHandler, calculationGroup, treeViewControl);
// Call
RingtoetsContextMenuItemFactory.AddCreateCalculationItem(menuBuilder, calculationGroupContext, null);
// Assert
TestHelper.AssertContextMenuStripContainsItem(menuBuilder.Build(), 0,
RingtoetsFormsResources.CalculationGroup_Add_Calculation,
RingtoetsFormsResources.CalculationGroup_Add_Calculation_Tooltip,
RingtoetsFormsResources.FailureMechanismIcon);
}
[Test]
public void AddCreateCalculationItem_PerformClickOnCreatedItem_AddCalculationMethodPerformed()
{
// Setup
var mocks = new MockRepository();
var failureMechanism = mocks.Stub();
var applicationFeatureCommandHandler = mocks.Stub();
var exportImportHandler = mocks.Stub();
var viewCommandsHandler = mocks.StrictMock();
var treeViewControl = mocks.StrictMock();
mocks.ReplayAll();
var counter = 0;
var calculationGroup = new CalculationGroup();
var calculationGroupContext = new TestCalculationGroupContext(calculationGroup, failureMechanism);
var menuBuilder = new ContextMenuBuilder(applicationFeatureCommandHandler, exportImportHandler, viewCommandsHandler, calculationGroup, treeViewControl);
RingtoetsContextMenuItemFactory.AddCreateCalculationItem(menuBuilder, calculationGroupContext, context => counter++);
var contextMenuItem = menuBuilder.Build().Items[0];
// Call
contextMenuItem.PerformClick();
// Assert
Assert.AreEqual(1, counter);
}
[Test]
public void AddClearAllCalculationOutputInGroupItem_GroupWithCalculationOutput_CreatesDecoratedAndEnabledClearItem()
{
// Setup
var mocks = new MockRepository();
var applicationFeatureCommandHandler = mocks.Stub();
var exportImportHandler = mocks.Stub();
var viewCommandsHandler = mocks.StrictMock();
var treeViewControl = mocks.StrictMock();
var calculationWithOutput = mocks.StrictMock();
calculationWithOutput.Expect(c => c.HasOutput).Return(true);
mocks.ReplayAll();
var calculationGroup = new CalculationGroup
{
Children =
{
calculationWithOutput
}
};
var menuBuilder = new ContextMenuBuilder(applicationFeatureCommandHandler, exportImportHandler, viewCommandsHandler, calculationGroup, treeViewControl);
// Call
RingtoetsContextMenuItemFactory.AddClearAllCalculationOutputInGroupItem(menuBuilder, calculationGroup);
// Assert
TestHelper.AssertContextMenuStripContainsItem(menuBuilder.Build(), 0,
RingtoetsFormsResources.Clear_all_output,
RingtoetsFormsResources.CalculationGroup_ClearOutput_ToolTip,
RingtoetsFormsResources.ClearIcon);
}
[Test]
public void AddClearAllCalculationOutputInGroupItem_GroupWithoutCalculationOutput_CreatesDecoratedAndDisabledClearItem()
{
// Setup
var mocks = new MockRepository();
var applicationFeatureCommandHandler = mocks.Stub();
var exportImportHandler = mocks.Stub();
var viewCommandsHandler = mocks.StrictMock();
var treeViewControl = mocks.StrictMock();
var calculationWithoutOutput = mocks.StrictMock();
calculationWithoutOutput.Expect(c => c.HasOutput).Return(false);
mocks.ReplayAll();
var calculationGroup = new CalculationGroup
{
Children =
{
calculationWithoutOutput
}
};
var menuBuilder = new ContextMenuBuilder(applicationFeatureCommandHandler, exportImportHandler, viewCommandsHandler, calculationGroup, treeViewControl);
// Call
RingtoetsContextMenuItemFactory.AddClearAllCalculationOutputInGroupItem(menuBuilder, calculationGroup);
// Assert
TestHelper.AssertContextMenuStripContainsItem(menuBuilder.Build(), 0,
RingtoetsFormsResources.Clear_all_output,
RingtoetsFormsResources.CalculationGroup_ClearOutput_No_calculation_with_output_to_clear,
RingtoetsFormsResources.ClearIcon,
false);
}
[Test]
public void AddClearAllCalculationOutputInGroupItem_PerformClickOnCreatedItemAndConfirmChange_CalculationOutputClearedAndObserversNotified()
{
var messageBoxText = "";
var messageBoxTitle = "";
var mocks = new MockRepository();
var applicationFeatureCommandHandler = mocks.Stub();
var exportImportHandler = mocks.Stub();
var viewCommandsHandler = mocks.StrictMock();
var treeViewControl = mocks.StrictMock();
var calculationWithOutput1 = mocks.StrictMock();
var calculationWithOutput2 = mocks.StrictMock();
var calculationWithoutOutput = mocks.StrictMock();
calculationWithOutput1.Stub(c => c.HasOutput).Return(true);
calculationWithOutput2.Stub(c => c.HasOutput).Return(true);
calculationWithoutOutput.Stub(c => c.HasOutput).Return(false);
calculationWithOutput1.Expect(c => c.ClearOutput());
calculationWithOutput1.Expect(c => c.NotifyObservers());
calculationWithOutput2.Expect(c => c.ClearOutput());
calculationWithOutput2.Expect(c => c.NotifyObservers());
mocks.ReplayAll();
DialogBoxHandler = (name, wnd) =>
{
var messageBox = new MessageBoxTester(wnd);
messageBoxText = messageBox.Text;
messageBoxTitle = messageBox.Title;
messageBox.ClickOk();
};
var calculationGroup = new CalculationGroup
{
Children =
{
calculationWithOutput1,
new CalculationGroup
{
Children =
{
calculationWithOutput2,
calculationWithoutOutput
}
}
}
};
var menuBuilder = new ContextMenuBuilder(applicationFeatureCommandHandler, exportImportHandler, viewCommandsHandler, calculationGroup, treeViewControl);
RingtoetsContextMenuItemFactory.AddClearAllCalculationOutputInGroupItem(menuBuilder, calculationGroup);
var contextMenuItem = menuBuilder.Build().Items[0];
// Call
contextMenuItem.PerformClick();
// Assert
Assert.AreEqual(BaseResources.Confirm, messageBoxTitle);
Assert.AreEqual(RingtoetsFormsResources.CalculationGroup_ClearOutput_Are_you_sure_clear_all_output, messageBoxText);
mocks.VerifyAll();
}
[Test]
public void AddClearAllCalculationOutputInGroupItem_PerformClickOnCreatedItemAndCancelChange_CalculationOutputNotCleared()
{
var mocks = new MockRepository();
var applicationFeatureCommandHandler = mocks.Stub();
var exportImportHandler = mocks.Stub();
var viewCommandsHandler = mocks.StrictMock();
var treeViewControl = mocks.StrictMock();
var calculationWithOutput1 = mocks.StrictMock();
var calculationWithOutput2 = mocks.StrictMock();
var calculationWithoutOutput = mocks.StrictMock();
calculationWithOutput1.Stub(c => c.HasOutput).Return(true);
calculationWithOutput2.Stub(c => c.HasOutput).Return(true);
calculationWithoutOutput.Stub(c => c.HasOutput).Return(false);
mocks.ReplayAll();
DialogBoxHandler = (name, wnd) =>
{
var messageBox = new MessageBoxTester(wnd);
messageBox.ClickCancel();
};
var calculationGroup = new CalculationGroup
{
Children =
{
calculationWithOutput1,
new CalculationGroup
{
Children =
{
calculationWithOutput2,
calculationWithoutOutput
}
}
}
};
var menuBuilder = new ContextMenuBuilder(applicationFeatureCommandHandler, exportImportHandler, viewCommandsHandler, calculationGroup, treeViewControl);
RingtoetsContextMenuItemFactory.AddClearAllCalculationOutputInGroupItem(menuBuilder, calculationGroup);
var contextMenuItem = menuBuilder.Build().Items[0];
// Call
contextMenuItem.PerformClick();
mocks.VerifyAll();
}
[Test]
public void AddPerformAllCalculationsInGroupItem_GroupWithCalculations_CreatesDecoratedAndEnabledPerformItem()
{
// Setup
var mocks = new MockRepository();
var applicationFeatureCommandHandler = mocks.Stub();
var exportImportHandler = mocks.Stub();
var viewCommandsHandler = mocks.StrictMock();
var treeViewControl = mocks.StrictMock();
var calculation = mocks.StrictMock();
mocks.ReplayAll();
var calculationGroup = new CalculationGroup
{
Children =
{
calculation
}
};
var menuBuilder = new ContextMenuBuilder(applicationFeatureCommandHandler, exportImportHandler, viewCommandsHandler, calculationGroup, treeViewControl);
// Call
RingtoetsContextMenuItemFactory.AddPerformAllCalculationsInGroupItem(menuBuilder, calculationGroup, null, null);
// Assert
TestHelper.AssertContextMenuStripContainsItem(menuBuilder.Build(), 0,
RingtoetsFormsResources.Calculate_all,
RingtoetsFormsResources.CalculationGroup_CalculateAll_ToolTip,
RingtoetsFormsResources.CalculateAllIcon);
}
[Test]
public void AddPerformAllCalculationsInGroupItem_GroupWithoutCalculations_CreatesDecoratedAndDisabledPerformItem()
{
// Setup
var mocks = new MockRepository();
var applicationFeatureCommandHandler = mocks.Stub();
var exportImportHandler = mocks.Stub();
var viewCommandsHandler = mocks.StrictMock();
var treeViewControl = mocks.StrictMock();
mocks.ReplayAll();
var calculationGroup = new CalculationGroup();
var menuBuilder = new ContextMenuBuilder(applicationFeatureCommandHandler, exportImportHandler, viewCommandsHandler, calculationGroup, treeViewControl);
// Call
RingtoetsContextMenuItemFactory.AddPerformAllCalculationsInGroupItem(menuBuilder, calculationGroup, null, null);
// Assert
TestHelper.AssertContextMenuStripContainsItem(menuBuilder.Build(), 0,
RingtoetsFormsResources.Calculate_all,
RingtoetsFormsResources.CalculationGroup_CalculateAll_No_calculations_to_run,
RingtoetsFormsResources.CalculateAllIcon,
false);
}
[Test]
public void AddPerformAllCalculationsInGroupItem_PerformClickOnCreatedItem_PerformAllCalculationMethodPerformed()
{
// Setup
var mocks = new MockRepository();
var applicationFeatureCommandHandler = mocks.Stub();
var exportImportHandler = mocks.Stub();
var viewCommandsHandler = mocks.StrictMock();
var treeViewControl = mocks.StrictMock();
var calculation = mocks.StrictMock();
var failureMechanism = mocks.StrictMock();
mocks.ReplayAll();
var counter = 0;
var calculationGroup = new CalculationGroup
{
Children =
{
calculation
}
};
var calculationGroupContext = new TestCalculationGroupContext(calculationGroup, failureMechanism);
var menuBuilder = new ContextMenuBuilder(applicationFeatureCommandHandler, exportImportHandler, viewCommandsHandler, calculationGroup, treeViewControl);
RingtoetsContextMenuItemFactory.AddPerformAllCalculationsInGroupItem(menuBuilder, calculationGroup, calculationGroupContext, (group, context) => counter++);
var contextMenuItem = menuBuilder.Build().Items[0];
// Call
contextMenuItem.PerformClick();
// Assert
Assert.AreEqual(1, counter);
}
[Test]
public void AddPerformCalculationItem_Always_CreatesPerformItem()
{
// Setup
var mocks = new MockRepository();
var applicationFeatureCommandHandler = mocks.Stub();
var exportImportHandler = mocks.Stub();
var viewCommandsHandler = mocks.StrictMock();
var treeViewControl = mocks.StrictMock();
mocks.ReplayAll();
var calculation = new TestCalculation();
var menubuilder = new ContextMenuBuilder(applicationFeatureCommandHandler, exportImportHandler, viewCommandsHandler, calculation, treeViewControl);
// Call
RingtoetsContextMenuItemFactory.AddPerformCalculationItem(menubuilder, calculation, null, null);
// Assert
TestHelper.AssertContextMenuStripContainsItem(menubuilder.Build(), 0,
RingtoetsFormsResources.Calculate,
RingtoetsFormsResources.Calculate_ToolTip,
RingtoetsFormsResources.CalculateIcon);
mocks.VerifyAll();
}
[Test]
public void AddPerformCalculationItem_PerformClickOnCreatedItem_PerformCalculationMethod()
{
// Setup
var mocks = new MockRepository();
var applicationFeatureCommandHandler = mocks.Stub();
var exportImportHandler = mocks.Stub();
var viewCommandsHandler = mocks.StrictMock();
var failureMechanisMock = mocks.StrictMock();
var treeViewControl = mocks.StrictMock();
mocks.ReplayAll();
var calculation = new TestCalculation();
var testCalculationContext = new TestCalculationContext(calculation, failureMechanisMock);
var counter = 0;
var menuBuilder = new ContextMenuBuilder(applicationFeatureCommandHandler, exportImportHandler, viewCommandsHandler, calculation, treeViewControl);
RingtoetsContextMenuItemFactory.AddPerformCalculationItem(menuBuilder, calculation, testCalculationContext, (calc, context) => counter++);
var contextMenuItem = menuBuilder.Build().Items[0];
// Call
contextMenuItem.PerformClick();
// Assert
Assert.AreEqual(1, counter);
mocks.VerifyAll();
}
[Test]
public void AddClearCalculationOutputItem_CalculationWithOutput_CreatesDecoratedAndEnabledClearItem()
{
// Setup
var mocks = new MockRepository();
var applicationFeatureCommandHandler = mocks.Stub();
var exportImportHandler = mocks.Stub();
var viewCommandsHandler = mocks.StrictMock();
var treeViewControl = mocks.StrictMock();
var calculationWithOutput = mocks.StrictMock();
calculationWithOutput.Expect(c => c.HasOutput).Return(true);
mocks.ReplayAll();
var menuBuilder = new ContextMenuBuilder(applicationFeatureCommandHandler, exportImportHandler, viewCommandsHandler, calculationWithOutput, treeViewControl);
// Call
RingtoetsContextMenuItemFactory.AddClearCalculationOutputItem(menuBuilder, calculationWithOutput);
// Assert
TestHelper.AssertContextMenuStripContainsItem(menuBuilder.Build(), 0,
RingtoetsFormsResources.Clear_output,
RingtoetsFormsResources.Clear_output_ToolTip,
RingtoetsFormsResources.ClearIcon);
mocks.VerifyAll();
}
[Test]
public void AddClearCalculationOutputItem_CalculationWithoutOutput_CreatesDecoratedAndDisabledClearItem()
{
// Setup
var mocks = new MockRepository();
var applicationFeatureCommandHandler = mocks.Stub();
var exportImportHandler = mocks.Stub();
var viewCommandsHandler = mocks.StrictMock();
var treeViewControl = mocks.StrictMock();
var calculationWithOutput = mocks.StrictMock();
calculationWithOutput.Expect(c => c.HasOutput).Return(false);
mocks.ReplayAll();
var menuBuilder = new ContextMenuBuilder(applicationFeatureCommandHandler, exportImportHandler, viewCommandsHandler, calculationWithOutput, treeViewControl);
// Call
RingtoetsContextMenuItemFactory.AddClearCalculationOutputItem(menuBuilder, calculationWithOutput);
// Assert
TestHelper.AssertContextMenuStripContainsItem(menuBuilder.Build(), 0,
RingtoetsFormsResources.Clear_output,
RingtoetsFormsResources.ClearOutput_No_output_to_clear,
RingtoetsFormsResources.ClearIcon,
false);
mocks.VerifyAll();
}
[Test]
public void AddClearCalculationOutputItem_PerformClickOnCreatedItemAndConfirmChange_CalculationOutputClearedAndObserversNotified()
{
var messageBoxText = "";
var messageBoxTitle = "";
var mocks = new MockRepository();
var applicationFeatureCommandHandler = mocks.Stub();
var exportImportHandler = mocks.Stub();
var viewCommandsHandler = mocks.StrictMock();
var treeViewControl = mocks.StrictMock();
var calculationWithOutput = mocks.StrictMock();
calculationWithOutput.Stub(c => c.HasOutput).Return(true);
calculationWithOutput.Expect(c => c.ClearOutput());
calculationWithOutput.Expect(c => c.NotifyObservers());
mocks.ReplayAll();
DialogBoxHandler = (name, wnd) =>
{
var messageBox = new MessageBoxTester(wnd);
messageBoxText = messageBox.Text;
messageBoxTitle = messageBox.Title;
messageBox.ClickOk();
};
var menuBuilder = new ContextMenuBuilder(applicationFeatureCommandHandler, exportImportHandler, viewCommandsHandler, calculationWithOutput, treeViewControl);
RingtoetsContextMenuItemFactory.AddClearCalculationOutputItem(menuBuilder, calculationWithOutput);
var contextMenuItem = menuBuilder.Build().Items[0];
// Call
contextMenuItem.PerformClick();
// Assert
Assert.AreEqual(BaseResources.Confirm, messageBoxTitle);
Assert.AreEqual(RingtoetsFormsResources.Calculation_ContextMenuStrip_Are_you_sure_clear_output, messageBoxText);
mocks.VerifyAll();
}
[Test]
public void AddClearCalculationOutputItem_PerformClickOnCreatedItemAndCancelChange_CalculationOutputNotCleared()
{
var mocks = new MockRepository();
var applicationFeatureCommandHandler = mocks.Stub();
var exportImportHandler = mocks.Stub();
var viewCommandsHandler = mocks.StrictMock();
var treeViewControl = mocks.StrictMock();
var calculationWithOutput = mocks.StrictMock();
calculationWithOutput.Stub(c => c.HasOutput).Return(true);
mocks.ReplayAll();
DialogBoxHandler = (name, wnd) =>
{
var messageBox = new MessageBoxTester(wnd);
messageBox.ClickCancel();
};
var menuBuilder = new ContextMenuBuilder(applicationFeatureCommandHandler, exportImportHandler, viewCommandsHandler, calculationWithOutput, treeViewControl);
RingtoetsContextMenuItemFactory.AddClearCalculationOutputItem(menuBuilder, calculationWithOutput);
var contextMenuItem = menuBuilder.Build().Items[0];
// Call
contextMenuItem.PerformClick();
mocks.VerifyAll();
}
# region Nested types
private class TestCalculationGroupContext : Observable, ICalculationContext
{
public TestCalculationGroupContext(CalculationGroup wrappedData, IFailureMechanism failureMechanism)
{
WrappedData = wrappedData;
FailureMechanism = failureMechanism;
}
public CalculationGroup WrappedData { get; private set; }
public IFailureMechanism FailureMechanism { get; private set; }
}
private class TestCalculationContext : Observable, ICalculationContext
{
public TestCalculationContext(TestCalculation wrappedData, IFailureMechanism failureMechanism)
{
WrappedData = wrappedData;
FailureMechanism = failureMechanism;
}
public TestCalculation WrappedData { get; private set; }
public IFailureMechanism FailureMechanism { get; private set; }
}
private class TestCalculation : Observable, ICalculation
{
public TestCalculation()
{
Name = "Nieuwe berekening";
}
public string Name { get; set; }
public string Comments { get; set; }
public bool HasOutput
{
get
{
return false;
}
}
public void ClearOutput() { }
public void ClearHydraulicBoundaryLocation() { }
public ICalculationInput GetObservableInput()
{
return null;
}
public ICalculationOutput GetObservableOutput()
{
return null;
}
}
# endregion
}
}