ListBoxTests_Single.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  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.Linq;
  4. using Perspex.Controls.Presenters;
  5. using Perspex.Controls.Templates;
  6. using Perspex.Input;
  7. using Perspex.LogicalTree;
  8. using Perspex.Styling;
  9. using Xunit;
  10. namespace Perspex.Controls.UnitTests
  11. {
  12. public class ListBoxTests_Single
  13. {
  14. [Fact]
  15. public void Focusing_Item_With_Tab_Should_Not_Select_It()
  16. {
  17. var target = new ListBox
  18. {
  19. Template = new ControlTemplate(CreateListBoxTemplate),
  20. Items = new[] { "Foo", "Bar", "Baz " },
  21. };
  22. target.ApplyTemplate();
  23. target.Presenter.Panel.Children[0].RaiseEvent(new GotFocusEventArgs
  24. {
  25. RoutedEvent = InputElement.GotFocusEvent,
  26. NavigationMethod = NavigationMethod.Tab,
  27. });
  28. Assert.Equal(-1, target.SelectedIndex);
  29. }
  30. [Fact]
  31. public void Focusing_Item_With_Arrow_Key_Should_Select_It()
  32. {
  33. var target = new ListBox
  34. {
  35. Template = new ControlTemplate(CreateListBoxTemplate),
  36. Items = new[] { "Foo", "Bar", "Baz " },
  37. };
  38. target.ApplyTemplate();
  39. target.Presenter.Panel.Children[0].RaiseEvent(new GotFocusEventArgs
  40. {
  41. RoutedEvent = InputElement.GotFocusEvent,
  42. NavigationMethod = NavigationMethod.Directional,
  43. });
  44. Assert.Equal(0, target.SelectedIndex);
  45. }
  46. [Fact]
  47. public void Clicking_Item_Should_Select_It()
  48. {
  49. var target = new ListBox
  50. {
  51. Template = new ControlTemplate(CreateListBoxTemplate),
  52. Items = new[] { "Foo", "Bar", "Baz " },
  53. };
  54. target.ApplyTemplate();
  55. target.Presenter.Panel.Children[0].RaiseEvent(new PointerPressEventArgs
  56. {
  57. RoutedEvent = InputElement.PointerPressedEvent,
  58. MouseButton = MouseButton.Left,
  59. });
  60. Assert.Equal(0, target.SelectedIndex);
  61. }
  62. [Fact]
  63. public void Clicking_Selected_Item_Should_Not_Deselect_It()
  64. {
  65. var target = new ListBox
  66. {
  67. Template = new ControlTemplate(CreateListBoxTemplate),
  68. Items = new[] { "Foo", "Bar", "Baz " },
  69. };
  70. target.ApplyTemplate();
  71. target.SelectedIndex = 0;
  72. target.Presenter.Panel.Children[0].RaiseEvent(new PointerPressEventArgs
  73. {
  74. RoutedEvent = InputElement.PointerPressedEvent,
  75. MouseButton = MouseButton.Left,
  76. });
  77. Assert.Equal(0, target.SelectedIndex);
  78. }
  79. [Fact]
  80. public void Clicking_Item_Should_Select_It_When_SelectionMode_Toggle()
  81. {
  82. var target = new ListBox
  83. {
  84. Template = new ControlTemplate(CreateListBoxTemplate),
  85. Items = new[] { "Foo", "Bar", "Baz " },
  86. SelectionMode = SelectionMode.Single | SelectionMode.Toggle,
  87. };
  88. target.ApplyTemplate();
  89. target.Presenter.Panel.Children[0].RaiseEvent(new PointerPressEventArgs
  90. {
  91. RoutedEvent = InputElement.PointerPressedEvent,
  92. MouseButton = MouseButton.Left,
  93. });
  94. Assert.Equal(0, target.SelectedIndex);
  95. }
  96. [Fact]
  97. public void Clicking_Selected_Item_Should_Deselect_It_When_SelectionMode_Toggle()
  98. {
  99. var target = new ListBox
  100. {
  101. Template = new ControlTemplate(CreateListBoxTemplate),
  102. Items = new[] { "Foo", "Bar", "Baz " },
  103. SelectionMode = SelectionMode.Single | SelectionMode.Toggle,
  104. };
  105. target.ApplyTemplate();
  106. target.SelectedIndex = 0;
  107. target.Presenter.Panel.Children[0].RaiseEvent(new PointerPressEventArgs
  108. {
  109. RoutedEvent = InputElement.PointerPressedEvent,
  110. MouseButton = MouseButton.Left,
  111. });
  112. Assert.Equal(-1, target.SelectedIndex);
  113. }
  114. [Fact]
  115. public void Setting_Item_IsSelected_Sets_ListBox_Selection()
  116. {
  117. var target = new ListBox
  118. {
  119. Template = new ControlTemplate(CreateListBoxTemplate),
  120. Items = new[] { "Foo", "Bar", "Baz " },
  121. };
  122. target.ApplyTemplate();
  123. ((ListBoxItem)target.GetLogicalChildren().ElementAt(1)).IsSelected = true;
  124. Assert.Equal("Bar", target.SelectedItem);
  125. Assert.Equal(1, target.SelectedIndex);
  126. }
  127. private Control CreateListBoxTemplate(ITemplatedControl parent)
  128. {
  129. return new ScrollViewer
  130. {
  131. Template = new ControlTemplate(CreateScrollViewerTemplate),
  132. Content = new ItemsPresenter
  133. {
  134. Name = "itemsPresenter",
  135. [~ItemsPresenter.ItemsProperty] = parent.GetObservable(ItemsControl.ItemsProperty),
  136. }
  137. };
  138. }
  139. private Control CreateScrollViewerTemplate(ITemplatedControl parent)
  140. {
  141. return new ScrollContentPresenter
  142. {
  143. [~ContentPresenter.ContentProperty] = parent.GetObservable(ContentControl.ContentProperty),
  144. };
  145. }
  146. private class Item
  147. {
  148. public Item(string value)
  149. {
  150. Value = value;
  151. }
  152. public string Value { get; }
  153. }
  154. }
  155. }