AccessKeyHandlerTests.cs 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. using System.Collections.Generic;
  2. using Avalonia.Controls;
  3. using Avalonia.Input;
  4. using Avalonia.UnitTests;
  5. using Moq;
  6. using Xunit;
  7. namespace Avalonia.Base.UnitTests.Input
  8. {
  9. public class AccessKeyHandlerTests
  10. {
  11. [Fact]
  12. public void Should_Raise_Key_Events_For_Unregistered_Access_Key()
  13. {
  14. var root = new TestRoot();
  15. var target = new AccessKeyHandler();
  16. var events = new List<string>();
  17. target.SetOwner(root);
  18. root.KeyDown += (s, e) => events.Add($"KeyDown {e.Key}");
  19. root.KeyUp += (s, e) => events.Add($"KeyUp {e.Key}");
  20. KeyDown(root, Key.LeftAlt);
  21. KeyDown(root, Key.A, KeyModifiers.Alt);
  22. KeyUp(root, Key.A, KeyModifiers.Alt);
  23. KeyUp(root, Key.LeftAlt);
  24. Assert.Equal(new[]
  25. {
  26. "KeyDown LeftAlt",
  27. "KeyDown A",
  28. "KeyUp A",
  29. "KeyUp LeftAlt",
  30. }, events);
  31. }
  32. [Fact]
  33. public void Should_Raise_Key_Events_For_Unregistered_Access_Key_With_MainMenu()
  34. {
  35. var root = new TestRoot();
  36. var target = new AccessKeyHandler();
  37. var menu = Mock.Of<IMainMenu>();
  38. var events = new List<string>();
  39. target.SetOwner(root);
  40. target.MainMenu = menu;
  41. root.KeyDown += (s, e) => events.Add($"KeyDown {e.Key}");
  42. root.KeyUp += (s, e) => events.Add($"KeyUp {e.Key}");
  43. KeyDown(root, Key.LeftAlt);
  44. KeyDown(root, Key.A, KeyModifiers.Alt);
  45. KeyUp(root, Key.A, KeyModifiers.Alt);
  46. KeyUp(root, Key.LeftAlt);
  47. Assert.Equal(new[]
  48. {
  49. "KeyDown LeftAlt",
  50. "KeyDown A",
  51. "KeyUp A",
  52. "KeyUp LeftAlt",
  53. }, events);
  54. }
  55. [Fact]
  56. public void Should_Raise_Key_Events_For_Alt_Key()
  57. {
  58. var root = new TestRoot();
  59. var target = new AccessKeyHandler();
  60. var events = new List<string>();
  61. target.SetOwner(root);
  62. root.KeyDown += (s, e) => events.Add($"KeyDown {e.Key}");
  63. root.KeyUp += (s, e) => events.Add($"KeyUp {e.Key}");
  64. KeyDown(root, Key.LeftAlt);
  65. KeyUp(root, Key.LeftAlt);
  66. Assert.Equal(new[]
  67. {
  68. "KeyDown LeftAlt",
  69. "KeyUp LeftAlt",
  70. }, events);
  71. }
  72. [Fact]
  73. public void Should_Raise_Key_Events_For_Alt_Key_With_MainMenu()
  74. {
  75. var root = new TestRoot();
  76. var target = new AccessKeyHandler();
  77. var menu = new Mock<IMainMenu>();
  78. var events = new List<string>();
  79. menu.SetupAllProperties();
  80. menu.Setup(x => x.Open()).Callback(() => menu.Setup(x => x.IsOpen).Returns(true));
  81. target.SetOwner(root);
  82. target.MainMenu = menu.Object;
  83. root.KeyDown += (s, e) => events.Add($"KeyDown {e.Key}");
  84. root.KeyUp += (s, e) => events.Add($"KeyUp {e.Key}");
  85. KeyDown(root, Key.LeftAlt);
  86. KeyUp(root, Key.LeftAlt);
  87. KeyDown(root, Key.LeftAlt);
  88. KeyUp(root, Key.LeftAlt);
  89. Assert.Equal(new[]
  90. {
  91. "KeyDown LeftAlt",
  92. "KeyUp LeftAlt",
  93. "KeyDown LeftAlt",
  94. "KeyUp LeftAlt",
  95. }, events);
  96. }
  97. [Fact]
  98. public void Should_Raise_Key_Events_For_Registered_Access_Key()
  99. {
  100. var button = new Button();
  101. var root = new TestRoot(button);
  102. var target = new AccessKeyHandler();
  103. var events = new List<string>();
  104. target.SetOwner(root);
  105. target.Register('A', button);
  106. root.KeyDown += (s, e) => events.Add($"KeyDown {e.Key}");
  107. root.KeyUp += (s, e) => events.Add($"KeyUp {e.Key}");
  108. KeyDown(root, Key.LeftAlt);
  109. KeyDown(root, Key.A, KeyModifiers.Alt);
  110. KeyUp(root, Key.A, KeyModifiers.Alt);
  111. KeyUp(root, Key.LeftAlt);
  112. // This differs from WPF which doesn't raise the `A` key event, but matches UWP.
  113. Assert.Equal(new[]
  114. {
  115. "KeyDown LeftAlt",
  116. "KeyDown A",
  117. "KeyUp A",
  118. "KeyUp LeftAlt",
  119. }, events);
  120. }
  121. [Fact]
  122. public void Should_Raise_AccessKeyPressed_For_Registered_Access_Key()
  123. {
  124. var button = new Button();
  125. var root = new TestRoot(button);
  126. var target = new AccessKeyHandler();
  127. var raised = 0;
  128. target.SetOwner(root);
  129. target.Register('A', button);
  130. button.AddHandler(AccessKeyHandler.AccessKeyPressedEvent, (s, e) => ++raised);
  131. KeyDown(root, Key.LeftAlt);
  132. Assert.Equal(0, raised);
  133. KeyDown(root, Key.A, KeyModifiers.Alt);
  134. Assert.Equal(1, raised);
  135. KeyUp(root, Key.A, KeyModifiers.Alt);
  136. KeyUp(root, Key.LeftAlt);
  137. Assert.Equal(1, raised);
  138. }
  139. [Fact]
  140. public void Should_Not_Raise_AccessKeyPressed_For_Registered_Access_Key_When_Not_Effectively_Enabled()
  141. {
  142. var button = new Button();
  143. var root = new TestRoot(button) { IsEnabled = false };
  144. var target = new AccessKeyHandler();
  145. var raised = 0;
  146. target.SetOwner(root);
  147. target.Register('A', button);
  148. button.AddHandler(AccessKeyHandler.AccessKeyPressedEvent, (s, e) => ++raised);
  149. KeyDown(root, Key.LeftAlt);
  150. Assert.Equal(0, raised);
  151. KeyDown(root, Key.A, KeyModifiers.Alt);
  152. Assert.Equal(0, raised);
  153. KeyUp(root, Key.A, KeyModifiers.Alt);
  154. KeyUp(root, Key.LeftAlt);
  155. Assert.Equal(0, raised);
  156. }
  157. [Fact]
  158. public void Should_Open_MainMenu_On_Alt_KeyUp()
  159. {
  160. var root = new TestRoot();
  161. var target = new AccessKeyHandler();
  162. var menu = new Mock<IMainMenu>();
  163. target.SetOwner(root);
  164. target.MainMenu = menu.Object;
  165. KeyDown(root, Key.LeftAlt);
  166. menu.Verify(x => x.Open(), Times.Never);
  167. KeyUp(root, Key.LeftAlt);
  168. menu.Verify(x => x.Open(), Times.Once);
  169. }
  170. private static void KeyDown(IInputElement target, Key key, KeyModifiers modifiers = KeyModifiers.None)
  171. {
  172. target.RaiseEvent(new KeyEventArgs
  173. {
  174. RoutedEvent = InputElement.KeyDownEvent,
  175. Key = key,
  176. KeyModifiers = modifiers,
  177. });
  178. }
  179. private static void KeyUp(IInputElement target, Key key, KeyModifiers modifiers = KeyModifiers.None)
  180. {
  181. target.RaiseEvent(new KeyEventArgs
  182. {
  183. RoutedEvent = InputElement.KeyUpEvent,
  184. Key = key,
  185. KeyModifiers = modifiers,
  186. });
  187. }
  188. }
  189. }