KeyBindingsTests.cs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. #nullable enable
  2. namespace ViewBaseTests.Keyboard;
  3. /// <summary>
  4. /// Tests for View.KeyBindings
  5. /// </summary>
  6. public class KeyBindingsTests
  7. {
  8. [Fact]
  9. public void Focused_HotKey_Application_All_Work ()
  10. {
  11. IApplication app = Application.Create ();
  12. app.Begin (new Runnable<bool> { CanFocus = true });
  13. var view = new ScopedKeyBindingView ();
  14. var keyWasHandled = false;
  15. view.KeyDownNotHandled += (s, e) => keyWasHandled = true;
  16. app!.TopRunnableView!.Add (view);
  17. app.Keyboard.RaiseKeyDownEvent (Key.A);
  18. Assert.False (keyWasHandled);
  19. Assert.True (view.ApplicationCommand);
  20. keyWasHandled = false;
  21. app.Keyboard.RaiseKeyDownEvent (Key.H);
  22. Assert.True (view.HotKeyCommand);
  23. Assert.False (keyWasHandled);
  24. keyWasHandled = false;
  25. Assert.False (view.HasFocus);
  26. app.Keyboard.RaiseKeyDownEvent (Key.F);
  27. Assert.False (keyWasHandled);
  28. Assert.False (view.FocusedCommand);
  29. keyWasHandled = false;
  30. view.CanFocus = true;
  31. view.SetFocus ();
  32. Assert.True (view.HasFocus);
  33. app.Keyboard.RaiseKeyDownEvent (Key.F);
  34. Assert.True (view.FocusedCommand);
  35. Assert.False (keyWasHandled); // Command was invoked, but wasn't handled
  36. Assert.True (view.ApplicationCommand);
  37. Assert.True (view.HotKeyCommand);
  38. }
  39. [Fact]
  40. public void KeyBinding_Negative ()
  41. {
  42. IApplication? app = Application.Create ();
  43. app.Begin (new Runnable<bool> { CanFocus = true });
  44. var view = new ScopedKeyBindingView ();
  45. var keyWasHandled = false;
  46. view.KeyDownNotHandled += (s, e) => keyWasHandled = true;
  47. app.Keyboard.RaiseKeyDownEvent (Key.Z);
  48. Assert.False (keyWasHandled);
  49. Assert.False (view.ApplicationCommand);
  50. Assert.False (view.HotKeyCommand);
  51. Assert.False (view.FocusedCommand);
  52. keyWasHandled = false;
  53. Assert.False (view.HasFocus);
  54. app.Keyboard.RaiseKeyDownEvent (Key.F);
  55. Assert.False (keyWasHandled);
  56. Assert.False (view.ApplicationCommand);
  57. Assert.False (view.HotKeyCommand);
  58. Assert.False (view.FocusedCommand);
  59. }
  60. [Fact]
  61. public void HotKey_KeyBinding ()
  62. {
  63. IApplication? app = Application.Create ();
  64. app.Begin (new Runnable<bool> { CanFocus = true });
  65. var view = new ScopedKeyBindingView ();
  66. app!.TopRunnableView!.Add (view);
  67. var keyWasHandled = false;
  68. view.KeyDownNotHandled += (s, e) => keyWasHandled = true;
  69. keyWasHandled = false;
  70. app.Keyboard.RaiseKeyDownEvent (Key.H);
  71. Assert.True (view.HotKeyCommand);
  72. Assert.False (keyWasHandled);
  73. view.HotKey = KeyCode.Z;
  74. keyWasHandled = false;
  75. view.HotKeyCommand = false;
  76. app.Keyboard.RaiseKeyDownEvent (Key.H); // old hot key
  77. Assert.False (keyWasHandled);
  78. Assert.False (view.HotKeyCommand);
  79. app.Keyboard.RaiseKeyDownEvent (Key.Z); // new hot key
  80. Assert.True (view.HotKeyCommand);
  81. Assert.False (keyWasHandled);
  82. }
  83. [Fact]
  84. public void HotKey_KeyBinding_Negative ()
  85. {
  86. IApplication? app = Application.Create ();
  87. app.Begin (new Runnable<bool> { CanFocus = true });
  88. var view = new ScopedKeyBindingView ();
  89. var keyWasHandled = false;
  90. view.KeyDownNotHandled += (s, e) => keyWasHandled = true;
  91. app.Keyboard.RaiseKeyDownEvent (Key.Z);
  92. Assert.False (keyWasHandled);
  93. Assert.False (view.HotKeyCommand);
  94. keyWasHandled = false;
  95. app.Keyboard.RaiseKeyDownEvent (Key.F);
  96. Assert.False (view.HotKeyCommand);
  97. }
  98. [Fact]
  99. public void HotKey_Enabled_False_Does_Not_Invoke ()
  100. {
  101. IApplication? app = Application.Create ();
  102. app.Begin (new Runnable<bool> ());
  103. var view = new ScopedKeyBindingView ();
  104. var keyWasHandled = false;
  105. view.KeyDownNotHandled += (s, e) => keyWasHandled = true;
  106. app!.TopRunnableView!.Add (view);
  107. app.Keyboard.RaiseKeyDownEvent (Key.Z);
  108. Assert.False (keyWasHandled);
  109. Assert.False (view.HotKeyCommand);
  110. keyWasHandled = false;
  111. view.Enabled = false;
  112. app.Keyboard.RaiseKeyDownEvent (Key.F);
  113. Assert.False (view.HotKeyCommand);
  114. }
  115. [Fact]
  116. public void HotKey_Raises_HotKeyCommand ()
  117. {
  118. IApplication? app = Application.Create ();
  119. app.Begin (new Runnable<bool> ());
  120. var hotKeyRaised = false;
  121. var acceptRaised = false;
  122. var selectRaised = false;
  123. var view = new View
  124. {
  125. CanFocus = true,
  126. HotKeySpecifier = new ('_'),
  127. Title = "_Test"
  128. };
  129. app!.TopRunnableView!.Add (view);
  130. view.HandlingHotKey += (s, e) => hotKeyRaised = true;
  131. view.Accepting += (s, e) => acceptRaised = true;
  132. view.Activating += (s, e) => selectRaised = true;
  133. Assert.Equal (KeyCode.T, view.HotKey);
  134. Assert.True (app.Keyboard.RaiseKeyDownEvent (Key.T));
  135. Assert.True (hotKeyRaised);
  136. Assert.False (acceptRaised);
  137. Assert.False (selectRaised);
  138. hotKeyRaised = false;
  139. Assert.True (app.Keyboard.RaiseKeyDownEvent (Key.T.WithAlt));
  140. Assert.True (hotKeyRaised);
  141. Assert.False (acceptRaised);
  142. Assert.False (selectRaised);
  143. hotKeyRaised = false;
  144. view.HotKey = KeyCode.E;
  145. Assert.True (app.Keyboard.RaiseKeyDownEvent (Key.E.WithAlt));
  146. Assert.True (hotKeyRaised);
  147. Assert.False (acceptRaised);
  148. Assert.False (selectRaised);
  149. }
  150. // tests that test KeyBindingScope.Focus and KeyBindingScope.HotKey (tests for KeyBindingScope.Application are in Application/KeyboardTests.cs)
  151. public class ScopedKeyBindingView : View
  152. {
  153. /// <inheritdoc/>
  154. public override void EndInit ()
  155. {
  156. base.EndInit ();
  157. AddCommand (Command.Save, () => ApplicationCommand = true);
  158. AddCommand (Command.HotKey, () => HotKeyCommand = true);
  159. AddCommand (Command.Left, () => FocusedCommand = true);
  160. App!.Keyboard.KeyBindings.Add (Key.A, this, Command.Save);
  161. HotKey = KeyCode.H;
  162. KeyBindings.Add (Key.F, Command.Left);
  163. }
  164. public bool ApplicationCommand { get; set; }
  165. public bool FocusedCommand { get; set; }
  166. public bool HotKeyCommand { get; set; }
  167. }
  168. }