ButtonTests.cs 8.8 KB

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