mirror of
https://github.com/AtomUI/AtomUI.git
synced 2026-10-18 14:37:19 +08:00
128 lines
3.9 KiB
C#
128 lines
3.9 KiB
C#
using AtomUI.Controls;
|
|
using Avalonia;
|
|
using Avalonia.Controls;
|
|
using Avalonia.Threading;
|
|
using Avalonia.VisualTree;
|
|
using Shouldly;
|
|
using Xunit;
|
|
using AvaloniaWindow = Avalonia.Controls.Window;
|
|
|
|
namespace AtomUI.Desktop.Controls.Tests.SelectControl;
|
|
|
|
public class SelectPrefixAlignmentTests
|
|
{
|
|
static SelectPrefixAlignmentTests()
|
|
{
|
|
AvaloniaTestApp.EnsureInitialized();
|
|
}
|
|
|
|
[Fact]
|
|
public void MultipleMode_Prefix_LeftInset_Should_Match_SingleMode()
|
|
{
|
|
var single = new Desktop.Controls.Select
|
|
{
|
|
Width = 200,
|
|
Mode = SelectMode.Single,
|
|
ContentLeftAddOn = "User",
|
|
OptionsSource = [new SelectOption { Header = "Lucy", Content = "lucy" }],
|
|
DefaultValues = ["lucy"]
|
|
};
|
|
var multiple = new Desktop.Controls.Select
|
|
{
|
|
Width = 200,
|
|
Mode = SelectMode.Multiple,
|
|
ContentLeftAddOn = "User",
|
|
OptionsSource = [new SelectOption { Header = "Lucy", Content = "lucy" }],
|
|
DefaultValues = ["lucy"]
|
|
};
|
|
|
|
var panel = new StackPanel
|
|
{
|
|
Width = 240,
|
|
Spacing = 10,
|
|
Children = { single, multiple }
|
|
};
|
|
|
|
ShowInWindow(panel, () =>
|
|
{
|
|
var singleInset = GetPrefixLeftInset(single);
|
|
var multipleInset = GetPrefixLeftInset(multiple);
|
|
|
|
multiple.IsSelectionEmpty.ShouldBeFalse();
|
|
multipleInset.ShouldBe(singleInset, 0.51,
|
|
"多选模式下 prefix 的左内缩应与单选模式一致(对齐 Ant Design 规范)");
|
|
});
|
|
}
|
|
|
|
[Fact]
|
|
public void TagsMode_Prefix_LeftInset_Should_Match_SingleMode()
|
|
{
|
|
var single = new Desktop.Controls.Select
|
|
{
|
|
Width = 200,
|
|
Mode = SelectMode.Single,
|
|
ContentLeftAddOn = "User",
|
|
OptionsSource = [new SelectOption { Header = "Lucy", Content = "lucy" }],
|
|
DefaultValues = ["lucy"]
|
|
};
|
|
var tags = new Desktop.Controls.Select
|
|
{
|
|
Width = 200,
|
|
Mode = SelectMode.Tags,
|
|
ContentLeftAddOn = "User",
|
|
OptionsSource = [new SelectOption { Header = "Lucy", Content = "lucy" }],
|
|
DefaultValues = ["lucy"]
|
|
};
|
|
|
|
var panel = new StackPanel
|
|
{
|
|
Width = 240,
|
|
Spacing = 10,
|
|
Children = { single, tags }
|
|
};
|
|
|
|
ShowInWindow(panel, () =>
|
|
{
|
|
var singleInset = GetPrefixLeftInset(single);
|
|
var tagsInset = GetPrefixLeftInset(tags);
|
|
|
|
tags.IsSelectionEmpty.ShouldBeFalse();
|
|
tagsInset.ShouldBe(singleInset, 0.51,
|
|
"Tags 模式下 prefix 的左内缩应与单选模式一致(对齐 Ant Design 规范)");
|
|
});
|
|
}
|
|
|
|
private static double GetPrefixLeftInset(Desktop.Controls.Select select)
|
|
{
|
|
var frame = select.GetVisualDescendants()
|
|
.OfType<AddOnDecoratedBoxContentFrame>()
|
|
.Single(f => f.Name == "PART_ContentFrame");
|
|
var prefix = select.GetVisualDescendants()
|
|
.OfType<AddOnContentPresenter>()
|
|
.Single(p => p.Name == "PART_ContentLeftAddOn");
|
|
var prefixTopLeft = prefix.TranslatePoint(new Point(0, 0), frame)!.Value;
|
|
return prefixTopLeft.X - frame.BorderThickness.Left;
|
|
}
|
|
|
|
private static void ShowInWindow(Control content, Action assertion)
|
|
{
|
|
var window = new AvaloniaWindow
|
|
{
|
|
Width = 420,
|
|
Height = 320,
|
|
Content = content
|
|
};
|
|
|
|
try
|
|
{
|
|
window.Show();
|
|
Dispatcher.UIThread.RunJobs();
|
|
assertion();
|
|
}
|
|
finally
|
|
{
|
|
window.Close();
|
|
}
|
|
}
|
|
}
|