MenuTests.cs 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593
  1. using System;
  2. using System.Collections.Generic;
  3. using Xunit;
  4. using Xunit.Abstractions;
  5. namespace Terminal.Gui.Views {
  6. public class MenuTests {
  7. readonly ITestOutputHelper output;
  8. public MenuTests (ITestOutputHelper output)
  9. {
  10. this.output = output;
  11. }
  12. [Fact]
  13. public void Constuctors_Defaults ()
  14. {
  15. var menu = new Menu (new MenuBar (), 0, 0, new MenuBarItem ());
  16. Assert.Equal (Colors.Menu, menu.ColorScheme);
  17. Assert.True (menu.CanFocus);
  18. Assert.False (menu.WantContinuousButtonPressed);
  19. var menuBar = new MenuBar ();
  20. Assert.Equal (0, menuBar.X);
  21. Assert.Equal (0, menuBar.Y);
  22. Assert.IsType<Dim.DimFill> (menuBar.Width);
  23. Assert.Equal (1, menuBar.Height);
  24. Assert.Empty (menuBar.Menus);
  25. Assert.Equal (Colors.Menu, menuBar.ColorScheme);
  26. Assert.True (menuBar.WantMousePositionReports);
  27. Assert.False (menuBar.IsMenuOpen);
  28. menuBar = new MenuBar (new MenuBarItem [] { });
  29. Assert.Equal (0, menuBar.X);
  30. Assert.Equal (0, menuBar.Y);
  31. Assert.IsType<Dim.DimFill> (menuBar.Width);
  32. Assert.Equal (1, menuBar.Height);
  33. Assert.Empty (menuBar.Menus);
  34. Assert.Equal (Colors.Menu, menuBar.ColorScheme);
  35. Assert.True (menuBar.WantMousePositionReports);
  36. Assert.False (menuBar.IsMenuOpen);
  37. var menuBarItem = new MenuBarItem ();
  38. Assert.Equal ("", menuBarItem.Title);
  39. Assert.Null (menuBarItem.Parent);
  40. Assert.Empty (menuBarItem.Children);
  41. menuBarItem = new MenuBarItem (new MenuBarItem [] { });
  42. Assert.Equal ("", menuBarItem.Title);
  43. Assert.Null (menuBarItem.Parent);
  44. Assert.Empty (menuBarItem.Children);
  45. menuBarItem = new MenuBarItem ("Test", new MenuBarItem [] { });
  46. Assert.Equal ("Test", menuBarItem.Title);
  47. Assert.Null (menuBarItem.Parent);
  48. Assert.Empty (menuBarItem.Children);
  49. menuBarItem = new MenuBarItem ("Test", new List<MenuItem []> ());
  50. Assert.Equal ("Test", menuBarItem.Title);
  51. Assert.Null (menuBarItem.Parent);
  52. Assert.Empty (menuBarItem.Children);
  53. menuBarItem = new MenuBarItem ("Test", "Help", null);
  54. Assert.Equal ("Test", menuBarItem.Title);
  55. Assert.Equal ("Help", menuBarItem.Help);
  56. Assert.Null (menuBarItem.Action);
  57. Assert.Null (menuBarItem.CanExecute);
  58. Assert.Null (menuBarItem.Parent);
  59. Assert.Equal (Key.Null, menuBarItem.Shortcut);
  60. var menuItem = new MenuItem ();
  61. Assert.Equal ("", menuItem.Title);
  62. Assert.Equal ("", menuItem.Help);
  63. Assert.Null (menuItem.Action);
  64. Assert.Null (menuItem.CanExecute);
  65. Assert.Null (menuItem.Parent);
  66. Assert.Equal (Key.Null, menuItem.Shortcut);
  67. menuItem = new MenuItem ("Test", "Help", Run, () => { return true; }, new MenuItem (), Key.F1);
  68. Assert.Equal ("Test", menuItem.Title);
  69. Assert.Equal ("Help", menuItem.Help);
  70. Assert.Equal (Run, menuItem.Action);
  71. Assert.NotNull (menuItem.CanExecute);
  72. Assert.NotNull (menuItem.Parent);
  73. Assert.Equal (Key.F1, menuItem.Shortcut);
  74. void Run () { }
  75. }
  76. [Fact]
  77. public void Exceptions ()
  78. {
  79. Assert.Throws<ArgumentNullException> (() => new MenuBarItem ("Test", (MenuItem [])null, null));
  80. Assert.Throws<ArgumentNullException> (() => new MenuBarItem ("Test", (List<MenuItem []>)null, null));
  81. }
  82. [Fact]
  83. [AutoInitShutdown]
  84. public void MenuOpening_MenuOpened_MenuClosing_Events ()
  85. {
  86. var miAction = "";
  87. var isMenuClosed = true;
  88. var cancelClosing = false;
  89. var menu = new MenuBar (new MenuBarItem [] {
  90. new MenuBarItem ("_File", new MenuItem [] {
  91. new MenuItem ("_New", "Creates new file.", New)
  92. })
  93. });
  94. menu.MenuOpening += (e) => {
  95. Assert.Equal ("_File", e.CurrentMenu.Title);
  96. Assert.Equal ("_New", e.CurrentMenu.Children [0].Title);
  97. Assert.Equal ("Creates new file.", e.CurrentMenu.Children [0].Help);
  98. Assert.Equal (New, e.CurrentMenu.Children [0].Action);
  99. e.CurrentMenu.Children [0].Action ();
  100. Assert.Equal ("New", miAction);
  101. e.NewMenuBarItem = new MenuBarItem ("_Edit", new MenuItem [] {
  102. new MenuItem ("_Copy", "Copies the selection.", Copy)
  103. });
  104. };
  105. menu.MenuOpened += (e) => {
  106. Assert.Equal ("_Edit", e.Parent.Title);
  107. Assert.Equal ("_Copy", e.Title);
  108. Assert.Equal ("Copies the selection.", e.Help);
  109. Assert.Equal (Copy, e.Action);
  110. e.Action ();
  111. Assert.Equal ("Copy", miAction);
  112. };
  113. menu.MenuClosing += (e) => {
  114. Assert.False (isMenuClosed);
  115. if (cancelClosing) {
  116. e.Cancel = true;
  117. isMenuClosed = false;
  118. } else {
  119. isMenuClosed = true;
  120. }
  121. };
  122. Application.Top.Add (menu);
  123. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, new KeyModifiers ())));
  124. Assert.True (menu.IsMenuOpen);
  125. isMenuClosed = !menu.IsMenuOpen;
  126. Assert.False (isMenuClosed);
  127. Application.Top.Redraw (Application.Top.Bounds);
  128. var expected = @"
  129. Edit
  130. ┌─────────────────────────────┐
  131. │ Copy Copies the selection. │
  132. └─────────────────────────────┘
  133. ";
  134. GraphViewTests.AssertDriverContentsAre (expected, output);
  135. cancelClosing = true;
  136. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, new KeyModifiers ())));
  137. Assert.True (menu.IsMenuOpen);
  138. Assert.False (isMenuClosed);
  139. Application.Top.Redraw (Application.Top.Bounds);
  140. expected = @"
  141. Edit
  142. ┌─────────────────────────────┐
  143. │ Copy Copies the selection. │
  144. └─────────────────────────────┘
  145. ";
  146. GraphViewTests.AssertDriverContentsAre (expected, output);
  147. cancelClosing = false;
  148. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, new KeyModifiers ())));
  149. Assert.False (menu.IsMenuOpen);
  150. Assert.True (isMenuClosed);
  151. Application.Top.Redraw (Application.Top.Bounds);
  152. expected = @"
  153. Edit
  154. ";
  155. GraphViewTests.AssertDriverContentsAre (expected, output);
  156. void New () => miAction = "New";
  157. void Copy () => miAction = "Copy";
  158. }
  159. [Fact]
  160. [AutoInitShutdown]
  161. public void MouseEvent_Test ()
  162. {
  163. MenuItem miCurrent = null;
  164. Menu mCurrent = null;
  165. var menu = new MenuBar (new MenuBarItem [] {
  166. new MenuBarItem ("_File", new MenuItem [] {
  167. new MenuItem ("_New", "", null),
  168. new MenuItem ("_Open", "", null),
  169. new MenuItem ("_Save", "", null)
  170. }),
  171. new MenuBarItem ("_Edit", new MenuItem [] {
  172. new MenuItem ("_Copy", "", null),
  173. new MenuItem ("C_ut", "", null),
  174. new MenuItem ("_Paste", "", null)
  175. })
  176. });
  177. menu.MenuOpened += (e) => {
  178. miCurrent = e;
  179. mCurrent = menu.openCurrentMenu;
  180. };
  181. Application.Top.Add (menu);
  182. Assert.True (menu.MouseEvent (new MouseEvent () {
  183. X = 10,
  184. Y = 0,
  185. Flags = MouseFlags.Button1Pressed,
  186. View = menu
  187. }));
  188. Assert.True (menu.IsMenuOpen);
  189. Assert.Equal ("_Edit", miCurrent.Parent.Title);
  190. Assert.Equal ("_Copy", miCurrent.Title);
  191. Assert.True (mCurrent.MouseEvent (new MouseEvent () {
  192. X = 10,
  193. Y = 3,
  194. Flags = MouseFlags.ReportMousePosition,
  195. View = mCurrent
  196. }));
  197. Assert.True (menu.IsMenuOpen);
  198. Assert.Equal ("_Edit", miCurrent.Parent.Title);
  199. Assert.Equal ("_Paste", miCurrent.Title);
  200. for (int i = 2; i >= -1; i--) {
  201. if (i == -1) {
  202. Assert.False (mCurrent.MouseEvent (new MouseEvent () {
  203. X = 10,
  204. Y = i,
  205. Flags = MouseFlags.ReportMousePosition,
  206. View = menu
  207. }));
  208. } else {
  209. Assert.True (mCurrent.MouseEvent (new MouseEvent () {
  210. X = 10,
  211. Y = i,
  212. Flags = MouseFlags.ReportMousePosition,
  213. View = mCurrent
  214. }));
  215. }
  216. Assert.True (menu.IsMenuOpen);
  217. if (i == 2) {
  218. Assert.Equal ("_Edit", miCurrent.Parent.Title);
  219. Assert.Equal ("C_ut", miCurrent.Title);
  220. } else if (i == 1) {
  221. Assert.Equal ("_Edit", miCurrent.Parent.Title);
  222. Assert.Equal ("_Copy", miCurrent.Title);
  223. } else if (i == 0) {
  224. Assert.Equal ("_Edit", miCurrent.Parent.Title);
  225. Assert.Equal ("_Copy", miCurrent.Title);
  226. } else {
  227. Assert.Equal ("_Edit", miCurrent.Parent.Title);
  228. Assert.Equal ("_Copy", miCurrent.Title);
  229. }
  230. }
  231. }
  232. [Fact]
  233. [AutoInitShutdown]
  234. public void KeyBindings_Command ()
  235. {
  236. var miAction = "";
  237. MenuItem mbiCurrent = null;
  238. MenuItem miCurrent = null;
  239. Menu mCurrent = null;
  240. var menu = new MenuBar (new MenuBarItem [] {
  241. new MenuBarItem ("_File", new MenuItem [] {
  242. new MenuItem ("_New", "", () => miAction ="New"),
  243. new MenuItem ("_Open", "", () => miAction ="Open"),
  244. new MenuItem ("_Save", "", () => miAction ="Save"),
  245. null,
  246. new MenuItem ("_Quit", "", () => miAction ="Quit"),
  247. }),
  248. new MenuBarItem ("_Edit", new MenuItem [] {
  249. new MenuItem ("_Copy", "", () => miAction ="Copy"),
  250. new MenuItem ("C_ut", "", () => miAction ="Cut"),
  251. new MenuItem ("_Paste", "", () => miAction ="Paste"),
  252. new MenuBarItem ("_Find and Replace", new MenuItem [] {
  253. new MenuItem ("F_ind", "", null),
  254. new MenuItem ("_Replace", "", null)
  255. }),
  256. new MenuItem ("_Select All", "", () => miAction ="Select All")
  257. }),
  258. new MenuBarItem ("_About", "Top-Level", () => miAction ="About")
  259. });
  260. menu.MenuOpening += (e) => mbiCurrent = e.CurrentMenu;
  261. menu.MenuOpened += (e) => {
  262. miCurrent = e;
  263. mCurrent = menu.openCurrentMenu;
  264. };
  265. menu.MenuClosing += (_) => {
  266. mbiCurrent = null;
  267. miCurrent = null;
  268. mCurrent = null;
  269. };
  270. Application.Top.Add (menu);
  271. Application.Begin (Application.Top);
  272. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, new KeyModifiers ())));
  273. Assert.True (menu.IsMenuOpen);
  274. Assert.Equal ("_File", GetCurrentMenuBarItemTitle ());
  275. Assert.Equal ("_New", GetCurrentMenuTitle ());
  276. Assert.True (menu.ProcessKey (new KeyEvent (Key.CursorLeft, new KeyModifiers ())));
  277. Assert.True (menu.IsMenuOpen);
  278. Assert.Equal ("_About", GetCurrentMenuBarItemTitle ());
  279. Assert.Equal ("None", GetCurrentMenuTitle ());
  280. Assert.True (menu.ProcessKey (new KeyEvent (Key.CursorRight, new KeyModifiers ())));
  281. Assert.True (menu.IsMenuOpen);
  282. Assert.Equal ("_File", GetCurrentMenuBarItemTitle ());
  283. Assert.Equal ("_New", GetCurrentMenuTitle ());
  284. Assert.True (menu.ProcessKey (new KeyEvent (Key.Esc, new KeyModifiers ())));
  285. Assert.False (menu.IsMenuOpen);
  286. Assert.Equal ("Closed", GetCurrentMenuBarItemTitle ());
  287. Assert.Equal ("None", GetCurrentMenuTitle ());
  288. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, new KeyModifiers ())));
  289. Assert.True (menu.IsMenuOpen);
  290. Assert.Equal ("_File", GetCurrentMenuBarItemTitle ());
  291. Assert.Equal ("_New", GetCurrentMenuTitle ());
  292. Assert.True (menu.ProcessKey (new KeyEvent (Key.C | Key.CtrlMask, new KeyModifiers ())));
  293. Assert.False (menu.IsMenuOpen);
  294. Assert.Equal ("Closed", GetCurrentMenuBarItemTitle ());
  295. Assert.Equal ("None", GetCurrentMenuTitle ());
  296. Assert.True (menu.ProcessKey (new KeyEvent (Key.CursorDown, new KeyModifiers ())));
  297. Assert.True (menu.IsMenuOpen);
  298. Assert.Equal ("_File", GetCurrentMenuBarItemTitle ());
  299. Assert.Equal ("_New", GetCurrentMenuTitle ());
  300. Assert.True (menu.ProcessKey (new KeyEvent (Key.Esc, new KeyModifiers ())));
  301. Assert.False (menu.IsMenuOpen);
  302. Assert.Equal ("Closed", GetCurrentMenuBarItemTitle ());
  303. Assert.Equal ("None", GetCurrentMenuTitle ());
  304. Assert.True (menu.ProcessKey (new KeyEvent (Key.Enter, new KeyModifiers ())));
  305. Assert.True (menu.IsMenuOpen);
  306. Assert.Equal ("_File", GetCurrentMenuBarItemTitle ());
  307. Assert.Equal ("_New", GetCurrentMenuTitle ());
  308. Assert.False (mCurrent.ProcessKey (new KeyEvent (Key.Tab, new KeyModifiers ())));
  309. Assert.True (menu.IsMenuOpen);
  310. Assert.True (Application.Top.ProcessKey (new KeyEvent (Key.Tab, new KeyModifiers ())));
  311. Assert.False (menu.IsMenuOpen);
  312. Assert.Equal ("Closed", GetCurrentMenuBarItemTitle ());
  313. Assert.Equal ("None", GetCurrentMenuTitle ());
  314. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, new KeyModifiers ())));
  315. Assert.True (menu.IsMenuOpen);
  316. Assert.Equal ("_File", GetCurrentMenuBarItemTitle ());
  317. Assert.Equal ("_New", GetCurrentMenuTitle ());
  318. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorUp, new KeyModifiers ())));
  319. Assert.True (menu.IsMenuOpen);
  320. Assert.Equal ("_File", GetCurrentMenuBarItemTitle ());
  321. Assert.Equal ("_Quit", GetCurrentMenuTitle ());
  322. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorDown, new KeyModifiers ())));
  323. Assert.True (menu.IsMenuOpen);
  324. Assert.Equal ("_File", GetCurrentMenuBarItemTitle ());
  325. Assert.Equal ("_New", GetCurrentMenuTitle ());
  326. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorLeft, new KeyModifiers ())));
  327. Assert.True (menu.IsMenuOpen);
  328. Assert.Equal ("_About", GetCurrentMenuBarItemTitle ());
  329. Assert.Equal ("None", GetCurrentMenuTitle ());
  330. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorRight, new KeyModifiers ())));
  331. Assert.True (menu.IsMenuOpen);
  332. Assert.Equal ("_File", GetCurrentMenuBarItemTitle ());
  333. Assert.Equal ("_New", GetCurrentMenuTitle ());
  334. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.Esc, new KeyModifiers ())));
  335. Assert.False (menu.IsMenuOpen);
  336. Assert.Equal ("Closed", GetCurrentMenuBarItemTitle ());
  337. Assert.Equal ("None", GetCurrentMenuTitle ());
  338. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, new KeyModifiers ())));
  339. Assert.True (menu.IsMenuOpen);
  340. Assert.Equal ("_File", GetCurrentMenuBarItemTitle ());
  341. Assert.Equal ("_New", GetCurrentMenuTitle ());
  342. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.Enter, new KeyModifiers ())));
  343. Assert.False (menu.IsMenuOpen);
  344. Assert.Equal ("Closed", GetCurrentMenuBarItemTitle ());
  345. Assert.Equal ("None", GetCurrentMenuTitle ());
  346. Application.MainLoop.MainIteration ();
  347. Assert.Equal ("New", miAction);
  348. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, new KeyModifiers ())));
  349. Assert.True (menu.IsMenuOpen);
  350. Assert.Equal ("_File", GetCurrentMenuBarItemTitle ());
  351. Assert.Equal ("_New", GetCurrentMenuTitle ());
  352. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorLeft, new KeyModifiers ())));
  353. Assert.True (menu.IsMenuOpen);
  354. Assert.Equal ("_About", GetCurrentMenuBarItemTitle ());
  355. Assert.Equal ("None", GetCurrentMenuTitle ());
  356. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.Enter, new KeyModifiers ())));
  357. Assert.False (menu.IsMenuOpen);
  358. Assert.Equal ("Closed", GetCurrentMenuBarItemTitle ());
  359. Assert.Equal ("None", GetCurrentMenuTitle ());
  360. Application.MainLoop.MainIteration ();
  361. Assert.Equal ("About", miAction);
  362. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, new KeyModifiers ())));
  363. Assert.True (menu.IsMenuOpen);
  364. Assert.Equal ("_File", GetCurrentMenuBarItemTitle ());
  365. Assert.Equal ("_New", GetCurrentMenuTitle ());
  366. Assert.True (menu.ProcessKey (new KeyEvent (Key.CursorRight, new KeyModifiers ())));
  367. Assert.True (menu.IsMenuOpen);
  368. Assert.Equal ("_Edit", GetCurrentMenuBarItemTitle ());
  369. Assert.Equal ("_Copy", GetCurrentMenuTitle ());
  370. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorDown, new KeyModifiers ())));
  371. Assert.True (menu.IsMenuOpen);
  372. Assert.Equal ("_Edit", GetCurrentMenuBarItemTitle ());
  373. Assert.Equal ("C_ut", GetCurrentMenuTitle ());
  374. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorDown, new KeyModifiers ())));
  375. Assert.True (menu.IsMenuOpen);
  376. Assert.Equal ("_Edit", GetCurrentMenuBarItemTitle ());
  377. Assert.Equal ("_Edit", GetCurrenParenttMenuItemTitle ());
  378. Assert.Equal ("_Paste", GetCurrentMenuTitle ());
  379. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorDown, new KeyModifiers ())));
  380. Assert.True (menu.IsMenuOpen);
  381. Assert.Equal ("_Edit", GetCurrentMenuBarItemTitle ());
  382. Assert.Equal ("_Find and Replace", GetCurrenParenttMenuItemTitle ());
  383. Assert.Equal ("F_ind", GetCurrentMenuTitle ());
  384. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorDown, new KeyModifiers ())));
  385. Assert.True (menu.IsMenuOpen);
  386. Assert.Equal ("_Edit", GetCurrentMenuBarItemTitle ());
  387. Assert.Equal ("_Find and Replace", GetCurrenParenttMenuItemTitle ());
  388. Assert.Equal ("_Replace", GetCurrentMenuTitle ());
  389. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorDown, new KeyModifiers ())));
  390. Assert.True (menu.IsMenuOpen);
  391. Assert.Equal ("_Edit", GetCurrentMenuBarItemTitle ());
  392. Assert.Equal ("_Find and Replace", GetCurrenParenttMenuItemTitle ());
  393. Assert.Equal ("F_ind", GetCurrentMenuTitle ());
  394. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorLeft, new KeyModifiers ())));
  395. Assert.True (menu.IsMenuOpen);
  396. Assert.Equal ("_Edit", GetCurrentMenuBarItemTitle ());
  397. Assert.Equal ("_Edit", GetCurrenParenttMenuItemTitle ());
  398. Assert.Equal ("_Find and Replace", GetCurrentMenuTitle ());
  399. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorDown, new KeyModifiers ())));
  400. Assert.True (menu.IsMenuOpen);
  401. Assert.Equal ("_Edit", GetCurrentMenuBarItemTitle ());
  402. Assert.Equal ("_Edit", GetCurrenParenttMenuItemTitle ());
  403. Assert.Equal ("_Select All", GetCurrentMenuTitle ());
  404. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorUp, new KeyModifiers ())));
  405. Assert.True (menu.IsMenuOpen);
  406. Assert.Equal ("_Edit", GetCurrentMenuBarItemTitle ());
  407. Assert.Equal ("_Find and Replace", GetCurrenParenttMenuItemTitle ());
  408. Assert.Equal ("F_ind", GetCurrentMenuTitle ());
  409. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorUp, new KeyModifiers ())));
  410. Assert.True (menu.IsMenuOpen);
  411. Assert.Equal ("_Edit", GetCurrentMenuBarItemTitle ());
  412. Assert.Equal ("_Edit", GetCurrenParenttMenuItemTitle ());
  413. Assert.Equal ("_Find and Replace", GetCurrentMenuTitle ());
  414. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorUp, new KeyModifiers ())));
  415. Assert.True (menu.IsMenuOpen);
  416. Assert.Equal ("_Edit", GetCurrentMenuBarItemTitle ());
  417. Assert.Equal ("_Edit", GetCurrenParenttMenuItemTitle ());
  418. Assert.Equal ("_Paste", GetCurrentMenuTitle ());
  419. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorUp, new KeyModifiers ())));
  420. Assert.True (menu.IsMenuOpen);
  421. Assert.Equal ("_Edit", GetCurrentMenuBarItemTitle ());
  422. Assert.Equal ("C_ut", GetCurrentMenuTitle ());
  423. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorUp, new KeyModifiers ())));
  424. Assert.True (menu.IsMenuOpen);
  425. Assert.Equal ("_Edit", GetCurrentMenuBarItemTitle ());
  426. Assert.Equal ("_Copy", GetCurrentMenuTitle ());
  427. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.Enter, new KeyModifiers ())));
  428. Assert.False (menu.IsMenuOpen);
  429. Assert.Equal ("Closed", GetCurrentMenuBarItemTitle ());
  430. Assert.Equal ("None", GetCurrentMenuTitle ());
  431. Application.MainLoop.MainIteration ();
  432. Assert.Equal ("Copy", miAction);
  433. string GetCurrentMenuBarItemTitle ()
  434. {
  435. return mbiCurrent != null ? mbiCurrent.Title.ToString () : "Closed";
  436. }
  437. string GetCurrenParenttMenuItemTitle ()
  438. {
  439. return miCurrent?.Parent != null ? miCurrent.Parent.Title.ToString () : "None";
  440. }
  441. string GetCurrentMenuTitle ()
  442. {
  443. return miCurrent != null ? miCurrent.Title.ToString () : "None";
  444. }
  445. }
  446. [Fact, AutoInitShutdown]
  447. public void DrawFrame_With_Positive_Positions ()
  448. {
  449. var menu = new MenuBar (new MenuBarItem [] {
  450. new MenuBarItem (new MenuItem [] {
  451. new MenuItem ("One", "", null),
  452. new MenuItem ("Two", "", null)
  453. })
  454. });
  455. Assert.Equal (Point.Empty, new Point (menu.Frame.X, menu.Frame.Y));
  456. menu.OpenMenu ();
  457. Application.Begin (Application.Top);
  458. var expected = @"
  459. ┌──────┐
  460. │ One │
  461. │ Two │
  462. └──────┘
  463. ";
  464. var pos = GraphViewTests.AssertDriverContentsWithPosAre (expected, output);
  465. Assert.Equal (new Point (0, 1), pos);
  466. }
  467. [Fact, AutoInitShutdown]
  468. public void DrawFrame_With_Negative_Positions ()
  469. {
  470. var menu = new MenuBar (new MenuBarItem [] {
  471. new MenuBarItem (new MenuItem [] {
  472. new MenuItem ("One", "", null),
  473. new MenuItem ("Two", "", null)
  474. })
  475. }) {
  476. X = -1,
  477. Y = -1
  478. };
  479. Assert.Equal (new Point (-1, -1), new Point (menu.Frame.X, menu.Frame.Y));
  480. menu.OpenMenu ();
  481. Application.Begin (Application.Top);
  482. var expected = @"
  483. ──────┐
  484. One │
  485. Two │
  486. ──────┘
  487. ";
  488. var pos = GraphViewTests.AssertDriverContentsWithPosAre (expected, output);
  489. Assert.Equal (new Point (0, 0), pos);
  490. menu.CloseAllMenus ();
  491. menu.Frame = new Rect (-1, -2, menu.Frame.Width, menu.Frame.Height);
  492. menu.OpenMenu ();
  493. Application.Refresh ();
  494. expected = @"
  495. One │
  496. Two │
  497. ──────┘
  498. ";
  499. pos = GraphViewTests.AssertDriverContentsWithPosAre (expected, output);
  500. Assert.Equal (new Point (1, 0), pos);
  501. menu.CloseAllMenus ();
  502. menu.Frame = new Rect (0, 0, menu.Frame.Width, menu.Frame.Height);
  503. ((FakeDriver)Application.Driver).SetBufferSize (7, 5);
  504. menu.OpenMenu ();
  505. Application.Refresh ();
  506. expected = @"
  507. ┌──────
  508. │ One
  509. │ Two
  510. └──────
  511. ";
  512. pos = GraphViewTests.AssertDriverContentsWithPosAre (expected, output);
  513. Assert.Equal (new Point (0, 1), pos);
  514. menu.CloseAllMenus ();
  515. menu.Frame = new Rect (0, 0, menu.Frame.Width, menu.Frame.Height);
  516. ((FakeDriver)Application.Driver).SetBufferSize (7, 4);
  517. menu.OpenMenu ();
  518. Application.Refresh ();
  519. expected = @"
  520. ┌──────
  521. │ One
  522. │ Two
  523. ";
  524. pos = GraphViewTests.AssertDriverContentsWithPosAre (expected, output);
  525. Assert.Equal (new Point (0, 1), pos);
  526. }
  527. }
  528. }