| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279 |
- using System.Collections.Generic;
- using System.Linq;
- using Avalonia.Controls.Primitives;
- using Avalonia.Input;
- using Avalonia.Platform;
- using Avalonia.UnitTests;
- using Moq;
- using Xunit;
- namespace Avalonia.Controls.UnitTests
- {
- public class SharedSizeScopeTests
- {
- [Fact]
- public void All_Descendant_Grids_Are_Registered_When_Added_After_Setting_Scope()
- {
- var grids = new[] { new Grid(), new Grid(), new Grid() };
- var scope = new Panel();
- scope.Children.AddRange(grids);
- var root = new TestRoot();
- root.SetValue(Grid.IsSharedSizeScopeProperty, true);
- root.Child = scope;
- Assert.All(grids, g => Assert.True(g.HasSharedSizeScope()));
- }
- [Fact]
- public void All_Descendant_Grids_Are_Registered_When_Setting_Scope()
- {
- var grids = new[] { new Grid(), new Grid(), new Grid() };
- var scope = new Panel();
- scope.Children.AddRange(grids);
- var root = new TestRoot();
- root.Child = scope;
- root.SetValue(Grid.IsSharedSizeScopeProperty, true);
- Assert.All(grids, g => Assert.True(g.HasSharedSizeScope()));
- }
- [Fact]
- public void All_Descendant_Grids_Are_Unregistered_When_Resetting_Scope()
- {
- var grids = new[] { new Grid(), new Grid(), new Grid() };
- var scope = new Panel();
- scope.Children.AddRange(grids);
- var root = new TestRoot();
- root.SetValue(Grid.IsSharedSizeScopeProperty, true);
- root.Child = scope;
- Assert.All(grids, g => Assert.True(g.HasSharedSizeScope()));
- root.SetValue(Grid.IsSharedSizeScopeProperty, false);
- Assert.All(grids, g => Assert.False(g.HasSharedSizeScope()));
- Assert.Equal(null, root.GetValue(Grid.PrivateSharedSizeScopeProperty));
- }
- [Fact]
- public void Size_Is_Propagated_Between_Grids()
- {
- var grids = new[] { CreateGrid("A", null), CreateGrid(("A", new GridLength(30)), (null, new GridLength())) };
- var scope = new Panel();
- scope.Children.AddRange(grids);
- var root = new TestRoot();
- root.SetValue(Grid.IsSharedSizeScopeProperty, true);
- root.Child = scope;
- root.Measure(new Size(50, 50));
- root.Arrange(new Rect(new Point(), new Point(50, 50)));
- Assert.Equal(30, grids[0].ColumnDefinitions[0].ActualWidth);
- }
- [Fact]
- public void Size_Propagation_Is_Constrained_To_Innermost_Scope()
- {
- var grids = new[] { CreateGrid("A", null), CreateGrid(("A", new GridLength(30)), (null, new GridLength())) };
- var innerScope = new Panel();
- innerScope.Children.AddRange(grids);
- innerScope.SetValue(Grid.IsSharedSizeScopeProperty, true);
- var outerGrid = CreateGrid(("A", new GridLength(0)));
- var outerScope = new Panel();
- outerScope.Children.AddRange(new[] { outerGrid, innerScope });
- var root = new TestRoot();
- root.SetValue(Grid.IsSharedSizeScopeProperty, true);
- root.Child = outerScope;
- root.Measure(new Size(50, 50));
- root.Arrange(new Rect(new Point(), new Point(50, 50)));
- Assert.Equal(0, outerGrid.ColumnDefinitions[0].ActualWidth);
- }
- [Fact]
- public void Size_Is_Propagated_Between_Rows_And_Columns()
- {
- var grid = new Grid
- {
- ColumnDefinitions = new ColumnDefinitions("*,30"),
- RowDefinitions = new RowDefinitions("*,10")
- };
- grid.ColumnDefinitions[1].SharedSizeGroup = "A";
- grid.RowDefinitions[1].SharedSizeGroup = "A";
- var root = new TestRoot();
- root.SetValue(Grid.IsSharedSizeScopeProperty, true);
- root.Child = grid;
- root.Measure(new Size(50, 50));
- root.Arrange(new Rect(new Point(), new Point(50, 50)));
- Assert.Equal(30, grid.RowDefinitions[1].ActualHeight);
- }
- [Fact]
- public void Size_Group_Changes_Are_Tracked()
- {
- var grids = new[] {
- CreateGrid((null, new GridLength(0, GridUnitType.Auto)), (null, new GridLength())),
- CreateGrid(("A", new GridLength(30)), (null, new GridLength())) };
- var scope = new Panel();
- scope.Children.AddRange(grids);
- var root = new TestRoot();
- root.SetValue(Grid.IsSharedSizeScopeProperty, true);
- root.Child = scope;
- root.Measure(new Size(50, 50));
- root.Arrange(new Rect(new Point(), new Point(50, 50)));
- Assert.Equal(0, grids[0].ColumnDefinitions[0].ActualWidth);
- grids[0].ColumnDefinitions[0].SharedSizeGroup = "A";
- root.Measure(new Size(51, 51));
- root.Arrange(new Rect(new Point(), new Point(51, 51)));
- Assert.Equal(30, grids[0].ColumnDefinitions[0].ActualWidth);
- grids[0].ColumnDefinitions[0].SharedSizeGroup = null;
- root.Measure(new Size(52, 52));
- root.Arrange(new Rect(new Point(), new Point(52, 52)));
- Assert.Equal(0, grids[0].ColumnDefinitions[0].ActualWidth);
- }
- [Fact]
- public void Collection_Changes_Are_Tracked()
- {
- var grid = CreateGrid(
- ("A", new GridLength(20)),
- ("A", new GridLength(30)),
- ("A", new GridLength(40)),
- (null, new GridLength()));
- var scope = new Panel();
- scope.Children.Add(grid);
- var root = new TestRoot();
- root.SetValue(Grid.IsSharedSizeScopeProperty, true);
- root.Child = scope;
- grid.Measure(new Size(200, 200));
- grid.Arrange(new Rect(new Point(), new Point(200, 200)));
- Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(40, cd.ActualWidth));
- grid.ColumnDefinitions.RemoveAt(2);
- grid.Measure(new Size(200, 200));
- grid.Arrange(new Rect(new Point(), new Point(200, 200)));
- Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(30, cd.ActualWidth));
- grid.ColumnDefinitions.Insert(1, new ColumnDefinition { Width = new GridLength(35), SharedSizeGroup = "A" });
- grid.Measure(new Size(200, 200));
- grid.Arrange(new Rect(new Point(), new Point(200, 200)));
- Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(35, cd.ActualWidth));
- grid.ColumnDefinitions[1] = new ColumnDefinition { Width = new GridLength(10), SharedSizeGroup = "A" };
- grid.Measure(new Size(200, 200));
- grid.Arrange(new Rect(new Point(), new Point(200, 200)));
- Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(30, cd.ActualWidth));
- grid.ColumnDefinitions[1] = new ColumnDefinition { Width = new GridLength(50), SharedSizeGroup = "A" };
- grid.Measure(new Size(200, 200));
- grid.Arrange(new Rect(new Point(), new Point(200, 200)));
- Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(50, cd.ActualWidth));
- }
- [Fact]
- public void Size_Priorities_Are_Maintained()
- {
- var sizers = new List<Control>();
- var grid = CreateGrid(
- ("A", new GridLength(20)),
- ("A", new GridLength(20, GridUnitType.Auto)),
- ("A", new GridLength(1, GridUnitType.Star)),
- ("A", new GridLength(1, GridUnitType.Star)),
- (null, new GridLength()));
- for (int i = 0; i < 3; i++)
- sizers.Add(AddSizer(grid, i, 6 + i * 6));
- var scope = new Panel();
- scope.Children.Add(grid);
- var root = new TestRoot();
- root.SetValue(Grid.IsSharedSizeScopeProperty, true);
- root.Child = scope;
- grid.Measure(new Size(100, 100));
- grid.Arrange(new Rect(new Point(), new Point(100, 100)));
- // all in group are equal to the first fixed column
- Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(20, cd.ActualWidth));
- grid.ColumnDefinitions[0].SharedSizeGroup = null;
- grid.Measure(new Size(100, 100));
- grid.Arrange(new Rect(new Point(), new Point(100, 100)));
- // all in group are equal to width (MinWidth) of the sizer in the second column
- Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(6 + 1 * 6, cd.ActualWidth));
- grid.ColumnDefinitions[1].SharedSizeGroup = null;
- grid.Measure(new Size(double.PositiveInfinity, 100));
- grid.Arrange(new Rect(new Point(), new Point(100, 100)));
- // with no constraint star columns default to the MinWidth of the sizer in the column
- Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(6 + 2 * 6, cd.ActualWidth));
- }
- // grid creators
- private Grid CreateGrid(params string[] columnGroups)
- {
- return CreateGrid(columnGroups.Select(s => (s, ColumnDefinition.WidthProperty.GetDefaultValue(typeof(ColumnDefinition)))).ToArray());
- }
- private Grid CreateGrid(params (string name, GridLength width)[] columns)
- {
- return CreateGrid(columns.Select(c =>
- (c.name, c.width, ColumnDefinition.MinWidthProperty.GetDefaultValue(typeof(ColumnDefinition)))).ToArray());
- }
- private Grid CreateGrid(params (string name, GridLength width, double minWidth)[] columns)
- {
- return CreateGrid(columns.Select(c =>
- (c.name, c.width, c.minWidth, ColumnDefinition.MaxWidthProperty.GetDefaultValue(typeof(ColumnDefinition)))).ToArray());
- }
- private Grid CreateGrid(params (string name, GridLength width, double minWidth, double maxWidth)[] columns)
- {
- var columnDefinitions = new ColumnDefinitions();
- columnDefinitions.AddRange(
- columns.Select(c => new ColumnDefinition
- {
- SharedSizeGroup = c.name,
- Width = c.width,
- MinWidth = c.minWidth,
- MaxWidth = c.maxWidth
- })
- );
- var grid = new Grid
- {
- ColumnDefinitions = columnDefinitions
- };
- return grid;
- }
- private Control AddSizer(Grid grid, int column, double size = 30)
- {
- var ctrl = new Control { MinWidth = size, MinHeight = size };
- ctrl.SetValue(Grid.ColumnProperty, column);
- grid.Children.Add(ctrl);
- return ctrl;
- }
- }
- }
|