Application.NavigationTests.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. using System.Diagnostics;
  2. using Moq;
  3. using Xunit.Abstractions;
  4. using Terminal.Gui;
  5. using Terminal.Gui.ViewTests;
  6. namespace Terminal.Gui.ApplicationTests.NavigationTests;
  7. public class ApplicationNavigationTests (ITestOutputHelper output)
  8. {
  9. private readonly ITestOutputHelper _output = output;
  10. [Fact]
  11. public void Focused_Change_Raises_FocusedChanged ()
  12. {
  13. bool raised = false;
  14. Application.Navigation = new ApplicationNavigation ();
  15. Application.Navigation.FocusedChanged += ApplicationNavigationOnFocusedChanged;
  16. Application.Navigation.SetFocused (new View ());
  17. Assert.True (raised);
  18. Application.Navigation.GetFocused ().Dispose ();
  19. Application.Navigation.SetFocused (null);
  20. Application.Navigation.FocusedChanged -= ApplicationNavigationOnFocusedChanged;
  21. Application.Navigation = null;
  22. return;
  23. void ApplicationNavigationOnFocusedChanged (object sender, EventArgs e) { raised = true; }
  24. }
  25. [Fact]
  26. public void GetDeepestFocusedSubview_ShouldReturnNull_WhenViewIsNull ()
  27. {
  28. // Act
  29. var result = ApplicationNavigation.GetDeepestFocusedSubview (null);
  30. // Assert
  31. Assert.Null (result);
  32. }
  33. [Fact]
  34. public void GetDeepestFocusedSubview_ShouldReturnSameView_WhenNoSubviewsHaveFocus ()
  35. {
  36. // Arrange
  37. var view = new View () { Id = "view", CanFocus = true };
  38. ;
  39. // Act
  40. var result = ApplicationNavigation.GetDeepestFocusedSubview (view);
  41. // Assert
  42. Assert.Equal (view, result);
  43. }
  44. [Fact]
  45. public void GetDeepestFocusedSubview_ShouldReturnFocusedSubview ()
  46. {
  47. // Arrange
  48. var parentView = new View () { Id = "parentView", CanFocus = true };
  49. ;
  50. var childView1 = new View () { Id = "childView1", CanFocus = true };
  51. ;
  52. var childView2 = new View () { Id = "childView2", CanFocus = true };
  53. ;
  54. var grandChildView = new View () { Id = "grandChildView", CanFocus = true };
  55. ;
  56. parentView.Add (childView1, childView2);
  57. childView2.Add (grandChildView);
  58. grandChildView.SetFocus ();
  59. // Act
  60. var result = ApplicationNavigation.GetDeepestFocusedSubview (parentView);
  61. // Assert
  62. Assert.Equal (grandChildView, result);
  63. }
  64. [Fact]
  65. public void GetDeepestFocusedSubview_ShouldReturnDeepestFocusedSubview ()
  66. {
  67. // Arrange
  68. var parentView = new View () { Id = "parentView", CanFocus = true };
  69. ;
  70. var childView1 = new View () { Id = "childView1", CanFocus = true };
  71. ;
  72. var childView2 = new View () { Id = "childView2", CanFocus = true };
  73. ;
  74. var grandChildView = new View () { Id = "grandChildView", CanFocus = true };
  75. ;
  76. var greatGrandChildView = new View () { Id = "greatGrandChildView", CanFocus = true };
  77. ;
  78. parentView.Add (childView1, childView2);
  79. childView2.Add (grandChildView);
  80. grandChildView.Add (greatGrandChildView);
  81. grandChildView.SetFocus ();
  82. // Act
  83. var result = ApplicationNavigation.GetDeepestFocusedSubview (parentView);
  84. // Assert
  85. Assert.Equal (greatGrandChildView, result);
  86. // Arrange
  87. greatGrandChildView.CanFocus = false;
  88. grandChildView.SetFocus ();
  89. // Act
  90. result = ApplicationNavigation.GetDeepestFocusedSubview (parentView);
  91. // Assert
  92. Assert.Equal (grandChildView, result);
  93. }
  94. [Fact]
  95. public void GetFocused_Returns_Null_If_No_Focused_View ()
  96. {
  97. Application.Navigation = new ();
  98. Application.Current = new Toplevel()
  99. {
  100. Id = "top",
  101. CanFocus = true
  102. };
  103. View subView1 = new View ()
  104. {
  105. Id = "subView1",
  106. CanFocus = true
  107. };
  108. Application.Current.Add (subView1);
  109. Assert.False (Application.Current.HasFocus);
  110. Application.Current.SetFocus ();
  111. Assert.True (subView1.HasFocus);
  112. Assert.Equal (subView1, Application.Navigation.GetFocused ());
  113. subView1.HasFocus = false;
  114. Assert.False (subView1.HasFocus);
  115. Assert.True (Application.Current.HasFocus);
  116. Assert.Equal (Application.Current, Application.Navigation.GetFocused ());
  117. Application.Current.HasFocus = false;
  118. Assert.False (Application.Current.HasFocus);
  119. Assert.Null (Application.Navigation.GetFocused ());
  120. Application.ResetState ();
  121. }
  122. [Fact]
  123. public void GetFocused_Returns_Focused_View ()
  124. {
  125. Application.Navigation = new ();
  126. Application.Current = new Toplevel ()
  127. {
  128. Id = "top",
  129. CanFocus = true
  130. };
  131. View subView1 = new View ()
  132. {
  133. Id = "subView1",
  134. CanFocus = true
  135. };
  136. View subView2 = new View ()
  137. {
  138. Id = "subView2",
  139. CanFocus = true
  140. };
  141. Application.Current.Add (subView1, subView2);
  142. Assert.False (Application.Current.HasFocus);
  143. Application.Current.SetFocus ();
  144. Assert.True (subView1.HasFocus);
  145. Assert.Equal(subView1, Application.Navigation.GetFocused());
  146. Application.Current.AdvanceFocus (NavigationDirection.Forward, null);
  147. Assert.Equal (subView2, Application.Navigation.GetFocused ());
  148. Application.ResetState ();
  149. }
  150. [Fact]
  151. public void Begin_SetsFocus_On_Top ()
  152. {
  153. Application.Init(new FakeDriver());
  154. var top = new Toplevel ();
  155. Assert.False (top.HasFocus);
  156. RunState rs = Application.Begin (top);
  157. Assert.True (top.HasFocus);
  158. top.Dispose ();
  159. Application.Shutdown();
  160. }
  161. [Theory]
  162. [InlineData(TabBehavior.NoStop)]
  163. [InlineData (TabBehavior.TabStop)]
  164. [InlineData (TabBehavior.TabGroup)]
  165. public void Begin_SetsFocus_On_Deepest_Focusable_View (TabBehavior behavior)
  166. {
  167. Application.Init (new FakeDriver ());
  168. var top = new Toplevel ()
  169. {
  170. TabStop = behavior
  171. };
  172. Assert.False (top.HasFocus);
  173. View subView = new ()
  174. {
  175. CanFocus = true,
  176. TabStop = behavior
  177. };
  178. top.Add (subView);
  179. View subSubView = new ()
  180. {
  181. CanFocus = true,
  182. TabStop = TabBehavior.NoStop
  183. };
  184. subView.Add (subSubView);
  185. RunState rs = Application.Begin (top);
  186. Assert.True (top.HasFocus);
  187. Assert.True (subView.HasFocus);
  188. Assert.True (subSubView.HasFocus);
  189. top.Dispose ();
  190. Application.Shutdown ();
  191. }
  192. }