ContextMenuTests.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519
  1. using Xunit;
  2. using Xunit.Abstractions;
  3. using GraphViewTests = Terminal.Gui.Views.GraphViewTests;
  4. namespace Terminal.Gui.Core {
  5. public class ContextMenuTests {
  6. readonly ITestOutputHelper output;
  7. public ContextMenuTests (ITestOutputHelper output)
  8. {
  9. this.output = output;
  10. }
  11. [Fact]
  12. [AutoInitShutdown]
  13. public void ContextMenu_Constructors ()
  14. {
  15. var cm = new ContextMenu ();
  16. Assert.Equal (new Point (0, 0), cm.Position);
  17. Assert.Empty (cm.MenuItens.Children);
  18. Assert.Null (cm.Host);
  19. cm.Position = new Point (20, 10);
  20. cm.MenuItens = new MenuBarItem (new MenuItem [] {
  21. new MenuItem ("First", "", null)
  22. });
  23. Assert.Equal (new Point (20, 10), cm.Position);
  24. Assert.Single (cm.MenuItens.Children);
  25. cm = new ContextMenu (5, 10,
  26. new MenuBarItem (new MenuItem [] {
  27. new MenuItem ("One", "", null),
  28. new MenuItem ("Two", "", null)
  29. })
  30. );
  31. Assert.Equal (new Point (5, 10), cm.Position);
  32. Assert.Equal (2, cm.MenuItens.Children.Length);
  33. Assert.Null (cm.Host);
  34. cm = new ContextMenu (new View () { X = 5, Y = 10 },
  35. new MenuBarItem (new MenuItem [] {
  36. new MenuItem ("One", "", null),
  37. new MenuItem ("Two", "", null)
  38. })
  39. );
  40. Assert.Equal (new Point (6, 10), cm.Position);
  41. Assert.Equal (2, cm.MenuItens.Children.Length);
  42. Assert.NotNull (cm.Host);
  43. }
  44. [Fact]
  45. [AutoInitShutdown]
  46. public void Show_Hide_IsShow ()
  47. {
  48. var cm = new ContextMenu (10, 5,
  49. new MenuBarItem (new MenuItem [] {
  50. new MenuItem ("One", "", null),
  51. new MenuItem ("Two", "", null)
  52. })
  53. );
  54. cm.Show ();
  55. Assert.True (ContextMenu.IsShow);
  56. Application.Begin (Application.Top);
  57. var expected = @"
  58. ┌──────┐
  59. │ One │
  60. │ Two │
  61. └──────┘
  62. ";
  63. GraphViewTests.AssertDriverContentsAre (expected, output);
  64. cm.Hide ();
  65. Assert.False (ContextMenu.IsShow);
  66. Application.Refresh ();
  67. expected = "";
  68. GraphViewTests.AssertDriverContentsAre (expected, output);
  69. }
  70. [Fact]
  71. [AutoInitShutdown]
  72. public void Position_Changing ()
  73. {
  74. var cm = new ContextMenu (10, 5,
  75. new MenuBarItem (new MenuItem [] {
  76. new MenuItem ("One", "", null),
  77. new MenuItem ("Two", "", null)
  78. })
  79. );
  80. cm.Show ();
  81. Application.Begin (Application.Top);
  82. var expected = @"
  83. ┌──────┐
  84. │ One │
  85. │ Two │
  86. └──────┘
  87. ";
  88. GraphViewTests.AssertDriverContentsAre (expected, output);
  89. cm.Position = new Point (5, 10);
  90. cm.Show ();
  91. Application.Refresh ();
  92. expected = @"
  93. ┌──────┐
  94. │ One │
  95. │ Two │
  96. └──────┘
  97. ";
  98. GraphViewTests.AssertDriverContentsAre (expected, output);
  99. }
  100. [Fact]
  101. [AutoInitShutdown]
  102. public void MenuItens_Changing ()
  103. {
  104. var cm = new ContextMenu (10, 5,
  105. new MenuBarItem (new MenuItem [] {
  106. new MenuItem ("One", "", null),
  107. new MenuItem ("Two", "", null)
  108. })
  109. );
  110. cm.Show ();
  111. Application.Begin (Application.Top);
  112. var expected = @"
  113. ┌──────┐
  114. │ One │
  115. │ Two │
  116. └──────┘
  117. ";
  118. GraphViewTests.AssertDriverContentsAre (expected, output);
  119. cm.MenuItens = new MenuBarItem (new MenuItem [] {
  120. new MenuItem ("First", "", null),
  121. new MenuItem ("Second", "", null),
  122. new MenuItem ("Third", "", null)
  123. });
  124. cm.Show ();
  125. Application.Refresh ();
  126. expected = @"
  127. ┌─────────┐
  128. │ First │
  129. │ Second │
  130. │ Third │
  131. └─────────┘
  132. ";
  133. GraphViewTests.AssertDriverContentsAre (expected, output);
  134. }
  135. [Fact, AutoInitShutdown]
  136. public void Key_Changing ()
  137. {
  138. var lbl = new Label ("Original");
  139. var cm = new ContextMenu ();
  140. lbl.KeyPress += (e) => {
  141. if (e.KeyEvent.Key == cm.Key) {
  142. lbl.Text = "Replaced";
  143. e.Handled = true;
  144. }
  145. };
  146. var top = Application.Top;
  147. top.Add (lbl);
  148. Application.Begin (top);
  149. Assert.True (lbl.ProcessKey (new KeyEvent (cm.Key, new KeyModifiers ())));
  150. Assert.Equal ("Replaced", lbl.Text);
  151. lbl.Text = "Original";
  152. cm.Key = Key.Space | Key.CtrlMask;
  153. Assert.True (lbl.ProcessKey (new KeyEvent (cm.Key, new KeyModifiers ())));
  154. Assert.Equal ("Replaced", lbl.Text);
  155. }
  156. [Fact, AutoInitShutdown]
  157. public void MouseFlags_Changing ()
  158. {
  159. var lbl = new Label ("Original");
  160. var cm = new ContextMenu ();
  161. lbl.MouseClick += (e) => {
  162. if (e.MouseEvent.Flags == cm.MouseFlags) {
  163. lbl.Text = "Replaced";
  164. e.Handled = true;
  165. }
  166. };
  167. var top = Application.Top;
  168. top.Add (lbl);
  169. Application.Begin (top);
  170. Assert.True (lbl.OnMouseEvent (new MouseEvent () { Flags = cm.MouseFlags }));
  171. Assert.Equal ("Replaced", lbl.Text);
  172. lbl.Text = "Original";
  173. cm.MouseFlags = MouseFlags.Button2Clicked;
  174. Assert.True (lbl.OnMouseEvent (new MouseEvent () { Flags = cm.MouseFlags }));
  175. Assert.Equal ("Replaced", lbl.Text);
  176. }
  177. [Fact, AutoInitShutdown]
  178. public void KeyChanged_Event ()
  179. {
  180. var oldKey = Key.Null;
  181. var cm = new ContextMenu ();
  182. cm.KeyChanged += (e) => oldKey = e;
  183. cm.Key = Key.Space | Key.CtrlMask;
  184. Assert.Equal (Key.Space | Key.CtrlMask, cm.Key);
  185. Assert.Equal (Key.F10 | Key.ShiftMask, oldKey);
  186. }
  187. [Fact, AutoInitShutdown]
  188. public void MouseFlagsChanged_Event ()
  189. {
  190. var oldMouseFlags = new MouseFlags ();
  191. var cm = new ContextMenu ();
  192. cm.MouseFlagsChanged += (e) => oldMouseFlags = e;
  193. cm.MouseFlags = MouseFlags.Button2Clicked;
  194. Assert.Equal (MouseFlags.Button2Clicked, cm.MouseFlags);
  195. Assert.Equal (MouseFlags.Button3Clicked, oldMouseFlags);
  196. }
  197. [Fact, AutoInitShutdown]
  198. public void Show_Ensures_Display_Inside_The_Container_But_Preserves_Position ()
  199. {
  200. var cm = new ContextMenu (80, 25,
  201. new MenuBarItem (new MenuItem [] {
  202. new MenuItem ("One", "", null),
  203. new MenuItem ("Two", "", null)
  204. })
  205. );
  206. Assert.Equal (new Point (80, 25), cm.Position);
  207. cm.Show ();
  208. Assert.Equal (new Point (80, 25), cm.Position);
  209. Application.Begin (Application.Top);
  210. var expected = @"
  211. ┌──────┐
  212. │ One │
  213. │ Two │
  214. └──────┘
  215. ";
  216. var pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  217. Assert.Equal (new Rect (72, 21, 80, 4), pos);
  218. cm.Hide ();
  219. Assert.Equal (new Point (80, 25), cm.Position);
  220. }
  221. [Fact, AutoInitShutdown]
  222. public void Show_Ensures_Display_Inside_The_Container_Without_Overlap_The_Host ()
  223. {
  224. var cm = new ContextMenu (new View () { X = 69, Y = 24, Width = 10, Height = 1 },
  225. new MenuBarItem (new MenuItem [] {
  226. new MenuItem ("One", "", null),
  227. new MenuItem ("Two", "", null)
  228. })
  229. );
  230. Assert.Equal (new Point (70, 25), cm.Position);
  231. cm.Show ();
  232. Assert.Equal (new Point (70, 25), cm.Position);
  233. Application.Begin (Application.Top);
  234. var expected = @"
  235. ┌──────┐
  236. │ One │
  237. │ Two │
  238. └──────┘
  239. ";
  240. var pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  241. Assert.Equal (new Rect (70, 21, 78, 4), pos);
  242. cm.Hide ();
  243. Assert.Equal (new Point (70, 25), cm.Position);
  244. }
  245. [Fact, AutoInitShutdown]
  246. public void Show_Display_Below_The_Bottom_Host_If_Has_Enough_Space ()
  247. {
  248. var cm = new ContextMenu (new View () { X = 10, Y = 5, Width = 10, Height = 1 },
  249. new MenuBarItem (new MenuItem [] {
  250. new MenuItem ("One", "", null),
  251. new MenuItem ("Two", "", null)
  252. })
  253. );
  254. Assert.Equal (new Point (11, 6), cm.Position);
  255. cm.Host.X = 5;
  256. cm.Host.Y = 10;
  257. cm.Show ();
  258. Assert.Equal (new Point (6, 11), cm.Position);
  259. Application.Begin (Application.Top);
  260. var expected = @"
  261. ┌──────┐
  262. │ One │
  263. │ Two │
  264. └──────┘
  265. ";
  266. var pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  267. Assert.Equal (new Rect (6, 12, 14, 4), pos);
  268. cm.Hide ();
  269. Assert.Equal (new Point (6, 11), cm.Position);
  270. }
  271. [Fact, AutoInitShutdown]
  272. public void Show_Display_At_Zero_If_The_Toplevel_Width_Is_Less_Than_The_Menu_Width ()
  273. {
  274. var cm = new ContextMenu (0, 0,
  275. new MenuBarItem (new MenuItem [] {
  276. new MenuItem ("One", "", null),
  277. new MenuItem ("Two", "", null)
  278. })
  279. );
  280. Assert.Equal (new Point (0, 0), cm.Position);
  281. cm.Show ();
  282. Assert.Equal (new Point (0, 0), cm.Position);
  283. Application.Begin (Application.Top);
  284. ((FakeDriver)Application.Driver).SetBufferSize (5, 25);
  285. var expected = @"
  286. ┌────
  287. │ One
  288. │ Two
  289. └────
  290. ";
  291. var pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  292. Assert.Equal (new Rect (0, 1, 5, 4), pos);
  293. cm.Hide ();
  294. Assert.Equal (new Point (0, 0), cm.Position);
  295. }
  296. [Fact, AutoInitShutdown]
  297. public void Show_Display_At_Zero_If_The_Toplevel_Height_Is_Less_Than_The_Menu_Height ()
  298. {
  299. var cm = new ContextMenu (0, 0,
  300. new MenuBarItem (new MenuItem [] {
  301. new MenuItem ("One", "", null),
  302. new MenuItem ("Two", "", null)
  303. })
  304. );
  305. Assert.Equal (new Point (0, 0), cm.Position);
  306. cm.Show ();
  307. Assert.Equal (new Point (0, 0), cm.Position);
  308. Application.Begin (Application.Top);
  309. ((FakeDriver)Application.Driver).SetBufferSize (80, 4);
  310. var expected = @"
  311. ┌──────┐
  312. │ One │
  313. │ Two │
  314. ";
  315. var pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  316. Assert.Equal (new Rect (0, 1, 8, 3), pos);
  317. cm.Hide ();
  318. Assert.Equal (new Point (0, 0), cm.Position);
  319. }
  320. [Fact, AutoInitShutdown]
  321. public void Hide_Is_Invoke_At_Container_Closing ()
  322. {
  323. var cm = new ContextMenu (80, 25,
  324. new MenuBarItem (new MenuItem [] {
  325. new MenuItem ("One", "", null),
  326. new MenuItem ("Two", "", null)
  327. })
  328. );
  329. var top = Application.Top;
  330. Application.Begin (top);
  331. top.Running = true;
  332. Assert.False (ContextMenu.IsShow);
  333. cm.Show ();
  334. Assert.True (ContextMenu.IsShow);
  335. top.RequestStop ();
  336. Assert.False (ContextMenu.IsShow);
  337. }
  338. [Fact, AutoInitShutdown]
  339. public void ForceMinimumPosToZero_True_False ()
  340. {
  341. var cm = new ContextMenu (-1, -2,
  342. new MenuBarItem (new MenuItem [] {
  343. new MenuItem ("One", "", null),
  344. new MenuItem ("Two", "", null)
  345. })
  346. );
  347. Assert.Equal (new Point (-1, -2), cm.Position);
  348. cm.Show ();
  349. Assert.Equal (new Point (-1, -2), cm.Position);
  350. Application.Begin (Application.Top);
  351. var expected = @"
  352. ┌──────┐
  353. │ One │
  354. │ Two │
  355. └──────┘
  356. ";
  357. var pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  358. Assert.Equal (new Rect (0, 1, 8, 4), pos);
  359. cm.ForceMinimumPosToZero = false;
  360. cm.Show ();
  361. Assert.Equal (new Point (-1, -2), cm.Position);
  362. Application.Refresh ();
  363. expected = @"
  364. One │
  365. Two │
  366. ──────┘
  367. ";
  368. pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
  369. Assert.Equal (new Rect (1, 0, 7, 3), pos);
  370. }
  371. [Fact, AutoInitShutdown]
  372. public void ContextMenu_Is_Closed_If_Another_MenuBar_Is_Open_Or_Vice_Versa ()
  373. {
  374. var cm = new ContextMenu (10, 5,
  375. new MenuBarItem (new MenuItem [] {
  376. new MenuItem ("One", "", null),
  377. new MenuItem ("Two", "", null)
  378. })
  379. );
  380. var menu = new MenuBar (new MenuBarItem [] {
  381. new MenuBarItem ("File", "", null),
  382. new MenuBarItem ("Edit", "", null)
  383. });
  384. Application.Top.Add (menu);
  385. Assert.Null (Application.mouseGrabView);
  386. cm.Show ();
  387. Assert.True (ContextMenu.IsShow);
  388. Assert.Equal (cm.MenuBar, Application.mouseGrabView);
  389. Assert.False (menu.IsMenuOpen);
  390. Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, new KeyModifiers ())));
  391. Assert.False (ContextMenu.IsShow);
  392. Assert.Equal (menu, Application.mouseGrabView);
  393. Assert.True (menu.IsMenuOpen);
  394. cm.Show ();
  395. Assert.True (ContextMenu.IsShow);
  396. Assert.Equal (cm.MenuBar, Application.mouseGrabView);
  397. Assert.False (menu.IsMenuOpen);
  398. Assert.False (menu.OnKeyDown (new KeyEvent (Key.Null, new KeyModifiers () { Alt = true })));
  399. Assert.True (menu.OnKeyUp (new KeyEvent (Key.Null, new KeyModifiers () { Alt = true })));
  400. Assert.False (ContextMenu.IsShow);
  401. Assert.Equal (menu, Application.mouseGrabView);
  402. Assert.True (menu.IsMenuOpen);
  403. cm.Show ();
  404. Assert.True (ContextMenu.IsShow);
  405. Assert.Equal (cm.MenuBar, Application.mouseGrabView);
  406. Assert.False (menu.IsMenuOpen);
  407. Assert.False (menu.MouseEvent (new MouseEvent () { X = 1, Flags = MouseFlags.ReportMousePosition, View = menu }));
  408. Assert.True (ContextMenu.IsShow);
  409. Assert.Equal (cm.MenuBar, Application.mouseGrabView);
  410. Assert.False (menu.IsMenuOpen);
  411. Assert.True (menu.MouseEvent (new MouseEvent () { X = 1, Flags = MouseFlags.Button1Clicked, View = menu }));
  412. Assert.False (ContextMenu.IsShow);
  413. Assert.Equal (menu, Application.mouseGrabView);
  414. Assert.True (menu.IsMenuOpen);
  415. }
  416. }
  417. }