EnterLeaveTests.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451
  1. using Xunit.Abstractions;
  2. namespace Terminal.Gui.ViewTests;
  3. public class EnterLeaveTests (ITestOutputHelper _output) : TestsAllViews
  4. {
  5. [Fact]
  6. public void SetFocus_FiresEnter ()
  7. {
  8. int nEnter = 0;
  9. int nLeave = 0;
  10. var view = new View ()
  11. {
  12. Id = "view",
  13. CanFocus = true
  14. };
  15. view.Enter += (s, e) => nEnter++;
  16. view.Leave += (s, e) => nLeave++;
  17. Assert.True (view.CanFocus);
  18. Assert.False (view.HasFocus);
  19. view.SetFocus ();
  20. Assert.True (view.HasFocus);
  21. Assert.Equal (1, nEnter);
  22. Assert.Equal (0, nLeave);
  23. }
  24. [Fact]
  25. public void RemoveFocus_FiresLeave ()
  26. {
  27. int nEnter = 0;
  28. int nLeave = 0;
  29. var view = new View ()
  30. {
  31. Id = "view",
  32. CanFocus = true
  33. };
  34. view.Enter += (s, e) => nEnter++;
  35. view.Leave += (s, e) => nLeave++;
  36. Assert.True (view.CanFocus);
  37. Assert.False (view.HasFocus);
  38. view.SetFocus ();
  39. Assert.True (view.HasFocus);
  40. Assert.Equal (1, nEnter);
  41. Assert.Equal (0, nLeave);
  42. view.HasFocus = false;
  43. Assert.Equal (1, nEnter);
  44. Assert.Equal (1, nLeave);
  45. }
  46. [Fact]
  47. public void SetFocus_SubView_SetFocus_FiresEnter ()
  48. {
  49. int viewEnterCount = 0;
  50. int viewLeaveCount = 0;
  51. var view = new View ()
  52. {
  53. Id = "view",
  54. CanFocus = true
  55. };
  56. view.Enter += (s, e) => viewEnterCount++;
  57. view.Leave += (s, e) => viewLeaveCount++;
  58. int subviewEnterCount = 0;
  59. int subviewLeaveCount = 0;
  60. var subview = new View ()
  61. {
  62. Id = "subview",
  63. CanFocus = true
  64. };
  65. subview.Enter += (s, e) => subviewEnterCount++;
  66. subview.Leave += (s, e) => subviewLeaveCount++;
  67. view.Add (subview);
  68. view.SetFocus ();
  69. Assert.Equal (1, viewEnterCount);
  70. Assert.Equal (0, viewLeaveCount);
  71. Assert.Equal (1, subviewEnterCount);
  72. Assert.Equal (0, subviewLeaveCount);
  73. }
  74. [Fact]
  75. public void RemoveFocus_SubView_FiresLeave ()
  76. {
  77. int viewEnterCount = 0;
  78. int viewLeaveCount = 0;
  79. var view = new View ()
  80. {
  81. Id = "view",
  82. CanFocus = true
  83. };
  84. view.Enter += (s, e) => viewEnterCount++;
  85. view.Leave += (s, e) => viewLeaveCount++;
  86. int subviewEnterCount = 0;
  87. int subviewLeaveCount = 0;
  88. var subview = new View ()
  89. {
  90. Id = "subview",
  91. CanFocus = true
  92. };
  93. subview.Enter += (s, e) => subviewEnterCount++;
  94. subview.Leave += (s, e) => subviewLeaveCount++;
  95. view.Add (subview);
  96. view.SetFocus ();
  97. view.HasFocus = false;
  98. Assert.Equal (1, viewEnterCount);
  99. Assert.Equal (1, viewLeaveCount);
  100. Assert.Equal (1, subviewEnterCount);
  101. Assert.Equal (1, subviewLeaveCount);
  102. view.SetFocus ();
  103. Assert.Equal (2, viewEnterCount);
  104. Assert.Equal (1, viewLeaveCount);
  105. Assert.Equal (2, subviewEnterCount);
  106. Assert.Equal (1, subviewLeaveCount);
  107. subview.HasFocus = false;
  108. Assert.Equal (2, viewEnterCount);
  109. Assert.Equal (2, viewLeaveCount);
  110. Assert.Equal (2, subviewEnterCount);
  111. Assert.Equal (2, subviewLeaveCount);
  112. }
  113. [Fact]
  114. public void SetFocus_CompoundSubView_FiresEnter ()
  115. {
  116. int viewEnterCount = 0;
  117. int viewLeaveCount = 0;
  118. var view = new View ()
  119. {
  120. Id = "view",
  121. CanFocus = true
  122. };
  123. view.Enter += (s, e) => viewEnterCount++;
  124. view.Leave += (s, e) => viewLeaveCount++;
  125. int subViewEnterCount = 0;
  126. int subViewLeaveCount = 0;
  127. var subView = new View ()
  128. {
  129. Id = "subView",
  130. CanFocus = true
  131. };
  132. subView.Enter += (s, e) => subViewEnterCount++;
  133. subView.Leave += (s, e) => subViewLeaveCount++;
  134. int subviewSubView1EnterCount = 0;
  135. int subviewSubView1LeaveCount = 0;
  136. var subViewSubView1 = new View ()
  137. {
  138. Id = "subViewSubView1",
  139. CanFocus = false
  140. };
  141. subViewSubView1.Enter += (s, e) => subviewSubView1EnterCount++;
  142. subViewSubView1.Leave += (s, e) => subviewSubView1LeaveCount++;
  143. int subviewSubView2EnterCount = 0;
  144. int subviewSubView2LeaveCount = 0;
  145. var subViewSubView2 = new View ()
  146. {
  147. Id = "subViewSubView2",
  148. CanFocus = true
  149. };
  150. subViewSubView2.Enter += (s, e) => subviewSubView2EnterCount++;
  151. subViewSubView2.Leave += (s, e) => subviewSubView2LeaveCount++;
  152. int subviewSubView3EnterCount = 0;
  153. int subviewSubView3LeaveCount = 0;
  154. var subViewSubView3 = new View ()
  155. {
  156. Id = "subViewSubView3",
  157. CanFocus = false
  158. };
  159. subViewSubView3.Enter += (s, e) => subviewSubView3EnterCount++;
  160. subViewSubView3.Leave += (s, e) => subviewSubView3LeaveCount++;
  161. subView.Add (subViewSubView1, subViewSubView2, subViewSubView3);
  162. view.Add (subView);
  163. view.SetFocus ();
  164. Assert.True(view.HasFocus);
  165. Assert.True (subView.HasFocus);
  166. Assert.False (subViewSubView1.HasFocus);
  167. Assert.True (subViewSubView2.HasFocus);
  168. Assert.False (subViewSubView3.HasFocus);
  169. Assert.Equal (1, viewEnterCount);
  170. Assert.Equal (0, viewLeaveCount);
  171. Assert.Equal (1, subViewEnterCount);
  172. Assert.Equal (0, subViewLeaveCount);
  173. Assert.Equal (0, subviewSubView1EnterCount);
  174. Assert.Equal (0, subviewSubView1LeaveCount);
  175. Assert.Equal (1, subviewSubView2EnterCount);
  176. Assert.Equal (0, subviewSubView2LeaveCount);
  177. Assert.Equal (0, subviewSubView3EnterCount);
  178. Assert.Equal (0, subviewSubView3LeaveCount);
  179. }
  180. [Fact]
  181. public void RemoveFocus_CompoundSubView_FiresLeave ()
  182. {
  183. int viewEnterCount = 0;
  184. int viewLeaveCount = 0;
  185. var view = new View ()
  186. {
  187. Id = "view",
  188. CanFocus = true
  189. };
  190. view.Enter += (s, e) => viewEnterCount++;
  191. view.Leave += (s, e) => viewLeaveCount++;
  192. int subViewEnterCount = 0;
  193. int subViewLeaveCount = 0;
  194. var subView = new View ()
  195. {
  196. Id = "subView",
  197. CanFocus = true
  198. };
  199. subView.Enter += (s, e) => subViewEnterCount++;
  200. subView.Leave += (s, e) => subViewLeaveCount++;
  201. int subviewSubView1EnterCount = 0;
  202. int subviewSubView1LeaveCount = 0;
  203. var subViewSubView1 = new View ()
  204. {
  205. Id = "subViewSubView1",
  206. CanFocus = false
  207. };
  208. subViewSubView1.Enter += (s, e) => subviewSubView1EnterCount++;
  209. subViewSubView1.Leave += (s, e) => subviewSubView1LeaveCount++;
  210. int subviewSubView2EnterCount = 0;
  211. int subviewSubView2LeaveCount = 0;
  212. var subViewSubView2 = new View ()
  213. {
  214. Id = "subViewSubView2",
  215. CanFocus = true
  216. };
  217. subViewSubView2.Enter += (s, e) => subviewSubView2EnterCount++;
  218. subViewSubView2.Leave += (s, e) => subviewSubView2LeaveCount++;
  219. int subviewSubView3EnterCount = 0;
  220. int subviewSubView3LeaveCount = 0;
  221. var subViewSubView3 = new View ()
  222. {
  223. Id = "subViewSubView3",
  224. CanFocus = false
  225. };
  226. subViewSubView3.Enter += (s, e) => subviewSubView3EnterCount++;
  227. subViewSubView3.Leave += (s, e) => subviewSubView3LeaveCount++;
  228. subView.Add (subViewSubView1, subViewSubView2, subViewSubView3);
  229. view.Add (subView);
  230. view.SetFocus ();
  231. Assert.True (view.HasFocus);
  232. Assert.True (subView.HasFocus);
  233. Assert.False (subViewSubView1.HasFocus);
  234. Assert.True (subViewSubView2.HasFocus);
  235. Assert.False (subViewSubView3.HasFocus);
  236. view.HasFocus = false;
  237. Assert.False (view.HasFocus);
  238. Assert.False (subView.HasFocus);
  239. Assert.False (subViewSubView1.HasFocus);
  240. Assert.False (subViewSubView2.HasFocus);
  241. Assert.False (subViewSubView3.HasFocus);
  242. Assert.Equal (1, viewEnterCount);
  243. Assert.Equal (1, viewLeaveCount);
  244. Assert.Equal (1, subViewEnterCount);
  245. Assert.Equal (1, subViewLeaveCount);
  246. Assert.Equal (0, subviewSubView1EnterCount);
  247. Assert.Equal (0, subviewSubView1LeaveCount);
  248. Assert.Equal (1, subviewSubView2EnterCount);
  249. Assert.Equal (1, subviewSubView2LeaveCount);
  250. Assert.Equal (0, subviewSubView3EnterCount);
  251. Assert.Equal (0, subviewSubView3LeaveCount);
  252. }
  253. [Fact]
  254. public void SetFocus_Peer_LeavesOther ()
  255. {
  256. var view = new View ()
  257. {
  258. Id = "view",
  259. CanFocus = true
  260. };
  261. var subview1 = new View ()
  262. {
  263. Id = "subview1",
  264. CanFocus = true
  265. };
  266. var subview2 = new View ()
  267. {
  268. Id = "subview2",
  269. CanFocus = true
  270. };
  271. view.Add (subview1, subview2);
  272. view.SetFocus ();
  273. Assert.Equal (subview1, view.Focused);
  274. Assert.True (subview1.HasFocus);
  275. Assert.False (subview2.HasFocus);
  276. subview2.SetFocus ();
  277. Assert.Equal (subview2, view.Focused);
  278. Assert.True (subview2.HasFocus);
  279. Assert.False (subview1.HasFocus);
  280. }
  281. [Fact]
  282. public void SetFocus_Peer_LeavesOthers_Subviews ()
  283. {
  284. var top = new View
  285. {
  286. Id = "top",
  287. CanFocus = true
  288. };
  289. var view1 = new View
  290. {
  291. Id = "view1",
  292. CanFocus = true
  293. };
  294. var subView1 = new View
  295. {
  296. Id = "subView1",
  297. CanFocus = true
  298. };
  299. view1.Add (subView1);
  300. var subView1SubView1 = new View
  301. {
  302. Id = "subView1subView1",
  303. CanFocus = true
  304. };
  305. subView1.Add (subView1SubView1);
  306. var view2 = new View
  307. {
  308. Id = "view2",
  309. CanFocus = true
  310. };
  311. top.Add (view1, view2);
  312. Assert.False (view1.HasFocus);
  313. Assert.False (view2.HasFocus);
  314. view1.SetFocus ();
  315. Assert.True (view1.HasFocus);
  316. Assert.True (subView1.HasFocus);
  317. Assert.True (subView1SubView1.HasFocus);
  318. Assert.Equal (subView1, view1.Focused);
  319. Assert.Equal (subView1SubView1, subView1.Focused);
  320. view2.SetFocus ();
  321. Assert.False (view1.HasFocus);
  322. Assert.True (view2.HasFocus);
  323. }
  324. [Fact]
  325. public void HasFocus_False_Leave_Invoked ()
  326. {
  327. var view = new View ()
  328. {
  329. Id = "view",
  330. CanFocus = true
  331. };
  332. Assert.True (view.CanFocus);
  333. Assert.False (view.HasFocus);
  334. int leaveInvoked = 0;
  335. view.Leave += (s, e) => leaveInvoked++;
  336. view.SetFocus ();
  337. Assert.True (view.HasFocus);
  338. Assert.Equal (0, leaveInvoked);
  339. view.HasFocus = false;
  340. Assert.False (view.HasFocus);
  341. Assert.Equal (1, leaveInvoked);
  342. }
  343. [Fact]
  344. public void HasFocus_False_Leave_Invoked_ForAllSubViews ()
  345. {
  346. var view = new View ()
  347. {
  348. Id = "view",
  349. CanFocus = true
  350. };
  351. var subview = new View ()
  352. {
  353. Id = "subview",
  354. CanFocus = true
  355. };
  356. view.Add (subview);
  357. int leaveInvoked = 0;
  358. view.Leave += (s, e) => leaveInvoked++;
  359. subview.Leave += (s, e) => leaveInvoked++;
  360. view.SetFocus ();
  361. Assert.True (view.HasFocus);
  362. Assert.Equal (0, leaveInvoked);
  363. view.HasFocus = false;
  364. Assert.False (view.HasFocus);
  365. Assert.False (subview.HasFocus);
  366. Assert.Equal (2, leaveInvoked);
  367. }
  368. }