diff options
Diffstat (limited to 'Xamarin.Forms.Core.UnitTests/StackLayoutUnitTests.cs')
-rw-r--r-- | Xamarin.Forms.Core.UnitTests/StackLayoutUnitTests.cs | 619 |
1 files changed, 619 insertions, 0 deletions
diff --git a/Xamarin.Forms.Core.UnitTests/StackLayoutUnitTests.cs b/Xamarin.Forms.Core.UnitTests/StackLayoutUnitTests.cs new file mode 100644 index 00000000..fb4a8aac --- /dev/null +++ b/Xamarin.Forms.Core.UnitTests/StackLayoutUnitTests.cs @@ -0,0 +1,619 @@ +using System.Collections; +using System.Linq; +using NUnit.Framework; + + +namespace Xamarin.Forms.Core.UnitTests +{ + [TestFixture] + public class StackLayoutUnitTests : 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 EmptyLayoutDoesntCrash () + { + var stackLayout = new StackLayout (); + stackLayout.Layout (new Rectangle (0, 0, 200, 200)); + } + + [Test] + public void TestLastChildNotVisible () + { + View child1, child2; + var stack = new StackLayout { + Platform = new UnitPlatform (), + IsPlatformEnabled = true, + Children = { + (child1 = new View {WidthRequest = 20, HeightRequest = 20, IsPlatformEnabled = true}), + (child2 = new View {WidthRequest = 30, HeightRequest = 30, IsPlatformEnabled = true, IsVisible = false}) + } + }; + + var r = stack.GetSizeRequest (100, 100); + + Assert.AreEqual (new SizeRequest (new Size(20, 20)), r); + } + + [Test] + public void TestLayoutVertical () + { + View child1, child2; + var stack = new StackLayout { + Platform = new UnitPlatform (), + IsPlatformEnabled = true, + Children = { + (child1 = new View {WidthRequest = 20, HeightRequest = 20, IsPlatformEnabled = true}), + (child2 = new View {WidthRequest = 30, HeightRequest = 30, IsPlatformEnabled = true}) + } + }; + + stack.Layout (new Rectangle (0, 0, 100, 100)); + + Assert.AreEqual (new Rectangle (0, 0, 100, 20), child1.Bounds); + Assert.AreEqual (new Rectangle (0, 26, 100, 30), child2.Bounds); + } + + [Test] + public void ReinflatesViewsCorrectly () + { + var child1 = new BoxView { + IsPlatformEnabled = true, + VerticalOptions = LayoutOptions.FillAndExpand, + HeightRequest = 400, + MinimumHeightRequest = 10 + }; + + var child2 = new BoxView { + IsPlatformEnabled = true, + HeightRequest = 40, + MinimumHeightRequest = 40 + }; + + var stack = new StackLayout { + Spacing = 0, + Platform = new UnitPlatform (), + IsPlatformEnabled = true, + Children = { child1, child2 } + }; + + stack.Layout (new Rectangle (0, 0, 100, 100)); + + Assert.AreEqual (new Rectangle (0, 0, 100, 60), child1.Bounds); + Assert.AreEqual (new Rectangle (0, 60, 100, 40), child2.Bounds); + + stack.GetSizeRequest (100, 100); + stack.Layout (new Rectangle (0, 0, 100, 500)); + + Assert.AreEqual (new Rectangle (0, 0, 100, 460), child1.Bounds); + Assert.AreEqual (new Rectangle (0, 460, 100, 40), child2.Bounds); + } + + [Test] + public void TestLayoutHorizontal () + { + View child1, child2; + var stack = new StackLayout { + Orientation = StackOrientation.Horizontal, + Platform = new UnitPlatform (), + IsPlatformEnabled = true, + Children = { + (child1 = new View {WidthRequest = 20, HeightRequest = 20, IsPlatformEnabled = true}), + (child2 = new View {WidthRequest = 30, HeightRequest = 30, IsPlatformEnabled = true}) + } + }; + + stack.Layout (new Rectangle (0, 0, 100, 100)); + + Assert.AreEqual (new Rectangle (0, 0, 20, 100), child1.Bounds); + Assert.AreEqual (new Rectangle (26, 0, 30, 100), child2.Bounds); + } + + [Test] + public void TestExpandVertical () + { + View child1, child2, child3; + var stack = new StackLayout { + Platform = new UnitPlatform (), + IsPlatformEnabled = true, + Orientation = StackOrientation.Vertical, + Children = { + (child1 = new View {WidthRequest = 20, HeightRequest = 20, IsPlatformEnabled = true}), + (child2 = new View { + WidthRequest = 20, + HeightRequest = 20, + IsPlatformEnabled = true, + VerticalOptions = LayoutOptions.FillAndExpand + }), + (child3 = new View {WidthRequest = 20, HeightRequest = 20, IsPlatformEnabled = true}) + } + }; + + stack.Padding = new Thickness (10, 5); + stack.Layout (new Rectangle (0, 0, 100, 100)); + + Assert.AreEqual (new Rectangle (10, 5, 80, 20), child1.Bounds); + Assert.AreEqual (new Rectangle (10, 31, 80, 100 - 2 * 31), child2.Bounds); + Assert.AreEqual (new Rectangle (10, 75, 80, 20), child3.Bounds); + } + + [Test] + public void TestExpandHorizontal() { + View child1, child2, child3; + var stack = new StackLayout { + Platform = new UnitPlatform (), + IsPlatformEnabled = true, + Orientation = StackOrientation.Horizontal, + Children = { + (child1 = new View {WidthRequest = 20, HeightRequest = 20, IsPlatformEnabled = true}), + (child2 = new View { + WidthRequest = 20, + HeightRequest = 20, + IsPlatformEnabled = true, + HorizontalOptions = LayoutOptions.FillAndExpand + }), + (child3 = new View {WidthRequest = 20, HeightRequest = 20, IsPlatformEnabled = true}) + } + }; + + stack.Layout (new Rectangle (0, 0, 100, 100)); + + Assert.AreEqual (new Rectangle (0, 0, 20, 100), child1.Bounds); + Assert.AreEqual (new Rectangle (26, 0, 100 - 2 * 26, 100), child2.Bounds); + Assert.AreEqual (new Rectangle (80, 0, 20, 100), child3.Bounds); + } + + [Test] + public void TestSizeRequestVertical () + { + var stack = new StackLayout { + Platform = new UnitPlatform (), + IsPlatformEnabled = true, + Children = { + new View {WidthRequest = 20, HeightRequest = 20, IsPlatformEnabled = true}, + new View {WidthRequest = 30, HeightRequest = 30, IsPlatformEnabled = true} + } + }; + + var size = stack.GetSizeRequest (double.PositiveInfinity, double.PositiveInfinity).Request; + Assert.AreEqual (new Size (30, 56), size); + } + + [Test] + public void TestSizeRequestHorizontal () + { + var stack = new StackLayout { + Orientation = StackOrientation.Horizontal, + Platform = new UnitPlatform (), + IsPlatformEnabled = true, + Children = { + new View {WidthRequest = 20, HeightRequest = 20, IsPlatformEnabled = true}, + new View {WidthRequest = 30, HeightRequest = 30, IsPlatformEnabled = true} + } + }; + + var size = stack.GetSizeRequest (double.PositiveInfinity, double.PositiveInfinity).Request; + Assert.AreEqual (new Size (56, 30), size); + } + + [Test] + public void HorizontalRequestInVerticalLayout () + { + var stack = new StackLayout { + Platform = new UnitPlatform (), + IsPlatformEnabled = true, + Children = { + new View {WidthRequest = 20, HeightRequest = 30, IsPlatformEnabled = true, HorizontalOptions = LayoutOptions.Start}, + new View { + WidthRequest = 20, + HeightRequest = 30, + IsPlatformEnabled = true, + HorizontalOptions = LayoutOptions.Center + }, + new View {WidthRequest = 20, HeightRequest = 30, IsPlatformEnabled = true, HorizontalOptions = LayoutOptions.End} + } + }; + + stack.Layout (new Rectangle (0, 0, 200, 200)); + + Assert.AreEqual (new Rectangle (0, 0, 20, 30), stack.Children[0].Bounds); + Assert.AreEqual (new Rectangle (90, 36, 20, 30), stack.Children[1].Bounds); + Assert.AreEqual (new Rectangle (180, 72, 20, 30), stack.Children[2].Bounds); + } + + [Test] + public void VerticalRequestInHorizontalLayout () + { + var stack = new StackLayout { + Platform = new UnitPlatform (), + IsPlatformEnabled = true, + Orientation = StackOrientation.Horizontal, + Children = { + new View {WidthRequest = 20, HeightRequest = 30, IsPlatformEnabled = true, VerticalOptions = LayoutOptions.Start}, + new View {WidthRequest = 20, HeightRequest = 30, IsPlatformEnabled = true, VerticalOptions = LayoutOptions.Center}, + new View {WidthRequest = 20, HeightRequest = 30, IsPlatformEnabled = true, VerticalOptions = LayoutOptions.End} + } + }; + + stack.Layout (new Rectangle (0, 0, 200, 200)); + + Assert.AreEqual (new Rectangle (0, 0, 20, 30), stack.Children.Cast<View>().ToArray()[0].Bounds); + Assert.AreEqual (new Rectangle (26, 85, 20, 30), stack.Children.Cast<View>().ToArray()[1].Bounds); + Assert.AreEqual (new Rectangle (52, 170, 20, 30), stack.Children.Cast<View>().ToArray()[2].Bounds); + } + + [Test] + public void RespectMinimumHeightRequest () + { + var stack = new StackLayout { + Platform = new UnitPlatform (), + IsPlatformEnabled = true, + Spacing = 10, + Children = { + new View {WidthRequest = 100, HeightRequest = 100, IsPlatformEnabled = true}, + new View {WidthRequest = 100, HeightRequest = 100, IsPlatformEnabled = true}, + new View {WidthRequest = 100, HeightRequest = 100, MinimumHeightRequest = 10, IsPlatformEnabled = true} + } + }; + + stack.Layout (new Rectangle (0, 0, 100, 250)); + + Assert.That (stack.Children.ToArray()[0].Bounds, Is.EqualTo (new Rectangle (0, 0, 100, 100))); + Assert.That (stack.Children.ToArray()[1].Bounds, Is.EqualTo (new Rectangle (0, 110, 100, 100))); + Assert.That (stack.Children.ToArray()[2].Bounds, Is.EqualTo (new Rectangle (0, 220, 100, 30))); + } + + [Test] + public void RespectMinimumWidthRequest () + { + var stack = new StackLayout { + Platform = new UnitPlatform (), + IsPlatformEnabled = true, + Orientation = StackOrientation.Horizontal, + Spacing = 10, + Children = { + new View {WidthRequest = 100, HeightRequest = 100, IsPlatformEnabled = true}, + new View {WidthRequest = 100, HeightRequest = 100, IsPlatformEnabled = true}, + new View {WidthRequest = 100, HeightRequest = 100, MinimumWidthRequest = 10, IsPlatformEnabled = true} + } + }; + + stack.Layout (new Rectangle (0, 0, 250, 100)); + + Assert.That (stack.Children.ToArray()[0].Bounds, Is.EqualTo (new Rectangle (0, 0, 100, 100))); + Assert.That (stack.Children.ToArray()[1].Bounds, Is.EqualTo (new Rectangle (110, 0, 100, 100))); + Assert.That (stack.Children.ToArray()[2].Bounds, Is.EqualTo (new Rectangle (220, 0, 30, 100))); + } + + [Test] + public void GetMinimumSizeVertical () + { + var stack = new StackLayout { + Platform = new UnitPlatform (), + IsPlatformEnabled = true, + Spacing = 10, + Children = { + new View {WidthRequest = 100, HeightRequest = 100, IsPlatformEnabled = true}, + new View {WidthRequest = 100, HeightRequest = 100, IsPlatformEnabled = true}, + new View {WidthRequest = 100, HeightRequest = 100, MinimumHeightRequest = 10, IsPlatformEnabled = true} + } + }; + + var result = stack.GetSizeRequest (double.PositiveInfinity, double.PositiveInfinity); + Assert.That (result.Minimum, Is.EqualTo (new Size (100, 230))); + } + + [Test] + public void GetMinimumSizeHorizontal () + { + var stack = new StackLayout { + Platform = new UnitPlatform (), + IsPlatformEnabled = true, + Spacing = 10, + Orientation = StackOrientation.Horizontal, + Children = { + new View {WidthRequest = 100, HeightRequest = 100, IsPlatformEnabled = true}, + new View {WidthRequest = 100, HeightRequest = 100, IsPlatformEnabled = true}, + new View {WidthRequest = 100, HeightRequest = 100, MinimumWidthRequest = 10, IsPlatformEnabled = true} + } + }; + + var result = stack.GetSizeRequest (double.PositiveInfinity, double.PositiveInfinity); + Assert.That (result.Minimum, Is.EqualTo (new Size (230, 100))); + } + + [Test] + public void TestVisibility () + { + View child1, child2; + var stack = new StackLayout { + Platform = new UnitPlatform (), + IsPlatformEnabled = true, + Children = { + (child1 = new View {IsPlatformEnabled = true}), + (child2 = new View {IsPlatformEnabled = true}) + } + }; + + stack.Layout (new Rectangle (0, 0, 100, 100)); + + var size = stack.GetSizeRequest (double.PositiveInfinity, double.PositiveInfinity).Request; + Assert.AreEqual (new Rectangle (0, 0, 100, 20), child1.Bounds); + Assert.AreEqual (new Rectangle (0, 26, 100, 20), child2.Bounds); + Assert.AreEqual (new Size (100, 46), size); + + child1.IsVisible = false; + Assert.False (child1.IsVisible); + Assert.AreEqual (new Rectangle (0, 0, 100, 20), child2.Bounds); + size = stack.GetSizeRequest (double.PositiveInfinity, double.PositiveInfinity).Request; + Assert.AreEqual (new Size (100, 20), size); + + } + + [Test] + public void OffOrientationMinimumSize () + { + var stack = new StackLayout { + Platform = new UnitPlatform (), + IsPlatformEnabled = true, + Spacing = 0 + }; + + stack.Children.Add (new View { + IsPlatformEnabled = true, + WidthRequest = 100, + HeightRequest = 100, + MinimumWidthRequest = 10, + MinimumHeightRequest = 10 + }); + + var result = stack.GetSizeRequest (double.PositiveInfinity, double.PositiveInfinity); + Assert.AreEqual (new Size (10, 10), result.Minimum); + } + + [Test] + public void NestedMinimumSizeOverflow () + { + var stack = new StackLayout { + Platform = new UnitPlatform (), + IsPlatformEnabled = true, + Spacing = 0 + }; + + var hbox = new StackLayout { + IsPlatformEnabled = true, + Spacing = 0, + Orientation = StackOrientation.Horizontal + }; + + View child1, child2; + hbox.Children.Add (child1 = new View { + IsPlatformEnabled = true, + WidthRequest = 100, + HeightRequest = 100, + MinimumWidthRequest = 10, + MinimumHeightRequest = 10 + }); + + hbox.Children.Add (child2 = new View { + IsPlatformEnabled = true, + WidthRequest = 100, + HeightRequest = 100, + MinimumWidthRequest = 10, + MinimumHeightRequest = 10 + }); + + stack.Children.Add (hbox); + + stack.Layout (new Rectangle (0, 0, 70, 70)); + Assert.AreEqual (new Rectangle (0, 0, 70, 70), stack.Bounds); + Assert.AreEqual (new Rectangle (0, 0, 35, 70), child1.Bounds); + Assert.AreEqual (new Rectangle (35, 0, 35, 70), child2.Bounds); + } + + [TestCase (StackOrientation.Vertical, LayoutAlignment.Start, false, 0, 0, 200, 100, 0, 100, 200, 10)] + [TestCase (StackOrientation.Vertical, LayoutAlignment.Start, true, 0, 0, 200, 100, 0, 190, 200, 10)] + [TestCase (StackOrientation.Vertical, LayoutAlignment.Center, false, 0, 0, 200, 100, 0, 100, 200, 10)] + [TestCase (StackOrientation.Vertical, LayoutAlignment.Center, true, 0, 45, 200, 100, 0, 190, 200, 10)] + [TestCase (StackOrientation.Vertical, LayoutAlignment.End, false, 0, 0, 200, 100, 0, 100, 200, 10)] + [TestCase (StackOrientation.Vertical, LayoutAlignment.End, true, 0, 90, 200, 100, 0, 190, 200, 10)] + [TestCase (StackOrientation.Horizontal, LayoutAlignment.Start, false, 0, 0, 100, 200, 100, 0, 10, 200)] + [TestCase (StackOrientation.Horizontal, LayoutAlignment.Start, true, 0, 0, 100, 200, 190, 0, 10, 200)] + [TestCase (StackOrientation.Horizontal, LayoutAlignment.Center, false, 0, 0, 100, 200, 100, 0, 10, 200)] + [TestCase (StackOrientation.Horizontal, LayoutAlignment.Center, true, 45, 0, 100, 200, 190, 0, 10, 200)] + [TestCase (StackOrientation.Horizontal, LayoutAlignment.End, false, 0, 0, 100, 200, 100, 0, 10, 200)] + [TestCase (StackOrientation.Horizontal, LayoutAlignment.End, true, 90, 0, 100, 200, 190, 0, 10, 200)] + public void LayoutExpansion(StackOrientation orientation, LayoutAlignment align, bool expand, double x1, double y1, double w1, double h1, double x2, double y2, double w2, double h2) + { + var options = new LayoutOptions (align, expand); + var stack = new StackLayout { + Platform = new UnitPlatform (), + IsPlatformEnabled = true, + Spacing = 0, + Orientation = orientation + }; + + View child1, child2; + stack.Children.Add (child1 = new View { + IsPlatformEnabled = true, + WidthRequest = 100, + HeightRequest = 100 + }); + + if (orientation == StackOrientation.Vertical) + child1.VerticalOptions = options; + else + child1.HorizontalOptions = options; + + stack.Children.Add (child2 = new View { + IsPlatformEnabled = true, + WidthRequest = 10, + HeightRequest = 10 + }); + + stack.Layout (new Rectangle (0, 0, 200, 200)); + + Assert.AreEqual (new Rectangle (x1, y1, w1, h1), child1.Bounds); + Assert.AreEqual (new Rectangle (x2, y2, w2, h2), child2.Bounds); + } + + [Test] + public void RelayoutOnRemove () + { + var child1 = new BoxView { + IsPlatformEnabled = true, + }; + + var child2 = new BoxView { + IsPlatformEnabled = true, + }; + + var stack = new StackLayout { + IsPlatformEnabled = true, + Platform = new UnitPlatform (), + Children = {child1, child2} + }; + + stack.Layout (new Rectangle (0, 0, 200, 200)); + + Assert.AreEqual (new Rectangle (0, 0, 200, 40), child1.Bounds); + Assert.AreEqual (new Rectangle (0, 46, 200, 40), child2.Bounds); + + stack.Children.RemoveAt (0); + + Assert.AreEqual (new Rectangle (0, 0, 200, 40), child2.Bounds); + } + + [Test] + public void FixedVerticalStackFixesExpander () + { + var child1 = new BoxView { + IsPlatformEnabled = true, + }; + + var child2 = new BoxView { + IsPlatformEnabled = true, + VerticalOptions = LayoutOptions.FillAndExpand + }; + + var stack = new StackLayout { + ComputedConstraint = LayoutConstraint.Fixed, + IsPlatformEnabled = true, + Platform = new UnitPlatform (), + Children = {child1, child2} + }; + + stack.Layout (new Rectangle (0, 0, 200, 200)); + + Assert.AreEqual (LayoutConstraint.Fixed, child2.Constraint); + } + + [Test] + public void HFixedVerticalStackFixesExpander () + { + var child1 = new BoxView { + IsPlatformEnabled = true, + }; + + var child2 = new BoxView { + IsPlatformEnabled = true, + VerticalOptions = LayoutOptions.FillAndExpand + }; + + var stack = new StackLayout { + ComputedConstraint = LayoutConstraint.HorizontallyFixed, + IsPlatformEnabled = true, + Platform = new UnitPlatform (), + Children = {child1, child2} + }; + + stack.Layout (new Rectangle (0, 0, 200, 200)); + + Assert.AreEqual (LayoutConstraint.HorizontallyFixed, child2.Constraint); + } + + [Test] + public void FixedHorizontalStackFixesExpander () + { + var child1 = new BoxView { + IsPlatformEnabled = true, + }; + + var child2 = new BoxView { + IsPlatformEnabled = true, + HorizontalOptions = LayoutOptions.FillAndExpand + }; + + var stack = new StackLayout { + ComputedConstraint = LayoutConstraint.Fixed, + Orientation = StackOrientation.Horizontal, + IsPlatformEnabled = true, + Platform = new UnitPlatform (), + Children = {child1, child2} + }; + + stack.Layout (new Rectangle (0, 0, 200, 200)); + + Assert.AreEqual (LayoutConstraint.Fixed, child2.Constraint); + } + + [Test] + public void HFixedHorizontalStackFixesExpander () + { + var child1 = new BoxView { + IsPlatformEnabled = true, + }; + + var child2 = new BoxView { + IsPlatformEnabled = true, + HorizontalOptions = LayoutOptions.FillAndExpand + }; + + var stack = new StackLayout { + ComputedConstraint = LayoutConstraint.VerticallyFixed, + Orientation = StackOrientation.Horizontal, + IsPlatformEnabled = true, + Platform = new UnitPlatform (), + Children = {child1, child2} + }; + + stack.Layout (new Rectangle (0, 0, 200, 200)); + + Assert.AreEqual (LayoutConstraint.VerticallyFixed, child2.Constraint); + } + + [Ignore ("This test intended to test bz38416 however I just for the life of me cant figure it out in simplified form. I am failure.")] + [Test] + public void TheWTFTest () + { + var child1 = new BoxView { + IsPlatformEnabled = true, + WidthRequest = 20, + HeightRequest = 20, + MinimumWidthRequest = 10, + MinimumHeightRequest = 10, + VerticalOptions = LayoutOptions.FillAndExpand + }; + + var stack = new StackLayout { + IsPlatformEnabled = true, + Platform = new UnitPlatform (), + Children = {child1} + }; + + stack.Layout (new Rectangle (0, 0, 100, 100)); + } + } +} |