SelectingItemsControlTests_Multiple.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  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.Collections;
  6. using Perspex.Controls.Presenters;
  7. using Perspex.Controls.Primitives;
  8. using Perspex.Controls.Templates;
  9. using Xunit;
  10. namespace Perspex.Controls.UnitTests.Primitives
  11. {
  12. public class SelectingItemsControlTests_Multiple
  13. {
  14. [Fact]
  15. public void Setting_SelectedIndex_Should_Add_To_SelectedItems()
  16. {
  17. var target = new TestSelector
  18. {
  19. Items = new[] { "foo", "bar" },
  20. Template = Template(),
  21. };
  22. target.ApplyTemplate();
  23. target.SelectedIndex = 1;
  24. Assert.Equal(new[] { "bar" }, target.SelectedItems.ToList());
  25. }
  26. [Fact]
  27. public void Adding_SelectedItems_Should_Set_SelectedIndex()
  28. {
  29. var target = new TestSelector
  30. {
  31. Items = new[] { "foo", "bar" },
  32. Template = Template(),
  33. };
  34. target.ApplyTemplate();
  35. target.SelectedItems.Add("bar");
  36. Assert.Equal(1, target.SelectedIndex);
  37. }
  38. [Fact]
  39. public void Assigning_SelectedItems_Should_Set_SelectedIndex()
  40. {
  41. var target = new TestSelector
  42. {
  43. Items = new[] { "foo", "bar" },
  44. Template = Template(),
  45. };
  46. target.ApplyTemplate();
  47. target.SelectedItems = new[] { "bar" };
  48. Assert.Equal(1, target.SelectedIndex);
  49. }
  50. [Fact]
  51. public void Reassigning_SelectedItems_Should_Clear_Selection()
  52. {
  53. var target = new TestSelector
  54. {
  55. Items = new[] { "foo", "bar" },
  56. Template = Template(),
  57. };
  58. target.ApplyTemplate();
  59. target.SelectedItems.Add("bar");
  60. target.SelectedItems = new PerspexList<object>();
  61. Assert.Equal(-1, target.SelectedIndex);
  62. Assert.Equal(null, target.SelectedItem);
  63. }
  64. [Fact]
  65. public void Adding_First_SelectedItem_Should_Raise_SelectedIndex_SelectedItem_Changed()
  66. {
  67. var target = new TestSelector
  68. {
  69. Items = new[] { "foo", "bar" },
  70. Template = Template(),
  71. };
  72. bool indexRaised = false;
  73. bool itemRaised = false;
  74. target.PropertyChanged += (s, e) =>
  75. {
  76. indexRaised |= e.Property.Name == "SelectedIndex" &&
  77. (int)e.OldValue == -1 &&
  78. (int)e.NewValue == 1;
  79. itemRaised |= e.Property.Name == "SelectedItem" &&
  80. (string)e.OldValue == null &&
  81. (string)e.NewValue == "bar";
  82. };
  83. target.ApplyTemplate();
  84. target.SelectedItems.Add("bar");
  85. Assert.True(indexRaised);
  86. Assert.True(itemRaised);
  87. }
  88. [Fact]
  89. public void Adding_Subsequent_SelectedItems_Should_Not_Raise_SelectedIndex_SelectedItem_Changed()
  90. {
  91. var target = new TestSelector
  92. {
  93. Items = new[] { "foo", "bar" },
  94. Template = Template(),
  95. };
  96. target.ApplyTemplate();
  97. target.SelectedItems.Add("foo");
  98. bool raised = false;
  99. target.PropertyChanged += (s, e) =>
  100. raised |= e.Property.Name == "SelectedIndex" ||
  101. e.Property.Name == "SelectedItem";
  102. target.SelectedItems.Add("bar");
  103. Assert.False(raised);
  104. }
  105. [Fact]
  106. public void Removing_Last_SelectedItem_Should_Raise_SelectedIndex_Changed()
  107. {
  108. var target = new TestSelector
  109. {
  110. Items = new[] { "foo", "bar" },
  111. Template = Template(),
  112. };
  113. target.ApplyTemplate();
  114. target.SelectedItems.Add("foo");
  115. bool raised = false;
  116. target.PropertyChanged += (s, e) =>
  117. raised |= e.Property.Name == "SelectedIndex" &&
  118. (int)e.OldValue == 0 &&
  119. (int)e.NewValue == -1;
  120. target.SelectedItems.RemoveAt(0);
  121. Assert.True(raised);
  122. }
  123. [Fact]
  124. public void Adding_SelectedItems_Should_Set_Item_IsSelected()
  125. {
  126. var items = new[]
  127. {
  128. new ListBoxItem(),
  129. new ListBoxItem(),
  130. new ListBoxItem(),
  131. };
  132. var target = new TestSelector
  133. {
  134. Items = items,
  135. Template = Template(),
  136. };
  137. target.ApplyTemplate();
  138. target.SelectedItems.Add(items[0]);
  139. target.SelectedItems.Add(items[1]);
  140. var foo = target.Presenter.Panel.Children[0];
  141. Assert.True(items[0].IsSelected);
  142. Assert.True(items[1].IsSelected);
  143. Assert.False(items[2].IsSelected);
  144. }
  145. [Fact]
  146. public void Assigning_SelectedItems_Should_Set_Item_IsSelected()
  147. {
  148. var items = new[]
  149. {
  150. new ListBoxItem(),
  151. new ListBoxItem(),
  152. new ListBoxItem(),
  153. };
  154. var target = new TestSelector
  155. {
  156. Items = items,
  157. Template = Template(),
  158. };
  159. target.ApplyTemplate();
  160. target.SelectedItems = new PerspexList<object> { items[0], items[1] };
  161. Assert.True(items[0].IsSelected);
  162. Assert.True(items[1].IsSelected);
  163. Assert.False(items[2].IsSelected);
  164. }
  165. [Fact]
  166. public void Removing_SelectedItems_Should_Clear_Item_IsSelected()
  167. {
  168. var items = new[]
  169. {
  170. new ListBoxItem(),
  171. new ListBoxItem(),
  172. new ListBoxItem(),
  173. };
  174. var target = new TestSelector
  175. {
  176. Items = items,
  177. Template = Template(),
  178. };
  179. target.ApplyTemplate();
  180. target.SelectedItems.Add(items[0]);
  181. target.SelectedItems.Add(items[1]);
  182. target.SelectedItems.Remove(items[1]);
  183. Assert.True(items[0].IsSelected);
  184. Assert.False(items[1].IsSelected);
  185. }
  186. [Fact]
  187. public void Reassigning_SelectedItems_Should_Clear_Item_IsSelected()
  188. {
  189. var items = new[]
  190. {
  191. new ListBoxItem(),
  192. new ListBoxItem(),
  193. new ListBoxItem(),
  194. };
  195. var target = new TestSelector
  196. {
  197. Items = items,
  198. Template = Template(),
  199. };
  200. target.ApplyTemplate();
  201. target.SelectedItems.Add(items[0]);
  202. target.SelectedItems.Add(items[1]);
  203. target.SelectedItems = new PerspexList<object> { items[0], items[1] };
  204. Assert.False(items[0].IsSelected);
  205. Assert.False(items[1].IsSelected);
  206. }
  207. [Fact]
  208. public void Replacing_First_SelectedItem_Should_Update_SelectedItem_SelectedIndex()
  209. {
  210. var items = new[]
  211. {
  212. new ListBoxItem(),
  213. new ListBoxItem(),
  214. new ListBoxItem(),
  215. };
  216. var target = new TestSelector
  217. {
  218. Items = items,
  219. Template = Template(),
  220. };
  221. target.ApplyTemplate();
  222. target.SelectedIndex = 1;
  223. target.SelectedItems[0] = items[2];
  224. Assert.Equal(2, target.SelectedIndex);
  225. Assert.Equal(items[2], target.SelectedItem);
  226. Assert.False(items[0].IsSelected);
  227. Assert.False(items[1].IsSelected);
  228. Assert.True(items[2].IsSelected);
  229. }
  230. [Fact]
  231. public void Range_Select_Should_Select_Range()
  232. {
  233. var target = new TestSelector
  234. {
  235. Items = new[]
  236. {
  237. "foo",
  238. "bar",
  239. "baz",
  240. "qux",
  241. "qiz",
  242. "lol",
  243. },
  244. SelectionMode = SelectionMode.Multiple,
  245. Template = Template(),
  246. };
  247. target.ApplyTemplate();
  248. target.SelectedIndex = 1;
  249. target.SelectRange(3);
  250. Assert.Equal(new[] { "bar", "baz", "qux" }, target.SelectedItems.ToList());
  251. }
  252. [Fact]
  253. public void Range_Select_Backwards_Should_Select_Range()
  254. {
  255. var target = new TestSelector
  256. {
  257. Items = new[]
  258. {
  259. "foo",
  260. "bar",
  261. "baz",
  262. "qux",
  263. "qiz",
  264. "lol",
  265. },
  266. SelectionMode = SelectionMode.Multiple,
  267. Template = Template(),
  268. };
  269. target.ApplyTemplate();
  270. target.SelectedIndex = 3;
  271. target.SelectRange(1);
  272. Assert.Equal(new[] { "qux", "baz", "bar" }, target.SelectedItems.ToList());
  273. }
  274. [Fact]
  275. public void Second_Range_Select_Backwards_Should_Select_From_Original_Selection()
  276. {
  277. var target = new TestSelector
  278. {
  279. Items = new[]
  280. {
  281. "foo",
  282. "bar",
  283. "baz",
  284. "qux",
  285. "qiz",
  286. "lol",
  287. },
  288. SelectionMode = SelectionMode.Multiple,
  289. Template = Template(),
  290. };
  291. target.ApplyTemplate();
  292. target.SelectedIndex = 2;
  293. target.SelectRange(5);
  294. target.SelectRange(4);
  295. Assert.Equal(new[] { "baz", "qux", "qiz" }, target.SelectedItems.ToList());
  296. }
  297. private class TestSelector : SelectingItemsControl
  298. {
  299. public new IList<object> SelectedItems
  300. {
  301. get { return base.SelectedItems; }
  302. set { base.SelectedItems = value; }
  303. }
  304. public new SelectionMode SelectionMode
  305. {
  306. get { return base.SelectionMode; }
  307. set { base.SelectionMode = value; }
  308. }
  309. public void SelectRange(int index)
  310. {
  311. UpdateSelection(index, true, true);
  312. }
  313. }
  314. private ControlTemplate Template()
  315. {
  316. return new ControlTemplate<SelectingItemsControl>(control =>
  317. new ItemsPresenter
  318. {
  319. Name = "itemsPresenter",
  320. [~ItemsPresenter.ItemsProperty] = control[~ItemsControl.ItemsProperty],
  321. [~ItemsPresenter.ItemsPanelProperty] = control[~ItemsControl.ItemsPanelProperty],
  322. });
  323. }
  324. }
  325. }