using System; using System.Collections.Generic; using System.Linq; using NUnit.Framework; namespace Xamarin.Forms.Core.UnitTests { [TestFixture] public class ScrollViewUnitTests : BaseTestFixture { [SetUp] public override void Setup() { base.Setup (); Device.PlatformServices = new MockPlatformServices (); } [TearDown] public override void TearDown() { base.TearDown (); Device.PlatformServices = null; } [Test] public void TestConstructor () { ScrollView scrollView = new ScrollView (); Assert.Null (scrollView.Content); View view = new View (); scrollView = new ScrollView {Content = view}; Assert.AreEqual (view, scrollView.Content); } [Test] [TestCase (ScrollOrientation.Horizontal)] [TestCase (ScrollOrientation.Both)] public void GetsCorrectSizeRequestWithWrappingContent (ScrollOrientation orientation) { var scrollView = new ScrollView { IsPlatformEnabled = true, Orientation = orientation, Platform = new UnitPlatform (null, true) }; var hLayout = new StackLayout { IsPlatformEnabled = true, Orientation = StackOrientation.Horizontal, Children = { new Label {Text = "THIS IS A REALLY LONG STRING", IsPlatformEnabled = true}, new Label {Text = "THIS IS A REALLY LONG STRING", IsPlatformEnabled = true}, new Label {Text = "THIS IS A REALLY LONG STRING", IsPlatformEnabled = true}, new Label {Text = "THIS IS A REALLY LONG STRING", IsPlatformEnabled = true}, new Label {Text = "THIS IS A REALLY LONG STRING", IsPlatformEnabled = true}, } }; scrollView.Content = hLayout; var r = scrollView.GetSizeRequest (100, 100); Assert.AreEqual (10, r.Request.Height); } [Test] public void TestContentSizeChangedVertical () { View view = new View {IsPlatformEnabled = true, WidthRequest = 100, HeightRequest = 100}; ScrollView scroll = new ScrollView {Content = view}; scroll.Platform = new UnitPlatform (); scroll.Layout (new Rectangle (0, 0, 50, 50)); Assert.AreEqual (new Size (50, 100), scroll.ContentSize); bool changed = false; scroll.PropertyChanged += (sender, e) => { switch (e.PropertyName) { case "ContentSize": changed = true; break; } }; view.HeightRequest = 200; Assert.True (changed); Assert.AreEqual (new Size (50, 200), scroll.ContentSize); } [Test] public void TestContentSizeChangedVerticalBidirectional () { View view = new View { IsPlatformEnabled = true, WidthRequest = 100, HeightRequest = 100 }; ScrollView scroll = new ScrollView { Content = view, Orientation = ScrollOrientation.Both }; scroll.Platform = new UnitPlatform (); scroll.Layout (new Rectangle (0, 0, 50, 50)); Assert.AreEqual (new Size (100, 100), scroll.ContentSize); bool changed = false; scroll.PropertyChanged += (sender, e) => { switch (e.PropertyName) { case "ContentSize": changed = true; break; } }; view.HeightRequest = 200; Assert.True (changed); Assert.AreEqual (new Size (100, 200), scroll.ContentSize); } [Test] public void TestContentSizeChangedHorizontal () { View view = new View {IsPlatformEnabled = true, WidthRequest = 100, HeightRequest = 100}; var scroll = new ScrollView { Orientation = ScrollOrientation.Horizontal, Content = view }; scroll.Platform = new UnitPlatform (); scroll.Layout (new Rectangle (0, 0, 50, 50)); Assert.AreEqual (new Size (100, 50), scroll.ContentSize); bool changed = false; scroll.PropertyChanged += (sender, e) => { switch (e.PropertyName) { case "ContentSize": changed = true; break; } }; view.WidthRequest = 200; Assert.True (changed); Assert.AreEqual (new Size (200, 50), scroll.ContentSize); } [Test] public void TestContentSizeChangedHorizontalBidirectional () { View view = new View { IsPlatformEnabled = true, WidthRequest = 100, HeightRequest = 100 }; var scroll = new ScrollView { Orientation = ScrollOrientation.Both, Content = view }; scroll.Platform = new UnitPlatform (); scroll.Layout (new Rectangle (0, 0, 50, 50)); Assert.AreEqual (new Size (100, 100), scroll.ContentSize); bool changed = false; scroll.PropertyChanged += (sender, e) => { switch (e.PropertyName) { case "ContentSize": changed = true; break; } }; view.WidthRequest = 200; Assert.True (changed); Assert.AreEqual (new Size (200, 100), scroll.ContentSize); } [Test] public void TestContentSizeClamping () { View view = new View {IsPlatformEnabled = true, WidthRequest = 100, HeightRequest = 100}; var scroll = new ScrollView { Orientation = ScrollOrientation.Horizontal, Content = view, Platform = new UnitPlatform () }; scroll.Layout (new Rectangle (0, 0, 50, 50)); bool changed = false; scroll.PropertyChanged += (sender, e) => { switch (e.PropertyName) { case "ContentSize": changed = true; break; } }; view.HeightRequest = 200; Assert.False (changed); Assert.AreEqual (new Size (100, 50), scroll.ContentSize); } [Test] public void TestChildChanged () { ScrollView scrollView = new ScrollView (); bool changed = false; scrollView.PropertyChanged += (sender, e) => { switch (e.PropertyName) { case "Content": changed = true; break; } }; View view = new View (); scrollView.Content = view; Assert.True (changed); } [Test] public void TestChildDoubleSet () { var scrollView = new ScrollView (); bool changed = false; scrollView.PropertyChanged += (sender, args) => { if (args.PropertyName == "Content") changed = true; }; var child = new View (); scrollView.Content = child; Assert.True (changed); Assert.AreEqual (child, scrollView.Content); changed = false; scrollView.Content = child; Assert.False (changed); scrollView.Content = null; Assert.True (changed); Assert.Null (scrollView.Content); } [Test] public void TestOrientation () { var scrollView = new ScrollView (); Assert.AreEqual (ScrollOrientation.Vertical, scrollView.Orientation); bool signaled = false; scrollView.PropertyChanged += (sender, args) => { if (args.PropertyName == "Orientation") signaled = true; }; scrollView.Orientation = ScrollOrientation.Horizontal; Assert.AreEqual (ScrollOrientation.Horizontal, scrollView.Orientation); Assert.True (signaled); scrollView.Orientation = ScrollOrientation.Both; Assert.AreEqual (ScrollOrientation.Both, scrollView.Orientation); Assert.True (signaled); } [Test] public void TestOrientationDoubleSet () { var scrollView = new ScrollView (); bool signaled = false; scrollView.PropertyChanged += (sender, args) => { if (args.PropertyName == "Orientation") signaled = true; }; scrollView.Orientation = scrollView.Orientation; Assert.False (signaled); } [Test] public void TestScrollTo() { var scrollView = new ScrollView (); scrollView.Platform = new UnitPlatform (); var item = new View { }; scrollView.Content = new StackLayout { Children = { item } }; bool requested = false; ((IScrollViewController) scrollView).ScrollToRequested += (sender, args) => { requested = true; Assert.AreEqual(args.ScrollY,100); Assert.AreEqual(args.ScrollX,0); Assert.Null (args.Item); Assert.That (args.ShouldAnimate, Is.EqualTo (true)); }; scrollView.ScrollToAsync (0,100, true); Assert.That (requested, Is.True); } [Test] public void TestScrollToNotAnimated() { var scrollView = new ScrollView (); scrollView.Platform = new UnitPlatform (); var item = new View { }; scrollView.Content = new StackLayout { Children = { item } }; bool requested = false; ((IScrollViewController) scrollView).ScrollToRequested += (sender, args) => { requested = true; Assert.AreEqual(args.ScrollY,100); Assert.AreEqual(args.ScrollX,0); Assert.Null (args.Item); Assert.That (args.ShouldAnimate, Is.EqualTo (false)); }; scrollView.ScrollToAsync (0,100, false); Assert.That (requested, Is.True); } [Test] public void TestScrollToElement () { var scrollView = new ScrollView (); scrollView.Platform = new UnitPlatform (); var item = new Label { Text = "Test" }; scrollView.Content = new StackLayout { Children = { item } }; bool requested = false; ((IScrollViewController) scrollView).ScrollToRequested += (sender, args) => { requested = true; Assert.That (args.Element, Is.SameAs (item)); Assert.That (args.Position, Is.EqualTo (ScrollToPosition.Center)); Assert.That (args.ShouldAnimate, Is.EqualTo (true)); }; scrollView.ScrollToAsync (item, ScrollToPosition.Center, true); Assert.That (requested, Is.True); } [Test] public void TestScrollToElementNotAnimated () { var scrollView = new ScrollView (); scrollView.Platform = new UnitPlatform (); var item = new Label { Text = "Test" }; scrollView.Content = new StackLayout { Children = { item } }; bool requested = false; ((IScrollViewController) scrollView).ScrollToRequested += (sender, args) => { requested = true; Assert.That (args.Element, Is.SameAs (item)); Assert.That (args.Position, Is.EqualTo (ScrollToPosition.Center)); Assert.That (args.ShouldAnimate, Is.EqualTo (false)); }; scrollView.ScrollToAsync (item, ScrollToPosition.Center, false); Assert.That (requested, Is.True); } [Test] public void TestScrollToInvalid () { var scrollView = new ScrollView (); scrollView.Platform = new UnitPlatform (); Assert.That (() => scrollView.ScrollToAsync (new VisualElement(), ScrollToPosition.Center, true), Throws.ArgumentException); Assert.That (() => scrollView.ScrollToAsync (null, (ScrollToPosition) 500, true), Throws.ArgumentException); } [Test] public void SetScrollPosition () { var scroll = new ScrollView(); IScrollViewController controller = scroll; controller.SetScrolledPosition (100, 100); Assert.That (scroll.ScrollX, Is.EqualTo (100)); Assert.That (scroll.ScrollY, Is.EqualTo (100)); } [Test] public void TestScrollContentMarginHorizontal() { View view = new View { IsPlatformEnabled = true, Margin = 100, WidthRequest = 100, HeightRequest = 100 }; var scroll = new ScrollView { Content = view, Orientation = ScrollOrientation.Horizontal, Platform = new UnitPlatform() }; scroll.Layout(new Rectangle(0, 0, 100, 100)); Assert.AreEqual(new Size(300, 100), scroll.ContentSize); Assert.AreEqual(100, scroll.Height); Assert.AreEqual(100, scroll.Width); } [Test] public void TestScrollContentMarginVertical() { View view = new View { IsPlatformEnabled = true, Margin = 100, WidthRequest = 100, HeightRequest = 100 }; var scroll = new ScrollView { Content = view, Orientation = ScrollOrientation.Vertical, Platform = new UnitPlatform() }; scroll.Layout(new Rectangle(0, 0, 100, 100)); Assert.AreEqual(new Size(100, 300), scroll.ContentSize); Assert.AreEqual(100, scroll.Height); Assert.AreEqual(100, scroll.Width); } [Test] public void TestScrollContentMarginBiDirectional() { View view = new View { IsPlatformEnabled = true, Margin = 100, WidthRequest = 100, HeightRequest = 100 }; var scroll = new ScrollView { Content = view, Orientation = ScrollOrientation.Both, Platform = new UnitPlatform() }; scroll.Layout(new Rectangle(0, 0, 100, 100)); Assert.AreEqual(new Size(300, 300), scroll.ContentSize); Assert.AreEqual(100, scroll.Height); Assert.AreEqual(100, scroll.Width); } [Test] public void TestBackToBackBiDirectionalScroll() { var scrollView = new ScrollView { Orientation = ScrollOrientation.Both, Platform = new UnitPlatform(), Content = new Grid { WidthRequest = 1000, HeightRequest = 1000 } }; var y100Count = 0; ((IScrollViewController)scrollView).ScrollToRequested += (sender, args) => { if (args.ScrollY == 100) { ++y100Count; } }; scrollView.ScrollToAsync(100, 100, true); Assert.AreEqual(y100Count, 1); scrollView.ScrollToAsync(0, 100, true); Assert.AreEqual(y100Count, 2); } } }