MenuBarTests.cs 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725
  1. using UnitTests;
  2. using Xunit.Abstractions;
  3. namespace UnitTests.ViewsTests;
  4. public class MenuBarTests ()
  5. {
  6. [Fact]
  7. [AutoInitShutdown]
  8. public void DefaultKey_Activates_And_Opens ()
  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.Active);
  25. // Act
  26. Application.RaiseKeyDownEvent (MenuBarv2.DefaultKey);
  27. Assert.True (menuBar.Active);
  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.Active);
  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.Active);
  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 = "Menu_Item" };
  75. var menu = new Menuv2 ([menuItem]) { Id = "menu" };
  76. var menuBarItem = new MenuBarItemv2 { Id = "menuBarItem", Title = "_MenuBarItem" };
  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. Application.RaiseKeyDownEvent (MenuBarv2.DefaultKey);
  88. Assert.True (menuBar.Active);
  89. Assert.True (menuBar.IsOpen ());
  90. Assert.True (menuBarItem.PopoverMenu.Visible);
  91. // Act
  92. Application.RaiseKeyDownEvent (Application.QuitKey);
  93. Assert.False (menuBar.Active);
  94. Assert.False (menuBar.IsOpen ());
  95. Assert.False (menuBar.HasFocus);
  96. Assert.False (menuBar.CanFocus);
  97. Assert.False (menuBarItem.PopoverMenu.Visible);
  98. Assert.False (menuBarItem.PopoverMenu.HasFocus);
  99. Application.End (rs);
  100. top.Dispose ();
  101. }
  102. [Fact]
  103. [AutoInitShutdown]
  104. public void MenuBarItem_HotKey_Activates_And_Opens ()
  105. {
  106. // Arrange
  107. var menuItem = new MenuItemv2 { Id = "menuItem", Title = "_Item" };
  108. var menu = new Menuv2 ([menuItem]) { Id = "menu" };
  109. var menuBarItem = new MenuBarItemv2 { Id = "menuBarItem", Title = "_New" };
  110. var menuBarItemPopover = new PopoverMenu ();
  111. menuBarItem.PopoverMenu = menuBarItemPopover;
  112. menuBarItemPopover.Root = menu;
  113. var menuBar = new MenuBarv2 () { Id = "menuBar" };
  114. menuBar.Add (menuBarItem);
  115. Assert.Single (menuBar.SubViews);
  116. Assert.Single (menuBarItem.SubViews);
  117. var top = new Toplevel ();
  118. top.Add (menuBar);
  119. RunState rs = Application.Begin (top);
  120. Assert.False (menuBar.Active);
  121. // Act
  122. Application.RaiseKeyDownEvent (Key.N.WithAlt);
  123. Assert.True (menuBar.Active);
  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.Active);
  150. // Act
  151. Application.RaiseKeyDownEvent (Key.N.WithAlt);
  152. Assert.True (menuBar.Active);
  153. Assert.True (menuBar.IsOpen ());
  154. Assert.True (menuBarItem.PopoverMenu.Visible);
  155. Application.RaiseKeyDownEvent (Key.N.WithAlt);
  156. Assert.False (menuBar.Active);
  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 MenuItems_HotKey_RaisesAction ()
  168. {
  169. // Arrange
  170. int action = 0;
  171. var menuItem = new MenuItemv2 { Id = "menuItem", Title = "Menu_Item", Action = () => action++ };
  172. var menu = new Menuv2 ([menuItem]) { Id = "menu" };
  173. var menuBarItem = new MenuBarItemv2 { Id = "menuBarItem", Title = "_MenuBarItem" };
  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.Active);
  185. Application.RaiseKeyDownEvent (Key.M.WithAlt);
  186. Assert.True (menuBar.Active);
  187. Assert.True (menuBar.CanFocus);
  188. Assert.True (menuBarItem.PopoverMenu.Visible);
  189. // Act
  190. Application.RaiseKeyDownEvent (Key.I);
  191. Assert.Equal (1, action);
  192. Application.End (rs);
  193. top.Dispose ();
  194. }
  195. [Fact]
  196. [AutoInitShutdown]
  197. public void MenuItems_HotKey_Deactivates ()
  198. {
  199. // Arrange
  200. var menuItem = new MenuItemv2 { Id = "menuItem", Title = "Menu_Item" };
  201. var menu = new Menuv2 ([menuItem]) { Id = "menu" };
  202. var menuBarItem = new MenuBarItemv2 { Id = "menuBarItem", Title = "_MenuBarItem" };
  203. var menuBarItemPopover = new PopoverMenu ();
  204. menuBarItem.PopoverMenu = menuBarItemPopover;
  205. menuBarItemPopover.Root = menu;
  206. var menuBar = new MenuBarv2 () { Id = "menuBar" };
  207. menuBar.Add (menuBarItem);
  208. Assert.Single (menuBar.SubViews);
  209. Assert.Single (menuBarItem.SubViews);
  210. var top = new Toplevel ();
  211. top.Add (menuBar);
  212. RunState rs = Application.Begin (top);
  213. Assert.False (menuBar.Active);
  214. Application.RaiseKeyDownEvent (Key.M.WithAlt);
  215. Assert.True (menuBar.Active);
  216. Assert.True (menuBarItem.PopoverMenu.Visible);
  217. // Act
  218. Application.RaiseKeyDownEvent (Key.I);
  219. Assert.False (menuBar.Active);
  220. Assert.False (menuBar.IsOpen ());
  221. Assert.False (menuBar.HasFocus);
  222. Assert.False (menuBar.CanFocus);
  223. Assert.False (menuBarItem.PopoverMenu.Visible);
  224. Assert.False (menuBarItem.PopoverMenu.HasFocus);
  225. Application.End (rs);
  226. top.Dispose ();
  227. }
  228. [Fact]
  229. [AutoInitShutdown]
  230. public void HotKey_Makes_PopoverMenu_Visible_Only_Once ()
  231. {
  232. // Arrange
  233. var menuItem = new MenuItemv2 { Id = "menuItem", Title = "_Item" };
  234. var menu = new Menuv2 ([menuItem]) { Id = "menu" };
  235. var menuBarItem = new MenuBarItemv2 { Id = "menuBarItem", Title = "_New" };
  236. var menuBarItemPopover = new PopoverMenu ();
  237. menuBarItem.PopoverMenu = menuBarItemPopover;
  238. menuBarItemPopover.Root = menu;
  239. var menuBar = new MenuBarv2 () { Id = "menuBar" };
  240. menuBar.Add (menuBarItem);
  241. Assert.Single (menuBar.SubViews);
  242. Assert.Single (menuBarItem.SubViews);
  243. var top = new Toplevel ();
  244. top.Add (menuBar);
  245. RunState rs = Application.Begin (top);
  246. Assert.False (menuBar.Active);
  247. int visibleChangeCount = 0;
  248. menuBarItemPopover.VisibleChanged += (sender, args) =>
  249. {
  250. if (menuBarItemPopover.Visible)
  251. {
  252. visibleChangeCount++;
  253. }
  254. };
  255. // Act
  256. Application.RaiseKeyDownEvent (Key.N.WithAlt);
  257. Assert.Equal (1, visibleChangeCount);
  258. Application.End (rs);
  259. top.Dispose ();
  260. }
  261. [Fact]
  262. [AutoInitShutdown]
  263. public void WhenOpen_Other_MenuBarItem_HotKey_Activates_And_Opens ()
  264. {
  265. // Arrange
  266. var menuItem = new MenuItemv2 { Id = "menuItem", Title = "_Item" };
  267. var menu = new Menuv2 ([menuItem]) { Id = "menu" };
  268. var menuBarItem = new MenuBarItemv2 { Id = "menuBarItem", Title = "_New" };
  269. var menuBarItemPopover = new PopoverMenu ();
  270. menuBarItem.PopoverMenu = menuBarItemPopover;
  271. menuBarItemPopover.Root = menu;
  272. var menuItem2 = new MenuItemv2 { Id = "menuItem2", Title = "_Copy" };
  273. var menu2 = new Menuv2 ([menuItem2]) { Id = "menu2" };
  274. var menuBarItem2 = new MenuBarItemv2 () { Id = "menuBarItem2", Title = "_Edit" };
  275. var menuBarItemPopover2 = new PopoverMenu () { Id = "menuBarItemPopover2" };
  276. menuBarItem2.PopoverMenu = menuBarItemPopover2;
  277. menuBarItemPopover2.Root = menu2;
  278. var menuBar = new MenuBarv2 () { Id = "menuBar" };
  279. menuBar.Add (menuBarItem);
  280. menuBar.Add (menuBarItem2);
  281. var top = new Toplevel ();
  282. top.Add (menuBar);
  283. RunState rs = Application.Begin (top);
  284. Assert.False (menuBar.Active);
  285. Assert.False (menuBar.IsOpen ());
  286. // Act
  287. Application.RaiseKeyDownEvent (Key.N.WithAlt);
  288. Assert.True (menuBar.Active);
  289. Assert.True (menuBar.IsOpen ());
  290. Assert.True (menuBarItem.PopoverMenu.Visible);
  291. Application.RaiseKeyDownEvent (Key.E.WithAlt);
  292. Assert.True (menuBar.Active);
  293. Assert.True (menuBar.IsOpen ());
  294. Assert.True (menuBarItem2.PopoverMenu.Visible);
  295. Assert.False (menuBarItem.PopoverMenu.Visible);
  296. Application.End (rs);
  297. top.Dispose ();
  298. }
  299. [Fact]
  300. [AutoInitShutdown]
  301. public void Mouse_Enter_Activates_But_Does_Not_Open ()
  302. {
  303. // Arrange
  304. var menuItem = new MenuItemv2 { Id = "menuItem", Title = "_Item" };
  305. var menu = new Menuv2 ([menuItem]) { Id = "menu" };
  306. var menuBarItem = new MenuBarItemv2 { Id = "menuBarItem", Title = "_New" };
  307. var menuBarItemPopover = new PopoverMenu ();
  308. menuBarItem.PopoverMenu = menuBarItemPopover;
  309. menuBarItemPopover.Root = menu;
  310. var menuBar = new MenuBarv2 () { Id = "menuBar" };
  311. menuBar.Add (menuBarItem);
  312. Assert.Single (menuBar.SubViews);
  313. Assert.Single (menuBarItem.SubViews);
  314. var top = new Toplevel ();
  315. top.Add (menuBar);
  316. RunState rs = Application.Begin (top);
  317. Assert.False (menuBar.Active);
  318. // Act
  319. Application.RaiseMouseEvent (new ()
  320. {
  321. Flags = MouseFlags.ReportMousePosition
  322. });
  323. Assert.True (menuBar.Active);
  324. Assert.False (menuBar.IsOpen ());
  325. Assert.True (menuBar.HasFocus);
  326. Assert.True (menuBar.CanFocus);
  327. Assert.False (menuBarItem.PopoverMenu.Visible);
  328. Assert.False (menuBarItem.PopoverMenu.HasFocus);
  329. Application.End (rs);
  330. top.Dispose ();
  331. }
  332. [Fact]
  333. [AutoInitShutdown]
  334. public void Mouse_Click_Activates_And_Opens ()
  335. {
  336. // Arrange
  337. var menuItem = new MenuItemv2 { Id = "menuItem", Title = "_Item" };
  338. var menu = new Menuv2 ([menuItem]) { Id = "menu" };
  339. var menuBarItem = new MenuBarItemv2 { Id = "menuBarItem", Title = "_New" };
  340. var menuBarItemPopover = new PopoverMenu ();
  341. menuBarItem.PopoverMenu = menuBarItemPopover;
  342. menuBarItemPopover.Root = menu;
  343. var menuBar = new MenuBarv2 () { Id = "menuBar" };
  344. menuBar.Add (menuBarItem);
  345. Assert.Single (menuBar.SubViews);
  346. Assert.Single (menuBarItem.SubViews);
  347. var top = new Toplevel ();
  348. top.Add (menuBar);
  349. RunState rs = Application.Begin (top);
  350. Assert.False (menuBar.Active);
  351. // Act
  352. Application.RaiseMouseEvent (new ()
  353. {
  354. Flags = MouseFlags.Button1Clicked
  355. });
  356. Assert.True (menuBar.Active);
  357. Assert.True (menuBar.IsOpen ());
  358. Assert.True (menuBar.HasFocus);
  359. Assert.True (menuBar.CanFocus);
  360. Assert.True (menuBarItem.PopoverMenu.Visible);
  361. Assert.True (menuBarItem.PopoverMenu.HasFocus);
  362. Application.End (rs);
  363. top.Dispose ();
  364. }
  365. // QUESTION: Windows' menus close the menu when you click on the menu bar item again.
  366. // QUESTION: What does Mac do?
  367. // QUESTION: How bad is it that this test is skipped?
  368. // QUESTION: Fixing this could be challenging. Should we fix it?
  369. [Fact (Skip = "Clicking outside Popover, passes mouse event to MenuBar, which activates the same item again.")]
  370. [AutoInitShutdown]
  371. public void Mouse_Click_Deactivates ()
  372. {
  373. // Arrange
  374. // Arrange
  375. var menuItem = new MenuItemv2 { Id = "menuItem", Title = "_Item" };
  376. var menu = new Menuv2 ([menuItem]) { Id = "menu" };
  377. var menuBarItem = new MenuBarItemv2 { Id = "menuBarItem", Title = "_New" };
  378. var menuBarItemPopover = new PopoverMenu ();
  379. menuBarItem.PopoverMenu = menuBarItemPopover;
  380. menuBarItemPopover.Root = menu;
  381. var menuBar = new MenuBarv2 () { Id = "menuBar" };
  382. menuBar.Add (menuBarItem);
  383. Assert.Single (menuBar.SubViews);
  384. Assert.Single (menuBarItem.SubViews);
  385. var top = new Toplevel ();
  386. top.Add (menuBar);
  387. RunState rs = Application.Begin (top);
  388. Assert.False (menuBar.Active);
  389. Application.RaiseMouseEvent (new ()
  390. {
  391. Flags = MouseFlags.Button1Clicked
  392. });
  393. Assert.True (menuBar.IsOpen ());
  394. Assert.True (menuBar.HasFocus);
  395. Assert.True (menuBar.CanFocus);
  396. Assert.True (menuBarItem.PopoverMenu.Visible);
  397. Assert.True (menuBarItem.PopoverMenu.HasFocus);
  398. // Act
  399. Application.RaiseMouseEvent (new ()
  400. {
  401. Flags = MouseFlags.Button1Clicked
  402. });
  403. Assert.False (menuBar.Active);
  404. Assert.False (menuBar.IsOpen ());
  405. Assert.False (menuBar.HasFocus);
  406. Assert.False (menuBar.CanFocus);
  407. Assert.False (menuBarItem.PopoverMenu.Visible);
  408. Assert.False (menuBarItem.PopoverMenu.HasFocus);
  409. Application.End (rs);
  410. top.Dispose ();
  411. }
  412. [Fact]
  413. [AutoInitShutdown]
  414. public void Dynamic_Change_MenuItem_Title ()
  415. {
  416. // Arrange
  417. int action = 0;
  418. var menuItem = new MenuItemv2 { Title = "_Item", Action = () => action++ };
  419. var menu = new Menuv2 ([menuItem]) { Id = "menu" };
  420. var menuBarItem = new MenuBarItemv2 { Title = "_New" };
  421. var menuBarItemPopover = new PopoverMenu ();
  422. menuBarItem.PopoverMenu = menuBarItemPopover;
  423. menuBarItemPopover.Root = menu;
  424. var menuBar = new MenuBarv2 ();
  425. menuBar.Add (menuBarItem);
  426. Assert.Single (menuBar.SubViews);
  427. Assert.Single (menuBarItem.SubViews);
  428. var top = new Toplevel ();
  429. top.Add (menuBar);
  430. RunState rs = Application.Begin (top);
  431. Assert.False (menuBar.Active);
  432. Application.RaiseKeyDownEvent (Key.N.WithAlt);
  433. Assert.Equal (0, action);
  434. Assert.Equal(Key.I, menuItem.HotKey);
  435. Application.RaiseKeyDownEvent (Key.I);
  436. Assert.Equal (1, action);
  437. Assert.False (menuBar.Active);
  438. menuItem.Title = "_Foo";
  439. Application.RaiseKeyDownEvent (Key.N.WithAlt);
  440. Assert.True (menuBar.Active);
  441. Application.RaiseKeyDownEvent (Key.I);
  442. Assert.Equal (1, action);
  443. Assert.True (menuBar.Active);
  444. Application.RaiseKeyDownEvent (Key.F);
  445. Assert.Equal (2, action);
  446. Application.End (rs);
  447. top.Dispose ();
  448. }
  449. [Fact]
  450. [AutoInitShutdown]
  451. public void Disabled_MenuBar_Is_Not_Activated ()
  452. {
  453. // Arrange
  454. var menuItem = new MenuItemv2 { Id = "menuItem", Title = "_Item" };
  455. var menu = new Menuv2 ([menuItem]) { Id = "menu" };
  456. var menuBarItem = new MenuBarItemv2 { Id = "menuBarItem", Title = "_New" };
  457. var menuBarItemPopover = new PopoverMenu ();
  458. menuBarItem.PopoverMenu = menuBarItemPopover;
  459. menuBarItemPopover.Root = menu;
  460. var menuBar = new MenuBarv2 () { Id = "menuBar" };
  461. menuBar.Add (menuBarItem);
  462. Assert.Single (menuBar.SubViews);
  463. Assert.Single (menuBarItem.SubViews);
  464. var top = new Toplevel ();
  465. top.Add (menuBar);
  466. RunState rs = Application.Begin (top);
  467. Assert.False (menuBar.Active);
  468. // Act
  469. menuBar.Enabled = false;
  470. Application.RaiseKeyDownEvent (Key.N.WithAlt);
  471. Assert.False (menuBar.Active);
  472. Assert.False (menuBar.IsOpen ());
  473. Assert.False (menuBarItem.PopoverMenu.Visible);
  474. Application.End (rs);
  475. top.Dispose ();
  476. }
  477. [Fact]
  478. [AutoInitShutdown]
  479. public void MenuBarItem_Disabled_MenuBarItem_HotKey_No_Activate_Or_Open ()
  480. {
  481. // Arrange
  482. var menuItem = new MenuItemv2 { Id = "menuItem", Title = "_Item" };
  483. var menu = new Menuv2 ([menuItem]) { Id = "menu" };
  484. var menuBarItem = new MenuBarItemv2 { Id = "menuBarItem", Title = "_New" };
  485. var menuBarItemPopover = new PopoverMenu ();
  486. menuBarItem.PopoverMenu = menuBarItemPopover;
  487. menuBarItemPopover.Root = menu;
  488. var menuBar = new MenuBarv2 () { Id = "menuBar" };
  489. menuBar.Add (menuBarItem);
  490. Assert.Single (menuBar.SubViews);
  491. Assert.Single (menuBarItem.SubViews);
  492. var top = new Toplevel ();
  493. top.Add (menuBar);
  494. RunState rs = Application.Begin (top);
  495. Assert.False (menuBar.Active);
  496. // Act
  497. menuBarItem.Enabled = false;
  498. Application.RaiseKeyDownEvent (Key.N.WithAlt);
  499. Assert.False (menuBar.Active);
  500. Assert.False (menuBar.IsOpen ());
  501. Assert.False (menuBarItem.PopoverMenu.Visible);
  502. Application.End (rs);
  503. top.Dispose ();
  504. }
  505. [Fact]
  506. [AutoInitShutdown]
  507. public void MenuBarItem_Disabled_Popover_Is_Activated ()
  508. {
  509. // Arrange
  510. var menuItem = new MenuItemv2 { Id = "menuItem", Title = "_Item" };
  511. var menu = new Menuv2 ([menuItem]) { Id = "menu" };
  512. var menuBarItem = new MenuBarItemv2 { Id = "menuBarItem", Title = "_New" };
  513. var menuBarItemPopover = new PopoverMenu ();
  514. menuBarItem.PopoverMenu = menuBarItemPopover;
  515. menuBarItemPopover.Root = menu;
  516. var menuBar = new MenuBarv2 () { Id = "menuBar" };
  517. menuBar.Add (menuBarItem);
  518. Assert.Single (menuBar.SubViews);
  519. Assert.Single (menuBarItem.SubViews);
  520. var top = new Toplevel ();
  521. top.Add (menuBar);
  522. RunState rs = Application.Begin (top);
  523. Assert.False (menuBar.Active);
  524. // Act
  525. menuBarItem.PopoverMenu.Enabled = false;
  526. Application.RaiseKeyDownEvent (Key.N.WithAlt);
  527. Assert.True (menuBar.Active);
  528. Assert.True (menuBar.IsOpen ());
  529. Assert.True (menuBarItem.PopoverMenu.Visible);
  530. Application.End (rs);
  531. top.Dispose ();
  532. }
  533. [Fact (Skip = "For v2, should the menu close on resize?")]
  534. [AutoInitShutdown]
  535. public void Resizing_Closes_Menus ()
  536. {
  537. }
  538. [Fact]
  539. [AutoInitShutdown]
  540. public void Update_MenuBarItem_HotKey_Works ()
  541. {
  542. // Arrange
  543. var menuItem = new MenuItemv2 { Id = "menuItem", Title = "_Item" };
  544. var menu = new Menuv2 ([menuItem]) { Id = "menu" };
  545. var menuBarItem = new MenuBarItemv2 { Id = "menuBarItem", Title = "_New" };
  546. var menuBarItemPopover = new PopoverMenu ();
  547. menuBarItem.PopoverMenu = menuBarItemPopover;
  548. menuBarItemPopover.Root = menu;
  549. var menuBar = new MenuBarv2 () { Id = "menuBar" };
  550. menuBar.Add (menuBarItem);
  551. Assert.Single (menuBar.SubViews);
  552. Assert.Single (menuBarItem.SubViews);
  553. var top = new Toplevel ();
  554. top.Add (menuBar);
  555. RunState rs = Application.Begin (top);
  556. Assert.False (menuBar.Active);
  557. Application.RaiseKeyDownEvent (Key.N.WithAlt);
  558. Assert.True (menuBar.IsOpen ());
  559. Assert.True (menuBar.HasFocus);
  560. Assert.True (menuBarItem.PopoverMenu.Visible);
  561. Assert.True (menuBarItem.PopoverMenu.HasFocus);
  562. // Act
  563. menuBarItem.HotKey = Key.E.WithAlt;
  564. // old key should do nothing
  565. Application.RaiseKeyDownEvent (Key.N.WithAlt);
  566. Assert.True (menuBar.IsOpen ());
  567. Assert.True (menuBar.HasFocus);
  568. Assert.True (menuBarItem.PopoverMenu.Visible);
  569. Assert.True (menuBarItem.PopoverMenu.HasFocus);
  570. // use new key
  571. Application.RaiseKeyDownEvent (Key.E.WithAlt);
  572. Assert.False (menuBar.Active);
  573. Assert.False (menuBar.IsOpen ());
  574. Assert.False (menuBar.HasFocus);
  575. Assert.False (menuBar.CanFocus);
  576. Assert.False (menuBarItem.PopoverMenu.Visible);
  577. Assert.False (menuBarItem.PopoverMenu.HasFocus);
  578. Application.End (rs);
  579. top.Dispose ();
  580. }
  581. [Fact]
  582. [AutoInitShutdown]
  583. public void Visible_False_HotKey_Does_Not_Activate ()
  584. {
  585. // Arrange
  586. var menuItem = new MenuItemv2 { Id = "menuItem", Title = "_Item" };
  587. var menu = new Menuv2 ([menuItem]) { Id = "menu" };
  588. var menuBarItem = new MenuBarItemv2 { Id = "menuBarItem", Title = "_New" };
  589. var menuBarItemPopover = new PopoverMenu ();
  590. menuBarItem.PopoverMenu = menuBarItemPopover;
  591. menuBarItemPopover.Root = menu;
  592. var menuBar = new MenuBarv2 () { Id = "menuBar" };
  593. menuBar.Add (menuBarItem);
  594. Assert.Single (menuBar.SubViews);
  595. Assert.Single (menuBarItem.SubViews);
  596. var top = new Toplevel ();
  597. top.Add (menuBar);
  598. RunState rs = Application.Begin (top);
  599. Assert.False (menuBar.Active);
  600. // Act
  601. menuBar.Visible = false;
  602. Application.RaiseKeyDownEvent (Key.N.WithAlt);
  603. Assert.False (menuBar.Active);
  604. Assert.False (menuBar.IsOpen ());
  605. Assert.False (menuBar.HasFocus);
  606. Assert.False (menuBar.CanFocus);
  607. Assert.False (menuBarItem.PopoverMenu.Visible);
  608. Assert.False (menuBarItem.PopoverMenu.HasFocus);
  609. Application.End (rs);
  610. top.Dispose ();
  611. }
  612. [Fact]
  613. [AutoInitShutdown]
  614. public void Visible_False_MenuItem_Key_Does_Action ()
  615. {
  616. // Arrange
  617. int action = 0;
  618. var menuItem = new MenuItemv2 ()
  619. {
  620. Id = "menuItem",
  621. Title = "_Item",
  622. Key = Key.F1,
  623. Action = () => action++
  624. };
  625. var menu = new Menuv2 ([menuItem]) { Id = "menu" };
  626. var menuBarItem = new MenuBarItemv2 { Id = "menuBarItem", Title = "_New" };
  627. var menuBarItemPopover = new PopoverMenu ();
  628. menuBarItem.PopoverMenu = menuBarItemPopover;
  629. menuBarItemPopover.Root = menu;
  630. var menuBar = new MenuBarv2 () { Id = "menuBar" };
  631. menuBar.Add (menuBarItem);
  632. Assert.Single (menuBar.SubViews);
  633. Assert.Single (menuBarItem.SubViews);
  634. var top = new Toplevel ();
  635. top.Add (menuBar);
  636. RunState rs = Application.Begin (top);
  637. Assert.False (menuBar.Active);
  638. // Act
  639. menuBar.Visible = false;
  640. Application.RaiseKeyDownEvent (Key.F1);
  641. Assert.Equal (1, action);
  642. Application.End (rs);
  643. top.Dispose ();
  644. }
  645. }