ToplevelTests.cs 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694
  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.StatusBar);
  14. }
  15. [Fact]
  16. public void Arrangement_Default_Is_Overlapped ()
  17. {
  18. var top = new Toplevel ();
  19. Assert.Equal (ViewArrangement.Overlapped, top.Arrangement);
  20. }
  21. [Fact]
  22. [AutoInitShutdown]
  23. public void Internal_Tests ()
  24. {
  25. var top = new Toplevel ();
  26. var eventInvoked = "";
  27. top.Loaded += (s, e) => eventInvoked = "Loaded";
  28. top.OnLoaded ();
  29. Assert.Equal ("Loaded", eventInvoked);
  30. top.Ready += (s, e) => eventInvoked = "Ready";
  31. top.OnReady ();
  32. Assert.Equal ("Ready", eventInvoked);
  33. top.Unloaded += (s, e) => eventInvoked = "Unloaded";
  34. top.OnUnloaded ();
  35. Assert.Equal ("Unloaded", eventInvoked);
  36. Application.Begin (top);
  37. Assert.Equal (top, Application.TopRunnable);
  38. // Application.TopRunnable without menu and status bar.
  39. View supView = View.GetLocationEnsuringFullVisibility (top, 2, 2, out int nx, out int ny /*, out StatusBar sb*/);
  40. Assert.Equal (Application.TopRunnable, supView);
  41. Assert.Equal (0, nx);
  42. Assert.Equal (0, ny);
  43. // Application.Current with a menu and without status bar.
  44. View.GetLocationEnsuringFullVisibility (top, 2, 2, out nx, out ny /*, out sb*/);
  45. Assert.Equal (0, nx);
  46. Assert.Equal (0, ny);
  47. // Application.TopRunnable with a menu and status bar.
  48. View.GetLocationEnsuringFullVisibility (top, 2, 2, out nx, out ny /*, out sb*/);
  49. Assert.Equal (0, nx);
  50. // Application.TopRunnable without a menu and with a status bar.
  51. View.GetLocationEnsuringFullVisibility (top, 2, 2, out nx, out ny /*, out sb*/);
  52. Assert.Equal (0, nx);
  53. var win = new Window { Width = Dim.Fill (), Height = Dim.Fill () };
  54. top.Add (win);
  55. top.LayoutSubViews ();
  56. // The SuperView is always the same regardless of the caller.
  57. supView = View.GetLocationEnsuringFullVisibility (win, 0, 0, out nx, out ny /*, out sb*/);
  58. Assert.Equal (Application.TopRunnable, supView);
  59. supView = View.GetLocationEnsuringFullVisibility (win, 0, 0, out nx, out ny /*, out sb*/);
  60. Assert.Equal (Application.TopRunnable, supView);
  61. // Application.TopRunnable without menu and status bar.
  62. View.GetLocationEnsuringFullVisibility (win, 0, 0, out nx, out ny /*, out sb*/);
  63. Assert.Equal (0, nx);
  64. Assert.Equal (0, ny);
  65. top.Remove (win);
  66. win = new () { Width = 60, Height = 15 };
  67. top.Add (win);
  68. }
  69. [Fact]
  70. public void SuperViewChanged_Should_Not_Be_Used_To_Initialize_Toplevel_Events ()
  71. {
  72. var wasAdded = false;
  73. var view = new View ();
  74. view.SuperViewChanged += SuperViewChanged;
  75. var win = new Window ();
  76. win.Add (view);
  77. Application.Init ("fake");
  78. Toplevel top = new ();
  79. top.Add (win);
  80. Assert.True (wasAdded);
  81. Application.Shutdown ();
  82. return;
  83. void SuperViewChanged (object sender, SuperViewChangedEventArgs _)
  84. {
  85. Assert.False (wasAdded);
  86. wasAdded = true;
  87. view.SuperViewChanged -= SuperViewChanged;
  88. }
  89. }
  90. [Fact]
  91. [AutoInitShutdown]
  92. public void Mouse_Drag_On_Top_With_Superview_Null ()
  93. {
  94. var win = new Window ();
  95. Toplevel top = new ();
  96. top.Add (win);
  97. int iterations = -1;
  98. Window testWindow;
  99. Application.Iteration += OnApplicationOnIteration;
  100. Application.Run (top);
  101. Application.Iteration -= OnApplicationOnIteration;
  102. top.Dispose ();
  103. return;
  104. void OnApplicationOnIteration (object s, IterationEventArgs a)
  105. {
  106. iterations++;
  107. if (iterations == 0)
  108. {
  109. Application.Driver?.SetScreenSize (15, 7);
  110. // Don't use MessageBox here; it's too complicated for this unit test; just use Window
  111. testWindow = new ()
  112. {
  113. Text = "Hello",
  114. X = 2,
  115. Y = 2,
  116. Width = 10,
  117. Height = 3,
  118. Arrangement = ViewArrangement.Movable
  119. };
  120. Application.Run (testWindow);
  121. }
  122. else if (iterations == 1)
  123. {
  124. Assert.Equal (new (2, 2), Application.TopRunnable!.Frame.Location);
  125. }
  126. else if (iterations == 2)
  127. {
  128. Assert.Null (Application.Mouse.MouseGrabView);
  129. // Grab the mouse
  130. Application.RaiseMouseEvent (new () { ScreenPosition = new (3, 2), Flags = MouseFlags.Button1Pressed });
  131. Assert.Equal (Application.TopRunnable!.Border, Application.Mouse.MouseGrabView);
  132. Assert.Equal (new (2, 2, 10, 3), Application.TopRunnable.Frame);
  133. }
  134. else if (iterations == 3)
  135. {
  136. Assert.Equal (Application.TopRunnable!.Border, Application.Mouse.MouseGrabView);
  137. // Drag to left
  138. Application.RaiseMouseEvent (
  139. new ()
  140. {
  141. ScreenPosition = new (2, 2),
  142. Flags = MouseFlags.Button1Pressed
  143. | MouseFlags.ReportMousePosition
  144. });
  145. AutoInitShutdownAttribute.RunIteration ();
  146. Assert.Equal (Application.TopRunnable.Border, Application.Mouse.MouseGrabView);
  147. Assert.Equal (new (1, 2, 10, 3), Application.TopRunnable.Frame);
  148. }
  149. else if (iterations == 4)
  150. {
  151. Assert.Equal (Application.TopRunnable!.Border, Application.Mouse.MouseGrabView);
  152. Assert.Equal (new (1, 2), Application.TopRunnable.Frame.Location);
  153. Assert.Equal (Application.TopRunnable.Border, Application.Mouse.MouseGrabView);
  154. }
  155. else if (iterations == 5)
  156. {
  157. Assert.Equal (Application.TopRunnable!.Border, Application.Mouse.MouseGrabView);
  158. // Drag up
  159. Application.RaiseMouseEvent (new () { ScreenPosition = new (2, 1), Flags = MouseFlags.Button1Pressed | MouseFlags.ReportMousePosition });
  160. AutoInitShutdownAttribute.RunIteration ();
  161. Assert.Equal (Application.TopRunnable!.Border, Application.Mouse.MouseGrabView);
  162. Assert.Equal (new (1, 1, 10, 3), Application.TopRunnable.Frame);
  163. }
  164. else if (iterations == 6)
  165. {
  166. Assert.Equal (Application.TopRunnable!.Border, Application.Mouse.MouseGrabView);
  167. Assert.Equal (new (1, 1), Application.TopRunnable.Frame.Location);
  168. Assert.Equal (Application.TopRunnable.Border, Application.Mouse.MouseGrabView);
  169. Assert.Equal (new (1, 1, 10, 3), Application.TopRunnable.Frame);
  170. }
  171. else if (iterations == 7)
  172. {
  173. Assert.Equal (Application.TopRunnable!.Border, Application.Mouse.MouseGrabView);
  174. // Ungrab the mouse
  175. Application.RaiseMouseEvent (new () { ScreenPosition = new (2, 1), Flags = MouseFlags.Button1Released });
  176. AutoInitShutdownAttribute.RunIteration ();
  177. Assert.Null (Application.Mouse.MouseGrabView);
  178. }
  179. else if (iterations == 8)
  180. {
  181. Application.RequestStop ();
  182. }
  183. else if (iterations == 9)
  184. {
  185. Application.RequestStop ();
  186. }
  187. }
  188. }
  189. [Fact]
  190. [AutoInitShutdown]
  191. public void Mouse_Drag_On_Top_With_Superview_Not_Null ()
  192. {
  193. var win = new Window { X = 3, Y = 2, Width = 10, Height = 5, Arrangement = ViewArrangement.Movable };
  194. Toplevel top = new ();
  195. top.Add (win);
  196. int iterations = -1;
  197. var movex = 0;
  198. var movey = 0;
  199. var location = new Rectangle (win.Frame.X, win.Frame.Y, 7, 3);
  200. Application.Iteration += OnApplicationOnIteration;
  201. Application.Run (top);
  202. Application.Iteration -= OnApplicationOnIteration;
  203. top.Dispose ();
  204. return;
  205. void OnApplicationOnIteration (object s, IterationEventArgs a)
  206. {
  207. iterations++;
  208. if (iterations == 0)
  209. {
  210. Application.Driver?.SetScreenSize (30, 10);
  211. }
  212. else if (iterations == 1)
  213. {
  214. location = win.Frame;
  215. Assert.Null (Application.Mouse.MouseGrabView);
  216. // Grab the mouse
  217. Application.RaiseMouseEvent (new () { ScreenPosition = new (win.Frame.X, win.Frame.Y), Flags = MouseFlags.Button1Pressed });
  218. Assert.Equal (win.Border, Application.Mouse.MouseGrabView);
  219. }
  220. else if (iterations == 2)
  221. {
  222. Assert.Equal (win.Border, Application.Mouse.MouseGrabView);
  223. // Drag to left
  224. movex = 1;
  225. movey = 0;
  226. Application.RaiseMouseEvent (
  227. new ()
  228. {
  229. ScreenPosition = new (win.Frame.X + movex, win.Frame.Y + movey),
  230. Flags = MouseFlags.Button1Pressed
  231. | MouseFlags.ReportMousePosition
  232. });
  233. Assert.Equal (win.Border, Application.Mouse.MouseGrabView);
  234. }
  235. else if (iterations == 3)
  236. {
  237. // we should have moved +1, +0
  238. Assert.Equal (win.Border, Application.Mouse.MouseGrabView);
  239. Assert.Equal (win.Border, Application.Mouse.MouseGrabView);
  240. location.Offset (movex, movey);
  241. }
  242. else if (iterations == 4)
  243. {
  244. Assert.Equal (win.Border, Application.Mouse.MouseGrabView);
  245. // Drag up
  246. movex = 0;
  247. movey = -1;
  248. Application.RaiseMouseEvent (
  249. new ()
  250. {
  251. ScreenPosition = new (win.Frame.X + movex, win.Frame.Y + movey),
  252. Flags = MouseFlags.Button1Pressed
  253. | MouseFlags.ReportMousePosition
  254. });
  255. Assert.Equal (win.Border, Application.Mouse.MouseGrabView);
  256. }
  257. else if (iterations == 5)
  258. {
  259. // we should have moved +0, -1
  260. Assert.Equal (win.Border, Application.Mouse.MouseGrabView);
  261. location.Offset (movex, movey);
  262. Assert.Equal (location, win.Frame);
  263. }
  264. else if (iterations == 6)
  265. {
  266. Assert.Equal (win.Border, Application.Mouse.MouseGrabView);
  267. // Ungrab the mouse
  268. movex = 0;
  269. movey = 0;
  270. Application.RaiseMouseEvent (new () { ScreenPosition = new (win.Frame.X + movex, win.Frame.Y + movey), Flags = MouseFlags.Button1Released });
  271. Assert.Null (Application.Mouse.MouseGrabView);
  272. }
  273. else if (iterations == 7)
  274. {
  275. Application.RequestStop ();
  276. }
  277. }
  278. }
  279. [Fact]
  280. [SetupFakeApplication]
  281. public void GetLocationThatFits_With_Border_Null_Not_Throws ()
  282. {
  283. var top = new Toplevel ();
  284. top.BeginInit ();
  285. top.EndInit ();
  286. Exception exception = Record.Exception (() => Application.Driver!.SetScreenSize (0, 10));
  287. Assert.Null (exception);
  288. exception = Record.Exception (() => Application.Driver!.SetScreenSize (10, 0));
  289. Assert.Null (exception);
  290. }
  291. [Fact]
  292. [AutoInitShutdown]
  293. public void PositionCursor_SetCursorVisibility_To_Invisible_If_Focused_Is_Null ()
  294. {
  295. var tf = new TextField { Width = 5, Text = "test" };
  296. var view = new View { Width = 10, Height = 10, CanFocus = true };
  297. view.Add (tf);
  298. var top = new Toplevel ();
  299. top.Add (view);
  300. Application.Begin (top);
  301. Assert.True (tf.HasFocus);
  302. Application.PositionCursor ();
  303. Application.Driver!.GetCursorVisibility (out CursorVisibility cursor);
  304. Assert.Equal (CursorVisibility.Default, cursor);
  305. view.Enabled = false;
  306. Assert.False (tf.HasFocus);
  307. Application.PositionCursor ();
  308. Application.Driver!.GetCursorVisibility (out cursor);
  309. Assert.Equal (CursorVisibility.Invisible, cursor);
  310. top.Dispose ();
  311. }
  312. [Fact]
  313. [AutoInitShutdown]
  314. public void IsLoaded_Application_Begin ()
  315. {
  316. Toplevel top = new ();
  317. Assert.False (top.IsLoaded);
  318. Application.Begin (top);
  319. Assert.True (top.IsLoaded);
  320. top.Dispose ();
  321. }
  322. [Fact]
  323. [AutoInitShutdown]
  324. public void IsLoaded_With_Sub_Toplevel_Application_Begin_NeedDisplay ()
  325. {
  326. Toplevel top = new ();
  327. var subTop = new Toplevel ();
  328. var view = new View { Frame = new (0, 0, 20, 10) };
  329. subTop.Add (view);
  330. top.Add (subTop);
  331. Assert.False (top.IsLoaded);
  332. Assert.False (subTop.IsLoaded);
  333. Assert.Equal (new (0, 0, 20, 10), view.Frame);
  334. view.SubViewLayout += ViewLayoutStarted;
  335. void ViewLayoutStarted (object sender, LayoutEventArgs e)
  336. {
  337. Assert.Equal (new (0, 0, 20, 10), view.NeedsDrawRect);
  338. view.SubViewLayout -= ViewLayoutStarted;
  339. }
  340. Application.Begin (top);
  341. Assert.True (top.IsLoaded);
  342. Assert.True (subTop.IsLoaded);
  343. Assert.Equal (new (0, 0, 20, 10), view.Frame);
  344. view.Frame = new (1, 3, 10, 5);
  345. Assert.Equal (new (1, 3, 10, 5), view.Frame);
  346. Assert.Equal (new (0, 0, 10, 5), view.NeedsDrawRect);
  347. view.Frame = new (1, 3, 10, 5);
  348. top.Layout ();
  349. Assert.Equal (new (1, 3, 10, 5), view.Frame);
  350. Assert.Equal (new (0, 0, 10, 5), view.NeedsDrawRect);
  351. top.Dispose ();
  352. }
  353. [Fact]
  354. [AutoInitShutdown]
  355. public void Window_Viewport_Bigger_Than_Driver_Cols_And_Rows_Allow_Drag_Beyond_Left_Right_And_Bottom ()
  356. {
  357. Toplevel top = new ();
  358. var window = new Window { Width = 20, Height = 3, Arrangement = ViewArrangement.Movable };
  359. SessionToken rsTop = Application.Begin (top);
  360. Application.Driver?.SetScreenSize (40, 10);
  361. SessionToken rsWindow = Application.Begin (window);
  362. AutoInitShutdownAttribute.RunIteration ();
  363. Assert.Equal (new (0, 0, 40, 10), top.Frame);
  364. Assert.Equal (new (0, 0, 20, 3), window.Frame);
  365. Assert.Null (Application.Mouse.MouseGrabView);
  366. Application.RaiseMouseEvent (new () { ScreenPosition = new (0, 0), Flags = MouseFlags.Button1Pressed });
  367. Assert.Equal (window.Border, Application.Mouse.MouseGrabView);
  368. Application.RaiseMouseEvent (
  369. new ()
  370. {
  371. ScreenPosition = new (-11, -4), Flags = MouseFlags.Button1Pressed | MouseFlags.ReportMousePosition
  372. });
  373. AutoInitShutdownAttribute.RunIteration ();
  374. Assert.Equal (new (0, 0, 40, 10), top.Frame);
  375. Assert.Equal (new (-11, -4, 20, 3), window.Frame);
  376. // Changes Top size to same size as Dialog more menu and scroll bar
  377. Application.Driver?.SetScreenSize (20, 3);
  378. Application.RaiseMouseEvent (
  379. new ()
  380. {
  381. ScreenPosition = new (-1, -1), Flags = MouseFlags.Button1Pressed | MouseFlags.ReportMousePosition
  382. });
  383. AutoInitShutdownAttribute.RunIteration ();
  384. Assert.Equal (new (0, 0, 20, 3), top.Frame);
  385. Assert.Equal (new (-1, -1, 20, 3), window.Frame);
  386. // Changes Top size smaller than Dialog size
  387. Application.Driver?.SetScreenSize (19, 2);
  388. Application.RaiseMouseEvent (
  389. new ()
  390. {
  391. ScreenPosition = new (-1, -1), Flags = MouseFlags.Button1Pressed | MouseFlags.ReportMousePosition
  392. });
  393. AutoInitShutdownAttribute.RunIteration ();
  394. Assert.Equal (new (0, 0, 19, 2), top.Frame);
  395. Assert.Equal (new (-1, -1, 20, 3), window.Frame);
  396. Application.RaiseMouseEvent (
  397. new ()
  398. {
  399. ScreenPosition = new (18, 1), Flags = MouseFlags.Button1Pressed | MouseFlags.ReportMousePosition
  400. });
  401. AutoInitShutdownAttribute.RunIteration ();
  402. Assert.Equal (new (0, 0, 19, 2), top.Frame);
  403. Assert.Equal (new (18, 1, 20, 3), window.Frame);
  404. // On a real app we can't go beyond the SuperView bounds
  405. Application.RaiseMouseEvent (
  406. new ()
  407. {
  408. ScreenPosition = new (19, 2), Flags = MouseFlags.Button1Pressed | MouseFlags.ReportMousePosition
  409. });
  410. AutoInitShutdownAttribute.RunIteration ();
  411. Assert.Equal (new (0, 0, 19, 2), top.Frame);
  412. Assert.Equal (new (19, 2, 20, 3), window.Frame);
  413. //DriverAsserts.AssertDriverContentsWithFrameAre (@"", output);
  414. Application.End (rsWindow);
  415. Application.End (rsTop);
  416. top.Dispose ();
  417. }
  418. [Fact]
  419. [AutoInitShutdown]
  420. public void Modal_As_Top_Will_Drag_Cleanly ()
  421. {
  422. // Don't use Dialog as a Top, use a Window instead - dialog has complex layout behavior that is not needed here.
  423. var window = new Window { Width = 10, Height = 3, Arrangement = ViewArrangement.Movable };
  424. window.Add (
  425. new Label
  426. {
  427. X = Pos.Center (),
  428. Y = Pos.Center (),
  429. Width = Dim.Fill (),
  430. Height = Dim.Fill (),
  431. TextAlignment = Alignment.Center,
  432. VerticalTextAlignment = Alignment.Center,
  433. Text = "Test"
  434. }
  435. );
  436. SessionToken rs = Application.Begin (window);
  437. Assert.Null (Application.Mouse.MouseGrabView);
  438. Assert.Equal (new (0, 0, 10, 3), window.Frame);
  439. Application.RaiseMouseEvent (new () { ScreenPosition = new (0, 0), Flags = MouseFlags.Button1Pressed });
  440. AutoInitShutdownAttribute.RunIteration ();
  441. Assert.Equal (window.Border, Application.Mouse.MouseGrabView);
  442. Assert.Equal (new (0, 0, 10, 3), window.Frame);
  443. Application.RaiseMouseEvent (
  444. new ()
  445. {
  446. ScreenPosition = new (1, 1), Flags = MouseFlags.Button1Pressed | MouseFlags.ReportMousePosition
  447. });
  448. AutoInitShutdownAttribute.RunIteration ();
  449. Assert.Equal (window.Border, Application.Mouse.MouseGrabView);
  450. Assert.Equal (new (1, 1, 10, 3), window.Frame);
  451. Application.End (rs);
  452. window.Dispose ();
  453. }
  454. [Fact]
  455. public void Multi_Thread_Toplevels ()
  456. {
  457. Application.Init ("fake");
  458. Toplevel t = new ();
  459. var w = new Window ();
  460. t.Add (w);
  461. int count = 0, count1 = 0, count2 = 0;
  462. bool log = false, log1 = false, log2 = false;
  463. var fromTopStillKnowFirstIsRunning = false;
  464. var fromTopStillKnowSecondIsRunning = false;
  465. var fromFirstStillKnowSecondIsRunning = false;
  466. Application.AddTimeout (
  467. TimeSpan.FromMilliseconds (100),
  468. () =>
  469. {
  470. count++;
  471. if (count1 == 5)
  472. {
  473. log1 = true;
  474. }
  475. if (count1 == 14 && count2 == 10 && count == 15)
  476. {
  477. // count2 is already stopped
  478. fromTopStillKnowFirstIsRunning = true;
  479. }
  480. if (count1 == 7 && count2 == 7 && count == 8)
  481. {
  482. fromTopStillKnowSecondIsRunning = true;
  483. }
  484. if (count == 30)
  485. {
  486. Assert.Equal (30, count);
  487. Assert.Equal (20, count1);
  488. Assert.Equal (10, count2);
  489. Assert.True (log);
  490. Assert.True (log1);
  491. Assert.True (log2);
  492. Assert.True (fromTopStillKnowFirstIsRunning);
  493. Assert.True (fromTopStillKnowSecondIsRunning);
  494. Assert.True (fromFirstStillKnowSecondIsRunning);
  495. Application.RequestStop ();
  496. return false;
  497. }
  498. return true;
  499. }
  500. );
  501. t.Ready += FirstWindow;
  502. void FirstWindow (object sender, EventArgs args)
  503. {
  504. var firstWindow = new Window ();
  505. firstWindow.Ready += SecondWindow;
  506. Application.AddTimeout (
  507. TimeSpan.FromMilliseconds (100),
  508. () =>
  509. {
  510. count1++;
  511. if (count2 == 5)
  512. {
  513. log2 = true;
  514. }
  515. if (count2 == 4 && count1 == 5 && count == 5)
  516. {
  517. fromFirstStillKnowSecondIsRunning = true;
  518. }
  519. if (count1 == 20)
  520. {
  521. Assert.Equal (20, count1);
  522. Application.RequestStop ();
  523. return false;
  524. }
  525. return true;
  526. }
  527. );
  528. Application.Run (firstWindow);
  529. firstWindow.Dispose ();
  530. }
  531. void SecondWindow (object sender, EventArgs args)
  532. {
  533. var testWindow = new Window ();
  534. Application.AddTimeout (
  535. TimeSpan.FromMilliseconds (100),
  536. () =>
  537. {
  538. count2++;
  539. if (count < 30)
  540. {
  541. log = true;
  542. }
  543. if (count2 == 10)
  544. {
  545. Assert.Equal (10, count2);
  546. Application.RequestStop ();
  547. return false;
  548. }
  549. return true;
  550. }
  551. );
  552. Application.Run (testWindow);
  553. testWindow.Dispose ();
  554. }
  555. Application.Run (t);
  556. t.Dispose ();
  557. Application.Shutdown ();
  558. }
  559. }