TabControlTests.cs 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  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.ObjectModel;
  4. using System.Linq;
  5. using Perspex.Controls.Presenters;
  6. using Perspex.Controls.Primitives;
  7. using Perspex.Controls.Templates;
  8. using Perspex.LogicalTree;
  9. using Xunit;
  10. namespace Perspex.Controls.UnitTests
  11. {
  12. public class TabControlTests
  13. {
  14. [Fact]
  15. public void First_Tab_Should_Be_Selected_By_Default()
  16. {
  17. TabItem selected;
  18. var target = new TabControl
  19. {
  20. Template = new ControlTemplate<TabControl>(CreateTabControlTemplate),
  21. Items = new[]
  22. {
  23. (selected = new TabItem
  24. {
  25. Name = "first",
  26. Content = "foo",
  27. }),
  28. new TabItem
  29. {
  30. Name = "second",
  31. Content = "bar",
  32. },
  33. }
  34. };
  35. target.ApplyTemplate();
  36. Assert.Equal(selected, target.SelectedItem);
  37. Assert.Equal(selected, target.SelectedTab);
  38. }
  39. [Fact]
  40. public void Setting_SelectedItem_Should_Set_SelectedTab()
  41. {
  42. var target = new TabControl
  43. {
  44. Template = new ControlTemplate<TabControl>(CreateTabControlTemplate),
  45. Items = new[]
  46. {
  47. new TabItem
  48. {
  49. Name = "first",
  50. Content = "foo",
  51. },
  52. new TabItem
  53. {
  54. Name = "second",
  55. Content = "bar",
  56. },
  57. }
  58. };
  59. target.ApplyTemplate();
  60. target.SelectedItem = target.Items.Cast<TabItem>().ElementAt(1);
  61. Assert.Same(target.SelectedTab, target.SelectedItem);
  62. }
  63. [Fact]
  64. public void Logical_Child_Should_Be_Selected_Tab_Content()
  65. {
  66. var target = new TabControl
  67. {
  68. Template = new ControlTemplate<TabControl>(CreateTabControlTemplate),
  69. Items = new[]
  70. {
  71. new TabItem
  72. {
  73. Content = "foo"
  74. },
  75. new TabItem
  76. {
  77. Content = "bar"
  78. },
  79. },
  80. };
  81. target.ApplyTemplate();
  82. Assert.Equal(1, target.GetLogicalChildren().Count());
  83. Assert.Equal("foo", ((TextBlock)target.GetLogicalChildren().First()).Text);
  84. }
  85. [Fact]
  86. public void Removal_Should_Set_Next_Tab()
  87. {
  88. var collection = new ObservableCollection<TabItem>()
  89. {
  90. new TabItem
  91. {
  92. Name = "first",
  93. Content = "foo",
  94. },
  95. new TabItem
  96. {
  97. Name = "second",
  98. Content = "bar",
  99. },
  100. new TabItem
  101. {
  102. Name = "3rd",
  103. Content = "barf",
  104. },
  105. };
  106. var target = new TabControl
  107. {
  108. Template = new ControlTemplate<TabControl>(CreateTabControlTemplate),
  109. Items = collection,
  110. };
  111. target.ApplyTemplate();
  112. target.SelectedItem = collection[1];
  113. collection.RemoveAt(1);
  114. // compare with former [2] now [1] == "3rd"
  115. Assert.Same(collection[1], target.SelectedItem);
  116. Assert.Same(target.SelectedTab, target.SelectedItem);
  117. }
  118. [Fact]
  119. public void DataContexts_Should_Be_Correctly_Set()
  120. {
  121. var items = new object[]
  122. {
  123. "Foo",
  124. new Item("Bar"),
  125. new TextBlock { Text = "Baz" },
  126. new TabItem { Content = "Qux" },
  127. };
  128. var target = new TabControl
  129. {
  130. Template = new ControlTemplate<TabControl>(CreateTabControlTemplate),
  131. DataContext = "Base",
  132. DataTemplates = new DataTemplates
  133. {
  134. new DataTemplate<Item>(x => new Button { Content = x })
  135. },
  136. Items = items,
  137. };
  138. target.ApplyTemplate();
  139. var dataContext = ((TextBlock)target.GetLogicalChildren().Single()).DataContext;
  140. Assert.Equal(items[0], dataContext);
  141. target.SelectedIndex = 1;
  142. dataContext = ((Button)target.GetLogicalChildren().Single()).DataContext;
  143. Assert.Equal(items[1], dataContext);
  144. target.SelectedIndex = 2;
  145. dataContext = ((TextBlock)target.GetLogicalChildren().Single()).DataContext;
  146. Assert.Equal("Base", dataContext);
  147. target.SelectedIndex = 3;
  148. dataContext = ((TextBlock)target.GetLogicalChildren().Single()).DataContext;
  149. Assert.Equal("Qux", dataContext);
  150. }
  151. private Control CreateTabControlTemplate(TabControl parent)
  152. {
  153. return new StackPanel
  154. {
  155. Children = new Controls
  156. {
  157. new TabStrip
  158. {
  159. Name = "tabStrip",
  160. Template = new ControlTemplate<TabStrip>(CreateTabStripTemplate),
  161. [!ItemsControl.ItemsProperty] = parent[!ItemsControl.ItemsProperty],
  162. [!!TabStrip.SelectedTabProperty] = parent[!!TabControl.SelectedTabProperty]
  163. },
  164. new Deck
  165. {
  166. Name = "deck",
  167. Template = new ControlTemplate<Deck>(CreateDeckTemplate),
  168. MemberSelector = parent.ContentSelector,
  169. [!ItemsControl.ItemsProperty] = parent[!ItemsControl.ItemsProperty],
  170. [!SelectingItemsControl.SelectedItemProperty] = parent[!SelectingItemsControl.SelectedItemProperty],
  171. }
  172. }
  173. };
  174. }
  175. private Control CreateTabStripTemplate(TabStrip parent)
  176. {
  177. return new ItemsPresenter
  178. {
  179. Name = "itemsPresenter",
  180. [~ItemsPresenter.ItemsProperty] = parent[~ItemsControl.ItemsProperty],
  181. };
  182. }
  183. private Control CreateDeckTemplate(Deck control)
  184. {
  185. return new DeckPresenter
  186. {
  187. Name = "itemsPresenter",
  188. [!DeckPresenter.ItemsProperty] = control[!ItemsControl.ItemsProperty],
  189. [!DeckPresenter.ItemsPanelProperty] = control[!ItemsControl.ItemsPanelProperty],
  190. [!DeckPresenter.MemberSelectorProperty] = control[!ItemsControl.MemberSelectorProperty],
  191. [!DeckPresenter.SelectedIndexProperty] = control[!SelectingItemsControl.SelectedIndexProperty],
  192. [~DeckPresenter.TransitionProperty] = control[~Deck.TransitionProperty],
  193. };
  194. }
  195. private class Item
  196. {
  197. public Item(string value)
  198. {
  199. Value = value;
  200. }
  201. public string Value { get; }
  202. }
  203. }
  204. }