ComboBoxTests.cs 29 KB

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