diff options
Diffstat (limited to 'Xamarin.Forms.Core.UnitTests/GridTests.cs')
-rw-r--r-- | Xamarin.Forms.Core.UnitTests/GridTests.cs | 1569 |
1 files changed, 1569 insertions, 0 deletions
diff --git a/Xamarin.Forms.Core.UnitTests/GridTests.cs b/Xamarin.Forms.Core.UnitTests/GridTests.cs new file mode 100644 index 00000000..203d3b64 --- /dev/null +++ b/Xamarin.Forms.Core.UnitTests/GridTests.cs @@ -0,0 +1,1569 @@ +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Xamarin.Forms.Core.UnitTests +{ + [TestFixture] + public class GridTests : 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 ThrowsOnNullAdd () + { + var layout = new Grid (); + + Assert.Throws<ArgumentNullException> (() => layout.Children.Add (null)); + } + + [Test] + public void ThrowsOnNullRemove () + { + var layout = new Grid (); + + Assert.Throws<ArgumentNullException> (() => layout.Children.Remove (null)); + } + + [Test] + public void TestBasicVerticalLayout () + { + var platform = new UnitPlatform (); + var layout = new Grid (); + layout.Platform = platform; + + var label1 = new Label {Platform = platform, IsPlatformEnabled = true}; + var label2 = new Label {Platform = platform, IsPlatformEnabled = true}; + var label3 = new Label {Platform = platform, IsPlatformEnabled = true}; + + layout.Children.AddVertical (new View[] { + label1, + label2, + label3 + }); + + layout.Layout (new Rectangle (0, 0, 912, 912)); + + Assert.AreEqual (912, layout.Width); + Assert.AreEqual (912, layout.Height); + + Assert.AreEqual (new Rectangle (0, 0, 912, 300), label1.Bounds); + Assert.AreEqual (new Rectangle (0, 306, 912, 300), label2.Bounds); + Assert.AreEqual (new Rectangle (0, 612, 912, 300), label3.Bounds); + } + + [Test] + public void TestBasicHorizontalLayout () + { + var platform = new UnitPlatform (); + var layout = new Grid (); + layout.Platform = platform; + + var label1 = new Label {Platform = platform, IsPlatformEnabled = true}; + var label2 = new Label {Platform = platform, IsPlatformEnabled = true}; + var label3 = new Label {Platform = platform, IsPlatformEnabled = true}; + + layout.Children.AddHorizontal (new View[] { + label1, + label2, + label3 + }); + + layout.Layout (new Rectangle (0, 0, 912, 912)); + + Assert.AreEqual (912, layout.Width); + Assert.AreEqual (912, layout.Height); + + Assert.AreEqual (new Rectangle (0, 0, 300, 912), label1.Bounds); + Assert.AreEqual (new Rectangle (306, 0, 300, 912), label2.Bounds); + Assert.AreEqual (new Rectangle (612, 0, 300, 912), label3.Bounds); + } + + [Test] + public void TestVerticalExpandStart () + { + var platform = new UnitPlatform (); + var layout = new Grid (); + layout.Platform = platform; + + var label1 = new Label {Platform = platform, IsPlatformEnabled = true}; + var label2 = new Label {Platform = platform, IsPlatformEnabled = true}; + + layout.RowDefinitions = new RowDefinitionCollection { + new RowDefinition { Height = new GridLength (1, GridUnitType.Star) }, + new RowDefinition { Height = GridLength.Auto}, + }; + layout.Children.Add (label1, 0, 0); + layout.Children.Add (label2, 0, 1); + + layout.Layout (new Rectangle (0, 0, 1000, 1000)); + + Assert.AreEqual (1000, layout.Width); + Assert.AreEqual (1000, layout.Height); + + Assert.AreEqual (new Rectangle (0, 0, 1000, 1000 - 20 - layout.RowSpacing), label1.Bounds); + Assert.AreEqual (new Rectangle (0, 1000 - 20, 1000, 20), label2.Bounds); + } + + [Test] + public void TestHorizontalExpandStart () + { + var platform = new UnitPlatform (); + var layout = new Grid (); + layout.Platform = platform; + + var label1 = new Label { Platform = platform, IsPlatformEnabled = true }; + var label2 = new Label { Platform = platform, IsPlatformEnabled = true }; + + layout.ColumnDefinitions = new ColumnDefinitionCollection { + new ColumnDefinition { Width = new GridLength (1, GridUnitType.Star) }, + new ColumnDefinition { Width = GridLength.Auto }, + }; + layout.Children.Add (label1, 0, 0); + layout.Children.Add (label2, 1, 0); + + layout.Layout (new Rectangle (0, 0, 1000, 1000)); + + Assert.AreEqual (1000, layout.Width); + Assert.AreEqual (1000, layout.Height); + + Assert.AreEqual (new Rectangle (0, 0, 1000 - 106, 1000), label1.Bounds); + Assert.AreEqual (new Rectangle (1000 - 100, 0, 100, 1000), label2.Bounds); + } + + [Test] + public void TestVerticalExpandEnd () + { + var platform = new UnitPlatform (); + var layout = new Grid (); + layout.Platform = platform; + + var label1 = new Label {Platform = platform, IsPlatformEnabled = true}; + var label2 = new Label {Platform = platform, IsPlatformEnabled = true}; + + layout.RowDefinitions = new RowDefinitionCollection { + new RowDefinition { Height = GridLength.Auto}, + new RowDefinition { Height = new GridLength (1, GridUnitType.Star) }, + }; + layout.Children.Add (label1, 0, 0); + layout.Children.Add (label2, 0, 1); + + layout.Layout (new Rectangle (0, 0, 1000, 1000)); + + Assert.AreEqual (1000, layout.Width); + Assert.AreEqual (1000, layout.Height); + + Assert.AreEqual (new Rectangle (0, 0, 1000, 20), label1.Bounds); + Assert.AreEqual (new Rectangle (0, 26, 1000, 1000 - 26), label2.Bounds); + } + + [Test] + public void TestHorizontalExpandEnd () + { + var platform = new UnitPlatform (); + var layout = new Grid (); + layout.Platform = platform; + + var label1 = new Label { Platform = platform, IsPlatformEnabled = true}; + var label2 = new Label {Platform = platform, IsPlatformEnabled = true}; + + layout.ColumnDefinitions = new ColumnDefinitionCollection { + new ColumnDefinition { Width = GridLength.Auto }, + new ColumnDefinition { Width = new GridLength (1, GridUnitType.Star) }, + }; + + layout.Children.Add (label1, 0, 0); + layout.Children.Add (label2, 1, 0); + + layout.Layout (new Rectangle (0, 0, 1000, 1000)); + + Assert.AreEqual (1000, layout.Width); + Assert.AreEqual (1000, layout.Height); + + Assert.AreEqual (new Rectangle (0, 0, 100, 1000), label1.Bounds); + Assert.AreEqual (new Rectangle (106, 0, 1000 - 106, 1000), label2.Bounds); + } + + [Test] + public void TestVerticalExpandMiddle () + { + var platform = new UnitPlatform (); + var layout = new Grid (); + layout.Platform = platform; + + var label1 = new Label {Platform = platform, IsPlatformEnabled = true}; + var label2 = new Label {Platform = platform, IsPlatformEnabled = true}; + var label3 = new Label {Platform = platform, IsPlatformEnabled = true}; + + layout.RowDefinitions = new RowDefinitionCollection { + new RowDefinition { Height = GridLength.Auto}, + new RowDefinition { Height = new GridLength (1, GridUnitType.Star) }, + new RowDefinition { Height = GridLength.Auto} + }; + layout.Children.Add (label1, 0, 0); + layout.Children.Add (label2, 0, 1); + layout.Children.Add (label3, 0, 2); + + layout.Layout (new Rectangle (0, 0, 1000, 1000)); + + Assert.AreEqual (1000, layout.Width); + Assert.AreEqual (1000, layout.Height); + + Assert.AreEqual (new Rectangle (0, 0, 1000, 20), label1.Bounds); + Assert.AreEqual (new Rectangle (0, 26, 1000, 1000 - 52), label2.Bounds); + Assert.AreEqual (new Rectangle (0, 980, 1000, 20), label3.Bounds); + } + + [Test] + public void TestHorizontalExpandMiddle () + { + var platform = new UnitPlatform (); + var layout = new Grid (); + layout.Platform = platform; + + var label1 = new Label {Platform = platform, IsPlatformEnabled = true}; + var label2 = new Label {Platform = platform, IsPlatformEnabled = true}; + var label3 = new Label {Platform = platform, IsPlatformEnabled = true}; + + layout.ColumnDefinitions = new ColumnDefinitionCollection { + new ColumnDefinition { Width = GridLength.Auto }, + new ColumnDefinition { Width = new GridLength (1, GridUnitType.Star) }, + new ColumnDefinition { Width = GridLength.Auto }, + }; + + layout.Children.Add (label1, 0, 0); + layout.Children.Add (label2, 1, 0); + layout.Children.Add (label3, 2, 0); + + layout.Layout (new Rectangle (0, 0, 1000, 1000)); + + Assert.AreEqual (1000, layout.Width); + Assert.AreEqual (1000, layout.Height); + + Assert.AreEqual (new Rectangle (0, 0, 100, 1000), label1.Bounds); + Assert.AreEqual (new Rectangle (106, 0, 1000 - 212, 1000), label2.Bounds); + Assert.AreEqual (new Rectangle (900, 0, 100, 1000), label3.Bounds); + } + + [Test] + public void TestTableNoExpand () + { + var platform = new UnitPlatform (); + var layout = new Grid (); + layout.Platform = platform; + + var label1 = new Label {Platform = platform, IsPlatformEnabled = true}; + var label2 = new Label {Platform = platform, IsPlatformEnabled = true}; + var label3 = new Label {Platform = platform, IsPlatformEnabled = true}; + var label4 = new Label {Platform = platform, IsPlatformEnabled = true}; + + layout.Children.Add (label1, 0, 0); + layout.Children.Add (label2, 1, 0); + layout.Children.Add (label3, 0, 1); + layout.Children.Add (label4, 1, 1); + + layout.ColumnDefinitions = new ColumnDefinitionCollection { + new ColumnDefinition { Width = GridLength.Auto }, + new ColumnDefinition { Width = GridLength.Auto }, + }; + layout.RowDefinitions = new RowDefinitionCollection { + new RowDefinition { Height = GridLength.Auto}, + new RowDefinition { Height = GridLength.Auto} + }; + + layout.Layout (new Rectangle (0, 0, 1000, 1000)); + + Assert.AreEqual (1000, layout.Width); + Assert.AreEqual (1000, layout.Height); + + Assert.AreEqual (new Rectangle (0, 0, 100, 20), label1.Bounds); + Assert.AreEqual (new Rectangle (106, 0, 100, 20), label2.Bounds); + Assert.AreEqual (new Rectangle (0, 26, 100, 20), label3.Bounds); + Assert.AreEqual (new Rectangle (106, 26, 100, 20), label4.Bounds); + } + + [Test] + public void TestTableExpand () + { + var platform = new UnitPlatform (); + var layout = new Grid (); + layout.Platform = platform; + + var label1 = new Label {Platform = platform, IsPlatformEnabled = true}; + var label2 = new Label {Platform = platform, IsPlatformEnabled = true}; + var label3 = new Label {Platform = platform, IsPlatformEnabled = true}; + var label4 = new Label {Platform = platform, IsPlatformEnabled = true}; + + layout.ColumnDefinitions = new ColumnDefinitionCollection { + new ColumnDefinition { Width = GridLength.Auto }, + new ColumnDefinition { Width = new GridLength (1, GridUnitType.Star) }, + }; + + layout.Children.Add (label1, 0, 0); + layout.Children.Add (label2, 1, 0); + layout.Children.Add (label3, 0, 1); + layout.Children.Add (label4, 1, 1); + + layout.Layout (new Rectangle (0, 0, 1000, 1000)); + + Assert.AreEqual (1000, layout.Width); + Assert.AreEqual (1000, layout.Height); + + Assert.AreEqual (new Rectangle (0, 0, 100, 497), label1.Bounds); + Assert.AreEqual (new Rectangle (106, 0, 894, 497), label2.Bounds); + Assert.AreEqual (new Rectangle (0, 503, 100, 497), label3.Bounds); + Assert.AreEqual (new Rectangle (106, 503, 894, 497), label4.Bounds); + } + + [Test] + public void TestTableSpan () + { + var platform = new UnitPlatform (); + var layout = new Grid (); + layout.Platform = platform; + + var label1 = new Label {Platform = platform, IsPlatformEnabled = true}; + var label2 = new Label {Platform = platform, IsPlatformEnabled = true}; + var label3 = new Label {Platform = platform, IsPlatformEnabled = true}; + + layout.Children.Add (label1, 0, 2, 0, 1); + layout.Children.Add (label2, 0, 1, 1, 2); + layout.Children.Add (label3, 1, 2, 1, 2); + + layout.ColumnDefinitions = new ColumnDefinitionCollection { + new ColumnDefinition { Width = GridLength.Auto }, + new ColumnDefinition { Width = GridLength.Auto }, + }; + layout.RowDefinitions = new RowDefinitionCollection { + new RowDefinition { Height = GridLength.Auto}, + new RowDefinition { Height = GridLength.Auto} + }; + + layout.Layout (new Rectangle (0, 0, 1000, 1000)); + + Assert.AreEqual (1000, layout.Width); + Assert.AreEqual (1000, layout.Height); + + Assert.AreEqual (new Rectangle (0, 0, 206, 20), label1.Bounds); + Assert.AreEqual (new Rectangle (0, 26, 100, 20), label2.Bounds); + Assert.AreEqual (new Rectangle (106, 26, 100, 20), label3.Bounds); + } + + [Test] + public void TestTableExpandedSpan () + { + var platform = new UnitPlatform (); + var layout = new Grid (); + layout.Platform = platform; + + var label1 = new Label {Platform = platform, IsPlatformEnabled = true}; + var label2 = new Label {Platform = platform, IsPlatformEnabled = true}; + var label3 = new Label {Platform = platform, IsPlatformEnabled = true}; + + layout.ColumnDefinitions = new ColumnDefinitionCollection { + new ColumnDefinition { Width = new GridLength (1, GridUnitType.Star) }, + new ColumnDefinition { Width = new GridLength (1, GridUnitType.Star) }, + }; + layout.RowDefinitions = new RowDefinitionCollection { + new RowDefinition { Height = GridLength.Auto}, + new RowDefinition { Height = GridLength.Auto} + }; + + layout.Children.Add (label1, 0, 2, 0, 1); + layout.Children.Add (label2, 0, 1, 1, 2); + layout.Children.Add (label3, 1, 2, 1, 2); + + layout.Layout (new Rectangle (0, 0, 1000, 1000)); + + Assert.AreEqual (1000, layout.Width); + Assert.AreEqual (1000, layout.Height); + + Assert.AreEqual (new Rectangle (0, 0, 1000, 20), label1.Bounds); + Assert.AreEqual (new Rectangle (0, 26, 497, 20), label2.Bounds); + Assert.AreEqual (new Rectangle (503, 26, 497, 20), label3.Bounds); + } + + [Test] + public void TestInvalidSet () + { + var platform = new UnitPlatform (); + var layout = new Grid (); + layout.Platform = platform; + + var label1 = new Label {Platform = platform, IsPlatformEnabled = true}; + + bool thrown = false; + + try { + layout.Children.Add (label1, 2, 1, 0, 1); + } catch (ArgumentOutOfRangeException) { + thrown = true; + } + + Assert.True (thrown); + } + + [Test] + public void TestCentering () + { + var platform = new UnitPlatform (); + var layout = new Grid (); + layout.Platform = platform; + + var label1 = new Label {Platform = platform, IsPlatformEnabled = true, HorizontalOptions = LayoutOptions.Center, VerticalOptions = LayoutOptions.Center }; + layout.ColumnDefinitions = new ColumnDefinitionCollection { + new ColumnDefinition () {Width = new GridLength (1, GridUnitType.Star)}, + }; + layout.RowDefinitions = new RowDefinitionCollection { + new RowDefinition () {Height = new GridLength (1,GridUnitType.Star)}, + }; + + layout.Children.Add (label1); + + layout.Layout (new Rectangle (0, 0, 1000, 1000)); + + Assert.AreEqual (new Rectangle (450, 490, 100, 20), label1.Bounds); + } + + [Test] + public void TestStart () + { + var platform = new UnitPlatform (); + var layout = new Grid (); + layout.Platform = platform; + + var label1 = new Label { Platform = platform, IsPlatformEnabled = true, HorizontalOptions = LayoutOptions.Start, VerticalOptions = LayoutOptions.StartAndExpand }; + + layout.Children.AddVertical (label1); + layout.ColumnDefinitions = new ColumnDefinitionCollection { + new ColumnDefinition () {Width = new GridLength (1, GridUnitType.Star)}, + }; + layout.RowDefinitions = new RowDefinitionCollection { + new RowDefinition () {Height = new GridLength (1,GridUnitType.Star)}, + }; + + layout.Layout (new Rectangle (0, 0, 1000, 1000)); + + Assert.AreEqual (new Rectangle (0, 0, 100, 20), label1.Bounds); + } + + [Test] + public void TestEnd () + { + var platform = new UnitPlatform (); + var layout = new Grid (); + layout.Platform = platform; + + var label1 = new Label { Platform = platform, IsPlatformEnabled = true, HorizontalOptions = LayoutOptions.End, VerticalOptions = LayoutOptions.EndAndExpand }; + + layout.Children.AddVertical (label1); + layout.ColumnDefinitions = new ColumnDefinitionCollection { + new ColumnDefinition () {Width = new GridLength (1, GridUnitType.Star)}, + }; + layout.RowDefinitions = new RowDefinitionCollection { + new RowDefinition () {Height = new GridLength (1,GridUnitType.Star)}, + }; + + layout.Layout (new Rectangle (0, 0, 1000, 1000)); + + Assert.AreEqual (new Rectangle (900, 980, 100, 20), label1.Bounds); + } + + [Test] + public void TestDefaultRowSpacing () + { + var layout = new Grid (); + + bool preferredSizeChanged = false; + layout.MeasureInvalidated += (sender, args) => { + preferredSizeChanged = true; + }; + + layout.RowSpacing = layout.RowSpacing; + + Assert.False (preferredSizeChanged); + + layout.RowSpacing = 10; + + Assert.True (preferredSizeChanged); + } + + [Test] + public void TestDefaultColumnSpacing () + { + var layout = new Grid (); + + bool preferredSizeChanged = false; + layout.MeasureInvalidated += (sender, args) => { + preferredSizeChanged = true; + }; + + layout.ColumnSpacing = layout.ColumnSpacing; + + Assert.False (preferredSizeChanged); + + layout.ColumnSpacing = 10; + + Assert.True (preferredSizeChanged); + } + + [Test] + public void TestAddCell () + { + var layout = new Grid (); + bool preferredSizeChanged = false; + layout.MeasureInvalidated += (sender, args) => preferredSizeChanged = true; + + Assert.False (preferredSizeChanged); + + layout.Children.Add (new Label (), 0, 0); + + Assert.True (preferredSizeChanged); + } + + [Test] + public void TestMoveCell () + { + var layout = new Grid (); + var label = new Label (); + layout.Children.Add (label, 0, 0); + + bool preferredSizeChanged = false; + layout.MeasureInvalidated += (sender, args) => { + preferredSizeChanged = true; + }; + + Assert.False (preferredSizeChanged); + Grid.SetRow (label, 2); + Assert.True (preferredSizeChanged); + + preferredSizeChanged = false; + Assert.False (preferredSizeChanged); + Grid.SetColumn (label, 2); + Assert.True (preferredSizeChanged); + + preferredSizeChanged = false; + Assert.False (preferredSizeChanged); + Grid.SetRowSpan (label, 2); + Assert.True (preferredSizeChanged); + + preferredSizeChanged = false; + Assert.False (preferredSizeChanged); + Grid.SetColumnSpan (label, 2); + Assert.True (preferredSizeChanged); + } + + [Test] + public void TestInvalidBottomAdd () + { + var layout = new Grid (); + + Assert.Throws<ArgumentOutOfRangeException> (() => layout.Children.Add (new View (), 0, 1, 1, 0)); + } + + [Test] + public void TestZeroSizeConstraints () + { + var layout = new Grid {Platform = new UnitPlatform ()}; + + Assert.AreEqual (new Size (0, 0), layout.GetSizeRequest (0, 0).Request); + Assert.AreEqual (new Size (0, 0), layout.GetSizeRequest (0, 10).Request); + Assert.AreEqual (new Size (0, 0), layout.GetSizeRequest (10, 0).Request); + } + + [Test] + public void TestSizeRequest () + { + var platform = new UnitPlatform (); + var layout = new Grid {Platform = platform, IsPlatformEnabled = true}; + layout.Children.AddVertical (new[] { + new View {Platform = platform, IsPlatformEnabled = true}, + new View {Platform = platform, IsPlatformEnabled = true}, + new View {Platform = platform, IsPlatformEnabled = true} + }); + + var result = layout.GetSizeRequest (double.PositiveInfinity, double.PositiveInfinity).Request; + Assert.AreEqual (new Size (100, 72), result); + } + + [Test] + public void TestLimitedSizeRequest () + { + var platform = new UnitPlatform (); + var layout = new Grid {Platform = platform, IsPlatformEnabled = true}; + layout.Children.AddVertical (new[] { + new View {Platform = platform, IsPlatformEnabled = true}, + new View {Platform = platform, IsPlatformEnabled = true}, + new View {Platform = platform, IsPlatformEnabled = true} + }); + + var result = layout.GetSizeRequest (10, 10).Request; + Assert.AreEqual (new Size (100, 72), result); + } + + [Test] + public void TestLimitedWidthSizeRequest () + { + var platform = new UnitPlatform (); + var layout = new Grid {Platform = platform, IsPlatformEnabled = true}; + layout.Children.AddVertical (new[] { + new View {Platform = platform, IsPlatformEnabled = true}, + new View {Platform = platform, IsPlatformEnabled = true}, + new View {Platform = platform, IsPlatformEnabled = true} + }); + + var result = layout.GetSizeRequest (10, double.PositiveInfinity).Request; + Assert.AreEqual (new Size (100, 72), result); + } + + [Test] + public void TestLimitedHeightSizeRequest () + { + + var platform = new UnitPlatform (); + var layout = new Grid {Platform = platform, IsPlatformEnabled = true}; + layout.Children.AddVertical (new[] { + new View {Platform = platform, IsPlatformEnabled = true}, + new View {Platform = platform, IsPlatformEnabled = true}, + new View {Platform = platform, IsPlatformEnabled = true} + }); + + var result = layout.GetSizeRequest (double.PositiveInfinity, 10).Request; + Assert.AreEqual (new Size (100, 72), result); + } + + [Test] + public void IgnoresInvisibleChildren () + { + var platform = new UnitPlatform (); + var layout = new Grid {Platform = platform}; + + var label1 = new Label { Platform = platform, IsVisible = false, IsPlatformEnabled = true, VerticalOptions = LayoutOptions.FillAndExpand }; + var label2 = new Label { Platform = platform, IsPlatformEnabled = true}; + + layout.Children.AddVertical (label1); + layout.Children.AddVertical (label2); + + layout.ColumnDefinitions = new ColumnDefinitionCollection { + new ColumnDefinition { Width = GridLength.Auto }, + }; + layout.RowDefinitions = new RowDefinitionCollection { + new RowDefinition { Height = GridLength.Auto}, + new RowDefinition { Height = GridLength.Auto}, + }; + + layout.Layout (new Rectangle (0, 0, 1000, 1000)); + + Assert.AreEqual (1000, layout.Width); + Assert.AreEqual (1000, layout.Height); + + Assert.AreEqual (new Rectangle (0, 0, -1, -1), label1.Bounds); + Assert.AreEqual (new Rectangle (0, 6, 100, 20), label2.Bounds); + } + + [Test] + public void TestSizeRequestWithPadding () + { + var platform = new UnitPlatform (); + var layout = new Grid {Platform = platform, IsPlatformEnabled = true, Padding = new Thickness(20, 10, 15, 5)}; + layout.Children.AddVertical (new[] { + new View {Platform = platform, IsPlatformEnabled = true}, + new View {Platform = platform, IsPlatformEnabled = true}, + new View {Platform = platform, IsPlatformEnabled = true} + }); + + var result = layout.GetSizeRequest (double.PositiveInfinity, double.PositiveInfinity).Request; + Assert.AreEqual (new Size (135, 87), result); + } + + [Test] + public void InvalidCallsToStaticMethods () + { + Assert.Throws<ArgumentException> (() => Grid.SetRow (new Label (), -1)); + Assert.Throws<ArgumentException> (() => Grid.SetColumn (new Label (), -1)); + Assert.Throws<ArgumentException> (() => Grid.SetRowSpan (new Label (), 0)); + Assert.Throws<ArgumentException> (() => Grid.SetColumnSpan (new Label (), 0)); + } + + [Test] + public void TestAddedBP () + { + var platform = new UnitPlatform (); + + var labela0 = new Label {Platform = platform, IsPlatformEnabled = true}; + var labela1 = new Label { Platform = platform, IsPlatformEnabled = true }; + Grid.SetColumn (labela1, 1); + var labelb1 = new Label {Platform = platform, IsPlatformEnabled = true}; + Grid.SetRow (labelb1, 1); + Grid.SetColumn (labelb1, 1); + var labelc = new Label {Platform = platform, IsPlatformEnabled = true}; + Grid.SetRow (labelc, 2); + Grid.SetColumnSpan (labelc, 2); + + var layout = new Grid { + Platform = platform, + Children = { + labela0, + labela1, + labelb1, + labelc + } + }; + + layout.ColumnDefinitions = new ColumnDefinitionCollection { + new ColumnDefinition { Width = GridLength.Auto }, + new ColumnDefinition { Width = GridLength.Auto }, + }; + layout.RowDefinitions = new RowDefinitionCollection { + new RowDefinition { Height = GridLength.Auto}, + new RowDefinition { Height = GridLength.Auto}, + new RowDefinition { Height = GridLength.Auto}, + }; + + layout.Layout (new Rectangle (0, 0, 1000, 1000)); + + Assert.AreEqual (1000, layout.Width); + Assert.AreEqual (1000, layout.Height); + + Assert.AreEqual (new Rectangle (0, 0, 100, 20), labela0.Bounds); + Assert.AreEqual (new Rectangle (106, 0, 100, 20), labela1.Bounds); + Assert.AreEqual (new Rectangle (106, 26, 100, 20), labelb1.Bounds); + Assert.AreEqual (new Rectangle (0, 52, 206, 20), labelc.Bounds); + } + + [Test] + public void Remove () + { + var platform = new UnitPlatform(); + + var labela0 = new Label { Platform = platform, IsPlatformEnabled = true }; + var labela1 = new Label { Platform = platform, IsPlatformEnabled = true }; + Grid.SetColumn(labela1, 1); + var labelb1 = new Label { Platform = platform, IsPlatformEnabled = true }; + Grid.SetRow(labelb1, 1); + Grid.SetColumn(labelb1, 1); + var labelc = new Label { Platform = platform, IsPlatformEnabled = true }; + Grid.SetRow(labelc, 2); + Grid.SetColumnSpan(labelc, 2); + + var layout = new Grid { + Platform = platform, + Children = { + labela0, + labela1, + labelb1, + labelc + } + }; + + layout.Children.Remove (labela0); + Assert.False (layout.LogicalChildren.Contains (labela0)); + } + + [Test] + public void TestAbsoluteLayout () + { + var platform = new UnitPlatform (); + var layout = new Grid (); + layout.Platform = platform; + + var label1 = new Label {Platform = platform, IsPlatformEnabled = true}; + var label2 = new Label {Platform = platform, IsPlatformEnabled = true}; + var label3 = new Label {Platform = platform, IsPlatformEnabled = true}; + + layout.ColumnDefinitions = new ColumnDefinitionCollection { + new ColumnDefinition {Width = new GridLength (150)}, + new ColumnDefinition {Width = new GridLength (150)}, + new ColumnDefinition {Width = new GridLength (150)}, + }; + layout.RowDefinitions = new RowDefinitionCollection { + new RowDefinition {Height = new GridLength (30)}, + new RowDefinition {Height = new GridLength (30)}, + new RowDefinition {Height = new GridLength (30)}, + }; + layout.Children.Add (label1, 0, 0); + layout.Children.Add (label2, 1, 1); + layout.Children.Add (label3, 2, 2); + + + layout.Layout (new Rectangle (0, 0, 1000, 1000)); + + Assert.AreEqual (1000, layout.Width); + Assert.AreEqual (1000, layout.Height); + + Assert.AreEqual (new Rectangle (0, 0, 150, 30), label1.Bounds); + Assert.AreEqual (new Rectangle (156, 36, 150, 30), label2.Bounds); + Assert.AreEqual (new Rectangle (312, 72, 150, 30), label3.Bounds); + } + + [Test] + public void TestAbsoluteLayoutWithSpans () + { + var platform = new UnitPlatform (); + var layout = new Grid (); + layout.Platform = platform; + + var label1 = new Label {Platform = platform, IsPlatformEnabled = true}; + var label2 = new Label {Platform = platform, IsPlatformEnabled = true}; + var label3 = new Label {Platform = platform, IsPlatformEnabled = true}; + + layout.ColumnDefinitions = new ColumnDefinitionCollection { + new ColumnDefinition {Width = new GridLength (150)}, + new ColumnDefinition {Width = new GridLength (150)}, + new ColumnDefinition {Width = new GridLength (150)}, + }; + layout.RowDefinitions = new RowDefinitionCollection { + new RowDefinition {Height = new GridLength (30)}, + new RowDefinition {Height = new GridLength (30)}, + new RowDefinition {Height = new GridLength (30)}, + }; + layout.Children.Add (label1, 0, 2, 0, 1); + layout.Children.Add (label2, 2, 3, 0, 2); + layout.Children.Add (label3, 1, 2); + + + layout.Layout (new Rectangle (0, 0, 1000, 1000)); + + Assert.AreEqual (1000, layout.Width); + Assert.AreEqual (1000, layout.Height); + + Assert.AreEqual (new Rectangle (0, 0, 306, 30), label1.Bounds); + Assert.AreEqual (new Rectangle (312, 0, 150, 66), label2.Bounds); + Assert.AreEqual (new Rectangle (156, 72, 150, 30), label3.Bounds); + } + + [Test] + public void TestStarLayout () + { + var platform = new UnitPlatform (); + var layout = new Grid (); + layout.Platform = platform; + + var label1 = new Label {Platform = platform, IsPlatformEnabled = true}; + var label2 = new Label {Platform = platform, IsPlatformEnabled = true}; + var label3 = new Label {Platform = platform, IsPlatformEnabled = true}; + + layout.ColumnDefinitions = new ColumnDefinitionCollection { + new ColumnDefinition {Width = new GridLength (1, GridUnitType.Star)}, + new ColumnDefinition {Width = new GridLength (1, GridUnitType.Star)}, + new ColumnDefinition {Width = new GridLength (1, GridUnitType.Star)}, + }; + layout.RowDefinitions = new RowDefinitionCollection { + new RowDefinition {Height = new GridLength (1, GridUnitType.Star)}, + new RowDefinition {Height = new GridLength (1, GridUnitType.Star)}, + new RowDefinition {Height = new GridLength (1, GridUnitType.Star)}, + }; + layout.Children.Add (label1, 0, 0); + layout.Children.Add (label2, 1, 1); + layout.Children.Add (label3, 2, 2); + + var request = layout.GetSizeRequest (1002, 462); + Assert.AreEqual (312, request.Request.Width); + Assert.AreEqual (72, request.Request.Height); + + layout.Layout (new Rectangle (0, 0, 1002, 462)); + Assert.AreEqual (1002, layout.Width); + Assert.AreEqual (462, layout.Height); + + Assert.AreEqual (new Rectangle (0, 0, 330, 150), label1.Bounds); + Assert.AreEqual (new Rectangle (336, 156, 330, 150), label2.Bounds); + Assert.AreEqual (new Rectangle (672, 312, 330, 150), label3.Bounds); + } + + [Test] + public void TestStarLayoutWithSpans () + { + var platform = new UnitPlatform (); + var layout = new Grid (); + layout.Platform = platform; + + var label1 = new Label {Platform = platform, IsPlatformEnabled = true}; + var label2 = new Label {Platform = platform, IsPlatformEnabled = true}; + var label3 = new Label {Platform = platform, IsPlatformEnabled = true}; + + layout.ColumnDefinitions = new ColumnDefinitionCollection { + new ColumnDefinition {Width = new GridLength (1, GridUnitType.Star)}, + new ColumnDefinition {Width = new GridLength (1, GridUnitType.Star)}, + new ColumnDefinition {Width = new GridLength (1, GridUnitType.Star)}, + }; + layout.RowDefinitions = new RowDefinitionCollection { + new RowDefinition {Height = new GridLength (1, GridUnitType.Star)}, + new RowDefinition {Height = new GridLength (1, GridUnitType.Star)}, + new RowDefinition {Height = new GridLength (1, GridUnitType.Star)}, + }; + layout.Children.Add (label1, 0, 2, 0, 1); + layout.Children.Add (label2, 2, 3, 0, 2); + layout.Children.Add (label3, 1, 2); + + layout.Layout (new Rectangle (0, 0, 1002, 462)); + + Assert.AreEqual (1002, layout.Width); + Assert.AreEqual (462, layout.Height); + + Assert.AreEqual (new Rectangle (0, 0, 666, 150), label1.Bounds); + Assert.AreEqual (new Rectangle (672, 0, 330, 306), label2.Bounds); + Assert.AreEqual (new Rectangle (336, 312, 330, 150), label3.Bounds); + } + + [Test] + public void TestAutoLayout () + { + var platform = new UnitPlatform (); + var layout = new Grid (); + layout.Platform = platform; + + var label1 = new Label {Platform = platform, IsPlatformEnabled = true}; + var label2 = new Label {Platform = platform, IsPlatformEnabled = true}; + var label3 = new Label {Platform = platform, IsPlatformEnabled = true}; + + layout.ColumnDefinitions = new ColumnDefinitionCollection { + new ColumnDefinition {Width = GridLength.Auto}, + new ColumnDefinition {Width = GridLength.Auto}, + new ColumnDefinition {Width = GridLength.Auto}, + }; + layout.RowDefinitions = new RowDefinitionCollection { + new RowDefinition {Height = GridLength.Auto}, + new RowDefinition {Height = GridLength.Auto}, + new RowDefinition {Height = GridLength.Auto}, + }; + layout.Children.Add (label1, 0, 0); + layout.Children.Add (label2, 1, 1); + layout.Children.Add (label3, 2, 2); + + + layout.Layout (new Rectangle (0, 0, 1000, 1000)); + + Assert.AreEqual (1000, layout.Width); + Assert.AreEqual (1000, layout.Height); + + Assert.AreEqual (new Rectangle (0, 0, 100, 20), label1.Bounds); + Assert.AreEqual (new Rectangle (106, 26, 100, 20), label2.Bounds); + Assert.AreEqual (new Rectangle (212, 52, 100, 20), label3.Bounds); + } + + [Test] + public void TestAutoLayoutWithSpans () + { + var platform = new UnitPlatform (); + var layout = new Grid (); + layout.Platform = platform; + + var label1 = new Label { Platform = platform, IsPlatformEnabled = true, WidthRequest = 150, Text = "label1" }; + var label2 = new Label { Platform = platform, IsPlatformEnabled = true, HeightRequest = 50, Text = "label2" }; + var label3 = new Label { Platform = platform, IsPlatformEnabled = true, Text = "label3" }; + + layout.ColumnDefinitions = new ColumnDefinitionCollection { + new ColumnDefinition {Width = GridLength.Auto}, + new ColumnDefinition {Width = GridLength.Auto}, + new ColumnDefinition {Width = GridLength.Auto}, + }; + layout.RowDefinitions = new RowDefinitionCollection { + new RowDefinition {Height = GridLength.Auto}, + new RowDefinition {Height = GridLength.Auto}, + new RowDefinition {Height = GridLength.Auto}, + }; + layout.Children.Add (label1, 0, 2, 0, 1); + layout.Children.Add (label2, 2, 3, 0, 2); + layout.Children.Add (label3, 1, 2); + + layout.Layout (new Rectangle (0, 0, 1002, 462)); + + Assert.AreEqual (1002, layout.Width); + Assert.AreEqual (462, layout.Height); + + Assert.AreEqual (new Rectangle (0, 0, 150, 20), label1.Bounds); + Assert.AreEqual (new Rectangle (156, 0, 100, 50), label2.Bounds); + Assert.AreEqual (new Rectangle (50, 56, 100, 20), label3.Bounds); + } + + [Test] + public void AutoLayoutWithComplexSpans () + { + var platform = new UnitPlatform (); + var layout = new Grid (); + layout.Platform = platform; + + var label1 = new Label {Platform = platform, IsPlatformEnabled = true}; + var label2 = new Label {Platform = platform, IsPlatformEnabled = true}; + var label3 = new Label {Platform = platform, IsPlatformEnabled = true}; + var label4 = new Label {Platform = platform, IsPlatformEnabled = true, WidthRequest = 206}; + var label5 = new Label {Platform = platform, IsPlatformEnabled = true, WidthRequest = 312}; + var label6 = new Label {Platform = platform, IsPlatformEnabled = true, WidthRequest = 312}; + + layout.ColumnDefinitions = new ColumnDefinitionCollection { + new ColumnDefinition {Width = GridLength.Auto}, + new ColumnDefinition {Width = GridLength.Auto}, + new ColumnDefinition {Width = GridLength.Auto}, + new ColumnDefinition {Width = GridLength.Auto}, + new ColumnDefinition {Width = GridLength.Auto}, + }; + + layout.Children.Add (label1, 0, 0); + layout.Children.Add (label2, 1, 0); + layout.Children.Add (label3, 4, 0); + layout.Children.Add (label4, 2, 4, 0, 1); + layout.Children.Add (label5, 0, 3, 0, 1); + layout.Children.Add (label6, 2, 6, 0, 1); + + layout.Layout (new Rectangle (0, 0, 1000, 500)); + + Assert.AreEqual (100, layout.ColumnDefinitions [0].ActualWidth); + Assert.AreEqual (100, layout.ColumnDefinitions [1].ActualWidth); + Assert.AreEqual (100, layout.ColumnDefinitions [2].ActualWidth); + Assert.AreEqual (100, layout.ColumnDefinitions [3].ActualWidth); + Assert.AreEqual (100, layout.ColumnDefinitions [4].ActualWidth); + } + + [Test] + public void AutoLayoutExpandColumns () + { + var platform = new UnitPlatform (); + var layout = new Grid (); + layout.Platform = platform; + + var label1 = new Label {Platform = platform, IsPlatformEnabled = true}; + var label2 = new Label {Platform = platform, IsPlatformEnabled = true}; + var label3 = new Label {Platform = platform, IsPlatformEnabled = true, WidthRequest = 300}; + + layout.ColumnDefinitions = new ColumnDefinitionCollection { + new ColumnDefinition { Width = GridLength.Auto }, + new ColumnDefinition { Width = GridLength.Auto }, + }; + + layout.Children.Add (label1, 0, 0); + layout.Children.Add (label2, 1, 0); + layout.Children.Add (label3, 0, 2, 0, 1); + + layout.Layout (new Rectangle (0, 0, 1000, 500)); + + Assert.AreEqual (100, layout.ColumnDefinitions [0].ActualWidth); + Assert.AreEqual (194, layout.ColumnDefinitions [1].ActualWidth); + } + + [Test] + public void GridHasDefaultDefinitions () + { + var grid = new Grid (); + Assert.NotNull (grid.ColumnDefinitions); + Assert.NotNull (grid.RowDefinitions); + } + + [Test] + public void DefaultDefinitionsArentSharedAccrossInstances () + { + var grid0 = new Grid (); + var coldefs = grid0.ColumnDefinitions; + var rowdefs = grid0.RowDefinitions; + + var grid1 = new Grid (); + Assert.AreNotSame (grid0, grid1); + Assert.AreNotSame (coldefs, grid1.ColumnDefinitions); + Assert.AreNotSame (rowdefs, grid1.RowDefinitions); + } + + [Test] + public void ChildrenLayoutRespectAlignment () + { + var platform = new UnitPlatform (); + var grid = new Grid { + ColumnDefinitions = { new ColumnDefinition { Width = new GridLength (300) } }, + RowDefinitions = { new RowDefinition { Height = new GridLength (100) } }, + Platform = platform, + }; + var label = new Label { + Platform = platform, + IsPlatformEnabled = true, + VerticalOptions = LayoutOptions.Center, + HorizontalOptions = LayoutOptions.End, + }; + + grid.Children.Add (label); + grid.Layout (new Rectangle (0, 0, 500, 500)); + + Assert.AreEqual (new Rectangle (200, 40, 100, 20), label.Bounds); + } + + [Test] + public void BothChildrenPropertiesUseTheSameBackendStore () + { + var view = new View (); + var grid = new Grid (); + Assert.AreEqual (0, grid.Children.Count); + (grid as Layout<View>).Children.Add (view); + Assert.AreEqual (1, grid.Children.Count); + Assert.AreEqual (1, (grid as Layout<View>).Children.Count); + Assert.AreSame (view, (grid as Layout<View>).Children.First ()); + Assert.AreSame (view, grid.Children.First ()); + } + + [Test] + //Issue 1384 + public void ImageInAutoCellIsProperlyConstrained () + { + var platform = new UnitPlatform (); + + var content = new Image { + Aspect= Aspect.AspectFit, + Platform = platform, + IsPlatformEnabled = true + }; + var grid = new Grid { + Platform = platform, + IsPlatformEnabled = true, + BackgroundColor = Color.Red, + VerticalOptions=LayoutOptions.Start, + Children = { + content + }, + RowDefinitions = { new RowDefinition { Height = GridLength.Auto} }, + ColumnDefinitions = { new ColumnDefinition { Width = GridLength.Auto } } + }; + var view = new ContentView { + Platform = platform, + IsPlatformEnabled = true, + Content = grid, + }; + view.Layout (new Rectangle (0, 0, 100, 100)); + Assert.AreEqual (100, grid.Width); + Assert.AreEqual (20, grid.Height); + + view.Layout (new Rectangle (0, 0, 50, 50)); + Assert.AreEqual (50, grid.Width); + Assert.AreEqual (10, grid.Height); + } + + [Test] + //Issue 1384 + public void ImageInStarCellIsProperlyConstrained () + { + var platform = new UnitPlatform (); + + var content = new Image { + Aspect= Aspect.AspectFit, + Platform = platform, + MinimumHeightRequest = 10, + MinimumWidthRequest = 50, + IsPlatformEnabled = true + }; + var grid = new Grid { + Platform = platform, + IsPlatformEnabled = true, + BackgroundColor = Color.Red, + VerticalOptions=LayoutOptions.Start, + Children = { + content + } + }; + var view = new ContentView { + Platform = platform, + IsPlatformEnabled = true, + Content = grid, + }; + view.Layout (new Rectangle (0, 0, 100, 100)); + Assert.AreEqual (100, grid.Width); + Assert.AreEqual (20, grid.Height); + + view.Layout (new Rectangle (0, 0, 50, 50)); + Assert.AreEqual (50, grid.Width); + Assert.AreEqual (10, grid.Height); + } + + [Test] + public void SizeRequestForStar () + { + var platform = new UnitPlatform (); + + var grid = new Grid{ + RowDefinitions = new RowDefinitionCollection { + new RowDefinition {Height = new GridLength (1, GridUnitType.Star)}, + new RowDefinition {Height = GridLength.Auto}, + }, + ColumnDefinitions = new ColumnDefinitionCollection { + new ColumnDefinition {Width = new GridLength (1, GridUnitType.Star)}, + new ColumnDefinition {Width = GridLength.Auto}, + } + }; + grid.Children.Add (new Label {BackgroundColor = Color.Lime, Text="Foo", Platform = platform, IsPlatformEnabled = true}); + grid.Children.Add (new Label {Text = "Bar", Platform = platform, IsPlatformEnabled = true},0,1); + grid.Children.Add (new Label {Text="Baz",XAlign = TextAlignment.End, Platform = platform, IsPlatformEnabled = true},1,0); + grid.Children.Add (new Label {Text="Qux", XAlign = TextAlignment.End, Platform = platform, IsPlatformEnabled = true},1,1); + + var request = grid.GetSizeRequest (double.PositiveInfinity, double.PositiveInfinity); + Assert.AreEqual (206, request.Request.Width); + Assert.AreEqual (46, request.Request.Height); + + Assert.AreEqual (106, request.Minimum.Width); + Assert.AreEqual (26, request.Minimum.Height); + // + } + + [Test] + //Issue 1497 + public void StarRowsShouldOccupyTheSpace () + { + var platform = new UnitPlatform (); + var label = new Label { + Platform = platform, + IsPlatformEnabled = true, + }; + var Button = new Button { + HorizontalOptions = LayoutOptions.FillAndExpand, + VerticalOptions = LayoutOptions.EndAndExpand, + Platform = platform, + IsPlatformEnabled = true, + }; + var grid = new Grid { + RowDefinitions = new RowDefinitionCollection { + new RowDefinition { Height = GridLength.Auto }, + new RowDefinition { Height = new GridLength (1, GridUnitType.Star) }, + }, + ColumnDefinitions = new ColumnDefinitionCollection { + new ColumnDefinition {Width = new GridLength(1, GridUnitType.Star)}, + }, + Platform = platform, + IsPlatformEnabled = true, + }; + + grid.Children.Add (label); + grid.Children.Add (Button, 0, 1); + + grid.Layout (new Rectangle (0, 0, 300, 300)); + Assert.AreEqual (new Rectangle (0, 280, 300, 20), Button.Bounds); + } + + [Test] + public void StarColumnsWithSpansDoNotExpandAutos () + { + var grid = new Grid { + RowDefinitions = { + new RowDefinition {Height = GridLength.Auto}, + new RowDefinition {Height = GridLength.Auto}, + }, + ColumnDefinitions = { + new ColumnDefinition {Width = new GridLength (1, GridUnitType.Auto)}, + new ColumnDefinition {Width = new GridLength (1, GridUnitType.Auto)}, + new ColumnDefinition {Width = new GridLength (1, GridUnitType.Star)} + }, + Platform = new UnitPlatform (), + IsPlatformEnabled = true + }; + + var spanBox = new BoxView {WidthRequest = 70, HeightRequest = 20, IsPlatformEnabled = true}; + var box1 = new BoxView {WidthRequest = 20, HeightRequest = 20, IsPlatformEnabled = true}; + var box2 = new BoxView {WidthRequest = 20, HeightRequest = 20, IsPlatformEnabled = true}; + var box3 = new BoxView {WidthRequest = 20, HeightRequest = 20, IsPlatformEnabled = true}; + + grid.Children.Add (spanBox, 0, 3, 0, 1); + grid.Children.Add (box1, 0, 1); + grid.Children.Add (box2, 1, 1); + grid.Children.Add (box3, 2, 1); + + grid.Layout (new Rectangle(0, 0, 300, 46)); + + Assert.AreEqual (new Rectangle (0, 0, 300, 20), spanBox.Bounds); + Assert.AreEqual (new Rectangle (0, 26, 20, 20), box1.Bounds); + Assert.AreEqual (new Rectangle (26, 26, 20, 20), box2.Bounds); + Assert.AreEqual (new Rectangle (52, 26, 248, 20), box3.Bounds); + } + + static SizeRequest GetResizableSize (VisualElement view, double widthconstraint, double heightconstraint) + { + if (!(view is Editor)) + return new SizeRequest(new Size (100, 20)); + if (widthconstraint < 100) + return new SizeRequest(new Size (widthconstraint, 2000/widthconstraint)); + if (heightconstraint < 20) + return new SizeRequest(new Size (2000/heightconstraint, heightconstraint)); + return new SizeRequest(new Size (100, 20)); + } + + [Test] + //Issue 1893 + public void EditorSpanningOnMultipleAutoRows () + { + var grid0 = new Grid { + ColumnDefinitions = { + new ColumnDefinition { Width = GridLength.Auto }, + new ColumnDefinition { Width = new GridLength (1, GridUnitType.Star) }, + }, + RowDefinitions = { + new RowDefinition { Height = GridLength.Auto }, + new RowDefinition { Height = GridLength.Auto }, + }, + Platform = new UnitPlatform (GetResizableSize), + IsPlatformEnabled = true, + }; + + var label0 = new Label { IsPlatformEnabled = true }; + var editor0 = new Editor { IsPlatformEnabled = true }; + grid0.Children.Add (label0, 0, 0); + grid0.Children.Add (editor0, 1, 2, 0, 2); + + grid0.Layout (new Rectangle (0, 0, 156, 200)); + Assert.AreEqual (new Rectangle (106, 0, 50, 40), editor0.Bounds); + + var grid1 = new Grid { + ColumnDefinitions = { + new ColumnDefinition { Width = GridLength.Auto }, + new ColumnDefinition { Width = new GridLength (1, GridUnitType.Star) }, + }, + RowDefinitions = { + new RowDefinition { Height = GridLength.Auto }, + }, + Platform = new UnitPlatform (GetResizableSize), + IsPlatformEnabled = true, + }; + + var label1 = new Label { IsPlatformEnabled = true }; + var editor1 = new Editor { IsPlatformEnabled = true }; + grid1.Children.Add (label1, 0, 0); + grid1.Children.Add (editor1, 1, 0); + + grid1.Layout (new Rectangle (0, 0, 156, 200)); + Assert.AreEqual (new Rectangle (106, 0, 50, 40), editor1.Bounds); + } + + [Test] + public void WidthBoundRequestRespected () + { + var grid = new Grid { + ColumnDefinitions = { + new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }, + new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) } + }, + RowDefinitions = { + new RowDefinition { Height = GridLength.Auto }, + new RowDefinition { Height = GridLength.Auto }, + }, + Platform = new UnitPlatform (GetResizableSize), + IsPlatformEnabled = true, + RowSpacing = 0, + ColumnSpacing = 0, + }; + + var topLabel = new Editor {IsPlatformEnabled = true}; + var leftLabel = new Label {IsPlatformEnabled = true, WidthRequest = 10}; + var rightLabel = new Label {IsPlatformEnabled = true, WidthRequest = 10}; + + grid.Children.Add (topLabel, 0, 2, 0, 1); + grid.Children.Add (leftLabel, 0, 1); + grid.Children.Add (rightLabel, 1, 1); + + var unboundRequest = grid.GetSizeRequest (double.PositiveInfinity, double.PositiveInfinity); + var widthBoundRequest = grid.GetSizeRequest (50, double.PositiveInfinity); + + Assert.AreEqual (new SizeRequest (new Size (20, 120), new Size (0, 120)), unboundRequest); + Assert.AreEqual (new SizeRequest (new Size (50, 60), new Size (0, 60)), widthBoundRequest); + } + + [Test] + //https://bugzilla.xamarin.com/show_bug.cgi?id=31608 + public void ColAndRowDefinitionsAreActuallyBindable () + { + var rowdef = new RowDefinition (); + rowdef.SetBinding (RowDefinition.HeightProperty, "Height"); + var grid = new Grid { + RowDefinitions = new RowDefinitionCollection { rowdef }, + }; + Assert.AreEqual (RowDefinition.HeightProperty.DefaultValue, rowdef.Height); + grid.BindingContext = new {Height = 32}; + Assert.AreEqual (new GridLength(32), rowdef.Height); + } + + [Test] + //https://bugzilla.xamarin.com/show_bug.cgi?id=31967 + public void ChangingRowHeightViaBindingTriggersRedraw () + { + var rowdef = new RowDefinition (); + rowdef.SetBinding (RowDefinition.HeightProperty, "Height"); + var grid = new Grid { +// RowDefinitions = new RowDefinitionCollection { +// new RowDefinition { Height = GridLength.Auto }, +// rowdef +// }, + RowSpacing = 0, + Platform = new UnitPlatform (), + IsPlatformEnabled = true, + }; + grid.RowDefinitions.Add (new RowDefinition { Height = GridLength.Auto }); + grid.RowDefinitions.Add (rowdef); + + var label0 = new Label { IsPlatformEnabled = true }; + Grid.SetRow (label0, 0); + var label1 = new Label { IsPlatformEnabled = true }; + Grid.SetRow (label1, 1); + + grid.BindingContext = new {Height = 0}; + grid.Children.Add (label0); + grid.Children.Add (label1); + + Assert.AreEqual (new SizeRequest (new Size (100, 20), new Size (0, 20)), grid.GetSizeRequest (double.PositiveInfinity, double.PositiveInfinity)); + grid.BindingContext = new {Height = 42}; + Assert.AreEqual (new SizeRequest (new Size (100, 62), new Size (0, 62)), grid.GetSizeRequest (double.PositiveInfinity, double.PositiveInfinity)); + } + + [Test] + public void InvalidationBlockedForAbsoluteCell () + { + var grid = new Grid () { + Platform = new UnitPlatform (), + IsPlatformEnabled = true, + RowDefinitions = { + new RowDefinition { Height = new GridLength (100, GridUnitType.Absolute) } + }, + ColumnDefinitions = { + new ColumnDefinition { Width = new GridLength (200, GridUnitType.Absolute) } + } + }; + + var label = new Label { IsPlatformEnabled = true }; + grid.Children.Add (label); + + bool invalidated = false; + grid.MeasureInvalidated += (sender, args) => { + invalidated = true; + }; + + label.Text = "Testing"; + + Assert.False (invalidated); + } + + // because the constraint is internal, we need this + public enum HackLayoutConstraint + { + None = LayoutConstraint.None, + VerticallyFixed = LayoutConstraint.VerticallyFixed, + HorizontallyFixed = LayoutConstraint.HorizontallyFixed, + Fixed = LayoutConstraint.Fixed + } + + [TestCase (HackLayoutConstraint.None, GridUnitType.Absolute, GridUnitType.Absolute, ExpectedResult = true)] + [TestCase (HackLayoutConstraint.None, GridUnitType.Star, GridUnitType.Absolute, ExpectedResult = false)] + [TestCase (HackLayoutConstraint.None, GridUnitType.Absolute, GridUnitType.Star, ExpectedResult = false)] + [TestCase (HackLayoutConstraint.None, GridUnitType.Auto, GridUnitType.Absolute, ExpectedResult = false)] + [TestCase (HackLayoutConstraint.None, GridUnitType.Absolute, GridUnitType.Auto, ExpectedResult = false)] + [TestCase (HackLayoutConstraint.None, GridUnitType.Star, GridUnitType.Star, ExpectedResult = false)] + [TestCase (HackLayoutConstraint.None, GridUnitType.Auto, GridUnitType.Star, ExpectedResult = false)] + [TestCase (HackLayoutConstraint.None, GridUnitType.Star, GridUnitType.Auto, ExpectedResult = false)] + [TestCase (HackLayoutConstraint.None, GridUnitType.Auto, GridUnitType.Auto, ExpectedResult = false)] + [TestCase (HackLayoutConstraint.VerticallyFixed, GridUnitType.Absolute, GridUnitType.Absolute, ExpectedResult = true)] + [TestCase (HackLayoutConstraint.VerticallyFixed, GridUnitType.Star, GridUnitType.Absolute, ExpectedResult = false)] + [TestCase (HackLayoutConstraint.VerticallyFixed, GridUnitType.Absolute, GridUnitType.Star, ExpectedResult = true)] + [TestCase (HackLayoutConstraint.VerticallyFixed, GridUnitType.Auto, GridUnitType.Absolute, ExpectedResult = false)] + [TestCase (HackLayoutConstraint.VerticallyFixed, GridUnitType.Absolute, GridUnitType.Auto, ExpectedResult = false)] + [TestCase (HackLayoutConstraint.VerticallyFixed, GridUnitType.Star, GridUnitType.Star, ExpectedResult = false)] + [TestCase (HackLayoutConstraint.VerticallyFixed, GridUnitType.Auto, GridUnitType.Star, ExpectedResult = false)] + [TestCase (HackLayoutConstraint.VerticallyFixed, GridUnitType.Star, GridUnitType.Auto, ExpectedResult = false)] + [TestCase (HackLayoutConstraint.VerticallyFixed, GridUnitType.Auto, GridUnitType.Auto, ExpectedResult = false)] + [TestCase (HackLayoutConstraint.HorizontallyFixed, GridUnitType.Absolute, GridUnitType.Absolute, ExpectedResult = true)] + [TestCase (HackLayoutConstraint.HorizontallyFixed, GridUnitType.Star, GridUnitType.Absolute, ExpectedResult = true)] + [TestCase (HackLayoutConstraint.HorizontallyFixed, GridUnitType.Absolute, GridUnitType.Star, ExpectedResult = false)] + [TestCase (HackLayoutConstraint.HorizontallyFixed, GridUnitType.Auto, GridUnitType.Absolute, ExpectedResult = false)] + [TestCase (HackLayoutConstraint.HorizontallyFixed, GridUnitType.Absolute, GridUnitType.Auto, ExpectedResult = false)] + [TestCase (HackLayoutConstraint.HorizontallyFixed, GridUnitType.Star, GridUnitType.Star, ExpectedResult = false)] + [TestCase (HackLayoutConstraint.HorizontallyFixed, GridUnitType.Auto, GridUnitType.Star, ExpectedResult = false)] + [TestCase (HackLayoutConstraint.HorizontallyFixed, GridUnitType.Star, GridUnitType.Auto, ExpectedResult = false)] + [TestCase (HackLayoutConstraint.HorizontallyFixed, GridUnitType.Auto, GridUnitType.Auto, ExpectedResult = false)] + [TestCase (HackLayoutConstraint.Fixed, GridUnitType.Absolute, GridUnitType.Absolute, ExpectedResult = true)] + [TestCase (HackLayoutConstraint.Fixed, GridUnitType.Star, GridUnitType.Absolute, ExpectedResult = true)] + [TestCase (HackLayoutConstraint.Fixed, GridUnitType.Absolute, GridUnitType.Star, ExpectedResult = true)] + [TestCase (HackLayoutConstraint.Fixed, GridUnitType.Auto, GridUnitType.Absolute, ExpectedResult = false)] + [TestCase (HackLayoutConstraint.Fixed, GridUnitType.Absolute, GridUnitType.Auto, ExpectedResult = false)] + [TestCase (HackLayoutConstraint.Fixed, GridUnitType.Star, GridUnitType.Star, ExpectedResult = true)] + [TestCase (HackLayoutConstraint.Fixed, GridUnitType.Auto, GridUnitType.Star, ExpectedResult = false)] + [TestCase (HackLayoutConstraint.Fixed, GridUnitType.Star, GridUnitType.Auto, ExpectedResult = false)] + [TestCase (HackLayoutConstraint.Fixed, GridUnitType.Auto, GridUnitType.Auto, ExpectedResult = false)] + public bool InvalidationPropogationTests (HackLayoutConstraint gridConstraint, GridUnitType horizontalType, GridUnitType verticalType) + { + var grid = new Grid { + ComputedConstraint = (LayoutConstraint) gridConstraint, + Platform = new UnitPlatform (), + IsPlatformEnabled = true, + RowDefinitions = { + new RowDefinition { Height = new GridLength (1, verticalType) } + }, + ColumnDefinitions = { + new ColumnDefinition { Width = new GridLength (1, horizontalType) } + } + }; + + var label = new Label { IsPlatformEnabled = true }; + grid.Children.Add (label); + + bool invalidated = false; + grid.MeasureInvalidated += (sender, args) => { + invalidated = true; + }; + + label.Text = "Testing"; + + return !invalidated; + } + } + + [TestFixture] + public class GridMeasureTests : BaseTestFixture + { + static List<Action> delayActions = new List<Action> (); + + [SetUp] + public override void Setup() + { + base.Setup (); + Device.PlatformServices = new MockPlatformServices (invokeOnMainThread: a => { delayActions.Add (a); }); + } + + [TearDown] + public override void TearDown() + { + base.TearDown (); + Device.PlatformServices = null; + } + + [Test] + public void NestedInvalidateMeasureDoesNotCrash () + { + var grid = new Grid { + Platform = new UnitPlatform (), + IsPlatformEnabled = true + }; + + var child = new Label { + IsPlatformEnabled = true + }; + grid.Children.Add (child); + + var child2 = new Label { + IsPlatformEnabled = true + }; + grid.Children.Add (child2); + + bool fire = true; + child.SizeChanged += (sender, args) => { + if (fire) + child.InvalidateMeasure (InvalidationTrigger.Undefined); + fire = false; + }; + + grid.Layout (new Rectangle (0, 0, 100, 100)); + + foreach (var delayAction in delayActions) { + delayAction (); + } + } + } +}
\ No newline at end of file |