HasFocusChangeEventTests.cs 33 KB

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