CheckBoxTests.cs 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614
  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.Selecting += (s, e) => selectCount++;
  158. int acceptCount = 0;
  159. ckb.Accepting += (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.Accepting += ViewOnAccept;
  196. bool? ret = ckb.InvokeCommand (Command.Accept);
  197. Assert.True (ret);
  198. Assert.True (acceptInvoked);
  199. return;
  200. void ViewOnAccept (object sender, CommandEventArgs e)
  201. {
  202. acceptInvoked = true;
  203. e.Cancel = 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.Selecting += (s, e) => selectCount++;
  217. int acceptCount = 0;
  218. checkBox.Accepting += (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.Selecting += (s, e) => selectCount++;
  252. int acceptCount = 0;
  253. checkBox.Accepting += (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. Assert.True (checkBox.NewMouseEvent (new () { Position = new (0, 0), Flags = MouseFlags.Button1DoubleClicked }));
  261. }
  262. #endregion Mouse Tests
  263. [Fact]
  264. [AutoInitShutdown]
  265. public void TextAlignment_Centered ()
  266. {
  267. var checkBox = new CheckBox
  268. {
  269. X = 1,
  270. Y = Pos.Center (),
  271. Text = "Check this out 你",
  272. TextAlignment = Alignment.Center,
  273. Width = 25
  274. };
  275. var win = new Window { Width = Dim.Fill (), Height = Dim.Fill (), Title = "Test Demo 你" };
  276. win.Add (checkBox);
  277. var top = new Toplevel ();
  278. top.Add (win);
  279. Application.Begin (top);
  280. ((FakeDriver)Application.Driver!).SetBufferSize (30, 5);
  281. Assert.Equal (Alignment.Center, checkBox.TextAlignment);
  282. Assert.Equal (new (1, 1, 25, 1), checkBox.Frame);
  283. Assert.Equal (_size25x1, checkBox.TextFormatter.ConstrainToSize);
  284. var expected = @$"
  285. ┌┤Test Demo 你├──────────────┐
  286. │ │
  287. │ {CM.Glyphs.CheckStateUnChecked} Check this out 你 │
  288. │ │
  289. └────────────────────────────┘
  290. ";
  291. Rectangle pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  292. Assert.Equal (new (0, 0, 30, 5), pos);
  293. checkBox.CheckedState = CheckState.Checked;
  294. Application.Refresh ();
  295. expected = @$"
  296. ┌┤Test Demo 你├──────────────┐
  297. │ │
  298. │ {CM.Glyphs.CheckStateChecked} Check this out 你 │
  299. │ │
  300. └────────────────────────────┘
  301. ";
  302. pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  303. Assert.Equal (new (0, 0, 30, 5), pos);
  304. top.Dispose ();
  305. }
  306. [Fact]
  307. [AutoInitShutdown]
  308. public void TextAlignment_Justified ()
  309. {
  310. var checkBox1 = new CheckBox
  311. {
  312. X = 1,
  313. Y = Pos.Center (),
  314. Text = "Check first out 你",
  315. TextAlignment = Alignment.Fill,
  316. Width = 25
  317. };
  318. var checkBox2 = new CheckBox
  319. {
  320. X = 1,
  321. Y = Pos.Bottom (checkBox1),
  322. Text = "Check second out 你",
  323. TextAlignment = Alignment.Fill,
  324. Width = 25
  325. };
  326. var win = new Window { Width = Dim.Fill (), Height = Dim.Fill (), Title = "Test Demo 你" };
  327. win.Add (checkBox1, checkBox2);
  328. var top = new Toplevel ();
  329. top.Add (win);
  330. Application.Begin (top);
  331. ((FakeDriver)Application.Driver!).SetBufferSize (30, 6);
  332. Assert.Equal (Alignment.Fill, checkBox1.TextAlignment);
  333. Assert.Equal (new (1, 1, 25, 1), checkBox1.Frame);
  334. Assert.Equal (Alignment.Fill, checkBox2.TextAlignment);
  335. Assert.Equal (new (1, 2, 25, 1), checkBox2.Frame);
  336. var expected = @$"
  337. ┌┤Test Demo 你├──────────────┐
  338. │ │
  339. │ {CM.Glyphs.CheckStateUnChecked} Check first out 你 │
  340. │ {CM.Glyphs.CheckStateUnChecked} Check second out 你 │
  341. │ │
  342. └────────────────────────────┘
  343. ";
  344. Rectangle pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  345. Assert.Equal (new (0, 0, 30, 6), pos);
  346. checkBox1.CheckedState = CheckState.Checked;
  347. Assert.Equal (new (1, 1, 25, 1), checkBox1.Frame);
  348. Assert.Equal (_size25x1, checkBox1.TextFormatter.ConstrainToSize);
  349. checkBox2.CheckedState = CheckState.Checked;
  350. Assert.Equal (new (1, 2, 25, 1), checkBox2.Frame);
  351. Assert.Equal (_size25x1, checkBox2.TextFormatter.ConstrainToSize);
  352. Application.Refresh ();
  353. expected = @$"
  354. ┌┤Test Demo 你├──────────────┐
  355. │ │
  356. │ {CM.Glyphs.CheckStateChecked} Check first out 你 │
  357. │ {CM.Glyphs.CheckStateChecked} Check second out 你 │
  358. │ │
  359. └────────────────────────────┘
  360. ";
  361. pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  362. Assert.Equal (new (0, 0, 30, 6), pos);
  363. top.Dispose ();
  364. }
  365. [Fact]
  366. [AutoInitShutdown]
  367. public void TextAlignment_Left ()
  368. {
  369. var checkBox = new CheckBox
  370. {
  371. X = 1,
  372. Y = Pos.Center (),
  373. Text = "Check this out 你",
  374. Width = 25
  375. };
  376. var win = new Window { Width = Dim.Fill (), Height = Dim.Fill (), Title = "Test Demo 你" };
  377. win.Add (checkBox);
  378. var top = new Toplevel ();
  379. top.Add (win);
  380. Application.Begin (top);
  381. ((FakeDriver)Application.Driver!).SetBufferSize (30, 5);
  382. Assert.Equal (Alignment.Start, checkBox.TextAlignment);
  383. Assert.Equal (new (1, 1, 25, 1), checkBox.Frame);
  384. Assert.Equal (_size25x1, checkBox.TextFormatter.ConstrainToSize);
  385. var expected = @$"
  386. ┌┤Test Demo 你├──────────────┐
  387. │ │
  388. │ {CM.Glyphs.CheckStateUnChecked} Check this out 你 │
  389. │ │
  390. └────────────────────────────┘
  391. ";
  392. Rectangle pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  393. Assert.Equal (new (0, 0, 30, 5), pos);
  394. checkBox.CheckedState = CheckState.Checked;
  395. Application.Refresh ();
  396. expected = @$"
  397. ┌┤Test Demo 你├──────────────┐
  398. │ │
  399. │ {CM.Glyphs.CheckStateChecked} Check this out 你 │
  400. │ │
  401. └────────────────────────────┘
  402. ";
  403. pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  404. Assert.Equal (new (0, 0, 30, 5), pos);
  405. top.Dispose ();
  406. }
  407. [Fact]
  408. [AutoInitShutdown]
  409. public void TextAlignment_Right ()
  410. {
  411. var checkBox = new CheckBox
  412. {
  413. X = 1,
  414. Y = Pos.Center (),
  415. Text = "Check this out 你",
  416. TextAlignment = Alignment.End,
  417. Width = 25
  418. };
  419. var win = new Window { Width = Dim.Fill (), Height = Dim.Fill (), Title = "Test Demo 你" };
  420. win.Add (checkBox);
  421. var top = new Toplevel ();
  422. top.Add (win);
  423. Application.Begin (top);
  424. ((FakeDriver)Application.Driver!).SetBufferSize (30, 5);
  425. Assert.Equal (Alignment.End, checkBox.TextAlignment);
  426. Assert.Equal (new (1, 1, 25, 1), checkBox.Frame);
  427. Assert.Equal (_size25x1, checkBox.TextFormatter.ConstrainToSize);
  428. var expected = @$"
  429. ┌┤Test Demo 你├──────────────┐
  430. │ │
  431. │ Check this out 你 {CM.Glyphs.CheckStateUnChecked} │
  432. │ │
  433. └────────────────────────────┘
  434. ";
  435. Rectangle pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  436. Assert.Equal (new (0, 0, 30, 5), pos);
  437. checkBox.CheckedState = CheckState.Checked;
  438. Application.Refresh ();
  439. expected = @$"
  440. ┌┤Test Demo 你├──────────────┐
  441. │ │
  442. │ Check this out 你 {CM.Glyphs.CheckStateChecked} │
  443. │ │
  444. └────────────────────────────┘
  445. ";
  446. pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  447. Assert.Equal (new (0, 0, 30, 5), pos);
  448. top.Dispose ();
  449. }
  450. [Fact]
  451. public void HotKey_Command_Does_Not_Fire_Accept ()
  452. {
  453. var cb = new CheckBox ();
  454. var accepted = false;
  455. cb.Accepting += CheckBoxOnAccept;
  456. cb.InvokeCommand (Command.HotKey);
  457. Assert.False (accepted);
  458. return;
  459. void CheckBoxOnAccept (object sender, CommandEventArgs e) { accepted = true; }
  460. }
  461. [Theory]
  462. [InlineData (CheckState.Checked)]
  463. [InlineData (CheckState.UnChecked)]
  464. [InlineData (CheckState.None)]
  465. public void Selected_Handle_Event_Does_Not_Prevent_Change (CheckState initialState)
  466. {
  467. var ckb = new CheckBox { AllowCheckStateNone = true };
  468. var checkedInvoked = false;
  469. ckb.CheckedState = initialState;
  470. ckb.Selecting += OnSelecting;
  471. Assert.Equal (initialState, ckb.CheckedState);
  472. bool? ret = ckb.InvokeCommand (Command.Select);
  473. Assert.True (ret);
  474. Assert.True (checkedInvoked);
  475. Assert.NotEqual (initialState, ckb.CheckedState);
  476. return;
  477. void OnSelecting (object sender, CommandEventArgs e)
  478. {
  479. checkedInvoked = true;
  480. e.Cancel = true;
  481. }
  482. }
  483. [Theory]
  484. [InlineData (CheckState.Checked)]
  485. [InlineData (CheckState.UnChecked)]
  486. [InlineData (CheckState.None)]
  487. public void CheckedStateChanging_Cancel_Event_Prevents_Change (CheckState initialState)
  488. {
  489. var ckb = new CheckBox { AllowCheckStateNone = true };
  490. var checkedInvoked = false;
  491. ckb.CheckedState = initialState;
  492. ckb.CheckedStateChanging += OnCheckedStateChanging;
  493. Assert.Equal (initialState, ckb.CheckedState);
  494. // AdvanceCheckState returns false if the state was changed, true if it was cancelled, null if it was not changed
  495. bool? ret = ckb.AdvanceCheckState ();
  496. Assert.True (ret);
  497. Assert.True (checkedInvoked);
  498. Assert.Equal (initialState, ckb.CheckedState);
  499. return;
  500. void OnCheckedStateChanging (object sender, CancelEventArgs e)
  501. {
  502. checkedInvoked = true;
  503. e.Cancel = true;
  504. }
  505. }
  506. }