KeyboardTests.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. using System;
  2. using Xunit;
  3. using Xunit.Abstractions;
  4. using System.Text;
  5. // Alias Console to MockConsole so we don't accidentally use Console
  6. using Console = Terminal.Gui.FakeConsole;
  7. namespace Terminal.Gui.ViewTests {
  8. public class KeyboardTests {
  9. readonly ITestOutputHelper output;
  10. public KeyboardTests (ITestOutputHelper output)
  11. {
  12. this.output = output;
  13. }
  14. [Fact]
  15. public void KeyPress_Handled_To_True_Prevents_Changes ()
  16. {
  17. Application.Init (new FakeDriver ());
  18. Console.MockKeyPresses.Push (new ConsoleKeyInfo ('N', ConsoleKey.N, false, false, false));
  19. var top = Application.Top;
  20. var text = new TextField ("");
  21. text.KeyPressed += (s, e) => {
  22. e.Handled = true;
  23. Assert.True (e.Handled);
  24. Assert.Equal (Key.N, e.KeyEvent.Key);
  25. };
  26. top.Add (text);
  27. Application.Iteration += (s, a) => {
  28. Console.MockKeyPresses.Push (new ConsoleKeyInfo ('N', ConsoleKey.N, false, false, false));
  29. Assert.Equal ("", text.Text);
  30. Application.RequestStop ();
  31. };
  32. Application.Run ();
  33. // Shutdown must be called to safely clean up Application if Init has been called
  34. Application.Shutdown ();
  35. }
  36. [Fact, AutoInitShutdown]
  37. public void KeyDown_And_KeyUp_Events_Must_Called_Before_OnKeyDown_And_OnKeyUp ()
  38. {
  39. var keyDown = false;
  40. var keyPress = false;
  41. var keyUp = false;
  42. var view = new DerivedView ();
  43. view.KeyDown += (s, e) => {
  44. Assert.Equal (Key.a, e.KeyEvent.Key);
  45. Assert.False (keyDown);
  46. Assert.False (view.IsKeyDown);
  47. e.Handled = true;
  48. keyDown = true;
  49. };
  50. view.KeyPressed += (s, e) => {
  51. Assert.Equal (Key.a, e.KeyEvent.Key);
  52. Assert.False (keyPress);
  53. Assert.False (view.IsKeyPress);
  54. e.Handled = true;
  55. keyPress = true;
  56. };
  57. view.KeyUp += (s, e) => {
  58. Assert.Equal (Key.a, e.KeyEvent.Key);
  59. Assert.False (keyUp);
  60. Assert.False (view.IsKeyUp);
  61. e.Handled = true;
  62. keyUp = true;
  63. };
  64. Application.Top.Add (view);
  65. Console.MockKeyPresses.Push (new ConsoleKeyInfo ('a', ConsoleKey.A, false, false, false));
  66. Application.Iteration += (s, a) => Application.RequestStop ();
  67. Assert.True (view.CanFocus);
  68. Application.Run ();
  69. Application.Shutdown ();
  70. Assert.True (keyDown);
  71. Assert.True (keyPress);
  72. Assert.True (keyUp);
  73. Assert.False (view.IsKeyDown);
  74. Assert.False (view.IsKeyPress);
  75. Assert.False (view.IsKeyUp);
  76. }
  77. public class DerivedView : View {
  78. public DerivedView ()
  79. {
  80. CanFocus = true;
  81. }
  82. public bool IsKeyDown { get; set; }
  83. public bool IsKeyPress { get; set; }
  84. public bool IsKeyUp { get; set; }
  85. public override string Text { get; set; }
  86. public override bool OnKeyDown (KeyEvent keyEvent)
  87. {
  88. IsKeyDown = true;
  89. return true;
  90. }
  91. public override bool ProcessKey (KeyEvent keyEvent)
  92. {
  93. IsKeyPress = true;
  94. return true;
  95. }
  96. public override bool OnKeyUp (KeyEvent keyEvent)
  97. {
  98. IsKeyUp = true;
  99. return true;
  100. }
  101. }
  102. [Theory, AutoInitShutdown]
  103. [InlineData (true, false, false)]
  104. [InlineData (true, true, false)]
  105. [InlineData (true, true, true)]
  106. public void KeyDown_And_KeyUp_Events_With_Only_Key_Modifiers (bool shift, bool alt, bool control)
  107. {
  108. var keyDown = false;
  109. var keyPress = false;
  110. var keyUp = false;
  111. var view = new DerivedView ();
  112. view.KeyDown += (s, e) => {
  113. Assert.Equal (-1, e.KeyEvent.KeyValue);
  114. Assert.Equal (shift, e.KeyEvent.IsShift);
  115. Assert.Equal (alt, e.KeyEvent.IsAlt);
  116. Assert.Equal (control, e.KeyEvent.IsCtrl);
  117. Assert.False (keyDown);
  118. Assert.False (view.IsKeyDown);
  119. keyDown = true;
  120. };
  121. view.KeyPressed += (s, e) => {
  122. keyPress = true;
  123. };
  124. view.KeyUp += (s, e) => {
  125. Assert.Equal (-1, e.KeyEvent.KeyValue);
  126. Assert.Equal (shift, e.KeyEvent.IsShift);
  127. Assert.Equal (alt, e.KeyEvent.IsAlt);
  128. Assert.Equal (control, e.KeyEvent.IsCtrl);
  129. Assert.False (keyUp);
  130. Assert.False (view.IsKeyUp);
  131. keyUp = true;
  132. };
  133. Application.Top.Add (view);
  134. Console.MockKeyPresses.Push (new ConsoleKeyInfo ('\0', 0, shift, alt, control));
  135. Application.Iteration += (s, a) => Application.RequestStop ();
  136. Assert.True (view.CanFocus);
  137. Application.Run ();
  138. Application.Shutdown ();
  139. Assert.True (keyDown);
  140. Assert.False (keyPress);
  141. Assert.True (keyUp);
  142. Assert.True (view.IsKeyDown);
  143. Assert.False (view.IsKeyPress);
  144. Assert.True (view.IsKeyUp);
  145. }
  146. }
  147. }