TabControlTests.cs 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  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 FuncControlTemplate<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 FuncControlTemplate<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 FuncControlTemplate<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 FuncControlTemplate<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. new TabItem { Content = new TextBlock { Text = "Bob" } }
  128. };
  129. var target = new TabControl
  130. {
  131. Template = new FuncControlTemplate<TabControl>(CreateTabControlTemplate),
  132. DataContext = "Base",
  133. DataTemplates = new DataTemplates
  134. {
  135. new FuncDataTemplate<Item>(x => new Button { Content = x })
  136. },
  137. Items = items,
  138. };
  139. target.ApplyTemplate();
  140. var dataContext = ((TextBlock)target.GetLogicalChildren().Single()).DataContext;
  141. Assert.Equal(items[0], dataContext);
  142. target.SelectedIndex = 1;
  143. dataContext = ((Button)target.GetLogicalChildren().Single()).DataContext;
  144. Assert.Equal(items[1], dataContext);
  145. target.SelectedIndex = 2;
  146. dataContext = ((TextBlock)target.GetLogicalChildren().Single()).DataContext;
  147. Assert.Equal("Base", dataContext);
  148. target.SelectedIndex = 3;
  149. dataContext = ((TextBlock)target.GetLogicalChildren().Single()).DataContext;
  150. Assert.Equal("Qux", dataContext);
  151. target.SelectedIndex = 4;
  152. dataContext = ((TextBlock)target.GetLogicalChildren().Single()).DataContext;
  153. Assert.Equal("Base", dataContext);
  154. }
  155. private Control CreateTabControlTemplate(TabControl parent)
  156. {
  157. return new StackPanel
  158. {
  159. Children = new Controls
  160. {
  161. new TabStrip
  162. {
  163. Name = "tabStrip",
  164. Template = new FuncControlTemplate<TabStrip>(CreateTabStripTemplate),
  165. [!ItemsControl.ItemsProperty] = parent[!ItemsControl.ItemsProperty],
  166. [!!TabStrip.SelectedTabProperty] = parent[!!TabControl.SelectedTabProperty]
  167. },
  168. new Carousel
  169. {
  170. Name = "carousel",
  171. Template = new FuncControlTemplate<Carousel>(CreateCarouselTemplate),
  172. MemberSelector = parent.ContentSelector,
  173. [!ItemsControl.ItemsProperty] = parent[!ItemsControl.ItemsProperty],
  174. [!SelectingItemsControl.SelectedItemProperty] = parent[!SelectingItemsControl.SelectedItemProperty],
  175. }
  176. }
  177. };
  178. }
  179. private Control CreateTabStripTemplate(TabStrip parent)
  180. {
  181. return new ItemsPresenter
  182. {
  183. Name = "itemsPresenter",
  184. [~ItemsPresenter.ItemsProperty] = parent[~ItemsControl.ItemsProperty],
  185. };
  186. }
  187. private Control CreateCarouselTemplate(Carousel control)
  188. {
  189. return new CarouselPresenter
  190. {
  191. Name = "itemsPresenter",
  192. [!CarouselPresenter.ItemsProperty] = control[!ItemsControl.ItemsProperty],
  193. [!CarouselPresenter.ItemsPanelProperty] = control[!ItemsControl.ItemsPanelProperty],
  194. [!CarouselPresenter.MemberSelectorProperty] = control[!ItemsControl.MemberSelectorProperty],
  195. [!CarouselPresenter.SelectedIndexProperty] = control[!SelectingItemsControl.SelectedIndexProperty],
  196. [~CarouselPresenter.TransitionProperty] = control[~Carousel.TransitionProperty],
  197. };
  198. }
  199. private class Item
  200. {
  201. public Item(string value)
  202. {
  203. Value = value;
  204. }
  205. public string Value { get; }
  206. }
  207. }
  208. }