TabViewTests.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  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. }
  35. [Fact]
  36. public void EnsureSelectedTabVisible_NullSelect ()
  37. {
  38. var tv = GetTabView ();
  39. tv.SelectedTab = null;
  40. Assert.Null (tv.SelectedTab);
  41. Assert.Equal (0, tv.TabScrollOffset);
  42. tv.EnsureSelectedTabIsVisible ();
  43. Assert.Null (tv.SelectedTab);
  44. Assert.Equal (0, tv.TabScrollOffset);
  45. }
  46. [Fact]
  47. public void EnsureSelectedTabVisible_MustScroll ()
  48. {
  49. var tv = GetTabView (out var tab1, out var tab2);
  50. // Make tab width small to force only one tab visible at once
  51. tv.Width = 4;
  52. tv.SelectedTab = tab1;
  53. Assert.Equal (0, tv.TabScrollOffset);
  54. tv.EnsureSelectedTabIsVisible ();
  55. Assert.Equal (0, tv.TabScrollOffset);
  56. // Asking to show tab2 should automatically move scroll offset accordingly
  57. tv.SelectedTab = tab2;
  58. Assert.Equal (1, tv.TabScrollOffset);
  59. }
  60. [Fact]
  61. public void SelectedTabChanged_Called ()
  62. {
  63. var tv = GetTabView (out var tab1, out var tab2);
  64. tv.SelectedTab = tab1;
  65. TabView.Tab oldTab = null;
  66. TabView.Tab newTab = null;
  67. int called = 0;
  68. tv.SelectedTabChanged += (s, e) => {
  69. oldTab = e.OldTab;
  70. newTab = e.NewTab;
  71. called++;
  72. };
  73. tv.SelectedTab = tab2;
  74. Assert.Equal (1, called);
  75. Assert.Equal (tab1, oldTab);
  76. Assert.Equal (tab2, newTab);
  77. }
  78. [Fact]
  79. public void RemoveTab_ChangesSelection ()
  80. {
  81. var tv = GetTabView (out var tab1, out var tab2);
  82. tv.SelectedTab = tab1;
  83. tv.RemoveTab (tab1);
  84. Assert.Equal (tab2, tv.SelectedTab);
  85. }
  86. [Fact]
  87. public void RemoveTab_MultipleCalls_NotAnError ()
  88. {
  89. var tv = GetTabView (out var tab1, out var tab2);
  90. tv.SelectedTab = tab1;
  91. // Repeated calls to remove a tab that is not part of
  92. // the collection should be ignored
  93. tv.RemoveTab (tab1);
  94. tv.RemoveTab (tab1);
  95. tv.RemoveTab (tab1);
  96. tv.RemoveTab (tab1);
  97. Assert.Equal (tab2, tv.SelectedTab);
  98. }
  99. [Fact]
  100. public void RemoveAllTabs_ClearsSelection ()
  101. {
  102. var tv = GetTabView (out var tab1, out var tab2);
  103. tv.SelectedTab = tab1;
  104. tv.RemoveTab (tab1);
  105. tv.RemoveTab (tab2);
  106. Assert.Null (tv.SelectedTab);
  107. }
  108. [Fact]
  109. public void SwitchTabBy_NormalUsage ()
  110. {
  111. var tv = GetTabView (out var tab1, out var tab2);
  112. TabView.Tab tab3;
  113. TabView.Tab tab4;
  114. TabView.Tab tab5;
  115. tv.AddTab (tab3 = new TabView.Tab (), false);
  116. tv.AddTab (tab4 = new TabView.Tab (), false);
  117. tv.AddTab (tab5 = new TabView.Tab (), false);
  118. tv.SelectedTab = tab1;
  119. int called = 0;
  120. tv.SelectedTabChanged += (s, e) => { called++; };
  121. tv.SwitchTabBy (1);
  122. Assert.Equal (1, called);
  123. Assert.Equal (tab2, tv.SelectedTab);
  124. //reset called counter
  125. called = 0;
  126. // go right 2
  127. tv.SwitchTabBy (2);
  128. // even though we go right 2 indexes the event should only be called once
  129. Assert.Equal (1, called);
  130. Assert.Equal (tab4, tv.SelectedTab);
  131. }
  132. [Fact]
  133. public void AddTab_SameTabMoreThanOnce ()
  134. {
  135. var tv = GetTabView (out var tab1, out var tab2);
  136. Assert.Equal (2, tv.Tabs.Count);
  137. // Tab is already part of the control so shouldn't result in duplication
  138. tv.AddTab (tab1, false);
  139. tv.AddTab (tab1, false);
  140. tv.AddTab (tab1, false);
  141. tv.AddTab (tab1, false);
  142. Assert.Equal (2, tv.Tabs.Count);
  143. }
  144. [Fact]
  145. public void SwitchTabBy_OutOfTabsRange ()
  146. {
  147. var tv = GetTabView (out var tab1, out var tab2);
  148. tv.SelectedTab = tab1;
  149. tv.SwitchTabBy (500);
  150. Assert.Equal (tab2, tv.SelectedTab);
  151. tv.SwitchTabBy (-500);
  152. Assert.Equal (tab1, tv.SelectedTab);
  153. }
  154. private void InitFakeDriver ()
  155. {
  156. var driver = new FakeDriver ();
  157. Application.Init (driver, new FakeMainLoop (() => FakeConsole.ReadKey (true)));
  158. driver.Init (() => { });
  159. }
  160. }
  161. }