MenuTests.cs 34 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064
  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.AssertDriverContentsWithFrameAre (expected, output);
  465. Assert.Equal (new Rect (0, 1, 8, 4), 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.AssertDriverContentsWithFrameAre (expected, output);
  489. Assert.Equal (new Rect (0, 0, 7, 4), 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.AssertDriverContentsWithFrameAre (expected, output);
  500. Assert.Equal (new Rect (1, 0, 7, 3), 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.AssertDriverContentsWithFrameAre (expected, output);
  513. Assert.Equal (new Rect (0, 1, 7, 4), 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.AssertDriverContentsWithFrameAre (expected, output);
  525. Assert.Equal (new Rect (0, 1, 7, 3), pos);
  526. }
  527. [Fact, AutoInitShutdown]
  528. public void UseSubMenusSingleFrame_False_By_Keyboard ()
  529. {
  530. var menu = new MenuBar (new MenuBarItem [] {
  531. new MenuBarItem ("Numbers", new MenuItem [] {
  532. new MenuItem ("One", "", null),
  533. new MenuBarItem ("Two", new MenuItem [] {
  534. new MenuItem ("Sub-Menu 1", "", null),
  535. new MenuItem ("Sub-Menu 2", "", null)
  536. }),
  537. new MenuItem ("Three", "", null),
  538. })
  539. });
  540. Application.Top.Add (menu);
  541. Assert.Equal (Point.Empty, new Point (menu.Frame.X, menu.Frame.Y));
  542. Assert.False (menu.UseSubMenusSingleFrame);
  543. Application.Top.Redraw (Application.Top.Bounds);
  544. var expected = @"
  545. Numbers
  546. ";
  547. var pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  548. Assert.Equal (new Rect (2, 0, 9, 1), pos);
  549. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, null)));
  550. Application.Top.Redraw (Application.Top.Bounds);
  551. expected = @"
  552. Numbers
  553. ┌────────┐
  554. │ One │
  555. │ Two ►│
  556. │ Three │
  557. └────────┘
  558. ";
  559. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  560. Assert.Equal (new Rect (2, 0, 10, 6), pos);
  561. Assert.True (Application.Top.Subviews [1].ProcessKey (new KeyEvent (Key.CursorDown, null)));
  562. Application.Top.Redraw (Application.Top.Bounds);
  563. expected = @"
  564. Numbers
  565. ┌────────┐
  566. │ One │
  567. │ Two ►│┌─────────────┐
  568. │ Three ││ Sub-Menu 1 │
  569. └────────┘│ Sub-Menu 2 │
  570. └─────────────┘
  571. ";
  572. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  573. Assert.Equal (new Rect (2, 0, 25, 7), pos);
  574. Assert.True (Application.Top.Subviews [2].ProcessKey (new KeyEvent (Key.CursorLeft, null)));
  575. Application.Top.Redraw (Application.Top.Bounds);
  576. expected = @"
  577. Numbers
  578. ┌────────┐
  579. │ One │
  580. │ Two ►│
  581. │ Three │
  582. └────────┘
  583. ";
  584. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  585. Assert.Equal (new Rect (2, 0, 10, 6), pos);
  586. Assert.True (Application.Top.Subviews [1].ProcessKey (new KeyEvent (Key.Esc, null)));
  587. Application.Top.Redraw (Application.Top.Bounds);
  588. expected = @"
  589. Numbers
  590. ";
  591. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  592. Assert.Equal (new Rect (2, 0, 9, 1), pos);
  593. }
  594. [Fact, AutoInitShutdown]
  595. public void UseSubMenusSingleFrame_False_By_Mouse ()
  596. {
  597. var menu = new MenuBar (new MenuBarItem [] {
  598. new MenuBarItem ("Numbers", new MenuItem [] {
  599. new MenuItem ("One", "", null),
  600. new MenuBarItem ("Two", new MenuItem [] {
  601. new MenuItem ("Sub-Menu 1", "", null),
  602. new MenuItem ("Sub-Menu 2", "", null)
  603. }),
  604. new MenuItem ("Three", "", null),
  605. })
  606. });
  607. Application.Top.Add (menu);
  608. Assert.Equal (Point.Empty, new Point (menu.Frame.X, menu.Frame.Y));
  609. Assert.False (menu.UseSubMenusSingleFrame);
  610. Application.Top.Redraw (Application.Top.Bounds);
  611. var expected = @"
  612. Numbers
  613. ";
  614. var pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  615. Assert.Equal (new Rect (2, 0, 9, 1), pos);
  616. Assert.True (menu.MouseEvent (new MouseEvent () {
  617. X = 1,
  618. Y = 0,
  619. Flags = MouseFlags.Button1Pressed,
  620. View = menu
  621. }));
  622. Application.Top.Redraw (Application.Top.Bounds);
  623. expected = @"
  624. Numbers
  625. ┌────────┐
  626. │ One │
  627. │ Two ►│
  628. │ Three │
  629. └────────┘
  630. ";
  631. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  632. Assert.Equal (new Rect (2, 0, 10, 6), pos);
  633. Assert.False (menu.MouseEvent (new MouseEvent () {
  634. X = 1,
  635. Y = 3,
  636. Flags = MouseFlags.ReportMousePosition,
  637. View = Application.Top.Subviews [1]
  638. }));
  639. Application.Top.Redraw (Application.Top.Bounds);
  640. expected = @"
  641. Numbers
  642. ┌────────┐
  643. │ One │
  644. │ Two ►│┌─────────────┐
  645. │ Three ││ Sub-Menu 1 │
  646. └────────┘│ Sub-Menu 2 │
  647. └─────────────┘
  648. ";
  649. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  650. Assert.Equal (new Rect (2, 0, 25, 7), pos);
  651. Assert.False (menu.MouseEvent (new MouseEvent () {
  652. X = 1,
  653. Y = 2,
  654. Flags = MouseFlags.ReportMousePosition,
  655. View = Application.Top.Subviews [1]
  656. }));
  657. Application.Top.Redraw (Application.Top.Bounds);
  658. expected = @"
  659. Numbers
  660. ┌────────┐
  661. │ One │
  662. │ Two ►│
  663. │ Three │
  664. └────────┘
  665. ";
  666. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  667. Assert.Equal (new Rect (2, 0, 10, 6), pos);
  668. Assert.False (menu.MouseEvent (new MouseEvent () {
  669. X = 70,
  670. Y = 2,
  671. Flags = MouseFlags.Button1Clicked,
  672. View = Application.Top
  673. }));
  674. Application.Top.Redraw (Application.Top.Bounds);
  675. expected = @"
  676. Numbers
  677. ";
  678. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  679. Assert.Equal (new Rect (2, 0, 9, 1), pos);
  680. }
  681. [Fact, AutoInitShutdown]
  682. public void UseSubMenusSingleFrame_True_By_Keyboard ()
  683. {
  684. var menu = new MenuBar (new MenuBarItem [] {
  685. new MenuBarItem ("Numbers", new MenuItem [] {
  686. new MenuItem ("One", "", null),
  687. new MenuBarItem ("Two", new MenuItem [] {
  688. new MenuItem ("Sub-Menu 1", "", null),
  689. new MenuItem ("Sub-Menu 2", "", null)
  690. }),
  691. new MenuItem ("Three", "", null),
  692. })
  693. });
  694. Application.Top.Add (menu);
  695. Assert.Equal (Point.Empty, new Point (menu.Frame.X, menu.Frame.Y));
  696. Assert.False (menu.UseSubMenusSingleFrame);
  697. menu.UseSubMenusSingleFrame = true;
  698. Assert.True (menu.UseSubMenusSingleFrame);
  699. Application.Top.Redraw (Application.Top.Bounds);
  700. var expected = @"
  701. Numbers
  702. ";
  703. var pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  704. Assert.Equal (new Rect (2, 0, 9, 1), pos);
  705. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, null)));
  706. Application.Top.Redraw (Application.Top.Bounds);
  707. expected = @"
  708. Numbers
  709. ┌────────┐
  710. │ One │
  711. │ Two ►│
  712. │ Three │
  713. └────────┘
  714. ";
  715. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  716. Assert.Equal (new Rect (2, 0, 10, 6), pos);
  717. Assert.True (Application.Top.Subviews [1].ProcessKey (new KeyEvent (Key.CursorDown, null)));
  718. Assert.True (Application.Top.Subviews [1].ProcessKey (new KeyEvent (Key.Enter, null)));
  719. Application.Top.Redraw (Application.Top.Bounds);
  720. expected = @"
  721. Numbers
  722. ┌─────────────┐
  723. │◄ Two │
  724. ├─────────────┤
  725. │ Sub-Menu 1 │
  726. │ Sub-Menu 2 │
  727. └─────────────┘
  728. ";
  729. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  730. Assert.Equal (new Rect (2, 0, 15, 7), pos);
  731. Assert.True (Application.Top.Subviews [2].ProcessKey (new KeyEvent (Key.Enter, null)));
  732. Application.Top.Redraw (Application.Top.Bounds);
  733. expected = @"
  734. Numbers
  735. ┌────────┐
  736. │ One │
  737. │ Two ►│
  738. │ Three │
  739. └────────┘
  740. ";
  741. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  742. Assert.Equal (new Rect (2, 0, 10, 6), pos);
  743. Assert.True (Application.Top.Subviews [1].ProcessKey (new KeyEvent (Key.Esc, null)));
  744. Application.Top.Redraw (Application.Top.Bounds);
  745. expected = @"
  746. Numbers
  747. ";
  748. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  749. Assert.Equal (new Rect (2, 0, 9, 1), pos);
  750. }
  751. [Fact, AutoInitShutdown]
  752. public void UseSubMenusSingleFrame_True_By_Mouse ()
  753. {
  754. var menu = new MenuBar (new MenuBarItem [] {
  755. new MenuBarItem ("Numbers", new MenuItem [] {
  756. new MenuItem ("One", "", null),
  757. new MenuBarItem ("Two", new MenuItem [] {
  758. new MenuItem ("Sub-Menu 1", "", null),
  759. new MenuItem ("Sub-Menu 2", "", null)
  760. }),
  761. new MenuItem ("Three", "", null),
  762. })
  763. });
  764. Application.Top.Add (menu);
  765. Assert.Equal (Point.Empty, new Point (menu.Frame.X, menu.Frame.Y));
  766. Assert.False (menu.UseSubMenusSingleFrame);
  767. menu.UseSubMenusSingleFrame = true;
  768. Assert.True (menu.UseSubMenusSingleFrame);
  769. Application.Top.Redraw (Application.Top.Bounds);
  770. var expected = @"
  771. Numbers
  772. ";
  773. var pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  774. Assert.Equal (new Rect (2, 0, 9, 1), pos);
  775. Assert.True (menu.MouseEvent (new MouseEvent () {
  776. X = 1,
  777. Y = 0,
  778. Flags = MouseFlags.Button1Pressed,
  779. View = menu
  780. }));
  781. Application.Top.Redraw (Application.Top.Bounds);
  782. expected = @"
  783. Numbers
  784. ┌────────┐
  785. │ One │
  786. │ Two ►│
  787. │ Three │
  788. └────────┘
  789. ";
  790. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  791. Assert.Equal (new Rect (2, 0, 10, 6), pos);
  792. Assert.False (menu.MouseEvent (new MouseEvent () {
  793. X = 1,
  794. Y = 3,
  795. Flags = MouseFlags.Button1Clicked,
  796. View = Application.Top.Subviews [1]
  797. }));
  798. Application.Top.Redraw (Application.Top.Bounds);
  799. expected = @"
  800. Numbers
  801. ┌─────────────┐
  802. │◄ Two │
  803. ├─────────────┤
  804. │ Sub-Menu 1 │
  805. │ Sub-Menu 2 │
  806. └─────────────┘
  807. ";
  808. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  809. Assert.Equal (new Rect (2, 0, 15, 7), pos);
  810. Assert.False (menu.MouseEvent (new MouseEvent () {
  811. X = 1,
  812. Y = 2,
  813. Flags = MouseFlags.Button1Clicked,
  814. View = Application.Top.Subviews [2]
  815. }));
  816. Application.Top.Redraw (Application.Top.Bounds);
  817. expected = @"
  818. Numbers
  819. ┌────────┐
  820. │ One │
  821. │ Two ►│
  822. │ Three │
  823. └────────┘
  824. ";
  825. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  826. Assert.Equal (new Rect (2, 0, 10, 6), pos);
  827. Assert.False (menu.MouseEvent (new MouseEvent () {
  828. X = 70,
  829. Y = 2,
  830. Flags = MouseFlags.Button1Clicked,
  831. View = Application.Top
  832. }));
  833. Application.Top.Redraw (Application.Top.Bounds);
  834. expected = @"
  835. Numbers
  836. ";
  837. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  838. Assert.Equal (new Rect (2, 0, 9, 1), pos);
  839. }
  840. [Fact, AutoInitShutdown]
  841. public void HotKey_MenuBar_OnKeyDown_OnKeyUp_ProcessHotKey_ProcessKey ()
  842. {
  843. var newAction = false;
  844. var copyAction = false;
  845. var menu = new MenuBar (new MenuBarItem [] {
  846. new MenuBarItem ("_File", new MenuItem [] {
  847. new MenuItem ("_New", "", () => newAction = true)
  848. }),
  849. new MenuBarItem ("_Edit", new MenuItem [] {
  850. new MenuItem ("_Copy", "", () => copyAction = true)
  851. })
  852. });
  853. Application.Top.Add (menu);
  854. Assert.False (newAction);
  855. Assert.False (copyAction);
  856. Assert.False (menu.OnKeyDown (new (Key.AltMask, new KeyModifiers () { Alt = true })));
  857. Assert.True (menu.OnKeyUp (new (Key.AltMask, new KeyModifiers () { Alt = true })));
  858. Assert.True (menu.IsMenuOpen);
  859. Application.Top.Redraw (Application.Top.Bounds);
  860. var expected = @"
  861. File Edit
  862. ";
  863. var pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  864. Assert.Equal (new Rect (2, 0, 13, 1), pos);
  865. Assert.True (menu.ProcessKey (new (Key.N, null)));
  866. Application.MainLoop.MainIteration ();
  867. Assert.True (newAction);
  868. Assert.True (menu.ProcessHotKey (new (Key.AltMask, new KeyModifiers () { Alt = true })));
  869. Assert.True (menu.IsMenuOpen);
  870. Application.Top.Redraw (Application.Top.Bounds);
  871. expected = @"
  872. File Edit
  873. ";
  874. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  875. Assert.Equal (new Rect (2, 0, 13, 1), pos);
  876. Assert.True (menu.ProcessKey (new (Key.CursorRight, null)));
  877. Assert.True (menu.ProcessKey (new (Key.C, null)));
  878. Application.MainLoop.MainIteration ();
  879. Assert.True (copyAction);
  880. }
  881. [Fact, AutoInitShutdown]
  882. public void HotKey_MenuBar_ProcessHotKey_Menu_ProcessKey ()
  883. {
  884. var newAction = false;
  885. var copyAction = false;
  886. var menu = new MenuBar (new MenuBarItem [] {
  887. new MenuBarItem ("_File", new MenuItem [] {
  888. new MenuItem ("_New", "", () => newAction = true)
  889. }),
  890. new MenuBarItem ("_Edit", new MenuItem [] {
  891. new MenuItem ("_Copy", "", () => copyAction = true)
  892. })
  893. });
  894. Application.Top.Add (menu);
  895. Assert.False (newAction);
  896. Assert.False (copyAction);
  897. Assert.True (menu.ProcessHotKey (new (Key.AltMask | Key.F, new KeyModifiers () { Alt = true })));
  898. Assert.True (menu.IsMenuOpen);
  899. Application.Top.Redraw (Application.Top.Bounds);
  900. var expected = @"
  901. File Edit
  902. ┌───────┐
  903. │ New │
  904. └───────┘
  905. ";
  906. var pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  907. Assert.Equal (new Rect (2, 0, 13, 4), pos);
  908. Assert.True (Application.Top.Subviews [1].ProcessKey (new (Key.N, null)));
  909. Application.MainLoop.MainIteration ();
  910. Assert.True (newAction);
  911. Assert.True (menu.ProcessHotKey (new (Key.AltMask | Key.E, new KeyModifiers () { Alt = true })));
  912. Assert.True (menu.IsMenuOpen);
  913. Application.Top.Redraw (Application.Top.Bounds);
  914. expected = @"
  915. File Edit
  916. ┌────────┐
  917. │ Copy │
  918. └────────┘
  919. ";
  920. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  921. Assert.Equal (new Rect (2, 0, 17, 4), pos);
  922. Assert.True (Application.Top.Subviews [1].ProcessKey (new (Key.C, null)));
  923. Application.MainLoop.MainIteration ();
  924. Assert.True (copyAction);
  925. }
  926. }
  927. }