TabViewTests.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Linq;
  5. using System.Threading.Tasks;
  6. using Terminal.Gui;
  7. using Xunit;
  8. using System.Globalization;
  9. namespace Terminal.Gui.Views {
  10. public class TabViewTests {
  11. private TabView GetTabView ()
  12. {
  13. return GetTabView (out _, out _);
  14. }
  15. private TabView GetTabView (out TabView.Tab tab1, out TabView.Tab tab2)
  16. {
  17. InitFakeDriver ();
  18. var tv = new TabView ();
  19. tv.AddTab (tab1 = new TabView.Tab ("Tab1", new TextField ("hi")), false);
  20. tv.AddTab (tab2 = new TabView.Tab ("Tab2", new Label ("hi2")), false);
  21. return tv;
  22. }
  23. [Fact]
  24. public void AddTwoTabs_SecondIsSelected ()
  25. {
  26. InitFakeDriver ();
  27. var tv = new TabView ();
  28. TabView.Tab tab1;
  29. TabView.Tab tab2;
  30. tv.AddTab (tab1 = new TabView.Tab ("Tab1", new TextField ("hi")), false);
  31. tv.AddTab (tab2 = new TabView.Tab ("Tab1", new Label ("hi2")), true);
  32. Assert.Equal (2, tv.Tabs.Count);
  33. Assert.Equal (tab2, tv.SelectedTab);
  34. Application.Shutdown ();
  35. }
  36. [Fact]
  37. public void EnsureSelectedTabVisible_NullSelect ()
  38. {
  39. var tv = GetTabView ();
  40. tv.SelectedTab = null;
  41. Assert.Null (tv.SelectedTab);
  42. Assert.Equal (0, tv.TabScrollOffset);
  43. tv.EnsureSelectedTabIsVisible ();
  44. Assert.Null (tv.SelectedTab);
  45. Assert.Equal (0, tv.TabScrollOffset);
  46. Application.Shutdown ();
  47. }
  48. [Fact]
  49. public void EnsureSelectedTabVisible_MustScroll ()
  50. {
  51. var tv = GetTabView (out var tab1, out var tab2);
  52. // Make tab width small to force only one tab visible at once
  53. tv.Width = 4;
  54. tv.SelectedTab = tab1;
  55. Assert.Equal (0, tv.TabScrollOffset);
  56. tv.EnsureSelectedTabIsVisible ();
  57. Assert.Equal (0, tv.TabScrollOffset);
  58. // Asking to show tab2 should automatically move scroll offset accordingly
  59. tv.SelectedTab = tab2;
  60. Assert.Equal (1, tv.TabScrollOffset);
  61. // Shutdown must be called to safely clean up Application if Init has been called
  62. Application.Shutdown ();
  63. }
  64. [Fact]
  65. public void SelectedTabChanged_Called ()
  66. {
  67. var tv = GetTabView (out var tab1, out var tab2);
  68. tv.SelectedTab = tab1;
  69. TabView.Tab oldTab = null;
  70. TabView.Tab newTab = null;
  71. int called = 0;
  72. tv.SelectedTabChanged += (s, e) => {
  73. oldTab = e.OldTab;
  74. newTab = e.NewTab;
  75. called++;
  76. };
  77. tv.SelectedTab = tab2;
  78. Assert.Equal (1, called);
  79. Assert.Equal (tab1, oldTab);
  80. Assert.Equal (tab2, newTab);
  81. // Shutdown must be called to safely clean up Application if Init has been called
  82. Application.Shutdown ();
  83. }
  84. [Fact]
  85. public void RemoveTab_ChangesSelection ()
  86. {
  87. var tv = GetTabView (out var tab1, out var tab2);
  88. tv.SelectedTab = tab1;
  89. tv.RemoveTab (tab1);
  90. Assert.Equal (tab2, tv.SelectedTab);
  91. // Shutdown must be called to safely clean up Application if Init has been called
  92. Application.Shutdown ();
  93. }
  94. [Fact]
  95. public void RemoveTab_MultipleCalls_NotAnError ()
  96. {
  97. var tv = GetTabView (out var tab1, out var tab2);
  98. tv.SelectedTab = tab1;
  99. // Repeated calls to remove a tab that is not part of
  100. // the collection should be ignored
  101. tv.RemoveTab (tab1);
  102. tv.RemoveTab (tab1);
  103. tv.RemoveTab (tab1);
  104. tv.RemoveTab (tab1);
  105. Assert.Equal (tab2, tv.SelectedTab);
  106. // Shutdown must be called to safely clean up Application if Init has been called
  107. Application.Shutdown ();
  108. }
  109. [Fact]
  110. public void RemoveAllTabs_ClearsSelection ()
  111. {
  112. var tv = GetTabView (out var tab1, out var tab2);
  113. tv.SelectedTab = tab1;
  114. tv.RemoveTab (tab1);
  115. tv.RemoveTab (tab2);
  116. Assert.Null (tv.SelectedTab);
  117. // Shutdown must be called to safely clean up Application if Init has been called
  118. Application.Shutdown ();
  119. }
  120. [Fact]
  121. public void SwitchTabBy_NormalUsage ()
  122. {
  123. var tv = GetTabView (out var tab1, out var tab2);
  124. TabView.Tab tab3;
  125. TabView.Tab tab4;
  126. TabView.Tab tab5;
  127. tv.AddTab (tab3 = new TabView.Tab (), false);
  128. tv.AddTab (tab4 = new TabView.Tab (), false);
  129. tv.AddTab (tab5 = new TabView.Tab (), false);
  130. tv.SelectedTab = tab1;
  131. int called = 0;
  132. tv.SelectedTabChanged += (s, e) => { called++; };
  133. tv.SwitchTabBy (1);
  134. Assert.Equal (1, called);
  135. Assert.Equal (tab2, tv.SelectedTab);
  136. //reset called counter
  137. called = 0;
  138. // go right 2
  139. tv.SwitchTabBy (2);
  140. // even though we go right 2 indexes the event should only be called once
  141. Assert.Equal (1, called);
  142. Assert.Equal (tab4, tv.SelectedTab);
  143. // Shutdown must be called to safely clean up Application if Init has been called
  144. Application.Shutdown ();
  145. }
  146. [Fact]
  147. public void AddTab_SameTabMoreThanOnce ()
  148. {
  149. var tv = GetTabView (out var tab1, out var tab2);
  150. Assert.Equal (2, tv.Tabs.Count);
  151. // Tab is already part of the control so shouldn't result in duplication
  152. tv.AddTab (tab1, false);
  153. tv.AddTab (tab1, false);
  154. tv.AddTab (tab1, false);
  155. tv.AddTab (tab1, false);
  156. Assert.Equal (2, tv.Tabs.Count);
  157. // Shutdown must be called to safely clean up Application if Init has been called
  158. Application.Shutdown ();
  159. }
  160. [Fact]
  161. public void SwitchTabBy_OutOfTabsRange ()
  162. {
  163. var tv = GetTabView (out var tab1, out var tab2);
  164. tv.SelectedTab = tab1;
  165. tv.SwitchTabBy (500);
  166. Assert.Equal (tab2, tv.SelectedTab);
  167. tv.SwitchTabBy (-500);
  168. Assert.Equal (tab1, tv.SelectedTab);
  169. // Shutdown must be called to safely clean up Application if Init has been called
  170. Application.Shutdown ();
  171. }
  172. private void InitFakeDriver ()
  173. {
  174. var driver = new FakeDriver ();
  175. Application.Init (driver, new FakeMainLoop (() => FakeConsole.ReadKey (true)));
  176. driver.Init (() => { });
  177. }
  178. }
  179. }