MenuTests.cs 41 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273
  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, AutoInitShutdown]
  160. public void MenuOpened_On_Disabled_MenuItem ()
  161. {
  162. MenuItem miCurrent = null;
  163. Menu mCurrent = null;
  164. var menu = new MenuBar (new MenuBarItem [] {
  165. new MenuBarItem ("_File", new MenuItem [] {
  166. new MenuBarItem ("_New", new MenuItem [] {
  167. new MenuItem ("_New doc", "Creates new doc.", null, () => false)
  168. }),
  169. new MenuItem ("_Save", "Saves the file.", null, null)
  170. })
  171. });
  172. menu.MenuOpened += (e) => {
  173. miCurrent = e;
  174. mCurrent = menu.openMenu;
  175. };
  176. menu.UseKeysUpDownAsKeysLeftRight = true;
  177. Application.Top.Add (menu);
  178. // open the menu
  179. Assert.True (menu.MouseEvent (new MouseEvent () {
  180. X = 1,
  181. Y = 0,
  182. Flags = MouseFlags.Button1Pressed,
  183. View = menu
  184. }));
  185. Assert.True (menu.IsMenuOpen);
  186. Assert.Equal ("_File", miCurrent.Parent.Title);
  187. Assert.Equal ("_New", miCurrent.Title);
  188. Assert.True (mCurrent.MouseEvent (new MouseEvent () {
  189. X = 1,
  190. Y = 1,
  191. Flags = MouseFlags.ReportMousePosition,
  192. View = mCurrent
  193. }));
  194. Assert.True (menu.IsMenuOpen);
  195. Assert.Equal ("_File", miCurrent.Parent.Title);
  196. Assert.Equal ("_New", miCurrent.Title);
  197. Assert.True (mCurrent.MouseEvent (new MouseEvent () {
  198. X = 1,
  199. Y = 2,
  200. Flags = MouseFlags.ReportMousePosition,
  201. View = mCurrent
  202. }));
  203. Assert.True (menu.IsMenuOpen);
  204. Assert.Equal ("_File", miCurrent.Parent.Title);
  205. Assert.Equal ("_Save", miCurrent.Title);
  206. // close the menu
  207. Assert.True (menu.MouseEvent (new MouseEvent () {
  208. X = 1,
  209. Y = 0,
  210. Flags = MouseFlags.Button1Pressed,
  211. View = menu
  212. }));
  213. Assert.False (menu.IsMenuOpen);
  214. // open the menu
  215. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, new KeyModifiers ())));
  216. Assert.True (menu.IsMenuOpen);
  217. Assert.Equal ("_New", miCurrent.Parent.Title);
  218. Assert.Equal ("_New doc", miCurrent.Title);
  219. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorDown, new KeyModifiers ())));
  220. Assert.True (menu.IsMenuOpen);
  221. Assert.Equal ("_File", miCurrent.Parent.Title);
  222. Assert.Equal ("_Save", miCurrent.Title);
  223. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorUp, new KeyModifiers ())));
  224. Assert.True (menu.IsMenuOpen);
  225. Assert.Equal ("_File", miCurrent.Parent.Title);
  226. Assert.Equal ("_New", miCurrent.Title);
  227. // close the menu
  228. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, new KeyModifiers ())));
  229. Assert.False (menu.IsMenuOpen);
  230. }
  231. [Fact]
  232. [AutoInitShutdown]
  233. public void MouseEvent_Test ()
  234. {
  235. MenuItem miCurrent = null;
  236. Menu mCurrent = null;
  237. var menu = new MenuBar (new MenuBarItem [] {
  238. new MenuBarItem ("_File", new MenuItem [] {
  239. new MenuItem ("_New", "", null),
  240. new MenuItem ("_Open", "", null),
  241. new MenuItem ("_Save", "", null)
  242. }),
  243. new MenuBarItem ("_Edit", new MenuItem [] {
  244. new MenuItem ("_Copy", "", null),
  245. new MenuItem ("C_ut", "", null),
  246. new MenuItem ("_Paste", "", null)
  247. })
  248. });
  249. menu.MenuOpened += (e) => {
  250. miCurrent = e;
  251. mCurrent = menu.openCurrentMenu;
  252. };
  253. Application.Top.Add (menu);
  254. Assert.True (menu.MouseEvent (new MouseEvent () {
  255. X = 10,
  256. Y = 0,
  257. Flags = MouseFlags.Button1Pressed,
  258. View = menu
  259. }));
  260. Assert.True (menu.IsMenuOpen);
  261. Assert.Equal ("_Edit", miCurrent.Parent.Title);
  262. Assert.Equal ("_Copy", miCurrent.Title);
  263. Assert.True (mCurrent.MouseEvent (new MouseEvent () {
  264. X = 10,
  265. Y = 3,
  266. Flags = MouseFlags.ReportMousePosition,
  267. View = mCurrent
  268. }));
  269. Assert.True (menu.IsMenuOpen);
  270. Assert.Equal ("_Edit", miCurrent.Parent.Title);
  271. Assert.Equal ("_Paste", miCurrent.Title);
  272. for (int i = 2; i >= -1; i--) {
  273. if (i == -1) {
  274. Assert.False (mCurrent.MouseEvent (new MouseEvent () {
  275. X = 10,
  276. Y = i,
  277. Flags = MouseFlags.ReportMousePosition,
  278. View = menu
  279. }));
  280. } else {
  281. Assert.True (mCurrent.MouseEvent (new MouseEvent () {
  282. X = 10,
  283. Y = i,
  284. Flags = MouseFlags.ReportMousePosition,
  285. View = mCurrent
  286. }));
  287. }
  288. Assert.True (menu.IsMenuOpen);
  289. if (i == 2) {
  290. Assert.Equal ("_Edit", miCurrent.Parent.Title);
  291. Assert.Equal ("C_ut", miCurrent.Title);
  292. } else if (i == 1) {
  293. Assert.Equal ("_Edit", miCurrent.Parent.Title);
  294. Assert.Equal ("_Copy", miCurrent.Title);
  295. } else if (i == 0) {
  296. Assert.Equal ("_Edit", miCurrent.Parent.Title);
  297. Assert.Equal ("_Copy", miCurrent.Title);
  298. } else {
  299. Assert.Equal ("_Edit", miCurrent.Parent.Title);
  300. Assert.Equal ("_Copy", miCurrent.Title);
  301. }
  302. }
  303. }
  304. [Fact]
  305. [AutoInitShutdown]
  306. public void KeyBindings_Command ()
  307. {
  308. var miAction = "";
  309. MenuItem mbiCurrent = null;
  310. MenuItem miCurrent = null;
  311. Menu mCurrent = null;
  312. var menu = new MenuBar (new MenuBarItem [] {
  313. new MenuBarItem ("_File", new MenuItem [] {
  314. new MenuItem ("_New", "", () => miAction ="New"),
  315. new MenuItem ("_Open", "", () => miAction ="Open"),
  316. new MenuItem ("_Save", "", () => miAction ="Save"),
  317. null,
  318. new MenuItem ("_Quit", "", () => miAction ="Quit"),
  319. }),
  320. new MenuBarItem ("_Edit", new MenuItem [] {
  321. new MenuItem ("_Copy", "", () => miAction ="Copy"),
  322. new MenuItem ("C_ut", "", () => miAction ="Cut"),
  323. new MenuItem ("_Paste", "", () => miAction ="Paste"),
  324. new MenuBarItem ("_Find and Replace", new MenuItem [] {
  325. new MenuItem ("F_ind", "", null),
  326. new MenuItem ("_Replace", "", null)
  327. }),
  328. new MenuItem ("_Select All", "", () => miAction ="Select All")
  329. }),
  330. new MenuBarItem ("_About", "Top-Level", () => miAction ="About")
  331. });
  332. menu.MenuOpening += (e) => mbiCurrent = e.CurrentMenu;
  333. menu.MenuOpened += (e) => {
  334. miCurrent = e;
  335. mCurrent = menu.openCurrentMenu;
  336. };
  337. menu.MenuClosing += (_) => {
  338. mbiCurrent = null;
  339. miCurrent = null;
  340. mCurrent = null;
  341. };
  342. menu.UseKeysUpDownAsKeysLeftRight = true;
  343. Application.Top.Add (menu);
  344. Application.Begin (Application.Top);
  345. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, new KeyModifiers ())));
  346. Assert.True (menu.IsMenuOpen);
  347. Assert.Equal ("_File", GetCurrentMenuBarItemTitle ());
  348. Assert.Equal ("_New", GetCurrentMenuTitle ());
  349. Assert.True (menu.ProcessKey (new KeyEvent (Key.CursorLeft, new KeyModifiers ())));
  350. Assert.True (menu.IsMenuOpen);
  351. Assert.Equal ("_About", GetCurrentMenuBarItemTitle ());
  352. Assert.Equal ("_About", GetCurrentMenuTitle ());
  353. Assert.True (menu.ProcessKey (new KeyEvent (Key.CursorRight, new KeyModifiers ())));
  354. Assert.True (menu.IsMenuOpen);
  355. Assert.Equal ("_File", GetCurrentMenuBarItemTitle ());
  356. Assert.Equal ("_New", GetCurrentMenuTitle ());
  357. Assert.True (menu.ProcessKey (new KeyEvent (Key.Esc, new KeyModifiers ())));
  358. Assert.False (menu.IsMenuOpen);
  359. Assert.Equal ("Closed", GetCurrentMenuBarItemTitle ());
  360. Assert.Equal ("None", GetCurrentMenuTitle ());
  361. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, new KeyModifiers ())));
  362. Assert.True (menu.IsMenuOpen);
  363. Assert.Equal ("_File", GetCurrentMenuBarItemTitle ());
  364. Assert.Equal ("_New", GetCurrentMenuTitle ());
  365. Assert.True (menu.ProcessKey (new KeyEvent (Key.C | Key.CtrlMask, new KeyModifiers ())));
  366. Assert.False (menu.IsMenuOpen);
  367. Assert.Equal ("Closed", GetCurrentMenuBarItemTitle ());
  368. Assert.Equal ("None", GetCurrentMenuTitle ());
  369. Assert.True (menu.ProcessKey (new KeyEvent (Key.CursorDown, new KeyModifiers ())));
  370. Assert.True (menu.IsMenuOpen);
  371. Assert.Equal ("_File", GetCurrentMenuBarItemTitle ());
  372. Assert.Equal ("_New", GetCurrentMenuTitle ());
  373. Assert.True (menu.ProcessKey (new KeyEvent (Key.Esc, new KeyModifiers ())));
  374. Assert.False (menu.IsMenuOpen);
  375. Assert.Equal ("Closed", GetCurrentMenuBarItemTitle ());
  376. Assert.Equal ("None", GetCurrentMenuTitle ());
  377. Assert.True (menu.ProcessKey (new KeyEvent (Key.Enter, new KeyModifiers ())));
  378. Assert.True (menu.IsMenuOpen);
  379. Assert.Equal ("_File", GetCurrentMenuBarItemTitle ());
  380. Assert.Equal ("_New", GetCurrentMenuTitle ());
  381. Assert.False (mCurrent.ProcessKey (new KeyEvent (Key.Tab, new KeyModifiers ())));
  382. Assert.True (menu.IsMenuOpen);
  383. Assert.True (Application.Top.ProcessKey (new KeyEvent (Key.Tab, new KeyModifiers ())));
  384. Assert.False (menu.IsMenuOpen);
  385. Assert.Equal ("Closed", GetCurrentMenuBarItemTitle ());
  386. Assert.Equal ("None", GetCurrentMenuTitle ());
  387. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, new KeyModifiers ())));
  388. Assert.True (menu.IsMenuOpen);
  389. Assert.Equal ("_File", GetCurrentMenuBarItemTitle ());
  390. Assert.Equal ("_New", GetCurrentMenuTitle ());
  391. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorUp, new KeyModifiers ())));
  392. Assert.True (menu.IsMenuOpen);
  393. Assert.Equal ("_File", GetCurrentMenuBarItemTitle ());
  394. Assert.Equal ("_Quit", GetCurrentMenuTitle ());
  395. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorDown, new KeyModifiers ())));
  396. Assert.True (menu.IsMenuOpen);
  397. Assert.Equal ("_File", GetCurrentMenuBarItemTitle ());
  398. Assert.Equal ("_New", GetCurrentMenuTitle ());
  399. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorLeft, new KeyModifiers ())));
  400. Assert.True (menu.IsMenuOpen);
  401. Assert.Equal ("_About", GetCurrentMenuBarItemTitle ());
  402. Assert.Equal ("_About", GetCurrentMenuTitle ());
  403. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorRight, new KeyModifiers ())));
  404. Assert.True (menu.IsMenuOpen);
  405. Assert.Equal ("_File", GetCurrentMenuBarItemTitle ());
  406. Assert.Equal ("_New", GetCurrentMenuTitle ());
  407. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.Esc, new KeyModifiers ())));
  408. Assert.False (menu.IsMenuOpen);
  409. Assert.Equal ("Closed", GetCurrentMenuBarItemTitle ());
  410. Assert.Equal ("None", GetCurrentMenuTitle ());
  411. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, new KeyModifiers ())));
  412. Assert.True (menu.IsMenuOpen);
  413. Assert.Equal ("_File", GetCurrentMenuBarItemTitle ());
  414. Assert.Equal ("_New", GetCurrentMenuTitle ());
  415. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.Enter, new KeyModifiers ())));
  416. Assert.False (menu.IsMenuOpen);
  417. Assert.Equal ("Closed", GetCurrentMenuBarItemTitle ());
  418. Assert.Equal ("None", GetCurrentMenuTitle ());
  419. Application.MainLoop.MainIteration ();
  420. Assert.Equal ("New", miAction);
  421. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, new KeyModifiers ())));
  422. Assert.True (menu.IsMenuOpen);
  423. Assert.Equal ("_File", GetCurrentMenuBarItemTitle ());
  424. Assert.Equal ("_New", GetCurrentMenuTitle ());
  425. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorLeft, new KeyModifiers ())));
  426. Assert.True (menu.IsMenuOpen);
  427. Assert.Equal ("_About", GetCurrentMenuBarItemTitle ());
  428. Assert.Equal ("_About", GetCurrentMenuTitle ());
  429. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.Enter, new KeyModifiers ())));
  430. Assert.False (menu.IsMenuOpen);
  431. Assert.Equal ("Closed", GetCurrentMenuBarItemTitle ());
  432. Assert.Equal ("None", GetCurrentMenuTitle ());
  433. Application.MainLoop.MainIteration ();
  434. Assert.Equal ("About", miAction);
  435. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, new KeyModifiers ())));
  436. Assert.True (menu.IsMenuOpen);
  437. Assert.Equal ("_File", GetCurrentMenuBarItemTitle ());
  438. Assert.Equal ("_New", GetCurrentMenuTitle ());
  439. Assert.True (menu.ProcessKey (new KeyEvent (Key.CursorRight, new KeyModifiers ())));
  440. Assert.True (menu.IsMenuOpen);
  441. Assert.Equal ("_Edit", GetCurrentMenuBarItemTitle ());
  442. Assert.Equal ("_Copy", GetCurrentMenuTitle ());
  443. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorDown, new KeyModifiers ())));
  444. Assert.True (menu.IsMenuOpen);
  445. Assert.Equal ("_Edit", GetCurrentMenuBarItemTitle ());
  446. Assert.Equal ("C_ut", GetCurrentMenuTitle ());
  447. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorDown, new KeyModifiers ())));
  448. Assert.True (menu.IsMenuOpen);
  449. Assert.Equal ("_Edit", GetCurrentMenuBarItemTitle ());
  450. Assert.Equal ("_Edit", GetCurrenParenttMenuItemTitle ());
  451. Assert.Equal ("_Paste", GetCurrentMenuTitle ());
  452. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorDown, new KeyModifiers ())));
  453. Assert.True (menu.IsMenuOpen);
  454. Assert.Equal ("_Edit", GetCurrentMenuBarItemTitle ());
  455. Assert.Equal ("_Find and Replace", GetCurrenParenttMenuItemTitle ());
  456. Assert.Equal ("F_ind", GetCurrentMenuTitle ());
  457. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorDown, new KeyModifiers ())));
  458. Assert.True (menu.IsMenuOpen);
  459. Assert.Equal ("_Edit", GetCurrentMenuBarItemTitle ());
  460. Assert.Equal ("_Find and Replace", GetCurrenParenttMenuItemTitle ());
  461. Assert.Equal ("_Replace", GetCurrentMenuTitle ());
  462. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorDown, new KeyModifiers ())));
  463. Assert.True (menu.IsMenuOpen);
  464. Assert.Equal ("_Edit", GetCurrentMenuBarItemTitle ());
  465. Assert.Equal ("_Find and Replace", GetCurrenParenttMenuItemTitle ());
  466. Assert.Equal ("F_ind", GetCurrentMenuTitle ());
  467. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorLeft, new KeyModifiers ())));
  468. Assert.True (menu.IsMenuOpen);
  469. Assert.Equal ("_Edit", GetCurrentMenuBarItemTitle ());
  470. Assert.Equal ("_Edit", GetCurrenParenttMenuItemTitle ());
  471. Assert.Equal ("_Find and Replace", GetCurrentMenuTitle ());
  472. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorDown, new KeyModifiers ())));
  473. Assert.True (menu.IsMenuOpen);
  474. Assert.Equal ("_Edit", GetCurrentMenuBarItemTitle ());
  475. Assert.Equal ("_Edit", GetCurrenParenttMenuItemTitle ());
  476. Assert.Equal ("_Select All", GetCurrentMenuTitle ());
  477. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorUp, new KeyModifiers ())));
  478. Assert.True (menu.IsMenuOpen);
  479. Assert.Equal ("_Edit", GetCurrentMenuBarItemTitle ());
  480. Assert.Equal ("_Find and Replace", GetCurrenParenttMenuItemTitle ());
  481. Assert.Equal ("F_ind", GetCurrentMenuTitle ());
  482. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorUp, new KeyModifiers ())));
  483. Assert.True (menu.IsMenuOpen);
  484. Assert.Equal ("_Edit", GetCurrentMenuBarItemTitle ());
  485. Assert.Equal ("_Edit", GetCurrenParenttMenuItemTitle ());
  486. Assert.Equal ("_Find and Replace", GetCurrentMenuTitle ());
  487. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorUp, new KeyModifiers ())));
  488. Assert.True (menu.IsMenuOpen);
  489. Assert.Equal ("_Edit", GetCurrentMenuBarItemTitle ());
  490. Assert.Equal ("_Edit", GetCurrenParenttMenuItemTitle ());
  491. Assert.Equal ("_Paste", GetCurrentMenuTitle ());
  492. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorUp, new KeyModifiers ())));
  493. Assert.True (menu.IsMenuOpen);
  494. Assert.Equal ("_Edit", GetCurrentMenuBarItemTitle ());
  495. Assert.Equal ("C_ut", GetCurrentMenuTitle ());
  496. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorUp, new KeyModifiers ())));
  497. Assert.True (menu.IsMenuOpen);
  498. Assert.Equal ("_Edit", GetCurrentMenuBarItemTitle ());
  499. Assert.Equal ("_Copy", GetCurrentMenuTitle ());
  500. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.Enter, new KeyModifiers ())));
  501. Assert.False (menu.IsMenuOpen);
  502. Assert.Equal ("Closed", GetCurrentMenuBarItemTitle ());
  503. Assert.Equal ("None", GetCurrentMenuTitle ());
  504. Application.MainLoop.MainIteration ();
  505. Assert.Equal ("Copy", miAction);
  506. string GetCurrentMenuBarItemTitle ()
  507. {
  508. return mbiCurrent != null ? mbiCurrent.Title.ToString () : "Closed";
  509. }
  510. string GetCurrenParenttMenuItemTitle ()
  511. {
  512. return miCurrent?.Parent != null ? miCurrent.Parent.Title.ToString () : "None";
  513. }
  514. string GetCurrentMenuTitle ()
  515. {
  516. return miCurrent != null ? miCurrent.Title.ToString () : "None";
  517. }
  518. }
  519. [Fact, AutoInitShutdown]
  520. public void DrawFrame_With_Positive_Positions ()
  521. {
  522. var menu = new MenuBar (new MenuBarItem [] {
  523. new MenuBarItem (new MenuItem [] {
  524. new MenuItem ("One", "", null),
  525. new MenuItem ("Two", "", null)
  526. })
  527. });
  528. Assert.Equal (Point.Empty, new Point (menu.Frame.X, menu.Frame.Y));
  529. menu.OpenMenu ();
  530. Application.Begin (Application.Top);
  531. var expected = @"
  532. ┌──────┐
  533. │ One │
  534. │ Two │
  535. └──────┘
  536. ";
  537. var pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  538. Assert.Equal (new Rect (0, 1, 8, 4), pos);
  539. }
  540. [Fact, AutoInitShutdown]
  541. public void DrawFrame_With_Negative_Positions ()
  542. {
  543. var menu = new MenuBar (new MenuBarItem [] {
  544. new MenuBarItem (new MenuItem [] {
  545. new MenuItem ("One", "", null),
  546. new MenuItem ("Two", "", null)
  547. })
  548. }) {
  549. X = -1,
  550. Y = -1
  551. };
  552. Assert.Equal (new Point (-1, -1), new Point (menu.Frame.X, menu.Frame.Y));
  553. menu.OpenMenu ();
  554. Application.Begin (Application.Top);
  555. var expected = @"
  556. ──────┐
  557. One │
  558. Two │
  559. ──────┘
  560. ";
  561. var pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  562. Assert.Equal (new Rect (0, 0, 7, 4), pos);
  563. menu.CloseAllMenus ();
  564. menu.Frame = new Rect (-1, -2, menu.Frame.Width, menu.Frame.Height);
  565. menu.OpenMenu ();
  566. Application.Refresh ();
  567. expected = @"
  568. One │
  569. Two │
  570. ──────┘
  571. ";
  572. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  573. Assert.Equal (new Rect (1, 0, 7, 3), pos);
  574. menu.CloseAllMenus ();
  575. menu.Frame = new Rect (0, 0, menu.Frame.Width, menu.Frame.Height);
  576. ((FakeDriver)Application.Driver).SetBufferSize (7, 5);
  577. menu.OpenMenu ();
  578. Application.Refresh ();
  579. expected = @"
  580. ┌──────
  581. │ One
  582. │ Two
  583. └──────
  584. ";
  585. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  586. Assert.Equal (new Rect (0, 1, 7, 4), pos);
  587. menu.CloseAllMenus ();
  588. menu.Frame = new Rect (0, 0, menu.Frame.Width, menu.Frame.Height);
  589. ((FakeDriver)Application.Driver).SetBufferSize (7, 4);
  590. menu.OpenMenu ();
  591. Application.Refresh ();
  592. expected = @"
  593. ┌──────
  594. │ One
  595. │ Two
  596. ";
  597. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  598. Assert.Equal (new Rect (0, 1, 7, 3), pos);
  599. }
  600. [Fact, AutoInitShutdown]
  601. public void UseSubMenusSingleFrame_False_By_Keyboard ()
  602. {
  603. var menu = new MenuBar (new MenuBarItem [] {
  604. new MenuBarItem ("Numbers", new MenuItem [] {
  605. new MenuItem ("One", "", null),
  606. new MenuBarItem ("Two", new MenuItem [] {
  607. new MenuItem ("Sub-Menu 1", "", null),
  608. new MenuItem ("Sub-Menu 2", "", null)
  609. }),
  610. new MenuItem ("Three", "", null),
  611. })
  612. });
  613. menu.UseKeysUpDownAsKeysLeftRight = true;
  614. Application.Top.Add (menu);
  615. Assert.Equal (Point.Empty, new Point (menu.Frame.X, menu.Frame.Y));
  616. Assert.False (menu.UseSubMenusSingleFrame);
  617. Application.Top.Redraw (Application.Top.Bounds);
  618. var expected = @"
  619. Numbers
  620. ";
  621. var pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  622. Assert.Equal (new Rect (2, 0, 9, 1), pos);
  623. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, null)));
  624. Application.Top.Redraw (Application.Top.Bounds);
  625. expected = @"
  626. Numbers
  627. ┌────────┐
  628. │ One │
  629. │ Two ►│
  630. │ Three │
  631. └────────┘
  632. ";
  633. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  634. Assert.Equal (new Rect (2, 0, 10, 6), pos);
  635. Assert.True (Application.Top.Subviews [1].ProcessKey (new KeyEvent (Key.CursorDown, null)));
  636. Application.Top.Redraw (Application.Top.Bounds);
  637. expected = @"
  638. Numbers
  639. ┌────────┐
  640. │ One │
  641. │ Two ►│┌─────────────┐
  642. │ Three ││ Sub-Menu 1 │
  643. └────────┘│ Sub-Menu 2 │
  644. └─────────────┘
  645. ";
  646. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  647. Assert.Equal (new Rect (2, 0, 25, 7), pos);
  648. Assert.True (Application.Top.Subviews [2].ProcessKey (new KeyEvent (Key.CursorLeft, null)));
  649. Application.Top.Redraw (Application.Top.Bounds);
  650. expected = @"
  651. Numbers
  652. ┌────────┐
  653. │ One │
  654. │ Two ►│
  655. │ Three │
  656. └────────┘
  657. ";
  658. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  659. Assert.Equal (new Rect (2, 0, 10, 6), pos);
  660. Assert.True (Application.Top.Subviews [1].ProcessKey (new KeyEvent (Key.Esc, null)));
  661. Application.Top.Redraw (Application.Top.Bounds);
  662. expected = @"
  663. Numbers
  664. ";
  665. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  666. Assert.Equal (new Rect (2, 0, 9, 1), pos);
  667. }
  668. [Fact, AutoInitShutdown]
  669. public void UseSubMenusSingleFrame_False_By_Mouse ()
  670. {
  671. var menu = new MenuBar (new MenuBarItem [] {
  672. new MenuBarItem ("Numbers", new MenuItem [] {
  673. new MenuItem ("One", "", null),
  674. new MenuBarItem ("Two", new MenuItem [] {
  675. new MenuItem ("Sub-Menu 1", "", null),
  676. new MenuItem ("Sub-Menu 2", "", null)
  677. }),
  678. new MenuItem ("Three", "", null),
  679. })
  680. });
  681. Application.Top.Add (menu);
  682. Assert.Equal (Point.Empty, new Point (menu.Frame.X, menu.Frame.Y));
  683. Assert.False (menu.UseSubMenusSingleFrame);
  684. Application.Top.Redraw (Application.Top.Bounds);
  685. var expected = @"
  686. Numbers
  687. ";
  688. var pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  689. Assert.Equal (new Rect (2, 0, 9, 1), pos);
  690. Assert.True (menu.MouseEvent (new MouseEvent () {
  691. X = 1,
  692. Y = 0,
  693. Flags = MouseFlags.Button1Pressed,
  694. View = menu
  695. }));
  696. Application.Top.Redraw (Application.Top.Bounds);
  697. expected = @"
  698. Numbers
  699. ┌────────┐
  700. │ One │
  701. │ Two ►│
  702. │ Three │
  703. └────────┘
  704. ";
  705. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  706. Assert.Equal (new Rect (2, 0, 10, 6), pos);
  707. Assert.False (menu.MouseEvent (new MouseEvent () {
  708. X = 1,
  709. Y = 3,
  710. Flags = MouseFlags.ReportMousePosition,
  711. View = Application.Top.Subviews [1]
  712. }));
  713. Application.Top.Redraw (Application.Top.Bounds);
  714. expected = @"
  715. Numbers
  716. ┌────────┐
  717. │ One │
  718. │ Two ►│┌─────────────┐
  719. │ Three ││ Sub-Menu 1 │
  720. └────────┘│ Sub-Menu 2 │
  721. └─────────────┘
  722. ";
  723. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  724. Assert.Equal (new Rect (2, 0, 25, 7), pos);
  725. Assert.False (menu.MouseEvent (new MouseEvent () {
  726. X = 1,
  727. Y = 2,
  728. Flags = MouseFlags.ReportMousePosition,
  729. View = Application.Top.Subviews [1]
  730. }));
  731. Application.Top.Redraw (Application.Top.Bounds);
  732. expected = @"
  733. Numbers
  734. ┌────────┐
  735. │ One │
  736. │ Two ►│
  737. │ Three │
  738. └────────┘
  739. ";
  740. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  741. Assert.Equal (new Rect (2, 0, 10, 6), pos);
  742. Assert.False (menu.MouseEvent (new MouseEvent () {
  743. X = 70,
  744. Y = 2,
  745. Flags = MouseFlags.Button1Clicked,
  746. View = Application.Top
  747. }));
  748. Application.Top.Redraw (Application.Top.Bounds);
  749. expected = @"
  750. Numbers
  751. ";
  752. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  753. Assert.Equal (new Rect (2, 0, 9, 1), pos);
  754. }
  755. [Fact, AutoInitShutdown]
  756. public void UseSubMenusSingleFrame_True_By_Keyboard ()
  757. {
  758. var menu = new MenuBar (new MenuBarItem [] {
  759. new MenuBarItem ("Numbers", new MenuItem [] {
  760. new MenuItem ("One", "", null),
  761. new MenuBarItem ("Two", new MenuItem [] {
  762. new MenuItem ("Sub-Menu 1", "", null),
  763. new MenuItem ("Sub-Menu 2", "", null)
  764. }),
  765. new MenuItem ("Three", "", null),
  766. })
  767. });
  768. Application.Top.Add (menu);
  769. Assert.Equal (Point.Empty, new Point (menu.Frame.X, menu.Frame.Y));
  770. Assert.False (menu.UseSubMenusSingleFrame);
  771. menu.UseSubMenusSingleFrame = true;
  772. Assert.True (menu.UseSubMenusSingleFrame);
  773. Application.Top.Redraw (Application.Top.Bounds);
  774. var expected = @"
  775. Numbers
  776. ";
  777. var pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  778. Assert.Equal (new Rect (2, 0, 9, 1), pos);
  779. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, null)));
  780. Application.Top.Redraw (Application.Top.Bounds);
  781. expected = @"
  782. Numbers
  783. ┌────────┐
  784. │ One │
  785. │ Two ►│
  786. │ Three │
  787. └────────┘
  788. ";
  789. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  790. Assert.Equal (new Rect (2, 0, 10, 6), pos);
  791. Assert.True (Application.Top.Subviews [1].ProcessKey (new KeyEvent (Key.CursorDown, null)));
  792. Assert.True (Application.Top.Subviews [1].ProcessKey (new KeyEvent (Key.Enter, null)));
  793. Application.Top.Redraw (Application.Top.Bounds);
  794. expected = @"
  795. Numbers
  796. ┌─────────────┐
  797. │◄ Two │
  798. ├─────────────┤
  799. │ Sub-Menu 1 │
  800. │ Sub-Menu 2 │
  801. └─────────────┘
  802. ";
  803. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  804. Assert.Equal (new Rect (2, 0, 15, 7), pos);
  805. Assert.True (Application.Top.Subviews [2].ProcessKey (new KeyEvent (Key.Enter, null)));
  806. Application.Top.Redraw (Application.Top.Bounds);
  807. expected = @"
  808. Numbers
  809. ┌────────┐
  810. │ One │
  811. │ Two ►│
  812. │ Three │
  813. └────────┘
  814. ";
  815. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  816. Assert.Equal (new Rect (2, 0, 10, 6), pos);
  817. Assert.True (Application.Top.Subviews [1].ProcessKey (new KeyEvent (Key.Esc, null)));
  818. Application.Top.Redraw (Application.Top.Bounds);
  819. expected = @"
  820. Numbers
  821. ";
  822. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  823. Assert.Equal (new Rect (2, 0, 9, 1), pos);
  824. }
  825. [Fact, AutoInitShutdown]
  826. public void UseSubMenusSingleFrame_True_By_Mouse ()
  827. {
  828. var menu = new MenuBar (new MenuBarItem [] {
  829. new MenuBarItem ("Numbers", new MenuItem [] {
  830. new MenuItem ("One", "", null),
  831. new MenuBarItem ("Two", new MenuItem [] {
  832. new MenuItem ("Sub-Menu 1", "", null),
  833. new MenuItem ("Sub-Menu 2", "", null)
  834. }),
  835. new MenuItem ("Three", "", null),
  836. })
  837. });
  838. Application.Top.Add (menu);
  839. Assert.Equal (Point.Empty, new Point (menu.Frame.X, menu.Frame.Y));
  840. Assert.False (menu.UseSubMenusSingleFrame);
  841. menu.UseSubMenusSingleFrame = true;
  842. Assert.True (menu.UseSubMenusSingleFrame);
  843. Application.Top.Redraw (Application.Top.Bounds);
  844. var expected = @"
  845. Numbers
  846. ";
  847. var pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  848. Assert.Equal (new Rect (2, 0, 9, 1), pos);
  849. Assert.True (menu.MouseEvent (new MouseEvent () {
  850. X = 1,
  851. Y = 0,
  852. Flags = MouseFlags.Button1Pressed,
  853. View = menu
  854. }));
  855. Application.Top.Redraw (Application.Top.Bounds);
  856. expected = @"
  857. Numbers
  858. ┌────────┐
  859. │ One │
  860. │ Two ►│
  861. │ Three │
  862. └────────┘
  863. ";
  864. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  865. Assert.Equal (new Rect (2, 0, 10, 6), pos);
  866. Assert.False (menu.MouseEvent (new MouseEvent () {
  867. X = 1,
  868. Y = 3,
  869. Flags = MouseFlags.Button1Clicked,
  870. View = Application.Top.Subviews [1]
  871. }));
  872. Application.Top.Redraw (Application.Top.Bounds);
  873. expected = @"
  874. Numbers
  875. ┌─────────────┐
  876. │◄ Two │
  877. ├─────────────┤
  878. │ Sub-Menu 1 │
  879. │ Sub-Menu 2 │
  880. └─────────────┘
  881. ";
  882. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  883. Assert.Equal (new Rect (2, 0, 15, 7), pos);
  884. Assert.False (menu.MouseEvent (new MouseEvent () {
  885. X = 1,
  886. Y = 2,
  887. Flags = MouseFlags.Button1Clicked,
  888. View = Application.Top.Subviews [2]
  889. }));
  890. Application.Top.Redraw (Application.Top.Bounds);
  891. expected = @"
  892. Numbers
  893. ┌────────┐
  894. │ One │
  895. │ Two ►│
  896. │ Three │
  897. └────────┘
  898. ";
  899. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  900. Assert.Equal (new Rect (2, 0, 10, 6), pos);
  901. Assert.False (menu.MouseEvent (new MouseEvent () {
  902. X = 70,
  903. Y = 2,
  904. Flags = MouseFlags.Button1Clicked,
  905. View = Application.Top
  906. }));
  907. Application.Top.Redraw (Application.Top.Bounds);
  908. expected = @"
  909. Numbers
  910. ";
  911. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  912. Assert.Equal (new Rect (2, 0, 9, 1), pos);
  913. }
  914. [Fact, AutoInitShutdown]
  915. public void HotKey_MenuBar_OnKeyDown_OnKeyUp_ProcessHotKey_ProcessKey ()
  916. {
  917. var newAction = false;
  918. var copyAction = false;
  919. var menu = new MenuBar (new MenuBarItem [] {
  920. new MenuBarItem ("_File", new MenuItem [] {
  921. new MenuItem ("_New", "", () => newAction = true)
  922. }),
  923. new MenuBarItem ("_Edit", new MenuItem [] {
  924. new MenuItem ("_Copy", "", () => copyAction = true)
  925. })
  926. });
  927. Application.Top.Add (menu);
  928. Assert.False (newAction);
  929. Assert.False (copyAction);
  930. Assert.False (menu.OnKeyDown (new (Key.AltMask, new KeyModifiers () { Alt = true })));
  931. Assert.True (menu.OnKeyUp (new (Key.AltMask, new KeyModifiers () { Alt = true })));
  932. Assert.True (menu.IsMenuOpen);
  933. Application.Top.Redraw (Application.Top.Bounds);
  934. var expected = @"
  935. File Edit
  936. ";
  937. var pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  938. Assert.Equal (new Rect (2, 0, 13, 1), pos);
  939. Assert.True (menu.ProcessKey (new (Key.N, null)));
  940. Application.MainLoop.MainIteration ();
  941. Assert.True (newAction);
  942. Assert.True (menu.ProcessHotKey (new (Key.AltMask, new KeyModifiers () { Alt = true })));
  943. Assert.True (menu.IsMenuOpen);
  944. Application.Top.Redraw (Application.Top.Bounds);
  945. expected = @"
  946. File Edit
  947. ";
  948. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  949. Assert.Equal (new Rect (2, 0, 13, 1), pos);
  950. Assert.True (menu.ProcessKey (new (Key.CursorRight, null)));
  951. Assert.True (menu.ProcessKey (new (Key.C, null)));
  952. Application.MainLoop.MainIteration ();
  953. Assert.True (copyAction);
  954. }
  955. [Fact, AutoInitShutdown]
  956. public void HotKey_MenuBar_ProcessHotKey_Menu_ProcessKey ()
  957. {
  958. var newAction = false;
  959. var copyAction = false;
  960. var menu = new MenuBar (new MenuBarItem [] {
  961. new MenuBarItem ("_File", new MenuItem [] {
  962. new MenuItem ("_New", "", () => newAction = true)
  963. }),
  964. new MenuBarItem ("_Edit", new MenuItem [] {
  965. new MenuItem ("_Copy", "", () => copyAction = true)
  966. })
  967. });
  968. Application.Top.Add (menu);
  969. Assert.False (newAction);
  970. Assert.False (copyAction);
  971. Assert.True (menu.ProcessHotKey (new (Key.AltMask | Key.F, new KeyModifiers () { Alt = true })));
  972. Assert.True (menu.IsMenuOpen);
  973. Application.Top.Redraw (Application.Top.Bounds);
  974. var expected = @"
  975. File Edit
  976. ┌──────┐
  977. │ New │
  978. └──────┘
  979. ";
  980. var pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  981. Assert.Equal (new Rect (2, 0, 13, 4), pos);
  982. Assert.True (Application.Top.Subviews [1].ProcessKey (new (Key.N, null)));
  983. Application.MainLoop.MainIteration ();
  984. Assert.True (newAction);
  985. Assert.True (menu.ProcessHotKey (new (Key.AltMask | Key.E, new KeyModifiers () { Alt = true })));
  986. Assert.True (menu.IsMenuOpen);
  987. Application.Top.Redraw (Application.Top.Bounds);
  988. expected = @"
  989. File Edit
  990. ┌───────┐
  991. │ Copy │
  992. └───────┘
  993. ";
  994. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  995. Assert.Equal (new Rect (2, 0, 16, 4), pos);
  996. Assert.True (Application.Top.Subviews [1].ProcessKey (new (Key.C, null)));
  997. Application.MainLoop.MainIteration ();
  998. Assert.True (copyAction);
  999. }
  1000. [Fact, AutoInitShutdown]
  1001. public void MenuBar_Position_And_Size_With_HotKeys_Is_The_Same_As_Without_HotKeys ()
  1002. {
  1003. // With HotKeys
  1004. var menu = new MenuBar (new MenuBarItem [] {
  1005. new MenuBarItem ("_File", new MenuItem [] {
  1006. new MenuItem ("_New", "", null)
  1007. }),
  1008. new MenuBarItem ("_Edit", new MenuItem [] {
  1009. new MenuItem ("_Copy", "", null)
  1010. })
  1011. });
  1012. Application.Top.Add (menu);
  1013. Assert.True (menu.ProcessHotKey (new (Key.F9, new KeyModifiers ())));
  1014. Assert.True (menu.IsMenuOpen);
  1015. Application.Top.Redraw (Application.Top.Bounds);
  1016. var expected = @"
  1017. File Edit
  1018. ┌──────┐
  1019. │ New │
  1020. └──────┘
  1021. ";
  1022. var pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  1023. Assert.Equal (new Rect (2, 0, 13, 4), pos);
  1024. Assert.True (Application.Top.Subviews [1].ProcessKey (new (Key.CursorRight, null)));
  1025. Assert.True (menu.IsMenuOpen);
  1026. Application.Top.Redraw (Application.Top.Bounds);
  1027. expected = @"
  1028. File Edit
  1029. ┌───────┐
  1030. │ Copy │
  1031. └───────┘
  1032. ";
  1033. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  1034. Assert.Equal (new Rect (2, 0, 16, 4), pos);
  1035. Assert.True (menu.ProcessHotKey (new (Key.F9, new KeyModifiers ())));
  1036. Assert.False (menu.IsMenuOpen);
  1037. Application.Top.Redraw (Application.Top.Bounds);
  1038. expected = @"
  1039. File Edit
  1040. ";
  1041. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  1042. Assert.Equal (new Rect (2, 0, 13, 1), pos);
  1043. // Without HotKeys
  1044. menu = new MenuBar (new MenuBarItem [] {
  1045. new MenuBarItem ("File", new MenuItem [] {
  1046. new MenuItem ("New", "", null)
  1047. }),
  1048. new MenuBarItem ("Edit", new MenuItem [] {
  1049. new MenuItem ("Copy", "", null)
  1050. })
  1051. });
  1052. Assert.True (menu.ProcessHotKey (new (Key.F9, new KeyModifiers ())));
  1053. Assert.True (menu.IsMenuOpen);
  1054. Application.Top.Redraw (Application.Top.Bounds);
  1055. expected = @"
  1056. File Edit
  1057. ┌──────┐
  1058. │ New │
  1059. └──────┘
  1060. ";
  1061. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  1062. Assert.Equal (new Rect (2, 0, 13, 4), pos);
  1063. Assert.True (Application.Top.Subviews [1].ProcessKey (new (Key.CursorRight, null)));
  1064. Assert.True (menu.IsMenuOpen);
  1065. Application.Top.Redraw (Application.Top.Bounds);
  1066. expected = @"
  1067. File Edit
  1068. ┌───────┐
  1069. │ Copy │
  1070. └───────┘
  1071. ";
  1072. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  1073. Assert.Equal (new Rect (2, 0, 16, 4), pos);
  1074. }
  1075. [Fact, AutoInitShutdown]
  1076. public void MenuBar_ButtonPressed_Open_The_Menu_ButtonPressed_Again_Close_The_Menu ()
  1077. {
  1078. var menu = new MenuBar (new MenuBarItem [] {
  1079. new MenuBarItem ("File", new MenuItem [] {
  1080. new MenuItem ("New", "", null)
  1081. }),
  1082. new MenuBarItem ("Edit", new MenuItem [] {
  1083. new MenuItem ("Copy", "", null)
  1084. })
  1085. });
  1086. Application.Top.Add (menu);
  1087. Assert.True (menu.MouseEvent (new MouseEvent () { X = 1, Y = 0, Flags = MouseFlags.Button1Pressed, View = menu }));
  1088. Assert.True (menu.IsMenuOpen);
  1089. Application.Top.Redraw (Application.Top.Bounds);
  1090. var expected = @"
  1091. File Edit
  1092. ┌──────┐
  1093. │ New │
  1094. └──────┘
  1095. ";
  1096. var pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  1097. Assert.Equal (new Rect (2, 0, 13, 4), pos);
  1098. Assert.True (menu.MouseEvent (new MouseEvent () { X = 1, Y = 0, Flags = MouseFlags.Button1Pressed, View = menu }));
  1099. Assert.False (menu.IsMenuOpen);
  1100. Application.Top.Redraw (Application.Top.Bounds);
  1101. expected = @"
  1102. File Edit
  1103. ";
  1104. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  1105. Assert.Equal (new Rect (2, 0, 13, 1), pos);
  1106. }
  1107. }
  1108. }