TreeViewTests.cs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. // Copyright (c) The Perspex Project. All rights reserved.
  2. // Licensed under the MIT license. See licence.md file in the project root for full license information.
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using Perspex.Controls.Presenters;
  6. using Perspex.Controls.Templates;
  7. using Perspex.LogicalTree;
  8. using Xunit;
  9. namespace Perspex.Controls.UnitTests
  10. {
  11. public class TreeViewTests
  12. {
  13. [Fact]
  14. public void Items_Should_Be_Created()
  15. {
  16. var target = new TreeView
  17. {
  18. Template = CreateTreeViewTemplate(),
  19. Items = CreateTestTreeData(),
  20. DataTemplates = CreateNodeDataTemplate(),
  21. };
  22. target.ApplyTemplate();
  23. Assert.Equal(new[] { "Root" }, ExtractItemContent(target, 0));
  24. Assert.Equal(new[] { "Child1", "Child2" }, ExtractItemContent(target, 1));
  25. Assert.Equal(new[] { "Grandchild2a" }, ExtractItemContent(target, 2));
  26. }
  27. [Fact]
  28. public void LogicalChildren_Should_Be_Set()
  29. {
  30. var target = new TreeView
  31. {
  32. Template = CreateTreeViewTemplate(),
  33. Items = new[] { "Foo", "Bar", "Baz " },
  34. };
  35. target.ApplyTemplate();
  36. Assert.Equal(3, target.GetLogicalChildren().Count());
  37. foreach (var child in target.GetLogicalChildren())
  38. {
  39. Assert.IsType<TreeViewItem>(child);
  40. }
  41. }
  42. [Fact]
  43. public void DataContexts_Should_Be_Correctly_Set()
  44. {
  45. var items = new object[]
  46. {
  47. "Foo",
  48. new Node { Value = "Bar" },
  49. new TextBlock { Text = "Baz" },
  50. new TreeViewItem { Header = "Qux" },
  51. };
  52. var target = new TreeView
  53. {
  54. Template = CreateTreeViewTemplate(),
  55. DataContext = "Base",
  56. DataTemplates = new DataTemplates
  57. {
  58. new FuncDataTemplate<Node>(x => new Button { Content = x })
  59. },
  60. Items = items,
  61. };
  62. target.ApplyTemplate();
  63. var dataContexts = target.Presenter.Panel.Children
  64. .Cast<Control>()
  65. .Select(x => x.DataContext)
  66. .ToList();
  67. Assert.Equal(
  68. new object[] { items[0], items[1], "Base", "Base" },
  69. dataContexts);
  70. }
  71. private IList<Node> CreateTestTreeData()
  72. {
  73. return new[]
  74. {
  75. new Node
  76. {
  77. Value = "Root",
  78. Children = new[]
  79. {
  80. new Node
  81. {
  82. Value = "Child1",
  83. },
  84. new Node
  85. {
  86. Value = "Child2",
  87. Children = new[]
  88. {
  89. new Node
  90. {
  91. Value = "Grandchild2a",
  92. },
  93. },
  94. },
  95. }
  96. }
  97. };
  98. }
  99. private DataTemplates CreateNodeDataTemplate()
  100. {
  101. return new DataTemplates
  102. {
  103. new FuncTreeDataTemplate<Node>(
  104. x => new TextBlock { Text = x.Value },
  105. x => x.Children),
  106. };
  107. }
  108. private ControlTemplate CreateTreeViewTemplate()
  109. {
  110. return new ControlTemplate<TreeView>(parent => new ItemsPresenter
  111. {
  112. Name = "itemsPresenter",
  113. [~ItemsPresenter.ItemsProperty] = parent[~ItemsControl.ItemsProperty],
  114. });
  115. }
  116. private ControlTemplate CreateTreeViewItemTemplate()
  117. {
  118. return new ControlTemplate<TreeViewItem>(parent => new ItemsPresenter
  119. {
  120. Name = "itemsPresenter",
  121. [~ItemsPresenter.ItemsProperty] = parent[~ItemsControl.ItemsProperty],
  122. });
  123. }
  124. private List<string> ExtractItemContent(TreeView tree, int level)
  125. {
  126. return ExtractItemContent(tree.Presenter.Panel, 0, level)
  127. .Select(x => x.Header)
  128. .OfType<TextBlock>()
  129. .Select(x => x.Text)
  130. .ToList();
  131. }
  132. private IEnumerable<TreeViewItem> ExtractItemContent(IPanel panel, int currentLevel, int level)
  133. {
  134. foreach (TreeViewItem container in panel.Children)
  135. {
  136. if (container.Template == null)
  137. {
  138. container.Template = CreateTreeViewItemTemplate();
  139. container.ApplyTemplate();
  140. }
  141. if (currentLevel == level)
  142. {
  143. yield return container;
  144. }
  145. else
  146. {
  147. foreach (var child in ExtractItemContent(container.Presenter.Panel, currentLevel + 1, level))
  148. {
  149. yield return child;
  150. }
  151. }
  152. }
  153. }
  154. private class Node
  155. {
  156. public string Value { get; set; }
  157. public IList<Node> Children { get; set; }
  158. }
  159. }
  160. }