ButtonTests.cs 8.8 KB

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