HasFocusTests.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. using UnitTests;
  2. using Xunit.Abstractions;
  3. namespace Terminal.Gui.ViewTests;
  4. public class HasFocusTests () : TestsAllViews
  5. {
  6. [Fact]
  7. public void HasFocus_False ()
  8. {
  9. var view = new View ()
  10. {
  11. Id = "view",
  12. CanFocus = true
  13. };
  14. view.SetFocus ();
  15. Assert.True (view.HasFocus);
  16. view.HasFocus = false;
  17. Assert.False (view.HasFocus);
  18. }
  19. [Fact]
  20. public void HasFocus_False_WithSuperView_Does_Not_Change_SuperView ()
  21. {
  22. var view = new View ()
  23. {
  24. Id = "view",
  25. CanFocus = true
  26. };
  27. var subview = new View ()
  28. {
  29. Id = "subview",
  30. CanFocus = true
  31. };
  32. view.Add (subview);
  33. view.SetFocus ();
  34. Assert.True (view.HasFocus);
  35. Assert.True (subview.HasFocus);
  36. subview.HasFocus = false;
  37. Assert.False (subview.HasFocus);
  38. Assert.True (view.HasFocus);
  39. }
  40. [Fact]
  41. public void HasFocus_False_WithSubView_Leaves_All ()
  42. {
  43. var view = new View ()
  44. {
  45. Id = "view",
  46. CanFocus = true
  47. };
  48. var subview = new View ()
  49. {
  50. Id = "subview",
  51. CanFocus = true
  52. };
  53. view.Add (subview);
  54. view.SetFocus ();
  55. Assert.True (view.HasFocus);
  56. Assert.True (subview.HasFocus);
  57. Assert.Equal (subview, view.Focused);
  58. view.HasFocus = false;
  59. Assert.Null (view.Focused);
  60. Assert.False (view.HasFocus);
  61. Assert.False (subview.HasFocus);
  62. }
  63. [Fact]
  64. public void Enabled_False_Sets_HasFocus_To_False ()
  65. {
  66. var wasClicked = false;
  67. var view = new Button { Text = "Click Me" };
  68. view.Accepting += (s, e) => wasClicked = !wasClicked;
  69. view.NewKeyDownEvent (Key.Space);
  70. Assert.True (wasClicked);
  71. view.NewMouseEvent (new () { Flags = MouseFlags.Button1Clicked });
  72. Assert.False (wasClicked);
  73. Assert.True (view.Enabled);
  74. Assert.True (view.CanFocus);
  75. Assert.True (view.HasFocus);
  76. view.Enabled = false;
  77. view.NewKeyDownEvent (Key.Space);
  78. Assert.False (wasClicked);
  79. view.NewMouseEvent (new () { Flags = MouseFlags.Button1Clicked });
  80. Assert.False (wasClicked);
  81. Assert.False (view.Enabled);
  82. Assert.True (view.CanFocus);
  83. Assert.False (view.HasFocus);
  84. view.SetFocus ();
  85. Assert.False (view.HasFocus);
  86. }
  87. [Fact]
  88. public void HasFocus_False_CompoundSubView_Leaves_All ()
  89. {
  90. var view = new View ()
  91. {
  92. Id = "view",
  93. CanFocus = true
  94. };
  95. var subView = new View ()
  96. {
  97. Id = "subView",
  98. CanFocus = true
  99. };
  100. var subViewSubView1 = new View ()
  101. {
  102. Id = "subViewSubView1",
  103. CanFocus = false
  104. };
  105. var subViewSubView2 = new View ()
  106. {
  107. Id = "subViewSubView2",
  108. CanFocus = true
  109. };
  110. var subViewSubView3 = new View ()
  111. {
  112. Id = "subViewSubView3",
  113. CanFocus = false
  114. };
  115. subView.Add (subViewSubView1, subViewSubView2, subViewSubView3);
  116. view.Add (subView);
  117. view.SetFocus ();
  118. Assert.True (view.HasFocus);
  119. Assert.True (subView.HasFocus);
  120. Assert.False (subViewSubView1.HasFocus);
  121. Assert.True (subViewSubView2.HasFocus);
  122. Assert.False (subViewSubView3.HasFocus);
  123. view.HasFocus = false;
  124. Assert.False (view.HasFocus);
  125. Assert.False (subView.HasFocus);
  126. Assert.False (subViewSubView1.HasFocus);
  127. Assert.False (subViewSubView2.HasFocus);
  128. Assert.False (subViewSubView3.HasFocus);
  129. }
  130. [Fact]
  131. public void HasFocus_False_SubView_Raises_HasFocusChanged ()
  132. {
  133. var top = new View
  134. {
  135. Id = "top",
  136. CanFocus = true
  137. };
  138. var subView1 = new View
  139. {
  140. Id = "subView1",
  141. CanFocus = true
  142. };
  143. var subView2 = new View
  144. {
  145. Id = "subView2",
  146. CanFocus = true
  147. };
  148. top.Add (subView1, subView2);
  149. var subView1HasFocusChangedTrueCount = 0;
  150. var subView1HasFocusChangedFalseCount = 0;
  151. subView1.HasFocusChanged += (s, e) =>
  152. {
  153. if (e.NewValue)
  154. {
  155. subView1HasFocusChangedTrueCount++;
  156. }
  157. else
  158. {
  159. subView1HasFocusChangedFalseCount++;
  160. }
  161. };
  162. var subView2HasFocusChangedTrueCount = 0;
  163. var subView2HasFocusChangedFalseCount = 0;
  164. subView2.HasFocusChanged += (s, e) =>
  165. {
  166. if (e.NewValue)
  167. {
  168. subView2HasFocusChangedTrueCount++;
  169. }
  170. else
  171. {
  172. subView2HasFocusChangedFalseCount++;
  173. }
  174. };
  175. top.SetFocus ();
  176. Assert.True (top.HasFocus);
  177. Assert.True (subView1.HasFocus);
  178. Assert.False (subView2.HasFocus);
  179. Assert.Equal (1, subView1HasFocusChangedTrueCount);
  180. Assert.Equal (0, subView1HasFocusChangedFalseCount);
  181. Assert.Equal (0, subView2HasFocusChangedTrueCount);
  182. Assert.Equal (0, subView2HasFocusChangedFalseCount);
  183. subView1.HasFocus = false; // this should have the same resuilt as top.AdvanceFocus (NavigationDirection.Forward, null);
  184. Assert.False (subView1.HasFocus);
  185. Assert.True (subView2.HasFocus);
  186. Assert.Equal (1, subView1HasFocusChangedTrueCount);
  187. Assert.Equal (1, subView1HasFocusChangedFalseCount);
  188. Assert.Equal (1, subView2HasFocusChangedTrueCount);
  189. Assert.Equal (0, subView2HasFocusChangedFalseCount);
  190. }
  191. }