|
|
@@ -1,7 +1,8 @@
|
|
|
// Copyright (c) The Avalonia Project. All rights reserved.
|
|
|
// Licensed under the MIT license. See licence.md file in the project root for full license information.
|
|
|
|
|
|
-using Avalonia.Controls;
|
|
|
+using System.Linq;
|
|
|
+using Avalonia.Layout;
|
|
|
using Xunit;
|
|
|
|
|
|
namespace Avalonia.Controls.UnitTests
|
|
|
@@ -147,6 +148,151 @@ namespace Avalonia.Controls.UnitTests
|
|
|
Assert.Equal(new Rect(50, 0, 50, 120), target.Children[2].Bounds);
|
|
|
}
|
|
|
|
|
|
+ [Fact]
|
|
|
+ public void Arranges_Vertical_Children_With_Correct_Bounds()
|
|
|
+ {
|
|
|
+ var target = new StackPanel
|
|
|
+ {
|
|
|
+ Orientation = Orientation.Vertical,
|
|
|
+ Children =
|
|
|
+ {
|
|
|
+ new TestControl
|
|
|
+ {
|
|
|
+ HorizontalAlignment = HorizontalAlignment.Left,
|
|
|
+ MeasureSize = new Size(50, 10),
|
|
|
+ },
|
|
|
+ new TestControl
|
|
|
+ {
|
|
|
+ HorizontalAlignment = HorizontalAlignment.Left,
|
|
|
+ MeasureSize = new Size(150, 10),
|
|
|
+ },
|
|
|
+ new TestControl
|
|
|
+ {
|
|
|
+ HorizontalAlignment = HorizontalAlignment.Center,
|
|
|
+ MeasureSize = new Size(50, 10),
|
|
|
+ },
|
|
|
+ new TestControl
|
|
|
+ {
|
|
|
+ HorizontalAlignment = HorizontalAlignment.Center,
|
|
|
+ MeasureSize = new Size(150, 10),
|
|
|
+ },
|
|
|
+ new TestControl
|
|
|
+ {
|
|
|
+ HorizontalAlignment = HorizontalAlignment.Right,
|
|
|
+ MeasureSize = new Size(50, 10),
|
|
|
+ },
|
|
|
+ new TestControl
|
|
|
+ {
|
|
|
+ HorizontalAlignment = HorizontalAlignment.Right,
|
|
|
+ MeasureSize = new Size(150, 10),
|
|
|
+ },
|
|
|
+ new TestControl
|
|
|
+ {
|
|
|
+ HorizontalAlignment = HorizontalAlignment.Stretch,
|
|
|
+ MeasureSize = new Size(50, 10),
|
|
|
+ },
|
|
|
+ new TestControl
|
|
|
+ {
|
|
|
+ HorizontalAlignment = HorizontalAlignment.Stretch,
|
|
|
+ MeasureSize = new Size(150, 10),
|
|
|
+ },
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ target.Measure(new Size(100, 150));
|
|
|
+ Assert.Equal(new Size(100, 80), target.DesiredSize);
|
|
|
+
|
|
|
+ target.Arrange(new Rect(target.DesiredSize));
|
|
|
+
|
|
|
+ var bounds = target.Children.Select(x => x.Bounds).ToArray();
|
|
|
+
|
|
|
+ Assert.Equal(
|
|
|
+ new[]
|
|
|
+ {
|
|
|
+ new Rect(0, 0, 50, 10),
|
|
|
+ new Rect(0, 10, 150, 10),
|
|
|
+ new Rect(25, 20, 50, 10),
|
|
|
+ new Rect(-25, 30, 150, 10),
|
|
|
+ new Rect(50, 40, 50, 10),
|
|
|
+ new Rect(-50, 50, 150, 10),
|
|
|
+ new Rect(0, 60, 100, 10),
|
|
|
+ new Rect(0, 70, 150, 10),
|
|
|
+
|
|
|
+ }, bounds);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public void Arranges_Horizontal_Children_With_Correct_Bounds()
|
|
|
+ {
|
|
|
+ var target = new StackPanel
|
|
|
+ {
|
|
|
+ Orientation = Orientation.Horizontal,
|
|
|
+ Children =
|
|
|
+ {
|
|
|
+ new TestControl
|
|
|
+ {
|
|
|
+ VerticalAlignment = VerticalAlignment.Top,
|
|
|
+ MeasureSize = new Size(10, 50),
|
|
|
+ },
|
|
|
+ new TestControl
|
|
|
+ {
|
|
|
+ VerticalAlignment = VerticalAlignment.Top,
|
|
|
+ MeasureSize = new Size(10, 150),
|
|
|
+ },
|
|
|
+ new TestControl
|
|
|
+ {
|
|
|
+ VerticalAlignment = VerticalAlignment.Center,
|
|
|
+ MeasureSize = new Size(10, 50),
|
|
|
+ },
|
|
|
+ new TestControl
|
|
|
+ {
|
|
|
+ VerticalAlignment = VerticalAlignment.Center,
|
|
|
+ MeasureSize = new Size(10, 150),
|
|
|
+ },
|
|
|
+ new TestControl
|
|
|
+ {
|
|
|
+ VerticalAlignment = VerticalAlignment.Bottom,
|
|
|
+ MeasureSize = new Size(10, 50),
|
|
|
+ },
|
|
|
+ new TestControl
|
|
|
+ {
|
|
|
+ VerticalAlignment = VerticalAlignment.Bottom,
|
|
|
+ MeasureSize = new Size(10, 150),
|
|
|
+ },
|
|
|
+ new TestControl
|
|
|
+ {
|
|
|
+ VerticalAlignment = VerticalAlignment.Stretch,
|
|
|
+ MeasureSize = new Size(10, 50),
|
|
|
+ },
|
|
|
+ new TestControl
|
|
|
+ {
|
|
|
+ VerticalAlignment = VerticalAlignment.Stretch,
|
|
|
+ MeasureSize = new Size(10, 150),
|
|
|
+ },
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ target.Measure(new Size(150, 100));
|
|
|
+ Assert.Equal(new Size(80, 100), target.DesiredSize);
|
|
|
+
|
|
|
+ target.Arrange(new Rect(target.DesiredSize));
|
|
|
+
|
|
|
+ var bounds = target.Children.Select(x => x.Bounds).ToArray();
|
|
|
+
|
|
|
+ Assert.Equal(
|
|
|
+ new[]
|
|
|
+ {
|
|
|
+ new Rect(0, 0, 10, 50),
|
|
|
+ new Rect(10, 0, 10, 150),
|
|
|
+ new Rect(20, 25, 10, 50),
|
|
|
+ new Rect(30, -25, 10, 150),
|
|
|
+ new Rect(40, 50, 10, 50),
|
|
|
+ new Rect(50, -50, 10, 150),
|
|
|
+ new Rect(60, 0, 10, 100),
|
|
|
+ new Rect(70, 0, 10, 150),
|
|
|
+ }, bounds);
|
|
|
+ }
|
|
|
+
|
|
|
[Theory]
|
|
|
[InlineData(Orientation.Horizontal)]
|
|
|
[InlineData(Orientation.Vertical)]
|
|
|
@@ -185,5 +331,17 @@ namespace Avalonia.Controls.UnitTests
|
|
|
|
|
|
Assert.Equal(sizeWithTwoChildren, sizeWithThreeChildren);
|
|
|
}
|
|
|
+
|
|
|
+ private class TestControl : Control
|
|
|
+ {
|
|
|
+ public Size MeasureConstraint { get; private set; }
|
|
|
+ public Size MeasureSize { get; set; }
|
|
|
+
|
|
|
+ protected override Size MeasureOverride(Size availableSize)
|
|
|
+ {
|
|
|
+ MeasureConstraint = availableSize;
|
|
|
+ return MeasureSize;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|