InternalSelectionModelTests.cs 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Collections.Specialized;
  5. using Avalonia.Collections;
  6. using Avalonia.Controls.Selection;
  7. using Xunit;
  8. namespace Avalonia.Controls.UnitTests.Selection
  9. {
  10. public class InternalSelectionModelTests
  11. {
  12. [Fact]
  13. public void Selecting_Item_Adds_To_SelectedItems()
  14. {
  15. var target = CreateTarget();
  16. target.Select(0);
  17. Assert.Equal(new[] { "foo" }, target.SelectedItems);
  18. }
  19. [Fact]
  20. public void Selecting_Duplicate_On_Model_Adds_To_SelectedItems()
  21. {
  22. var target = CreateTarget(source: new[] { "foo", "bar", "baz", "foo", "bar", "baz" });
  23. target.SelectRange(1, 4);
  24. Assert.Equal(new[] { "bar", "baz", "foo", "bar" }, target.SelectedItems);
  25. }
  26. [Fact]
  27. public void Deselecting_On_Model_Removes_SelectedItem()
  28. {
  29. var target = CreateTarget();
  30. target.SelectRange(1, 2);
  31. target.Deselect(1);
  32. Assert.Equal(new[] { "baz" }, target.SelectedItems);
  33. }
  34. [Fact]
  35. public void Deselecting_Duplicate_On_Model_Removes_SelectedItem()
  36. {
  37. var target = CreateTarget(source: new[] { "foo", "bar", "baz", "foo", "bar", "baz" });
  38. target.SelectRange(1, 2);
  39. target.Select(4);
  40. target.Deselect(4);
  41. Assert.Equal(new[] { "baz", "bar" }, target.SelectedItems);
  42. }
  43. [Fact]
  44. public void Adding_To_SelectedItems_Selects_On_Model()
  45. {
  46. var target = CreateTarget();
  47. target.SelectRange(1, 2);
  48. target.SelectedItems.Add("foo");
  49. Assert.Equal(new[] { 0, 1, 2 }, target.SelectedIndexes);
  50. Assert.Equal(new[] { "bar", "baz", "foo" }, target.SelectedItems);
  51. }
  52. [Fact]
  53. public void Removing_From_SelectedItems_Deselects_On_Model()
  54. {
  55. var target = CreateTarget();
  56. target.SelectRange(1, 2);
  57. target.SelectedItems.Remove("baz");
  58. Assert.Equal(new[] { 1 }, target.SelectedIndexes);
  59. Assert.Equal(new[] { "bar" }, target.SelectedItems);
  60. }
  61. [Fact]
  62. public void Replacing_SelectedItem_Updates_Model()
  63. {
  64. var target = CreateTarget();
  65. target.SelectRange(1, 2);
  66. target.SelectedItems[0] = "foo";
  67. Assert.Equal(new[] { 0, 2 }, target.SelectedIndexes);
  68. Assert.Equal(new[] { "foo", "baz" }, target.SelectedItems);
  69. }
  70. [Fact]
  71. public void Clearing_SelectedItems_Updates_Model()
  72. {
  73. var target = CreateTarget();
  74. target.SelectedItems.Clear();
  75. Assert.Empty(target.SelectedIndexes);
  76. }
  77. [Fact]
  78. public void Setting_SelectedItems_Updates_Model()
  79. {
  80. var target = CreateTarget();
  81. var oldItems = target.SelectedItems;
  82. var newItems = new AvaloniaList<string> { "foo", "baz" };
  83. target.SelectedItems = newItems;
  84. Assert.Equal(new[] { 0, 2 }, target.SelectedIndexes);
  85. Assert.Same(newItems, target.SelectedItems);
  86. Assert.NotSame(oldItems, target.SelectedItems);
  87. Assert.Equal(new[] { "foo", "baz" }, newItems);
  88. }
  89. [Fact]
  90. public void Setting_Items_To_Null_Clears_Selection()
  91. {
  92. var target = CreateTarget();
  93. target.SelectRange(1, 2);
  94. target.SelectedItems = null;
  95. Assert.Empty(target.SelectedIndexes);
  96. }
  97. [Fact]
  98. public void Setting_Items_To_Null_Creates_Empty_Items()
  99. {
  100. var target = CreateTarget();
  101. var oldItems = target.SelectedItems;
  102. target.SelectedItems = null;
  103. Assert.NotNull(target.SelectedItems);
  104. Assert.NotSame(oldItems, target.SelectedItems);
  105. Assert.IsType<AvaloniaList<object>>(target.SelectedItems);
  106. }
  107. [Fact]
  108. public void Adds_Null_SelectedItems_When_Source_Is_Null()
  109. {
  110. var target = CreateTarget(nullSource: true);
  111. target.SelectRange(1, 2);
  112. Assert.Equal(new object[] { null, null }, target.SelectedItems);
  113. }
  114. [Fact]
  115. public void Updates_SelectedItems_When_Source_Changes_From_Null()
  116. {
  117. var target = CreateTarget(nullSource: true);
  118. target.SelectRange(1, 2);
  119. Assert.Equal(new object[] { null, null }, target.SelectedItems);
  120. target.Source = new[] { "foo", "bar", "baz" };
  121. Assert.Equal(new[] { "bar", "baz" }, target.SelectedItems);
  122. }
  123. [Fact]
  124. public void Updates_SelectedItems_When_Source_Changes_To_Null()
  125. {
  126. var target = CreateTarget();
  127. target.SelectRange(1, 2);
  128. Assert.Equal(new[] { "bar", "baz" }, target.SelectedItems);
  129. target.Source = null;
  130. Assert.Equal(new object[] { null, null }, target.SelectedItems);
  131. }
  132. [Fact]
  133. public void SelectedItems_Can_Be_Set_Before_Source()
  134. {
  135. var target = CreateTarget(nullSource: true);
  136. var items = new AvaloniaList<string> { "foo", "bar", "baz" };
  137. var selectedItems = new AvaloniaList<string> { "bar" };
  138. target.SelectedItems = selectedItems;
  139. target.Source = items;
  140. Assert.Equal(1, target.SelectedIndex);
  141. }
  142. [Fact]
  143. public void Does_Not_Accept_Fixed_Size_Items()
  144. {
  145. var target = CreateTarget();
  146. Assert.Throws<NotSupportedException>(() =>
  147. target.SelectedItems = new[] { "foo", "bar", "baz" });
  148. }
  149. [Fact]
  150. public void Restores_Selection_On_Items_Reset()
  151. {
  152. var items = new ResettingCollection(new[] { "foo", "bar", "baz" });
  153. var target = CreateTarget(source: items);
  154. target.SelectedIndex = 1;
  155. items.Reset(new[] { "baz", "foo", "bar" });
  156. Assert.Equal(2, target.SelectedIndex);
  157. }
  158. private static InternalSelectionModel CreateTarget(
  159. bool singleSelect = false,
  160. IList source = null,
  161. bool nullSource = false)
  162. {
  163. source ??= !nullSource ? new[] { "foo", "bar", "baz" } : null;
  164. var result = new InternalSelectionModel
  165. {
  166. SingleSelect = singleSelect,
  167. };
  168. ((ISelectionModel)result).Source = source;
  169. return result;
  170. }
  171. private class ResettingCollection : List<string>, INotifyCollectionChanged
  172. {
  173. public ResettingCollection(IEnumerable<string> items)
  174. {
  175. AddRange(items);
  176. }
  177. public void Reset(IEnumerable<string> items)
  178. {
  179. Clear();
  180. AddRange(items);
  181. CollectionChanged?.Invoke(
  182. this,
  183. new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
  184. }
  185. public event NotifyCollectionChangedEventHandler CollectionChanged;
  186. }
  187. }
  188. }