ScrollBarViewTests.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. using System;
  2. using Xunit;
  3. namespace Terminal.Gui {
  4. public class ScrollBarViewTests {
  5. public class HostView : View {
  6. public int Top { get; set; }
  7. public int Lines { get; set; }
  8. public int Left { get; set; }
  9. public int Cols { get; set; }
  10. }
  11. private HostView _hostView;
  12. private ScrollBarView _scrollBar;
  13. private bool _added;
  14. public ScrollBarViewTests ()
  15. {
  16. Application.Init (new FakeDriver (), new FakeMainLoop (() => FakeConsole.ReadKey (true)));
  17. var top = Application.Top;
  18. _hostView = new HostView () {
  19. Width = Dim.Fill (),
  20. Height = Dim.Fill (),
  21. Top = 0,
  22. Lines = 30,
  23. Left = 0,
  24. Cols = 100
  25. };
  26. top.Add (_hostView);
  27. }
  28. private void AddHandlers ()
  29. {
  30. if (!_added) {
  31. _hostView.DrawContent += _hostView_DrawContent;
  32. _scrollBar.ChangedPosition += _scrollBar_ChangedPosition;
  33. _scrollBar.OtherScrollBarView.ChangedPosition += _scrollBar_OtherScrollBarView_ChangedPosition;
  34. }
  35. _added = true;
  36. }
  37. private void RemoveHandlers ()
  38. {
  39. if (_added) {
  40. _hostView.DrawContent -= _hostView_DrawContent;
  41. _scrollBar.ChangedPosition -= _scrollBar_ChangedPosition;
  42. _scrollBar.OtherScrollBarView.ChangedPosition -= _scrollBar_OtherScrollBarView_ChangedPosition;
  43. }
  44. _added = false;
  45. }
  46. private void _hostView_DrawContent (Rect obj)
  47. {
  48. _scrollBar.Size = _hostView.Lines;
  49. _scrollBar.Position = _hostView.Top;
  50. _scrollBar.OtherScrollBarView.Size = _hostView.Cols;
  51. _scrollBar.OtherScrollBarView.Position = _hostView.Left;
  52. _scrollBar.ColorScheme = _scrollBar.OtherScrollBarView.ColorScheme = _hostView.ColorScheme;
  53. _scrollBar.Refresh ();
  54. }
  55. private void _scrollBar_ChangedPosition ()
  56. {
  57. _hostView.Top = _scrollBar.Position;
  58. if (_hostView.Top != _scrollBar.Position) {
  59. _scrollBar.Position = _hostView.Top;
  60. }
  61. _hostView.SetNeedsDisplay ();
  62. }
  63. private void _scrollBar_OtherScrollBarView_ChangedPosition ()
  64. {
  65. _hostView.Left = _scrollBar.OtherScrollBarView.Position;
  66. if (_hostView.Left != _scrollBar.OtherScrollBarView.Position) {
  67. _scrollBar.OtherScrollBarView.Position = _hostView.Left;
  68. }
  69. _hostView.SetNeedsDisplay ();
  70. }
  71. [Fact]
  72. public void Hosting_A_Null_View_To_A_ScrollBarView_Throws_ArgumentNullException ()
  73. {
  74. Assert.Throws<ArgumentNullException> ("The host parameter can't be null.",
  75. () => new ScrollBarView (null, true));
  76. Assert.Throws<ArgumentNullException> ("The host parameter can't be null.",
  77. () => new ScrollBarView (null, false));
  78. }
  79. [Fact]
  80. public void Hosting_A_Null_SuperView_View_To_A_ScrollBarView_Throws_ArgumentNullException ()
  81. {
  82. Assert.Throws<ArgumentNullException> ("The host SuperView parameter can't be null.",
  83. () => new ScrollBarView (new View (), true));
  84. Assert.Throws<ArgumentNullException> ("The host SuperView parameter can't be null.",
  85. () => new ScrollBarView (new View (), false));
  86. }
  87. [Fact]
  88. public void Hosting_Two_Vertical_ScrollBarView_Throws_ArgumentException ()
  89. {
  90. var top = new Toplevel ();
  91. var host = new View ();
  92. top.Add (host);
  93. var v = new ScrollBarView (host, true);
  94. var h = new ScrollBarView (host, true);
  95. Assert.Throws<ArgumentException> (null, () => v.OtherScrollBarView = h);
  96. Assert.Throws<ArgumentException> (null, () => h.OtherScrollBarView = v);
  97. }
  98. [Fact]
  99. public void Scrolling_With_Default_Constructor_Do_Not_Scroll ()
  100. {
  101. var sbv = new ScrollBarView {
  102. Position = 1
  103. };
  104. Assert.NotEqual (1, sbv.Position);
  105. Assert.Equal (0, sbv.Position);
  106. }
  107. [Fact]
  108. public void Hosting_Two_Horizontal_ScrollBarView_Throws_ArgumentException ()
  109. {
  110. var top = new Toplevel ();
  111. var host = new View ();
  112. top.Add (host);
  113. var v = new ScrollBarView (host, false);
  114. var h = new ScrollBarView (host, false);
  115. Assert.Throws<ArgumentException> (null, () => v.OtherScrollBarView = h);
  116. Assert.Throws<ArgumentException> (null, () => h.OtherScrollBarView = v);
  117. }
  118. [Fact]
  119. public void Hosting_A_View_To_A_ScrollBarView ()
  120. {
  121. RemoveHandlers ();
  122. _scrollBar = new ScrollBarView (_hostView, true);
  123. _scrollBar.OtherScrollBarView = new ScrollBarView (_hostView, false);
  124. _scrollBar.OtherScrollBarView = _scrollBar.OtherScrollBarView;
  125. _scrollBar.OtherScrollBarView.OtherScrollBarView = _scrollBar;
  126. Assert.True (_scrollBar.IsVertical);
  127. Assert.False (_scrollBar.OtherScrollBarView.IsVertical);
  128. Assert.Equal (_scrollBar.Position, _hostView.Top);
  129. Assert.NotEqual (_scrollBar.Size, _hostView.Lines);
  130. Assert.Equal (_scrollBar.OtherScrollBarView.Position, _hostView.Left);
  131. Assert.NotEqual (_scrollBar.OtherScrollBarView.Size, _hostView.Cols);
  132. AddHandlers ();
  133. _hostView.SuperView.LayoutSubviews ();
  134. _hostView.Redraw (_hostView.Bounds);
  135. Assert.Equal (_scrollBar.Position, _hostView.Top);
  136. Assert.Equal (_scrollBar.Size, _hostView.Lines);
  137. Assert.Equal (_scrollBar.OtherScrollBarView.Position, _hostView.Left);
  138. Assert.Equal (_scrollBar.OtherScrollBarView.Size, _hostView.Cols);
  139. }
  140. [Fact]
  141. public void ChangedPosition_Update_The_Hosted_View ()
  142. {
  143. Hosting_A_View_To_A_ScrollBarView ();
  144. AddHandlers ();
  145. _scrollBar.Position = 2;
  146. Assert.Equal (_scrollBar.Position, _hostView.Top);
  147. _scrollBar.OtherScrollBarView.Position = 5;
  148. Assert.Equal (_scrollBar.OtherScrollBarView.Position, _hostView.Left);
  149. }
  150. [Fact]
  151. public void ChangedPosition_Scrolling ()
  152. {
  153. Hosting_A_View_To_A_ScrollBarView ();
  154. AddHandlers ();
  155. for (int i = 0; i < _scrollBar.Size; i++) {
  156. _scrollBar.Position += 1;
  157. Assert.Equal (_scrollBar.Position, _hostView.Top);
  158. }
  159. for (int i = _scrollBar.Size - 1; i >= 0; i--) {
  160. _scrollBar.Position -= 1;
  161. Assert.Equal (_scrollBar.Position, _hostView.Top);
  162. }
  163. for (int i = 0; i < _scrollBar.OtherScrollBarView.Size; i++) {
  164. _scrollBar.OtherScrollBarView.Position += i;
  165. Assert.Equal (_scrollBar.OtherScrollBarView.Position, _hostView.Left);
  166. }
  167. for (int i = _scrollBar.OtherScrollBarView.Size - 1; i >= 0; i--) {
  168. _scrollBar.OtherScrollBarView.Position -= 1;
  169. Assert.Equal (_scrollBar.OtherScrollBarView.Position, _hostView.Left);
  170. }
  171. }
  172. [Fact]
  173. public void ChangedPosition_Negative_Value ()
  174. {
  175. Hosting_A_View_To_A_ScrollBarView ();
  176. AddHandlers ();
  177. _scrollBar.Position = -20;
  178. Assert.Equal (0, _scrollBar.Position);
  179. Assert.Equal (_scrollBar.Position, _hostView.Top);
  180. _scrollBar.OtherScrollBarView.Position = -50;
  181. Assert.Equal (0, _scrollBar.OtherScrollBarView.Position);
  182. Assert.Equal (_scrollBar.OtherScrollBarView.Position, _hostView.Left);
  183. }
  184. [Fact]
  185. public void DrawContent_Update_The_ScrollBarView_Position ()
  186. {
  187. Hosting_A_View_To_A_ScrollBarView ();
  188. AddHandlers ();
  189. _hostView.Top = 3;
  190. _hostView.Redraw (_hostView.Bounds);
  191. Assert.Equal (_scrollBar.Position, _hostView.Top);
  192. _hostView.Left = 6;
  193. _hostView.Redraw (_hostView.Bounds);
  194. Assert.Equal (_scrollBar.OtherScrollBarView.Position, _hostView.Left);
  195. }
  196. [Fact]
  197. public void OtherScrollBarView_Not_Null ()
  198. {
  199. Hosting_A_View_To_A_ScrollBarView ();
  200. AddHandlers ();
  201. Assert.Equal (_scrollBar.OtherScrollBarView, _scrollBar.OtherScrollBarView);
  202. Assert.Equal (_scrollBar.OtherScrollBarView.OtherScrollBarView, _scrollBar);
  203. }
  204. [Fact]
  205. public void ShowScrollIndicator_Check ()
  206. {
  207. Hosting_A_View_To_A_ScrollBarView ();
  208. AddHandlers ();
  209. Assert.True (_scrollBar.ShowScrollIndicator);
  210. Assert.True (_scrollBar.OtherScrollBarView.ShowScrollIndicator);
  211. }
  212. [Fact]
  213. public void KeepContentAlwaysInViewport_True ()
  214. {
  215. Hosting_A_View_To_A_ScrollBarView ();
  216. AddHandlers ();
  217. Assert.Equal (80, _hostView.Bounds.Width);
  218. Assert.Equal (25, _hostView.Bounds.Height);
  219. Assert.Equal (79, _scrollBar.OtherScrollBarView.Bounds.Width);
  220. Assert.Equal (24, _scrollBar.Bounds.Height);
  221. Assert.Equal (30, _scrollBar.Size);
  222. Assert.Equal (100, _scrollBar.OtherScrollBarView.Size);
  223. Assert.True (_scrollBar.ShowScrollIndicator);
  224. Assert.True (_scrollBar.OtherScrollBarView.ShowScrollIndicator);
  225. Assert.True (_scrollBar.Visible);
  226. Assert.True (_scrollBar.OtherScrollBarView.Visible);
  227. _scrollBar.Position = 50;
  228. Assert.Equal (_scrollBar.Position, _scrollBar.Size - _scrollBar.Bounds.Height);
  229. Assert.Equal (_scrollBar.Position, _hostView.Top);
  230. Assert.Equal (6, _scrollBar.Position);
  231. Assert.Equal (6, _hostView.Top);
  232. _scrollBar.OtherScrollBarView.Position = 150;
  233. Assert.Equal (_scrollBar.OtherScrollBarView.Position, _scrollBar.OtherScrollBarView.Size - _scrollBar.OtherScrollBarView.Bounds.Width);
  234. Assert.Equal (_scrollBar.OtherScrollBarView.Position, _hostView.Left);
  235. Assert.Equal (21, _scrollBar.OtherScrollBarView.Position);
  236. Assert.Equal (21, _hostView.Left);
  237. }
  238. [Fact]
  239. public void KeepContentAlwaysInViewport_False ()
  240. {
  241. Hosting_A_View_To_A_ScrollBarView ();
  242. AddHandlers ();
  243. _scrollBar.KeepContentAlwaysInViewport = false;
  244. _scrollBar.Position = 50;
  245. Assert.Equal (_scrollBar.Position, _scrollBar.Size - 1);
  246. Assert.Equal (_scrollBar.Position, _hostView.Top);
  247. _scrollBar.OtherScrollBarView.Position = 150;
  248. Assert.Equal (_scrollBar.OtherScrollBarView.Position, _scrollBar.OtherScrollBarView.Size - 1);
  249. Assert.Equal (_scrollBar.OtherScrollBarView.Position, _hostView.Left);
  250. }
  251. [Fact]
  252. public void AutoHideScrollBars_Check ()
  253. {
  254. Hosting_A_View_To_A_ScrollBarView ();
  255. AddHandlers ();
  256. _hostView.Redraw (_hostView.Bounds);
  257. Assert.True (_scrollBar.ShowScrollIndicator);
  258. Assert.True (_scrollBar.Visible);
  259. Assert.Equal ("Dim.Combine(DimView(side=Height, target=HostView()({X=0,Y=0,Width=80,Height=25}))-Dim.Absolute(1))",
  260. _scrollBar.Height.ToString ());
  261. Assert.Equal (24, _scrollBar.Bounds.Height);
  262. Assert.True (_scrollBar.OtherScrollBarView.ShowScrollIndicator);
  263. Assert.True (_scrollBar.OtherScrollBarView.Visible);
  264. Assert.Equal ("Dim.Combine(DimView(side=Width, target=HostView()({X=0,Y=0,Width=80,Height=25}))-Dim.Absolute(1))",
  265. _scrollBar.OtherScrollBarView.Width.ToString ());
  266. Assert.Equal (79, _scrollBar.OtherScrollBarView.Bounds.Width);
  267. _hostView.Lines = 10;
  268. _hostView.Redraw (_hostView.Bounds);
  269. Assert.False (_scrollBar.ShowScrollIndicator);
  270. Assert.False (_scrollBar.Visible);
  271. Assert.Equal ("Dim.Combine(DimView(side=Height, target=HostView()({X=0,Y=0,Width=80,Height=25}))-Dim.Absolute(1))",
  272. _scrollBar.Height.ToString ());
  273. Assert.Equal (24, _scrollBar.Bounds.Height);
  274. _hostView.Cols = 60;
  275. _hostView.Redraw (_hostView.Bounds);
  276. Assert.False (_scrollBar.OtherScrollBarView.ShowScrollIndicator);
  277. Assert.False (_scrollBar.OtherScrollBarView.Visible);
  278. Assert.Equal ("Dim.Combine(DimView(side=Width, target=HostView()({X=0,Y=0,Width=80,Height=25}))-Dim.Absolute(0))",
  279. _scrollBar.OtherScrollBarView.Width.ToString ());
  280. Assert.Equal (80, _scrollBar.OtherScrollBarView.Bounds.Width);
  281. _hostView.Lines = 40;
  282. _hostView.Redraw (_hostView.Bounds);
  283. Assert.True (_scrollBar.ShowScrollIndicator);
  284. Assert.True (_scrollBar.Visible);
  285. Assert.Equal ("Dim.Combine(DimView(side=Height, target=HostView()({X=0,Y=0,Width=80,Height=25}))-Dim.Absolute(0))",
  286. _scrollBar.Height.ToString ());
  287. Assert.Equal (25, _scrollBar.Bounds.Height);
  288. _hostView.Cols = 120;
  289. _hostView.Redraw (_hostView.Bounds);
  290. Assert.True (_scrollBar.OtherScrollBarView.ShowScrollIndicator);
  291. Assert.True (_scrollBar.OtherScrollBarView.Visible);
  292. Assert.Equal ("Dim.Combine(DimView(side=Width, target=HostView()({X=0,Y=0,Width=80,Height=25}))-Dim.Absolute(1))",
  293. _scrollBar.OtherScrollBarView.Width.ToString ());
  294. Assert.Equal (79, _scrollBar.OtherScrollBarView.Bounds.Width);
  295. Assert.True (_scrollBar.ShowScrollIndicator);
  296. Assert.True (_scrollBar.Visible);
  297. Assert.Equal ("Dim.Combine(DimView(side=Height, target=HostView()({X=0,Y=0,Width=80,Height=25}))-Dim.Absolute(1))",
  298. _scrollBar.Height.ToString ());
  299. Assert.Equal (24, _scrollBar.Bounds.Height);
  300. }
  301. }
  302. }