diff options
Diffstat (limited to 'Xamarin.Forms.Core.UnitTests/ScrollViewUnitTests.cs')
-rw-r--r-- | Xamarin.Forms.Core.UnitTests/ScrollViewUnitTests.cs | 403 |
1 files changed, 403 insertions, 0 deletions
diff --git a/Xamarin.Forms.Core.UnitTests/ScrollViewUnitTests.cs b/Xamarin.Forms.Core.UnitTests/ScrollViewUnitTests.cs new file mode 100644 index 00000000..066d4e5d --- /dev/null +++ b/Xamarin.Forms.Core.UnitTests/ScrollViewUnitTests.cs @@ -0,0 +1,403 @@ +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)); + } + } +} |