Application.NavigationTests.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. using Moq;
  2. using Xunit.Abstractions;
  3. using Terminal.Gui;
  4. namespace Terminal.Gui.ApplicationTests.NavigationTests;
  5. public class ApplicationNavigationTests (ITestOutputHelper output)
  6. {
  7. private readonly ITestOutputHelper _output = output;
  8. [Fact]
  9. public void Focused_Change_Raises_FocusedChanged ()
  10. {
  11. bool raised = false;
  12. Application.Navigation = new ApplicationNavigation ();
  13. Application.Navigation.FocusedChanged += ApplicationNavigationOnFocusedChanged;
  14. Application.Navigation.SetFocused (new View ());
  15. Assert.True (raised);
  16. Application.Navigation.GetFocused ().Dispose ();
  17. Application.Navigation.SetFocused (null);
  18. Application.Navigation.FocusedChanged -= ApplicationNavigationOnFocusedChanged;
  19. Application.Navigation = null;
  20. return;
  21. void ApplicationNavigationOnFocusedChanged (object sender, EventArgs e) { raised = true; }
  22. }
  23. [Fact]
  24. public void GetDeepestFocusedSubview_ShouldReturnNull_WhenViewIsNull ()
  25. {
  26. // Act
  27. var result = ApplicationNavigation.GetDeepestFocusedSubview (null);
  28. // Assert
  29. Assert.Null (result);
  30. }
  31. [Fact]
  32. public void GetDeepestFocusedSubview_ShouldReturnSameView_WhenNoSubviewsHaveFocus ()
  33. {
  34. // Arrange
  35. var view = new View () { Id = "view", CanFocus = true };
  36. ;
  37. // Act
  38. var result = ApplicationNavigation.GetDeepestFocusedSubview (view);
  39. // Assert
  40. Assert.Equal (view, result);
  41. }
  42. [Fact]
  43. public void GetDeepestFocusedSubview_ShouldReturnFocusedSubview ()
  44. {
  45. // Arrange
  46. var parentView = new View () { Id = "parentView", CanFocus = true };
  47. ;
  48. var childView1 = new View () { Id = "childView1", CanFocus = true };
  49. ;
  50. var childView2 = new View () { Id = "childView2", CanFocus = true };
  51. ;
  52. var grandChildView = new View () { Id = "grandChildView", CanFocus = true };
  53. ;
  54. parentView.Add (childView1, childView2);
  55. childView2.Add (grandChildView);
  56. grandChildView.SetFocus ();
  57. // Act
  58. var result = ApplicationNavigation.GetDeepestFocusedSubview (parentView);
  59. // Assert
  60. Assert.Equal (grandChildView, result);
  61. }
  62. [Fact]
  63. public void GetDeepestFocusedSubview_ShouldReturnDeepestFocusedSubview ()
  64. {
  65. // Arrange
  66. var parentView = new View () { Id = "parentView", CanFocus = true };
  67. ;
  68. var childView1 = new View () { Id = "childView1", CanFocus = true };
  69. ;
  70. var childView2 = new View () { Id = "childView2", CanFocus = true };
  71. ;
  72. var grandChildView = new View () { Id = "grandChildView", CanFocus = true };
  73. ;
  74. var greatGrandChildView = new View () { Id = "greatGrandChildView", CanFocus = true };
  75. ;
  76. parentView.Add (childView1, childView2);
  77. childView2.Add (grandChildView);
  78. grandChildView.Add (greatGrandChildView);
  79. grandChildView.SetFocus ();
  80. // Act
  81. var result = ApplicationNavigation.GetDeepestFocusedSubview (parentView);
  82. // Assert
  83. Assert.Equal (greatGrandChildView, result);
  84. // Arrange
  85. greatGrandChildView.CanFocus = false;
  86. grandChildView.SetFocus ();
  87. // Act
  88. result = ApplicationNavigation.GetDeepestFocusedSubview (parentView);
  89. // Assert
  90. Assert.Equal (grandChildView, result);
  91. }
  92. [Fact]
  93. public void GetFocused_Returns_Null_If_No_Focused_View ()
  94. {
  95. Application.Navigation = new ();
  96. Application.Current = new Toplevel()
  97. {
  98. Id = "top",
  99. CanFocus = true
  100. };
  101. View subView1 = new View ()
  102. {
  103. Id = "subView1",
  104. CanFocus = true
  105. };
  106. Application.Current.Add (subView1);
  107. Assert.False (Application.Current.HasFocus);
  108. Application.Current.SetFocus ();
  109. Assert.True (subView1.HasFocus);
  110. Assert.Equal (subView1, Application.Navigation.GetFocused ());
  111. subView1.HasFocus = false;
  112. Assert.False (subView1.HasFocus);
  113. Assert.True (Application.Current.HasFocus);
  114. Assert.Equal (Application.Current, Application.Navigation.GetFocused ());
  115. Application.Current.HasFocus = false;
  116. Assert.False (Application.Current.HasFocus);
  117. Assert.Null (Application.Navigation.GetFocused ());
  118. Application.ResetState ();
  119. }
  120. [Fact]
  121. public void GetFocused_Returns_Focused_View ()
  122. {
  123. Application.Navigation = new ();
  124. Application.Current = new Toplevel ()
  125. {
  126. Id = "top",
  127. CanFocus = true
  128. };
  129. View subView1 = new View ()
  130. {
  131. Id = "subView1",
  132. CanFocus = true
  133. };
  134. View subView2 = new View ()
  135. {
  136. Id = "subView2",
  137. CanFocus = true
  138. };
  139. Application.Current.Add (subView1, subView2);
  140. Assert.False (Application.Current.HasFocus);
  141. Application.Current.SetFocus ();
  142. Assert.True (subView1.HasFocus);
  143. Assert.Equal(subView1, Application.Navigation.GetFocused());
  144. Application.Current.AdvanceFocus (NavigationDirection.Forward, null);
  145. Assert.Equal (subView2, Application.Navigation.GetFocused ());
  146. Application.ResetState ();
  147. }
  148. }