ToplevelTests.cs 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905
  1. namespace UnitTests.ViewsTests;
  2. public class ToplevelTests
  3. {
  4. [Fact]
  5. public void Constructor_Default ()
  6. {
  7. var top = new Toplevel ();
  8. Assert.Equal ("Toplevel", top.SchemeName);
  9. Assert.Equal ("Fill(Absolute(0))", top.Width.ToString ());
  10. Assert.Equal ("Fill(Absolute(0))", top.Height.ToString ());
  11. Assert.False (top.Running);
  12. Assert.False (top.Modal);
  13. Assert.Null (top.MenuBar);
  14. //Assert.Null (top.StatusBar);
  15. }
  16. [Fact]
  17. public void Arrangement_Default_Is_Overlapped ()
  18. {
  19. var top = new Toplevel ();
  20. Assert.Equal (ViewArrangement.Overlapped, top.Arrangement);
  21. }
  22. [Fact]
  23. [AutoInitShutdown]
  24. public void Internal_Tests ()
  25. {
  26. var top = new Toplevel ();
  27. var eventInvoked = "";
  28. top.Loaded += (s, e) => eventInvoked = "Loaded";
  29. top.OnLoaded ();
  30. Assert.Equal ("Loaded", eventInvoked);
  31. top.Ready += (s, e) => eventInvoked = "Ready";
  32. top.OnReady ();
  33. Assert.Equal ("Ready", eventInvoked);
  34. top.Unloaded += (s, e) => eventInvoked = "Unloaded";
  35. top.OnUnloaded ();
  36. Assert.Equal ("Unloaded", eventInvoked);
  37. top.Add (new MenuBar ());
  38. Assert.NotNull (top.MenuBar);
  39. //top.Add (new StatusBar ());
  40. //Assert.NotNull (top.StatusBar);
  41. MenuBar menuBar = top.MenuBar;
  42. top.Remove (top.MenuBar);
  43. Assert.Null (top.MenuBar);
  44. Assert.NotNull (menuBar);
  45. //var statusBar = top.StatusBar;
  46. //top.Remove (top.StatusBar);
  47. //Assert.Null (top.StatusBar);
  48. //Assert.NotNull (statusBar);
  49. #if DEBUG_IDISPOSABLE
  50. Assert.False (menuBar.WasDisposed);
  51. //Assert.False (statusBar.WasDisposed);
  52. menuBar.Dispose ();
  53. //statusBar.Dispose ();
  54. Assert.True (menuBar.WasDisposed);
  55. //Assert.True (statusBar.WasDisposed);
  56. #endif
  57. Application.Begin (top);
  58. Assert.Equal (top, Application.Top);
  59. // Application.Top without menu and status bar.
  60. View supView = View.GetLocationEnsuringFullVisibility (top, 2, 2, out int nx, out int ny /*, out StatusBar sb*/);
  61. Assert.Equal (Application.Top, supView);
  62. Assert.Equal (0, nx);
  63. Assert.Equal (0, ny);
  64. //Assert.Null (sb);
  65. top.Add (new MenuBar ());
  66. Assert.NotNull (top.MenuBar);
  67. // Application.Top with a menu and without status bar.
  68. View.GetLocationEnsuringFullVisibility (top, 2, 2, out nx, out ny /*, out sb*/);
  69. Assert.Equal (0, nx);
  70. Assert.Equal (1, ny);
  71. //Assert.Null (sb);
  72. //top.Add (new StatusBar ());
  73. //Assert.NotNull (top.StatusBar);
  74. // Application.Top with a menu and status bar.
  75. View.GetLocationEnsuringFullVisibility (top, 2, 2, out nx, out ny /*, out sb*/);
  76. Assert.Equal (0, nx);
  77. // The available height is lower than the Application.Top height minus
  78. // the menu bar and status bar, then the top can go beyond the bottom
  79. // Assert.Equal (2, ny);
  80. //Assert.NotNull (sb);
  81. menuBar = top.MenuBar;
  82. top.Remove (top.MenuBar);
  83. Assert.Null (top.MenuBar);
  84. Assert.NotNull (menuBar);
  85. // Application.Top without a menu and with a status bar.
  86. View.GetLocationEnsuringFullVisibility (top, 2, 2, out nx, out ny /*, out sb*/);
  87. Assert.Equal (0, nx);
  88. // The available height is lower than the Application.Top height minus
  89. // the status bar, then the top can go beyond the bottom
  90. // Assert.Equal (2, ny);
  91. //Assert.NotNull (sb);
  92. //statusBar = top.StatusBar;
  93. //top.Remove (top.StatusBar);
  94. //Assert.Null (top.StatusBar);
  95. //Assert.NotNull (statusBar);
  96. Assert.Null (top.MenuBar);
  97. var win = new Window { Width = Dim.Fill (), Height = Dim.Fill () };
  98. top.Add (win);
  99. top.LayoutSubViews ();
  100. // The SuperView is always the same regardless of the caller.
  101. supView = View.GetLocationEnsuringFullVisibility (win, 0, 0, out nx, out ny /*, out sb*/);
  102. Assert.Equal (Application.Top, supView);
  103. supView = View.GetLocationEnsuringFullVisibility (win, 0, 0, out nx, out ny /*, out sb*/);
  104. Assert.Equal (Application.Top, supView);
  105. // Application.Top without menu and status bar.
  106. View.GetLocationEnsuringFullVisibility (win, 0, 0, out nx, out ny /*, out sb*/);
  107. Assert.Equal (0, nx);
  108. Assert.Equal (0, ny);
  109. //Assert.Null (sb);
  110. top.Add (new MenuBar ());
  111. Assert.NotNull (top.MenuBar);
  112. // Application.Top with a menu and without status bar.
  113. View.GetLocationEnsuringFullVisibility (win, 2, 2, out nx, out ny /*, out sb*/);
  114. Assert.Equal (0, nx);
  115. Assert.Equal (1, ny);
  116. //Assert.Null (sb);
  117. top.Add (new StatusBar ());
  118. //Assert.NotNull (top.StatusBar);
  119. // Application.Top with a menu and status bar.
  120. View.GetLocationEnsuringFullVisibility (win, 30, 20, out nx, out ny /*, out sb*/);
  121. Assert.Equal (0, nx);
  122. // The available height is lower than the Application.Top height minus
  123. // the menu bar and status bar, then the top can go beyond the bottom
  124. //Assert.Equal (20, ny);
  125. //Assert.NotNull (sb);
  126. menuBar = top.MenuBar;
  127. //statusBar = top.StatusBar;
  128. top.Remove (top.MenuBar);
  129. Assert.Null (top.MenuBar);
  130. Assert.NotNull (menuBar);
  131. //top.Remove (top.StatusBar);
  132. //Assert.Null (top.StatusBar);
  133. //Assert.NotNull (statusBar);
  134. top.Remove (win);
  135. win = new () { Width = 60, Height = 15 };
  136. top.Add (win);
  137. // Application.Top without menu and status bar.
  138. View.GetLocationEnsuringFullVisibility (win, 0, 0, out nx, out ny /*, out sb*/);
  139. Assert.Equal (0, nx);
  140. Assert.Equal (0, ny);
  141. //Assert.Null (sb);
  142. top.Add (new MenuBar ());
  143. Assert.NotNull (top.MenuBar);
  144. // Application.Top with a menu and without status bar.
  145. View.GetLocationEnsuringFullVisibility (win, 2, 2, out nx, out ny /*, out sb*/);
  146. Assert.Equal (2, nx);
  147. Assert.Equal (2, ny);
  148. //Assert.Null (sb);
  149. top.Add (new StatusBar ());
  150. //Assert.NotNull (top.StatusBar);
  151. // Application.Top with a menu and status bar.
  152. View.GetLocationEnsuringFullVisibility (win, 30, 20, out nx, out ny /*, out sb*/);
  153. Assert.Equal (20, nx); // 20+60=80
  154. //Assert.Equal (9, ny); // 9+15+1(mb)=25
  155. //Assert.NotNull (sb);
  156. //Assert.Null (Toplevel._dragPosition);
  157. win.NewMouseEvent (new () { Position = new (6, 0), Flags = MouseFlags.Button1Pressed });
  158. // Assert.Equal (new Point (6, 0), Toplevel._dragPosition);
  159. win.NewMouseEvent (new () { Position = new (6, 0), Flags = MouseFlags.Button1Released });
  160. //Assert.Null (Toplevel._dragPosition);
  161. win.CanFocus = false;
  162. win.NewMouseEvent (new () { Position = new (6, 0), Flags = MouseFlags.Button1Pressed });
  163. //Assert.Null (Toplevel._dragPosition);
  164. #if DEBUG_IDISPOSABLE
  165. Assert.False (top.MenuBar.WasDisposed);
  166. //Assert.False (top.StatusBar.WasDisposed);
  167. #endif
  168. menuBar = top.MenuBar;
  169. //statusBar = top.StatusBar;
  170. top.Dispose ();
  171. Assert.Null (top.MenuBar);
  172. //Assert.Null (top.StatusBar);
  173. Assert.NotNull (menuBar);
  174. //Assert.NotNull (statusBar);
  175. #if DEBUG_IDISPOSABLE
  176. Assert.True (menuBar.WasDisposed);
  177. //Assert.True (statusBar.WasDisposed);
  178. #endif
  179. }
  180. [Fact]
  181. public void SuperViewChanged_Should_Not_Be_Used_To_Initialize_Toplevel_Events ()
  182. {
  183. var wasAdded = false;
  184. var view = new View ();
  185. view.SuperViewChanged += SuperViewChanged;
  186. var win = new Window ();
  187. win.Add (view);
  188. Application.Init (new FakeDriver ());
  189. Toplevel top = new ();
  190. top.Add (win);
  191. Assert.True (wasAdded);
  192. Application.Shutdown ();
  193. return;
  194. void SuperViewChanged (object sender, SuperViewChangedEventArgs _)
  195. {
  196. Assert.False (wasAdded);
  197. wasAdded = true;
  198. view.SuperViewChanged -= SuperViewChanged;
  199. }
  200. }
  201. [Fact]
  202. [AutoInitShutdown]
  203. public void Mouse_Drag_On_Top_With_Superview_Null ()
  204. {
  205. var win = new Window ();
  206. Toplevel top = new ();
  207. top.Add (win);
  208. int iterations = -1;
  209. Window testWindow;
  210. Application.Iteration += (s, a) =>
  211. {
  212. iterations++;
  213. if (iterations == 0)
  214. {
  215. Application.Driver?.SetScreenSize (15, 7);
  216. // Don't use MessageBox here; it's too complicated for this unit test; just use Window
  217. testWindow = new ()
  218. {
  219. Text = "Hello",
  220. X = 2,
  221. Y = 2,
  222. Width = 10,
  223. Height = 3,
  224. Arrangement = ViewArrangement.Movable
  225. };
  226. Application.Run (testWindow);
  227. }
  228. else if (iterations == 1)
  229. {
  230. Assert.Equal (new (2, 2), Application.Top!.Frame.Location);
  231. }
  232. else if (iterations == 2)
  233. {
  234. Assert.Null (Application.Mouse.MouseGrabView);
  235. // Grab the mouse
  236. Application.RaiseMouseEvent (new () { ScreenPosition = new (3, 2), Flags = MouseFlags.Button1Pressed });
  237. Assert.Equal (Application.Top!.Border, Application.Mouse.MouseGrabView);
  238. Assert.Equal (new (2, 2, 10, 3), Application.Top.Frame);
  239. }
  240. else if (iterations == 3)
  241. {
  242. Assert.Equal (Application.Top!.Border, Application.Mouse.MouseGrabView);
  243. // Drag to left
  244. Application.RaiseMouseEvent (
  245. new ()
  246. {
  247. ScreenPosition = new (2, 2), Flags = MouseFlags.Button1Pressed
  248. | MouseFlags.ReportMousePosition
  249. });
  250. AutoInitShutdownAttribute.RunIteration ();
  251. Assert.Equal (Application.Top.Border, Application.Mouse.MouseGrabView);
  252. Assert.Equal (new (1, 2, 10, 3), Application.Top.Frame);
  253. }
  254. else if (iterations == 4)
  255. {
  256. Assert.Equal (Application.Top!.Border, Application.Mouse.MouseGrabView);
  257. Assert.Equal (new (1, 2), Application.Top.Frame.Location);
  258. Assert.Equal (Application.Top.Border, Application.Mouse.MouseGrabView);
  259. }
  260. else if (iterations == 5)
  261. {
  262. Assert.Equal (Application.Top!.Border, Application.Mouse.MouseGrabView);
  263. // Drag up
  264. Application.RaiseMouseEvent (
  265. new ()
  266. {
  267. ScreenPosition = new (2, 1),
  268. Flags = MouseFlags.Button1Pressed | MouseFlags.ReportMousePosition
  269. });
  270. AutoInitShutdownAttribute.RunIteration ();
  271. Assert.Equal (Application.Top!.Border, Application.Mouse.MouseGrabView);
  272. Assert.Equal (new (1, 1, 10, 3), Application.Top.Frame);
  273. }
  274. else if (iterations == 6)
  275. {
  276. Assert.Equal (Application.Top!.Border, Application.Mouse.MouseGrabView);
  277. Assert.Equal (new (1, 1), Application.Top.Frame.Location);
  278. Assert.Equal (Application.Top.Border, Application.Mouse.MouseGrabView);
  279. Assert.Equal (new (1, 1, 10, 3), Application.Top.Frame);
  280. }
  281. else if (iterations == 7)
  282. {
  283. Assert.Equal (Application.Top!.Border, Application.Mouse.MouseGrabView);
  284. // Ungrab the mouse
  285. Application.RaiseMouseEvent (new () { ScreenPosition = new (2, 1), Flags = MouseFlags.Button1Released });
  286. AutoInitShutdownAttribute.RunIteration ();
  287. Assert.Null (Application.Mouse.MouseGrabView);
  288. }
  289. else if (iterations == 8)
  290. {
  291. Application.RequestStop ();
  292. }
  293. else if (iterations == 9)
  294. {
  295. Application.RequestStop ();
  296. }
  297. };
  298. Application.Run (top);
  299. top.Dispose ();
  300. }
  301. [Fact]
  302. [AutoInitShutdown]
  303. public void Mouse_Drag_On_Top_With_Superview_Not_Null ()
  304. {
  305. var win = new Window { X = 3, Y = 2, Width = 10, Height = 5, Arrangement = ViewArrangement.Movable };
  306. Toplevel top = new ();
  307. top.Add (win);
  308. int iterations = -1;
  309. var movex = 0;
  310. var movey = 0;
  311. var location = new Rectangle (win.Frame.X, win.Frame.Y, 7, 3);
  312. Application.Iteration += (s, a) =>
  313. {
  314. iterations++;
  315. if (iterations == 0)
  316. {
  317. Application.Driver?.SetScreenSize (30, 10);
  318. }
  319. else if (iterations == 1)
  320. {
  321. location = win.Frame;
  322. Assert.Null (Application.Mouse.MouseGrabView);
  323. // Grab the mouse
  324. Application.RaiseMouseEvent (
  325. new ()
  326. {
  327. ScreenPosition = new (win.Frame.X, win.Frame.Y), Flags = MouseFlags.Button1Pressed
  328. });
  329. Assert.Equal (win.Border, Application.Mouse.MouseGrabView);
  330. }
  331. else if (iterations == 2)
  332. {
  333. Assert.Equal (win.Border, Application.Mouse.MouseGrabView);
  334. // Drag to left
  335. movex = 1;
  336. movey = 0;
  337. Application.RaiseMouseEvent (
  338. new ()
  339. {
  340. ScreenPosition = new (win.Frame.X + movex, win.Frame.Y + movey), Flags =
  341. MouseFlags.Button1Pressed
  342. | MouseFlags.ReportMousePosition
  343. });
  344. Assert.Equal (win.Border, Application.Mouse.MouseGrabView);
  345. }
  346. else if (iterations == 3)
  347. {
  348. // we should have moved +1, +0
  349. Assert.Equal (win.Border, Application.Mouse.MouseGrabView);
  350. Assert.Equal (win.Border, Application.Mouse.MouseGrabView);
  351. location.Offset (movex, movey);
  352. }
  353. else if (iterations == 4)
  354. {
  355. Assert.Equal (win.Border, Application.Mouse.MouseGrabView);
  356. // Drag up
  357. movex = 0;
  358. movey = -1;
  359. Application.RaiseMouseEvent (
  360. new ()
  361. {
  362. ScreenPosition = new (win.Frame.X + movex, win.Frame.Y + movey), Flags =
  363. MouseFlags.Button1Pressed
  364. | MouseFlags.ReportMousePosition
  365. });
  366. Assert.Equal (win.Border, Application.Mouse.MouseGrabView);
  367. }
  368. else if (iterations == 5)
  369. {
  370. // we should have moved +0, -1
  371. Assert.Equal (win.Border, Application.Mouse.MouseGrabView);
  372. location.Offset (movex, movey);
  373. Assert.Equal (location, win.Frame);
  374. }
  375. else if (iterations == 6)
  376. {
  377. Assert.Equal (win.Border, Application.Mouse.MouseGrabView);
  378. // Ungrab the mouse
  379. movex = 0;
  380. movey = 0;
  381. Application.RaiseMouseEvent (
  382. new ()
  383. {
  384. ScreenPosition = new (win.Frame.X + movex, win.Frame.Y + movey),
  385. Flags = MouseFlags.Button1Released
  386. });
  387. Assert.Null (Application.Mouse.MouseGrabView);
  388. }
  389. else if (iterations == 7)
  390. {
  391. Application.RequestStop ();
  392. }
  393. };
  394. Application.Run (top);
  395. top.Dispose ();
  396. }
  397. [Fact]
  398. [SetupFakeDriver]
  399. public void GetLocationThatFits_With_Border_Null_Not_Throws ()
  400. {
  401. var top = new Toplevel ();
  402. top.BeginInit ();
  403. top.EndInit ();
  404. Exception exception = Record.Exception (() => Application.Driver!.SetScreenSize (0, 10));
  405. Assert.Null (exception);
  406. exception = Record.Exception (() => Application.Driver!.SetScreenSize (10, 0));
  407. Assert.Null (exception);
  408. }
  409. [Fact]
  410. [AutoInitShutdown]
  411. public void PositionCursor_SetCursorVisibility_To_Invisible_If_Focused_Is_Null ()
  412. {
  413. var tf = new TextField { Width = 5, Text = "test" };
  414. var view = new View { Width = 10, Height = 10, CanFocus = true };
  415. view.Add (tf);
  416. var top = new Toplevel ();
  417. top.Add (view);
  418. Application.Begin (top);
  419. Assert.True (tf.HasFocus);
  420. Application.PositionCursor ();
  421. Application.Driver!.GetCursorVisibility (out CursorVisibility cursor);
  422. Assert.Equal (CursorVisibility.Default, cursor);
  423. view.Enabled = false;
  424. Assert.False (tf.HasFocus);
  425. Application.PositionCursor ();
  426. Application.Driver!.GetCursorVisibility (out cursor);
  427. Assert.Equal (CursorVisibility.Invisible, cursor);
  428. top.Dispose ();
  429. }
  430. [Fact]
  431. [AutoInitShutdown]
  432. public void IsLoaded_Application_Begin ()
  433. {
  434. Toplevel top = new ();
  435. Assert.False (top.IsLoaded);
  436. Application.Begin (top);
  437. Assert.True (top.IsLoaded);
  438. top.Dispose ();
  439. }
  440. [Fact]
  441. [AutoInitShutdown]
  442. public void IsLoaded_With_Sub_Toplevel_Application_Begin_NeedDisplay ()
  443. {
  444. Toplevel top = new ();
  445. var subTop = new Toplevel ();
  446. var view = new View { Frame = new (0, 0, 20, 10) };
  447. subTop.Add (view);
  448. top.Add (subTop);
  449. Assert.False (top.IsLoaded);
  450. Assert.False (subTop.IsLoaded);
  451. Assert.Equal (new (0, 0, 20, 10), view.Frame);
  452. view.SubViewLayout += ViewLayoutStarted;
  453. void ViewLayoutStarted (object sender, LayoutEventArgs e)
  454. {
  455. Assert.Equal (new (0, 0, 20, 10), view.NeedsDrawRect);
  456. view.SubViewLayout -= ViewLayoutStarted;
  457. }
  458. Application.Begin (top);
  459. Assert.True (top.IsLoaded);
  460. Assert.True (subTop.IsLoaded);
  461. Assert.Equal (new (0, 0, 20, 10), view.Frame);
  462. view.Frame = new (1, 3, 10, 5);
  463. Assert.Equal (new (1, 3, 10, 5), view.Frame);
  464. Assert.Equal (new (0, 0, 10, 5), view.NeedsDrawRect);
  465. view.Frame = new (1, 3, 10, 5);
  466. top.Layout ();
  467. Assert.Equal (new (1, 3, 10, 5), view.Frame);
  468. Assert.Equal (new (0, 0, 10, 5), view.NeedsDrawRect);
  469. top.Dispose ();
  470. }
  471. [Fact]
  472. [AutoInitShutdown]
  473. public void Window_Viewport_Bigger_Than_Driver_Cols_And_Rows_Allow_Drag_Beyond_Left_Right_And_Bottom ()
  474. {
  475. Toplevel top = new ();
  476. var window = new Window { Width = 20, Height = 3, Arrangement = ViewArrangement.Movable };
  477. RunState rsTop = Application.Begin (top);
  478. Application.Driver?.SetScreenSize (40, 10);
  479. RunState rsWindow = Application.Begin (window);
  480. AutoInitShutdownAttribute.RunIteration ();
  481. Assert.Equal (new (0, 0, 40, 10), top.Frame);
  482. Assert.Equal (new (0, 0, 20, 3), window.Frame);
  483. Assert.Null (Application.Mouse.MouseGrabView);
  484. Application.RaiseMouseEvent (new () { ScreenPosition = new (0, 0), Flags = MouseFlags.Button1Pressed });
  485. Assert.Equal (window.Border, Application.Mouse.MouseGrabView);
  486. Application.RaiseMouseEvent (
  487. new ()
  488. {
  489. ScreenPosition = new (-11, -4), Flags = MouseFlags.Button1Pressed | MouseFlags.ReportMousePosition
  490. });
  491. AutoInitShutdownAttribute.RunIteration ();
  492. Assert.Equal (new (0, 0, 40, 10), top.Frame);
  493. Assert.Equal (new (-11, -4, 20, 3), window.Frame);
  494. // Changes Top size to same size as Dialog more menu and scroll bar
  495. Application.Driver?.SetScreenSize (20, 3);
  496. Application.RaiseMouseEvent (
  497. new ()
  498. {
  499. ScreenPosition = new (-1, -1), Flags = MouseFlags.Button1Pressed | MouseFlags.ReportMousePosition
  500. });
  501. AutoInitShutdownAttribute.RunIteration ();
  502. Assert.Equal (new (0, 0, 20, 3), top.Frame);
  503. Assert.Equal (new (-1, -1, 20, 3), window.Frame);
  504. // Changes Top size smaller than Dialog size
  505. Application.Driver?.SetScreenSize (19, 2);
  506. Application.RaiseMouseEvent (
  507. new ()
  508. {
  509. ScreenPosition = new (-1, -1), Flags = MouseFlags.Button1Pressed | MouseFlags.ReportMousePosition
  510. });
  511. AutoInitShutdownAttribute.RunIteration ();
  512. Assert.Equal (new (0, 0, 19, 2), top.Frame);
  513. Assert.Equal (new (-1, -1, 20, 3), window.Frame);
  514. Application.RaiseMouseEvent (
  515. new ()
  516. {
  517. ScreenPosition = new (18, 1), Flags = MouseFlags.Button1Pressed | MouseFlags.ReportMousePosition
  518. });
  519. AutoInitShutdownAttribute.RunIteration ();
  520. Assert.Equal (new (0, 0, 19, 2), top.Frame);
  521. Assert.Equal (new (18, 1, 20, 3), window.Frame);
  522. // On a real app we can't go beyond the SuperView bounds
  523. Application.RaiseMouseEvent (
  524. new ()
  525. {
  526. ScreenPosition = new (19, 2), Flags = MouseFlags.Button1Pressed | MouseFlags.ReportMousePosition
  527. });
  528. AutoInitShutdownAttribute.RunIteration ();
  529. Assert.Equal (new (0, 0, 19, 2), top.Frame);
  530. Assert.Equal (new (19, 2, 20, 3), window.Frame);
  531. //DriverAsserts.AssertDriverContentsWithFrameAre (@"", output);
  532. Application.End (rsWindow);
  533. Application.End (rsTop);
  534. top.Dispose ();
  535. }
  536. [Fact]
  537. [AutoInitShutdown]
  538. public void Modal_As_Top_Will_Drag_Cleanly ()
  539. {
  540. // Don't use Dialog as a Top, use a Window instead - dialog has complex layout behavior that is not needed here.
  541. var window = new Window { Width = 10, Height = 3, Arrangement = ViewArrangement.Movable };
  542. window.Add (
  543. new Label
  544. {
  545. X = Pos.Center (),
  546. Y = Pos.Center (),
  547. Width = Dim.Fill (),
  548. Height = Dim.Fill (),
  549. TextAlignment = Alignment.Center,
  550. VerticalTextAlignment = Alignment.Center,
  551. Text = "Test"
  552. }
  553. );
  554. RunState rs = Application.Begin (window);
  555. Assert.Null (Application.Mouse.MouseGrabView);
  556. Assert.Equal (new (0, 0, 10, 3), window.Frame);
  557. Application.RaiseMouseEvent (new () { ScreenPosition = new (0, 0), Flags = MouseFlags.Button1Pressed });
  558. AutoInitShutdownAttribute.RunIteration ();
  559. Assert.Equal (window.Border, Application.Mouse.MouseGrabView);
  560. Assert.Equal (new (0, 0, 10, 3), window.Frame);
  561. Application.RaiseMouseEvent (
  562. new ()
  563. {
  564. ScreenPosition = new (1, 1), Flags = MouseFlags.Button1Pressed | MouseFlags.ReportMousePosition
  565. });
  566. AutoInitShutdownAttribute.RunIteration ();
  567. Assert.Equal (window.Border, Application.Mouse.MouseGrabView);
  568. Assert.Equal (new (1, 1, 10, 3), window.Frame);
  569. Application.End (rs);
  570. window.Dispose ();
  571. }
  572. [Fact]
  573. [AutoInitShutdown]
  574. public void Activating_MenuBar_By_Alt_Key_Does_Not_Throw ()
  575. {
  576. var menu = new MenuBar
  577. {
  578. Menus =
  579. [
  580. new ("Child", new MenuItem [] { new ("_Create Child", "", null) })
  581. ]
  582. };
  583. var topChild = new Toplevel ();
  584. topChild.Add (menu);
  585. var top = new Toplevel ();
  586. top.Add (topChild);
  587. Application.Begin (top);
  588. Exception exception = Record.Exception (() => topChild.NewKeyDownEvent (KeyCode.AltMask));
  589. Assert.Null (exception);
  590. top.Dispose ();
  591. }
  592. [Fact]
  593. public void Multi_Thread_Toplevels ()
  594. {
  595. Application.Init (new FakeDriver ());
  596. Toplevel t = new ();
  597. var w = new Window ();
  598. t.Add (w);
  599. int count = 0, count1 = 0, count2 = 0;
  600. bool log = false, log1 = false, log2 = false;
  601. var fromTopStillKnowFirstIsRunning = false;
  602. var fromTopStillKnowSecondIsRunning = false;
  603. var fromFirstStillKnowSecondIsRunning = false;
  604. Application.AddTimeout (
  605. TimeSpan.FromMilliseconds (100),
  606. () =>
  607. {
  608. count++;
  609. if (count1 == 5)
  610. {
  611. log1 = true;
  612. }
  613. if (count1 == 14 && count2 == 10 && count == 15)
  614. {
  615. // count2 is already stopped
  616. fromTopStillKnowFirstIsRunning = true;
  617. }
  618. if (count1 == 7 && count2 == 7 && count == 8)
  619. {
  620. fromTopStillKnowSecondIsRunning = true;
  621. }
  622. if (count == 30)
  623. {
  624. Assert.Equal (30, count);
  625. Assert.Equal (20, count1);
  626. Assert.Equal (10, count2);
  627. Assert.True (log);
  628. Assert.True (log1);
  629. Assert.True (log2);
  630. Assert.True (fromTopStillKnowFirstIsRunning);
  631. Assert.True (fromTopStillKnowSecondIsRunning);
  632. Assert.True (fromFirstStillKnowSecondIsRunning);
  633. Application.RequestStop ();
  634. return false;
  635. }
  636. return true;
  637. }
  638. );
  639. t.Ready += FirstWindow;
  640. void FirstWindow (object sender, EventArgs args)
  641. {
  642. var firstWindow = new Window ();
  643. firstWindow.Ready += SecondWindow;
  644. Application.AddTimeout (
  645. TimeSpan.FromMilliseconds (100),
  646. () =>
  647. {
  648. count1++;
  649. if (count2 == 5)
  650. {
  651. log2 = true;
  652. }
  653. if (count2 == 4 && count1 == 5 && count == 5)
  654. {
  655. fromFirstStillKnowSecondIsRunning = true;
  656. }
  657. if (count1 == 20)
  658. {
  659. Assert.Equal (20, count1);
  660. Application.RequestStop ();
  661. return false;
  662. }
  663. return true;
  664. }
  665. );
  666. Application.Run (firstWindow);
  667. firstWindow.Dispose ();
  668. }
  669. void SecondWindow (object sender, EventArgs args)
  670. {
  671. var testWindow = new Window ();
  672. Application.AddTimeout (
  673. TimeSpan.FromMilliseconds (100),
  674. () =>
  675. {
  676. count2++;
  677. if (count < 30)
  678. {
  679. log = true;
  680. }
  681. if (count2 == 10)
  682. {
  683. Assert.Equal (10, count2);
  684. Application.RequestStop ();
  685. return false;
  686. }
  687. return true;
  688. }
  689. );
  690. Application.Run (testWindow);
  691. testWindow.Dispose ();
  692. }
  693. Application.Run (t);
  694. t.Dispose ();
  695. Application.Shutdown ();
  696. }
  697. [Fact]
  698. public void Remove_Do_Not_Dispose_MenuBar_Or_StatusBar ()
  699. {
  700. var mb = new MenuBar ();
  701. var sb = new StatusBar ();
  702. var tl = new Toplevel ();
  703. #if DEBUG
  704. Assert.False (mb.WasDisposed);
  705. Assert.False (sb.WasDisposed);
  706. #endif
  707. tl.Add (mb, sb);
  708. Assert.NotNull (tl.MenuBar);
  709. //Assert.NotNull (tl.StatusBar);
  710. #if DEBUG
  711. Assert.False (mb.WasDisposed);
  712. Assert.False (sb.WasDisposed);
  713. #endif
  714. tl.RemoveAll ();
  715. Assert.Null (tl.MenuBar);
  716. //Assert.Null (tl.StatusBar);
  717. #if DEBUG
  718. Assert.False (mb.WasDisposed);
  719. Assert.False (sb.WasDisposed);
  720. #endif
  721. }
  722. }