MdiTests.cs 20 KB

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