CheckBoxTests.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. #nullable enable
  2. using System.Collections.ObjectModel;
  3. namespace ViewsTests;
  4. public class CheckBoxTests ()
  5. {
  6. [Fact]
  7. public void Commands_Select ()
  8. {
  9. IApplication app = Application.Create ();
  10. Runnable<bool> runnable = new ();
  11. View otherView = new () { CanFocus = true };
  12. var ckb = new CheckBox ();
  13. runnable.Add (ckb, otherView);
  14. app.Begin (runnable);
  15. ckb.SetFocus ();
  16. Assert.True (ckb.HasFocus);
  17. var checkedStateChangingCount = 0;
  18. ckb.CheckedStateChanging += (s, e) => checkedStateChangingCount++;
  19. var selectCount = 0;
  20. ckb.Activating += (s, e) => selectCount++;
  21. var acceptCount = 0;
  22. ckb.Accepting += (s, e) => acceptCount++;
  23. Assert.Equal (CheckState.UnChecked, ckb.CheckedState);
  24. Assert.Equal (0, checkedStateChangingCount);
  25. Assert.Equal (0, selectCount);
  26. Assert.Equal (0, acceptCount);
  27. Assert.Equal (Key.Empty, ckb.HotKey);
  28. // Test while focused
  29. ckb.Text = "_Test";
  30. Assert.Equal (Key.T, ckb.HotKey);
  31. ckb.NewKeyDownEvent (Key.T);
  32. Assert.Equal (CheckState.Checked, ckb.CheckedState);
  33. Assert.Equal (1, checkedStateChangingCount);
  34. Assert.Equal (1, selectCount);
  35. Assert.Equal (0, acceptCount);
  36. ckb.Text = "T_est";
  37. Assert.Equal (Key.E, ckb.HotKey);
  38. ckb.NewKeyDownEvent (Key.E.WithAlt);
  39. Assert.Equal (2, checkedStateChangingCount);
  40. Assert.Equal (2, selectCount);
  41. Assert.Equal (0, acceptCount);
  42. ckb.NewKeyDownEvent (Key.Space);
  43. Assert.Equal (3, checkedStateChangingCount);
  44. Assert.Equal (3, selectCount);
  45. Assert.Equal (0, acceptCount);
  46. ckb.NewKeyDownEvent (Key.Enter);
  47. Assert.Equal (3, checkedStateChangingCount);
  48. Assert.Equal (3, selectCount);
  49. Assert.Equal (1, acceptCount);
  50. }
  51. [Theory]
  52. [InlineData ("01234", 0, 0, 0, 0)]
  53. [InlineData ("01234", 1, 0, 1, 0)]
  54. [InlineData ("01234", 0, 1, 0, 1)]
  55. [InlineData ("01234", 1, 1, 1, 1)]
  56. [InlineData ("01234", 10, 1, 10, 1)]
  57. [InlineData ("01234", 10, 3, 10, 3)]
  58. [InlineData ("0_1234", 0, 0, 0, 0)]
  59. [InlineData ("0_1234", 1, 0, 1, 0)]
  60. [InlineData ("0_1234", 0, 1, 0, 1)]
  61. [InlineData ("0_1234", 1, 1, 1, 1)]
  62. [InlineData ("0_1234", 10, 1, 10, 1)]
  63. [InlineData ("0_12你", 10, 3, 10, 3)]
  64. [InlineData ("0_12你", 0, 0, 0, 0)]
  65. [InlineData ("0_12你", 1, 0, 1, 0)]
  66. [InlineData ("0_12你", 0, 1, 0, 1)]
  67. [InlineData ("0_12你", 1, 1, 1, 1)]
  68. [InlineData ("0_12你", 10, 1, 10, 1)]
  69. public void CheckBox_AbsoluteSize_Text (string text, int width, int height, int expectedWidth, int expectedHeight)
  70. {
  71. var checkBox = new CheckBox
  72. {
  73. X = 0,
  74. Y = 0,
  75. Width = width,
  76. Height = height,
  77. Text = text
  78. };
  79. checkBox.Layout ();
  80. Assert.Equal (new (expectedWidth, expectedHeight), checkBox.Frame.Size);
  81. Assert.Equal (new (expectedWidth, expectedHeight), checkBox.Viewport.Size);
  82. Assert.Equal (new (expectedWidth, expectedHeight), checkBox.TextFormatter.ConstrainToSize);
  83. checkBox.Dispose ();
  84. }
  85. [Theory]
  86. [InlineData (0, 0, 0, 0)]
  87. [InlineData (1, 0, 1, 0)]
  88. [InlineData (0, 1, 0, 1)]
  89. [InlineData (1, 1, 1, 1)]
  90. [InlineData (10, 1, 10, 1)]
  91. [InlineData (10, 3, 10, 3)]
  92. public void CheckBox_AbsoluteSize_DefaultText (int width, int height, int expectedWidth, int expectedHeight)
  93. {
  94. var checkBox = new CheckBox
  95. {
  96. X = 0,
  97. Y = 0,
  98. Width = width,
  99. Height = height
  100. };
  101. Assert.Equal (new (expectedWidth, expectedHeight), checkBox.Frame.Size);
  102. Assert.Equal (new (expectedWidth, expectedHeight), checkBox.Viewport.Size);
  103. Assert.Equal (new (expectedWidth, expectedHeight), checkBox.TextFormatter.ConstrainToSize);
  104. checkBox.Dispose ();
  105. }
  106. // Test that Title and Text are the same
  107. [Fact]
  108. public void Text_Mirrors_Title ()
  109. {
  110. var view = new CheckBox ();
  111. view.Title = "Hello";
  112. Assert.Equal ("Hello", view.Title);
  113. Assert.Equal ("Hello", view.TitleTextFormatter.Text);
  114. Assert.Equal ("Hello", view.Text);
  115. Assert.Equal ($"{Glyphs.CheckStateUnChecked} Hello", view.TextFormatter.Text);
  116. }
  117. [Fact]
  118. public void Title_Mirrors_Text ()
  119. {
  120. var view = new CheckBox ();
  121. view.Text = "Hello";
  122. Assert.Equal ("Hello", view.Text);
  123. Assert.Equal ($"{Glyphs.CheckStateUnChecked} Hello", view.TextFormatter.Text);
  124. Assert.Equal ("Hello", view.Title);
  125. Assert.Equal ("Hello", view.TitleTextFormatter.Text);
  126. }
  127. [Fact]
  128. public void Constructors_Defaults ()
  129. {
  130. var ckb = new CheckBox ();
  131. Assert.True (ckb.Width is DimAuto);
  132. Assert.True (ckb.Height is DimAuto);
  133. ckb.Layout ();
  134. Assert.Equal (CheckState.UnChecked, ckb.CheckedState);
  135. Assert.False (ckb.AllowCheckStateNone);
  136. Assert.Equal (string.Empty, ckb.Text);
  137. Assert.Equal ($"{Glyphs.CheckStateUnChecked} ", ckb.TextFormatter.Text);
  138. Assert.True (ckb.CanFocus);
  139. Assert.Equal (new (0, 0, 2, 1), ckb.Frame);
  140. ckb = new () { Text = "Test", CheckedState = CheckState.Checked };
  141. Assert.True (ckb.Width is DimAuto);
  142. Assert.True (ckb.Height is DimAuto);
  143. ckb.Layout ();
  144. Assert.Equal (CheckState.Checked, ckb.CheckedState);
  145. Assert.False (ckb.AllowCheckStateNone);
  146. Assert.Equal ("Test", ckb.Text);
  147. Assert.Equal ($"{Glyphs.CheckStateChecked} Test", ckb.TextFormatter.Text);
  148. Assert.True (ckb.CanFocus);
  149. Assert.Equal (new (0, 0, 6, 1), ckb.Frame);
  150. ckb = new () { Text = "Test", X = 1, Y = 2 };
  151. Assert.True (ckb.Width is DimAuto);
  152. Assert.True (ckb.Height is DimAuto);
  153. ckb.Layout ();
  154. Assert.Equal (CheckState.UnChecked, ckb.CheckedState);
  155. Assert.False (ckb.AllowCheckStateNone);
  156. Assert.Equal ("Test", ckb.Text);
  157. Assert.Equal ($"{Glyphs.CheckStateUnChecked} Test", ckb.TextFormatter.Text);
  158. Assert.True (ckb.CanFocus);
  159. Assert.Equal (new (1, 2, 6, 1), ckb.Frame);
  160. ckb = new () { Text = "Test", X = 3, Y = 4, CheckedState = CheckState.Checked };
  161. Assert.True (ckb.Width is DimAuto);
  162. Assert.True (ckb.Height is DimAuto);
  163. ckb.Layout ();
  164. Assert.Equal (CheckState.Checked, ckb.CheckedState);
  165. Assert.False (ckb.AllowCheckStateNone);
  166. Assert.Equal ("Test", ckb.Text);
  167. Assert.Equal ($"{Glyphs.CheckStateChecked} Test", ckb.TextFormatter.Text);
  168. Assert.True (ckb.CanFocus);
  169. Assert.Equal (new (3, 4, 6, 1), ckb.Frame);
  170. }
  171. [Fact]
  172. public void Accept_Cancel_Event_OnAccept_Returns_True ()
  173. {
  174. var ckb = new CheckBox ();
  175. var acceptInvoked = false;
  176. ckb.Accepting += ViewOnAccept;
  177. bool? ret = ckb.InvokeCommand (Command.Accept);
  178. Assert.True (ret);
  179. Assert.True (acceptInvoked);
  180. return;
  181. void ViewOnAccept (object? sender, CommandEventArgs e)
  182. {
  183. acceptInvoked = true;
  184. e.Handled = true;
  185. }
  186. }
  187. [Fact]
  188. public void AllowCheckStateNone_Get_Set ()
  189. {
  190. var checkBox = new CheckBox { Text = "Check this out 你" };
  191. checkBox.HasFocus = true;
  192. Assert.True (checkBox.HasFocus);
  193. Assert.Equal (CheckState.UnChecked, checkBox.CheckedState);
  194. // Select with keyboard
  195. Assert.True (checkBox.NewKeyDownEvent (Key.Space));
  196. Assert.Equal (CheckState.Checked, checkBox.CheckedState);
  197. // Select with mouse
  198. Assert.True (checkBox.NewMouseEvent (new () { Position = new (0, 0), Flags = MouseFlags.Button1Clicked }));
  199. Assert.Equal (CheckState.UnChecked, checkBox.CheckedState);
  200. checkBox.AllowCheckStateNone = true;
  201. Assert.True (checkBox.NewKeyDownEvent (Key.Space));
  202. Assert.Equal (CheckState.None, checkBox.CheckedState);
  203. checkBox.AllowCheckStateNone = false;
  204. Assert.Equal (CheckState.UnChecked, checkBox.CheckedState);
  205. }
  206. [Fact]
  207. public void Mouse_Click_Selects ()
  208. {
  209. var checkBox = new CheckBox { Text = "_Checkbox" };
  210. Assert.True (checkBox.CanFocus);
  211. var checkedStateChangingCount = 0;
  212. checkBox.CheckedStateChanging += (s, e) => checkedStateChangingCount++;
  213. var selectCount = 0;
  214. checkBox.Activating += (s, e) => selectCount++;
  215. var acceptCount = 0;
  216. checkBox.Accepting += (s, e) => acceptCount++;
  217. checkBox.HasFocus = true;
  218. Assert.True (checkBox.HasFocus);
  219. Assert.Equal (CheckState.UnChecked, checkBox.CheckedState);
  220. Assert.Equal (0, checkedStateChangingCount);
  221. Assert.Equal (0, selectCount);
  222. Assert.Equal (0, acceptCount);
  223. Assert.True (checkBox.NewMouseEvent (new () { Position = new (0, 0), Flags = MouseFlags.Button1Clicked }));
  224. Assert.Equal (CheckState.Checked, checkBox.CheckedState);
  225. Assert.Equal (1, checkedStateChangingCount);
  226. Assert.Equal (1, selectCount);
  227. Assert.Equal (0, acceptCount);
  228. Assert.True (checkBox.NewMouseEvent (new () { Position = new (0, 0), Flags = MouseFlags.Button1Clicked }));
  229. Assert.Equal (CheckState.UnChecked, checkBox.CheckedState);
  230. Assert.Equal (2, checkedStateChangingCount);
  231. Assert.Equal (2, selectCount);
  232. Assert.Equal (0, acceptCount);
  233. checkBox.AllowCheckStateNone = true;
  234. Assert.True (checkBox.NewMouseEvent (new () { Position = new (0, 0), Flags = MouseFlags.Button1Clicked }));
  235. Assert.Equal (CheckState.None, checkBox.CheckedState);
  236. Assert.Equal (3, checkedStateChangingCount);
  237. Assert.Equal (3, selectCount);
  238. Assert.Equal (0, acceptCount);
  239. }
  240. [Fact]
  241. public void Mouse_DoubleClick_Accepts ()
  242. {
  243. var checkBox = new CheckBox { Text = "_Checkbox" };
  244. Assert.True (checkBox.CanFocus);
  245. var checkedStateChangingCount = 0;
  246. checkBox.CheckedStateChanging += (s, e) => checkedStateChangingCount++;
  247. var selectCount = 0;
  248. checkBox.Activating += (s, e) => selectCount++;
  249. var acceptCount = 0;
  250. checkBox.Accepting += (s, e) =>
  251. {
  252. acceptCount++;
  253. e.Handled = true;
  254. };
  255. checkBox.HasFocus = true;
  256. Assert.True (checkBox.HasFocus);
  257. Assert.Equal (CheckState.UnChecked, checkBox.CheckedState);
  258. Assert.Equal (0, checkedStateChangingCount);
  259. Assert.Equal (0, selectCount);
  260. Assert.Equal (0, acceptCount);
  261. checkBox.NewMouseEvent (new () { Position = new (0, 0), Flags = MouseFlags.Button1DoubleClicked });
  262. Assert.Equal (CheckState.UnChecked, checkBox.CheckedState);
  263. Assert.Equal (0, checkedStateChangingCount);
  264. Assert.Equal (0, selectCount);
  265. Assert.Equal (1, acceptCount);
  266. }
  267. }