2
0

ButtonTests.cs 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. namespace Terminal.Gui.ViewsTests;
  2. /// <summary>
  3. /// Pure unit tests for <see cref="Button"/> that don't require Application static dependencies.
  4. /// These tests can run in parallel without interference.
  5. /// </summary>
  6. public class ButtonTests : UnitTests.Parallelizable.ParallelizableBase
  7. {
  8. [Fact]
  9. public void Text_Mirrors_Title ()
  10. {
  11. var view = new Button ();
  12. view.Title = "Hello";
  13. Assert.Equal ("Hello", view.Title);
  14. Assert.Equal ("Hello", view.TitleTextFormatter.Text);
  15. Assert.Equal ("Hello", view.Text);
  16. Assert.Equal ($"{Glyphs.LeftBracket} Hello {Glyphs.RightBracket}", view.TextFormatter.Text);
  17. view.Dispose ();
  18. }
  19. [Fact]
  20. public void Title_Mirrors_Text ()
  21. {
  22. var view = new Button ();
  23. view.Text = "Hello";
  24. Assert.Equal ("Hello", view.Text);
  25. Assert.Equal ($"{Glyphs.LeftBracket} Hello {Glyphs.RightBracket}", view.TextFormatter.Text);
  26. Assert.Equal ("Hello", view.Title);
  27. Assert.Equal ("Hello", view.TitleTextFormatter.Text);
  28. view.Dispose ();
  29. }
  30. [Theory]
  31. [InlineData ("01234", 0, 0, 0, 0)]
  32. [InlineData ("01234", 1, 0, 1, 0)]
  33. [InlineData ("01234", 0, 1, 0, 1)]
  34. [InlineData ("01234", 1, 1, 1, 1)]
  35. [InlineData ("01234", 10, 1, 10, 1)]
  36. [InlineData ("01234", 10, 3, 10, 3)]
  37. [InlineData ("0_1234", 0, 0, 0, 0)]
  38. [InlineData ("0_1234", 1, 0, 1, 0)]
  39. [InlineData ("0_1234", 0, 1, 0, 1)]
  40. [InlineData ("0_1234", 1, 1, 1, 1)]
  41. [InlineData ("0_1234", 10, 1, 10, 1)]
  42. [InlineData ("0_12你", 10, 3, 10, 3)]
  43. [InlineData ("0_12你", 0, 0, 0, 0)]
  44. [InlineData ("0_12你", 1, 0, 1, 0)]
  45. [InlineData ("0_12你", 0, 1, 0, 1)]
  46. [InlineData ("0_12你", 1, 1, 1, 1)]
  47. [InlineData ("0_12你", 10, 1, 10, 1)]
  48. public void Button_AbsoluteSize_Text (string text, int width, int height, int expectedWidth, int expectedHeight)
  49. {
  50. // Override CM
  51. Button.DefaultShadow = ShadowStyle.None;
  52. var btn1 = new Button
  53. {
  54. Text = text,
  55. Width = width,
  56. Height = height
  57. };
  58. Assert.Equal (new (expectedWidth, expectedHeight), btn1.Frame.Size);
  59. Assert.Equal (new (expectedWidth, expectedHeight), btn1.Viewport.Size);
  60. Assert.Equal (new (expectedWidth, expectedHeight), btn1.GetContentSize ());
  61. Assert.Equal (new Size (expectedWidth, expectedHeight), btn1.TextFormatter.ConstrainToSize);
  62. btn1.Dispose ();
  63. }
  64. [Theory]
  65. [InlineData (0, 0, 0, 0)]
  66. [InlineData (1, 0, 1, 0)]
  67. [InlineData (0, 1, 0, 1)]
  68. [InlineData (1, 1, 1, 1)]
  69. [InlineData (10, 1, 10, 1)]
  70. [InlineData (10, 3, 10, 3)]
  71. public void Button_AbsoluteSize_DefaultText (int width, int height, int expectedWidth, int expectedHeight)
  72. {
  73. // Override CM
  74. Button.DefaultShadow = ShadowStyle.None;
  75. var btn1 = new Button ();
  76. btn1.Width = width;
  77. btn1.Height = height;
  78. Assert.Equal (new (expectedWidth, expectedHeight), btn1.Frame.Size);
  79. Assert.Equal (new (expectedWidth, expectedHeight), btn1.Viewport.Size);
  80. Assert.Equal (new Size (expectedWidth, expectedHeight), btn1.TextFormatter.ConstrainToSize);
  81. btn1.Dispose ();
  82. }
  83. [Fact]
  84. public void Button_HotKeyChanged_EventFires ()
  85. {
  86. var btn = new Button { Text = "_Yar" };
  87. object sender = null;
  88. KeyChangedEventArgs args = null;
  89. btn.HotKeyChanged += (s, e) =>
  90. {
  91. sender = s;
  92. args = e;
  93. };
  94. btn.HotKeyChanged += (s, e) =>
  95. {
  96. sender = s;
  97. args = e;
  98. };
  99. btn.HotKey = KeyCode.R;
  100. Assert.Same (btn, sender);
  101. Assert.Equal (KeyCode.Y, args.OldKey);
  102. Assert.Equal (KeyCode.R, args.NewKey);
  103. btn.HotKey = KeyCode.R;
  104. Assert.Same (btn, sender);
  105. Assert.Equal (KeyCode.Y, args.OldKey);
  106. Assert.Equal (KeyCode.R, args.NewKey);
  107. btn.Dispose ();
  108. }
  109. [Fact]
  110. public void Button_HotKeyChanged_EventFires_WithNone ()
  111. {
  112. var btn = new Button ();
  113. object sender = null;
  114. KeyChangedEventArgs args = null;
  115. btn.HotKeyChanged += (s, e) =>
  116. {
  117. sender = s;
  118. args = e;
  119. };
  120. btn.HotKey = KeyCode.R;
  121. Assert.Same (btn, sender);
  122. Assert.Equal (KeyCode.Null, args.OldKey);
  123. Assert.Equal (KeyCode.R, args.NewKey);
  124. btn.Dispose ();
  125. }
  126. [Fact]
  127. public void HotKeyChange_Works ()
  128. {
  129. var clicked = false;
  130. var btn = new Button { Text = "_Test" };
  131. btn.Accepting += (s, e) => clicked = true;
  132. Assert.Equal (KeyCode.T, btn.HotKey);
  133. Assert.False (btn.NewKeyDownEvent (Key.T)); // Button processes, but does not handle
  134. Assert.True (clicked);
  135. clicked = false;
  136. Assert.False (btn.NewKeyDownEvent (Key.T.WithAlt)); // Button processes, but does not handle
  137. Assert.True (clicked);
  138. clicked = false;
  139. btn.HotKey = KeyCode.E;
  140. Assert.False (btn.NewKeyDownEvent (Key.E.WithAlt)); // Button processes, but does not handle
  141. Assert.True (clicked);
  142. }
  143. [Theory]
  144. [InlineData (false, 0)]
  145. [InlineData (true, 1)]
  146. public void Space_Fires_Accept (bool focused, int expected)
  147. {
  148. var superView = new View
  149. {
  150. CanFocus = true
  151. };
  152. Button button = new ();
  153. button.CanFocus = focused;
  154. var acceptInvoked = 0;
  155. button.Accepting += (s, e) => acceptInvoked++;
  156. superView.Add (button);
  157. button.SetFocus ();
  158. Assert.Equal (focused, button.HasFocus);
  159. superView.NewKeyDownEvent (Key.Space);
  160. Assert.Equal (expected, acceptInvoked);
  161. superView.Dispose ();
  162. }
  163. [Theory]
  164. [InlineData (false, 0)]
  165. [InlineData (true, 1)]
  166. public void Enter_Fires_Accept (bool focused, int expected)
  167. {
  168. var superView = new View
  169. {
  170. CanFocus = true
  171. };
  172. Button button = new ();
  173. button.CanFocus = focused;
  174. var acceptInvoked = 0;
  175. button.Accepting += (s, e) => acceptInvoked++;
  176. superView.Add (button);
  177. button.SetFocus ();
  178. Assert.Equal (focused, button.HasFocus);
  179. superView.NewKeyDownEvent (Key.Enter);
  180. Assert.Equal (expected, acceptInvoked);
  181. superView.Dispose ();
  182. }
  183. [Theory]
  184. [InlineData (false, 1)]
  185. [InlineData (true, 1)]
  186. public void HotKey_Fires_Accept (bool focused, int expected)
  187. {
  188. var superView = new View
  189. {
  190. CanFocus = true
  191. };
  192. Button button = new ()
  193. {
  194. HotKey = Key.A
  195. };
  196. button.CanFocus = focused;
  197. var acceptInvoked = 0;
  198. button.Accepting += (s, e) => acceptInvoked++;
  199. superView.Add (button);
  200. button.SetFocus ();
  201. Assert.Equal (focused, button.HasFocus);
  202. superView.NewKeyDownEvent (Key.A);
  203. Assert.Equal (expected, acceptInvoked);
  204. superView.Dispose ();
  205. }
  206. [Fact]
  207. public void HotKey_Command_Accepts ()
  208. {
  209. var btn = new Button { Text = "_Test" };
  210. var accepted = false;
  211. btn.Accepting += (s, e) => accepted = true;
  212. Assert.Equal (KeyCode.T, btn.HotKey);
  213. btn.InvokeCommand (Command.HotKey);
  214. Assert.True (accepted);
  215. }
  216. [Fact]
  217. public void Accept_Event_Returns_True ()
  218. {
  219. var btn = new Button { Text = "Test" };
  220. var acceptInvoked = false;
  221. btn.Accepting += (s, e) => { acceptInvoked = true; e.Handled = true; };
  222. Assert.True (btn.InvokeCommand (Command.Accept));
  223. Assert.True (acceptInvoked);
  224. }
  225. [Fact]
  226. public void Setting_Empty_Text_Sets_HoKey_To_KeyNull ()
  227. {
  228. var btn = new Button { Text = "_Test" };
  229. Assert.Equal (KeyCode.T, btn.HotKey);
  230. btn.Text = "";
  231. Assert.Equal (KeyCode.Null, btn.HotKey);
  232. }
  233. [Fact]
  234. public void TestAssignTextToButton ()
  235. {
  236. var btn = new Button { Text = "_K Ok" };
  237. Assert.Equal ("_K Ok", btn.Text);
  238. btn.Text = "_N Btn";
  239. Assert.Equal ("_N Btn", btn.Text);
  240. }
  241. [Fact]
  242. public void Accept_Cancel_Event_OnAccept_Returns_True ()
  243. {
  244. var button = new Button ();
  245. var acceptInvoked = false;
  246. button.Accepting += ButtonAccept;
  247. bool? ret = button.InvokeCommand (Command.Accept);
  248. Assert.True (ret);
  249. Assert.True (acceptInvoked);
  250. button.Dispose ();
  251. return;
  252. void ButtonAccept (object sender, CommandEventArgs e)
  253. {
  254. acceptInvoked = true;
  255. e.Handled = true;
  256. }
  257. }
  258. }