HasFocusChangeEventTests.cs 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045
  1. using Xunit.Abstractions;
  2. namespace Terminal.Gui.ViewTests;
  3. public class HasFocusChangeEventTests () : TestsAllViews
  4. {
  5. #region HasFocusChanging_NewValue_True
  6. [Fact]
  7. public void HasFocusChanging_SetFocus_Raises ()
  8. {
  9. var hasFocusTrueCount = 0;
  10. var hasFocusFalseCount = 0;
  11. var view = new View
  12. {
  13. Id = "view",
  14. CanFocus = true
  15. };
  16. view.HasFocusChanging += (s, e) =>
  17. {
  18. if (e.NewValue)
  19. {
  20. hasFocusTrueCount++;
  21. }
  22. else
  23. {
  24. hasFocusFalseCount++;
  25. }
  26. };
  27. Assert.True (view.CanFocus);
  28. Assert.False (view.HasFocus);
  29. view.SetFocus ();
  30. Assert.True (view.HasFocus);
  31. Assert.Equal (1, hasFocusTrueCount);
  32. Assert.Equal (0, hasFocusFalseCount);
  33. }
  34. [Fact]
  35. public void HasFocusChanging_SetFocus_SubView_SetFocus_Raises ()
  36. {
  37. var hasFocusTrueCount = 0;
  38. var hasFocusFalseCount = 0;
  39. var view = new View
  40. {
  41. Id = "view",
  42. CanFocus = true
  43. };
  44. view.HasFocusChanging += (s, e) =>
  45. {
  46. if (e.NewValue)
  47. {
  48. hasFocusTrueCount++;
  49. }
  50. else
  51. {
  52. hasFocusFalseCount++;
  53. }
  54. };
  55. var subviewHasFocusTrueCount = 0;
  56. var subviewHasFocusFalseCount = 0;
  57. var subview = new View
  58. {
  59. Id = "subview",
  60. CanFocus = true
  61. };
  62. subview.HasFocusChanging += (s, e) =>
  63. {
  64. if (e.NewValue)
  65. {
  66. subviewHasFocusTrueCount++;
  67. }
  68. else
  69. {
  70. subviewHasFocusFalseCount++;
  71. }
  72. };
  73. view.Add (subview);
  74. view.SetFocus ();
  75. Assert.Equal (1, hasFocusTrueCount);
  76. Assert.Equal (0, hasFocusFalseCount);
  77. Assert.Equal (1, subviewHasFocusTrueCount);
  78. Assert.Equal (0, subviewHasFocusFalseCount);
  79. }
  80. [Fact]
  81. public void HasFocusChanging_SetFocus_On_SubView_SubView_SetFocus_Raises ()
  82. {
  83. var hasFocusTrueCount = 0;
  84. var hasFocusFalseCount = 0;
  85. var view = new View
  86. {
  87. Id = "view",
  88. CanFocus = true
  89. };
  90. view.HasFocusChanging += (s, e) =>
  91. {
  92. if (e.NewValue)
  93. {
  94. hasFocusTrueCount++;
  95. }
  96. else
  97. {
  98. hasFocusFalseCount++;
  99. }
  100. };
  101. var subviewHasFocusTrueCount = 0;
  102. var subviewHasFocusFalseCount = 0;
  103. var subview = new View
  104. {
  105. Id = "subview",
  106. CanFocus = true
  107. };
  108. subview.HasFocusChanging += (s, e) =>
  109. {
  110. if (e.NewValue)
  111. {
  112. subviewHasFocusTrueCount++;
  113. }
  114. else
  115. {
  116. subviewHasFocusFalseCount++;
  117. }
  118. };
  119. view.Add (subview);
  120. subview.SetFocus ();
  121. Assert.Equal (1, hasFocusTrueCount);
  122. Assert.Equal (0, hasFocusFalseCount);
  123. Assert.Equal (1, subviewHasFocusTrueCount);
  124. Assert.Equal (0, subviewHasFocusFalseCount);
  125. }
  126. [Fact]
  127. public void HasFocusChanging_SetFocus_CompoundSubView_Raises ()
  128. {
  129. var hasFocusTrueCount = 0;
  130. var hasFocusFalseCount = 0;
  131. var view = new View
  132. {
  133. Id = "view",
  134. CanFocus = true
  135. };
  136. view.HasFocusChanging += (s, e) =>
  137. {
  138. if (e.NewValue)
  139. {
  140. hasFocusTrueCount++;
  141. }
  142. else
  143. {
  144. hasFocusFalseCount++;
  145. }
  146. };
  147. var subViewEnterCount = 0;
  148. var subViewLeaveCount = 0;
  149. var subView = new View
  150. {
  151. Id = "subView",
  152. CanFocus = true
  153. };
  154. subView.HasFocusChanging += (s, e) =>
  155. {
  156. if (e.NewValue)
  157. {
  158. subViewEnterCount++;
  159. }
  160. else
  161. {
  162. subViewLeaveCount++;
  163. }
  164. };
  165. var subviewSubView1EnterCount = 0;
  166. var subviewSubView1LeaveCount = 0;
  167. var subViewSubView1 = new View
  168. {
  169. Id = "subViewSubView1",
  170. CanFocus = false
  171. };
  172. subViewSubView1.HasFocusChanging += (s, e) =>
  173. {
  174. if (e.NewValue)
  175. {
  176. subviewSubView1EnterCount++;
  177. }
  178. else
  179. {
  180. subviewSubView1LeaveCount++;
  181. }
  182. };
  183. var subviewSubView2EnterCount = 0;
  184. var subviewSubView2LeaveCount = 0;
  185. var subViewSubView2 = new View
  186. {
  187. Id = "subViewSubView2",
  188. CanFocus = true
  189. };
  190. subViewSubView2.HasFocusChanging += (s, e) =>
  191. {
  192. if (e.NewValue)
  193. {
  194. subviewSubView2EnterCount++;
  195. }
  196. else
  197. {
  198. subviewSubView2EnterCount++;
  199. }
  200. };
  201. var subviewSubView3EnterCount = 0;
  202. var subviewSubView3LeaveCount = 0;
  203. var subViewSubView3 = new View
  204. {
  205. Id = "subViewSubView3",
  206. CanFocus = false
  207. };
  208. subViewSubView3.HasFocusChanging += (s, e) =>
  209. {
  210. if (e.NewValue)
  211. {
  212. subviewSubView3EnterCount++;
  213. }
  214. else
  215. {
  216. subviewSubView3LeaveCount++;
  217. }
  218. };
  219. subView.Add (subViewSubView1, subViewSubView2, subViewSubView3);
  220. view.Add (subView);
  221. view.SetFocus ();
  222. Assert.True (view.HasFocus);
  223. Assert.True (subView.HasFocus);
  224. Assert.False (subViewSubView1.HasFocus);
  225. Assert.True (subViewSubView2.HasFocus);
  226. Assert.False (subViewSubView3.HasFocus);
  227. Assert.Equal (1, hasFocusTrueCount);
  228. Assert.Equal (0, hasFocusFalseCount);
  229. Assert.Equal (1, subViewEnterCount);
  230. Assert.Equal (0, subViewLeaveCount);
  231. Assert.Equal (0, subviewSubView1EnterCount);
  232. Assert.Equal (0, subviewSubView1LeaveCount);
  233. Assert.Equal (1, subviewSubView2EnterCount);
  234. Assert.Equal (0, subviewSubView2LeaveCount);
  235. Assert.Equal (0, subviewSubView3EnterCount);
  236. Assert.Equal (0, subviewSubView3LeaveCount);
  237. }
  238. [Fact]
  239. public void HasFocusChanging_Can_Cancel ()
  240. {
  241. var hasFocusTrueCount = 0;
  242. var hasFocusFalseCount = 0;
  243. var view = new View
  244. {
  245. Id = "view",
  246. CanFocus = true
  247. };
  248. view.HasFocusChanging += (s, e) =>
  249. {
  250. if (e.NewValue)
  251. {
  252. hasFocusTrueCount++;
  253. e.Cancel = true;
  254. }
  255. else
  256. {
  257. hasFocusFalseCount++;
  258. }
  259. };
  260. var subviewHasFocusTrueCount = 0;
  261. var subviewHasFocusFalseCount = 0;
  262. var subview = new View
  263. {
  264. Id = "subview",
  265. CanFocus = true
  266. };
  267. subview.HasFocusChanging += (s, e) =>
  268. {
  269. if (e.NewValue)
  270. {
  271. subviewHasFocusTrueCount++;
  272. }
  273. else
  274. {
  275. subviewHasFocusFalseCount++;
  276. }
  277. };
  278. view.Add (subview);
  279. view.SetFocus ();
  280. Assert.False (view.HasFocus);
  281. Assert.False (subview.HasFocus);
  282. Assert.Equal (1, hasFocusTrueCount);
  283. Assert.Equal (0, hasFocusFalseCount);
  284. Assert.Equal (0, subviewHasFocusTrueCount);
  285. Assert.Equal (0, subviewHasFocusFalseCount);
  286. }
  287. [Fact]
  288. public void HasFocusChanging_SetFocus_On_SubView_Can_Cancel ()
  289. {
  290. var hasFocusTrueCount = 0;
  291. var hasFocusFalseCount = 0;
  292. var view = new View
  293. {
  294. Id = "view",
  295. CanFocus = true
  296. };
  297. view.HasFocusChanging += (s, e) =>
  298. {
  299. if (e.NewValue)
  300. {
  301. hasFocusTrueCount++;
  302. e.Cancel = true;
  303. }
  304. else
  305. {
  306. hasFocusFalseCount++;
  307. }
  308. };
  309. var subviewHasFocusTrueCount = 0;
  310. var subviewHasFocusFalseCount = 0;
  311. var subview = new View
  312. {
  313. Id = "subview",
  314. CanFocus = true
  315. };
  316. subview.HasFocusChanging += (s, e) =>
  317. {
  318. if (e.NewValue)
  319. {
  320. subviewHasFocusTrueCount++;
  321. }
  322. else
  323. {
  324. subviewHasFocusFalseCount++;
  325. }
  326. };
  327. view.Add (subview);
  328. subview.SetFocus ();
  329. Assert.False (view.HasFocus);
  330. Assert.False (subview.HasFocus);
  331. Assert.Equal (1, hasFocusTrueCount);
  332. Assert.Equal (0, hasFocusFalseCount);
  333. Assert.Equal (1, subviewHasFocusTrueCount);
  334. Assert.Equal (0, subviewHasFocusFalseCount);
  335. }
  336. [Fact]
  337. public void HasFocusChanging_SubView_Can_Cancel ()
  338. {
  339. var hasFocusTrueCount = 0;
  340. var hasFocusFalseCount = 0;
  341. var view = new View
  342. {
  343. Id = "view",
  344. CanFocus = true
  345. };
  346. view.HasFocusChanging += (s, e) =>
  347. {
  348. if (e.NewValue)
  349. {
  350. hasFocusTrueCount++;
  351. }
  352. else
  353. {
  354. hasFocusFalseCount++;
  355. }
  356. };
  357. var subviewHasFocusTrueCount = 0;
  358. var subviewHasFocusFalseCount = 0;
  359. var subview = new View
  360. {
  361. Id = "subview",
  362. CanFocus = true
  363. };
  364. subview.HasFocusChanging += (s, e) =>
  365. {
  366. if (e.NewValue)
  367. {
  368. subviewHasFocusTrueCount++;
  369. e.Cancel = true;
  370. }
  371. else
  372. {
  373. subviewHasFocusFalseCount++;
  374. }
  375. };
  376. view.Add (subview);
  377. view.SetFocus ();
  378. Assert.True (view.HasFocus);
  379. Assert.False (subview.HasFocus);
  380. Assert.Equal (1, hasFocusTrueCount);
  381. Assert.Equal (0, hasFocusFalseCount);
  382. Assert.Equal (1, subviewHasFocusTrueCount);
  383. Assert.Equal (0, subviewHasFocusFalseCount);
  384. }
  385. [Fact]
  386. public void HasFocusChanging_SetFocus_On_Subview_If_SubView_Cancels ()
  387. {
  388. var hasFocusTrueCount = 0;
  389. var hasFocusFalseCount = 0;
  390. var view = new View
  391. {
  392. Id = "view",
  393. CanFocus = true
  394. };
  395. view.HasFocusChanging += (s, e) =>
  396. {
  397. if (e.NewValue)
  398. {
  399. hasFocusTrueCount++;
  400. }
  401. else
  402. {
  403. hasFocusFalseCount++;
  404. }
  405. };
  406. var subviewHasFocusTrueCount = 0;
  407. var subviewHasFocusFalseCount = 0;
  408. var subview = new View
  409. {
  410. Id = "subview",
  411. CanFocus = true
  412. };
  413. subview.HasFocusChanging += (s, e) =>
  414. {
  415. if (e.NewValue)
  416. {
  417. subviewHasFocusTrueCount++;
  418. e.Cancel = true;
  419. }
  420. else
  421. {
  422. subviewHasFocusFalseCount++;
  423. }
  424. };
  425. view.Add (subview);
  426. subview.SetFocus ();
  427. Assert.False (view.HasFocus); // Never had focus
  428. Assert.False (subview.HasFocus); // Cancelled
  429. Assert.Equal (0, hasFocusTrueCount);
  430. Assert.Equal (0, hasFocusFalseCount);
  431. Assert.Equal (1, subviewHasFocusTrueCount);
  432. Assert.Equal (0, subviewHasFocusFalseCount);
  433. // Now set focus on the view
  434. view.SetFocus ();
  435. Assert.True (view.HasFocus);
  436. Assert.False (subview.HasFocus); // Cancelled
  437. Assert.Equal (1, hasFocusTrueCount);
  438. Assert.Equal (0, hasFocusFalseCount);
  439. Assert.Equal (2, subviewHasFocusTrueCount);
  440. Assert.Equal (0, subviewHasFocusFalseCount);
  441. }
  442. #endregion HasFocusChanging_NewValue_True
  443. #region HasFocusChanging_NewValue_False
  444. [Fact]
  445. public void HasFocusChanging_RemoveFocus_Raises ()
  446. {
  447. var hasFocusTrueCount = 0;
  448. var hasFocusFalseCount = 0;
  449. var view = new View
  450. {
  451. Id = "view",
  452. CanFocus = true
  453. };
  454. view.HasFocusChanging += (s, e) =>
  455. {
  456. if (e.NewValue)
  457. {
  458. hasFocusTrueCount++;
  459. }
  460. else
  461. {
  462. hasFocusFalseCount++;
  463. }
  464. };
  465. Assert.True (view.CanFocus);
  466. Assert.False (view.HasFocus);
  467. view.SetFocus ();
  468. Assert.True (view.HasFocus);
  469. Assert.Equal (1, hasFocusTrueCount);
  470. Assert.Equal (0, hasFocusFalseCount);
  471. view.HasFocus = false;
  472. Assert.False (view.HasFocus);
  473. Assert.Equal (1, hasFocusTrueCount);
  474. Assert.Equal (1, hasFocusFalseCount);
  475. }
  476. [Fact]
  477. public void HasFocusChanging_RemoveFocus_SubView_SetFocus_Raises ()
  478. {
  479. var hasFocusTrueCount = 0;
  480. var hasFocusFalseCount = 0;
  481. var view = new View
  482. {
  483. Id = "view",
  484. CanFocus = true
  485. };
  486. view.HasFocusChanging += (s, e) =>
  487. {
  488. if (e.NewValue)
  489. {
  490. hasFocusTrueCount++;
  491. }
  492. else
  493. {
  494. hasFocusFalseCount++;
  495. }
  496. };
  497. var subviewHasFocusTrueCount = 0;
  498. var subviewHasFocusFalseCount = 0;
  499. var subview = new View
  500. {
  501. Id = "subview",
  502. CanFocus = true
  503. };
  504. subview.HasFocusChanging += (s, e) =>
  505. {
  506. if (e.NewValue)
  507. {
  508. subviewHasFocusTrueCount++;
  509. }
  510. else
  511. {
  512. subviewHasFocusFalseCount++;
  513. }
  514. };
  515. view.Add (subview);
  516. view.SetFocus ();
  517. Assert.Equal (1, hasFocusTrueCount);
  518. Assert.Equal (0, hasFocusFalseCount);
  519. Assert.Equal (1, subviewHasFocusTrueCount);
  520. Assert.Equal (0, subviewHasFocusFalseCount);
  521. view.HasFocus = false;
  522. Assert.False (view.HasFocus);
  523. Assert.False (subview.HasFocus);
  524. Assert.Equal (1, hasFocusTrueCount);
  525. Assert.Equal (1, hasFocusFalseCount);
  526. Assert.Equal (1, subviewHasFocusTrueCount);
  527. Assert.Equal (1, subviewHasFocusFalseCount);
  528. }
  529. [Fact]
  530. public void HasFocusChanging_RemoveFocus_On_SubView_SubView_SetFocus_Raises ()
  531. {
  532. var hasFocusTrueCount = 0;
  533. var hasFocusFalseCount = 0;
  534. var view = new View
  535. {
  536. Id = "view",
  537. CanFocus = true
  538. };
  539. view.HasFocusChanging += (s, e) =>
  540. {
  541. if (e.NewValue)
  542. {
  543. hasFocusTrueCount++;
  544. }
  545. else
  546. {
  547. hasFocusFalseCount++;
  548. }
  549. };
  550. var subviewHasFocusTrueCount = 0;
  551. var subviewHasFocusFalseCount = 0;
  552. var subview = new View
  553. {
  554. Id = "subview",
  555. CanFocus = true
  556. };
  557. subview.HasFocusChanging += (s, e) =>
  558. {
  559. if (e.NewValue)
  560. {
  561. subviewHasFocusTrueCount++;
  562. }
  563. else
  564. {
  565. subviewHasFocusFalseCount++;
  566. }
  567. };
  568. view.Add (subview);
  569. subview.SetFocus ();
  570. Assert.Equal (1, hasFocusTrueCount);
  571. Assert.Equal (0, hasFocusFalseCount);
  572. Assert.Equal (1, subviewHasFocusTrueCount);
  573. Assert.Equal (0, subviewHasFocusFalseCount);
  574. subview.HasFocus = false;
  575. Assert.False (subview.HasFocus);
  576. Assert.Equal (1, hasFocusTrueCount);
  577. Assert.Equal (0, hasFocusFalseCount);
  578. Assert.Equal (1, subviewHasFocusTrueCount);
  579. Assert.Equal (1, subviewHasFocusFalseCount);
  580. }
  581. #endregion HasFocusChanging_NewValue_False
  582. #region HasFocusChanged
  583. [Fact]
  584. public void HasFocusChanged_RemoveFocus_Raises ()
  585. {
  586. var newValueTrueCount = 0;
  587. var newValueFalseCount = 0;
  588. var view = new View
  589. {
  590. Id = "view",
  591. CanFocus = true
  592. };
  593. view.HasFocusChanged += (s, e) =>
  594. {
  595. if (e.NewValue)
  596. {
  597. newValueTrueCount++;
  598. }
  599. else
  600. {
  601. newValueFalseCount++;
  602. }
  603. };
  604. Assert.True (view.CanFocus);
  605. Assert.False (view.HasFocus);
  606. view.SetFocus ();
  607. Assert.True (view.HasFocus);
  608. Assert.Equal (1, newValueTrueCount);
  609. Assert.Equal (0, newValueFalseCount);
  610. view.HasFocus = false;
  611. Assert.Equal (1, newValueTrueCount);
  612. Assert.Equal (1, newValueFalseCount);
  613. }
  614. [Fact]
  615. public void HasFocusChanged_With_SubView_Raises ()
  616. {
  617. var newValueTrueCount = 0;
  618. var newValueFalseCount = 0;
  619. var view = new View
  620. {
  621. Id = "view",
  622. CanFocus = true
  623. };
  624. view.HasFocusChanged += (s, e) =>
  625. {
  626. if (e.NewValue)
  627. {
  628. newValueTrueCount++;
  629. }
  630. else
  631. {
  632. newValueFalseCount++;
  633. }
  634. };
  635. var subviewNewValueTrueCount = 0;
  636. var subviewNewValueFalseCount = 0;
  637. var subview = new View
  638. {
  639. Id = "subview",
  640. CanFocus = true
  641. };
  642. subview.HasFocusChanged += (s, e) =>
  643. {
  644. if (e.NewValue)
  645. {
  646. subviewNewValueTrueCount++;
  647. }
  648. else
  649. {
  650. subviewNewValueFalseCount++;
  651. }
  652. };
  653. view.Add (subview);
  654. view.SetFocus ();
  655. Assert.Equal (1, newValueTrueCount);
  656. Assert.Equal (0, newValueFalseCount);
  657. Assert.Equal (1, subviewNewValueTrueCount);
  658. Assert.Equal (0, subviewNewValueFalseCount);
  659. view.HasFocus = false;
  660. Assert.Equal (1, newValueTrueCount);
  661. Assert.Equal (1, newValueFalseCount);
  662. Assert.Equal (1, subviewNewValueTrueCount);
  663. Assert.Equal (1, subviewNewValueFalseCount);
  664. view.SetFocus ();
  665. Assert.Equal (2, newValueTrueCount);
  666. Assert.Equal (1, newValueFalseCount);
  667. Assert.Equal (2, subviewNewValueTrueCount);
  668. Assert.Equal (1, subviewNewValueFalseCount);
  669. subview.HasFocus = false;
  670. Assert.Equal (2, newValueTrueCount);
  671. Assert.Equal (1, newValueFalseCount);
  672. Assert.Equal (2, subviewNewValueTrueCount);
  673. Assert.Equal (2, subviewNewValueFalseCount);
  674. }
  675. [Fact]
  676. public void HasFocusChanged_CompoundSubView_Raises ()
  677. {
  678. var viewEnterCount = 0;
  679. var viewLeaveCount = 0;
  680. var view = new View
  681. {
  682. Id = "view",
  683. CanFocus = true
  684. };
  685. view.HasFocusChanged += (s, e) =>
  686. {
  687. if (e.NewValue)
  688. {
  689. viewEnterCount++;
  690. }
  691. else
  692. {
  693. viewLeaveCount++;
  694. }
  695. };
  696. var subViewEnterCount = 0;
  697. var subViewLeaveCount = 0;
  698. var subView = new View
  699. {
  700. Id = "subView",
  701. CanFocus = true
  702. };
  703. subView.HasFocusChanged += (s, e) =>
  704. {
  705. if (e.NewValue)
  706. {
  707. subViewEnterCount++;
  708. }
  709. else
  710. {
  711. subViewLeaveCount++;
  712. }
  713. };
  714. var subviewSubView1EnterCount = 0;
  715. var subviewSubView1LeaveCount = 0;
  716. var subViewSubView1 = new View
  717. {
  718. Id = "subViewSubView1",
  719. CanFocus = false
  720. };
  721. subViewSubView1.HasFocusChanged += (s, e) =>
  722. {
  723. if (e.NewValue)
  724. {
  725. subviewSubView1EnterCount++;
  726. }
  727. else
  728. {
  729. subviewSubView1LeaveCount++;
  730. }
  731. };
  732. var subviewSubView2EnterCount = 0;
  733. var subviewSubView2LeaveCount = 0;
  734. var subViewSubView2 = new View
  735. {
  736. Id = "subViewSubView2",
  737. CanFocus = true
  738. };
  739. subViewSubView2.HasFocusChanged += (s, e) =>
  740. {
  741. if (e.NewValue)
  742. {
  743. subviewSubView2EnterCount++;
  744. }
  745. else
  746. {
  747. subviewSubView2LeaveCount++;
  748. }
  749. };
  750. var subviewSubView3EnterCount = 0;
  751. var subviewSubView3LeaveCount = 0;
  752. var subViewSubView3 = new View
  753. {
  754. Id = "subViewSubView3",
  755. CanFocus = false
  756. };
  757. subViewSubView3.HasFocusChanged += (s, e) =>
  758. {
  759. if (e.NewValue)
  760. {
  761. subviewSubView3EnterCount++;
  762. }
  763. else
  764. {
  765. subviewSubView3LeaveCount++;
  766. }
  767. };
  768. subView.Add (subViewSubView1, subViewSubView2, subViewSubView3);
  769. view.Add (subView);
  770. view.SetFocus ();
  771. Assert.True (view.HasFocus);
  772. Assert.True (subView.HasFocus);
  773. Assert.False (subViewSubView1.HasFocus);
  774. Assert.True (subViewSubView2.HasFocus);
  775. Assert.False (subViewSubView3.HasFocus);
  776. view.HasFocus = false;
  777. Assert.False (view.HasFocus);
  778. Assert.False (subView.HasFocus);
  779. Assert.False (subViewSubView1.HasFocus);
  780. Assert.False (subViewSubView2.HasFocus);
  781. Assert.False (subViewSubView3.HasFocus);
  782. Assert.Equal (1, viewEnterCount);
  783. Assert.Equal (1, viewLeaveCount);
  784. Assert.Equal (1, subViewEnterCount);
  785. Assert.Equal (1, subViewLeaveCount);
  786. Assert.Equal (0, subviewSubView1EnterCount);
  787. Assert.Equal (0, subviewSubView1LeaveCount);
  788. Assert.Equal (1, subviewSubView2EnterCount);
  789. Assert.Equal (1, subviewSubView2LeaveCount);
  790. Assert.Equal (0, subviewSubView3EnterCount);
  791. Assert.Equal (0, subviewSubView3LeaveCount);
  792. }
  793. [Fact]
  794. public void HasFocusChanged_NewValue_False_Hide_Subview ()
  795. {
  796. var subView1 = new View
  797. {
  798. Id = $"subView1",
  799. CanFocus = true
  800. };
  801. var subView2 = new View
  802. {
  803. Id = $"subView2",
  804. CanFocus = true
  805. };
  806. var view = new View
  807. {
  808. Id = "view",
  809. CanFocus = true
  810. };
  811. view.HasFocusChanged += (s, e) =>
  812. {
  813. if (e.NewValue)
  814. {
  815. Assert.True (view.HasFocus);
  816. Assert.True (subView1.HasFocus);
  817. Assert.False (subView2.HasFocus);
  818. subView1.Visible = true;
  819. subView2.Visible = false;
  820. Assert.True (view.HasFocus);
  821. Assert.True (subView1.HasFocus);
  822. Assert.False (subView2.HasFocus);
  823. }
  824. else
  825. {
  826. Assert.False (view.HasFocus);
  827. Assert.False (subView1.HasFocus);
  828. Assert.False (subView2.HasFocus);
  829. subView1.Visible = false;
  830. subView2.Visible = true;
  831. }
  832. };
  833. view.Add (subView1, subView2);
  834. view.SetFocus ();
  835. Assert.True (view.HasFocus);
  836. Assert.True (subView1.HasFocus);
  837. Assert.False (subView2.HasFocus);
  838. view.HasFocus = false;
  839. Assert.False (view.HasFocus);
  840. Assert.False (subView1.HasFocus);
  841. Assert.False (subView2.HasFocus);
  842. }
  843. #endregion HasFocusChanged
  844. }