Xamarin.Forms/Xamarin.Forms.Core.UnitTests/StackLayoutUnitTests.cs

706 строки
20 KiB
C#

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
{
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
{
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,
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,
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
{
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
{
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
{
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,
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
{
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
{
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
{
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
{
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
{
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
{
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
{
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
{
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
{
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
{
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,
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,
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,
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,
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,
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,
Children = { child1 }
};
stack.Layout(new Rectangle(0, 0, 100, 100));
}
[Test]
public void PaddingResizeTest()
{
var child = new BoxView
{
IsPlatformEnabled = true,
WidthRequest = 20,
HeightRequest = 20,
};
var innerStack = new StackLayout
{
HorizontalOptions = LayoutOptions.Center,
VerticalOptions = LayoutOptions.Center,
IsPlatformEnabled = true,
Children = { child }
};
var outterLayout = new StackLayout
{
HorizontalOptions = LayoutOptions.FillAndExpand,
VerticalOptions = LayoutOptions.FillAndExpand,
IsPlatformEnabled = true,
Children = { innerStack }
};
outterLayout.Layout(new Rectangle(0, 0, 100, 100));
var beforeSize = innerStack.Bounds.Size;
innerStack.Padding = new Thickness(30);
var afterSize = innerStack.Bounds.Size;
Assert.AreNotEqual(beforeSize, afterSize, "Padding was grow, so Size should be bigger");
}
[Test]
public void PaddingChildRelayoutTest()
{
var child = new BoxView
{
IsPlatformEnabled = true,
WidthRequest = 20,
HeightRequest = 20,
};
var innerStack = new StackLayout
{
HorizontalOptions = LayoutOptions.FillAndExpand,
VerticalOptions = LayoutOptions.FillAndExpand,
IsPlatformEnabled = true,
Children = { child }
};
var outterLayout = new StackLayout
{
HorizontalOptions = LayoutOptions.FillAndExpand,
VerticalOptions = LayoutOptions.FillAndExpand,
IsPlatformEnabled = true,
Children = { innerStack }
};
outterLayout.Layout(new Rectangle(0, 0, 100, 100));
var before = child.Bounds;
innerStack.Padding = new Thickness(30);
var after = child.Bounds;
Assert.AreNotEqual(before, after, "child should be moved within padding size");
}
}
}