// 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 Lesser 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 Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser 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 System;
using System.Windows.Forms;
using Core.Common.Base;
using Core.Common.TestUtil;
using NUnit.Extensions.Forms;
using NUnit.Framework;
using Rhino.Mocks;
namespace Core.Common.Controls.TreeView.Test
{
[TestFixture]
public class TreeViewControlTest : NUnitFormTest
{
[Test]
public void DefaultConstructor_InitializedTreeViewControl()
{
// Call
using (var treeViewControl = new TreeViewControl())
{
// Assert
var treeView = treeViewControl.Controls[0] as System.Windows.Forms.TreeView;
Assert.NotNull(treeView);
Assert.IsTrue(treeView.AllowDrop);
Assert.IsTrue(treeView.LabelEdit);
Assert.IsFalse(treeView.HideSelection);
Assert.AreEqual(TreeViewDrawMode.Normal, treeView.DrawMode);
Assert.AreEqual("\\", treeView.PathSeparator);
Assert.NotNull(treeView.ImageList);
Assert.AreEqual(0, treeView.ImageList.Images.Count);
Assert.NotNull(treeView.StateImageList);
Assert.AreEqual(2, treeView.StateImageList.Images.Count);
}
}
[Test]
public void RegisterTreeNodeInfo_Null_ThrowsNullReferenceException()
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
// Call
TestDelegate test = () => treeViewControl.RegisterTreeNodeInfo(null);
// Assert
Assert.Throws(test);
}
}
[Test]
public void RegisterTreeNodeInfo_NodeInfoWithoutTagType_ThrowsArgumentNullException()
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
var treeNodeInfo = new TreeNodeInfo();
// Call
TestDelegate test = () => treeViewControl.RegisterTreeNodeInfo(treeNodeInfo);
// Assert
Assert.Throws(test);
}
}
[Test]
public void RegisterTreeNodeInfo_NodeInfoWithTagType_DoesNotThrow()
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
var treeNodeInfo = new TreeNodeInfo
{
TagType = typeof(object)
};
// Call
TestDelegate test = () => treeViewControl.RegisterTreeNodeInfo(treeNodeInfo);
// Assert
Assert.DoesNotThrow(test);
}
}
[Test]
public void RegisterTreeNodeInfo_NodeInfoForTagTypeAlreadySet_OverridesNodeInfo()
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
var treeNodeInfo = new TreeNodeInfo
{
TagType = typeof(object),
CanRename = (o, p) => false
};
var treeNodeInfoOverride = new TreeNodeInfo
{
TagType = typeof(object),
CanRename = (o, p) => true
};
treeViewControl.RegisterTreeNodeInfo(treeNodeInfo);
var dataObject = new object();
treeViewControl.Data = dataObject;
// Call
treeViewControl.RegisterTreeNodeInfo(treeNodeInfoOverride);
// Assert
Assert.IsTrue(treeViewControl.CanRenameNodeForData(dataObject));
}
}
[Test]
public void Data_SetToNull_DataIsNull()
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
// Call
treeViewControl.Data = null;
// Assert
Assert.IsNull(treeViewControl.Data);
}
}
[Test]
public void Data_NoNodeInfoSet_ThrowsInvalidOperationException()
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
var testNodeData = new object();
// Call
TestDelegate test = () => treeViewControl.Data = testNodeData;
// Assert
Assert.Throws(test);
}
}
[Test]
public void Data_NodeInfoSet_DataSet()
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
treeViewControl.RegisterTreeNodeInfo(new TreeNodeInfo
{
TagType = typeof(object)
});
var testNodeData = new object();
// Call
treeViewControl.Data = testNodeData;
// Assert
Assert.AreSame(testNodeData, treeViewControl.Data);
Assert.AreSame(testNodeData, treeViewControl.SelectedData);
}
}
[Test]
public void CanRenameNodeForData_Null_ReturnsFalse()
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
var treeNodeInfo = new TreeNodeInfo
{
TagType = typeof(object),
CanRename = (o, p) => true
};
treeViewControl.RegisterTreeNodeInfo(treeNodeInfo);
treeViewControl.Data = new object();
// Call
var result = treeViewControl.CanRenameNodeForData(null);
// Assert
Assert.IsFalse(result);
}
}
[Test]
public void CanRenameNodeForData_DataNotSet_ReturnsFalse()
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
var treeNodeInfo = new TreeNodeInfo
{
TagType = typeof(object),
CanRename = (o, p) => true
};
treeViewControl.RegisterTreeNodeInfo(treeNodeInfo);
// Call
var result = treeViewControl.CanRenameNodeForData(new object());
// Assert
Assert.IsFalse(result);
}
}
[Test]
[TestCase(true)]
[TestCase(false)]
public void CanRenameNodeForData_DataSet_ReturnsValueOfCanRename(bool expected)
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
var treeNodeInfo = new TreeNodeInfo
{
TagType = typeof(object),
CanRename = (o, p) => expected
};
treeViewControl.RegisterTreeNodeInfo(treeNodeInfo);
var dataObject = new object();
treeViewControl.Data = dataObject;
// Call
var result = treeViewControl.CanRenameNodeForData(dataObject);
// Assert
Assert.AreEqual(expected, result);
}
}
[Test]
[RequiresSTA]
public void TryRenameNodeForData_NotRenameable_ShowsDialog()
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
var treeNodeInfo = new TreeNodeInfo
{
TagType = typeof(object),
CanRename = (o, p) => false
};
treeViewControl.RegisterTreeNodeInfo(treeNodeInfo);
var dataObject = new object();
treeViewControl.Data = dataObject;
string messageBoxText = null;
DialogBoxHandler = (name, wnd) =>
{
var helper = new MessageBoxTester(wnd);
messageBoxText = helper.Text;
helper.ClickOk();
};
// Call
treeViewControl.TryRenameNodeForData(dataObject);
// Assert
Assert.AreEqual(Properties.Resources.TreeViewControl_The_selected_item_cannot_be_renamed, messageBoxText);
}
}
[Test]
[RequiresSTA]
public void TryRenameNodeForData_Renameable_BeginEdit()
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
var treeNodeInfo = new TreeNodeInfo
{
TagType = typeof(object),
CanRename = (o, p) => true
};
treeViewControl.RegisterTreeNodeInfo(treeNodeInfo);
var dataObject = new object();
treeViewControl.Data = dataObject;
try
{
WindowsFormsTestHelper.Show(treeViewControl);
// Call
treeViewControl.TryRenameNodeForData(dataObject);
// Assert
var treeView = (System.Windows.Forms.TreeView) treeViewControl.Controls[0];
Assert.IsTrue(treeView.Nodes[0].IsEditing);
}
finally
{
WindowsFormsTestHelper.CloseAll();
}
}
}
[Test]
public void CanRemoveNodeForData_Null_ReturnsFalse()
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
var treeNodeInfo = new TreeNodeInfo
{
TagType = typeof(object),
CanRemove = (o, p) => true
};
treeViewControl.RegisterTreeNodeInfo(treeNodeInfo);
treeViewControl.Data = new object();
// Call
var result = treeViewControl.CanRemoveNodeForData(null);
// Assert
Assert.IsFalse(result);
}
}
[Test]
public void CanRemoveNodeForData_DataNotSet_ReturnsFalse()
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
var treeNodeInfo = new TreeNodeInfo
{
TagType = typeof(object),
CanRemove = (o, p) => true
};
treeViewControl.RegisterTreeNodeInfo(treeNodeInfo);
// Call
var result = treeViewControl.CanRemoveNodeForData(new object());
// Assert
Assert.IsFalse(result);
}
}
[Test]
[TestCase(true)]
[TestCase(false)]
public void CanRemoveNodeForData_DataSet_ReturnsValueOfCanRename(bool expected)
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
var onNodeRemovedHit = 0;
var onDataDeletedHit = 0;
var treeNodeInfo = new TreeNodeInfo
{
TagType = typeof(object),
CanRemove = (o, p) => expected,
OnNodeRemoved = (o, p) => onNodeRemovedHit++
};
treeViewControl.DataDeleted += (sender, args) => onDataDeletedHit++;
treeViewControl.RegisterTreeNodeInfo(treeNodeInfo);
var dataObject = new object();
treeViewControl.Data = dataObject;
// Call
var result = treeViewControl.CanRemoveNodeForData(dataObject);
// Assert
Assert.AreEqual(expected, result);
Assert.AreEqual(0, onNodeRemovedHit);
Assert.AreEqual(0, onDataDeletedHit);
}
}
[Test]
[RequiresSTA]
public void TryRemoveNodeForData_NotRemoveable_ShowsDialog()
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
var onNodeRemovedHit = 0;
var onDataDeletedHit = 0;
var treeNodeInfo = new TreeNodeInfo
{
TagType = typeof(object),
CanRemove = (o, p) => false,
OnNodeRemoved = (o, p) => onNodeRemovedHit++
};
treeViewControl.DataDeleted += (sender, args) => onDataDeletedHit++;
treeViewControl.RegisterTreeNodeInfo(treeNodeInfo);
var dataObject = new object();
treeViewControl.Data = dataObject;
string messageBoxText = null;
DialogBoxHandler = (name, wnd) =>
{
var helper = new MessageBoxTester(wnd);
messageBoxText = helper.Text;
helper.ClickOk();
};
// Call
treeViewControl.TryRemoveNodeForData(dataObject);
// Assert
Assert.AreEqual(0, onNodeRemovedHit);
Assert.AreEqual(0, onDataDeletedHit);
Assert.AreEqual(Properties.Resources.TreeViewControl_The_selected_item_cannot_be_removed, messageBoxText);
}
}
[Test]
[RequiresSTA]
public void TryRemoveNodeForData_Removeable_OnNodeRemovedAndDataDeletedCalled()
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
var onNodeRemovedHit = 0;
var onDataDeletedHit = 0;
var treeNodeInfo = new TreeNodeInfo
{
TagType = typeof(object),
CanRemove = (o, p) => true,
OnNodeRemoved = (o, p) => onNodeRemovedHit++
};
treeViewControl.DataDeleted += (sender, args) => onDataDeletedHit++;
treeViewControl.RegisterTreeNodeInfo(treeNodeInfo);
var dataObject = new object();
treeViewControl.Data = dataObject;
try
{
WindowsFormsTestHelper.Show(treeViewControl);
string messageBoxText = null;
DialogBoxHandler = (name, wnd) =>
{
var helper = new MessageBoxTester(wnd);
messageBoxText = helper.Text;
helper.ClickOk();
};
// Call
treeViewControl.TryRemoveNodeForData(dataObject);
// Assert
Assert.AreEqual(1, onNodeRemovedHit);
Assert.AreEqual(1, onDataDeletedHit);
Assert.AreEqual(Properties.Resources.TreeViewControl_Are_you_sure_you_want_to_remove_the_selected_item, messageBoxText);
}
finally
{
WindowsFormsTestHelper.CloseAll();
}
}
}
[Test]
[RequiresSTA]
public void TryRemoveNodeForData_RemoveableCancelClicked_OnNodeRemovedNotCalled()
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
var hit = 0;
var treeNodeInfo = new TreeNodeInfo
{
TagType = typeof(object),
CanRemove = (o, p) => true,
OnNodeRemoved = (o, p) => hit++
};
treeViewControl.RegisterTreeNodeInfo(treeNodeInfo);
var dataObject = new object();
treeViewControl.Data = dataObject;
try
{
WindowsFormsTestHelper.Show(treeViewControl);
string messageBoxText = null;
DialogBoxHandler = (name, wnd) =>
{
var helper = new MessageBoxTester(wnd);
messageBoxText = helper.Text;
helper.ClickCancel();
};
// Call
treeViewControl.TryRemoveNodeForData(dataObject);
// Assert
Assert.AreEqual(0, hit);
Assert.AreEqual(Properties.Resources.TreeViewControl_Are_you_sure_you_want_to_remove_the_selected_item, messageBoxText);
}
finally
{
WindowsFormsTestHelper.CloseAll();
}
}
}
[Test]
public void CanExpandOrCollapseForData_NoDataForNull_ReturnsFalse()
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
var treeNodeInfo = new TreeNodeInfo
{
TagType = typeof(object)
};
treeViewControl.RegisterTreeNodeInfo(treeNodeInfo);
// Call
var result = treeViewControl.CanExpandOrCollapseForData(null);
// Assert
Assert.IsFalse(result);
}
}
[Test]
public void CanExpandOrCollapseForData_NoChildren_ReturnsFalse()
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
var treeNodeInfo = new TreeNodeInfo
{
TagType = typeof(object)
};
treeViewControl.RegisterTreeNodeInfo(treeNodeInfo);
var data = new object();
treeViewControl.Data = data;
// Call
var result = treeViewControl.CanExpandOrCollapseForData(data);
// Assert
Assert.IsFalse(result);
}
}
[Test]
public void CanExpandOrCollapseForData_WithChildren_ReturnsTrue()
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
var treeNodeInfo = new TreeNodeInfo
{
TagType = typeof(object),
ChildNodeObjects = o => new[]
{
string.Empty
}
};
var childTreeNodeInfo = new TreeNodeInfo
{
TagType = typeof(string)
};
treeViewControl.RegisterTreeNodeInfo(treeNodeInfo);
treeViewControl.RegisterTreeNodeInfo(childTreeNodeInfo);
var data = new object();
treeViewControl.Data = data;
// Call
var result = treeViewControl.CanExpandOrCollapseForData(data);
// Assert
Assert.IsTrue(result);
}
}
[Test]
public void TryCollapseAllNodesForData_WithoutChildrenForNull_NoChange()
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
var treeNodeInfo = new TreeNodeInfo
{
TagType = typeof(object),
};
treeViewControl.RegisterTreeNodeInfo(treeNodeInfo);
var data = new object();
treeViewControl.Data = data;
var treeView = (System.Windows.Forms.TreeView) treeViewControl.Controls[0];
var treeNode = treeView.Nodes[0];
treeNode.Expand();
// Call
treeViewControl.TryCollapseAllNodesForData(null);
// Assert
Assert.IsTrue(treeNode.IsExpanded);
}
}
[Test]
public void TryCollapseAllNodesForData_WithoutChildren_Collapsed()
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
var treeNodeInfo = new TreeNodeInfo
{
TagType = typeof(object)
};
treeViewControl.RegisterTreeNodeInfo(treeNodeInfo);
var data = new object();
treeViewControl.Data = data;
var treeView = (System.Windows.Forms.TreeView) treeViewControl.Controls[0];
var treeNode = treeView.Nodes[0];
treeNode.Expand();
// Call
treeViewControl.TryCollapseAllNodesForData(data);
// Assert
Assert.IsFalse(treeNode.IsExpanded);
}
}
[Test]
public void TryCollapseAllNodesForData_WithChildren_CollapsesNodeAndChildren()
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
var treeNodeInfo = new TreeNodeInfo
{
TagType = typeof(object),
ChildNodeObjects = o => new[]
{
string.Empty
}
};
var childTreeNodeInfo = new TreeNodeInfo
{
TagType = typeof(string)
};
treeViewControl.RegisterTreeNodeInfo(treeNodeInfo);
treeViewControl.RegisterTreeNodeInfo(childTreeNodeInfo);
var data = new object();
treeViewControl.Data = data;
var treeView = (System.Windows.Forms.TreeView) treeViewControl.Controls[0];
var treeNode = treeView.Nodes[0];
treeNode.Expand();
var childNode = treeNode.Nodes[0];
childNode.Expand();
// Call
treeViewControl.TryCollapseAllNodesForData(data);
// Assert
Assert.IsFalse(treeNode.IsExpanded);
Assert.IsFalse(childNode.IsExpanded);
}
}
[Test]
public void TryExpandAllNodesForData_ForNull_NoChange()
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
var treeNodeInfo = new TreeNodeInfo
{
TagType = typeof(object)
};
treeViewControl.RegisterTreeNodeInfo(treeNodeInfo);
var data = new object();
treeViewControl.Data = data;
var treeView = (System.Windows.Forms.TreeView) treeViewControl.Controls[0];
var treeNode = treeView.Nodes[0];
treeNode.Collapse();
// Call
treeViewControl.TryExpandAllNodesForData(null);
// Assert
Assert.IsFalse(treeNode.IsExpanded);
}
}
[Test]
public void TryExpandAllNodesForData_WithoutChildren_Expanded()
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
var treeNodeInfo = new TreeNodeInfo
{
TagType = typeof(object)
};
treeViewControl.RegisterTreeNodeInfo(treeNodeInfo);
var data = new object();
treeViewControl.Data = data;
var treeView = (System.Windows.Forms.TreeView) treeViewControl.Controls[0];
var treeNode = treeView.Nodes[0];
treeNode.Collapse();
// Call
treeViewControl.TryExpandAllNodesForData(data);
// Assert
Assert.IsTrue(treeNode.IsExpanded);
}
}
[Test]
public void TryExpandAllNodesForData_WithChildren_ExpandsNodeAndChildren()
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
var treeNodeInfo = new TreeNodeInfo
{
TagType = typeof(object),
ChildNodeObjects = o => new[]
{
string.Empty
}
};
var childTreeNodeInfo = new TreeNodeInfo
{
TagType = typeof(string)
};
treeViewControl.RegisterTreeNodeInfo(treeNodeInfo);
treeViewControl.RegisterTreeNodeInfo(childTreeNodeInfo);
var data = new object();
treeViewControl.Data = data;
var treeView = (System.Windows.Forms.TreeView) treeViewControl.Controls[0];
var treeNode = treeView.Nodes[0];
treeNode.Collapse();
var childNode = treeNode.Nodes[0];
childNode.Collapse();
// Call
treeViewControl.TryExpandAllNodesForData(data);
// Assert
Assert.IsTrue(treeNode.IsExpanded);
Assert.IsTrue(childNode.IsExpanded);
}
}
[Test]
public void TrySelectNodeForData_NoData_SelectNull()
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
var treeNodeInfo = new TreeNodeInfo
{
TagType = typeof(object),
ChildNodeObjects = o => new[]
{
string.Empty
}
};
treeViewControl.RegisterTreeNodeInfo(treeNodeInfo);
// Call
treeViewControl.TrySelectNodeForData(null);
// Assert
Assert.IsNull(treeViewControl.SelectedData);
}
}
[Test]
public void TrySelectNodeForData_WithChildDataSelectRoot_RootSelected()
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
var treeNodeInfo = new TreeNodeInfo
{
TagType = typeof(object),
ChildNodeObjects = o => new[]
{
string.Empty
}
};
var childTreeNodeInfo = new TreeNodeInfo
{
TagType = typeof(string)
};
treeViewControl.RegisterTreeNodeInfo(treeNodeInfo);
treeViewControl.RegisterTreeNodeInfo(childTreeNodeInfo);
var data = new object();
treeViewControl.Data = data;
// Call
treeViewControl.TrySelectNodeForData(data);
// Assert
Assert.AreSame(data, treeViewControl.SelectedData);
}
}
[Test]
public void TrySelectNodeForData_WithChildDataSelectChild_ChildSelected()
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
var treeNodeInfo = new TreeNodeInfo
{
TagType = typeof(object),
ChildNodeObjects = o => new[]
{
string.Empty
}
};
var childTreeNodeInfo = new TreeNodeInfo
{
TagType = typeof(string)
};
treeViewControl.RegisterTreeNodeInfo(treeNodeInfo);
treeViewControl.RegisterTreeNodeInfo(childTreeNodeInfo);
var data = new object();
treeViewControl.Data = data;
// Call
treeViewControl.TrySelectNodeForData(string.Empty);
// Assert
Assert.AreSame(string.Empty, treeViewControl.SelectedData);
}
}
[Test]
public void TrySelectNodeForData_WithChildDataSelectNull_NoSelection()
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
var treeNodeInfo = new TreeNodeInfo
{
TagType = typeof(object),
ChildNodeObjects = o => new[]
{
string.Empty
}
};
var childTreeNodeInfo = new TreeNodeInfo
{
TagType = typeof(string)
};
treeViewControl.RegisterTreeNodeInfo(treeNodeInfo);
treeViewControl.RegisterTreeNodeInfo(childTreeNodeInfo);
var data = new object();
treeViewControl.Data = data;
// Call
treeViewControl.TrySelectNodeForData(null);
// Assert
Assert.IsNull(treeViewControl.SelectedData);
}
}
[Test]
public void TryGetPathForData_WithChildDataForRoot_ReturnsPathToRoot()
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
var rootText = "root";
var treeNodeInfo = new TreeNodeInfo
{
TagType = typeof(object),
ChildNodeObjects = o => new[]
{
string.Empty
},
Text = o => rootText
};
var childTreeNodeInfo = new TreeNodeInfo
{
TagType = typeof(string),
Text = o => "child"
};
treeViewControl.RegisterTreeNodeInfo(treeNodeInfo);
treeViewControl.RegisterTreeNodeInfo(childTreeNodeInfo);
var data = new object();
treeViewControl.Data = data;
// Call
var result = treeViewControl.TryGetPathForData(data);
// Assert
Assert.AreEqual(rootText, result);
}
}
[Test]
public void TryGetPathForData_WithChildDataForChild_ReturnsPathToChild()
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
var rootText = "root";
var childText = "child";
var treeNodeInfo = new TreeNodeInfo
{
TagType = typeof(object),
ChildNodeObjects = o => new[]
{
string.Empty
},
Text = o => rootText
};
var childTreeNodeInfo = new TreeNodeInfo
{
TagType = typeof(string),
Text = o => "child"
};
treeViewControl.RegisterTreeNodeInfo(treeNodeInfo);
treeViewControl.RegisterTreeNodeInfo(childTreeNodeInfo);
var data = new object();
treeViewControl.Data = data;
var treeView = (System.Windows.Forms.TreeView) treeViewControl.Controls[0];
// Call
var result = treeViewControl.TryGetPathForData(string.Empty);
// Assert
Assert.AreEqual(rootText + treeView.PathSeparator + childText, result);
}
}
[Test]
public void TryGetPathForData_WithChildDataForNull_ReturnsNull()
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
var treeNodeInfo = new TreeNodeInfo
{
TagType = typeof(object),
ChildNodeObjects = o => new[]
{
string.Empty
},
Text = o => "root"
};
var childTreeNodeInfo = new TreeNodeInfo
{
TagType = typeof(string),
Text = o => "child"
};
treeViewControl.RegisterTreeNodeInfo(treeNodeInfo);
treeViewControl.RegisterTreeNodeInfo(childTreeNodeInfo);
var data = new object();
treeViewControl.Data = data;
// Call
var result = treeViewControl.TryGetPathForData(null);
// Assert
Assert.IsNull(result);
}
}
[Test]
[RequiresSTA]
public void SelectedDataChanged_ListenerNotSet_DoesNotThrow()
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
var treeNodeInfo = new TreeNodeInfo
{
TagType = typeof(object),
ChildNodeObjects = o => new[]
{
string.Empty
},
Text = o => "root"
};
var childTreeNodeInfo = new TreeNodeInfo
{
TagType = typeof(string),
Text = o => "child"
};
treeViewControl.RegisterTreeNodeInfo(treeNodeInfo);
treeViewControl.RegisterTreeNodeInfo(childTreeNodeInfo);
var data = new object();
treeViewControl.Data = data;
try
{
WindowsFormsTestHelper.Show(treeViewControl);
// Call
TestDelegate test = () => treeViewControl.TrySelectNodeForData(string.Empty);
// Assert
Assert.DoesNotThrow(test);
}
finally
{
WindowsFormsTestHelper.CloseAll();
}
}
}
[Test]
[RequiresSTA]
public void SelectedDataChanged_ListenerSetOnInit_SelectedDataChangedInvokedOnce()
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
var hit = 0;
treeViewControl.SelectedDataChanged += (sender, args) => hit++;
var treeNodeInfo = new TreeNodeInfo
{
TagType = typeof(object),
ChildNodeObjects = o => new[]
{
string.Empty
},
Text = o => "root"
};
var childTreeNodeInfo = new TreeNodeInfo
{
TagType = typeof(string),
Text = o => "child"
};
treeViewControl.RegisterTreeNodeInfo(treeNodeInfo);
treeViewControl.RegisterTreeNodeInfo(childTreeNodeInfo);
var data = new object();
try
{
WindowsFormsTestHelper.Show(treeViewControl);
// Call
treeViewControl.Data = data;
// Assert
Assert.AreEqual(1, hit);
}
finally
{
WindowsFormsTestHelper.CloseAll();
}
}
}
[Test]
[RequiresSTA]
public void SelectedDataChanged_ListenerSetOnSelectChild_SelectedDataChangedInvokedOnce()
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
var hit = 0;
var treeNodeInfo = new TreeNodeInfo
{
TagType = typeof(object),
ChildNodeObjects = o => new[]
{
string.Empty
},
Text = o => "root"
};
var childTreeNodeInfo = new TreeNodeInfo
{
TagType = typeof(string),
Text = o => "child"
};
treeViewControl.RegisterTreeNodeInfo(treeNodeInfo);
treeViewControl.RegisterTreeNodeInfo(childTreeNodeInfo);
var data = new object();
try
{
WindowsFormsTestHelper.Show(treeViewControl);
treeViewControl.Data = data;
treeViewControl.SelectedDataChanged += (sender, args) => hit++;
// Call
treeViewControl.TrySelectNodeForData(string.Empty);
// Assert
Assert.AreEqual(1, hit);
}
finally
{
WindowsFormsTestHelper.CloseAll();
}
}
}
[Test]
[RequiresSTA]
public void DataDoubleClick_ListenerSetOnNodeDoubleClick_DataDoubleClickInvoked()
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
var identifier = "identifier";
var hit = 0;
treeViewControl.DataDoubleClick += (n, o) => hit++;
var treeView = (System.Windows.Forms.TreeView) treeViewControl.Controls[0];
treeView.Name = identifier;
try
{
WindowsFormsTestHelper.Show(treeViewControl);
var treeViewTester = new TreeViewTester(identifier);
// Call
treeViewTester.FireEvent("DoubleClick", new NodeLabelEditEventArgs(null, null));
// Assert
Assert.AreEqual(1, hit);
}
finally
{
WindowsFormsTestHelper.CloseAll();
}
}
}
[Test]
[RequiresSTA]
public void DataDoubleClick_ListenerNotSetOnNodeDoubleClick_DoesNotThrow()
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
var identifier = "identifier";
var treeView = (System.Windows.Forms.TreeView) treeViewControl.Controls[0];
treeView.Name = identifier;
try
{
WindowsFormsTestHelper.Show(treeViewControl);
var treeViewTester = new TreeViewTester(identifier);
// Call
TestDelegate test = () => treeViewTester.FireEvent("DoubleClick", new NodeLabelEditEventArgs(null, null));
// Assert
Assert.DoesNotThrow(test);
}
finally
{
WindowsFormsTestHelper.CloseAll();
}
}
}
[Test]
[RequiresSTA]
public void BeforeLabelEdit_Always_CanRenameInvoked()
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
var identifier = "identifier";
var hit = 0;
var treeNodeInfo = new TreeNodeInfo
{
TagType = typeof(object),
CanRename = (o, p) =>
{
hit++;
return false;
}
};
treeViewControl.RegisterTreeNodeInfo(treeNodeInfo);
treeViewControl.Data = new object();
var treeView = (System.Windows.Forms.TreeView) treeViewControl.Controls[0];
treeView.Name = identifier;
try
{
WindowsFormsTestHelper.Show(treeViewControl);
var treeViewTester = new TreeViewTester(identifier);
// Call
treeViewTester.FireEvent("BeforeLabelEdit", new NodeLabelEditEventArgs(treeView.SelectedNode, null));
// Assert
Assert.AreEqual(1, hit);
}
finally
{
WindowsFormsTestHelper.CloseAll();
}
}
}
[Test]
[RequiresSTA]
[TestCase(true)]
[TestCase(false)]
public void AfterLabelEdit_DependingOnNewLabel_OnNodeRenamedInvoked(bool newLabel)
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
var identifier = "identifier";
var hit = 0;
var treeNodeInfo = new TreeNodeInfo
{
TagType = typeof(object),
CanRename = (o, p) => true,
OnNodeRenamed = (o, s) => hit++
};
treeViewControl.RegisterTreeNodeInfo(treeNodeInfo);
treeViewControl.Data = new object();
var treeView = (System.Windows.Forms.TreeView) treeViewControl.Controls[0];
treeView.Name = identifier;
try
{
WindowsFormsTestHelper.Show(treeViewControl);
var treeViewTester = new TreeViewTester(identifier);
// Call
treeViewTester.FireEvent("AfterLabelEdit", new NodeLabelEditEventArgs(treeView.SelectedNode, newLabel ? string.Empty : null));
// Assert
Assert.AreEqual(newLabel ? 1 : 0, hit);
}
finally
{
WindowsFormsTestHelper.CloseAll();
}
}
}
[Test]
[RequiresSTA]
public void OnNodeChecked_Always_InvokesOnNodeChecked()
{
// Setup
using (var treeViewControl = new TreeViewControl())
{
var identifier = "identifier";
var hit = 0;
var treeNodeInfo = new TreeNodeInfo
{
TagType = typeof(object),
OnNodeChecked = (o, p) =>
{
hit++;
}
};
treeViewControl.RegisterTreeNodeInfo(treeNodeInfo);
treeViewControl.Data = new object();
var treeView = (System.Windows.Forms.TreeView) treeViewControl.Controls[0];
treeView.Name = identifier;
try
{
WindowsFormsTestHelper.Show(treeViewControl);
var treeViewTester = new TreeViewTester(identifier);
// Call
treeViewTester.FireEvent("AfterCheck", new TreeViewEventArgs(treeView.SelectedNode));
// Assert
Assert.AreEqual(1, hit);
}
finally
{
WindowsFormsTestHelper.CloseAll();
}
}
}
[Test]
public void GivenObservableDataOnTreeControl_WhenObserversNotified_ThenNodeForDataChanges()
{
// Given
var mocks = new MockRepository();
var observable = new TestObservable();
mocks.ReplayAll();
using (var treeViewControl = new TreeViewControl())
{
var testString = "test";
var expectedText = "newTest";
var treeNodeInfo = new TreeNodeInfo
{
TagType = typeof(IObservable),
Text = o => testString
};
treeViewControl.RegisterTreeNodeInfo(treeNodeInfo);
treeViewControl.Data = observable;
var node = ((System.Windows.Forms.TreeView) treeViewControl.Controls[0]).Nodes[0];
testString = expectedText;
// When
observable.NotifyObservers();
// Then
Assert.AreEqual(expectedText, node.Text);
mocks.VerifyAll();
}
}
[Test]
[RequiresSTA]
[TestCase(MouseButtons.Left, false)]
[TestCase(MouseButtons.Right, true)]
[TestCase(MouseButtons.Middle, false)]
[TestCase(MouseButtons.XButton1, false)]
[TestCase(MouseButtons.XButton2, false)]
public void GivenTreeViewControl_WhenMouseClickOnNode_SelectThatNodeForRightMouseButtons(
MouseButtons mouseButtonDown, bool changeSelectionToTarget)
{
// Given
using (var treeViewControl = new TreeViewControl())
{
var selectionTarget = "I'm the target!";
var treeNodeInfo = new TreeNodeInfo
{
TagType = typeof(object),
ChildNodeObjects = o => new object[]
{
selectionTarget
}
};
var childTreeNodeInfo = new TreeNodeInfo
{
TagType = typeof(string),
Text = o => o.ToString()
};
treeViewControl.RegisterTreeNodeInfo(treeNodeInfo);
treeViewControl.RegisterTreeNodeInfo(childTreeNodeInfo);
var data = new object();
treeViewControl.Data = data;
treeViewControl.TryExpandAllNodesForData(data);
// Precondition:
Assert.AreSame(data, treeViewControl.SelectedData);
var identifier = "identifier";
var treeView = (System.Windows.Forms.TreeView)treeViewControl.Controls[0];
treeView.Name = identifier;
try
{
WindowsFormsTestHelper.Show(treeViewControl);
var treeViewTester = new TreeViewTester(identifier);
// When
treeViewTester.FireEvent("MouseClick", new MouseEventArgs(mouseButtonDown, 1, 60, 30, 0));
// Then
object expectedSelectedData = changeSelectionToTarget ? selectionTarget : data;
Assert.AreEqual(expectedSelectedData, treeViewControl.SelectedData);
}
finally
{
WindowsFormsTestHelper.CloseAll();
}
}
}
[Test]
[RequiresSTA]
[TestCase(true)]
[TestCase(false)]
public void GivenTreeViewControl_WhenTreeViewItemDragOnNode_SelectThatNode(
bool canRenameNode)
{
// Given
using (var treeViewControl = new TreeViewControl())
{
var selectionTarget = "I'm the target!";
var treeNodeInfo = new TreeNodeInfo
{
TagType = typeof(object),
ChildNodeObjects = o => new object[]
{
selectionTarget
},
CanRename = (d,p) => canRenameNode
};
var childTreeNodeInfo = new TreeNodeInfo
{
TagType = typeof(string),
Text = o => o.ToString()
};
treeViewControl.RegisterTreeNodeInfo(treeNodeInfo);
treeViewControl.RegisterTreeNodeInfo(childTreeNodeInfo);
var data = new object();
treeViewControl.Data = data;
treeViewControl.TryExpandAllNodesForData(data);
// Precondition:
Assert.AreSame(data, treeViewControl.SelectedData);
var identifier = "identifier";
var treeView = (System.Windows.Forms.TreeView)treeViewControl.Controls[0];
treeView.Name = identifier;
var childNode = treeView.Nodes[0].Nodes[0];
try
{
WindowsFormsTestHelper.Show(treeViewControl);
var treeViewTester = new TreeViewTester(identifier);
// When
treeViewTester.FireEvent("ItemDrag", new ItemDragEventArgs(MouseButtons.Left, childNode));
// Then
object expectedSelectedData = selectionTarget;
Assert.AreEqual(expectedSelectedData, treeViewControl.SelectedData);
}
finally
{
WindowsFormsTestHelper.CloseAll();
}
}
}
}
public class TestObservable : Observable {}
}