Xamarin.Forms/Xamarin.Forms.Core.UnitTests/FlexLayoutTests.cs

520 строки
14 KiB
C#

using System;
using System.Globalization;
using System.Threading;
using NUnit.Framework;
namespace Xamarin.Forms.Core.UnitTests
{
[TestFixture]
public class FlexLayoutTests : BaseTestFixture
{
[Test]
public void TestBasicLayout()
{
var label1 = new Label { IsPlatformEnabled = true };
var label2 = new Label { IsPlatformEnabled = true };
var layout = new FlexLayout
{
IsPlatformEnabled = true,
Children = {
label1,
label2,
}
};
layout.Layout(new Rectangle(0, 0, 912, 912));
Assert.That(layout.Bounds, Is.EqualTo(new Rectangle(0, 0, 912, 912)));
Assert.That(label1.Bounds, Is.EqualTo(new Rectangle(0, 0, 100, 912)));
Assert.That(label2.Bounds, Is.EqualTo(new Rectangle(100, 0, 100, 912)));
}
[Test]
public void TestBasicLayoutWithElementsWidth()
{
var label1 = new Label { IsPlatformEnabled = true, WidthRequest = 120 };
var label2 = new Label { IsPlatformEnabled = true, WidthRequest = 120 };
var layout = new FlexLayout
{
IsPlatformEnabled = true,
Children = {
label1,
label2,
}
};
layout.Layout(new Rectangle(0, 0, 912, 912));
Assert.That(layout.Bounds, Is.EqualTo(new Rectangle(0, 0, 912, 912)));
Assert.That(label1.Bounds, Is.EqualTo(new Rectangle(0, 0, 120, 912)));
Assert.That(label2.Bounds, Is.EqualTo(new Rectangle(120, 0, 120, 912)));
}
[Test]
public void TestBasicLayoutWithElementsWidthAndMargin()
{
var label1 = new Label { IsPlatformEnabled = true, WidthRequest = 100, Margin = new Thickness(5, 0, 0, 0) };
var label2 = new Label { IsPlatformEnabled = true, WidthRequest = 100, Margin = new Thickness(5, 0, 0, 0) };
var layout = new FlexLayout
{
IsPlatformEnabled = true,
Children = {
label1,
label2,
}
};
layout.Layout(new Rectangle(0, 0, 912, 912));
Assert.AreEqual(912, layout.Width);
Assert.AreEqual(912, layout.Height);
Assert.AreEqual(new Rectangle(5, 0, 100, 912), label1.Bounds);
Assert.AreEqual(new Rectangle(110, 0, 100, 912), label2.Bounds);
}
[Test]
public void TestSetBounds()
{
var layoutSize = new Size(320, 50);
var layout = new FlexLayout
{
Direction = FlexDirection.Row,
AlignItems = FlexAlignItems.Start,
IsPlatformEnabled = true
};
var label1 = new Label { IsPlatformEnabled = true };
FlexLayout.SetGrow(label1, 1);
layout.Children.Add(label1);
var label2 = new Label { IsPlatformEnabled = true };
FlexLayout.SetGrow(label2, 1);
layout.Children.Add(label2);
var label3 = new Label { IsPlatformEnabled = true };
FlexLayout.SetGrow(label3, 1);
layout.Children.Add(label3);
layout.Layout(new Rectangle(0, 0, layoutSize.Width, layoutSize.Height));
Assert.AreEqual(label2.Bounds.Left, Math.Max(label1.Bounds.Left, label1.Bounds.Right), 1);
Assert.AreEqual(label3.Bounds.Left, Math.Max(label2.Bounds.Left, label2.Bounds.Right), 1);
double totalWidth = 0;
foreach (var view in layout.Children)
{
totalWidth += view.Bounds.Width;
}
Assert.AreEqual(layoutSize.Width, totalWidth, 2);
}
[Test]
public void TestRelayoutOnChildrenRemoved()
{
var layoutSize = new Size(300, 50);
var layout = new FlexLayout
{
IsPlatformEnabled = true,
Direction = FlexDirection.Row
};
var label1 = new Label { IsPlatformEnabled = true };
FlexLayout.SetGrow(label1, 1);
layout.Children.Add(label1);
var label2 = new Label { IsPlatformEnabled = true };
FlexLayout.SetGrow(label2, 1);
layout.Children.Add(label2);
var label3 = new Label { IsPlatformEnabled = true };
FlexLayout.SetGrow(label3, 1);
layout.Children.Add(label3);
layout.Layout(new Rectangle(0, 0, layoutSize.Width, layoutSize.Height));
foreach (var view in layout.Children)
Assert.That(view.Bounds.Width, Is.EqualTo(100));
layout.Children.Remove(label3);
Assert.That(label1.Bounds.Width, Is.EqualTo(150));
Assert.That(label2.Bounds.Width, Is.EqualTo(150));
Assert.That(label3.Bounds.Width, Is.EqualTo(100));
}
[Test]
public void TestFlexLayoutIsIncludeChangeWorksOnSecondPass()
{
var layoutSize = new Size(300, 50);
var layout = new FlexLayout
{
Direction = FlexDirection.Row,
IsPlatformEnabled = true,
};
var label1 = new Label { IsPlatformEnabled = true };
FlexLayout.SetGrow(label1, 1);
layout.Children.Add(label1);
var label2 = new Label { IsPlatformEnabled = true };
FlexLayout.SetGrow(label2, 1);
layout.Children.Add(label2);
var label3 = new Label { IsPlatformEnabled = true };
FlexLayout.SetGrow(label3, 1);
layout.Layout(new Rectangle(0, 0, layoutSize.Width, layoutSize.Height));
Assert.AreEqual(150, label1.Bounds.Width);
Assert.AreEqual(150, label2.Bounds.Width);
Assert.AreEqual(-1, label3.Bounds.Width);
layout.Children.Add(label3);
layout.Layout(new Rectangle(0, 0, layoutSize.Width, layoutSize.Height));
Assert.AreEqual(100, label1.Bounds.Width);
Assert.AreEqual(100, label2.Bounds.Width);
Assert.AreEqual(100, label3.Bounds.Width);
}
[Test]
// fixed at https://github.com/xamarin/flex/commit/0ccb9f1625abdc5400def29651373937bf6610cd
public void TestSwapChildrenOrder()
{
var layoutSize = new Size(300, 50);
var layout = new FlexLayout
{
Direction = FlexDirection.Row,
IsPlatformEnabled = true,
};
var label0 = new Label { IsPlatformEnabled = true, Text = "Label0" };
FlexLayout.SetGrow(label0, 1);
layout.Children.Add(label0);
var label1 = new Label { IsPlatformEnabled = true, Text = "Label1" };
FlexLayout.SetGrow(label1, 1);
layout.Children.Add(label1);
var label2 = new Label { IsPlatformEnabled = true, Text = "Label2" };
FlexLayout.SetGrow(label2, 1);
layout.Children.Add(label2);
layout.Layout(new Rectangle(0, 0, layoutSize.Width, layoutSize.Height));
Assert.AreEqual(new Rectangle(0, 0, 100, 50), label0.Bounds);
Assert.AreEqual(new Rectangle(100, 0, 100, 50), label1.Bounds);
Assert.AreEqual(new Rectangle(200, 0, 100, 50), label2.Bounds);
var lastItem = layout.Children[2];
Assert.That(lastItem, Is.SameAs(label2));
layout.Children.Remove(lastItem);
Assert.AreEqual(new Rectangle(0, 0, 150, 50), label0.Bounds);
Assert.AreEqual(new Rectangle(150, 0, 150, 50), label1.Bounds);
layout.Children.Insert(0, lastItem);
Assert.AreEqual(new Rectangle(0, 0, 100, 50), label2.Bounds);
Assert.AreEqual(new Rectangle(100, 0, 100, 50), label0.Bounds);
Assert.AreEqual(new Rectangle(200, 0, 100, 50), label1.Bounds);
}
[Test]
public void TestSizeThatFits()
{
Device.PlatformServices = new MockPlatformServices(useRealisticLabelMeasure: true);
var layout = new FlexLayout
{
Direction = FlexDirection.Row,
AlignItems = FlexAlignItems.Start,
IsPlatformEnabled = true
};
var label1 = new Label
{
IsPlatformEnabled = true,
LineBreakMode = LineBreakMode.TailTruncation,
Text = @"This is a very very very very very very very very long piece of text."
};
FlexLayout.SetShrink(label1, 1);
layout.Children.Add(label1);
var label2 = new Label
{
Text = "",
IsPlatformEnabled = true,
WidthRequest = 10,
HeightRequest = 10
};
layout.Children.Add(label2);
layout.Layout(new Rectangle(0, 0, 320, 50));
var label2Size = label2.Measure(double.PositiveInfinity, double.PositiveInfinity);
Assert.AreEqual(10, label2Size.Request.Height);
Assert.AreEqual(10, label2Size.Request.Width);
var label1Size = label1.Measure(double.PositiveInfinity, double.PositiveInfinity);
// var layoutSize = layout.Measure(-1, -1);
}
[Test]
public void TestNesting()
{
var header = new View { HeightRequest = 50, IsPlatformEnabled = true, };
var footer = new View { HeightRequest = 50, IsPlatformEnabled = true, };
Func<View> createItem = () =>
{
var v = new View { WidthRequest = 50, Margin = 5, IsPlatformEnabled = true, };
FlexLayout.SetGrow(v, 1);
return v;
};
var layout = new FlexLayout
{
IsPlatformEnabled = true,
Children = {
header,
new FlexLayout{
Direction = FlexDirection.Row,
IsPlatformEnabled = true,
Children = {
createItem(),
createItem(),
createItem(),
createItem(),
createItem(),
}
},
footer,
},
Direction = FlexDirection.Column,
};
var inner = layout.Children[1] as FlexLayout;
FlexLayout.SetGrow(inner, 1);
layout.Layout(new Rectangle(0, 0, 300, 600));
Assert.That(layout.Bounds, Is.EqualTo(new Rectangle(0, 0, 300, 600)));
Assert.That(header.Bounds, Is.EqualTo(new Rectangle(0, 0, 300, 50)));
Assert.That(inner.Bounds, Is.EqualTo(new Rectangle(0, 50, 300, 500)));
Assert.That(inner.Children[0].Bounds, Is.EqualTo(new Rectangle(5, 5, 50, 490)));
Assert.That(inner.Children[1].Bounds, Is.EqualTo(new Rectangle(65, 5, 50, 490)));
Assert.That(inner.Children[2].Bounds, Is.EqualTo(new Rectangle(125, 5, 50, 490)));
Assert.That(inner.Children[3].Bounds, Is.EqualTo(new Rectangle(185, 5, 50, 490)));
Assert.That(inner.Children[4].Bounds, Is.EqualTo(new Rectangle(245, 5, 50, 490)));
Assert.That(footer.Bounds, Is.EqualTo(new Rectangle(0, 550, 300, 50)));
}
[Test]
public void TestMeasuring()
{
var label = new Label
{
IsPlatformEnabled = true,
};
var Layout = new FlexLayout
{
IsPlatformEnabled = true,
Direction = FlexDirection.Row,
Wrap = FlexWrap.Wrap,
Children = {
label,
}
};
//measure sith +inf as main-axis
var measure = Layout.Measure(double.PositiveInfinity, 40);
Assert.That(measure.Request, Is.EqualTo(new Size(100, 40)));
//measure sith +inf as cross-axis
measure = Layout.Measure(200, double.PositiveInfinity);
Assert.That(measure.Request, Is.EqualTo(new Size(200, 20)));
//measure with +inf as both axis
measure = Layout.Measure(double.PositiveInfinity, double.PositiveInfinity);
Assert.That(measure.Request, Is.EqualTo(new Size(100, 20)));
}
[Test]
public void TestMarginsWithWrap()
{
var label0 = new Label
{
IsPlatformEnabled = true,
Margin = 6,
};
var label1 = new Label
{
IsPlatformEnabled = true,
Margin = 6,
};
var label2 = new Label
{
IsPlatformEnabled = true,
};
FlexLayout.SetGrow(label0, 0);
FlexLayout.SetBasis(label0, new FlexBasis(.5f, true));
FlexLayout.SetGrow(label1, 0);
FlexLayout.SetBasis(label1, new FlexBasis(.5f, true));
FlexLayout.SetGrow(label2, 0);
FlexLayout.SetBasis(label2, new FlexBasis(1f, true));
var layout = new FlexLayout
{
IsPlatformEnabled = true,
Direction = FlexDirection.Row,
Wrap = FlexWrap.Wrap,
AlignItems = FlexAlignItems.Start,
AlignContent = FlexAlignContent.Start,
Children = {
label0,
label1,
label2,
}
};
var measure = layout.Measure(300, double.PositiveInfinity);
Assert.That(measure.Request, Is.EqualTo(new Size(300, 52)));
layout.Layout(new Rectangle(0, 0, 300, 300));
Assert.That(label0.Bounds, Is.EqualTo(new Rectangle(6, 6, 138, 20)));
Assert.That(label1.Bounds, Is.EqualTo(new Rectangle(156, 6, 138, 20)));
Assert.That(label2.Bounds, Is.EqualTo(new Rectangle(0, 32, 300, 20)));
}
[Test]
//https://github.com/xamarin/Xamarin.Forms/issues/2551
public void TestReverseWithGrow()
{
var label0 = new Label
{
IsPlatformEnabled = true,
};
FlexLayout.SetGrow(label0, 1);
var layout = new FlexLayout
{
IsPlatformEnabled = true,
Direction = FlexDirection.ColumnReverse,
Children = {
label0,
}
};
layout.Layout(new Rectangle(0, 0, 300, 300));
Assert.That(label0.Bounds, Is.EqualTo(new Rectangle(0, 0, 300, 300)));
}
[Test]
public void TestIsVisible()
//https://github.com/xamarin/Xamarin.Forms/issues/2593
{
var label0 = new Label
{
IsPlatformEnabled = true,
};
var label1 = new Label
{
IsPlatformEnabled = true,
};
var label2 = new Label
{
IsPlatformEnabled = true,
};
var layout = new FlexLayout
{
IsPlatformEnabled = true,
Direction = FlexDirection.Column,
Children = {
label0,
label1,
label2,
}
};
layout.Layout(new Rectangle(0, 0, 300, 300));
Assert.That(label0.Bounds, Is.EqualTo(new Rectangle(0, 0, 300, 20)));
Assert.That(label1.Bounds, Is.EqualTo(new Rectangle(0, 20, 300, 20)));
Assert.That(label2.Bounds, Is.EqualTo(new Rectangle(0, 40, 300, 20)));
label1.IsVisible = false;
Assert.That(label0.Bounds, Is.EqualTo(new Rectangle(0, 0, 300, 20)));
Assert.That(label2.Bounds, Is.EqualTo(new Rectangle(0, 20, 300, 20)));
label0.IsVisible = false;
label1.IsVisible = true;
Assert.That(label1.Bounds, Is.EqualTo(new Rectangle(0, 0, 300, 20)));
Assert.That(label2.Bounds, Is.EqualTo(new Rectangle(0, 20, 300, 20)));
}
[Test]
public void ChangingGrowTriggersLayout()
//https://github.com/xamarin/Xamarin.Forms/issues/2821
{
var layout = new FlexLayout
{
IsPlatformEnabled = true,
Direction = FlexDirection.Column,
};
layout.Layout(new Rectangle(0, 0, 300, 300));
for (var i = 0; i < 3; i++)
{
var box = new BoxView
{
IsPlatformEnabled = true,
};
layout.Children.Add(box);
FlexLayout.SetGrow(box, 1f);
}
Assert.That(layout.Children[2].Bounds, Is.EqualTo(new Rectangle(0, 200, 300, 100)));
}
[Test]
public void PaddingOnLayout()
//https://github.com/xamarin/Xamarin.Forms/issues/2663
{
var label0 = new Label
{
IsPlatformEnabled = true,
};
var label1 = new Label
{
IsPlatformEnabled = true,
};
var label2 = new Label
{
IsPlatformEnabled = true,
};
var layout = new FlexLayout
{
IsPlatformEnabled = true,
JustifyContent = FlexJustify.SpaceBetween,
AlignItems = FlexAlignItems.Start,
Padding = new Thickness(20, 10, 20, 0),
Children = {
label0,
label1,
label2,
}
};
layout.Layout(new Rectangle(0, 0, 500, 300));
Assert.That(layout.Children[0].Bounds, Is.EqualTo(new Rectangle(20, 10, 100, 20)));
Assert.That(layout.Children[2].Bounds, Is.EqualTo(new Rectangle(380, 10, 100, 20)));
}
}
}