ComboBoxTests.cs 36 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006
  1. using Xunit.Abstractions;
  2. namespace Terminal.Gui.ViewsTests;
  3. public class ComboBoxTests
  4. {
  5. private readonly ITestOutputHelper _output;
  6. public ComboBoxTests (ITestOutputHelper output) { _output = output; }
  7. [Fact]
  8. [AutoInitShutdown]
  9. public void Constructor_With_Source_Initialize_With_The_Passed_SelectedItem ()
  10. {
  11. var cb = new ComboBox
  12. {
  13. Source = new ListWrapper (new List<string> { "One", "Two", "Three" }), SelectedItem = 1
  14. };
  15. cb.BeginInit ();
  16. cb.EndInit ();
  17. cb.LayoutSubviews ();
  18. Assert.Equal ("Two", cb.Text);
  19. Assert.NotNull (cb.Source);
  20. Assert.Equal (new Rectangle (0, 0, 0, 2), cb.Frame);
  21. Assert.Equal (1, cb.SelectedItem);
  22. }
  23. [Fact]
  24. [AutoInitShutdown]
  25. public void Constructors_Defaults ()
  26. {
  27. var cb = new ComboBox ();
  28. cb.BeginInit ();
  29. cb.EndInit ();
  30. cb.LayoutSubviews ();
  31. Assert.Equal (string.Empty, cb.Text);
  32. Assert.Null (cb.Source);
  33. Assert.Equal (new Rectangle (0, 0, 0, 2), cb.Frame);
  34. Assert.Equal (-1, cb.SelectedItem);
  35. cb = new ComboBox { Text = "Test" };
  36. cb.BeginInit ();
  37. cb.EndInit ();
  38. cb.LayoutSubviews ();
  39. Assert.Equal ("Test", cb.Text);
  40. Assert.Null (cb.Source);
  41. Assert.Equal (new Rectangle (0, 0, 0, 2), cb.Frame);
  42. Assert.Equal (-1, cb.SelectedItem);
  43. cb = new ComboBox
  44. {
  45. X = 1,
  46. Y = 2,
  47. Width = 10,
  48. Height = 20,
  49. Source = new ListWrapper (new List<string> { "One", "Two", "Three" })
  50. };
  51. cb.BeginInit ();
  52. cb.EndInit ();
  53. cb.LayoutSubviews ();
  54. Assert.Equal (string.Empty, cb.Text);
  55. Assert.NotNull (cb.Source);
  56. Assert.Equal (new Rectangle (1, 2, 10, 20), cb.Frame);
  57. Assert.Equal (-1, cb.SelectedItem);
  58. cb = new ComboBox { Source = new ListWrapper (new List<string> { "One", "Two", "Three" }) };
  59. cb.BeginInit ();
  60. cb.EndInit ();
  61. cb.LayoutSubviews ();
  62. Assert.Equal (string.Empty, cb.Text);
  63. Assert.NotNull (cb.Source);
  64. Assert.Equal (new Rectangle (0, 0, 0, 2), cb.Frame);
  65. Assert.Equal (-1, cb.SelectedItem);
  66. }
  67. [Fact]
  68. [AutoInitShutdown]
  69. public void EnsureKeyEventsDoNotCauseExceptions ()
  70. {
  71. var comboBox = new ComboBox { Text = "0" };
  72. string [] source = Enumerable.Range (0, 15).Select (x => x.ToString ()).ToArray ();
  73. comboBox.SetSource (source);
  74. var top = new Toplevel ();
  75. top.Add (comboBox);
  76. foreach (KeyCode key in (KeyCode [])Enum.GetValues (typeof (KeyCode)))
  77. {
  78. Assert.Null (Record.Exception (() => comboBox.NewKeyDownEvent (new Key (key))));
  79. }
  80. }
  81. [Fact]
  82. [AutoInitShutdown]
  83. public void Expanded_Collapsed_Events ()
  84. {
  85. var cb = new ComboBox { Height = 4, Width = 5 };
  86. List<string> list = new () { "One", "Two", "Three" };
  87. cb.Expanded += (s, e) => cb.SetSource (list);
  88. cb.Collapsed += (s, e) => cb.Source = null;
  89. var top = new Toplevel ();
  90. top.Add (cb);
  91. Application.Begin (top);
  92. Assert.Null (cb.Source);
  93. Assert.False (cb.IsShow);
  94. Assert.Equal (-1, cb.SelectedItem);
  95. Assert.Equal ("", cb.Text);
  96. Assert.True (cb.NewKeyDownEvent (Key.F4));
  97. Assert.NotNull (cb.Source);
  98. Assert.True (cb.IsShow);
  99. Assert.Equal (-1, cb.SelectedItem);
  100. Assert.Equal ("", cb.Text);
  101. Assert.True (cb.NewKeyDownEvent (Key.F4));
  102. Assert.Null (cb.Source);
  103. Assert.False (cb.IsShow);
  104. Assert.Equal (-1, cb.SelectedItem);
  105. Assert.Equal ("", cb.Text);
  106. }
  107. [Fact]
  108. [AutoInitShutdown]
  109. public void HideDropdownListOnClick_False_OpenSelectedItem_With_Mouse_And_Key_CursorDown_And_Esc ()
  110. {
  111. var selected = "";
  112. var cb = new ComboBox { Height = 4, Width = 5, HideDropdownListOnClick = false };
  113. cb.SetSource (new List<string> { "One", "Two", "Three" });
  114. cb.OpenSelectedItem += (s, e) => selected = e.Value.ToString ();
  115. var top = new Toplevel ();
  116. top.Add (cb);
  117. Application.Begin (top);
  118. Assert.False (cb.HideDropdownListOnClick);
  119. Assert.False (cb.ReadOnly);
  120. Assert.False (cb.IsShow);
  121. Assert.Equal (-1, cb.SelectedItem);
  122. Assert.Equal ("", cb.Text);
  123. Assert.True (cb.NewMouseEvent (new MouseEvent { Position = new (cb.Viewport.Right - 1, 0), Flags = MouseFlags.Button1Pressed }));
  124. Assert.Equal ("", selected);
  125. Assert.True (cb.IsShow);
  126. Assert.Equal (0, cb.SelectedItem);
  127. Assert.Equal ("One", cb.Text);
  128. Assert.True (cb.Subviews [1].NewKeyDownEvent (Key.CursorDown));
  129. Assert.Equal ("", selected);
  130. Assert.True (cb.IsShow);
  131. Assert.Equal (1, cb.SelectedItem);
  132. Assert.Equal ("Two", cb.Text);
  133. Assert.True (cb.Subviews [1].NewKeyDownEvent (Key.Enter));
  134. Assert.Equal ("Two", selected);
  135. Assert.False (cb.IsShow);
  136. Assert.Equal (1, cb.SelectedItem);
  137. Assert.Equal ("Two", cb.Text);
  138. Assert.True (cb.NewKeyDownEvent (Key.F4));
  139. Assert.Equal ("Two", selected);
  140. Assert.True (cb.IsShow);
  141. Assert.Equal (1, cb.SelectedItem);
  142. Assert.Equal ("Two", cb.Text);
  143. Assert.True (cb.Subviews [1].NewKeyDownEvent (Key.CursorDown));
  144. Assert.Equal ("Two", selected);
  145. Assert.True (cb.IsShow);
  146. Assert.Equal (2, cb.SelectedItem);
  147. Assert.Equal ("Three", cb.Text);
  148. Assert.True (cb.NewKeyDownEvent (Key.Esc));
  149. Assert.Equal ("Two", selected);
  150. Assert.False (cb.IsShow);
  151. Assert.Equal (1, cb.SelectedItem);
  152. Assert.Equal ("", cb.Text);
  153. }
  154. [Fact]
  155. [AutoInitShutdown]
  156. public void HideDropdownListOnClick_False_OpenSelectedItem_With_Mouse_And_Key_F4 ()
  157. {
  158. var selected = "";
  159. var cb = new ComboBox { Height = 4, Width = 5, HideDropdownListOnClick = false };
  160. cb.SetSource (new List<string> { "One", "Two", "Three" });
  161. cb.OpenSelectedItem += (s, e) => selected = e.Value.ToString ();
  162. var top = new Toplevel ();
  163. top.Add (cb);
  164. Application.Begin (top);
  165. Assert.False (cb.HideDropdownListOnClick);
  166. Assert.False (cb.IsShow);
  167. Assert.Equal (-1, cb.SelectedItem);
  168. Assert.Equal ("", cb.Text);
  169. Assert.True (
  170. cb.NewMouseEvent (
  171. new MouseEvent { Position = new (cb.Viewport.Right - 1, 0), Flags = MouseFlags.Button1Pressed }
  172. )
  173. );
  174. Assert.Equal ("", selected);
  175. Assert.True (cb.IsShow);
  176. Assert.Equal (0, cb.SelectedItem);
  177. Assert.Equal ("One", cb.Text);
  178. Assert.True (cb.Subviews [1].NewKeyDownEvent (Key.CursorDown));
  179. Assert.True (cb.NewKeyDownEvent (Key.F4));
  180. Assert.Equal ("Two", selected);
  181. Assert.False (cb.IsShow);
  182. Assert.Equal (1, cb.SelectedItem);
  183. Assert.Equal ("Two", cb.Text);
  184. }
  185. [Fact]
  186. [AutoInitShutdown]
  187. public void
  188. HideDropdownListOnClick_False_ReadOnly_True_OpenSelectedItem_With_Mouse_And_Key_CursorDown_And_Esc ()
  189. {
  190. var selected = "";
  191. var cb = new ComboBox { Height = 4, Width = 5, HideDropdownListOnClick = false, ReadOnly = true };
  192. cb.SetSource (new List<string> { "One", "Two", "Three" });
  193. cb.OpenSelectedItem += (s, e) => selected = e.Value.ToString ();
  194. var top = new Toplevel ();
  195. top.Add (cb);
  196. Application.Begin (top);
  197. Assert.False (cb.HideDropdownListOnClick);
  198. Assert.True (cb.ReadOnly);
  199. Assert.False (cb.IsShow);
  200. Assert.Equal (-1, cb.SelectedItem);
  201. Assert.Equal ("", cb.Text);
  202. Assert.True (
  203. cb.NewMouseEvent (
  204. new MouseEvent { Position = new (cb.Viewport.Right - 1, 0), Flags = MouseFlags.Button1Pressed }
  205. )
  206. );
  207. Assert.Equal ("", selected);
  208. Assert.True (cb.IsShow);
  209. Assert.Equal (0, cb.SelectedItem);
  210. Assert.Equal ("One", cb.Text);
  211. Assert.True (cb.Subviews [1].NewKeyDownEvent (Key.CursorDown));
  212. Assert.Equal ("", selected);
  213. Assert.True (cb.IsShow);
  214. Assert.Equal (1, cb.SelectedItem);
  215. Assert.Equal ("Two", cb.Text);
  216. Assert.True (cb.Subviews [1].NewKeyDownEvent (Key.Enter));
  217. Assert.Equal ("Two", selected);
  218. Assert.False (cb.IsShow);
  219. Assert.Equal (1, cb.SelectedItem);
  220. Assert.Equal ("Two", cb.Text);
  221. Assert.True (cb.NewKeyDownEvent (Key.F4));
  222. Assert.Equal ("Two", selected);
  223. Assert.True (cb.IsShow);
  224. Assert.Equal (1, cb.SelectedItem);
  225. Assert.Equal ("Two", cb.Text);
  226. Assert.True (cb.Subviews [1].NewKeyDownEvent (Key.CursorDown));
  227. Assert.Equal ("Two", selected);
  228. Assert.True (cb.IsShow);
  229. Assert.Equal (2, cb.SelectedItem);
  230. Assert.Equal ("Three", cb.Text);
  231. Assert.True (cb.NewKeyDownEvent (Key.Esc));
  232. Assert.Equal ("Two", selected);
  233. Assert.False (cb.IsShow);
  234. Assert.Equal (1, cb.SelectedItem);
  235. Assert.Equal ("Two", cb.Text);
  236. }
  237. [Fact]
  238. [AutoInitShutdown]
  239. public void HideDropdownListOnClick_Gets_Sets ()
  240. {
  241. var selected = "";
  242. var cb = new ComboBox { Height = 4, Width = 5 };
  243. cb.SetSource (new List<string> { "One", "Two", "Three" });
  244. cb.OpenSelectedItem += (s, e) => selected = e.Value.ToString ();
  245. var top = new Toplevel ();
  246. top.Add (cb);
  247. Application.Begin (top);
  248. Assert.False (cb.HideDropdownListOnClick);
  249. Assert.False (cb.IsShow);
  250. Assert.Equal (-1, cb.SelectedItem);
  251. Assert.Equal ("", cb.Text);
  252. Assert.True (
  253. cb.NewMouseEvent (
  254. new MouseEvent { Position = new (cb.Viewport.Right - 1, 0), Flags = MouseFlags.Button1Pressed }
  255. )
  256. );
  257. Assert.Equal ("", selected);
  258. Assert.True (cb.IsShow);
  259. Assert.Equal (0, cb.SelectedItem);
  260. Assert.Equal ("One", cb.Text);
  261. Assert.True (
  262. cb.Subviews [1]
  263. .NewMouseEvent (
  264. new MouseEvent { Position = new (0, 1), Flags = MouseFlags.Button1Clicked }
  265. )
  266. );
  267. Assert.Equal ("", selected);
  268. Assert.True (cb.IsShow);
  269. Assert.Equal (1, cb.SelectedItem);
  270. Assert.Equal ("Two", cb.Text);
  271. Assert.True (
  272. cb.Subviews [1]
  273. .NewMouseEvent (
  274. new MouseEvent { Position = new (0, 1), Flags = MouseFlags.Button1Clicked }
  275. )
  276. );
  277. Assert.Equal ("", selected);
  278. Assert.True (cb.IsShow);
  279. Assert.Equal (1, cb.SelectedItem);
  280. Assert.Equal ("Two", cb.Text);
  281. cb.HideDropdownListOnClick = true;
  282. Assert.True (
  283. cb.Subviews [1]
  284. .NewMouseEvent (
  285. new MouseEvent { Position = new (0, 2), Flags = MouseFlags.Button1Clicked }
  286. )
  287. );
  288. Assert.Equal ("Three", selected);
  289. Assert.False (cb.IsShow);
  290. Assert.Equal (2, cb.SelectedItem);
  291. Assert.Equal ("Three", cb.Text);
  292. Assert.True (
  293. cb.NewMouseEvent (
  294. new MouseEvent { Position = new (cb.Viewport.Right - 1, 0), Flags = MouseFlags.Button1Pressed }
  295. )
  296. );
  297. Assert.True (
  298. cb.Subviews [1]
  299. .NewMouseEvent (
  300. new MouseEvent { Position = new (0, 2), Flags = MouseFlags.Button1Clicked }
  301. )
  302. );
  303. Assert.Equal ("Three", selected);
  304. Assert.False (cb.IsShow);
  305. Assert.Equal (2, cb.SelectedItem);
  306. Assert.Equal ("Three", cb.Text);
  307. Assert.True (
  308. cb.NewMouseEvent (
  309. new MouseEvent { Position = new (cb.Viewport.Right - 1, 0), Flags = MouseFlags.Button1Pressed }
  310. )
  311. );
  312. Assert.Equal ("Three", selected);
  313. Assert.True (cb.IsShow);
  314. Assert.Equal (2, cb.SelectedItem);
  315. Assert.Equal ("Three", cb.Text);
  316. Assert.True (
  317. cb.Subviews [1]
  318. .NewMouseEvent (
  319. new MouseEvent { Position = new (0, 0), Flags = MouseFlags.Button1Clicked }
  320. )
  321. );
  322. Assert.Equal ("One", selected);
  323. Assert.False (cb.IsShow);
  324. Assert.Equal (0, cb.SelectedItem);
  325. Assert.Equal ("One", cb.Text);
  326. }
  327. [Fact]
  328. [AutoInitShutdown]
  329. public void HideDropdownListOnClick_True_Colapse_On_Click_Outside_Frame ()
  330. {
  331. var selected = "";
  332. var cb = new ComboBox { Height = 4, Width = 5, HideDropdownListOnClick = true };
  333. cb.SetSource (new List<string> { "One", "Two", "Three" });
  334. cb.OpenSelectedItem += (s, e) => selected = e.Value.ToString ();
  335. var top = new Toplevel ();
  336. top.Add (cb);
  337. Application.Begin (top);
  338. Assert.True (cb.HideDropdownListOnClick);
  339. Assert.False (cb.IsShow);
  340. Assert.Equal (-1, cb.SelectedItem);
  341. Assert.Equal ("", cb.Text);
  342. Assert.True (
  343. cb.NewMouseEvent (
  344. new MouseEvent { Position = new (cb.Viewport.Right - 1, 0), Flags = MouseFlags.Button1Pressed }
  345. )
  346. );
  347. Assert.True (
  348. cb.Subviews [1]
  349. .NewMouseEvent (
  350. new MouseEvent { Position = new (cb.Viewport.Right - 1, 0), Flags = MouseFlags.Button1Clicked }
  351. )
  352. );
  353. Assert.Equal ("", selected);
  354. Assert.True (cb.IsShow);
  355. Assert.Equal (-1, cb.SelectedItem);
  356. Assert.Equal ("", cb.Text);
  357. Assert.True (
  358. cb.Subviews [1]
  359. .NewMouseEvent (
  360. new MouseEvent { Position = new (-1, 0), Flags = MouseFlags.Button1Clicked }
  361. )
  362. );
  363. Assert.Equal ("", selected);
  364. Assert.False (cb.IsShow);
  365. Assert.Equal (-1, cb.SelectedItem);
  366. Assert.Equal ("", cb.Text);
  367. Assert.True (cb.NewKeyDownEvent (Key.F4));
  368. Assert.True (
  369. cb.Subviews [1]
  370. .NewMouseEvent (
  371. new MouseEvent { Position = new (cb.Viewport.Right - 1, 0), Flags = MouseFlags.Button1Clicked }
  372. )
  373. );
  374. Assert.Equal ("", selected);
  375. Assert.True (cb.IsShow);
  376. Assert.Equal (-1, cb.SelectedItem);
  377. Assert.Equal ("", cb.Text);
  378. Assert.True (
  379. cb.Subviews [1]
  380. .NewMouseEvent (
  381. new MouseEvent { Position = new (0, -1), Flags = MouseFlags.Button1Clicked }
  382. )
  383. );
  384. Assert.Equal ("", selected);
  385. Assert.False (cb.IsShow);
  386. Assert.Equal (-1, cb.SelectedItem);
  387. Assert.Equal ("", cb.Text);
  388. Assert.True (cb.NewKeyDownEvent (Key.F4));
  389. Assert.True (
  390. cb.Subviews [1]
  391. .NewMouseEvent (
  392. new MouseEvent { Position = new (cb.Viewport.Right - 1, 0), Flags = MouseFlags.Button1Clicked }
  393. )
  394. );
  395. Assert.Equal ("", selected);
  396. Assert.True (cb.IsShow);
  397. Assert.Equal (-1, cb.SelectedItem);
  398. Assert.Equal ("", cb.Text);
  399. Assert.True (
  400. cb.Subviews [1]
  401. .NewMouseEvent (
  402. new MouseEvent { Position = new (cb.Frame.Width, 0), Flags = MouseFlags.Button1Clicked }
  403. )
  404. );
  405. Assert.Equal ("", selected);
  406. Assert.False (cb.IsShow);
  407. Assert.Equal (-1, cb.SelectedItem);
  408. Assert.Equal ("", cb.Text);
  409. Assert.True (cb.NewKeyDownEvent (Key.F4));
  410. Assert.True (
  411. cb.Subviews [1]
  412. .NewMouseEvent (
  413. new MouseEvent { Position = new (cb.Viewport.Right - 1, 0), Flags = MouseFlags.Button1Clicked }
  414. )
  415. );
  416. Assert.Equal ("", selected);
  417. Assert.True (cb.IsShow);
  418. Assert.Equal (-1, cb.SelectedItem);
  419. Assert.Equal ("", cb.Text);
  420. Assert.True (
  421. cb.Subviews [1]
  422. .NewMouseEvent (
  423. new MouseEvent { Position = new (0, cb.Frame.Height), Flags = MouseFlags.Button1Clicked }
  424. )
  425. );
  426. Assert.Equal ("", selected);
  427. Assert.False (cb.IsShow);
  428. Assert.Equal (-1, cb.SelectedItem);
  429. Assert.Equal ("", cb.Text);
  430. }
  431. [Fact]
  432. [AutoInitShutdown]
  433. public void HideDropdownListOnClick_True_Highlight_Current_Item ()
  434. {
  435. var selected = "";
  436. var cb = new ComboBox { Width = 6, Height = 4, HideDropdownListOnClick = true };
  437. cb.SetSource (new List<string> { "One", "Two", "Three" });
  438. cb.OpenSelectedItem += (s, e) => selected = e.Value.ToString ();
  439. var top = new Toplevel ();
  440. top.Add (cb);
  441. Application.Begin (top);
  442. Assert.True (cb.HideDropdownListOnClick);
  443. Assert.False (cb.IsShow);
  444. Assert.Equal (-1, cb.SelectedItem);
  445. Assert.Equal ("", cb.Text);
  446. Assert.True (
  447. cb.NewMouseEvent (
  448. new MouseEvent { Position = new (cb.Viewport.Right - 1, 0), Flags = MouseFlags.Button1Pressed }
  449. )
  450. );
  451. Assert.Equal ("", selected);
  452. Assert.True (cb.IsShow);
  453. Assert.Equal (-1, cb.SelectedItem);
  454. Assert.Equal ("", cb.Text);
  455. cb.Draw ();
  456. TestHelpers.AssertDriverContentsWithFrameAre (
  457. @"
  458. One
  459. Two
  460. Three ",
  461. _output
  462. );
  463. Attribute [] attributes =
  464. {
  465. // 0
  466. cb.Subviews [0].ColorScheme.Focus,
  467. // 1
  468. cb.Subviews [1].ColorScheme.HotFocus,
  469. // 2
  470. cb.Subviews [1].GetNormalColor ()
  471. };
  472. TestHelpers.AssertDriverAttributesAre (
  473. @"
  474. 000000
  475. 222222
  476. 222222
  477. 222222",
  478. Application.Driver,
  479. attributes
  480. );
  481. Assert.True (cb.Subviews [1].NewKeyDownEvent (Key.CursorDown));
  482. Assert.Equal ("", selected);
  483. Assert.True (cb.IsShow);
  484. Assert.Equal (-1, cb.SelectedItem);
  485. Assert.Equal ("", cb.Text);
  486. cb.Draw ();
  487. TestHelpers.AssertDriverAttributesAre (
  488. @"
  489. 000000
  490. 222222
  491. 000002
  492. 222222",
  493. Application.Driver,
  494. attributes
  495. );
  496. Assert.True (cb.Subviews [1].NewKeyDownEvent (Key.CursorDown));
  497. Assert.Equal ("", selected);
  498. Assert.True (cb.IsShow);
  499. Assert.Equal (-1, cb.SelectedItem);
  500. Assert.Equal ("", cb.Text);
  501. cb.Draw ();
  502. TestHelpers.AssertDriverAttributesAre (
  503. @"
  504. 000000
  505. 222222
  506. 222222
  507. 000002",
  508. Application.Driver,
  509. attributes
  510. );
  511. Assert.True (cb.Subviews [1].NewKeyDownEvent (Key.Enter));
  512. Assert.Equal ("Three", selected);
  513. Assert.False (cb.IsShow);
  514. Assert.Equal (2, cb.SelectedItem);
  515. Assert.Equal ("Three", cb.Text);
  516. Assert.True (cb.NewKeyDownEvent (Key.F4));
  517. Assert.Equal ("Three", selected);
  518. Assert.True (cb.IsShow);
  519. Assert.Equal (2, cb.SelectedItem);
  520. Assert.Equal ("Three", cb.Text);
  521. cb.Draw ();
  522. TestHelpers.AssertDriverAttributesAre (
  523. @"
  524. 000000
  525. 222222
  526. 222222
  527. 000002",
  528. Application.Driver,
  529. attributes
  530. );
  531. Assert.True (cb.Subviews [1].NewKeyDownEvent (Key.CursorUp));
  532. Assert.Equal ("Three", selected);
  533. Assert.True (cb.IsShow);
  534. Assert.Equal (2, cb.SelectedItem);
  535. Assert.Equal ("Three", cb.Text);
  536. cb.Draw ();
  537. TestHelpers.AssertDriverAttributesAre (
  538. @"
  539. 000000
  540. 222222
  541. 000002
  542. 111112",
  543. Application.Driver,
  544. attributes
  545. );
  546. Assert.True (cb.Subviews [1].NewKeyDownEvent (Key.CursorUp));
  547. Assert.Equal ("Three", selected);
  548. Assert.True (cb.IsShow);
  549. Assert.Equal (2, cb.SelectedItem);
  550. Assert.Equal ("Three", cb.Text);
  551. cb.Draw ();
  552. TestHelpers.AssertDriverAttributesAre (
  553. @"
  554. 000000
  555. 000002
  556. 222222
  557. 111112",
  558. Application.Driver,
  559. attributes
  560. );
  561. Assert.True (cb.NewKeyDownEvent (Key.F4));
  562. Assert.Equal ("Three", selected);
  563. Assert.False (cb.IsShow);
  564. Assert.Equal (2, cb.SelectedItem);
  565. Assert.Equal ("Three", cb.Text);
  566. }
  567. [Fact]
  568. [AutoInitShutdown]
  569. public void HideDropdownListOnClick_True_OpenSelectedItem_With_Mouse_And_Key_And_Mouse ()
  570. {
  571. var selected = "";
  572. var cb = new ComboBox { Height = 4, Width = 5, HideDropdownListOnClick = true };
  573. cb.SetSource (new List<string> { "One", "Two", "Three" });
  574. cb.OpenSelectedItem += (s, e) => selected = e.Value.ToString ();
  575. var top = new Toplevel ();
  576. top.Add (cb);
  577. Application.Begin (top);
  578. Assert.True (cb.HideDropdownListOnClick);
  579. Assert.False (cb.IsShow);
  580. Assert.Equal (-1, cb.SelectedItem);
  581. Assert.Equal ("", cb.Text);
  582. Assert.True (
  583. cb.NewMouseEvent (
  584. new MouseEvent { Position = new (cb.Viewport.Right - 1, 0), Flags = MouseFlags.Button1Pressed }
  585. )
  586. );
  587. Assert.Equal ("", selected);
  588. Assert.True (cb.IsShow);
  589. Assert.Equal (-1, cb.SelectedItem);
  590. Assert.Equal ("", cb.Text);
  591. Assert.True (cb.Subviews [1].NewKeyDownEvent (Key.CursorDown));
  592. Assert.True (
  593. cb.NewMouseEvent (
  594. new MouseEvent { Position = new (cb.Viewport.Right - 1, 0), Flags = MouseFlags.Button1Pressed }
  595. )
  596. );
  597. Assert.Equal ("", selected);
  598. Assert.False (cb.IsShow);
  599. Assert.Equal (-1, cb.SelectedItem);
  600. Assert.Equal ("", cb.Text);
  601. Assert.True (
  602. cb.NewMouseEvent (
  603. new MouseEvent { Position = new (cb.Viewport.Right - 1, 0), Flags = MouseFlags.Button1Pressed }
  604. )
  605. );
  606. Assert.Equal ("", selected);
  607. Assert.True (cb.IsShow);
  608. Assert.Equal (-1, cb.SelectedItem);
  609. Assert.Equal ("", cb.Text);
  610. Assert.True (cb.Subviews [1].NewKeyDownEvent (Key.CursorUp));
  611. Assert.True (
  612. cb.NewMouseEvent (
  613. new MouseEvent { Position = new (cb.Viewport.Right - 1, 0), Flags = MouseFlags.Button1Pressed }
  614. )
  615. );
  616. Assert.Equal ("", selected);
  617. Assert.False (cb.IsShow);
  618. Assert.Equal (-1, cb.SelectedItem);
  619. Assert.Equal ("", cb.Text);
  620. }
  621. [Fact]
  622. [AutoInitShutdown]
  623. public void HideDropdownListOnClick_True_OpenSelectedItem_With_Mouse_And_Key_CursorDown_And_Esc ()
  624. {
  625. var selected = "";
  626. var cb = new ComboBox { Height = 4, Width = 5, HideDropdownListOnClick = true };
  627. cb.SetSource (new List<string> { "One", "Two", "Three" });
  628. cb.OpenSelectedItem += (s, e) => selected = e.Value.ToString ();
  629. var top = new Toplevel ();
  630. top.Add (cb);
  631. Application.Begin (top);
  632. Assert.True (cb.HideDropdownListOnClick);
  633. Assert.False (cb.IsShow);
  634. Assert.Equal (-1, cb.SelectedItem);
  635. Assert.Equal ("", cb.Text);
  636. Assert.True (
  637. cb.NewMouseEvent (
  638. new MouseEvent { Position = new (cb.Viewport.Right - 1, 0), Flags = MouseFlags.Button1Pressed }
  639. )
  640. );
  641. Assert.Equal ("", selected);
  642. Assert.True (cb.IsShow);
  643. Assert.Equal (-1, cb.SelectedItem);
  644. Assert.Equal ("", cb.Text);
  645. Assert.True (cb.Subviews [1].NewKeyDownEvent (Key.CursorDown));
  646. Assert.Equal ("", selected);
  647. Assert.True (cb.IsShow);
  648. Assert.Equal (-1, cb.SelectedItem);
  649. Assert.Equal ("", cb.Text);
  650. Assert.True (cb.Subviews [1].NewKeyDownEvent (Key.Enter));
  651. Assert.Equal ("Two", selected);
  652. Assert.False (cb.IsShow);
  653. Assert.Equal (1, cb.SelectedItem);
  654. Assert.Equal ("Two", cb.Text);
  655. Assert.True (cb.NewKeyDownEvent (Key.F4));
  656. Assert.Equal ("Two", selected);
  657. Assert.True (cb.IsShow);
  658. Assert.Equal (1, cb.SelectedItem);
  659. Assert.Equal ("Two", cb.Text);
  660. Assert.True (cb.Subviews [1].NewKeyDownEvent (Key.CursorDown));
  661. Assert.Equal ("Two", selected);
  662. Assert.True (cb.IsShow);
  663. Assert.Equal (1, cb.SelectedItem);
  664. Assert.Equal ("Two", cb.Text);
  665. Assert.True (cb.NewKeyDownEvent (Key.Esc));
  666. Assert.Equal ("Two", selected);
  667. Assert.False (cb.IsShow);
  668. Assert.Equal (1, cb.SelectedItem);
  669. Assert.Equal ("Two", cb.Text);
  670. }
  671. [Fact]
  672. [AutoInitShutdown]
  673. public void HideDropdownListOnClick_True_OpenSelectedItem_With_Mouse_And_Key_F4 ()
  674. {
  675. var selected = "";
  676. var cb = new ComboBox { Height = 4, Width = 5, HideDropdownListOnClick = true };
  677. cb.SetSource (new List<string> { "One", "Two", "Three" });
  678. cb.OpenSelectedItem += (s, e) => selected = e.Value.ToString ();
  679. var top = new Toplevel ();
  680. top.Add (cb);
  681. Application.Begin (top);
  682. Assert.True (cb.HideDropdownListOnClick);
  683. Assert.False (cb.IsShow);
  684. Assert.Equal (-1, cb.SelectedItem);
  685. Assert.Equal ("", cb.Text);
  686. Assert.True (
  687. cb.NewMouseEvent (
  688. new MouseEvent { Position = new (cb.Viewport.Right - 1, 0), Flags = MouseFlags.Button1Pressed }
  689. )
  690. );
  691. Assert.Equal ("", selected);
  692. Assert.True (cb.IsShow);
  693. Assert.Equal (-1, cb.SelectedItem);
  694. Assert.Equal ("", cb.Text);
  695. Assert.True (cb.Subviews [1].NewKeyDownEvent (Key.CursorDown));
  696. Assert.True (cb.NewKeyDownEvent (Key.F4));
  697. Assert.Equal ("", selected);
  698. Assert.False (cb.IsShow);
  699. Assert.Equal (-1, cb.SelectedItem);
  700. Assert.Equal ("", cb.Text);
  701. }
  702. [Fact]
  703. [AutoInitShutdown]
  704. public void KeyBindings_Command ()
  705. {
  706. List<string> source = new () { "One", "Two", "Three" };
  707. var cb = new ComboBox { Width = 10 };
  708. cb.SetSource (source);
  709. var top = new Toplevel ();
  710. top.Add (cb);
  711. top.FocusFirst ();
  712. Assert.Equal (-1, cb.SelectedItem);
  713. Assert.Equal (string.Empty, cb.Text);
  714. var opened = false;
  715. cb.OpenSelectedItem += (s, _) => opened = true;
  716. Assert.True (cb.NewKeyDownEvent (Key.Enter));
  717. Assert.False (opened);
  718. cb.Text = "Tw";
  719. Assert.True (cb.NewKeyDownEvent (Key.Enter));
  720. Assert.True (opened);
  721. Assert.Equal ("Tw", cb.Text);
  722. Assert.False (cb.IsShow);
  723. cb.SetSource (null);
  724. Assert.False (cb.NewKeyDownEvent (Key.Enter));
  725. Assert.True (cb.NewKeyDownEvent (Key.F4)); // with no source also expand empty
  726. Assert.True (cb.IsShow);
  727. Assert.Equal (-1, cb.SelectedItem);
  728. cb.SetSource (source);
  729. cb.Text = "";
  730. Assert.True (cb.NewKeyDownEvent (Key.F4)); // collapse
  731. Assert.False (cb.IsShow);
  732. Assert.True (cb.NewKeyDownEvent (Key.F4)); // expand
  733. Assert.True (cb.IsShow);
  734. cb.Collapse ();
  735. Assert.False (cb.IsShow);
  736. Assert.True (cb.HasFocus);
  737. Assert.True (cb.NewKeyDownEvent (Key.CursorDown)); // losing focus
  738. Assert.False (cb.IsShow);
  739. Assert.False (cb.HasFocus);
  740. top.FocusFirst (); // Gets focus again
  741. Assert.False (cb.IsShow);
  742. Assert.True (cb.HasFocus);
  743. cb.Expand ();
  744. Assert.True (cb.IsShow);
  745. Assert.Equal (0, cb.SelectedItem);
  746. Assert.Equal ("One", cb.Text);
  747. Assert.True (cb.NewKeyDownEvent (Key.CursorDown));
  748. Assert.True (cb.IsShow);
  749. Assert.Equal (1, cb.SelectedItem);
  750. Assert.Equal ("Two", cb.Text);
  751. Assert.True (cb.NewKeyDownEvent (Key.CursorDown));
  752. Assert.True (cb.IsShow);
  753. Assert.Equal (2, cb.SelectedItem);
  754. Assert.Equal ("Three", cb.Text);
  755. Assert.True (cb.NewKeyDownEvent (Key.CursorDown));
  756. Assert.True (cb.IsShow);
  757. Assert.Equal (2, cb.SelectedItem);
  758. Assert.Equal ("Three", cb.Text);
  759. Assert.True (cb.NewKeyDownEvent (Key.CursorUp));
  760. Assert.True (cb.IsShow);
  761. Assert.Equal (1, cb.SelectedItem);
  762. Assert.Equal ("Two", cb.Text);
  763. Assert.True (cb.NewKeyDownEvent (Key.CursorUp));
  764. Assert.True (cb.IsShow);
  765. Assert.Equal (0, cb.SelectedItem);
  766. Assert.Equal ("One", cb.Text);
  767. Assert.True (cb.NewKeyDownEvent (Key.CursorUp));
  768. Assert.True (cb.IsShow);
  769. Assert.Equal (0, cb.SelectedItem);
  770. Assert.Equal ("One", cb.Text);
  771. Application.Begin (top);
  772. TestHelpers.AssertDriverContentsWithFrameAre (
  773. @"
  774. One ▼
  775. One
  776. ",
  777. _output
  778. );
  779. Assert.True (cb.NewKeyDownEvent (Key.PageDown));
  780. Assert.True (cb.IsShow);
  781. Assert.Equal (1, cb.SelectedItem);
  782. Assert.Equal ("Two", cb.Text);
  783. Application.Begin (top);
  784. TestHelpers.AssertDriverContentsWithFrameAre (
  785. @"
  786. Two ▼
  787. Two
  788. ",
  789. _output
  790. );
  791. Assert.True (cb.NewKeyDownEvent (Key.PageDown));
  792. Assert.True (cb.IsShow);
  793. Assert.Equal (2, cb.SelectedItem);
  794. Assert.Equal ("Three", cb.Text);
  795. Application.Begin (top);
  796. TestHelpers.AssertDriverContentsWithFrameAre (
  797. @"
  798. Three ▼
  799. Three
  800. ",
  801. _output
  802. );
  803. Assert.True (cb.NewKeyDownEvent (Key.PageUp));
  804. Assert.True (cb.IsShow);
  805. Assert.Equal (1, cb.SelectedItem);
  806. Assert.Equal ("Two", cb.Text);
  807. Assert.True (cb.NewKeyDownEvent (Key.PageUp));
  808. Assert.True (cb.IsShow);
  809. Assert.Equal (0, cb.SelectedItem);
  810. Assert.Equal ("One", cb.Text);
  811. Assert.True (cb.NewKeyDownEvent (Key.F4));
  812. Assert.False (cb.IsShow);
  813. Assert.Equal (0, cb.SelectedItem);
  814. Assert.Equal ("One", cb.Text);
  815. Assert.True (cb.NewKeyDownEvent (Key.End));
  816. Assert.False (cb.IsShow);
  817. Assert.Equal (0, cb.SelectedItem);
  818. Assert.Equal ("One", cb.Text);
  819. Assert.True (cb.NewKeyDownEvent (Key.Home));
  820. Assert.False (cb.IsShow);
  821. Assert.Equal (0, cb.SelectedItem);
  822. Assert.Equal ("One", cb.Text);
  823. Assert.True (cb.NewKeyDownEvent (Key.F4));
  824. Assert.True (cb.IsShow);
  825. Assert.Equal (0, cb.SelectedItem);
  826. Assert.Equal ("One", cb.Text);
  827. Assert.True (cb.NewKeyDownEvent (Key.End));
  828. Assert.True (cb.IsShow);
  829. Assert.Equal (2, cb.SelectedItem);
  830. Assert.Equal ("Three", cb.Text);
  831. Assert.True (cb.NewKeyDownEvent (Key.Home));
  832. Assert.True (cb.IsShow);
  833. Assert.Equal (0, cb.SelectedItem);
  834. Assert.Equal ("One", cb.Text);
  835. Assert.True (cb.NewKeyDownEvent (Key.Esc));
  836. Assert.False (cb.IsShow);
  837. Assert.Equal (0, cb.SelectedItem);
  838. Assert.Equal ("", cb.Text);
  839. Assert.True (cb.NewKeyDownEvent (Key.CursorDown)); // losing focus
  840. Assert.False (cb.HasFocus);
  841. Assert.False (cb.IsShow);
  842. Assert.Equal (-1, cb.SelectedItem);
  843. Assert.Equal ("One", cb.Text);
  844. top.FocusFirst (); // Gets focus again
  845. Assert.True (cb.HasFocus);
  846. Assert.False (cb.IsShow);
  847. Assert.Equal (-1, cb.SelectedItem);
  848. Assert.Equal ("One", cb.Text);
  849. Assert.True (cb.NewKeyDownEvent (Key.U.WithCtrl));
  850. Assert.True (cb.HasFocus);
  851. Assert.True (cb.IsShow);
  852. Assert.Equal (-1, cb.SelectedItem);
  853. Assert.Equal ("", cb.Text);
  854. Assert.Equal (3, cb.Source.Count);
  855. }
  856. [Fact]
  857. [AutoInitShutdown]
  858. public void Source_Equal_Null_Or_Count_Equal_Zero_Sets_SelectedItem_Equal_To_Minus_One ()
  859. {
  860. var cb = new ComboBox ();
  861. var top = new Toplevel ();
  862. top.Add (cb);
  863. top.FocusFirst ();
  864. Assert.Null (cb.Source);
  865. Assert.Equal (-1, cb.SelectedItem);
  866. List<string> source = new ();
  867. cb.SetSource (source);
  868. Assert.NotNull (cb.Source);
  869. Assert.Equal (0, cb.Source.Count);
  870. Assert.Equal (-1, cb.SelectedItem);
  871. source.Add ("One");
  872. Assert.Equal (1, cb.Source.Count);
  873. Assert.Equal (-1, cb.SelectedItem);
  874. Assert.True (cb.NewKeyDownEvent (Key.F4));
  875. Assert.True (cb.IsShow);
  876. Assert.Equal (0, cb.SelectedItem);
  877. Assert.Equal ("One", cb.Text);
  878. source.Add ("Two");
  879. Assert.Equal (0, cb.SelectedItem);
  880. Assert.Equal ("One", cb.Text);
  881. cb.Text = "T";
  882. Assert.True (cb.IsShow);
  883. Assert.Equal (-1, cb.SelectedItem);
  884. Assert.Equal ("T", cb.Text);
  885. Assert.True (cb.NewKeyDownEvent (Key.Enter));
  886. Assert.False (cb.IsShow);
  887. Assert.Equal (2, cb.Source.Count);
  888. Assert.Equal (-1, cb.SelectedItem);
  889. Assert.Equal ("T", cb.Text);
  890. Assert.True (cb.NewKeyDownEvent (Key.Esc));
  891. Assert.False (cb.IsShow);
  892. Assert.Equal (-1, cb.SelectedItem); // retains last accept selected item
  893. Assert.Equal ("", cb.Text); // clear text
  894. cb.SetSource (new List<string> ());
  895. Assert.Equal (0, cb.Source.Count);
  896. Assert.Equal (-1, cb.SelectedItem);
  897. Assert.Equal ("", cb.Text);
  898. }
  899. }