HasFocusTests.cs 5.7 KB

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