Index: Core/Common/src/Core.Common.Controls.TreeView/TreeViewNodePresenterBase.cs =================================================================== diff -u -r8cae5d69ac2d4cf678486ac2b457c0dfe97089d5 -r84e26203964272f09063fc39791d875e6bd291e1 --- Core/Common/src/Core.Common.Controls.TreeView/TreeViewNodePresenterBase.cs (.../TreeViewNodePresenterBase.cs) (revision 8cae5d69ac2d4cf678486ac2b457c0dfe97089d5) +++ Core/Common/src/Core.Common.Controls.TreeView/TreeViewNodePresenterBase.cs (.../TreeViewNodePresenterBase.cs) (revision 84e26203964272f09063fc39791d875e6bd291e1) @@ -34,37 +34,9 @@ throw new InvalidOperationException(Resources.TreeViewNodePresenterBase_OnNodeRenamed_OnNodeRenamed_must_be_implemented_in_derived_class); } - /// - /// Returns the default drag operation based on pressed control keys and allowed operations - /// It can be used as replacement for the implementation for TreeViewNodePresenterBase<T>::. - /// - public static DragOperations GetDefaultDropOperation(ITreeView treeView, object item, ITreeNode sourceNode, ITreeNode targetNode, DragOperations validOperations) + public static DragOperations GetDefaultDropOperation(DragOperations validOperation) { - if (null != sourceNode) - { - //TreeNode nodeDragging = (TreeNode)sourceNode; - if (sourceNode.TreeView == treeView) - { - // if the user is not forcing an operation using the keyboard default to move within treeview - if ((0 == (Control.ModifierKeys & Keys.Modifiers)) && DragOperations.Move == validOperations) - { - return DragOperations.Move; - } - } - } - - if (((Control.ModifierKeys & Keys.Shift) == Keys.Shift) && DragOperations.Move == validOperations) - { - return DragOperations.Move; - } - - // do not return bitwise operation, preference here is disputable - if (DragOperations.Move == validOperations) - { - return DragOperations.Move; - } - - return DragOperations.None; + return DragOperations.Move == validOperation ? DragOperations.Move : DragOperations.None; } public virtual void OnDragDrop(object item, object itemParent, T target, Index: Core/Plugins/src/Core.Plugins.CommonTools.Gui/Forms/Charting/ChartTreeNodePresenter.cs =================================================================== diff -u -r8cae5d69ac2d4cf678486ac2b457c0dfe97089d5 -r84e26203964272f09063fc39791d875e6bd291e1 --- Core/Plugins/src/Core.Plugins.CommonTools.Gui/Forms/Charting/ChartTreeNodePresenter.cs (.../ChartTreeNodePresenter.cs) (revision 8cae5d69ac2d4cf678486ac2b457c0dfe97089d5) +++ Core/Plugins/src/Core.Plugins.CommonTools.Gui/Forms/Charting/ChartTreeNodePresenter.cs (.../ChartTreeNodePresenter.cs) (revision 84e26203964272f09063fc39791d875e6bd291e1) @@ -44,7 +44,7 @@ { if (item is IChartSeries) { - return GetDefaultDropOperation(TreeView, item, sourceNode, targetNode, validOperations); + return GetDefaultDropOperation(validOperations); } return base.CanDrop(item, sourceNode, targetNode, validOperations); Index: Core/Plugins/src/Core.Plugins.SharpMapGis.Gui/Forms/MapLegendView/MapTreeViewNodePresenter.cs =================================================================== diff -u -r8cae5d69ac2d4cf678486ac2b457c0dfe97089d5 -r84e26203964272f09063fc39791d875e6bd291e1 --- Core/Plugins/src/Core.Plugins.SharpMapGis.Gui/Forms/MapLegendView/MapTreeViewNodePresenter.cs (.../MapTreeViewNodePresenter.cs) (revision 8cae5d69ac2d4cf678486ac2b457c0dfe97089d5) +++ Core/Plugins/src/Core.Plugins.SharpMapGis.Gui/Forms/MapLegendView/MapTreeViewNodePresenter.cs (.../MapTreeViewNodePresenter.cs) (revision 84e26203964272f09063fc39791d875e6bd291e1) @@ -75,7 +75,7 @@ { if (item is Layer) { - return GetDefaultDropOperation(TreeView, item, sourceNode, targetNode, validOperations); + return GetDefaultDropOperation(validOperations); } return DragOperations.None; Index: Core/Plugins/src/Core.Plugins.SharpMapGis.Gui/NodePresenters/MapProjectTreeViewNodePresenter.cs =================================================================== diff -u -r8cae5d69ac2d4cf678486ac2b457c0dfe97089d5 -r84e26203964272f09063fc39791d875e6bd291e1 --- Core/Plugins/src/Core.Plugins.SharpMapGis.Gui/NodePresenters/MapProjectTreeViewNodePresenter.cs (.../MapProjectTreeViewNodePresenter.cs) (revision 8cae5d69ac2d4cf678486ac2b457c0dfe97089d5) +++ Core/Plugins/src/Core.Plugins.SharpMapGis.Gui/NodePresenters/MapProjectTreeViewNodePresenter.cs (.../MapProjectTreeViewNodePresenter.cs) (revision 84e26203964272f09063fc39791d875e6bd291e1) @@ -36,7 +36,7 @@ { if (item is ILayer) { - return GetDefaultDropOperation(TreeView, item, sourceNode, targetNode, validOperations); + return GetDefaultDropOperation(validOperations); } return DragOperations.None; Index: Core/Plugins/test/Core.Plugins.CommonTools.Gui.Test/Forms/Charting/ChartSeriesTreeNodePresenterTest.cs =================================================================== diff -u -rb40c560c540f62ae34260f1aade4d5ec15a45ca2 -r84e26203964272f09063fc39791d875e6bd291e1 --- Core/Plugins/test/Core.Plugins.CommonTools.Gui.Test/Forms/Charting/ChartSeriesTreeNodePresenterTest.cs (.../ChartSeriesTreeNodePresenterTest.cs) (revision b40c560c540f62ae34260f1aade4d5ec15a45ca2) +++ Core/Plugins/test/Core.Plugins.CommonTools.Gui.Test/Forms/Charting/ChartSeriesTreeNodePresenterTest.cs (.../ChartSeriesTreeNodePresenterTest.cs) (revision 84e26203964272f09063fc39791d875e6bd291e1) @@ -65,7 +65,7 @@ nodePresenter.OnNodeRenamed(chartSeries, newName); // Assert - Assert.AreSame(newName, chartSeries.Title); + Assert.AreEqual(newName, chartSeries.Title); } [Test] Index: Core/Plugins/test/Core.Plugins.CommonTools.Gui.Test/Forms/Charting/ChartTreeNodePresenterTest.cs =================================================================== diff -u -rb0ebc3d3a65294faaf85d5f3b8f612efe61c5915 -r84e26203964272f09063fc39791d875e6bd291e1 --- Core/Plugins/test/Core.Plugins.CommonTools.Gui.Test/Forms/Charting/ChartTreeNodePresenterTest.cs (.../ChartTreeNodePresenterTest.cs) (revision b0ebc3d3a65294faaf85d5f3b8f612efe61c5915) +++ Core/Plugins/test/Core.Plugins.CommonTools.Gui.Test/Forms/Charting/ChartTreeNodePresenterTest.cs (.../ChartTreeNodePresenterTest.cs) (revision 84e26203964272f09063fc39791d875e6bd291e1) @@ -1,7 +1,12 @@ -using System.Collections; +using System; +using System.Collections; +using System.Linq; using Core.Common.Controls.Charting; +using Core.Common.Controls.Charting.Series; using Core.Common.Controls.TreeView; +using Core.Common.TestUtil; using Core.Plugins.CommonTools.Gui.Forms.Charting; +using Core.Plugins.CommonTools.Gui.Properties; using NUnit.Framework; using Rhino.Mocks; @@ -11,25 +16,114 @@ public class ChartTreeNodePresenterTest { [Test] - public void CanInsert_TreeViewHasSorter_ReturnFalse() + public void DefaultConstructor_Always_PropertiesSet() { + // Call + var nodePresenter = new ChartTreeNodePresenter(); + + // Assert + Assert.IsInstanceOf>(nodePresenter); + } + + [Test] + public void CanRenameNode_Always_ReturnsTrue() + { // Setup + var nodePresenter = new ChartTreeNodePresenter(); + + // Call + var result = nodePresenter.CanRenameNode(null); + + // Assert + Assert.IsTrue(result); + } + + [Test] + [TestCase("Some name")] + [TestCase("")] + public void UpdateNode_NoKnownSeriesType_PropertiesSetImageNull(string title) + { + // Setup + var nodePresenter = new ChartTreeNodePresenter(); + var node = new TreeNode(null); + var chart = new Chart + { + Title = title, + }; + + // Call + nodePresenter.UpdateNode(null, node, chart); + + // Assert + Assert.AreEqual(string.IsNullOrEmpty(title) ? Resources.ChartTreeNodePresenter_UpdateNode_Chart : title, node.Text); + TestHelper.AssertImagesAreEqual(Resources.Chart, node.Image); + Assert.AreSame(chart, node.Tag); + } + + [Test] + public void OnNodeRenamed_NoChartSeries_DoesNotThrow() + { + // Setup + var nodePresenter = new ChartTreeNodePresenter(); + + // Call + TestDelegate testDelegate = () => nodePresenter.OnNodeRenamed(null, string.Empty); + + // Assert + Assert.DoesNotThrow(testDelegate); + } + + [Test] + public void OnNodeRenamed_NewNodeName_ChartSeriesTitleSetToNodeName() + { + // Setup + var nodePresenter = new ChartTreeNodePresenter(); + var name = ""; + var newName = ""; + var chart = new Chart + { + Title = name + }; + + // Call + nodePresenter.OnNodeRenamed(chart, newName); + + // Assert + Assert.AreEqual(newName, chart.Title); + } + + [Test] + public void GetChildNodeObjects_Always_ReturnsSeries() + { + // Setup var mocks = new MockRepository(); - var sourceNode = mocks.Stub(); - var targetNode = mocks.Stub(); + var nodePresenter = new ChartTreeNodePresenter(); + var chart = mocks.StrictMock(); + chart.Expect(c => c.Series).Return(Enumerable.Empty()); - var treeView = mocks.Stub(); + mocks.ReplayAll(); - var chart = mocks.Stub(); + // Call + var result = nodePresenter.GetChildNodeObjects(chart); - treeView.TreeViewNodeSorter = mocks.Stub(); + // Assert + mocks.VerifyAll(); + } + [Test] + public void CanInsert_TreeViewHasSorter_ReturnFalse() + { + // Setup + var mocks = new MockRepository(); + var treeView = mocks.StrictMock(); + treeView.Expect(tv => tv.TreeViewNodeSorter).Return(mocks.Stub()); + mocks.ReplayAll(); - var nodePresenter = new ChartTreeNodePresenter() { TreeView = treeView }; + var nodePresenter = new ChartTreeNodePresenter { TreeView = treeView }; // Call - var insertionAllowed = nodePresenter.CanInsert(chart, sourceNode, targetNode); + var insertionAllowed = nodePresenter.CanInsert(null, null, null); // Assert Assert.IsFalse(insertionAllowed); @@ -41,26 +135,107 @@ { // Setup var mocks = new MockRepository(); - var sourceNode = mocks.Stub(); - var targetNode = mocks.Stub(); + var treeView = mocks.StrictMock(); + treeView.Expect(tv => tv.TreeViewNodeSorter).Return(null); - var treeView = mocks.Stub(); + mocks.ReplayAll(); - var chart = mocks.Stub(); + var nodePresenter = new ChartTreeNodePresenter { TreeView = treeView }; + // Call + var insertionAllowed = nodePresenter.CanInsert(null, null, null); + + // Assert + Assert.IsTrue(insertionAllowed); + mocks.VerifyAll(); + } + + [Test] + [TestCase(DragOperations.Move)] + [TestCase(DragOperations.None)] + public void CanDrop_ItemNotIChartSeries_ReturnsNone(DragOperations validOperation) + { + // Setup + var nodePresenter = new ChartTreeNodePresenter(); + + // Call + var result = nodePresenter.CanDrop(new object(), null, null, validOperation); + + // Assert + Assert.AreEqual(DragOperations.None, result); + } + + [Test] + [TestCase(DragOperations.Move)] + [TestCase(DragOperations.None)] + public void CanDrop_ItemIChartSeries_ReturnsValidOperation(DragOperations validOperation) + { + // Setup + var mocks = new MockRepository(); + var nodePresenter = new ChartTreeNodePresenter(); + var chartSeries = mocks.StrictMock(); + mocks.ReplayAll(); - // Precondition - Assert.IsNull(treeView.TreeViewNodeSorter); + // Call + var result = nodePresenter.CanDrop(chartSeries, null, null, validOperation); - var nodePresenter = new ChartTreeNodePresenter() { TreeView = treeView }; + // Assert + Assert.AreEqual(validOperation, result); + mocks.VerifyAll(); + } + + [Test] + [TestCase(DragOperations.Move)] + [TestCase(DragOperations.None)] + public void OnDragDrop_ChartSeriesItemIChartParent_RemovesAndInserts(DragOperations operation) + { + // Setup + var mocks = new MockRepository(); + var nodePresenter = new ChartTreeNodePresenter(); + var series = new TestChartSeries(); + var random = new Random(21); + var position = random.Next(); + + var parent = mocks.StrictMock(); + var target = mocks.StrictMock(); + parent.Expect(p => p.RemoveChartSeries(series)).Return(true); + target.Expect(t => t.InsertChartSeries(series, position)); + + mocks.ReplayAll(); + // Call - var insertionAllowed = nodePresenter.CanInsert(chart, sourceNode, targetNode); + nodePresenter.OnDragDrop(series, parent, target, operation, position); // Assert - Assert.IsTrue(insertionAllowed); mocks.VerifyAll(); } + + [Test] + [TestCase(DragOperations.Move)] + [TestCase(DragOperations.None)] + public void OnDragDrop_ChartSeriesItemObjectParent_RemovesAndInserts(DragOperations operation) + { + // Setup + var mocks = new MockRepository(); + var nodePresenter = new ChartTreeNodePresenter(); + var series = new TestChartSeries(); + var random = new Random(21); + var position = random.Next(); + + var parent = new object(); + var target = mocks.StrictMock(); + target.Expect(p => p.RemoveChartSeries(series)).Return(true); + target.Expect(t => t.InsertChartSeries(series, position)); + + mocks.ReplayAll(); + + // Call + nodePresenter.OnDragDrop(series, parent, target, operation, position); + + // Assert + mocks.VerifyAll(); + } } } \ No newline at end of file