HasFocusEventTests.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. using Xunit.Abstractions;
  2. namespace Terminal.Gui.ViewTests;
  3. public class HasFocusEventTests (ITestOutputHelper _output) : TestsAllViews
  4. {
  5. [Fact]
  6. public void SetFocus_Raises_HasFocusChanging ()
  7. {
  8. var nEnter = 0;
  9. var nLeave = 0;
  10. var view = new View
  11. {
  12. Id = "view",
  13. CanFocus = true
  14. };
  15. view.HasFocusChanging += (s, e) => nEnter++;
  16. view.HasFocusChanged += (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_Raises_HasFocusChanged ()
  26. {
  27. var nEnter = 0;
  28. var nLeave = 0;
  29. var view = new View
  30. {
  31. Id = "view",
  32. CanFocus = true
  33. };
  34. view.HasFocusChanging += (s, e) => nEnter++;
  35. view.HasFocusChanged += (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_Raises_HasFocusChanging ()
  48. {
  49. var viewEnterCount = 0;
  50. var viewLeaveCount = 0;
  51. var view = new View
  52. {
  53. Id = "view",
  54. CanFocus = true
  55. };
  56. view.HasFocusChanging += (s, e) => viewEnterCount++;
  57. view.HasFocusChanged += (s, e) => viewLeaveCount++;
  58. var subviewEnterCount = 0;
  59. var subviewLeaveCount = 0;
  60. var subview = new View
  61. {
  62. Id = "subview",
  63. CanFocus = true
  64. };
  65. subview.HasFocusChanging += (s, e) => subviewEnterCount++;
  66. subview.HasFocusChanged += (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_Raises_HasFocusChanged ()
  76. {
  77. var viewEnterCount = 0;
  78. var viewLeaveCount = 0;
  79. var view = new View
  80. {
  81. Id = "view",
  82. CanFocus = true
  83. };
  84. view.HasFocusChanging += (s, e) => viewEnterCount++;
  85. view.HasFocusChanged += (s, e) => viewLeaveCount++;
  86. var subviewEnterCount = 0;
  87. var subviewLeaveCount = 0;
  88. var subview = new View
  89. {
  90. Id = "subview",
  91. CanFocus = true
  92. };
  93. subview.HasFocusChanging += (s, e) => subviewEnterCount++;
  94. subview.HasFocusChanged += (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_Raises_HasFocusChanging ()
  115. {
  116. var viewEnterCount = 0;
  117. var viewLeaveCount = 0;
  118. var view = new View
  119. {
  120. Id = "view",
  121. CanFocus = true
  122. };
  123. view.HasFocusChanging += (s, e) => viewEnterCount++;
  124. view.HasFocusChanged += (s, e) => viewLeaveCount++;
  125. var subViewEnterCount = 0;
  126. var subViewLeaveCount = 0;
  127. var subView = new View
  128. {
  129. Id = "subView",
  130. CanFocus = true
  131. };
  132. subView.HasFocusChanging += (s, e) => subViewEnterCount++;
  133. subView.HasFocusChanged += (s, e) => subViewLeaveCount++;
  134. var subviewSubView1EnterCount = 0;
  135. var subviewSubView1LeaveCount = 0;
  136. var subViewSubView1 = new View
  137. {
  138. Id = "subViewSubView1",
  139. CanFocus = false
  140. };
  141. subViewSubView1.HasFocusChanging += (s, e) => subviewSubView1EnterCount++;
  142. subViewSubView1.HasFocusChanged += (s, e) => subviewSubView1LeaveCount++;
  143. var subviewSubView2EnterCount = 0;
  144. var subviewSubView2LeaveCount = 0;
  145. var subViewSubView2 = new View
  146. {
  147. Id = "subViewSubView2",
  148. CanFocus = true
  149. };
  150. subViewSubView2.HasFocusChanging += (s, e) => subviewSubView2EnterCount++;
  151. subViewSubView2.HasFocusChanged += (s, e) => subviewSubView2LeaveCount++;
  152. var subviewSubView3EnterCount = 0;
  153. var subviewSubView3LeaveCount = 0;
  154. var subViewSubView3 = new View
  155. {
  156. Id = "subViewSubView3",
  157. CanFocus = false
  158. };
  159. subViewSubView3.HasFocusChanging += (s, e) => subviewSubView3EnterCount++;
  160. subViewSubView3.HasFocusChanged += (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_Raises_HasFocusChanged ()
  182. {
  183. var viewEnterCount = 0;
  184. var viewLeaveCount = 0;
  185. var view = new View
  186. {
  187. Id = "view",
  188. CanFocus = true
  189. };
  190. view.HasFocusChanging += (s, e) => viewEnterCount++;
  191. view.HasFocusChanged += (s, e) => viewLeaveCount++;
  192. var subViewEnterCount = 0;
  193. var subViewLeaveCount = 0;
  194. var subView = new View
  195. {
  196. Id = "subView",
  197. CanFocus = true
  198. };
  199. subView.HasFocusChanging += (s, e) => subViewEnterCount++;
  200. subView.HasFocusChanged += (s, e) => subViewLeaveCount++;
  201. var subviewSubView1EnterCount = 0;
  202. var subviewSubView1LeaveCount = 0;
  203. var subViewSubView1 = new View
  204. {
  205. Id = "subViewSubView1",
  206. CanFocus = false
  207. };
  208. subViewSubView1.HasFocusChanging += (s, e) => subviewSubView1EnterCount++;
  209. subViewSubView1.HasFocusChanged += (s, e) => subviewSubView1LeaveCount++;
  210. var subviewSubView2EnterCount = 0;
  211. var subviewSubView2LeaveCount = 0;
  212. var subViewSubView2 = new View
  213. {
  214. Id = "subViewSubView2",
  215. CanFocus = true
  216. };
  217. subViewSubView2.HasFocusChanging += (s, e) => subviewSubView2EnterCount++;
  218. subViewSubView2.HasFocusChanged += (s, e) => subviewSubView2LeaveCount++;
  219. var subviewSubView3EnterCount = 0;
  220. var subviewSubView3LeaveCount = 0;
  221. var subViewSubView3 = new View
  222. {
  223. Id = "subViewSubView3",
  224. CanFocus = false
  225. };
  226. subViewSubView3.HasFocusChanging += (s, e) => subviewSubView3EnterCount++;
  227. subViewSubView3.HasFocusChanged += (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 HasFocus_False_Leave_Raised ()
  255. {
  256. var view = new View
  257. {
  258. Id = "view",
  259. CanFocus = true
  260. };
  261. Assert.True (view.CanFocus);
  262. Assert.False (view.HasFocus);
  263. var leaveInvoked = 0;
  264. view.HasFocusChanged += (s, e) => leaveInvoked++;
  265. view.SetFocus ();
  266. Assert.True (view.HasFocus);
  267. Assert.Equal (0, leaveInvoked);
  268. view.HasFocus = false;
  269. Assert.False (view.HasFocus);
  270. Assert.Equal (1, leaveInvoked);
  271. }
  272. [Fact]
  273. public void HasFocus_False_Leave_Raised_ForAllSubViews ()
  274. {
  275. var view = new View
  276. {
  277. Id = "view",
  278. CanFocus = true
  279. };
  280. var subview = new View
  281. {
  282. Id = "subview",
  283. CanFocus = true
  284. };
  285. view.Add (subview);
  286. var leaveInvoked = 0;
  287. view.HasFocusChanged += (s, e) => leaveInvoked++;
  288. subview.HasFocusChanged += (s, e) => leaveInvoked++;
  289. view.SetFocus ();
  290. Assert.True (view.HasFocus);
  291. Assert.Equal (0, leaveInvoked);
  292. view.HasFocus = false;
  293. Assert.False (view.HasFocus);
  294. Assert.False (subview.HasFocus);
  295. Assert.Equal (2, leaveInvoked);
  296. }
  297. }