|
|
|
@ -5,6 +5,7 @@ using System.Collections.Generic; |
|
|
|
using System.Linq; |
|
|
|
using Perspex.Controls.Presenters; |
|
|
|
using Perspex.Controls.Templates; |
|
|
|
using Perspex.Input; |
|
|
|
using Perspex.LogicalTree; |
|
|
|
using Xunit; |
|
|
|
|
|
|
|
@ -24,9 +25,80 @@ namespace Perspex.Controls.UnitTests |
|
|
|
|
|
|
|
target.ApplyTemplate(); |
|
|
|
|
|
|
|
Assert.Equal(new[] { "Root" }, ExtractItemContent(target, 0)); |
|
|
|
Assert.Equal(new[] { "Child1", "Child2" }, ExtractItemContent(target, 1)); |
|
|
|
Assert.Equal(new[] { "Grandchild2a" }, ExtractItemContent(target, 2)); |
|
|
|
Assert.Equal(new[] { "Root" }, ExtractItemHeader(target, 0)); |
|
|
|
Assert.Equal(new[] { "Child1", "Child2" }, ExtractItemHeader(target, 1)); |
|
|
|
Assert.Equal(new[] { "Grandchild2a" }, ExtractItemHeader(target, 2)); |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void Root_ItemContainerGenerator_Containers_Should_Be_Root_Containers() |
|
|
|
{ |
|
|
|
var target = new TreeView |
|
|
|
{ |
|
|
|
Template = CreateTreeViewTemplate(), |
|
|
|
Items = CreateTestTreeData(), |
|
|
|
DataTemplates = CreateNodeDataTemplate(), |
|
|
|
}; |
|
|
|
|
|
|
|
target.ApplyTemplate(); |
|
|
|
|
|
|
|
var container = (TreeViewItem)target.ItemContainerGenerator.Containers.Single(); |
|
|
|
var header = (TextBlock)container.Header; |
|
|
|
Assert.Equal("Root", header.Text); |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void Root_TreeContainerFromItem_Should_Return_Descendent_Item() |
|
|
|
{ |
|
|
|
var tree = CreateTestTreeData(); |
|
|
|
var target = new TreeView |
|
|
|
{ |
|
|
|
Template = CreateTreeViewTemplate(), |
|
|
|
Items = tree, |
|
|
|
DataTemplates = CreateNodeDataTemplate(), |
|
|
|
}; |
|
|
|
|
|
|
|
// For TreeViewItem to find its parent TreeView, OnAttachedToVisualTree needs
|
|
|
|
// to be called, which requires an IRenderRoot.
|
|
|
|
var visualRoot = new TestRoot(); |
|
|
|
visualRoot.Child = target; |
|
|
|
|
|
|
|
ApplyTemplates(target); |
|
|
|
|
|
|
|
var container = target.ItemContainerGenerator.TreeContainerFromItem( |
|
|
|
tree[0].Children[1].Children[0]); |
|
|
|
var header = ((TreeViewItem)container).Header; |
|
|
|
var headerContent = ((TextBlock)header).Text; |
|
|
|
|
|
|
|
Assert.Equal("Grandchild2a", headerContent); |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void Clicking_Item_Should_Select_It() |
|
|
|
{ |
|
|
|
var tree = CreateTestTreeData(); |
|
|
|
var target = new TreeView |
|
|
|
{ |
|
|
|
Template = CreateTreeViewTemplate(), |
|
|
|
Items = tree, |
|
|
|
DataTemplates = CreateNodeDataTemplate(), |
|
|
|
}; |
|
|
|
|
|
|
|
var visualRoot = new TestRoot(); |
|
|
|
visualRoot.Child = target; |
|
|
|
ApplyTemplates(target); |
|
|
|
|
|
|
|
var item = tree[0].Children[1].Children[0]; |
|
|
|
var container = (TreeViewItem)target.ItemContainerGenerator.TreeContainerFromItem(item); |
|
|
|
|
|
|
|
container.RaiseEvent(new PointerPressEventArgs |
|
|
|
{ |
|
|
|
RoutedEvent = InputElement.PointerPressedEvent, |
|
|
|
MouseButton = MouseButton.Left, |
|
|
|
}); |
|
|
|
|
|
|
|
Assert.Equal(item, target.SelectedItem); |
|
|
|
Assert.True(container.IsSelected); |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
@ -40,12 +112,14 @@ namespace Perspex.Controls.UnitTests |
|
|
|
|
|
|
|
target.ApplyTemplate(); |
|
|
|
|
|
|
|
Assert.Equal(3, target.GetLogicalChildren().Count()); |
|
|
|
var result = target.GetLogicalChildren() |
|
|
|
.OfType<TreeViewItem>() |
|
|
|
.Select(x => x.Header) |
|
|
|
.OfType<TextBlock>() |
|
|
|
.Select(x => x.Text) |
|
|
|
.ToList(); |
|
|
|
|
|
|
|
foreach (var child in target.GetLogicalChildren()) |
|
|
|
{ |
|
|
|
Assert.IsType<TreeViewItem>(child); |
|
|
|
} |
|
|
|
Assert.Equal(new[] { "Foo", "Bar", "Baz " }, result); |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
@ -82,6 +156,22 @@ namespace Perspex.Controls.UnitTests |
|
|
|
dataContexts); |
|
|
|
} |
|
|
|
|
|
|
|
private void ApplyTemplates(TreeView tree) |
|
|
|
{ |
|
|
|
tree.ApplyTemplate(); |
|
|
|
ApplyTemplates(tree.Presenter.Panel.Children); |
|
|
|
} |
|
|
|
|
|
|
|
private void ApplyTemplates(IEnumerable<IControl> controls) |
|
|
|
{ |
|
|
|
foreach (TreeViewItem control in controls) |
|
|
|
{ |
|
|
|
control.Template = CreateTreeViewItemTemplate(); |
|
|
|
control.ApplyTemplate(); |
|
|
|
ApplyTemplates(control.Presenter.Panel.Children); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private IList<Node> CreateTestTreeData() |
|
|
|
{ |
|
|
|
return new[] |
|
|
|
@ -139,7 +229,7 @@ namespace Perspex.Controls.UnitTests |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
private List<string> ExtractItemContent(TreeView tree, int level) |
|
|
|
private List<string> ExtractItemHeader(TreeView tree, int level) |
|
|
|
{ |
|
|
|
return ExtractItemContent(tree.Presenter.Panel, 0, level) |
|
|
|
.Select(x => x.Header) |
|
|
|
|