SelectingItemsControlTests_AutoSelect.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. using System.Collections.Generic;
  2. using System.Collections.Specialized;
  3. using Avalonia.Collections;
  4. using Avalonia.Controls.Presenters;
  5. using Avalonia.Controls.Primitives;
  6. using Avalonia.Controls.Templates;
  7. using Avalonia.UnitTests;
  8. using Xunit;
  9. namespace Avalonia.Controls.UnitTests.Primitives
  10. {
  11. public class SelectingItemsControlTests_AutoSelect : ScopedTestBase
  12. {
  13. [Fact]
  14. public void First_Item_Should_Be_Selected()
  15. {
  16. var target = new TestSelector
  17. {
  18. ItemsSource = new[] { "foo", "bar" },
  19. Template = Template(),
  20. };
  21. target.ApplyTemplate();
  22. Assert.Equal(0, target.SelectedIndex);
  23. Assert.Equal("foo", target.SelectedItem);
  24. }
  25. [Fact]
  26. public void First_Item_Should_Be_Selected_When_Added()
  27. {
  28. var items = new AvaloniaList<string>();
  29. var target = new TestSelector
  30. {
  31. ItemsSource = items,
  32. Template = Template(),
  33. };
  34. target.ApplyTemplate();
  35. items.Add("foo");
  36. Assert.Equal(0, target.SelectedIndex);
  37. Assert.Equal("foo", target.SelectedItem);
  38. }
  39. [Fact]
  40. public void First_Item_Should_Be_Selected_When_Reset()
  41. {
  42. var items = new ResetOnAdd();
  43. var target = new TestSelector
  44. {
  45. ItemsSource = items,
  46. Template = Template(),
  47. };
  48. target.ApplyTemplate();
  49. items.Add("foo");
  50. Assert.Equal(0, target.SelectedIndex);
  51. Assert.Equal("foo", target.SelectedItem);
  52. }
  53. [Fact]
  54. public void Item_Should_Be_Selected_When_Selection_Removed()
  55. {
  56. var items = new AvaloniaList<string>(new[] { "foo", "bar", "baz", "qux" });
  57. var target = new TestSelector
  58. {
  59. ItemsSource = items,
  60. Template = Template(),
  61. };
  62. target.ApplyTemplate();
  63. target.SelectedIndex = 2;
  64. items.RemoveAt(2);
  65. Assert.Equal(0, target.SelectedIndex);
  66. Assert.Equal("foo", target.SelectedItem);
  67. }
  68. [Fact]
  69. public void Selection_Should_Be_Cleared_When_No_Items_Left()
  70. {
  71. var items = new AvaloniaList<string>(new[] { "foo", "bar" });
  72. var target = new TestSelector
  73. {
  74. ItemsSource = items,
  75. Template = Template(),
  76. };
  77. target.ApplyTemplate();
  78. target.SelectedIndex = 1;
  79. items.RemoveAt(1);
  80. items.RemoveAt(0);
  81. Assert.Equal(-1, target.SelectedIndex);
  82. Assert.Null(target.SelectedItem);
  83. }
  84. [Fact]
  85. public void Removing_Selected_First_Item_Should_Select_Next_Item()
  86. {
  87. var items = new AvaloniaList<string>(new[] { "foo", "bar" });
  88. var target = new TestSelector
  89. {
  90. ItemsSource = items,
  91. Template = Template(),
  92. };
  93. target.ApplyTemplate();
  94. target.Presenter.ApplyTemplate();
  95. items.RemoveAt(0);
  96. Assert.Equal(0, target.SelectedIndex);
  97. Assert.Equal("bar", target.SelectedItem);
  98. }
  99. private static FuncControlTemplate Template()
  100. {
  101. return new FuncControlTemplate<SelectingItemsControl>((control, scope) =>
  102. new ItemsPresenter
  103. {
  104. Name = "itemsPresenter",
  105. [~ItemsPresenter.ItemsPanelProperty] = control[~ItemsControl.ItemsPanelProperty],
  106. }.RegisterInNameScope(scope));
  107. }
  108. private class TestSelector : SelectingItemsControl
  109. {
  110. static TestSelector()
  111. {
  112. SelectionModeProperty.OverrideDefaultValue<TestSelector>(SelectionMode.AlwaysSelected);
  113. }
  114. }
  115. private class ResetOnAdd : List<string>, INotifyCollectionChanged
  116. {
  117. public event NotifyCollectionChangedEventHandler CollectionChanged;
  118. public new void Add(string item)
  119. {
  120. base.Add(item);
  121. CollectionChanged?.Invoke(
  122. this,
  123. new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
  124. }
  125. }
  126. }
  127. }