MenuBarTests.cs 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693
  1. using UnitTests;
  2. using Xunit.Abstractions;
  3. namespace Terminal.Gui.ViewsTests;
  4. public class MenuBarTests ()
  5. {
  6. [Fact]
  7. [AutoInitShutdown]
  8. public void DefaultKey_Activates ()
  9. {
  10. // Arrange
  11. var menuItem = new MenuItemv2 { Id = "menuItem", Title = "_Item" };
  12. var menu = new Menuv2 ([menuItem]) { Id = "menu" };
  13. var menuBarItem = new MenuBarItemv2 { Id = "menuBarItem", Title = "_New" };
  14. var menuBarItemPopover = new PopoverMenu ();
  15. menuBarItem.PopoverMenu = menuBarItemPopover;
  16. menuBarItemPopover.Root = menu;
  17. var menuBar = new MenuBarv2 () { Id = "menuBar" };
  18. menuBar.Add (menuBarItem);
  19. Assert.Single (menuBar.SubViews);
  20. Assert.Single (menuBarItem.SubViews);
  21. var top = new Toplevel ();
  22. top.Add (menuBar);
  23. RunState rs = Application.Begin (top);
  24. Assert.False (menuBar.IsActive ());
  25. // Act
  26. Application.RaiseKeyDownEvent (MenuBarv2.DefaultKey);
  27. Assert.True (menuBar.IsActive ());
  28. Assert.True (menuBar.IsOpen ());
  29. Assert.True (menuBar.HasFocus);
  30. Assert.True (menuBar.CanFocus);
  31. Assert.True (menuBarItem.PopoverMenu.Visible);
  32. Assert.True (menuBarItem.PopoverMenu.HasFocus);
  33. Application.End (rs);
  34. top.Dispose ();
  35. }
  36. [Fact]
  37. [AutoInitShutdown]
  38. public void DefaultKey_Deactivates ()
  39. {
  40. // Arrange
  41. var menuItem = new MenuItemv2 { Id = "menuItem", Title = "_Item" };
  42. var menu = new Menuv2 ([menuItem]) { Id = "menu" };
  43. var menuBarItem = new MenuBarItemv2 { Id = "menuBarItem", Title = "_New" };
  44. var menuBarItemPopover = new PopoverMenu ();
  45. menuBarItem.PopoverMenu = menuBarItemPopover;
  46. menuBarItemPopover.Root = menu;
  47. var menuBar = new MenuBarv2 () { Id = "menuBar" };
  48. menuBar.Add (menuBarItem);
  49. Assert.Single (menuBar.SubViews);
  50. Assert.Single (menuBarItem.SubViews);
  51. var top = new Toplevel ();
  52. top.Add (menuBar);
  53. RunState rs = Application.Begin (top);
  54. Assert.False (menuBar.IsActive ());
  55. // Act
  56. Application.RaiseKeyDownEvent (MenuBarv2.DefaultKey);
  57. Assert.True (menuBar.IsOpen ());
  58. Assert.True (menuBarItem.PopoverMenu.Visible);
  59. Application.RaiseKeyDownEvent (MenuBarv2.DefaultKey);
  60. Assert.False (menuBar.IsActive ());
  61. Assert.False (menuBar.IsOpen ());
  62. Assert.False (menuBar.HasFocus);
  63. Assert.False (menuBar.CanFocus);
  64. Assert.False (menuBarItem.PopoverMenu.Visible);
  65. Assert.False (menuBarItem.PopoverMenu.HasFocus);
  66. Application.End (rs);
  67. top.Dispose ();
  68. }
  69. [Fact]
  70. [AutoInitShutdown]
  71. public void QuitKey_DeActivates ()
  72. {
  73. // Arrange
  74. var menuItem = new MenuItemv2 { Id = "menuItem", Title = "_Item" };
  75. var menu = new Menuv2 ([menuItem]) { Id = "menu" };
  76. var menuBarItem = new MenuBarItemv2 { Id = "menuBarItem", Title = "_New" };
  77. var menuBarItemPopover = new PopoverMenu ();
  78. menuBarItem.PopoverMenu = menuBarItemPopover;
  79. menuBarItemPopover.Root = menu;
  80. var menuBar = new MenuBarv2 () { Id = "menuBar" };
  81. menuBar.Add (menuBarItem);
  82. Assert.Single (menuBar.SubViews);
  83. Assert.Single (menuBarItem.SubViews);
  84. var top = new Toplevel ();
  85. top.Add (menuBar);
  86. RunState rs = Application.Begin (top);
  87. Assert.False (menuBar.IsActive ());
  88. // Act
  89. Application.RaiseKeyDownEvent (MenuBarv2.DefaultKey);
  90. Assert.True (menuBar.IsActive ());
  91. Assert.True (menuBar.IsOpen ());
  92. Assert.True (menuBarItem.PopoverMenu.Visible);
  93. Application.RaiseKeyDownEvent (Application.QuitKey);
  94. Assert.False (menuBar.IsActive ());
  95. Assert.False (menuBar.IsOpen ());
  96. Assert.False (menuBar.HasFocus);
  97. Assert.False (menuBar.CanFocus);
  98. Assert.False (menuBarItem.PopoverMenu.Visible);
  99. Assert.False (menuBarItem.PopoverMenu.HasFocus);
  100. Application.End (rs);
  101. top.Dispose ();
  102. }
  103. [Fact]
  104. [AutoInitShutdown]
  105. public void MenuBarItem_HotKey_Activates ()
  106. {
  107. // Arrange
  108. var menuItem = new MenuItemv2 { Id = "menuItem", Title = "_Item" };
  109. var menu = new Menuv2 ([menuItem]) { Id = "menu" };
  110. var menuBarItem = new MenuBarItemv2 { Id = "menuBarItem", Title = "_New" };
  111. var menuBarItemPopover = new PopoverMenu ();
  112. menuBarItem.PopoverMenu = menuBarItemPopover;
  113. menuBarItemPopover.Root = menu;
  114. var menuBar = new MenuBarv2 () { Id = "menuBar" };
  115. menuBar.Add (menuBarItem);
  116. Assert.Single (menuBar.SubViews);
  117. Assert.Single (menuBarItem.SubViews);
  118. var top = new Toplevel ();
  119. top.Add (menuBar);
  120. RunState rs = Application.Begin (top);
  121. Assert.False (menuBar.IsActive ());
  122. // Act
  123. Application.RaiseKeyDownEvent (Key.N.WithAlt);
  124. Assert.True (menuBar.IsOpen ());
  125. Assert.True (menuBar.HasFocus);
  126. Assert.True (menuBarItem.PopoverMenu.Visible);
  127. Assert.True (menuBarItem.PopoverMenu.HasFocus);
  128. Application.End (rs);
  129. top.Dispose ();
  130. }
  131. [Fact]
  132. [AutoInitShutdown]
  133. public void MenuBarItem_HotKey_Deactivates ()
  134. {
  135. // Arrange
  136. var menuItem = new MenuItemv2 { Id = "menuItem", Title = "_Item" };
  137. var menu = new Menuv2 ([menuItem]) { Id = "menu" };
  138. var menuBarItem = new MenuBarItemv2 { Id = "menuBarItem", Title = "_New" };
  139. var menuBarItemPopover = new PopoverMenu ();
  140. menuBarItem.PopoverMenu = menuBarItemPopover;
  141. menuBarItemPopover.Root = menu;
  142. var menuBar = new MenuBarv2 () { Id = "menuBar" };
  143. menuBar.Add (menuBarItem);
  144. Assert.Single (menuBar.SubViews);
  145. Assert.Single (menuBarItem.SubViews);
  146. var top = new Toplevel ();
  147. top.Add (menuBar);
  148. RunState rs = Application.Begin (top);
  149. Assert.False (menuBar.IsActive ());
  150. // Act
  151. Application.RaiseKeyDownEvent (Key.N.WithAlt);
  152. Assert.True (menuBar.IsActive ());
  153. Assert.True (menuBar.IsOpen ());
  154. Assert.True (menuBarItem.PopoverMenu.Visible);
  155. Application.RaiseKeyDownEvent (Key.N.WithAlt);
  156. Assert.False (menuBar.IsActive ());
  157. Assert.False (menuBar.IsOpen ());
  158. Assert.False (menuBar.HasFocus);
  159. Assert.False (menuBar.CanFocus);
  160. Assert.False (menuBarItem.PopoverMenu.Visible);
  161. Assert.False (menuBarItem.PopoverMenu.HasFocus);
  162. Application.End (rs);
  163. top.Dispose ();
  164. }
  165. [Fact]
  166. [AutoInitShutdown]
  167. public void MenuItem_HotKey_Deactivates ()
  168. {
  169. // Arrange
  170. int action = 0;
  171. var menuItem = new MenuItemv2 { Id = "menuItem", Title = "_Item", Action = () => action++ };
  172. var menu = new Menuv2 ([menuItem]) { Id = "menu" };
  173. var menuBarItem = new MenuBarItemv2 { Id = "menuBarItem", Title = "_New" };
  174. var menuBarItemPopover = new PopoverMenu ();
  175. menuBarItem.PopoverMenu = menuBarItemPopover;
  176. menuBarItemPopover.Root = menu;
  177. var menuBar = new MenuBarv2 () { Id = "menuBar" };
  178. menuBar.Add (menuBarItem);
  179. Assert.Single (menuBar.SubViews);
  180. Assert.Single (menuBarItem.SubViews);
  181. var top = new Toplevel ();
  182. top.Add (menuBar);
  183. RunState rs = Application.Begin (top);
  184. Assert.False (menuBar.IsActive ());
  185. // Act
  186. Application.RaiseKeyDownEvent (Key.N.WithAlt);
  187. Assert.True (menuBar.IsActive ());
  188. Assert.True (menuBarItem.PopoverMenu.Visible);
  189. Application.RaiseKeyDownEvent (Key.I);
  190. Assert.Equal (1, action);
  191. Assert.False (menuBar.IsActive ());
  192. Assert.False (menuBar.IsOpen ());
  193. Assert.False (menuBar.HasFocus);
  194. Assert.False (menuBar.CanFocus);
  195. Assert.False (menuBarItem.PopoverMenu.Visible);
  196. Assert.False (menuBarItem.PopoverMenu.HasFocus);
  197. Application.End (rs);
  198. top.Dispose ();
  199. }
  200. [Fact]
  201. [AutoInitShutdown]
  202. public void HotKey_Activates_Only_Once ()
  203. {
  204. // Arrange
  205. var menuItem = new MenuItemv2 { Id = "menuItem", Title = "_Item" };
  206. var menu = new Menuv2 ([menuItem]) { Id = "menu" };
  207. var menuBarItem = new MenuBarItemv2 { Id = "menuBarItem", Title = "_New" };
  208. var menuBarItemPopover = new PopoverMenu ();
  209. menuBarItem.PopoverMenu = menuBarItemPopover;
  210. menuBarItemPopover.Root = menu;
  211. var menuBar = new MenuBarv2 () { Id = "menuBar" };
  212. menuBar.Add (menuBarItem);
  213. Assert.Single (menuBar.SubViews);
  214. Assert.Single (menuBarItem.SubViews);
  215. var top = new Toplevel ();
  216. top.Add (menuBar);
  217. RunState rs = Application.Begin (top);
  218. Assert.False (menuBar.IsActive ());
  219. int visibleChangeCount = 0;
  220. menuBarItemPopover.VisibleChanged += (sender, args) =>
  221. {
  222. if (menuBarItemPopover.Visible)
  223. {
  224. visibleChangeCount++;
  225. }
  226. };
  227. // Act
  228. Application.RaiseKeyDownEvent (Key.N.WithAlt);
  229. Assert.Equal (1, visibleChangeCount);
  230. Application.End (rs);
  231. top.Dispose ();
  232. }
  233. [Fact]
  234. [AutoInitShutdown]
  235. public void WhenActive_Other_MenuBarItem_HotKey_Activates ()
  236. {
  237. // Arrange
  238. var menuItem = new MenuItemv2 { Id = "menuItem", Title = "_Item" };
  239. var menu = new Menuv2 ([menuItem]) { Id = "menu" };
  240. var menuBarItem = new MenuBarItemv2 { Id = "menuBarItem", Title = "_New" };
  241. var menuBarItemPopover = new PopoverMenu ();
  242. menuBarItem.PopoverMenu = menuBarItemPopover;
  243. menuBarItemPopover.Root = menu;
  244. var menuItem2 = new MenuItemv2 { Id = "menuItem2", Title = "_Copy" };
  245. var menu2 = new Menuv2 ([menuItem2]) { Id = "menu2" };
  246. var menuBarItem2 = new MenuBarItemv2 () { Id = "menuBarItem2", Title = "_Edit" };
  247. var menuBarItemPopover2 = new PopoverMenu () { Id = "menuBarItemPopover2" };
  248. menuBarItem2.PopoverMenu = menuBarItemPopover2;
  249. menuBarItemPopover2.Root = menu2;
  250. var menuBar = new MenuBarv2 () { Id = "menuBar" };
  251. menuBar.Add (menuBarItem);
  252. menuBar.Add (menuBarItem2);
  253. var top = new Toplevel ();
  254. top.Add (menuBar);
  255. RunState rs = Application.Begin (top);
  256. Assert.False (menuBar.IsActive ());
  257. // Act
  258. Application.RaiseKeyDownEvent (Key.N.WithAlt);
  259. Assert.True (menuBar.IsActive ());
  260. Assert.True (menuBar.IsOpen ());
  261. Assert.True (menuBarItem.PopoverMenu.Visible);
  262. Application.RaiseKeyDownEvent (Key.E.WithAlt);
  263. Assert.True (menuBar.IsActive ());
  264. Assert.True (menuBar.IsOpen ());
  265. Assert.True (menuBarItem2.PopoverMenu.Visible);
  266. Assert.False (menuBarItem.PopoverMenu.Visible);
  267. Application.End (rs);
  268. top.Dispose ();
  269. }
  270. [Fact]
  271. [AutoInitShutdown]
  272. public void Mouse_Enter_Sets_Can_Focus_But_Does_Not_Activate ()
  273. {
  274. // Arrange
  275. var menuItem = new MenuItemv2 { Id = "menuItem", Title = "_Item" };
  276. var menu = new Menuv2 ([menuItem]) { Id = "menu" };
  277. var menuBarItem = new MenuBarItemv2 { Id = "menuBarItem", Title = "_New" };
  278. var menuBarItemPopover = new PopoverMenu ();
  279. menuBarItem.PopoverMenu = menuBarItemPopover;
  280. menuBarItemPopover.Root = menu;
  281. var menuBar = new MenuBarv2 () { Id = "menuBar" };
  282. menuBar.Add (menuBarItem);
  283. Assert.Single (menuBar.SubViews);
  284. Assert.Single (menuBarItem.SubViews);
  285. var top = new Toplevel ();
  286. top.Add (menuBar);
  287. RunState rs = Application.Begin (top);
  288. Assert.False (menuBar.IsActive ());
  289. // Act
  290. Application.RaiseMouseEvent (new ()
  291. {
  292. Flags = MouseFlags.ReportMousePosition
  293. });
  294. Assert.False (menuBar.IsActive ());
  295. Assert.False (menuBar.IsOpen ());
  296. Assert.True (menuBar.HasFocus);
  297. Assert.True (menuBar.CanFocus);
  298. Assert.False (menuBarItem.PopoverMenu.Visible);
  299. Assert.False (menuBarItem.PopoverMenu.HasFocus);
  300. Application.End (rs);
  301. top.Dispose ();
  302. }
  303. [Fact]
  304. [AutoInitShutdown]
  305. public void Mouse_Click_Activates ()
  306. {
  307. // Arrange
  308. var menuItem = new MenuItemv2 { Id = "menuItem", Title = "_Item" };
  309. var menu = new Menuv2 ([menuItem]) { Id = "menu" };
  310. var menuBarItem = new MenuBarItemv2 { Id = "menuBarItem", Title = "_New" };
  311. var menuBarItemPopover = new PopoverMenu ();
  312. menuBarItem.PopoverMenu = menuBarItemPopover;
  313. menuBarItemPopover.Root = menu;
  314. var menuBar = new MenuBarv2 () { Id = "menuBar" };
  315. menuBar.Add (menuBarItem);
  316. Assert.Single (menuBar.SubViews);
  317. Assert.Single (menuBarItem.SubViews);
  318. var top = new Toplevel ();
  319. top.Add (menuBar);
  320. RunState rs = Application.Begin (top);
  321. Assert.False (menuBar.IsActive ());
  322. // Act
  323. Application.RaiseMouseEvent (new ()
  324. {
  325. Flags = MouseFlags.Button1Clicked
  326. });
  327. Assert.True (menuBar.IsActive ());
  328. Assert.True (menuBar.IsOpen ());
  329. Assert.True (menuBar.HasFocus);
  330. Assert.True (menuBar.CanFocus);
  331. Assert.True (menuBarItem.PopoverMenu.Visible);
  332. Assert.True (menuBarItem.PopoverMenu.HasFocus);
  333. Application.End (rs);
  334. top.Dispose ();
  335. }
  336. // QUESTION: Windows' menus close the menu when you click on the menu bar item again.
  337. // QUESTION: What does Mac do?
  338. // QUESTION: How bad is it that this test is skipped?
  339. // QUESTION: Fixing this could be challenging. Should we fix it?
  340. [Fact (Skip = "Clicking outside Popover, passes mouse event to MenuBar, which activates the same item again.")]
  341. [AutoInitShutdown]
  342. public void Mouse_Click_Deactivates ()
  343. {
  344. // Arrange
  345. // Arrange
  346. var menuItem = new MenuItemv2 { Id = "menuItem", Title = "_Item" };
  347. var menu = new Menuv2 ([menuItem]) { Id = "menu" };
  348. var menuBarItem = new MenuBarItemv2 { Id = "menuBarItem", Title = "_New" };
  349. var menuBarItemPopover = new PopoverMenu ();
  350. menuBarItem.PopoverMenu = menuBarItemPopover;
  351. menuBarItemPopover.Root = menu;
  352. var menuBar = new MenuBarv2 () { Id = "menuBar" };
  353. menuBar.Add (menuBarItem);
  354. Assert.Single (menuBar.SubViews);
  355. Assert.Single (menuBarItem.SubViews);
  356. var top = new Toplevel ();
  357. top.Add (menuBar);
  358. RunState rs = Application.Begin (top);
  359. Assert.False (menuBar.IsActive ());
  360. Application.RaiseMouseEvent (new ()
  361. {
  362. Flags = MouseFlags.Button1Clicked
  363. });
  364. Assert.True (menuBar.IsOpen ());
  365. Assert.True (menuBar.HasFocus);
  366. Assert.True (menuBar.CanFocus);
  367. Assert.True (menuBarItem.PopoverMenu.Visible);
  368. Assert.True (menuBarItem.PopoverMenu.HasFocus);
  369. // Act
  370. Application.RaiseMouseEvent (new ()
  371. {
  372. Flags = MouseFlags.Button1Clicked
  373. });
  374. Assert.False (menuBar.IsActive ());
  375. Assert.False (menuBar.IsOpen ());
  376. Assert.False (menuBar.HasFocus);
  377. Assert.False (menuBar.CanFocus);
  378. Assert.False (menuBarItem.PopoverMenu.Visible);
  379. Assert.False (menuBarItem.PopoverMenu.HasFocus);
  380. Application.End (rs);
  381. top.Dispose ();
  382. }
  383. [Fact]
  384. [AutoInitShutdown]
  385. public void Dynamic_Change_MenuItem_Title ()
  386. {
  387. // Arrange
  388. int action = 0;
  389. var menuItem = new MenuItemv2 { Title = "_Item", Action = () => action++ };
  390. var menu = new Menuv2 ([menuItem]) { Id = "menu" };
  391. var menuBarItem = new MenuBarItemv2 { Title = "_New" };
  392. var menuBarItemPopover = new PopoverMenu ();
  393. menuBarItem.PopoverMenu = menuBarItemPopover;
  394. menuBarItemPopover.Root = menu;
  395. var menuBar = new MenuBarv2 ();
  396. menuBar.Add (menuBarItem);
  397. Assert.Single (menuBar.SubViews);
  398. Assert.Single (menuBarItem.SubViews);
  399. var top = new Toplevel ();
  400. top.Add (menuBar);
  401. RunState rs = Application.Begin (top);
  402. Assert.False (menuBar.IsActive());
  403. Application.RaiseKeyDownEvent (Key.N.WithAlt);
  404. Assert.Equal (0, action);
  405. Assert.Equal(Key.I, menuItem.HotKey);
  406. Application.RaiseKeyDownEvent (Key.I);
  407. Assert.Equal (1, action);
  408. Assert.False (menuBar.IsActive ());
  409. menuItem.Title = "_Foo";
  410. Application.RaiseKeyDownEvent (Key.N.WithAlt);
  411. Assert.True (menuBar.IsActive ());
  412. Application.RaiseKeyDownEvent (Key.I);
  413. Assert.Equal (1, action);
  414. Assert.True (menuBar.IsActive ());
  415. Application.RaiseKeyDownEvent (Key.F);
  416. Assert.Equal (2, action);
  417. Application.End (rs);
  418. top.Dispose ();
  419. }
  420. [Fact]
  421. [AutoInitShutdown (configLocation: ConfigLocations.Default)]
  422. public void Disabled_MenuBar_Is_Not_Activated ()
  423. {
  424. // Arrange
  425. var menuItem = new MenuItemv2 { Id = "menuItem", Title = "_Item" };
  426. var menu = new Menuv2 ([menuItem]) { Id = "menu" };
  427. var menuBarItem = new MenuBarItemv2 { Id = "menuBarItem", Title = "_New" };
  428. var menuBarItemPopover = new PopoverMenu ();
  429. menuBarItem.PopoverMenu = menuBarItemPopover;
  430. menuBarItemPopover.Root = menu;
  431. var menuBar = new MenuBarv2 () { Id = "menuBar" };
  432. menuBar.Add (menuBarItem);
  433. Assert.Single (menuBar.SubViews);
  434. Assert.Single (menuBarItem.SubViews);
  435. var top = new Toplevel ();
  436. top.Add (menuBar);
  437. RunState rs = Application.Begin (top);
  438. Assert.False (menuBar.IsActive ());
  439. // Act
  440. menuBar.Enabled = false;
  441. Application.RaiseKeyDownEvent (Key.N.WithAlt);
  442. Assert.False (menuBar.IsActive ());
  443. Assert.False (menuBar.IsOpen ());
  444. Assert.False (menuBarItem.PopoverMenu.Visible);
  445. Application.End (rs);
  446. top.Dispose ();
  447. }
  448. [Fact]
  449. [AutoInitShutdown (configLocation: ConfigLocations.Default)]
  450. public void Disabled_MenuBarItem_Is_Not_Activated ()
  451. {
  452. // Arrange
  453. var menuItem = new MenuItemv2 { Id = "menuItem", Title = "_Item" };
  454. var menu = new Menuv2 ([menuItem]) { Id = "menu" };
  455. var menuBarItem = new MenuBarItemv2 { Id = "menuBarItem", Title = "_New" };
  456. var menuBarItemPopover = new PopoverMenu ();
  457. menuBarItem.PopoverMenu = menuBarItemPopover;
  458. menuBarItemPopover.Root = menu;
  459. var menuBar = new MenuBarv2 () { Id = "menuBar" };
  460. menuBar.Add (menuBarItem);
  461. Assert.Single (menuBar.SubViews);
  462. Assert.Single (menuBarItem.SubViews);
  463. var top = new Toplevel ();
  464. top.Add (menuBar);
  465. RunState rs = Application.Begin (top);
  466. Assert.False (menuBar.IsActive ());
  467. // Act
  468. menuBarItem.Enabled = false;
  469. Application.RaiseKeyDownEvent (Key.N.WithAlt);
  470. Assert.False (menuBar.IsActive ());
  471. Assert.False (menuBar.IsOpen ());
  472. Assert.False (menuBarItem.PopoverMenu.Visible);
  473. Application.End (rs);
  474. top.Dispose ();
  475. }
  476. [Fact]
  477. [AutoInitShutdown (configLocation: ConfigLocations.Default)]
  478. public void Disabled_MenuBarItem_Popover_Is_Activated ()
  479. {
  480. // Arrange
  481. var menuItem = new MenuItemv2 { Id = "menuItem", Title = "_Item" };
  482. var menu = new Menuv2 ([menuItem]) { Id = "menu" };
  483. var menuBarItem = new MenuBarItemv2 { Id = "menuBarItem", Title = "_New" };
  484. var menuBarItemPopover = new PopoverMenu ();
  485. menuBarItem.PopoverMenu = menuBarItemPopover;
  486. menuBarItemPopover.Root = menu;
  487. var menuBar = new MenuBarv2 () { Id = "menuBar" };
  488. menuBar.Add (menuBarItem);
  489. Assert.Single (menuBar.SubViews);
  490. Assert.Single (menuBarItem.SubViews);
  491. var top = new Toplevel ();
  492. top.Add (menuBar);
  493. RunState rs = Application.Begin (top);
  494. Assert.False (menuBar.IsActive ());
  495. // Act
  496. menuBarItem.PopoverMenu.Enabled = false;
  497. Application.RaiseKeyDownEvent (Key.N.WithAlt);
  498. Assert.True (menuBar.IsActive ());
  499. Assert.True (menuBar.IsOpen ());
  500. Assert.True (menuBarItem.PopoverMenu.Visible);
  501. Application.End (rs);
  502. top.Dispose ();
  503. }
  504. [Fact (Skip = "For v2, should the menu close on resize?")]
  505. [AutoInitShutdown]
  506. public void Resizing_Closes_Menus ()
  507. {
  508. }
  509. [Fact]
  510. [AutoInitShutdown]
  511. public void Update_MenuBarItem_HotKey_Works ()
  512. {
  513. // Arrange
  514. var menuItem = new MenuItemv2 { Id = "menuItem", Title = "_Item" };
  515. var menu = new Menuv2 ([menuItem]) { Id = "menu" };
  516. var menuBarItem = new MenuBarItemv2 { Id = "menuBarItem", Title = "_New" };
  517. var menuBarItemPopover = new PopoverMenu ();
  518. menuBarItem.PopoverMenu = menuBarItemPopover;
  519. menuBarItemPopover.Root = menu;
  520. var menuBar = new MenuBarv2 () { Id = "menuBar" };
  521. menuBar.Add (menuBarItem);
  522. Assert.Single (menuBar.SubViews);
  523. Assert.Single (menuBarItem.SubViews);
  524. var top = new Toplevel ();
  525. top.Add (menuBar);
  526. RunState rs = Application.Begin (top);
  527. Assert.False (menuBar.IsActive ());
  528. Application.RaiseKeyDownEvent (Key.N.WithAlt);
  529. Assert.True (menuBar.IsOpen ());
  530. Assert.True (menuBar.HasFocus);
  531. Assert.True (menuBarItem.PopoverMenu.Visible);
  532. Assert.True (menuBarItem.PopoverMenu.HasFocus);
  533. // Act
  534. menuBarItem.HotKey = Key.E.WithAlt;
  535. // old key should do nothing
  536. Application.RaiseKeyDownEvent (Key.N.WithAlt);
  537. Assert.True (menuBar.IsOpen ());
  538. Assert.True (menuBar.HasFocus);
  539. Assert.True (menuBarItem.PopoverMenu.Visible);
  540. Assert.True (menuBarItem.PopoverMenu.HasFocus);
  541. // use new key
  542. Application.RaiseKeyDownEvent (Key.E.WithAlt);
  543. Assert.False (menuBar.IsActive ());
  544. Assert.False (menuBar.IsOpen ());
  545. Assert.False (menuBar.HasFocus);
  546. Assert.False (menuBar.CanFocus);
  547. Assert.False (menuBarItem.PopoverMenu.Visible);
  548. Assert.False (menuBarItem.PopoverMenu.HasFocus);
  549. Application.End (rs);
  550. top.Dispose ();
  551. }
  552. [Fact]
  553. [AutoInitShutdown]
  554. public void Visible_False_HotKey_Does_Not_Activate ()
  555. {
  556. // Arrange
  557. var menuItem = new MenuItemv2 { Id = "menuItem", Title = "_Item" };
  558. var menu = new Menuv2 ([menuItem]) { Id = "menu" };
  559. var menuBarItem = new MenuBarItemv2 { Id = "menuBarItem", Title = "_New" };
  560. var menuBarItemPopover = new PopoverMenu ();
  561. menuBarItem.PopoverMenu = menuBarItemPopover;
  562. menuBarItemPopover.Root = menu;
  563. var menuBar = new MenuBarv2 () { Id = "menuBar" };
  564. menuBar.Add (menuBarItem);
  565. Assert.Single (menuBar.SubViews);
  566. Assert.Single (menuBarItem.SubViews);
  567. var top = new Toplevel ();
  568. top.Add (menuBar);
  569. RunState rs = Application.Begin (top);
  570. Assert.False (menuBar.IsActive ());
  571. // Act
  572. menuBar.Visible = false;
  573. Application.RaiseKeyDownEvent (Key.N.WithAlt);
  574. Assert.False (menuBar.IsActive ());
  575. Assert.False (menuBar.IsOpen ());
  576. Assert.False (menuBar.HasFocus);
  577. Assert.False (menuBar.CanFocus);
  578. Assert.False (menuBarItem.PopoverMenu.Visible);
  579. Assert.False (menuBarItem.PopoverMenu.HasFocus);
  580. Application.End (rs);
  581. top.Dispose ();
  582. }
  583. [Fact]
  584. [AutoInitShutdown]
  585. public void Visible_False_MenuItem_Key_Does_Action ()
  586. {
  587. // Arrange
  588. int action = 0;
  589. var menuItem = new MenuItemv2 ()
  590. {
  591. Id = "menuItem",
  592. Title = "_Item",
  593. Key = Key.F1,
  594. Action = () => action++
  595. };
  596. var menu = new Menuv2 ([menuItem]) { Id = "menu" };
  597. var menuBarItem = new MenuBarItemv2 { Id = "menuBarItem", Title = "_New" };
  598. var menuBarItemPopover = new PopoverMenu ();
  599. menuBarItem.PopoverMenu = menuBarItemPopover;
  600. menuBarItemPopover.Root = menu;
  601. var menuBar = new MenuBarv2 () { Id = "menuBar" };
  602. menuBar.Add (menuBarItem);
  603. Assert.Single (menuBar.SubViews);
  604. Assert.Single (menuBarItem.SubViews);
  605. var top = new Toplevel ();
  606. top.Add (menuBar);
  607. RunState rs = Application.Begin (top);
  608. Assert.False (menuBar.IsActive ());
  609. // Act
  610. menuBar.Visible = false;
  611. Application.RaiseKeyDownEvent (Key.F1);
  612. Assert.Equal (1, action);
  613. Application.End (rs);
  614. top.Dispose ();
  615. }
  616. }