SelectingItemsControlTests_AutoSelect.cs 4.5 KB

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