ItemsControlTests.cs 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. // -----------------------------------------------------------------------
  2. // <copyright file="ItemsControlTests.cs" company="Steven Kirk">
  3. // Copyright 2014 MIT Licence. See licence.md for more information.
  4. // </copyright>
  5. // -----------------------------------------------------------------------
  6. namespace Perspex.Controls.UnitTests
  7. {
  8. using System.Collections.Specialized;
  9. using System.Linq;
  10. using Perspex.Collections;
  11. using Perspex.Controls;
  12. using Perspex.Controls.Presenters;
  13. using Perspex.Controls.Templates;
  14. using Perspex.Styling;
  15. using Perspex.VisualTree;
  16. using Xunit;
  17. public class ItemsControlTests
  18. {
  19. [Fact]
  20. public void Panel_Should_Have_TemplatedParent_Set_To_ItemsControl()
  21. {
  22. var target = new ItemsControl();
  23. target.Template = this.GetTemplate();
  24. target.Items = new[] { "Foo" };
  25. target.ApplyTemplate();
  26. var presenter = target.GetTemplateChildren().OfType<ItemsPresenter>().Single();
  27. var panel = target.GetTemplateChildren().OfType<StackPanel>().Single();
  28. Assert.Equal(target, panel.TemplatedParent);
  29. }
  30. [Fact]
  31. public void Item_Should_Have_TemplatedParent_Set_To_Null()
  32. {
  33. var target = new ItemsControl();
  34. target.Template = this.GetTemplate();
  35. target.Items = new[] { "Foo" };
  36. target.ApplyTemplate();
  37. var presenter = target.GetTemplateChildren().OfType<ItemsPresenter>().Single();
  38. var panel = target.GetTemplateChildren().OfType<StackPanel>().Single();
  39. var item = (TextBlock)panel.GetVisualChildren().First();
  40. Assert.Null(item.TemplatedParent);
  41. }
  42. [Fact]
  43. public void Control_Item_Should_Have_Parent_Set()
  44. {
  45. var target = new ItemsControl();
  46. var child = new Control();
  47. target.Template = this.GetTemplate();
  48. target.Items = new[] { child };
  49. target.ApplyTemplate();
  50. Assert.Equal(target, child.Parent);
  51. Assert.Equal(target, ((ILogical)child).LogicalParent);
  52. }
  53. [Fact]
  54. public void Clearing_Control_Item_Should_Clear_Child_Controls_Parent()
  55. {
  56. var target = new ItemsControl();
  57. var child = new Control();
  58. target.Template = this.GetTemplate();
  59. target.Items = new[] { child };
  60. target.ApplyTemplate();
  61. target.Items = null;
  62. Assert.Null(child.Parent);
  63. Assert.Null(((ILogical)child).LogicalParent);
  64. }
  65. [Fact]
  66. public void Adding_Control_Item_Should_Make_Control_Appear_In_LogicalChildren()
  67. {
  68. var target = new ItemsControl();
  69. var child = new Control();
  70. target.Template = this.GetTemplate();
  71. target.Items = new[] { child };
  72. target.ApplyTemplate();
  73. Assert.Equal(new[] { child }, ((ILogical)target).LogicalChildren.ToList());
  74. }
  75. [Fact]
  76. public void Adding_String_Item_Should_Make_TextBlock_Appear_In_LogicalChildren()
  77. {
  78. var target = new ItemsControl();
  79. var child = new Control();
  80. target.Template = this.GetTemplate();
  81. target.Items = new[] { "Foo" };
  82. target.ApplyTemplate();
  83. var logical = (ILogical)target;
  84. Assert.Equal(1, logical.LogicalChildren.Count);
  85. Assert.IsType<TextBlock>(logical.LogicalChildren[0]);
  86. }
  87. [Fact]
  88. public void Setting_Items_To_Null_Should_Remove_LogicalChildren()
  89. {
  90. var target = new ItemsControl();
  91. var child = new Control();
  92. target.Template = this.GetTemplate();
  93. target.Items = new[] { "Foo" };
  94. target.ApplyTemplate();
  95. target.Items = null;
  96. Assert.Equal(new ILogical[0], ((ILogical)target).LogicalChildren.ToList());
  97. }
  98. [Fact]
  99. public void Setting_Items_Should_Fire_LogicalChildren_CollectionChanged()
  100. {
  101. var target = new ItemsControl();
  102. var child = new Control();
  103. var called = false;
  104. target.Template = this.GetTemplate();
  105. target.ApplyTemplate();
  106. ((ILogical)target).LogicalChildren.CollectionChanged += (s, e) =>
  107. called = e.Action == NotifyCollectionChangedAction.Add;
  108. target.Items = new[] { child };
  109. Assert.True(called);
  110. }
  111. [Fact]
  112. public void Setting_Items_To_Null_Should_Fire_LogicalChildren_CollectionChanged()
  113. {
  114. var target = new ItemsControl();
  115. var child = new Control();
  116. var called = false;
  117. target.Template = this.GetTemplate();
  118. target.Items = new[] { child };
  119. target.ApplyTemplate();
  120. ((ILogical)target).LogicalChildren.CollectionChanged += (s, e) =>
  121. called = e.Action == NotifyCollectionChangedAction.Remove;
  122. target.Items = null;
  123. Assert.True(called);
  124. }
  125. [Fact]
  126. public void Changing_Items_Should_Fire_LogicalChildren_CollectionChanged()
  127. {
  128. var target = new ItemsControl();
  129. var child = new Control();
  130. var called = false;
  131. target.Template = this.GetTemplate();
  132. target.Items = new[] { child };
  133. target.ApplyTemplate();
  134. ((ILogical)target).LogicalChildren.CollectionChanged += (s, e) => called = true;
  135. target.Items = new[] { "Foo" };
  136. Assert.True(called);
  137. }
  138. [Fact]
  139. public void Adding_Items_Should_Fire_LogicalChildren_CollectionChanged()
  140. {
  141. var target = new ItemsControl();
  142. var items = new PerspexList<string> { "Foo" };
  143. var called = false;
  144. target.Template = this.GetTemplate();
  145. target.Items = items;
  146. target.ApplyTemplate();
  147. ((ILogical)target).LogicalChildren.CollectionChanged += (s, e) =>
  148. called = e.Action == NotifyCollectionChangedAction.Add;
  149. items.Add("Bar");
  150. Assert.True(called);
  151. }
  152. [Fact]
  153. public void Removing_Items_Should_Fire_LogicalChildren_CollectionChanged()
  154. {
  155. var target = new ItemsControl();
  156. var items = new PerspexList<string> { "Foo", "Bar" };
  157. var called = false;
  158. target.Template = this.GetTemplate();
  159. target.Items = items;
  160. target.ApplyTemplate();
  161. ((ILogical)target).LogicalChildren.CollectionChanged += (s, e) =>
  162. called = e.Action == NotifyCollectionChangedAction.Remove;
  163. items.Remove("Bar");
  164. Assert.True(called);
  165. }
  166. [Fact]
  167. public void LogicalChildren_Should_Not_Change_Instance_When_Template_Changed()
  168. {
  169. var target = new ItemsControl()
  170. {
  171. Template = this.GetTemplate(),
  172. };
  173. var before = ((ILogical)target).LogicalChildren;
  174. target.Template = null;
  175. target.Template = this.GetTemplate();
  176. var after = ((ILogical)target).LogicalChildren;
  177. Assert.NotNull(before);
  178. Assert.NotNull(after);
  179. Assert.Same(before, after);
  180. }
  181. [Fact]
  182. public void Empty_Class_Should_Initially_Be_Applied()
  183. {
  184. var target = new ItemsControl()
  185. {
  186. Template = this.GetTemplate(),
  187. };
  188. Assert.True(target.Classes.Contains(":empty"));
  189. }
  190. [Fact]
  191. public void Empty_Class_Should_Be_Cleared_When_Items_Added()
  192. {
  193. var target = new ItemsControl()
  194. {
  195. Template = this.GetTemplate(),
  196. Items = new[] { 1, 2, 3 },
  197. };
  198. Assert.False(target.Classes.Contains(":empty"));
  199. }
  200. [Fact]
  201. public void Empty_Class_Should_Be_Set_When_Empty_Collection_Set()
  202. {
  203. var target = new ItemsControl()
  204. {
  205. Template = this.GetTemplate(),
  206. Items = new[] { 1, 2, 3 },
  207. };
  208. target.Items = new int[0];
  209. Assert.True(target.Classes.Contains(":empty"));
  210. }
  211. [Fact]
  212. public void Setting_Presenter_Explicitly_Should_Set_Item_Parent()
  213. {
  214. var target = new TestItemsControl();
  215. var child = new Control();
  216. var presenter = new ItemsPresenter
  217. {
  218. TemplatedParent = target,
  219. [~ItemsPresenter.ItemsProperty] = target[~ItemsControl.ItemsProperty],
  220. };
  221. presenter.ApplyTemplate();
  222. target.Presenter = presenter;
  223. target.Items = new[] { child };
  224. target.ApplyTemplate();
  225. Assert.Equal(target, child.Parent);
  226. Assert.Equal(target, ((ILogical)child).LogicalParent);
  227. }
  228. private ControlTemplate GetTemplate()
  229. {
  230. return new ControlTemplate<ItemsControl>(parent =>
  231. {
  232. return new Border
  233. {
  234. Background = new Perspex.Media.SolidColorBrush(0xffffffff),
  235. Child = new ItemsPresenter
  236. {
  237. Name = "itemsPresenter",
  238. [~ItemsPresenter.ItemsProperty] = parent[~ItemsControl.ItemsProperty],
  239. }
  240. };
  241. });
  242. }
  243. private class TestItemsControl : ItemsControl
  244. {
  245. public new IItemsPresenter Presenter
  246. {
  247. get { return base.Presenter; }
  248. set { base.Presenter = value; }
  249. }
  250. }
  251. }
  252. }