SelectingItemsControlTests_SelectedValue.cs 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using Avalonia.Controls.Presenters;
  7. using Avalonia.Controls.Primitives;
  8. using Avalonia.Controls.Templates;
  9. using Avalonia.Data;
  10. using Avalonia.Styling;
  11. using Avalonia.UnitTests;
  12. using Xunit;
  13. namespace Avalonia.Controls.UnitTests.Primitives
  14. {
  15. public class SelectingItemsControlTests_SelectedValue
  16. {
  17. [Fact]
  18. public void Setting_SelectedItem_Sets_SelectedValue()
  19. {
  20. var items = TestClass.GetItems();
  21. var sic = new SelectingItemsControl
  22. {
  23. ItemsSource = items,
  24. SelectedValueBinding = new Binding("Name"),
  25. Template = Template()
  26. };
  27. sic.SelectedItem = items[0];
  28. Assert.Equal(items[0].Name, sic.SelectedValue);
  29. }
  30. [Fact]
  31. public void Setting_SelectedIndex_Sets_SelectedValue()
  32. {
  33. var items = TestClass.GetItems();
  34. var sic = new SelectingItemsControl
  35. {
  36. ItemsSource = items,
  37. SelectedValueBinding = new Binding("Name"),
  38. Template = Template()
  39. };
  40. sic.SelectedIndex = 0;
  41. Assert.Equal(items[0].Name, sic.SelectedValue);
  42. }
  43. [Fact]
  44. public void Setting_SelectedItems_Sets_SelectedValue()
  45. {
  46. var items = TestClass.GetItems();
  47. var sic = new ListBox
  48. {
  49. ItemsSource = items,
  50. SelectedValueBinding = new Binding("Name"),
  51. Template = Template()
  52. };
  53. sic.SelectedItems = new List<TestClass>
  54. {
  55. items[1],
  56. items[3],
  57. items[4]
  58. };
  59. // When interacting, SelectedItem is the first item in the SelectedItems collection
  60. // But when set here, it's the last
  61. Assert.Equal(items[4].Name, sic.SelectedValue);
  62. }
  63. [Fact]
  64. public void Setting_SelectedValue_Sets_SelectedIndex()
  65. {
  66. using (UnitTestApplication.Start(TestServices.StyledWindow))
  67. {
  68. var items = TestClass.GetItems();
  69. var sic = new SelectingItemsControl
  70. {
  71. ItemsSource = items,
  72. SelectedValueBinding = new Binding("Name"),
  73. Template = Template()
  74. };
  75. Prepare(sic);
  76. sic.SelectedValue = items[1].Name;
  77. Assert.Equal(1, sic.SelectedIndex);
  78. }
  79. }
  80. [Fact]
  81. public void Setting_SelectedValue_Sets_SelectedItem()
  82. {
  83. using (UnitTestApplication.Start(TestServices.StyledWindow))
  84. {
  85. var items = TestClass.GetItems();
  86. var sic = new SelectingItemsControl
  87. {
  88. ItemsSource = items,
  89. SelectedValueBinding = new Binding("Name"),
  90. Template = Template()
  91. };
  92. Prepare(sic);
  93. sic.SelectedValue = "Item2";
  94. Assert.Equal(items[1], sic.SelectedItem);
  95. }
  96. }
  97. [Fact]
  98. public void Changing_SelectedValueBinding_Updates_SelectedValue()
  99. {
  100. using (UnitTestApplication.Start(TestServices.StyledWindow))
  101. {
  102. var items = TestClass.GetItems();
  103. var sic = new SelectingItemsControl
  104. {
  105. ItemsSource = items,
  106. SelectedValueBinding = new Binding("Name"),
  107. Template = Template()
  108. };
  109. sic.SelectedValue = "Item2";
  110. sic.SelectedValueBinding = new Binding("AltProperty");
  111. // Ensure SelectedItem didn't change
  112. Assert.Equal(items[1], sic.SelectedItem);
  113. Assert.Equal("Alt2", sic.SelectedValue);
  114. }
  115. }
  116. [Fact]
  117. public void SelectedValue_With_Null_SelectedValueBinding_Is_Item()
  118. {
  119. var items = TestClass.GetItems();
  120. var sic = new SelectingItemsControl
  121. {
  122. ItemsSource = items,
  123. Template = Template()
  124. };
  125. sic.SelectedIndex = 0;
  126. Assert.Equal(items[0], sic.SelectedValue);
  127. }
  128. [Fact]
  129. public void Setting_SelectedValue_Before_Initialize_Should_Retain_Selection()
  130. {
  131. var items = TestClass.GetItems();
  132. var sic = new SelectingItemsControl
  133. {
  134. ItemsSource = items,
  135. Template = Template(),
  136. SelectedValueBinding = new Binding("Name"),
  137. SelectedValue = "Item2"
  138. };
  139. sic.BeginInit();
  140. sic.EndInit();
  141. Assert.Equal(items[1].Name, sic.SelectedValue);
  142. }
  143. [Fact]
  144. public void Setting_SelectedValue_During_Initialize_Should_Take_Priority_Over_Previous_Value()
  145. {
  146. var items = TestClass.GetItems();
  147. var sic = new SelectingItemsControl
  148. {
  149. ItemsSource = items,
  150. Template = Template(),
  151. SelectedValueBinding = new Binding("Name"),
  152. SelectedValue = "Item2"
  153. };
  154. sic.BeginInit();
  155. sic.SelectedValue = "Item1";
  156. sic.EndInit();
  157. Assert.Equal(items[0].Name, sic.SelectedValue);
  158. }
  159. [Fact]
  160. public void Changing_Items_Should_Clear_SelectedValue()
  161. {
  162. using (UnitTestApplication.Start(TestServices.StyledWindow))
  163. {
  164. var items = TestClass.GetItems();
  165. var sic = new SelectingItemsControl
  166. {
  167. ItemsSource = items,
  168. Template = Template(),
  169. SelectedValueBinding = new Binding("Name"),
  170. SelectedValue = "Item2"
  171. };
  172. Prepare(sic);
  173. sic.ItemsSource = new List<TestClass>
  174. {
  175. new TestClass("NewItem", string.Empty)
  176. };
  177. Assert.Equal(null, sic.SelectedValue);
  178. }
  179. }
  180. [Fact]
  181. public void Setting_SelectedValue_Should_Raise_SelectionChanged_Event()
  182. {
  183. // Unlike SelectedIndex/SelectedItem tests, we need the ItemsControl to
  184. // initialize so that SelectedValue can actually be looked up
  185. using (UnitTestApplication.Start(TestServices.StyledWindow))
  186. {
  187. var items = TestClass.GetItems();
  188. var sic = new SelectingItemsControl
  189. {
  190. ItemsSource = items,
  191. Template = Template(),
  192. SelectedValueBinding = new Binding("Name"),
  193. };
  194. Prepare(sic);
  195. var called = false;
  196. sic.SelectionChanged += (s, e) =>
  197. {
  198. Assert.Same(items[1], e.AddedItems.Cast<object>().Single());
  199. Assert.Empty(e.RemovedItems);
  200. called = true;
  201. };
  202. sic.SelectedValue = "Item2";
  203. Assert.True(called);
  204. }
  205. }
  206. [Fact]
  207. public void Clearing_SelectedValue_Should_Raise_SelectionChanged_Event()
  208. {
  209. var items = TestClass.GetItems();
  210. var sic = new SelectingItemsControl
  211. {
  212. ItemsSource = items,
  213. Template = Template(),
  214. SelectedValueBinding = new Binding("Name"),
  215. SelectedValue = "Item2"
  216. };
  217. var called = false;
  218. sic.SelectionChanged += (s, e) =>
  219. {
  220. Assert.Same(items[1], e.RemovedItems.Cast<object>().Single());
  221. Assert.Empty(e.AddedItems);
  222. called = true;
  223. };
  224. sic.SelectedValue = null;
  225. Assert.True(called);
  226. }
  227. private static FuncControlTemplate Template()
  228. {
  229. return new FuncControlTemplate<SelectingItemsControl>((control, scope) =>
  230. new ItemsPresenter
  231. {
  232. Name = "itemsPresenter",
  233. [~ItemsPresenter.ItemsPanelProperty] = control[~ItemsControl.ItemsPanelProperty],
  234. }.RegisterInNameScope(scope));
  235. }
  236. private static void Prepare(SelectingItemsControl target)
  237. {
  238. var root = new TestRoot
  239. {
  240. Child = target,
  241. Width = 100,
  242. Height = 100,
  243. Styles =
  244. {
  245. new Style(x => x.Is<SelectingItemsControl>())
  246. {
  247. Setters =
  248. {
  249. new Setter(ListBox.TemplateProperty, Template()),
  250. },
  251. },
  252. },
  253. };
  254. root.LayoutManager.ExecuteInitialLayoutPass();
  255. }
  256. }
  257. internal class TestClass
  258. {
  259. public TestClass(string name, string alt)
  260. {
  261. Name = name;
  262. AltProperty = alt;
  263. }
  264. public string Name { get; set; }
  265. public string AltProperty { get; set; }
  266. public static List<TestClass> GetItems()
  267. {
  268. return new List<TestClass>
  269. {
  270. new TestClass("Item1", "Alt1"),
  271. new TestClass("Item2", "Alt2"),
  272. new TestClass("Item3", "Alt3"),
  273. new TestClass("Item4", "Alt4"),
  274. new TestClass("Item5", "Alt5"),
  275. };
  276. }
  277. }
  278. }