MenuTests.cs 61 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using Xunit;
  5. using Xunit.Abstractions;
  6. //using static Terminal.Gui.ViewTests.MenuTests;
  7. namespace Terminal.Gui.MenuTests {
  8. public class MenuTests {
  9. readonly ITestOutputHelper output;
  10. public MenuTests (ITestOutputHelper output)
  11. {
  12. this.output = output;
  13. }
  14. [Fact]
  15. public void Constuctors_Defaults ()
  16. {
  17. var menu = new Menu (new MenuBar (), 0, 0, new MenuBarItem ());
  18. Assert.Equal (Colors.Menu, menu.ColorScheme);
  19. Assert.True (menu.CanFocus);
  20. Assert.False (menu.WantContinuousButtonPressed);
  21. var menuBar = new MenuBar ();
  22. Assert.Equal (0, menuBar.X);
  23. Assert.Equal (0, menuBar.Y);
  24. Assert.IsType<Dim.DimFill> (menuBar.Width);
  25. Assert.Equal (1, menuBar.Height);
  26. Assert.Empty (menuBar.Menus);
  27. Assert.Equal (Colors.Menu, menuBar.ColorScheme);
  28. Assert.True (menuBar.WantMousePositionReports);
  29. Assert.False (menuBar.IsMenuOpen);
  30. menuBar = new MenuBar (new MenuBarItem [] { });
  31. Assert.Equal (0, menuBar.X);
  32. Assert.Equal (0, menuBar.Y);
  33. Assert.IsType<Dim.DimFill> (menuBar.Width);
  34. Assert.Equal (1, menuBar.Height);
  35. Assert.Empty (menuBar.Menus);
  36. Assert.Equal (Colors.Menu, menuBar.ColorScheme);
  37. Assert.True (menuBar.WantMousePositionReports);
  38. Assert.False (menuBar.IsMenuOpen);
  39. var menuBarItem = new MenuBarItem ();
  40. Assert.Equal ("", menuBarItem.Title);
  41. Assert.Null (menuBarItem.Parent);
  42. Assert.Empty (menuBarItem.Children);
  43. menuBarItem = new MenuBarItem (new MenuBarItem [] { });
  44. Assert.Equal ("", menuBarItem.Title);
  45. Assert.Null (menuBarItem.Parent);
  46. Assert.Empty (menuBarItem.Children);
  47. menuBarItem = new MenuBarItem ("Test", new MenuBarItem [] { });
  48. Assert.Equal ("Test", menuBarItem.Title);
  49. Assert.Null (menuBarItem.Parent);
  50. Assert.Empty (menuBarItem.Children);
  51. menuBarItem = new MenuBarItem ("Test", new List<MenuItem []> ());
  52. Assert.Equal ("Test", menuBarItem.Title);
  53. Assert.Null (menuBarItem.Parent);
  54. Assert.Empty (menuBarItem.Children);
  55. menuBarItem = new MenuBarItem ("Test", "Help", null);
  56. Assert.Equal ("Test", menuBarItem.Title);
  57. Assert.Equal ("Help", menuBarItem.Help);
  58. Assert.Null (menuBarItem.Action);
  59. Assert.Null (menuBarItem.CanExecute);
  60. Assert.Null (menuBarItem.Parent);
  61. Assert.Equal (Key.Null, menuBarItem.Shortcut);
  62. var menuItem = new MenuItem ();
  63. Assert.Equal ("", menuItem.Title);
  64. Assert.Equal ("", menuItem.Help);
  65. Assert.Null (menuItem.Action);
  66. Assert.Null (menuItem.CanExecute);
  67. Assert.Null (menuItem.Parent);
  68. Assert.Equal (Key.Null, menuItem.Shortcut);
  69. menuItem = new MenuItem ("Test", "Help", Run, () => { return true; }, new MenuItem (), Key.F1);
  70. Assert.Equal ("Test", menuItem.Title);
  71. Assert.Equal ("Help", menuItem.Help);
  72. Assert.Equal (Run, menuItem.Action);
  73. Assert.NotNull (menuItem.CanExecute);
  74. Assert.NotNull (menuItem.Parent);
  75. Assert.Equal (Key.F1, menuItem.Shortcut);
  76. void Run () { }
  77. }
  78. [Fact]
  79. public void Exceptions ()
  80. {
  81. Assert.Throws<ArgumentNullException> (() => new MenuBarItem ("Test", (MenuItem [])null, null));
  82. Assert.Throws<ArgumentNullException> (() => new MenuBarItem ("Test", (List<MenuItem []>)null, null));
  83. }
  84. [Fact]
  85. [AutoInitShutdown]
  86. public void MenuOpening_MenuOpened_MenuClosing_Events ()
  87. {
  88. var miAction = "";
  89. var isMenuClosed = true;
  90. var cancelClosing = false;
  91. var menu = new MenuBar (new MenuBarItem [] {
  92. new MenuBarItem ("_File", new MenuItem [] {
  93. new MenuItem ("_New", "Creates new file.", New)
  94. })
  95. });
  96. menu.MenuOpening += (e) => {
  97. Assert.Equal ("_File", e.CurrentMenu.Title);
  98. Assert.Equal ("_New", e.CurrentMenu.Children [0].Title);
  99. Assert.Equal ("Creates new file.", e.CurrentMenu.Children [0].Help);
  100. Assert.Equal (New, e.CurrentMenu.Children [0].Action);
  101. e.CurrentMenu.Children [0].Action ();
  102. Assert.Equal ("New", miAction);
  103. e.NewMenuBarItem = new MenuBarItem ("_Edit", new MenuItem [] {
  104. new MenuItem ("_Copy", "Copies the selection.", Copy)
  105. });
  106. };
  107. menu.MenuOpened += (e) => {
  108. Assert.Equal ("_Edit", e.Parent.Title);
  109. Assert.Equal ("_Copy", e.Title);
  110. Assert.Equal ("Copies the selection.", e.Help);
  111. Assert.Equal (Copy, e.Action);
  112. e.Action ();
  113. Assert.Equal ("Copy", miAction);
  114. };
  115. menu.MenuClosing += (e) => {
  116. Assert.False (isMenuClosed);
  117. if (cancelClosing) {
  118. e.Cancel = true;
  119. isMenuClosed = false;
  120. } else {
  121. isMenuClosed = true;
  122. }
  123. };
  124. Application.Top.Add (menu);
  125. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, new KeyModifiers ())));
  126. Assert.True (menu.IsMenuOpen);
  127. isMenuClosed = !menu.IsMenuOpen;
  128. Assert.False (isMenuClosed);
  129. Application.Top.Redraw (Application.Top.Bounds);
  130. var expected = @"
  131. Edit
  132. ┌──────────────────────────────┐
  133. │ Copy Copies the selection. │
  134. └──────────────────────────────┘
  135. ";
  136. TestHelpers.AssertDriverContentsAre (expected, output);
  137. cancelClosing = true;
  138. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, new KeyModifiers ())));
  139. Assert.True (menu.IsMenuOpen);
  140. Assert.False (isMenuClosed);
  141. Application.Top.Redraw (Application.Top.Bounds);
  142. expected = @"
  143. Edit
  144. ┌──────────────────────────────┐
  145. │ Copy Copies the selection. │
  146. └──────────────────────────────┘
  147. ";
  148. TestHelpers.AssertDriverContentsAre (expected, output);
  149. cancelClosing = false;
  150. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, new KeyModifiers ())));
  151. Assert.False (menu.IsMenuOpen);
  152. Assert.True (isMenuClosed);
  153. Application.Top.Redraw (Application.Top.Bounds);
  154. expected = @"
  155. Edit
  156. ";
  157. TestHelpers.AssertDriverContentsAre (expected, output);
  158. void New () => miAction = "New";
  159. void Copy () => miAction = "Copy";
  160. }
  161. [Fact, AutoInitShutdown]
  162. public void MenuOpened_On_Disabled_MenuItem ()
  163. {
  164. MenuItem miCurrent = null;
  165. Menu mCurrent = null;
  166. var menu = new MenuBar (new MenuBarItem [] {
  167. new MenuBarItem ("_File", new MenuItem [] {
  168. new MenuBarItem ("_New", new MenuItem [] {
  169. new MenuItem ("_New doc", "Creates new doc.", null, () => false)
  170. }),
  171. null,
  172. new MenuItem ("_Save", "Saves the file.", null, null)
  173. })
  174. });
  175. menu.MenuOpened += (e) => {
  176. miCurrent = e;
  177. mCurrent = menu.openMenu;
  178. };
  179. menu.UseKeysUpDownAsKeysLeftRight = true;
  180. Application.Top.Add (menu);
  181. // open the menu
  182. Assert.True (menu.MouseEvent (new MouseEvent () {
  183. X = 1,
  184. Y = 0,
  185. Flags = MouseFlags.Button1Pressed,
  186. View = menu
  187. }));
  188. Assert.True (menu.IsMenuOpen);
  189. Assert.Equal ("_File", miCurrent.Parent.Title);
  190. Assert.Equal ("_New", miCurrent.Title);
  191. Assert.True (mCurrent.MouseEvent (new MouseEvent () {
  192. X = 1,
  193. Y = 1,
  194. Flags = MouseFlags.ReportMousePosition,
  195. View = mCurrent
  196. }));
  197. Assert.True (menu.IsMenuOpen);
  198. Assert.Null (miCurrent);
  199. Assert.True (mCurrent.MouseEvent (new MouseEvent () {
  200. X = 1,
  201. Y = 2,
  202. Flags = MouseFlags.ReportMousePosition,
  203. View = mCurrent
  204. }));
  205. Assert.True (menu.IsMenuOpen);
  206. Assert.Null (miCurrent);
  207. Assert.True (mCurrent.MouseEvent (new MouseEvent () {
  208. X = 1,
  209. Y = 3,
  210. Flags = MouseFlags.ReportMousePosition,
  211. View = mCurrent
  212. }));
  213. Assert.True (menu.IsMenuOpen);
  214. Assert.Null (miCurrent);
  215. // close the menu
  216. Assert.True (menu.MouseEvent (new MouseEvent () {
  217. X = 1,
  218. Y = 0,
  219. Flags = MouseFlags.Button1Pressed,
  220. View = menu
  221. }));
  222. Assert.False (menu.IsMenuOpen);
  223. // open the menu
  224. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, new KeyModifiers ())));
  225. Assert.True (menu.IsMenuOpen);
  226. // The _New doc isn't enabled because it can't execute and so can't be selected
  227. Assert.Equal ("_File", miCurrent.Parent.Title);
  228. Assert.Equal ("_New", miCurrent.Title);
  229. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorDown, new KeyModifiers ())));
  230. Assert.True (menu.IsMenuOpen);
  231. Assert.Equal ("_File", miCurrent.Parent.Title);
  232. Assert.Equal ("_Save", miCurrent.Title);
  233. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorUp, new KeyModifiers ())));
  234. Assert.True (menu.IsMenuOpen);
  235. Assert.Null (miCurrent);
  236. // close the menu
  237. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, new KeyModifiers ())));
  238. Assert.False (menu.IsMenuOpen);
  239. }
  240. [Fact]
  241. [AutoInitShutdown]
  242. public void MouseEvent_Test ()
  243. {
  244. MenuItem miCurrent = null;
  245. Menu mCurrent = null;
  246. var menu = new MenuBar (new MenuBarItem [] {
  247. new MenuBarItem ("_File", new MenuItem [] {
  248. new MenuItem ("_New", "", null),
  249. new MenuItem ("_Open", "", null),
  250. new MenuItem ("_Save", "", null)
  251. }),
  252. new MenuBarItem ("_Edit", new MenuItem [] {
  253. new MenuItem ("_Copy", "", null),
  254. new MenuItem ("C_ut", "", null),
  255. new MenuItem ("_Paste", "", null)
  256. })
  257. });
  258. menu.MenuOpened += (e) => {
  259. miCurrent = e;
  260. mCurrent = menu.openCurrentMenu;
  261. };
  262. Application.Top.Add (menu);
  263. Assert.True (menu.MouseEvent (new MouseEvent () {
  264. X = 10,
  265. Y = 0,
  266. Flags = MouseFlags.Button1Pressed,
  267. View = menu
  268. }));
  269. Assert.True (menu.IsMenuOpen);
  270. Assert.Equal ("_Edit", miCurrent.Parent.Title);
  271. Assert.Equal ("_Copy", miCurrent.Title);
  272. Assert.True (mCurrent.MouseEvent (new MouseEvent () {
  273. X = 10,
  274. Y = 3,
  275. Flags = MouseFlags.ReportMousePosition,
  276. View = mCurrent
  277. }));
  278. Assert.True (menu.IsMenuOpen);
  279. Assert.Equal ("_Edit", miCurrent.Parent.Title);
  280. Assert.Equal ("_Paste", miCurrent.Title);
  281. for (int i = 2; i >= -1; i--) {
  282. if (i == -1) {
  283. Assert.False (mCurrent.MouseEvent (new MouseEvent () {
  284. X = 10,
  285. Y = i,
  286. Flags = MouseFlags.ReportMousePosition,
  287. View = menu
  288. }));
  289. } else {
  290. Assert.True (mCurrent.MouseEvent (new MouseEvent () {
  291. X = 10,
  292. Y = i,
  293. Flags = MouseFlags.ReportMousePosition,
  294. View = mCurrent
  295. }));
  296. }
  297. Assert.True (menu.IsMenuOpen);
  298. if (i == 2) {
  299. Assert.Equal ("_Edit", miCurrent.Parent.Title);
  300. Assert.Equal ("C_ut", miCurrent.Title);
  301. } else if (i == 1) {
  302. Assert.Equal ("_Edit", miCurrent.Parent.Title);
  303. Assert.Equal ("_Copy", miCurrent.Title);
  304. } else if (i == 0) {
  305. Assert.Equal ("_Edit", miCurrent.Parent.Title);
  306. Assert.Equal ("_Copy", miCurrent.Title);
  307. } else {
  308. Assert.Equal ("_Edit", miCurrent.Parent.Title);
  309. Assert.Equal ("_Copy", miCurrent.Title);
  310. }
  311. }
  312. }
  313. [Fact]
  314. [AutoInitShutdown]
  315. public void KeyBindings_Command ()
  316. {
  317. var miAction = "";
  318. MenuItem mbiCurrent = null;
  319. MenuItem miCurrent = null;
  320. Menu mCurrent = null;
  321. var menu = new MenuBar (new MenuBarItem [] {
  322. new MenuBarItem ("_File", new MenuItem [] {
  323. new MenuItem ("_New", "", () => miAction ="New"),
  324. new MenuItem ("_Open", "", () => miAction ="Open"),
  325. new MenuItem ("_Save", "", () => miAction ="Save"),
  326. null,
  327. new MenuItem ("_Quit", "", () => miAction ="Quit"),
  328. }),
  329. new MenuBarItem ("_Edit", new MenuItem [] {
  330. new MenuItem ("_Copy", "", () => miAction ="Copy"),
  331. new MenuItem ("C_ut", "", () => miAction ="Cut"),
  332. new MenuItem ("_Paste", "", () => miAction ="Paste"),
  333. new MenuBarItem ("_Find and Replace", new MenuItem [] {
  334. new MenuItem ("F_ind", "", null),
  335. new MenuItem ("_Replace", "", null)
  336. }),
  337. new MenuItem ("_Select All", "", () => miAction ="Select All")
  338. }),
  339. new MenuBarItem ("_About", "Top-Level", () => miAction ="About")
  340. });
  341. menu.MenuOpening += (e) => mbiCurrent = e.CurrentMenu;
  342. menu.MenuOpened += (e) => {
  343. miCurrent = e;
  344. mCurrent = menu.openCurrentMenu;
  345. };
  346. menu.MenuClosing += (_) => {
  347. mbiCurrent = null;
  348. miCurrent = null;
  349. mCurrent = null;
  350. };
  351. menu.UseKeysUpDownAsKeysLeftRight = true;
  352. Application.Top.Add (menu);
  353. Application.Begin (Application.Top);
  354. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, new KeyModifiers ())));
  355. Assert.True (menu.IsMenuOpen);
  356. Assert.Equal ("_File", GetCurrentMenuBarItemTitle ());
  357. Assert.Equal ("_New", GetCurrentMenuTitle ());
  358. Assert.True (menu.ProcessKey (new KeyEvent (Key.CursorLeft, new KeyModifiers ())));
  359. Assert.True (menu.IsMenuOpen);
  360. Assert.Equal ("_About", GetCurrentMenuBarItemTitle ());
  361. Assert.Equal ("_About", GetCurrentMenuTitle ());
  362. Assert.True (menu.ProcessKey (new KeyEvent (Key.CursorRight, 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.Esc, new KeyModifiers ())));
  367. Assert.False (menu.IsMenuOpen);
  368. Assert.Equal ("Closed", GetCurrentMenuBarItemTitle ());
  369. Assert.Equal ("None", GetCurrentMenuTitle ());
  370. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, new KeyModifiers ())));
  371. Assert.True (menu.IsMenuOpen);
  372. Assert.Equal ("_File", GetCurrentMenuBarItemTitle ());
  373. Assert.Equal ("_New", GetCurrentMenuTitle ());
  374. Assert.True (menu.ProcessKey (new KeyEvent (Key.C | Key.CtrlMask, new KeyModifiers ())));
  375. Assert.False (menu.IsMenuOpen);
  376. Assert.Equal ("Closed", GetCurrentMenuBarItemTitle ());
  377. Assert.Equal ("None", GetCurrentMenuTitle ());
  378. Assert.True (menu.ProcessKey (new KeyEvent (Key.CursorDown, new KeyModifiers ())));
  379. Assert.True (menu.IsMenuOpen);
  380. Assert.Equal ("_File", GetCurrentMenuBarItemTitle ());
  381. Assert.Equal ("_New", GetCurrentMenuTitle ());
  382. Assert.True (menu.ProcessKey (new KeyEvent (Key.Esc, new KeyModifiers ())));
  383. Assert.False (menu.IsMenuOpen);
  384. Assert.Equal ("Closed", GetCurrentMenuBarItemTitle ());
  385. Assert.Equal ("None", GetCurrentMenuTitle ());
  386. Assert.True (menu.ProcessKey (new KeyEvent (Key.Enter, new KeyModifiers ())));
  387. Assert.True (menu.IsMenuOpen);
  388. Assert.Equal ("_File", GetCurrentMenuBarItemTitle ());
  389. Assert.Equal ("_New", GetCurrentMenuTitle ());
  390. Assert.False (mCurrent.ProcessKey (new KeyEvent (Key.Tab, new KeyModifiers ())));
  391. Assert.True (menu.IsMenuOpen);
  392. Assert.True (Application.Top.ProcessKey (new KeyEvent (Key.Tab, new KeyModifiers ())));
  393. Assert.False (menu.IsMenuOpen);
  394. Assert.Equal ("Closed", GetCurrentMenuBarItemTitle ());
  395. Assert.Equal ("None", GetCurrentMenuTitle ());
  396. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, new KeyModifiers ())));
  397. Assert.True (menu.IsMenuOpen);
  398. Assert.Equal ("_File", GetCurrentMenuBarItemTitle ());
  399. Assert.Equal ("_New", GetCurrentMenuTitle ());
  400. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorUp, new KeyModifiers ())));
  401. Assert.True (menu.IsMenuOpen);
  402. Assert.Equal ("_File", GetCurrentMenuBarItemTitle ());
  403. Assert.Equal ("_Quit", GetCurrentMenuTitle ());
  404. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorDown, new KeyModifiers ())));
  405. Assert.True (menu.IsMenuOpen);
  406. Assert.Equal ("_File", GetCurrentMenuBarItemTitle ());
  407. Assert.Equal ("_New", GetCurrentMenuTitle ());
  408. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorLeft, new KeyModifiers ())));
  409. Assert.True (menu.IsMenuOpen);
  410. Assert.Equal ("_About", GetCurrentMenuBarItemTitle ());
  411. Assert.Equal ("_About", GetCurrentMenuTitle ());
  412. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorRight, new KeyModifiers ())));
  413. Assert.True (menu.IsMenuOpen);
  414. Assert.Equal ("_File", GetCurrentMenuBarItemTitle ());
  415. Assert.Equal ("_New", GetCurrentMenuTitle ());
  416. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.Esc, new KeyModifiers ())));
  417. Assert.False (menu.IsMenuOpen);
  418. Assert.Equal ("Closed", GetCurrentMenuBarItemTitle ());
  419. Assert.Equal ("None", GetCurrentMenuTitle ());
  420. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, new KeyModifiers ())));
  421. Assert.True (menu.IsMenuOpen);
  422. Assert.Equal ("_File", GetCurrentMenuBarItemTitle ());
  423. Assert.Equal ("_New", GetCurrentMenuTitle ());
  424. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.Enter, new KeyModifiers ())));
  425. Assert.False (menu.IsMenuOpen);
  426. Assert.Equal ("Closed", GetCurrentMenuBarItemTitle ());
  427. Assert.Equal ("None", GetCurrentMenuTitle ());
  428. Application.MainLoop.MainIteration ();
  429. Assert.Equal ("New", miAction);
  430. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, new KeyModifiers ())));
  431. Assert.True (menu.IsMenuOpen);
  432. Assert.Equal ("_File", GetCurrentMenuBarItemTitle ());
  433. Assert.Equal ("_New", GetCurrentMenuTitle ());
  434. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorLeft, new KeyModifiers ())));
  435. Assert.True (menu.IsMenuOpen);
  436. Assert.Equal ("_About", GetCurrentMenuBarItemTitle ());
  437. Assert.Equal ("_About", GetCurrentMenuTitle ());
  438. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.Enter, new KeyModifiers ())));
  439. Assert.False (menu.IsMenuOpen);
  440. Assert.Equal ("Closed", GetCurrentMenuBarItemTitle ());
  441. Assert.Equal ("None", GetCurrentMenuTitle ());
  442. Application.MainLoop.MainIteration ();
  443. Assert.Equal ("About", miAction);
  444. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, new KeyModifiers ())));
  445. Assert.True (menu.IsMenuOpen);
  446. Assert.Equal ("_File", GetCurrentMenuBarItemTitle ());
  447. Assert.Equal ("_New", GetCurrentMenuTitle ());
  448. Assert.True (menu.ProcessKey (new KeyEvent (Key.CursorRight, new KeyModifiers ())));
  449. Assert.True (menu.IsMenuOpen);
  450. Assert.Equal ("_Edit", GetCurrentMenuBarItemTitle ());
  451. Assert.Equal ("_Copy", 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 ("C_ut", GetCurrentMenuTitle ());
  456. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorDown, new KeyModifiers ())));
  457. Assert.True (menu.IsMenuOpen);
  458. Assert.Equal ("_Edit", GetCurrentMenuBarItemTitle ());
  459. Assert.Equal ("_Edit", GetCurrenParenttMenuItemTitle ());
  460. Assert.Equal ("_Paste", GetCurrentMenuTitle ());
  461. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorDown, new KeyModifiers ())));
  462. Assert.True (menu.IsMenuOpen);
  463. Assert.Equal ("_Edit", GetCurrentMenuBarItemTitle ());
  464. Assert.Equal ("_Find and Replace", GetCurrenParenttMenuItemTitle ());
  465. Assert.Equal ("F_ind", GetCurrentMenuTitle ());
  466. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorDown, new KeyModifiers ())));
  467. Assert.True (menu.IsMenuOpen);
  468. Assert.Equal ("_Edit", GetCurrentMenuBarItemTitle ());
  469. Assert.Equal ("_Find and Replace", GetCurrenParenttMenuItemTitle ());
  470. Assert.Equal ("_Replace", GetCurrentMenuTitle ());
  471. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorDown, new KeyModifiers ())));
  472. Assert.True (menu.IsMenuOpen);
  473. Assert.Equal ("_Edit", GetCurrentMenuBarItemTitle ());
  474. Assert.Equal ("_Find and Replace", GetCurrenParenttMenuItemTitle ());
  475. Assert.Equal ("F_ind", GetCurrentMenuTitle ());
  476. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorLeft, new KeyModifiers ())));
  477. Assert.True (menu.IsMenuOpen);
  478. Assert.Equal ("_Edit", GetCurrentMenuBarItemTitle ());
  479. Assert.Equal ("_Edit", GetCurrenParenttMenuItemTitle ());
  480. Assert.Equal ("_Find and Replace", GetCurrentMenuTitle ());
  481. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorDown, new KeyModifiers ())));
  482. Assert.True (menu.IsMenuOpen);
  483. Assert.Equal ("_Edit", GetCurrentMenuBarItemTitle ());
  484. Assert.Equal ("_Edit", GetCurrenParenttMenuItemTitle ());
  485. Assert.Equal ("_Select All", GetCurrentMenuTitle ());
  486. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorUp, new KeyModifiers ())));
  487. Assert.True (menu.IsMenuOpen);
  488. Assert.Equal ("_Edit", GetCurrentMenuBarItemTitle ());
  489. Assert.Equal ("_Find and Replace", GetCurrenParenttMenuItemTitle ());
  490. Assert.Equal ("F_ind", GetCurrentMenuTitle ());
  491. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorUp, new KeyModifiers ())));
  492. Assert.True (menu.IsMenuOpen);
  493. Assert.Equal ("_Edit", GetCurrentMenuBarItemTitle ());
  494. Assert.Equal ("_Edit", GetCurrenParenttMenuItemTitle ());
  495. Assert.Equal ("_Find and Replace", 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 ("_Edit", GetCurrenParenttMenuItemTitle ());
  500. Assert.Equal ("_Paste", GetCurrentMenuTitle ());
  501. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorUp, new KeyModifiers ())));
  502. Assert.True (menu.IsMenuOpen);
  503. Assert.Equal ("_Edit", GetCurrentMenuBarItemTitle ());
  504. Assert.Equal ("C_ut", GetCurrentMenuTitle ());
  505. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorUp, new KeyModifiers ())));
  506. Assert.True (menu.IsMenuOpen);
  507. Assert.Equal ("_Edit", GetCurrentMenuBarItemTitle ());
  508. Assert.Equal ("_Copy", GetCurrentMenuTitle ());
  509. Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.Enter, new KeyModifiers ())));
  510. Assert.False (menu.IsMenuOpen);
  511. Assert.Equal ("Closed", GetCurrentMenuBarItemTitle ());
  512. Assert.Equal ("None", GetCurrentMenuTitle ());
  513. Application.MainLoop.MainIteration ();
  514. Assert.Equal ("Copy", miAction);
  515. string GetCurrentMenuBarItemTitle ()
  516. {
  517. return mbiCurrent != null ? mbiCurrent.Title.ToString () : "Closed";
  518. }
  519. string GetCurrenParenttMenuItemTitle ()
  520. {
  521. return miCurrent?.Parent != null ? miCurrent.Parent.Title.ToString () : "None";
  522. }
  523. string GetCurrentMenuTitle ()
  524. {
  525. return miCurrent != null ? miCurrent.Title.ToString () : "None";
  526. }
  527. }
  528. [Fact, AutoInitShutdown]
  529. public void DrawFrame_With_Positive_Positions ()
  530. {
  531. var menu = new MenuBar (new MenuBarItem [] {
  532. new MenuBarItem (new MenuItem [] {
  533. new MenuItem ("One", "", null),
  534. new MenuItem ("Two", "", null)
  535. })
  536. });
  537. Assert.Equal (Point.Empty, new Point (menu.Frame.X, menu.Frame.Y));
  538. menu.OpenMenu ();
  539. Application.Begin (Application.Top);
  540. var expected = @"
  541. ┌──────┐
  542. │ One │
  543. │ Two │
  544. └──────┘
  545. ";
  546. var pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  547. Assert.Equal (new Rect (0, 1, 8, 4), pos);
  548. }
  549. [Fact, AutoInitShutdown]
  550. public void DrawFrame_With_Negative_Positions ()
  551. {
  552. var menu = new MenuBar (new MenuBarItem [] {
  553. new MenuBarItem (new MenuItem [] {
  554. new MenuItem ("One", "", null),
  555. new MenuItem ("Two", "", null)
  556. })
  557. }) {
  558. X = -1,
  559. Y = -1
  560. };
  561. Assert.Equal (new Point (-1, -1), new Point (menu.Frame.X, menu.Frame.Y));
  562. menu.OpenMenu ();
  563. Application.Begin (Application.Top);
  564. var expected = @"
  565. ──────┐
  566. One │
  567. Two │
  568. ──────┘
  569. ";
  570. var pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  571. Assert.Equal (new Rect (0, 0, 7, 4), pos);
  572. menu.CloseAllMenus ();
  573. menu.Frame = new Rect (-1, -2, menu.Frame.Width, menu.Frame.Height);
  574. menu.OpenMenu ();
  575. Application.Refresh ();
  576. expected = @"
  577. One │
  578. Two │
  579. ──────┘
  580. ";
  581. pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  582. Assert.Equal (new Rect (1, 0, 7, 3), pos);
  583. menu.CloseAllMenus ();
  584. menu.Frame = new Rect (0, 0, menu.Frame.Width, menu.Frame.Height);
  585. ((FakeDriver)Application.Driver).SetBufferSize (7, 5);
  586. menu.OpenMenu ();
  587. Application.Refresh ();
  588. expected = @"
  589. ┌──────
  590. │ One
  591. │ Two
  592. └──────
  593. ";
  594. pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  595. Assert.Equal (new Rect (0, 1, 7, 4), pos);
  596. menu.CloseAllMenus ();
  597. menu.Frame = new Rect (0, 0, menu.Frame.Width, menu.Frame.Height);
  598. ((FakeDriver)Application.Driver).SetBufferSize (7, 3);
  599. menu.OpenMenu ();
  600. Application.Refresh ();
  601. expected = @"
  602. ┌──────
  603. │ One
  604. │ Two
  605. ";
  606. pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  607. Assert.Equal (new Rect (0, 0, 7, 3), pos);
  608. }
  609. [Fact, AutoInitShutdown]
  610. public void UseSubMenusSingleFrame_False_By_Keyboard ()
  611. {
  612. var menu = new MenuBar (new MenuBarItem [] {
  613. new MenuBarItem ("Numbers", new MenuItem [] {
  614. new MenuItem ("One", "", null),
  615. new MenuBarItem ("Two", new MenuItem [] {
  616. new MenuItem ("Sub-Menu 1", "", null),
  617. new MenuItem ("Sub-Menu 2", "", null)
  618. }),
  619. new MenuItem ("Three", "", null),
  620. })
  621. });
  622. menu.UseKeysUpDownAsKeysLeftRight = true;
  623. Application.Top.Add (menu);
  624. Assert.Equal (Point.Empty, new Point (menu.Frame.X, menu.Frame.Y));
  625. Assert.False (menu.UseSubMenusSingleFrame);
  626. Application.Top.Redraw (Application.Top.Bounds);
  627. var expected = @"
  628. Numbers
  629. ";
  630. var pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  631. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, null)));
  632. Application.Top.Redraw (Application.Top.Bounds);
  633. expected = @"
  634. Numbers
  635. ┌────────┐
  636. │ One │
  637. │ Two ►│
  638. │ Three │
  639. └────────┘
  640. ";
  641. pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  642. Assert.True (Application.Top.Subviews [1].ProcessKey (new KeyEvent (Key.CursorDown, null)));
  643. Application.Top.Redraw (Application.Top.Bounds);
  644. expected = @"
  645. Numbers
  646. ┌────────┐
  647. │ One │
  648. │ Two ►│┌─────────────┐
  649. │ Three ││ Sub-Menu 1 │
  650. └────────┘│ Sub-Menu 2 │
  651. └─────────────┘
  652. ";
  653. pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  654. Assert.True (Application.Top.Subviews [2].ProcessKey (new KeyEvent (Key.CursorLeft, null)));
  655. Application.Top.Redraw (Application.Top.Bounds);
  656. expected = @"
  657. Numbers
  658. ┌────────┐
  659. │ One │
  660. │ Two ►│
  661. │ Three │
  662. └────────┘
  663. ";
  664. pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  665. Assert.True (Application.Top.Subviews [1].ProcessKey (new KeyEvent (Key.Esc, null)));
  666. Application.Top.Redraw (Application.Top.Bounds);
  667. expected = @"
  668. Numbers
  669. ";
  670. pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  671. }
  672. [Fact, AutoInitShutdown]
  673. public void UseSubMenusSingleFrame_False_By_Mouse ()
  674. {
  675. var menu = new MenuBar (new MenuBarItem [] {
  676. new MenuBarItem ("Numbers", new MenuItem [] {
  677. new MenuItem ("One", "", null),
  678. new MenuBarItem ("Two", new MenuItem [] {
  679. new MenuItem ("Sub-Menu 1", "", null),
  680. new MenuItem ("Sub-Menu 2", "", null)
  681. }),
  682. new MenuItem ("Three", "", null),
  683. })
  684. });
  685. Application.Top.Add (menu);
  686. Assert.Equal (Point.Empty, new Point (menu.Frame.X, menu.Frame.Y));
  687. Assert.False (menu.UseSubMenusSingleFrame);
  688. Application.Top.Redraw (Application.Top.Bounds);
  689. var expected = @"
  690. Numbers
  691. ";
  692. var pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  693. Assert.Equal (new Rect (1, 0, 8, 1), pos);
  694. Assert.True (menu.MouseEvent (new MouseEvent () {
  695. X = 1,
  696. Y = 0,
  697. Flags = MouseFlags.Button1Pressed,
  698. View = menu
  699. }));
  700. Application.Top.Redraw (Application.Top.Bounds);
  701. expected = @"
  702. Numbers
  703. ┌────────┐
  704. │ One │
  705. │ Two ►│
  706. │ Three │
  707. └────────┘
  708. ";
  709. pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  710. Assert.Equal (new Rect (1, 0, 10, 6), pos);
  711. Assert.False (menu.MouseEvent (new MouseEvent () {
  712. X = 1,
  713. Y = 3,
  714. Flags = MouseFlags.ReportMousePosition,
  715. View = Application.Top.Subviews [1]
  716. }));
  717. Application.Top.Redraw (Application.Top.Bounds);
  718. expected = @"
  719. Numbers
  720. ┌────────┐
  721. │ One │
  722. │ Two ►│┌─────────────┐
  723. │ Three ││ Sub-Menu 1 │
  724. └────────┘│ Sub-Menu 2 │
  725. └─────────────┘
  726. ";
  727. pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  728. Assert.Equal (new Rect (1, 0, 25, 7), pos);
  729. Assert.False (menu.MouseEvent (new MouseEvent () {
  730. X = 1,
  731. Y = 2,
  732. Flags = MouseFlags.ReportMousePosition,
  733. View = Application.Top.Subviews [1]
  734. }));
  735. Application.Top.Redraw (Application.Top.Bounds);
  736. expected = @"
  737. Numbers
  738. ┌────────┐
  739. │ One │
  740. │ Two ►│
  741. │ Three │
  742. └────────┘
  743. ";
  744. pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  745. Assert.Equal (new Rect (1, 0, 10, 6), pos);
  746. Assert.False (menu.MouseEvent (new MouseEvent () {
  747. X = 70,
  748. Y = 2,
  749. Flags = MouseFlags.Button1Clicked,
  750. View = Application.Top
  751. }));
  752. Application.Top.Redraw (Application.Top.Bounds);
  753. expected = @"
  754. Numbers
  755. ";
  756. pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  757. Assert.Equal (new Rect (1, 0, 8, 1), pos);
  758. }
  759. [Fact, AutoInitShutdown]
  760. public void UseSubMenusSingleFrame_True_By_Keyboard ()
  761. {
  762. var menu = new MenuBar (new MenuBarItem [] {
  763. new MenuBarItem ("Numbers", new MenuItem [] {
  764. new MenuItem ("One", "", null),
  765. new MenuBarItem ("Two", new MenuItem [] {
  766. new MenuItem ("Sub-Menu 1", "", null),
  767. new MenuItem ("Sub-Menu 2", "", null)
  768. }),
  769. new MenuItem ("Three", "", null),
  770. })
  771. });
  772. Application.Top.Add (menu);
  773. Assert.Equal (Point.Empty, new Point (menu.Frame.X, menu.Frame.Y));
  774. Assert.False (menu.UseSubMenusSingleFrame);
  775. menu.UseSubMenusSingleFrame = true;
  776. Assert.True (menu.UseSubMenusSingleFrame);
  777. Application.Top.Redraw (Application.Top.Bounds);
  778. var expected = @"
  779. Numbers
  780. ";
  781. var pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  782. Assert.Equal (new Rect (1, 0, 8, 1), pos);
  783. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, null)));
  784. Application.Top.Redraw (Application.Top.Bounds);
  785. expected = @"
  786. Numbers
  787. ┌────────┐
  788. │ One │
  789. │ Two ►│
  790. │ Three │
  791. └────────┘
  792. ";
  793. pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  794. Assert.Equal (new Rect (1, 0, 10, 6), pos);
  795. Assert.True (Application.Top.Subviews [1].ProcessKey (new KeyEvent (Key.CursorDown, null)));
  796. Assert.True (Application.Top.Subviews [1].ProcessKey (new KeyEvent (Key.Enter, null)));
  797. Application.Top.Redraw (Application.Top.Bounds);
  798. expected = @"
  799. Numbers
  800. ┌─────────────┐
  801. │◄ Two │
  802. ├─────────────┤
  803. │ Sub-Menu 1 │
  804. │ Sub-Menu 2 │
  805. └─────────────┘
  806. ";
  807. pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  808. Assert.Equal (new Rect (1, 0, 15, 7), pos);
  809. Assert.True (Application.Top.Subviews [2].ProcessKey (new KeyEvent (Key.Enter, null)));
  810. Application.Top.Redraw (Application.Top.Bounds);
  811. expected = @"
  812. Numbers
  813. ┌────────┐
  814. │ One │
  815. │ Two ►│
  816. │ Three │
  817. └────────┘
  818. ";
  819. pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  820. Assert.Equal (new Rect (1, 0, 10, 6), pos);
  821. Assert.True (Application.Top.Subviews [1].ProcessKey (new KeyEvent (Key.Esc, null)));
  822. Application.Top.Redraw (Application.Top.Bounds);
  823. expected = @"
  824. Numbers
  825. ";
  826. pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  827. Assert.Equal (new Rect (1, 0, 8, 1), pos);
  828. }
  829. [Fact, AutoInitShutdown]
  830. public void UseSubMenusSingleFrame_True_By_Mouse ()
  831. {
  832. var menu = new MenuBar (new MenuBarItem [] {
  833. new MenuBarItem ("Numbers", new MenuItem [] {
  834. new MenuItem ("One", "", null),
  835. new MenuBarItem ("Two", new MenuItem [] {
  836. new MenuItem ("Sub-Menu 1", "", null),
  837. new MenuItem ("Sub-Menu 2", "", null)
  838. }),
  839. new MenuItem ("Three", "", null),
  840. })
  841. });
  842. Application.Top.Add (menu);
  843. Assert.Equal (Point.Empty, new Point (menu.Frame.X, menu.Frame.Y));
  844. Assert.False (menu.UseSubMenusSingleFrame);
  845. menu.UseSubMenusSingleFrame = true;
  846. Assert.True (menu.UseSubMenusSingleFrame);
  847. Application.Top.Redraw (Application.Top.Bounds);
  848. var expected = @"
  849. Numbers
  850. ";
  851. var pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  852. Assert.Equal (new Rect (1, 0, 8, 1), pos);
  853. Assert.True (menu.MouseEvent (new MouseEvent () {
  854. X = 1,
  855. Y = 0,
  856. Flags = MouseFlags.Button1Pressed,
  857. View = menu
  858. }));
  859. Application.Top.Redraw (Application.Top.Bounds);
  860. expected = @"
  861. Numbers
  862. ┌────────┐
  863. │ One │
  864. │ Two ►│
  865. │ Three │
  866. └────────┘
  867. ";
  868. pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  869. Assert.Equal (new Rect (1, 0, 10, 6), pos);
  870. Assert.False (menu.MouseEvent (new MouseEvent () {
  871. X = 1,
  872. Y = 3,
  873. Flags = MouseFlags.Button1Clicked,
  874. View = Application.Top.Subviews [1]
  875. }));
  876. Application.Top.Redraw (Application.Top.Bounds);
  877. expected = @"
  878. Numbers
  879. ┌─────────────┐
  880. │◄ Two │
  881. ├─────────────┤
  882. │ Sub-Menu 1 │
  883. │ Sub-Menu 2 │
  884. └─────────────┘
  885. ";
  886. pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  887. Assert.Equal (new Rect (1, 0, 15, 7), pos);
  888. Assert.False (menu.MouseEvent (new MouseEvent () {
  889. X = 1,
  890. Y = 2,
  891. Flags = MouseFlags.Button1Clicked,
  892. View = Application.Top.Subviews [2]
  893. }));
  894. Application.Top.Redraw (Application.Top.Bounds);
  895. expected = @"
  896. Numbers
  897. ┌────────┐
  898. │ One │
  899. │ Two ►│
  900. │ Three │
  901. └────────┘
  902. ";
  903. pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  904. Assert.Equal (new Rect (1, 0, 10, 6), pos);
  905. Assert.False (menu.MouseEvent (new MouseEvent () {
  906. X = 70,
  907. Y = 2,
  908. Flags = MouseFlags.Button1Clicked,
  909. View = Application.Top
  910. }));
  911. Application.Top.Redraw (Application.Top.Bounds);
  912. expected = @"
  913. Numbers
  914. ";
  915. pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  916. Assert.Equal (new Rect (1, 0, 8, 1), pos);
  917. }
  918. [Fact, AutoInitShutdown]
  919. public void HotKey_MenuBar_OnKeyDown_OnKeyUp_ProcessHotKey_ProcessKey ()
  920. {
  921. var newAction = false;
  922. var copyAction = false;
  923. var menu = new MenuBar (new MenuBarItem [] {
  924. new MenuBarItem ("_File", new MenuItem [] {
  925. new MenuItem ("_New", "", () => newAction = true)
  926. }),
  927. new MenuBarItem ("_Edit", new MenuItem [] {
  928. new MenuItem ("_Copy", "", () => copyAction = true)
  929. })
  930. });
  931. Application.Top.Add (menu);
  932. Assert.False (newAction);
  933. Assert.False (copyAction);
  934. Assert.False (menu.OnKeyDown (new (Key.AltMask, new KeyModifiers () { Alt = true })));
  935. Assert.True (menu.OnKeyUp (new (Key.AltMask, new KeyModifiers () { Alt = true })));
  936. Assert.True (menu.IsMenuOpen);
  937. Application.Top.Redraw (Application.Top.Bounds);
  938. var expected = @"
  939. File Edit
  940. ";
  941. var pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  942. Assert.Equal (new Rect (1, 0, 11, 1), pos);
  943. Assert.True (menu.ProcessKey (new (Key.N, null)));
  944. Application.MainLoop.MainIteration ();
  945. Assert.True (newAction);
  946. Assert.True (menu.ProcessHotKey (new (Key.AltMask, new KeyModifiers () { Alt = true })));
  947. Assert.True (menu.IsMenuOpen);
  948. Application.Top.Redraw (Application.Top.Bounds);
  949. expected = @"
  950. File Edit
  951. ";
  952. pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
  953. Assert.Equal (new Rect (1, 0, 11, 1), pos);
  954. Assert.True (menu.ProcessKey (new (Key.CursorRight, null)));
  955. Assert.True (menu.ProcessKey (new (Key.C, null)));
  956. Application.MainLoop.MainIteration ();
  957. Assert.True (copyAction);
  958. }
  959. // Defines the expected strings for a Menu. Currently supports
  960. // - MenuBar with any number of MenuItems
  961. // - Each top-level MenuItem can have a SINGLE sub-menu
  962. //
  963. // TODO: Enable multiple sub-menus
  964. // TODO: Enable checked sub-menus
  965. // TODO: Enable sub-menus with sub-menus (perhaps better to put this in a separate class with focused unit tests?)
  966. //
  967. // E.g:
  968. //
  969. // File Edit
  970. // New Copy
  971. public class ExpectedMenuBar : MenuBar {
  972. FakeDriver d = ((FakeDriver)Application.Driver);
  973. // Each MenuBar title has a 1 space pad on each side
  974. // See `static int leftPadding` and `static int rightPadding` on line 1037 of Menu.cs
  975. public string MenuBarText {
  976. get {
  977. string txt = string.Empty;
  978. foreach (var m in Menus) {
  979. txt += " " + m.Title.ToString () + " ";
  980. }
  981. return txt;
  982. }
  983. }
  984. // The expected strings when the menu is closed
  985. public string ClosedMenuText => MenuBarText + "\n";
  986. // Padding for the X of the sub menu Frane
  987. // Menu.cs - Line 1239 in `internal void OpenMenu` is where the Menu is created
  988. string padding (int i)
  989. {
  990. int n = 0;
  991. while (i > 0) {
  992. n += Menus [i - 1].TitleLength + 2;
  993. i--;
  994. }
  995. return new string (' ', n);
  996. }
  997. // Define expected menu frame
  998. // "┌──────┐"
  999. // "│ New │"
  1000. // "└──────┘"
  1001. //
  1002. // The width of the Frame is determined in Menu.cs line 144, where `Width` is calculated
  1003. // 1 space before the Title and 2 spaces after the Title/Check/Help
  1004. public string expectedTopRow (int i) => $"{d.ULCorner}{new String (d.HLine.ToString () [0], Menus [i].Children [0].TitleLength + 3)}{d.URCorner} \n";
  1005. // The 3 spaces at end are a result of Menu.cs line 1062 where `pos` is calculated (` + spacesAfterTitle`)
  1006. public string expectedMenuItemRow (int i) => $"{d.VLine} {Menus [i].Children [0].Title} {d.VLine} \n";
  1007. public string expectedBottomRow (int i) => $"{d.LLCorner}{new String (d.HLine.ToString () [0], Menus [i].Children [0].TitleLength + 3)}{d.LRCorner} \n";
  1008. // The fulll expected string for an open sub menu
  1009. public string expectedSubMenuOpen (int i) => ClosedMenuText +
  1010. (Menus [i].Children.Length > 0 ?
  1011. padding (i) + expectedTopRow (i) +
  1012. padding (i) + expectedMenuItemRow (i) +
  1013. padding (i) + expectedBottomRow (i)
  1014. :
  1015. "");
  1016. public ExpectedMenuBar (MenuBarItem [] menus) : base (menus)
  1017. {
  1018. }
  1019. }
  1020. [Fact, AutoInitShutdown]
  1021. public void MenuBar_Submenus_Alignment_Correct ()
  1022. {
  1023. // Define the expected menu
  1024. var expectedMenu = new ExpectedMenuBar (new MenuBarItem [] {
  1025. new MenuBarItem ("File", new MenuItem [] {
  1026. new MenuItem ("Really Long Sub Menu", "", null)
  1027. }),
  1028. new MenuBarItem ("123", new MenuItem [] {
  1029. new MenuItem ("Copy", "", null)
  1030. }),
  1031. new MenuBarItem ("Format", new MenuItem [] {
  1032. new MenuItem ("Word Wrap", "", null)
  1033. }),
  1034. new MenuBarItem ("Help", new MenuItem [] {
  1035. new MenuItem ("About", "", null)
  1036. }),
  1037. new MenuBarItem ("1", new MenuItem [] {
  1038. new MenuItem ("2", "", null)
  1039. }),
  1040. new MenuBarItem ("3", new MenuItem [] {
  1041. new MenuItem ("2", "", null)
  1042. }),
  1043. new MenuBarItem ("Last one", new MenuItem [] {
  1044. new MenuItem ("Test", "", null)
  1045. })
  1046. });
  1047. MenuBarItem [] items = new MenuBarItem [expectedMenu.Menus.Length];
  1048. for (var i = 0; i < expectedMenu.Menus.Length; i++) {
  1049. items [i] = new MenuBarItem (expectedMenu.Menus [i].Title, new MenuItem [] {
  1050. new MenuItem (expectedMenu.Menus [i].Children [0].Title, "", null)
  1051. });
  1052. }
  1053. var menu = new MenuBar (items);
  1054. Application.Top.Add (menu);
  1055. Application.Top.Redraw (Application.Top.Bounds);
  1056. TestHelpers.AssertDriverContentsAre (expectedMenu.ClosedMenuText, output);
  1057. for (var i = 0; i < expectedMenu.Menus.Length; i++) {
  1058. menu.OpenMenu (i);
  1059. Assert.True (menu.IsMenuOpen);
  1060. Application.Top.Redraw (Application.Top.Bounds);
  1061. TestHelpers.AssertDriverContentsAre (expectedMenu.expectedSubMenuOpen (i), output);
  1062. }
  1063. }
  1064. [Fact, AutoInitShutdown]
  1065. public void HotKey_MenuBar_ProcessHotKey_Menu_ProcessKey ()
  1066. {
  1067. var newAction = false;
  1068. var copyAction = false;
  1069. // Define the expected menu
  1070. var expectedMenu = new ExpectedMenuBar (new MenuBarItem [] {
  1071. new MenuBarItem ("File", new MenuItem [] {
  1072. new MenuItem ("New", "", null)
  1073. }),
  1074. new MenuBarItem ("Edit", new MenuItem [] {
  1075. new MenuItem ("Copy", "", null)
  1076. })
  1077. });
  1078. // The real menu
  1079. var menu = new MenuBar (new MenuBarItem [] {
  1080. new MenuBarItem ("_" + expectedMenu.Menus[0].Title, new MenuItem [] {
  1081. new MenuItem ("_" + expectedMenu.Menus[0].Children[0].Title, "", () => newAction = true)
  1082. }),
  1083. new MenuBarItem ("_" + expectedMenu.Menus[1].Title, new MenuItem [] {
  1084. new MenuItem ("_" + expectedMenu.Menus[1].Children[0].Title, "", () => copyAction = true)
  1085. }),
  1086. });
  1087. Application.Top.Add (menu);
  1088. Assert.False (newAction);
  1089. Assert.False (copyAction);
  1090. Assert.True (menu.ProcessHotKey (new (Key.AltMask | Key.F, new KeyModifiers () { Alt = true })));
  1091. Assert.True (menu.IsMenuOpen);
  1092. Application.Top.Redraw (Application.Top.Bounds);
  1093. TestHelpers.AssertDriverContentsAre (expectedMenu.expectedSubMenuOpen (0), output);
  1094. Assert.True (Application.Top.Subviews [1].ProcessKey (new (Key.N, null)));
  1095. Application.MainLoop.MainIteration ();
  1096. Assert.True (newAction);
  1097. Assert.True (menu.ProcessHotKey (new (Key.AltMask | Key.E, new KeyModifiers () { Alt = true })));
  1098. Assert.True (menu.IsMenuOpen);
  1099. Application.Top.Redraw (Application.Top.Bounds);
  1100. TestHelpers.AssertDriverContentsAre (expectedMenu.expectedSubMenuOpen (1), output);
  1101. Assert.True (Application.Top.Subviews [1].ProcessKey (new (Key.C, null)));
  1102. Application.MainLoop.MainIteration ();
  1103. Assert.True (copyAction);
  1104. }
  1105. [Fact, AutoInitShutdown]
  1106. public void MenuBar_Position_And_Size_With_HotKeys_Is_The_Same_As_Without_HotKeys ()
  1107. {
  1108. // Define the expected menu
  1109. var expectedMenu = new ExpectedMenuBar (new MenuBarItem [] {
  1110. new MenuBarItem ("File", new MenuItem [] {
  1111. new MenuItem ("12", "", null)
  1112. }),
  1113. new MenuBarItem ("Edit", new MenuItem [] {
  1114. new MenuItem ("Copy", "", null)
  1115. })
  1116. });
  1117. // Test without HotKeys first
  1118. var menu = new MenuBar (new MenuBarItem [] {
  1119. new MenuBarItem (expectedMenu.Menus[0].Title, new MenuItem [] {
  1120. new MenuItem (expectedMenu.Menus[0].Children[0].Title, "", null)
  1121. }),
  1122. new MenuBarItem (expectedMenu.Menus[1].Title, new MenuItem [] {
  1123. new MenuItem (expectedMenu.Menus[1].Children[0].Title, "", null)
  1124. })
  1125. });
  1126. Application.Top.Add (menu);
  1127. // Open first
  1128. Assert.True (menu.ProcessHotKey (new (Key.F9, new KeyModifiers ())));
  1129. Assert.True (menu.IsMenuOpen);
  1130. Application.Top.Redraw (Application.Top.Bounds);
  1131. TestHelpers.AssertDriverContentsAre (expectedMenu.expectedSubMenuOpen (0), output);
  1132. // Open second
  1133. Assert.True (Application.Top.Subviews [1].ProcessKey (new (Key.CursorRight, null)));
  1134. Assert.True (menu.IsMenuOpen);
  1135. Application.Top.Redraw (Application.Top.Bounds);
  1136. TestHelpers.AssertDriverContentsAre (expectedMenu.expectedSubMenuOpen (1), output);
  1137. // Close menu
  1138. Assert.True (menu.ProcessHotKey (new (Key.F9, new KeyModifiers ())));
  1139. Assert.False (menu.IsMenuOpen);
  1140. Application.Top.Redraw (Application.Top.Bounds);
  1141. TestHelpers.AssertDriverContentsAre (expectedMenu.ClosedMenuText, output);
  1142. Application.Top.Remove (menu);
  1143. // Now test WITH HotKeys
  1144. menu = new MenuBar (new MenuBarItem [] {
  1145. new MenuBarItem ("_" + expectedMenu.Menus[0].Title, new MenuItem [] {
  1146. new MenuItem ("_" + expectedMenu.Menus[0].Children[0].Title, "", null)
  1147. }),
  1148. new MenuBarItem ("_" + expectedMenu.Menus[1].Title, new MenuItem [] {
  1149. new MenuItem ("_" + expectedMenu.Menus[1].Children[0].Title, "", null)
  1150. }),
  1151. });
  1152. Application.Top.Add (menu);
  1153. // Open first
  1154. Assert.True (menu.ProcessHotKey (new (Key.F9, new KeyModifiers ())));
  1155. Assert.True (menu.IsMenuOpen);
  1156. Application.Top.Redraw (Application.Top.Bounds);
  1157. TestHelpers.AssertDriverContentsAre (expectedMenu.expectedSubMenuOpen (0), output);
  1158. // Open second
  1159. Assert.True (Application.Top.Subviews [1].ProcessKey (new (Key.CursorRight, null)));
  1160. Assert.True (menu.IsMenuOpen);
  1161. Application.Top.Redraw (Application.Top.Bounds);
  1162. TestHelpers.AssertDriverContentsAre (expectedMenu.expectedSubMenuOpen (1), output);
  1163. // Close menu
  1164. Assert.True (menu.ProcessHotKey (new (Key.F9, new KeyModifiers ())));
  1165. Assert.False (menu.IsMenuOpen);
  1166. Application.Top.Redraw (Application.Top.Bounds);
  1167. TestHelpers.AssertDriverContentsAre (expectedMenu.ClosedMenuText, output);
  1168. }
  1169. [Fact, AutoInitShutdown]
  1170. public void MenuBar_ButtonPressed_Open_The_Menu_ButtonPressed_Again_Close_The_Menu ()
  1171. {
  1172. // Define the expected menu
  1173. var expectedMenu = new ExpectedMenuBar (new MenuBarItem [] {
  1174. new MenuBarItem ("File", new MenuItem [] {
  1175. new MenuItem ("Open", "", null)
  1176. }),
  1177. new MenuBarItem ("Edit", new MenuItem [] {
  1178. new MenuItem ("Copy", "", null)
  1179. })
  1180. });
  1181. // Test without HotKeys first
  1182. var menu = new MenuBar (new MenuBarItem [] {
  1183. new MenuBarItem ("_" + expectedMenu.Menus[0].Title, new MenuItem [] {
  1184. new MenuItem ("_" + expectedMenu.Menus[0].Children[0].Title, "", null)
  1185. }),
  1186. new MenuBarItem ("_" + expectedMenu.Menus[1].Title, new MenuItem [] {
  1187. new MenuItem ("_" + expectedMenu.Menus[1].Children[0].Title, "", null)
  1188. }),
  1189. });
  1190. Application.Top.Add (menu);
  1191. Assert.True (menu.MouseEvent (new MouseEvent () { X = 1, Y = 0, Flags = MouseFlags.Button1Pressed, View = menu }));
  1192. Assert.True (menu.IsMenuOpen);
  1193. Application.Top.Redraw (Application.Top.Bounds);
  1194. TestHelpers.AssertDriverContentsAre (expectedMenu.expectedSubMenuOpen (0), output);
  1195. Assert.True (menu.MouseEvent (new MouseEvent () { X = 1, Y = 0, Flags = MouseFlags.Button1Pressed, View = menu }));
  1196. Assert.False (menu.IsMenuOpen);
  1197. Application.Top.Redraw (Application.Top.Bounds);
  1198. TestHelpers.AssertDriverContentsAre (expectedMenu.ClosedMenuText, output);
  1199. }
  1200. [Fact]
  1201. public void UseKeysUpDownAsKeysLeftRight_And_UseSubMenusSingleFrame_Cannot_Be_Both_True ()
  1202. {
  1203. var menu = new MenuBar ();
  1204. Assert.False (menu.UseKeysUpDownAsKeysLeftRight);
  1205. Assert.False (menu.UseSubMenusSingleFrame);
  1206. menu.UseKeysUpDownAsKeysLeftRight = true;
  1207. Assert.True (menu.UseKeysUpDownAsKeysLeftRight);
  1208. Assert.False (menu.UseSubMenusSingleFrame);
  1209. menu.UseSubMenusSingleFrame = true;
  1210. Assert.False (menu.UseKeysUpDownAsKeysLeftRight);
  1211. Assert.True (menu.UseSubMenusSingleFrame);
  1212. }
  1213. [Fact, AutoInitShutdown]
  1214. public void Parent_MenuItem_Stay_Focused_If_Child_MenuItem_Is_Empty_By_Mouse ()
  1215. {
  1216. // File Edit Format
  1217. //┌──────┐ ┌───────┐
  1218. //│ New │ │ Wrap │
  1219. //└──────┘ └───────┘
  1220. // Define the expected menu
  1221. var expectedMenu = new ExpectedMenuBar (new MenuBarItem [] {
  1222. new MenuBarItem ("File", new MenuItem [] {
  1223. new MenuItem ("New", "", null)
  1224. }),
  1225. new MenuBarItem ("Edit", new MenuItem [] {}),
  1226. new MenuBarItem ("Format", new MenuItem [] {
  1227. new MenuItem ("Wrap", "", null)
  1228. })
  1229. });
  1230. var menu = new MenuBar (new MenuBarItem [] {
  1231. new MenuBarItem (expectedMenu.Menus[0].Title, new MenuItem [] {
  1232. new MenuItem (expectedMenu.Menus[0].Children[0].Title, "", null)
  1233. }),
  1234. new MenuBarItem (expectedMenu.Menus[1].Title, new MenuItem [] {}),
  1235. new MenuBarItem (expectedMenu.Menus[2].Title, new MenuItem [] {
  1236. new MenuItem (expectedMenu.Menus[2].Children[0].Title, "", null)
  1237. })
  1238. });
  1239. var tf = new TextField () { Y = 2, Width = 10 };
  1240. Application.Top.Add (menu, tf);
  1241. Application.Begin (Application.Top);
  1242. Assert.True (tf.HasFocus);
  1243. Assert.True (menu.MouseEvent (new MouseEvent () { X = 1, Y = 0, Flags = MouseFlags.Button1Pressed, View = menu }));
  1244. Assert.True (menu.IsMenuOpen);
  1245. Assert.False (tf.HasFocus);
  1246. Application.Top.Redraw (Application.Top.Bounds);
  1247. TestHelpers.AssertDriverContentsAre (expectedMenu.expectedSubMenuOpen (0), output);
  1248. Assert.True (menu.MouseEvent (new MouseEvent () { X = 8, Y = 0, Flags = MouseFlags.ReportMousePosition, View = menu }));
  1249. Assert.True (menu.IsMenuOpen);
  1250. Assert.False (tf.HasFocus);
  1251. Application.Top.Redraw (Application.Top.Bounds);
  1252. TestHelpers.AssertDriverContentsAre (expectedMenu.expectedSubMenuOpen (1), output);
  1253. Assert.True (menu.MouseEvent (new MouseEvent () { X = 15, Y = 0, Flags = MouseFlags.ReportMousePosition, View = menu }));
  1254. Assert.True (menu.IsMenuOpen);
  1255. Assert.False (tf.HasFocus);
  1256. Application.Top.Redraw (Application.Top.Bounds);
  1257. TestHelpers.AssertDriverContentsAre (expectedMenu.expectedSubMenuOpen (2), output);
  1258. Assert.True (menu.MouseEvent (new MouseEvent () { X = 8, Y = 0, Flags = MouseFlags.ReportMousePosition, View = menu }));
  1259. Assert.True (menu.IsMenuOpen);
  1260. Assert.False (tf.HasFocus);
  1261. Application.Top.Redraw (Application.Top.Bounds);
  1262. TestHelpers.AssertDriverContentsAre (expectedMenu.ClosedMenuText, output);
  1263. Assert.True (menu.MouseEvent (new MouseEvent () { X = 1, Y = 0, Flags = MouseFlags.ReportMousePosition, View = menu }));
  1264. Assert.True (menu.IsMenuOpen);
  1265. Assert.False (tf.HasFocus);
  1266. Application.Top.Redraw (Application.Top.Bounds);
  1267. TestHelpers.AssertDriverContentsAre (expectedMenu.expectedSubMenuOpen (0), output);
  1268. Assert.True (menu.MouseEvent (new MouseEvent () { X = 8, Y = 0, Flags = MouseFlags.Button1Pressed, View = menu }));
  1269. Assert.False (menu.IsMenuOpen);
  1270. Assert.True (tf.HasFocus);
  1271. Application.Top.Redraw (Application.Top.Bounds);
  1272. TestHelpers.AssertDriverContentsAre (expectedMenu.ClosedMenuText, output);
  1273. }
  1274. [Fact, AutoInitShutdown]
  1275. public void Parent_MenuItem_Stay_Focused_If_Child_MenuItem_Is_Empty_By_Keyboard ()
  1276. {
  1277. var expectedMenu = new ExpectedMenuBar (new MenuBarItem [] {
  1278. new MenuBarItem ("File", new MenuItem [] {
  1279. new MenuItem ("New", "", null)
  1280. }),
  1281. new MenuBarItem ("Edit", Array.Empty<MenuItem> ()),
  1282. new MenuBarItem ("Format", new MenuItem [] {
  1283. new MenuItem ("Wrap", "", null)
  1284. })
  1285. });
  1286. MenuBarItem [] items = new MenuBarItem [expectedMenu.Menus.Length];
  1287. for (var i = 0; i < expectedMenu.Menus.Length; i++) {
  1288. items [i] = new MenuBarItem (expectedMenu.Menus [i].Title, expectedMenu.Menus [i].Children.Length > 0
  1289. ? new MenuItem [] {
  1290. new MenuItem (expectedMenu.Menus [i].Children [0].Title, "", null),
  1291. }
  1292. : Array.Empty<MenuItem> ());
  1293. }
  1294. var menu = new MenuBar (items);
  1295. var tf = new TextField () { Y = 2, Width = 10 };
  1296. Application.Top.Add (menu, tf);
  1297. Application.Begin (Application.Top);
  1298. Assert.True (tf.HasFocus);
  1299. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, new KeyModifiers ())));
  1300. Assert.True (menu.IsMenuOpen);
  1301. Assert.False (tf.HasFocus);
  1302. Application.Top.Redraw (Application.Top.Bounds);
  1303. TestHelpers.AssertDriverContentsAre (expectedMenu.expectedSubMenuOpen (0), output);
  1304. // Right - Edit has no sub menu; this tests that no sub menu shows
  1305. Assert.True (menu.openMenu.ProcessKey (new KeyEvent (Key.CursorRight, new KeyModifiers ())));
  1306. Assert.True (menu.IsMenuOpen);
  1307. Assert.False (tf.HasFocus);
  1308. Application.Top.Redraw (Application.Top.Bounds);
  1309. TestHelpers.AssertDriverContentsAre (expectedMenu.expectedSubMenuOpen (1), output);
  1310. // Right - Format
  1311. Assert.True (menu.openMenu.ProcessKey (new KeyEvent (Key.CursorRight, new KeyModifiers ())));
  1312. Assert.True (menu.IsMenuOpen);
  1313. Assert.False (tf.HasFocus);
  1314. Application.Top.Redraw (Application.Top.Bounds);
  1315. TestHelpers.AssertDriverContentsAre (expectedMenu.expectedSubMenuOpen (2), output);
  1316. // Left - Edit
  1317. Assert.True (menu.openMenu.ProcessKey (new KeyEvent (Key.CursorLeft, new KeyModifiers ())));
  1318. Assert.True (menu.IsMenuOpen);
  1319. Assert.False (tf.HasFocus);
  1320. Application.Top.Redraw (Application.Top.Bounds);
  1321. TestHelpers.AssertDriverContentsAre (expectedMenu.expectedSubMenuOpen (1), output);
  1322. Assert.True (menu.openMenu.ProcessKey (new KeyEvent (Key.CursorLeft, new KeyModifiers ())));
  1323. Assert.True (menu.IsMenuOpen);
  1324. Assert.False (tf.HasFocus);
  1325. Application.Top.Redraw (Application.Top.Bounds);
  1326. TestHelpers.AssertDriverContentsAre (expectedMenu.expectedSubMenuOpen (0), output);
  1327. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, new KeyModifiers ())));
  1328. Assert.False (menu.IsMenuOpen);
  1329. Assert.True (tf.HasFocus);
  1330. Application.Top.Redraw (Application.Top.Bounds);
  1331. TestHelpers.AssertDriverContentsAre (expectedMenu.ClosedMenuText, output);
  1332. }
  1333. [Fact, AutoInitShutdown]
  1334. public void Key_Open_And_Close_The_MenuBar ()
  1335. {
  1336. var menu = new MenuBar (new MenuBarItem [] {
  1337. new MenuBarItem ("File", new MenuItem [] {
  1338. new MenuItem ("New", "", null)
  1339. })
  1340. });
  1341. Application.Top.Add (menu);
  1342. Application.Begin (Application.Top);
  1343. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, new KeyModifiers ())));
  1344. Assert.True (menu.IsMenuOpen);
  1345. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, new KeyModifiers ())));
  1346. Assert.False (menu.IsMenuOpen);
  1347. menu.Key = Key.F10 | Key.ShiftMask;
  1348. Assert.False (menu.ProcessHotKey (new KeyEvent (Key.F9, new KeyModifiers ())));
  1349. Assert.False (menu.IsMenuOpen);
  1350. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F10 | Key.ShiftMask, new KeyModifiers ())));
  1351. Assert.True (menu.IsMenuOpen);
  1352. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F10 | Key.ShiftMask, new KeyModifiers ())));
  1353. Assert.False (menu.IsMenuOpen);
  1354. }
  1355. [Fact, AutoInitShutdown]
  1356. public void Disabled_MenuItem_Is_Never_Selected ()
  1357. {
  1358. var menu = new MenuBar (new MenuBarItem [] {
  1359. new MenuBarItem ("Menu", new MenuItem [] {
  1360. new MenuItem ("Enabled 1", "", null),
  1361. new MenuItem ("Disabled", "", null, () => false),
  1362. null,
  1363. new MenuItem ("Enabled 2", "", null)
  1364. })
  1365. });
  1366. var top = Application.Top;
  1367. top.Add (menu);
  1368. Application.Begin (top);
  1369. var attributes = new Attribute [] {
  1370. // 0
  1371. menu.ColorScheme.Normal,
  1372. // 1
  1373. menu.ColorScheme.Focus,
  1374. // 2
  1375. menu.ColorScheme.Disabled
  1376. };
  1377. TestHelpers.AssertDriverColorsAre (@"
  1378. 00000000000000", attributes);
  1379. Assert.True (menu.MouseEvent (new MouseEvent {
  1380. X = 0,
  1381. Y = 0,
  1382. Flags = MouseFlags.Button1Pressed,
  1383. View = menu
  1384. }));
  1385. top.Redraw (top.Bounds);
  1386. TestHelpers.AssertDriverColorsAre (@"
  1387. 11111100000000
  1388. 00000000000000
  1389. 01111111111110
  1390. 02222222222220
  1391. 00000000000000
  1392. 00000000000000
  1393. 00000000000000", attributes);
  1394. Assert.True (top.Subviews [1].MouseEvent (new MouseEvent {
  1395. X = 0,
  1396. Y = 2,
  1397. Flags = MouseFlags.Button1Clicked,
  1398. View = top.Subviews [1]
  1399. }));
  1400. top.Subviews [1].Redraw (top.Bounds);
  1401. TestHelpers.AssertDriverColorsAre (@"
  1402. 11111100000000
  1403. 00000000000000
  1404. 01111111111110
  1405. 02222222222220
  1406. 00000000000000
  1407. 00000000000000
  1408. 00000000000000", attributes);
  1409. Assert.True (top.Subviews [1].MouseEvent (new MouseEvent {
  1410. X = 0,
  1411. Y = 2,
  1412. Flags = MouseFlags.ReportMousePosition,
  1413. View = top.Subviews [1]
  1414. }));
  1415. top.Subviews [1].Redraw (top.Bounds);
  1416. TestHelpers.AssertDriverColorsAre (@"
  1417. 11111100000000
  1418. 00000000000000
  1419. 01111111111110
  1420. 02222222222220
  1421. 00000000000000
  1422. 00000000000000
  1423. 00000000000000", attributes);
  1424. }
  1425. [Fact, AutoInitShutdown]
  1426. public void MenuBar_With_Action_But_Without_MenuItems_Not_Throw ()
  1427. {
  1428. var menu = new MenuBar (
  1429. menus: new []
  1430. {
  1431. new MenuBarItem { Title = "Test 1", Action = () => { } },
  1432. new MenuBarItem { Title = "Test 2", Action = () => { } },
  1433. });
  1434. Application.Top.Add (menu);
  1435. Application.Begin (Application.Top);
  1436. Assert.False (Application.Top.OnKeyDown (new KeyEvent (Key.AltMask, new KeyModifiers { Alt = true })));
  1437. Assert.True (menu.ProcessKey (new KeyEvent (Key.CursorRight, new KeyModifiers ())));
  1438. Assert.True (menu.ProcessKey (new KeyEvent (Key.CursorRight, new KeyModifiers ())));
  1439. }
  1440. [Fact, AutoInitShutdown]
  1441. public void MenuBar_In_Window_Without_Other_Views ()
  1442. {
  1443. var win = new Window ();
  1444. var menu = new MenuBar (new MenuBarItem [] {
  1445. new MenuBarItem ("File", new MenuItem [] {
  1446. new MenuItem ("New", "", null)
  1447. }),
  1448. new MenuBarItem ("Edit", new MenuItem [] {
  1449. new MenuBarItem ("Delete", new MenuItem [] {
  1450. new MenuItem ("All", "", null),
  1451. new MenuItem ("Selected", "", null)
  1452. })
  1453. })
  1454. }); ;
  1455. win.Add (menu);
  1456. var top = Application.Top;
  1457. top.Add (win);
  1458. Application.Begin (top);
  1459. ((FakeDriver)Application.Driver).SetBufferSize (40, 8);
  1460. TestHelpers.AssertDriverContentsWithFrameAre (@"
  1461. ┌──────────────────────────────────────┐
  1462. │ File Edit │
  1463. │ │
  1464. │ │
  1465. │ │
  1466. │ │
  1467. │ │
  1468. └──────────────────────────────────────┘", output);
  1469. Assert.True (win.ProcessHotKey (new KeyEvent (Key.F9, new KeyModifiers ())));
  1470. win.Redraw (win.Bounds);
  1471. TestHelpers.AssertDriverContentsWithFrameAre (@"
  1472. ┌──────────────────────────────────────┐
  1473. │ File Edit │
  1474. │┌──────┐ │
  1475. ││ New │ │
  1476. │└──────┘ │
  1477. │ │
  1478. │ │
  1479. └──────────────────────────────────────┘", output);
  1480. Assert.True (menu.ProcessKey (new KeyEvent (Key.CursorRight, new KeyModifiers ())));
  1481. win.Redraw (win.Bounds);
  1482. TestHelpers.AssertDriverContentsWithFrameAre (@"
  1483. ┌──────────────────────────────────────┐
  1484. │ File Edit │
  1485. │ ┌─────────┐ │
  1486. │ │ Delete ►│ │
  1487. │ └─────────┘ │
  1488. │ │
  1489. │ │
  1490. └──────────────────────────────────────┘", output);
  1491. Assert.True (menu.openMenu.ProcessKey (new KeyEvent (Key.CursorRight, new KeyModifiers ())));
  1492. win.Redraw (win.Bounds);
  1493. TestHelpers.AssertDriverContentsWithFrameAre (@"
  1494. ┌──────────────────────────────────────┐
  1495. │ File Edit │
  1496. │ ┌─────────┐ │
  1497. │ │ Delete ►│┌───────────┐ │
  1498. │ └─────────┘│ All │ │
  1499. │ │ Selected │ │
  1500. │ └───────────┘ │
  1501. └──────────────────────────────────────┘", output);
  1502. Assert.True (menu.openMenu.ProcessKey (new KeyEvent (Key.CursorRight, new KeyModifiers ())));
  1503. win.Redraw (win.Bounds);
  1504. TestHelpers.AssertDriverContentsWithFrameAre (@"
  1505. ┌──────────────────────────────────────┐
  1506. │ File Edit │
  1507. │┌──────┐ │
  1508. ││ New │ │
  1509. │└──────┘ │
  1510. │ │
  1511. │ │
  1512. └──────────────────────────────────────┘", output);
  1513. }
  1514. [Fact, AutoInitShutdown]
  1515. public void MenuBarItem_Children_Null_Does_Not_Throw ()
  1516. {
  1517. var menu = new MenuBar (new MenuBarItem [] {
  1518. new MenuBarItem("Test", "", null)
  1519. });
  1520. Application.Top.Add (menu);
  1521. var exception = Record.Exception (() => menu.ProcessColdKey (new KeyEvent (Key.Space, new KeyModifiers ())));
  1522. Assert.Null (exception);
  1523. }
  1524. [Fact, AutoInitShutdown]
  1525. public void CanExecute_ProcessHotKey ()
  1526. {
  1527. Window win = null;
  1528. var menu = new MenuBar (new MenuBarItem [] {
  1529. new MenuBarItem ("File", new MenuItem [] {
  1530. new MenuItem ("_New", "", New, CanExecuteNew),
  1531. new MenuItem ("_Close", "", Close, CanExecuteClose)
  1532. }),
  1533. });
  1534. var top = Application.Top;
  1535. top.Add (menu);
  1536. bool CanExecuteNew () => win == null;
  1537. void New ()
  1538. {
  1539. win = new Window ();
  1540. }
  1541. bool CanExecuteClose () => win != null;
  1542. void Close ()
  1543. {
  1544. win = null;
  1545. }
  1546. Application.Begin (top);
  1547. Assert.Null (win);
  1548. Assert.True (CanExecuteNew ());
  1549. Assert.False (CanExecuteClose ());
  1550. Assert.True (top.ProcessHotKey (new KeyEvent (Key.N | Key.AltMask, new KeyModifiers () { Alt = true })));
  1551. Application.MainLoop.MainIteration ();
  1552. Assert.NotNull (win);
  1553. Assert.False (CanExecuteNew ());
  1554. Assert.True (CanExecuteClose ());
  1555. }
  1556. [Fact, AutoInitShutdown]
  1557. public void Visible_False_Key_Does_Not_Open_And_Close_All_Opened_Menus ()
  1558. {
  1559. var menu = new MenuBar (new MenuBarItem [] {
  1560. new MenuBarItem ("File", new MenuItem [] {
  1561. new MenuItem ("New", "", null)
  1562. })
  1563. });
  1564. Application.Top.Add (menu);
  1565. Application.Begin (Application.Top);
  1566. Assert.True (menu.Visible);
  1567. Assert.True (menu.ProcessHotKey (new KeyEvent (menu.Key, new KeyModifiers ())));
  1568. Assert.True (menu.IsMenuOpen);
  1569. menu.Visible = false;
  1570. Assert.False (menu.IsMenuOpen);
  1571. Assert.True (menu.ProcessHotKey (new KeyEvent (menu.Key, new KeyModifiers ())));
  1572. Assert.False (menu.IsMenuOpen);
  1573. }
  1574. [Fact]
  1575. public void Separators_Does_Not_Throws_Pressing_Menu_Shortcut ()
  1576. {
  1577. var menu = new MenuBar (new MenuBarItem [] {
  1578. new MenuBarItem ("File", new MenuItem [] {
  1579. new MenuItem ("_New", "", null),
  1580. null,
  1581. new MenuItem ("_Quit", "", null)
  1582. })
  1583. });
  1584. var exception = Record.Exception (() => Assert.True (menu.ProcessHotKey (new KeyEvent (Key.AltMask | Key.Q, new KeyModifiers () { Alt = true }))));
  1585. Assert.Null (exception);
  1586. }
  1587. }
  1588. }