CheckBoxTests.cs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635
  1. using System.ComponentModel;
  2. using Xunit.Abstractions;
  3. // ReSharper disable AccessToModifiedClosure
  4. namespace Terminal.Gui.ViewsTests;
  5. public class CheckBoxTests (ITestOutputHelper output)
  6. {
  7. private static readonly Size _size25x1 = new (25, 1);
  8. [Theory]
  9. [InlineData ("01234", 0, 0, 0, 0)]
  10. [InlineData ("01234", 1, 0, 1, 0)]
  11. [InlineData ("01234", 0, 1, 0, 1)]
  12. [InlineData ("01234", 1, 1, 1, 1)]
  13. [InlineData ("01234", 10, 1, 10, 1)]
  14. [InlineData ("01234", 10, 3, 10, 3)]
  15. [InlineData ("0_1234", 0, 0, 0, 0)]
  16. [InlineData ("0_1234", 1, 0, 1, 0)]
  17. [InlineData ("0_1234", 0, 1, 0, 1)]
  18. [InlineData ("0_1234", 1, 1, 1, 1)]
  19. [InlineData ("0_1234", 10, 1, 10, 1)]
  20. [InlineData ("0_12你", 10, 3, 10, 3)]
  21. [InlineData ("0_12你", 0, 0, 0, 0)]
  22. [InlineData ("0_12你", 1, 0, 1, 0)]
  23. [InlineData ("0_12你", 0, 1, 0, 1)]
  24. [InlineData ("0_12你", 1, 1, 1, 1)]
  25. [InlineData ("0_12你", 10, 1, 10, 1)]
  26. public void CheckBox_AbsoluteSize_Text (string text, int width, int height, int expectedWidth, int expectedHeight)
  27. {
  28. var checkBox = new CheckBox
  29. {
  30. X = 0,
  31. Y = 0,
  32. Width = width,
  33. Height = height,
  34. Text = text
  35. };
  36. Assert.Equal (new (expectedWidth, expectedHeight), checkBox.Frame.Size);
  37. Assert.Equal (new (expectedWidth, expectedHeight), checkBox.Viewport.Size);
  38. Assert.Equal (new (expectedWidth, expectedHeight), checkBox.TextFormatter.ConstrainToSize);
  39. checkBox.Dispose ();
  40. }
  41. [Theory]
  42. [InlineData (0, 0, 0, 0)]
  43. [InlineData (1, 0, 1, 0)]
  44. [InlineData (0, 1, 0, 1)]
  45. [InlineData (1, 1, 1, 1)]
  46. [InlineData (10, 1, 10, 1)]
  47. [InlineData (10, 3, 10, 3)]
  48. public void CheckBox_AbsoluteSize_DefaultText (int width, int height, int expectedWidth, int expectedHeight)
  49. {
  50. var checkBox = new CheckBox
  51. {
  52. X = 0,
  53. Y = 0,
  54. Width = width,
  55. Height = height
  56. };
  57. Assert.Equal (new (expectedWidth, expectedHeight), checkBox.Frame.Size);
  58. Assert.Equal (new (expectedWidth, expectedHeight), checkBox.Viewport.Size);
  59. Assert.Equal (new (expectedWidth, expectedHeight), checkBox.TextFormatter.ConstrainToSize);
  60. checkBox.Dispose ();
  61. }
  62. // Test that Title and Text are the same
  63. [Fact]
  64. public void Text_Mirrors_Title ()
  65. {
  66. var view = new CheckBox ();
  67. view.Title = "Hello";
  68. Assert.Equal ("Hello", view.Title);
  69. Assert.Equal ("Hello", view.TitleTextFormatter.Text);
  70. Assert.Equal ("Hello", view.Text);
  71. Assert.Equal ($"{CM.Glyphs.CheckStateUnChecked} Hello", view.TextFormatter.Text);
  72. }
  73. [Fact]
  74. public void Title_Mirrors_Text ()
  75. {
  76. var view = new CheckBox ();
  77. view.Text = "Hello";
  78. Assert.Equal ("Hello", view.Text);
  79. Assert.Equal ($"{CM.Glyphs.CheckStateUnChecked} Hello", view.TextFormatter.Text);
  80. Assert.Equal ("Hello", view.Title);
  81. Assert.Equal ("Hello", view.TitleTextFormatter.Text);
  82. }
  83. [Fact]
  84. public void Constructors_Defaults ()
  85. {
  86. var ckb = new CheckBox ();
  87. Assert.True (ckb.Width is DimAuto);
  88. Assert.True (ckb.Height is DimAuto);
  89. Assert.Equal (CheckState.UnChecked, ckb.CheckedState);
  90. Assert.False (ckb.AllowCheckStateNone);
  91. Assert.Equal (string.Empty, ckb.Text);
  92. Assert.Equal ($"{CM.Glyphs.CheckStateUnChecked} ", ckb.TextFormatter.Text);
  93. Assert.True (ckb.CanFocus);
  94. Assert.Equal (new (0, 0, 2, 1), ckb.Frame);
  95. ckb = new () { Text = "Test", CheckedState = CheckState.Checked };
  96. Assert.True (ckb.Width is DimAuto);
  97. Assert.True (ckb.Height is DimAuto);
  98. Assert.Equal (CheckState.Checked, ckb.CheckedState);
  99. Assert.False (ckb.AllowCheckStateNone);
  100. Assert.Equal ("Test", ckb.Text);
  101. Assert.Equal ($"{CM.Glyphs.CheckStateChecked} Test", ckb.TextFormatter.Text);
  102. Assert.True (ckb.CanFocus);
  103. Assert.Equal (new (0, 0, 6, 1), ckb.Frame);
  104. ckb = new () { Text = "Test", X = 1, Y = 2 };
  105. Assert.True (ckb.Width is DimAuto);
  106. Assert.True (ckb.Height is DimAuto);
  107. Assert.Equal (CheckState.UnChecked, ckb.CheckedState);
  108. Assert.False (ckb.AllowCheckStateNone);
  109. Assert.Equal ("Test", ckb.Text);
  110. Assert.Equal ($"{CM.Glyphs.CheckStateUnChecked} Test", ckb.TextFormatter.Text);
  111. Assert.True (ckb.CanFocus);
  112. Assert.Equal (new (1, 2, 6, 1), ckb.Frame);
  113. ckb = new () { Text = "Test", X = 3, Y = 4, CheckedState = CheckState.Checked };
  114. Assert.True (ckb.Width is DimAuto);
  115. Assert.True (ckb.Height is DimAuto);
  116. Assert.Equal (CheckState.Checked, ckb.CheckedState);
  117. Assert.False (ckb.AllowCheckStateNone);
  118. Assert.Equal ("Test", ckb.Text);
  119. Assert.Equal ($"{CM.Glyphs.CheckStateChecked} Test", ckb.TextFormatter.Text);
  120. Assert.True (ckb.CanFocus);
  121. Assert.Equal (new (3, 4, 6, 1), ckb.Frame);
  122. }
  123. [Fact]
  124. [SetupFakeDriver]
  125. public void AllowCheckStateNone_Get_Set ()
  126. {
  127. var checkBox = new CheckBox { Text = "Check this out 你" };
  128. checkBox.HasFocus = true;
  129. Assert.True (checkBox.HasFocus);
  130. Assert.Equal (CheckState.UnChecked, checkBox.CheckedState);
  131. // Select with keyboard
  132. Assert.True (checkBox.NewKeyDownEvent (Key.Space));
  133. Assert.Equal (CheckState.Checked, checkBox.CheckedState);
  134. // Select with mouse
  135. Assert.True (checkBox.NewMouseEvent (new () { Position = new (0, 0), Flags = MouseFlags.Button1Clicked }));
  136. Assert.Equal (CheckState.UnChecked, checkBox.CheckedState);
  137. checkBox.AllowCheckStateNone = true;
  138. Assert.True (checkBox.NewKeyDownEvent (Key.Space));
  139. Assert.Equal (CheckState.None, checkBox.CheckedState);
  140. checkBox.Draw ();
  141. checkBox.AllowCheckStateNone = false;
  142. Assert.Equal (CheckState.UnChecked, checkBox.CheckedState);
  143. }
  144. [Fact]
  145. public void Commands_Select ()
  146. {
  147. Application.Navigation = new ApplicationNavigation ();
  148. Application.Top = new Toplevel ();
  149. View otherView = new () { CanFocus = true };
  150. var ckb = new CheckBox ();
  151. Application.Top.Add (ckb, otherView);
  152. Application.Top.SetFocus ();
  153. Assert.True (ckb.HasFocus);
  154. int checkedStateChangingCount = 0;
  155. ckb.CheckedStateChanging += (s, e) => checkedStateChangingCount++;
  156. int selectCount = 0;
  157. ckb.Select += (s, e) => selectCount++;
  158. int acceptCount = 0;
  159. ckb.Accept += (s, e) => acceptCount++;
  160. Assert.Equal (CheckState.UnChecked, ckb.CheckedState);
  161. Assert.Equal (0, checkedStateChangingCount);
  162. Assert.Equal (0, selectCount);
  163. Assert.Equal (0, acceptCount);
  164. Assert.Equal (Key.Empty, ckb.HotKey);
  165. // Test while focused
  166. ckb.Text = "_Test";
  167. Assert.Equal (Key.T, ckb.HotKey);
  168. ckb.NewKeyDownEvent (Key.T);
  169. Assert.Equal (CheckState.Checked, ckb.CheckedState);
  170. Assert.Equal (1, checkedStateChangingCount);
  171. Assert.Equal (1, selectCount);
  172. Assert.Equal (0, acceptCount);
  173. ckb.Text = "T_est";
  174. Assert.Equal (Key.E, ckb.HotKey);
  175. ckb.NewKeyDownEvent (Key.E.WithAlt);
  176. Assert.Equal (2, checkedStateChangingCount);
  177. Assert.Equal (2, selectCount);
  178. Assert.Equal (0, acceptCount);
  179. ckb.NewKeyDownEvent (Key.Space);
  180. Assert.Equal (3, checkedStateChangingCount);
  181. Assert.Equal (3, selectCount);
  182. Assert.Equal (0, acceptCount);
  183. ckb.NewKeyDownEvent (Key.Enter);
  184. Assert.Equal (3, checkedStateChangingCount);
  185. Assert.Equal (3, selectCount);
  186. Assert.Equal (1, acceptCount);
  187. Application.Top.Dispose ();
  188. Application.ResetState (false);
  189. }
  190. [Fact]
  191. public void Accept_Cancel_Event_OnAccept_Returns_True ()
  192. {
  193. var ckb = new CheckBox ();
  194. var acceptInvoked = false;
  195. ckb.Accept += ViewOnAccept;
  196. bool? ret = ckb.InvokeCommand (Command.Accept);
  197. Assert.True (ret);
  198. Assert.True (acceptInvoked);
  199. return;
  200. void ViewOnAccept (object sender, HandledEventArgs e)
  201. {
  202. acceptInvoked = true;
  203. e.Handled = true;
  204. }
  205. }
  206. #region Mouse Tests
  207. [Fact]
  208. [SetupFakeDriver]
  209. public void Mouse_Click ()
  210. {
  211. var checkBox = new CheckBox { Text = "_Checkbox" };
  212. Assert.True (checkBox.CanFocus);
  213. int checkedStateChangingCount = 0;
  214. checkBox.CheckedStateChanging += (s, e) => checkedStateChangingCount++;
  215. int selectCount = 0;
  216. checkBox.Select += (s, e) => selectCount++;
  217. int acceptCount = 0;
  218. checkBox.Accept += (s, e) => acceptCount++;
  219. checkBox.HasFocus = true;
  220. Assert.True (checkBox.HasFocus);
  221. Assert.Equal (CheckState.UnChecked, checkBox.CheckedState);
  222. Assert.Equal (0, checkedStateChangingCount);
  223. Assert.Equal (0, selectCount);
  224. Assert.Equal (0, acceptCount);
  225. Assert.True (checkBox.NewMouseEvent (new () { Position = new (0, 0), Flags = MouseFlags.Button1Clicked }));
  226. Assert.Equal (CheckState.Checked, checkBox.CheckedState);
  227. Assert.Equal (1, checkedStateChangingCount);
  228. Assert.Equal (1, selectCount);
  229. Assert.Equal (0, acceptCount);
  230. Assert.True (checkBox.NewMouseEvent (new () { Position = new (0, 0), Flags = MouseFlags.Button1Clicked }));
  231. Assert.Equal (CheckState.UnChecked, checkBox.CheckedState);
  232. Assert.Equal (2, checkedStateChangingCount);
  233. Assert.Equal (2, selectCount);
  234. Assert.Equal (0, acceptCount);
  235. checkBox.AllowCheckStateNone = true;
  236. Assert.True (checkBox.NewMouseEvent (new () { Position = new (0, 0), Flags = MouseFlags.Button1Clicked }));
  237. Assert.Equal (CheckState.None, checkBox.CheckedState);
  238. Assert.Equal (3, checkedStateChangingCount);
  239. Assert.Equal (3, selectCount);
  240. Assert.Equal (0, acceptCount);
  241. }
  242. [Fact]
  243. [SetupFakeDriver]
  244. public void Mouse_DoubleClick ()
  245. {
  246. var checkBox = new CheckBox { Text = "_Checkbox" };
  247. Assert.True (checkBox.CanFocus);
  248. int checkedStateChangingCount = 0;
  249. checkBox.CheckedStateChanging += (s, e) => checkedStateChangingCount++;
  250. int selectCount = 0;
  251. checkBox.Select += (s, e) => selectCount++;
  252. int acceptCount = 0;
  253. checkBox.Accept += (s, e) => acceptCount++;
  254. checkBox.HasFocus = true;
  255. Assert.True (checkBox.HasFocus);
  256. Assert.Equal (CheckState.UnChecked, checkBox.CheckedState);
  257. Assert.Equal (0, checkedStateChangingCount);
  258. Assert.Equal (0, selectCount);
  259. Assert.Equal (0, acceptCount);
  260. #if !CHECKBOX_SUPPORTS_DOUBLE_CLICK_ACCEPT
  261. Assert.False (checkBox.NewMouseEvent (new () { Position = new (0, 0), Flags = MouseFlags.Button1DoubleClicked }));
  262. #else
  263. Assert.True (checkBox.NewMouseEvent (new () { Position = new (0, 0), Flags = MouseFlags.Button1DoubleClicked }));
  264. Assert.Equal (CheckState.Checked, checkBox.CheckedState);
  265. Assert.Equal (1, checkedStateChangingCount);
  266. Assert.Equal (1, selectCount);
  267. Assert.Equal (0, acceptCount);
  268. Assert.True (checkBox.NewMouseEvent (new () { Position = new (0, 0), Flags = MouseFlags.Button1DoubleClicked }));
  269. Assert.Equal (CheckState.UnChecked, checkBox.CheckedState);
  270. Assert.Equal (2, checkedStateChangingCount);
  271. Assert.Equal (2, selectCount);
  272. Assert.Equal (0, acceptCount);
  273. checkBox.AllowCheckStateNone = true;
  274. Assert.True (checkBox.NewMouseEvent (new () { Position = new (0, 0), Flags = MouseFlags.Button1DoubleClicked }));
  275. Assert.Equal (CheckState.None, checkBox.CheckedState);
  276. Assert.Equal (3, checkedStateChangingCount);
  277. Assert.Equal (3, selectCount);
  278. Assert.Equal (0, acceptCount);
  279. #endif
  280. }
  281. #endregion Mouse Tests
  282. [Fact]
  283. [AutoInitShutdown]
  284. public void TextAlignment_Centered ()
  285. {
  286. var checkBox = new CheckBox
  287. {
  288. X = 1,
  289. Y = Pos.Center (),
  290. Text = "Check this out 你",
  291. TextAlignment = Alignment.Center,
  292. Width = 25
  293. };
  294. var win = new Window { Width = Dim.Fill (), Height = Dim.Fill (), Title = "Test Demo 你" };
  295. win.Add (checkBox);
  296. var top = new Toplevel ();
  297. top.Add (win);
  298. Application.Begin (top);
  299. ((FakeDriver)Application.Driver!).SetBufferSize (30, 5);
  300. Assert.Equal (Alignment.Center, checkBox.TextAlignment);
  301. Assert.Equal (new (1, 1, 25, 1), checkBox.Frame);
  302. Assert.Equal (_size25x1, checkBox.TextFormatter.ConstrainToSize);
  303. var expected = @$"
  304. ┌┤Test Demo 你├──────────────┐
  305. │ │
  306. │ {CM.Glyphs.CheckStateUnChecked} Check this out 你 │
  307. │ │
  308. └────────────────────────────┘
  309. ";
  310. Rectangle pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  311. Assert.Equal (new (0, 0, 30, 5), pos);
  312. checkBox.CheckedState = CheckState.Checked;
  313. Application.Refresh ();
  314. expected = @$"
  315. ┌┤Test Demo 你├──────────────┐
  316. │ │
  317. │ {CM.Glyphs.CheckStateChecked} Check this out 你 │
  318. │ │
  319. └────────────────────────────┘
  320. ";
  321. pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  322. Assert.Equal (new (0, 0, 30, 5), pos);
  323. top.Dispose ();
  324. }
  325. [Fact]
  326. [AutoInitShutdown]
  327. public void TextAlignment_Justified ()
  328. {
  329. var checkBox1 = new CheckBox
  330. {
  331. X = 1,
  332. Y = Pos.Center (),
  333. Text = "Check first out 你",
  334. TextAlignment = Alignment.Fill,
  335. Width = 25
  336. };
  337. var checkBox2 = new CheckBox
  338. {
  339. X = 1,
  340. Y = Pos.Bottom (checkBox1),
  341. Text = "Check second out 你",
  342. TextAlignment = Alignment.Fill,
  343. Width = 25
  344. };
  345. var win = new Window { Width = Dim.Fill (), Height = Dim.Fill (), Title = "Test Demo 你" };
  346. win.Add (checkBox1, checkBox2);
  347. var top = new Toplevel ();
  348. top.Add (win);
  349. Application.Begin (top);
  350. ((FakeDriver)Application.Driver!).SetBufferSize (30, 6);
  351. Assert.Equal (Alignment.Fill, checkBox1.TextAlignment);
  352. Assert.Equal (new (1, 1, 25, 1), checkBox1.Frame);
  353. Assert.Equal (Alignment.Fill, checkBox2.TextAlignment);
  354. Assert.Equal (new (1, 2, 25, 1), checkBox2.Frame);
  355. var expected = @$"
  356. ┌┤Test Demo 你├──────────────┐
  357. │ │
  358. │ {CM.Glyphs.CheckStateUnChecked} Check first out 你 │
  359. │ {CM.Glyphs.CheckStateUnChecked} Check second out 你 │
  360. │ │
  361. └────────────────────────────┘
  362. ";
  363. Rectangle pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  364. Assert.Equal (new (0, 0, 30, 6), pos);
  365. checkBox1.CheckedState = CheckState.Checked;
  366. Assert.Equal (new (1, 1, 25, 1), checkBox1.Frame);
  367. Assert.Equal (_size25x1, checkBox1.TextFormatter.ConstrainToSize);
  368. checkBox2.CheckedState = CheckState.Checked;
  369. Assert.Equal (new (1, 2, 25, 1), checkBox2.Frame);
  370. Assert.Equal (_size25x1, checkBox2.TextFormatter.ConstrainToSize);
  371. Application.Refresh ();
  372. expected = @$"
  373. ┌┤Test Demo 你├──────────────┐
  374. │ │
  375. │ {CM.Glyphs.CheckStateChecked} Check first out 你 │
  376. │ {CM.Glyphs.CheckStateChecked} Check second out 你 │
  377. │ │
  378. └────────────────────────────┘
  379. ";
  380. pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  381. Assert.Equal (new (0, 0, 30, 6), pos);
  382. top.Dispose ();
  383. }
  384. [Fact]
  385. [AutoInitShutdown]
  386. public void TextAlignment_Left ()
  387. {
  388. var checkBox = new CheckBox
  389. {
  390. X = 1,
  391. Y = Pos.Center (),
  392. Text = "Check this out 你",
  393. Width = 25
  394. };
  395. var win = new Window { Width = Dim.Fill (), Height = Dim.Fill (), Title = "Test Demo 你" };
  396. win.Add (checkBox);
  397. var top = new Toplevel ();
  398. top.Add (win);
  399. Application.Begin (top);
  400. ((FakeDriver)Application.Driver!).SetBufferSize (30, 5);
  401. Assert.Equal (Alignment.Start, checkBox.TextAlignment);
  402. Assert.Equal (new (1, 1, 25, 1), checkBox.Frame);
  403. Assert.Equal (_size25x1, checkBox.TextFormatter.ConstrainToSize);
  404. var expected = @$"
  405. ┌┤Test Demo 你├──────────────┐
  406. │ │
  407. │ {CM.Glyphs.CheckStateUnChecked} Check this out 你 │
  408. │ │
  409. └────────────────────────────┘
  410. ";
  411. Rectangle pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  412. Assert.Equal (new (0, 0, 30, 5), pos);
  413. checkBox.CheckedState = CheckState.Checked;
  414. Application.Refresh ();
  415. expected = @$"
  416. ┌┤Test Demo 你├──────────────┐
  417. │ │
  418. │ {CM.Glyphs.CheckStateChecked} Check this out 你 │
  419. │ │
  420. └────────────────────────────┘
  421. ";
  422. pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  423. Assert.Equal (new (0, 0, 30, 5), pos);
  424. top.Dispose ();
  425. }
  426. [Fact]
  427. [AutoInitShutdown]
  428. public void TextAlignment_Right ()
  429. {
  430. var checkBox = new CheckBox
  431. {
  432. X = 1,
  433. Y = Pos.Center (),
  434. Text = "Check this out 你",
  435. TextAlignment = Alignment.End,
  436. Width = 25
  437. };
  438. var win = new Window { Width = Dim.Fill (), Height = Dim.Fill (), Title = "Test Demo 你" };
  439. win.Add (checkBox);
  440. var top = new Toplevel ();
  441. top.Add (win);
  442. Application.Begin (top);
  443. ((FakeDriver)Application.Driver!).SetBufferSize (30, 5);
  444. Assert.Equal (Alignment.End, checkBox.TextAlignment);
  445. Assert.Equal (new (1, 1, 25, 1), checkBox.Frame);
  446. Assert.Equal (_size25x1, checkBox.TextFormatter.ConstrainToSize);
  447. var expected = @$"
  448. ┌┤Test Demo 你├──────────────┐
  449. │ │
  450. │ Check this out 你 {CM.Glyphs.CheckStateUnChecked} │
  451. │ │
  452. └────────────────────────────┘
  453. ";
  454. Rectangle pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  455. Assert.Equal (new (0, 0, 30, 5), pos);
  456. checkBox.CheckedState = CheckState.Checked;
  457. Application.Refresh ();
  458. expected = @$"
  459. ┌┤Test Demo 你├──────────────┐
  460. │ │
  461. │ Check this out 你 {CM.Glyphs.CheckStateChecked} │
  462. │ │
  463. └────────────────────────────┘
  464. ";
  465. pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  466. Assert.Equal (new (0, 0, 30, 5), pos);
  467. top.Dispose ();
  468. }
  469. [Fact]
  470. public void HotKey_Command_Does_Not_Fire_Accept ()
  471. {
  472. var cb = new CheckBox ();
  473. var accepted = false;
  474. cb.Accept += CheckBoxOnAccept;
  475. cb.InvokeCommand (Command.HotKey);
  476. Assert.False (accepted);
  477. return;
  478. void CheckBoxOnAccept (object sender, HandledEventArgs e) { accepted = true; }
  479. }
  480. [Theory]
  481. [InlineData (CheckState.Checked)]
  482. [InlineData (CheckState.UnChecked)]
  483. [InlineData (CheckState.None)]
  484. public void Select_Handle_Event_Does_Not_Prevent_Change (CheckState initialState)
  485. {
  486. var ckb = new CheckBox { AllowCheckStateNone = true };
  487. var checkedInvoked = false;
  488. ckb.CheckedState = initialState;
  489. ckb.Select += OnSelect;
  490. Assert.Equal (initialState, ckb.CheckedState);
  491. bool? ret = ckb.InvokeCommand (Command.Select);
  492. Assert.False (ret);
  493. Assert.True (checkedInvoked);
  494. Assert.NotEqual (initialState, ckb.CheckedState);
  495. return;
  496. void OnSelect (object sender, HandledEventArgs e)
  497. {
  498. checkedInvoked = true;
  499. e.Handled = true;
  500. }
  501. }
  502. [Theory]
  503. [InlineData (CheckState.Checked)]
  504. [InlineData (CheckState.UnChecked)]
  505. [InlineData (CheckState.None)]
  506. public void CheckedStateChanging_Cancel_Event_Prevents_Change (CheckState initialState)
  507. {
  508. var ckb = new CheckBox { AllowCheckStateNone = true };
  509. var checkedInvoked = false;
  510. ckb.CheckedState = initialState;
  511. ckb.CheckedStateChanging += OnCheckedStateChanging;
  512. Assert.Equal (initialState, ckb.CheckedState);
  513. // AdvanceCheckState returns false if the state was changed, true if it was cancelled, null if it was not changed
  514. bool? ret = ckb.AdvanceCheckState ();
  515. Assert.True (ret);
  516. Assert.True (checkedInvoked);
  517. Assert.Equal (initialState, ckb.CheckedState);
  518. return;
  519. void OnCheckedStateChanging (object sender, CancelEventArgs e)
  520. {
  521. checkedInvoked = true;
  522. e.Cancel = true;
  523. }
  524. }
  525. }