ViewCommandTests.cs 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. using System.ComponentModel;
  2. using System.Text;
  3. using Xunit.Abstractions;
  4. namespace Terminal.Gui.ViewTests;
  5. public class ViewCommandTests (ITestOutputHelper output)
  6. {
  7. #region OnAccept/Accept tests
  8. [Fact]
  9. public void Accept_Command_Raises_NoFocus ()
  10. {
  11. var view = new ViewEventTester ();
  12. Assert.False (view.HasFocus);
  13. Assert.False (view.InvokeCommand (Command.Accept)); // false means it was not handled
  14. Assert.Equal (1, view.OnAcceptCount);
  15. Assert.Equal (1, view.AcceptCount);
  16. Assert.False (view.HasFocus);
  17. }
  18. [Fact]
  19. public void Accept_Command_Handle_OnAccept_NoEvent ()
  20. {
  21. var view = new ViewEventTester ();
  22. Assert.False (view.HasFocus);
  23. view.HandleOnAccept = true;
  24. Assert.True (view.InvokeCommand (Command.Accept));
  25. Assert.Equal (1, view.OnAcceptCount);
  26. Assert.Equal (0, view.AcceptCount);
  27. }
  28. [Fact]
  29. public void Accept_Handle_Event_OnAccept_Returns_True ()
  30. {
  31. var view = new View ();
  32. var acceptInvoked = false;
  33. view.Accept += ViewOnAccept;
  34. bool? ret = view.InvokeCommand (Command.Accept);
  35. Assert.True (ret);
  36. Assert.True (acceptInvoked);
  37. return;
  38. void ViewOnAccept (object sender, HandledEventArgs e)
  39. {
  40. acceptInvoked = true;
  41. e.Handled = true;
  42. }
  43. }
  44. [Fact]
  45. public void Accept_Command_Invokes_Accept_Event ()
  46. {
  47. var view = new View ();
  48. var accepted = false;
  49. view.Accept += ViewOnAccept;
  50. view.InvokeCommand (Command.Accept);
  51. Assert.True (accepted);
  52. return;
  53. void ViewOnAccept (object sender, HandledEventArgs e) { accepted = true; }
  54. }
  55. // Accept on subview should bubble up to parent
  56. [Fact]
  57. public void Accept_Command_Bubbles_Up_To_SuperView ()
  58. {
  59. var view = new ViewEventTester () { Id = "view" };
  60. var subview = new ViewEventTester () { Id = "subview" };
  61. view.Add (subview);
  62. subview.InvokeCommand (Command.Accept);
  63. Assert.Equal (1, subview.OnAcceptCount);
  64. Assert.Equal (1, view.OnAcceptCount);
  65. subview.HandleOnAccept = true;
  66. subview.InvokeCommand (Command.Accept);
  67. Assert.Equal (2, subview.OnAcceptCount);
  68. Assert.Equal (1, view.OnAcceptCount);
  69. subview.HandleOnAccept = false;
  70. subview.HandleAccept = true;
  71. subview.InvokeCommand (Command.Accept);
  72. Assert.Equal (3, subview.OnAcceptCount);
  73. Assert.Equal (1, view.OnAcceptCount);
  74. // Add a super view to test deeper hierarchy
  75. var superView = new ViewEventTester () { Id = "superView" };
  76. superView.Add (view);
  77. subview.InvokeCommand (Command.Accept);
  78. Assert.Equal (4, subview.OnAcceptCount);
  79. Assert.Equal (1, view.OnAcceptCount);
  80. Assert.Equal (0, superView.OnAcceptCount);
  81. subview.HandleAccept = false;
  82. subview.InvokeCommand (Command.Accept);
  83. Assert.Equal (5, subview.OnAcceptCount);
  84. Assert.Equal (2, view.OnAcceptCount);
  85. Assert.Equal (1, superView.OnAcceptCount);
  86. view.HandleAccept = true;
  87. subview.InvokeCommand (Command.Accept);
  88. Assert.Equal (6, subview.OnAcceptCount);
  89. Assert.Equal (3, view.OnAcceptCount);
  90. Assert.Equal (1, superView.OnAcceptCount);
  91. }
  92. #endregion OnAccept/Accept tests
  93. #region OnSelect/Select tests
  94. [Fact]
  95. public void Select_Command_Raises_NoFocus ()
  96. {
  97. var view = new ViewEventTester ();
  98. Assert.False (view.HasFocus);
  99. Assert.False (view.InvokeCommand (Command.Select)); // false means it was not handled
  100. Assert.Equal (1, view.OnSelectCount);
  101. Assert.Equal (1, view.SelectCount);
  102. Assert.False (view.HasFocus);
  103. }
  104. [Fact]
  105. public void Select_Command_Handle_OnSelect_NoEvent ()
  106. {
  107. var view = new ViewEventTester ();
  108. Assert.False (view.HasFocus);
  109. view.HandleOnSelect = true;
  110. Assert.True (view.InvokeCommand (Command.Select));
  111. Assert.Equal (1, view.OnSelectCount);
  112. Assert.Equal (0, view.SelectCount);
  113. }
  114. [Fact]
  115. public void Select_Handle_Event_OnSelect_Returns_True ()
  116. {
  117. var view = new View ();
  118. var SelectInvoked = false;
  119. view.Select += ViewOnSelect;
  120. bool? ret = view.InvokeCommand (Command.Select);
  121. Assert.True (ret);
  122. Assert.True (SelectInvoked);
  123. return;
  124. void ViewOnSelect (object sender, HandledEventArgs e)
  125. {
  126. SelectInvoked = true;
  127. e.Handled = true;
  128. }
  129. }
  130. [Fact]
  131. public void Select_Command_Invokes_Select_Event ()
  132. {
  133. var view = new View ();
  134. var Selected = false;
  135. view.Select += ViewOnSelect;
  136. view.InvokeCommand (Command.Select);
  137. Assert.True (Selected);
  138. return;
  139. void ViewOnSelect (object sender, HandledEventArgs e) { Selected = true; }
  140. }
  141. #endregion OnSelect/Select tests
  142. #region OnHotKey/HotKey tests
  143. [Fact]
  144. public void HotKey_Command_SetsFocus ()
  145. {
  146. var view = new View ();
  147. view.CanFocus = true;
  148. Assert.False (view.HasFocus);
  149. view.InvokeCommand (Command.HotKey);
  150. Assert.True (view.HasFocus);
  151. }
  152. #endregion OnHotKey/HotKey tests
  153. public class ViewEventTester : View
  154. {
  155. public ViewEventTester ()
  156. {
  157. CanFocus = true;
  158. Accept += (s, a) =>
  159. {
  160. a.Handled = HandleAccept;
  161. AcceptCount++;
  162. };
  163. HotKeyCommand += (s, a) =>
  164. {
  165. a.Handled = HandleHotKeyCommand;
  166. HotKeyCommandCount++;
  167. };
  168. Select += (s, a) =>
  169. {
  170. a.Handled = HandleSelect;
  171. SelectCount++;
  172. };
  173. }
  174. public int OnAcceptCount { get; set; }
  175. public int AcceptCount { get; set; }
  176. public bool HandleOnAccept { get; set; }
  177. /// <inheritdoc />
  178. protected override bool OnAccept (HandledEventArgs args)
  179. {
  180. OnAcceptCount++;
  181. return HandleOnAccept;
  182. }
  183. public bool HandleAccept { get; set; }
  184. public int OnHotKeyCommandCount { get; set; }
  185. public int HotKeyCommandCount { get; set; }
  186. public bool HandleOnHotKeyCommand { get; set; }
  187. /// <inheritdoc />
  188. protected override bool OnHotKeyCommand (HandledEventArgs args)
  189. {
  190. OnHotKeyCommandCount++;
  191. return HandleOnHotKeyCommand;
  192. }
  193. public bool HandleHotKeyCommand { get; set; }
  194. public int OnSelectCount { get; set; }
  195. public int SelectCount { get; set; }
  196. public bool HandleOnSelect { get; set; }
  197. /// <inheritdoc />
  198. protected override bool OnSelect (HandledEventArgs args)
  199. {
  200. OnSelectCount++;
  201. return HandleOnSelect;
  202. }
  203. public bool HandleSelect { get; set; }
  204. }
  205. }