MdiTests.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698
  1. using System;
  2. using System.Diagnostics;
  3. using System.Linq;
  4. using System.Threading;
  5. using System.Threading.Tasks;
  6. using Xunit;
  7. // Alias Console to MockConsole so we don't accidentally use Console
  8. using Console = Terminal.Gui.FakeConsole;
  9. namespace Terminal.Gui.Core {
  10. public class MdiTests {
  11. public MdiTests ()
  12. {
  13. #if DEBUG_IDISPOSABLE
  14. Responder.Instances.Clear ();
  15. Application.RunState.Instances.Clear ();
  16. #endif
  17. }
  18. [Fact]
  19. public void Dispose_Toplevel_IsMdiContainer_False_With_Begin_End ()
  20. {
  21. Application.Init (new FakeDriver ());
  22. var top = new Toplevel ();
  23. var rs = Application.Begin (top);
  24. Application.End (rs);
  25. Application.Shutdown ();
  26. #if DEBUG_IDISPOSABLE
  27. Assert.Equal (2, Responder.Instances.Count);
  28. Assert.True (Responder.Instances [0].WasDisposed);
  29. Assert.True (Responder.Instances [1].WasDisposed);
  30. #endif
  31. }
  32. [Fact]
  33. public void Dispose_Toplevel_IsMdiContainer_True_With_Begin ()
  34. {
  35. Application.Init (new FakeDriver ());
  36. var mdi = new Toplevel { IsMdiContainer = true };
  37. var rs = Application.Begin (mdi);
  38. Application.End (rs);
  39. Application.Shutdown ();
  40. #if DEBUG_IDISPOSABLE
  41. Assert.Equal (2, Responder.Instances.Count);
  42. Assert.True (Responder.Instances [0].WasDisposed);
  43. Assert.True (Responder.Instances [1].WasDisposed);
  44. #endif
  45. }
  46. [Fact, AutoInitShutdown]
  47. public void Application_RequestStop_With_Params_On_A_Not_MdiContainer_Always_Use_Application_Current ()
  48. {
  49. var top1 = new Toplevel ();
  50. var top2 = new Toplevel ();
  51. var top3 = new Window ();
  52. var top4 = new Window ();
  53. var d = new Dialog ();
  54. // top1, top2, top3, d1 = 4
  55. var iterations = 4;
  56. top1.Ready += () => {
  57. Assert.Null (Application.MdiChildes);
  58. Application.Run (top2);
  59. };
  60. top2.Ready += () => {
  61. Assert.Null (Application.MdiChildes);
  62. Application.Run (top3);
  63. };
  64. top3.Ready += () => {
  65. Assert.Null (Application.MdiChildes);
  66. Application.Run (top4);
  67. };
  68. top4.Ready += () => {
  69. Assert.Null (Application.MdiChildes);
  70. Application.Run (d);
  71. };
  72. d.Ready += () => {
  73. Assert.Null (Application.MdiChildes);
  74. // This will close the d because on a not MdiContainer the Application.Current it always used.
  75. Application.RequestStop (top1);
  76. Assert.True (Application.Current == d);
  77. };
  78. d.Closed += (e) => Application.RequestStop (top1);
  79. Application.Iteration += () => {
  80. Assert.Null (Application.MdiChildes);
  81. if (iterations == 4) {
  82. Assert.True (Application.Current == d);
  83. } else if (iterations == 3) {
  84. Assert.True (Application.Current == top4);
  85. } else if (iterations == 2) {
  86. Assert.True (Application.Current == top3);
  87. } else if (iterations == 1) {
  88. Assert.True (Application.Current == top2);
  89. } else {
  90. Assert.True (Application.Current == top1);
  91. }
  92. Application.RequestStop (top1);
  93. iterations--;
  94. };
  95. Application.Run (top1);
  96. Assert.Null (Application.MdiChildes);
  97. }
  98. class Mdi : Toplevel {
  99. public Mdi ()
  100. {
  101. IsMdiContainer = true;
  102. }
  103. }
  104. [Fact]
  105. [AutoInitShutdown]
  106. public void MdiContainer_With_Toplevel_RequestStop_Balanced ()
  107. {
  108. var mdi = new Mdi ();
  109. var c1 = new Toplevel ();
  110. var c2 = new Window ();
  111. var c3 = new Window ();
  112. var d = new Dialog ();
  113. // MdiChild = c1, c2, c3
  114. // d1 = 1
  115. var iterations = 4;
  116. mdi.Ready += () => {
  117. Assert.Empty (Application.MdiChildes);
  118. Application.Run (c1);
  119. };
  120. c1.Ready += () => {
  121. Assert.Single (Application.MdiChildes);
  122. Application.Run (c2);
  123. };
  124. c2.Ready += () => {
  125. Assert.Equal (2, Application.MdiChildes.Count);
  126. Application.Run (c3);
  127. };
  128. c3.Ready += () => {
  129. Assert.Equal (3, Application.MdiChildes.Count);
  130. Application.Run (d);
  131. };
  132. // More easy because the Mdi Container handles all at once
  133. d.Ready += () => {
  134. Assert.Equal (3, Application.MdiChildes.Count);
  135. // This will not close the MdiContainer because d is a modal toplevel and will be closed.
  136. mdi.RequestStop ();
  137. };
  138. // Now this will close the MdiContainer propagating through the MdiChildes.
  139. d.Closed += (e) => {
  140. mdi.RequestStop ();
  141. };
  142. Application.Iteration += () => {
  143. if (iterations == 4) {
  144. // The Dialog was not closed before and will be closed now.
  145. Assert.True (Application.Current == d);
  146. Assert.False (d.Running);
  147. } else {
  148. Assert.Equal (iterations, Application.MdiChildes.Count);
  149. for (int i = 0; i < iterations; i++) {
  150. Assert.Equal ((iterations - i + 1).ToString (), Application.MdiChildes [i].Id);
  151. }
  152. }
  153. iterations--;
  154. };
  155. Application.Run (mdi);
  156. Assert.Empty (Application.MdiChildes);
  157. }
  158. [Fact]
  159. [AutoInitShutdown]
  160. public void MdiContainer_With_Application_RequestStop_MdiTop_With_Params ()
  161. {
  162. var mdi = new Mdi ();
  163. var c1 = new Toplevel ();
  164. var c2 = new Window ();
  165. var c3 = new Window ();
  166. var d = new Dialog ();
  167. // MdiChild = c1, c2, c3
  168. // d1 = 1
  169. var iterations = 4;
  170. mdi.Ready += () => {
  171. Assert.Empty (Application.MdiChildes);
  172. Application.Run (c1);
  173. };
  174. c1.Ready += () => {
  175. Assert.Single (Application.MdiChildes);
  176. Application.Run (c2);
  177. };
  178. c2.Ready += () => {
  179. Assert.Equal (2, Application.MdiChildes.Count);
  180. Application.Run (c3);
  181. };
  182. c3.Ready += () => {
  183. Assert.Equal (3, Application.MdiChildes.Count);
  184. Application.Run (d);
  185. };
  186. // Also easy because the Mdi Container handles all at once
  187. d.Ready += () => {
  188. Assert.Equal (3, Application.MdiChildes.Count);
  189. // This will not close the MdiContainer because d is a modal toplevel
  190. Application.RequestStop (mdi);
  191. };
  192. // Now this will close the MdiContainer propagating through the MdiChildes.
  193. d.Closed += (e) => Application.RequestStop (mdi);
  194. Application.Iteration += () => {
  195. if (iterations == 4) {
  196. // The Dialog was not closed before and will be closed now.
  197. Assert.True (Application.Current == d);
  198. Assert.False (d.Running);
  199. } else {
  200. Assert.Equal (iterations, Application.MdiChildes.Count);
  201. for (int i = 0; i < iterations; i++) {
  202. Assert.Equal ((iterations - i + 1).ToString (), Application.MdiChildes [i].Id);
  203. }
  204. }
  205. iterations--;
  206. };
  207. Application.Run (mdi);
  208. Assert.Empty (Application.MdiChildes);
  209. }
  210. [Fact]
  211. [AutoInitShutdown]
  212. public void MdiContainer_With_Application_RequestStop_MdiTop_Without_Params ()
  213. {
  214. var mdi = new Mdi ();
  215. var c1 = new Toplevel ();
  216. var c2 = new Window ();
  217. var c3 = new Window ();
  218. var d = new Dialog ();
  219. // MdiChild = c1, c2, c3 = 3
  220. // d1 = 1
  221. var iterations = 4;
  222. mdi.Ready += () => {
  223. Assert.Empty (Application.MdiChildes);
  224. Application.Run (c1);
  225. };
  226. c1.Ready += () => {
  227. Assert.Single (Application.MdiChildes);
  228. Application.Run (c2);
  229. };
  230. c2.Ready += () => {
  231. Assert.Equal (2, Application.MdiChildes.Count);
  232. Application.Run (c3);
  233. };
  234. c3.Ready += () => {
  235. Assert.Equal (3, Application.MdiChildes.Count);
  236. Application.Run (d);
  237. };
  238. //More harder because it's sequential.
  239. d.Ready += () => {
  240. Assert.Equal (3, Application.MdiChildes.Count);
  241. // Close the Dialog
  242. Application.RequestStop ();
  243. };
  244. // Now this will close the MdiContainer propagating through the MdiChildes.
  245. d.Closed += (e) => Application.RequestStop (mdi);
  246. Application.Iteration += () => {
  247. if (iterations == 4) {
  248. // The Dialog still is the current top and we can't request stop to MdiContainer
  249. // because we are not using parameter calls.
  250. Assert.True (Application.Current == d);
  251. Assert.False (d.Running);
  252. } else {
  253. Assert.Equal (iterations, Application.MdiChildes.Count);
  254. for (int i = 0; i < iterations; i++) {
  255. Assert.Equal ((iterations - i + 1).ToString (), Application.MdiChildes [i].Id);
  256. }
  257. }
  258. iterations--;
  259. };
  260. Application.Run (mdi);
  261. Assert.Empty (Application.MdiChildes);
  262. }
  263. [Fact]
  264. [AutoInitShutdown]
  265. public void IsMdiChild_Testing ()
  266. {
  267. var mdi = new Mdi ();
  268. var c1 = new Toplevel ();
  269. var c2 = new Window ();
  270. var c3 = new Window ();
  271. var d = new Dialog ();
  272. Application.Iteration += () => {
  273. Assert.False (mdi.IsMdiChild);
  274. Assert.True (c1.IsMdiChild);
  275. Assert.True (c2.IsMdiChild);
  276. Assert.True (c3.IsMdiChild);
  277. Assert.False (d.IsMdiChild);
  278. mdi.RequestStop ();
  279. };
  280. Application.Run (mdi);
  281. }
  282. [Fact]
  283. [AutoInitShutdown]
  284. public void Modal_Toplevel_Can_Open_Another_Modal_Toplevel_But_RequestStop_To_The_Caller_Also_Sets_Current_Running_To_False_Too ()
  285. {
  286. var mdi = new Mdi ();
  287. var c1 = new Toplevel ();
  288. var c2 = new Window ();
  289. var c3 = new Window ();
  290. var d1 = new Dialog ();
  291. var d2 = new Dialog ();
  292. // MdiChild = c1, c2, c3 = 3
  293. // d1, d2 = 2
  294. var iterations = 5;
  295. mdi.Ready += () => {
  296. Assert.Empty (Application.MdiChildes);
  297. Application.Run (c1);
  298. };
  299. c1.Ready += () => {
  300. Assert.Single (Application.MdiChildes);
  301. Application.Run (c2);
  302. };
  303. c2.Ready += () => {
  304. Assert.Equal (2, Application.MdiChildes.Count);
  305. Application.Run (c3);
  306. };
  307. c3.Ready += () => {
  308. Assert.Equal (3, Application.MdiChildes.Count);
  309. Application.Run (d1);
  310. };
  311. d1.Ready += () => {
  312. Assert.Equal (3, Application.MdiChildes.Count);
  313. Application.Run (d2);
  314. };
  315. d2.Ready += () => {
  316. Assert.Equal (3, Application.MdiChildes.Count);
  317. Assert.True (Application.Current == d2);
  318. Assert.True (Application.Current.Running);
  319. // Trying to close the Dialog1
  320. d1.RequestStop ();
  321. };
  322. // Now this will close the MdiContainer propagating through the MdiChildes.
  323. d1.Closed += (e) => {
  324. Assert.True (Application.Current == d1);
  325. Assert.False (Application.Current.Running);
  326. mdi.RequestStop ();
  327. };
  328. Application.Iteration += () => {
  329. if (iterations == 5) {
  330. // The Dialog2 still is the current top and we can't request stop to MdiContainer
  331. // because Dialog2 and Dialog1 must be closed first.
  332. // Dialog2 will be closed in this iteration.
  333. Assert.True (Application.Current == d2);
  334. Assert.False (Application.Current.Running);
  335. Assert.False (d1.Running);
  336. } else if (iterations == 4) {
  337. // Dialog1 will be closed in this iteration.
  338. Assert.True (Application.Current == d1);
  339. Assert.False (Application.Current.Running);
  340. } else {
  341. Assert.Equal (iterations, Application.MdiChildes.Count);
  342. for (int i = 0; i < iterations; i++) {
  343. Assert.Equal ((iterations - i + 1).ToString (), Application.MdiChildes [i].Id);
  344. }
  345. }
  346. iterations--;
  347. };
  348. Application.Run (mdi);
  349. Assert.Empty (Application.MdiChildes);
  350. }
  351. [Fact]
  352. [AutoInitShutdown]
  353. public void Modal_Toplevel_Can_Open_Another_Not_Modal_Toplevel_But_RequestStop_To_The_Caller_Also_Sets_Current_Running_To_False_Too ()
  354. {
  355. var mdi = new Mdi ();
  356. var c1 = new Toplevel ();
  357. var c2 = new Window ();
  358. var c3 = new Window ();
  359. var d1 = new Dialog ();
  360. var c4 = new Toplevel ();
  361. // MdiChild = c1, c2, c3, c4 = 4
  362. // d1 = 1
  363. var iterations = 5;
  364. mdi.Ready += () => {
  365. Assert.Empty (Application.MdiChildes);
  366. Application.Run (c1);
  367. };
  368. c1.Ready += () => {
  369. Assert.Single (Application.MdiChildes);
  370. Application.Run (c2);
  371. };
  372. c2.Ready += () => {
  373. Assert.Equal (2, Application.MdiChildes.Count);
  374. Application.Run (c3);
  375. };
  376. c3.Ready += () => {
  377. Assert.Equal (3, Application.MdiChildes.Count);
  378. Application.Run (d1);
  379. };
  380. d1.Ready += () => {
  381. Assert.Equal (3, Application.MdiChildes.Count);
  382. Application.Run (c4);
  383. };
  384. c4.Ready += () => {
  385. Assert.Equal (4, Application.MdiChildes.Count);
  386. // Trying to close the Dialog1
  387. d1.RequestStop ();
  388. };
  389. // Now this will close the MdiContainer propagating through the MdiChildes.
  390. d1.Closed += (e) => {
  391. mdi.RequestStop ();
  392. };
  393. Application.Iteration += () => {
  394. if (iterations == 5) {
  395. // The Dialog2 still is the current top and we can't request stop to MdiContainer
  396. // because Dialog2 and Dialog1 must be closed first.
  397. // Using request stop here will call the Dialog again without need
  398. Assert.True (Application.Current == d1);
  399. Assert.False (Application.Current.Running);
  400. Assert.True (c4.Running);
  401. } else {
  402. Assert.Equal (iterations, Application.MdiChildes.Count);
  403. for (int i = 0; i < iterations; i++) {
  404. Assert.Equal ((iterations - i + (iterations == 4 && i == 0 ? 2 : 1)).ToString (),
  405. Application.MdiChildes [i].Id);
  406. }
  407. }
  408. iterations--;
  409. };
  410. Application.Run (mdi);
  411. Assert.Empty (Application.MdiChildes);
  412. }
  413. [Fact]
  414. [AutoInitShutdown]
  415. public void MoveCurrent_Returns_False_If_The_Current_And_Top_Parameter_Are_Both_With_Running_Set_To_False ()
  416. {
  417. var mdi = new Mdi ();
  418. var c1 = new Toplevel ();
  419. var c2 = new Window ();
  420. var c3 = new Window ();
  421. // MdiChild = c1, c2, c3
  422. var iterations = 3;
  423. mdi.Ready += () => {
  424. Assert.Empty (Application.MdiChildes);
  425. Application.Run (c1);
  426. };
  427. c1.Ready += () => {
  428. Assert.Single (Application.MdiChildes);
  429. Application.Run (c2);
  430. };
  431. c2.Ready += () => {
  432. Assert.Equal (2, Application.MdiChildes.Count);
  433. Application.Run (c3);
  434. };
  435. c3.Ready += () => {
  436. Assert.Equal (3, Application.MdiChildes.Count);
  437. c3.RequestStop ();
  438. c1.RequestStop ();
  439. };
  440. // Now this will close the MdiContainer propagating through the MdiChildes.
  441. c1.Closed += (e) => {
  442. mdi.RequestStop ();
  443. };
  444. Application.Iteration += () => {
  445. if (iterations == 3) {
  446. // The Current still is c3 because Current.Running is false.
  447. Assert.True (Application.Current == c3);
  448. Assert.False (Application.Current.Running);
  449. // But the childes order were reorder by Running = false
  450. Assert.True (Application.MdiChildes [0] == c3);
  451. Assert.True (Application.MdiChildes [1] == c1);
  452. Assert.True (Application.MdiChildes [^1] == c2);
  453. } else if (iterations == 2) {
  454. // The Current is c1 and Current.Running is false.
  455. Assert.True (Application.Current == c1);
  456. Assert.False (Application.Current.Running);
  457. Assert.True (Application.MdiChildes [0] == c1);
  458. Assert.True (Application.MdiChildes [^1] == c2);
  459. } else if (iterations == 1) {
  460. // The Current is c2 and Current.Running is false.
  461. Assert.True (Application.Current == c2);
  462. Assert.False (Application.Current.Running);
  463. Assert.True (Application.MdiChildes [^1] == c2);
  464. } else {
  465. // The Current is mdi.
  466. Assert.True (Application.Current == mdi);
  467. Assert.Empty (Application.MdiChildes);
  468. }
  469. iterations--;
  470. };
  471. Application.Run (mdi);
  472. Assert.Empty (Application.MdiChildes);
  473. }
  474. [Fact]
  475. [AutoInitShutdown]
  476. public void MdiContainer_Throws_If_More_Than_One ()
  477. {
  478. var mdi = new Mdi ();
  479. var mdi2 = new Mdi ();
  480. mdi.Ready += () => {
  481. Assert.Throws<InvalidOperationException> (() => Application.Run (mdi2));
  482. mdi.RequestStop ();
  483. };
  484. Application.Run (mdi);
  485. }
  486. [Fact]
  487. [AutoInitShutdown]
  488. public void MdiContainer_Open_And_Close_Modal_And_Open_Not_Modal_Toplevels_Randomly ()
  489. {
  490. var mdi = new Mdi ();
  491. var logger = new Toplevel ();
  492. var iterations = 1; // The logger
  493. var running = true;
  494. var stageCompleted = true;
  495. var allStageClosed = false;
  496. var mdiRequestStop = false;
  497. mdi.Ready += () => {
  498. Assert.Empty (Application.MdiChildes);
  499. Application.Run (logger);
  500. };
  501. logger.Ready += () => Assert.Single (Application.MdiChildes);
  502. Application.Iteration += () => {
  503. if (stageCompleted && running) {
  504. stageCompleted = false;
  505. var stage = new Window () { Modal = true };
  506. stage.Ready += () => {
  507. Assert.Equal (iterations, Application.MdiChildes.Count);
  508. stage.RequestStop ();
  509. };
  510. stage.Closed += (_) => {
  511. if (iterations == 11) {
  512. allStageClosed = true;
  513. }
  514. Assert.Equal (iterations, Application.MdiChildes.Count);
  515. if (running) {
  516. stageCompleted = true;
  517. var rpt = new Window ();
  518. rpt.Ready += () => {
  519. iterations++;
  520. Assert.Equal (iterations, Application.MdiChildes.Count);
  521. };
  522. Application.Run (rpt);
  523. }
  524. };
  525. Application.Run (stage);
  526. } else if (iterations == 11 && running) {
  527. running = false;
  528. Assert.Equal (iterations, Application.MdiChildes.Count);
  529. } else if (!mdiRequestStop && running && !allStageClosed) {
  530. Assert.Equal (iterations, Application.MdiChildes.Count);
  531. } else if (!mdiRequestStop && !running && allStageClosed) {
  532. Assert.Equal (iterations, Application.MdiChildes.Count);
  533. mdiRequestStop = true;
  534. mdi.RequestStop ();
  535. } else {
  536. Assert.Empty (Application.MdiChildes);
  537. }
  538. };
  539. Application.Run (mdi);
  540. Assert.Empty (Application.MdiChildes);
  541. }
  542. [Fact]
  543. [AutoInitShutdown]
  544. public void AllChildClosed_Event_Test ()
  545. {
  546. var mdi = new Mdi ();
  547. var c1 = new Toplevel ();
  548. var c2 = new Window ();
  549. var c3 = new Window ();
  550. // MdiChild = c1, c2, c3
  551. var iterations = 3;
  552. mdi.Ready += () => {
  553. Assert.Empty (Application.MdiChildes);
  554. Application.Run (c1);
  555. };
  556. c1.Ready += () => {
  557. Assert.Single (Application.MdiChildes);
  558. Application.Run (c2);
  559. };
  560. c2.Ready += () => {
  561. Assert.Equal (2, Application.MdiChildes.Count);
  562. Application.Run (c3);
  563. };
  564. c3.Ready += () => {
  565. Assert.Equal (3, Application.MdiChildes.Count);
  566. c3.RequestStop ();
  567. c2.RequestStop ();
  568. c1.RequestStop ();
  569. };
  570. // Now this will close the MdiContainer when all MdiChildes was closed
  571. mdi.AllChildClosed += () => {
  572. mdi.RequestStop ();
  573. };
  574. Application.Iteration += () => {
  575. if (iterations == 3) {
  576. // The Current still is c3 because Current.Running is false.
  577. Assert.True (Application.Current == c3);
  578. Assert.False (Application.Current.Running);
  579. // But the childes order were reorder by Running = false
  580. Assert.True (Application.MdiChildes [0] == c3);
  581. Assert.True (Application.MdiChildes [1] == c2);
  582. Assert.True (Application.MdiChildes [^1] == c1);
  583. } else if (iterations == 2) {
  584. // The Current is c2 and Current.Running is false.
  585. Assert.True (Application.Current == c2);
  586. Assert.False (Application.Current.Running);
  587. Assert.True (Application.MdiChildes [0] == c2);
  588. Assert.True (Application.MdiChildes [^1] == c1);
  589. } else if (iterations == 1) {
  590. // The Current is c1 and Current.Running is false.
  591. Assert.True (Application.Current == c1);
  592. Assert.False (Application.Current.Running);
  593. Assert.True (Application.MdiChildes [^1] == c1);
  594. } else {
  595. // The Current is mdi.
  596. Assert.True (Application.Current == mdi);
  597. Assert.False (Application.Current.Running);
  598. Assert.Empty (Application.MdiChildes);
  599. }
  600. iterations--;
  601. };
  602. Application.Run (mdi);
  603. Assert.Empty (Application.MdiChildes);
  604. }
  605. }
  606. }