ScrollViewerTests.cs 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. using System;
  2. using System.Collections.Generic;
  3. using Avalonia.Controls.Presenters;
  4. using Avalonia.Controls.Primitives;
  5. using Avalonia.Controls.Templates;
  6. using Avalonia.Layout;
  7. using Moq;
  8. using Xunit;
  9. namespace Avalonia.Controls.UnitTests
  10. {
  11. public class ScrollViewerTests
  12. {
  13. [Fact]
  14. public void Content_Is_Created()
  15. {
  16. var target = new ScrollViewer
  17. {
  18. Template = new FuncControlTemplate<ScrollViewer>(CreateTemplate),
  19. Content = "Foo",
  20. };
  21. target.ApplyTemplate();
  22. ((ContentPresenter)target.Presenter).UpdateChild();
  23. Assert.IsType<TextBlock>(target.Presenter.Child);
  24. }
  25. [Fact]
  26. public void CanHorizontallyScroll_Should_Track_HorizontalScrollBarVisibility()
  27. {
  28. var target = new ScrollViewer();
  29. var values = new List<bool>();
  30. target.GetObservable(ScrollViewer.CanHorizontallyScrollProperty).Subscribe(x => values.Add(x));
  31. target.HorizontalScrollBarVisibility = ScrollBarVisibility.Disabled;
  32. target.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto;
  33. Assert.Equal(new[] { true, false, true }, values);
  34. }
  35. [Fact]
  36. public void CanVerticallyScroll_Should_Track_VerticalScrollBarVisibility()
  37. {
  38. var target = new ScrollViewer();
  39. var values = new List<bool>();
  40. target.GetObservable(ScrollViewer.CanVerticallyScrollProperty).Subscribe(x => values.Add(x));
  41. target.VerticalScrollBarVisibility = ScrollBarVisibility.Disabled;
  42. target.VerticalScrollBarVisibility = ScrollBarVisibility.Auto;
  43. Assert.Equal(new[] { true, false, true }, values);
  44. }
  45. [Fact]
  46. public void Offset_Should_Be_Coerced_To_Viewport()
  47. {
  48. var target = new ScrollViewer();
  49. target.SetValue(ScrollViewer.ExtentProperty, new Size(20, 20));
  50. target.SetValue(ScrollViewer.ViewportProperty, new Size(10, 10));
  51. target.Offset = new Vector(12, 12);
  52. Assert.Equal(new Vector(10, 10), target.Offset);
  53. }
  54. [Fact]
  55. public void Test_ScrollToHome()
  56. {
  57. var target = new ScrollViewer();
  58. target.SetValue(ScrollViewer.ExtentProperty, new Size(50, 50));
  59. target.SetValue(ScrollViewer.ViewportProperty, new Size(10, 10));
  60. target.Offset = new Vector(25, 25);
  61. target.ScrollToHome();
  62. Assert.Equal(new Vector(0, 0), target.Offset);
  63. }
  64. [Fact]
  65. public void Test_ScrollToEnd()
  66. {
  67. var target = new ScrollViewer();
  68. target.SetValue(ScrollViewer.ExtentProperty, new Size(50, 50));
  69. target.SetValue(ScrollViewer.ViewportProperty, new Size(10, 10));
  70. target.Offset = new Vector(25, 25);
  71. target.ScrollToEnd();
  72. Assert.Equal(new Vector(0, 40), target.Offset);
  73. }
  74. [Fact]
  75. public void SmallChange_Should_Be_16()
  76. {
  77. var target = new ScrollViewer();
  78. Assert.Equal(new Size(16, 16), target.SmallChange);
  79. }
  80. [Fact]
  81. public void LargeChange_Should_Be_Viewport()
  82. {
  83. var target = new ScrollViewer();
  84. target.SetValue(ScrollViewer.ViewportProperty, new Size(104, 143));
  85. Assert.Equal(new Size(104, 143), target.LargeChange);
  86. }
  87. [Fact]
  88. public void SmallChange_Should_Come_From_ILogicalScrollable_If_Present()
  89. {
  90. var child = new Mock<Control>();
  91. var logicalScroll = child.As<ILogicalScrollable>();
  92. logicalScroll.Setup(x => x.IsLogicalScrollEnabled).Returns(true);
  93. logicalScroll.Setup(x => x.ScrollSize).Returns(new Size(12, 43));
  94. var target = new ScrollViewer
  95. {
  96. Template = new FuncControlTemplate<ScrollViewer>(CreateTemplate),
  97. Content = child.Object,
  98. };
  99. target.ApplyTemplate();
  100. ((ContentPresenter)target.Presenter).UpdateChild();
  101. Assert.Equal(new Size(12, 43), target.SmallChange);
  102. }
  103. [Fact]
  104. public void LargeChange_Should_Come_From_ILogicalScrollable_If_Present()
  105. {
  106. var child = new Mock<Control>();
  107. var logicalScroll = child.As<ILogicalScrollable>();
  108. logicalScroll.Setup(x => x.IsLogicalScrollEnabled).Returns(true);
  109. logicalScroll.Setup(x => x.PageScrollSize).Returns(new Size(45, 67));
  110. var target = new ScrollViewer
  111. {
  112. Template = new FuncControlTemplate<ScrollViewer>(CreateTemplate),
  113. Content = child.Object,
  114. };
  115. target.ApplyTemplate();
  116. ((ContentPresenter)target.Presenter).UpdateChild();
  117. Assert.Equal(new Size(45, 67), target.LargeChange);
  118. }
  119. [Fact]
  120. public void Changing_Extent_Should_Raise_ScrollChanged()
  121. {
  122. var target = new ScrollViewer();
  123. var raised = 0;
  124. target.SetValue(ScrollViewer.ExtentProperty, new Size(100, 100));
  125. target.SetValue(ScrollViewer.ViewportProperty, new Size(50, 50));
  126. target.Offset = new Vector(10, 10);
  127. target.ScrollChanged += (s, e) =>
  128. {
  129. Assert.Equal(new Vector(11, 12), e.ExtentDelta);
  130. Assert.Equal(default, e.OffsetDelta);
  131. Assert.Equal(default, e.ViewportDelta);
  132. ++raised;
  133. };
  134. target.SetValue(ScrollViewer.ExtentProperty, new Size(111, 112));
  135. Assert.Equal(1, raised);
  136. }
  137. [Fact]
  138. public void Changing_Offset_Should_Raise_ScrollChanged()
  139. {
  140. var target = new ScrollViewer();
  141. var raised = 0;
  142. target.SetValue(ScrollViewer.ExtentProperty, new Size(100, 100));
  143. target.SetValue(ScrollViewer.ViewportProperty, new Size(50, 50));
  144. target.Offset = new Vector(10, 10);
  145. target.ScrollChanged += (s, e) =>
  146. {
  147. Assert.Equal(default, e.ExtentDelta);
  148. Assert.Equal(new Vector(12, 14), e.OffsetDelta);
  149. Assert.Equal(default, e.ViewportDelta);
  150. ++raised;
  151. };
  152. target.Offset = new Vector(22, 24);
  153. Assert.Equal(1, raised);
  154. }
  155. [Fact]
  156. public void Changing_Viewport_Should_Raise_ScrollChanged()
  157. {
  158. var target = new ScrollViewer();
  159. var raised = 0;
  160. target.SetValue(ScrollViewer.ExtentProperty, new Size(100, 100));
  161. target.SetValue(ScrollViewer.ViewportProperty, new Size(50, 50));
  162. target.Offset = new Vector(10, 10);
  163. target.ScrollChanged += (s, e) =>
  164. {
  165. Assert.Equal(default, e.ExtentDelta);
  166. Assert.Equal(default, e.OffsetDelta);
  167. Assert.Equal(new Vector(6, 8), e.ViewportDelta);
  168. ++raised;
  169. };
  170. target.SetValue(ScrollViewer.ViewportProperty, new Size(56, 58));
  171. Assert.Equal(1, raised);
  172. }
  173. private Control CreateTemplate(ScrollViewer control, INameScope scope)
  174. {
  175. return new Grid
  176. {
  177. ColumnDefinitions = new ColumnDefinitions
  178. {
  179. new ColumnDefinition(1, GridUnitType.Star),
  180. new ColumnDefinition(GridLength.Auto),
  181. },
  182. RowDefinitions = new RowDefinitions
  183. {
  184. new RowDefinition(1, GridUnitType.Star),
  185. new RowDefinition(GridLength.Auto),
  186. },
  187. Children =
  188. {
  189. new ScrollContentPresenter
  190. {
  191. Name = "PART_ContentPresenter",
  192. [~ContentPresenter.ContentProperty] = control[~ContentControl.ContentProperty],
  193. [~~ScrollContentPresenter.ExtentProperty] = control[~~ScrollViewer.ExtentProperty],
  194. [~~ScrollContentPresenter.OffsetProperty] = control[~~ScrollViewer.OffsetProperty],
  195. [~~ScrollContentPresenter.ViewportProperty] = control[~~ScrollViewer.ViewportProperty],
  196. [~ScrollContentPresenter.CanHorizontallyScrollProperty] = control[~ScrollViewer.CanHorizontallyScrollProperty],
  197. }.RegisterInNameScope(scope),
  198. new ScrollBar
  199. {
  200. Name = "horizontalScrollBar",
  201. Orientation = Orientation.Horizontal,
  202. [~RangeBase.MaximumProperty] = control[~ScrollViewer.HorizontalScrollBarMaximumProperty],
  203. [~~RangeBase.ValueProperty] = control[~~ScrollViewer.HorizontalScrollBarValueProperty],
  204. [~ScrollBar.ViewportSizeProperty] = control[~ScrollViewer.HorizontalScrollBarViewportSizeProperty],
  205. [~ScrollBar.VisibilityProperty] = control[~ScrollViewer.HorizontalScrollBarVisibilityProperty],
  206. [Grid.RowProperty] = 1,
  207. }.RegisterInNameScope(scope),
  208. new ScrollBar
  209. {
  210. Name = "verticalScrollBar",
  211. Orientation = Orientation.Vertical,
  212. [~RangeBase.MaximumProperty] = control[~ScrollViewer.VerticalScrollBarMaximumProperty],
  213. [~~RangeBase.ValueProperty] = control[~~ScrollViewer.VerticalScrollBarValueProperty],
  214. [~ScrollBar.ViewportSizeProperty] = control[~ScrollViewer.VerticalScrollBarViewportSizeProperty],
  215. [~ScrollBar.VisibilityProperty] = control[~ScrollViewer.VerticalScrollBarVisibilityProperty],
  216. [Grid.ColumnProperty] = 1,
  217. }.RegisterInNameScope(scope),
  218. },
  219. };
  220. }
  221. }
  222. }