mirror of
https://github.com/AtomUI/AtomUI.git
synced 2026-10-18 22:46:38 +08:00
134 lines
5.3 KiB
C#
134 lines
5.3 KiB
C#
using AtomUI.Controls;
|
|
using AtomUI.Controls.Primitives;
|
|
using AtomUI.Desktop.Controls.DesignTokens;
|
|
using AtomUI.Theme.Resources;
|
|
using Avalonia;
|
|
using Avalonia.Headless;
|
|
using Avalonia.Media;
|
|
using Avalonia.Threading;
|
|
using Avalonia.VisualTree;
|
|
using Shouldly;
|
|
using Xunit;
|
|
using AvaloniaWindow = Avalonia.Controls.Window;
|
|
|
|
namespace AtomUI.Desktop.Controls.Tests.Input;
|
|
|
|
public class LineEditBorderRenderTests
|
|
{
|
|
static LineEditBorderRenderTests()
|
|
{
|
|
AvaloniaTestApp.EnsureInitialized();
|
|
}
|
|
|
|
[Fact]
|
|
public void Outlined_LineEdit_AddOn_Frames_Keep_Their_Border_Segments_At_Fractional_Scale()
|
|
{
|
|
var lineEdit = new LineEdit
|
|
{
|
|
Width = 300,
|
|
Height = 40,
|
|
LeftAddOn = "https://",
|
|
RightAddOn = ".com",
|
|
IsMotionEnabled = false
|
|
};
|
|
var host = new AvaloniaWindow
|
|
{
|
|
Width = 360,
|
|
Height = 100,
|
|
Content = lineEdit
|
|
};
|
|
|
|
try
|
|
{
|
|
host.SetRenderScaling(5d / 3d);
|
|
host.Show();
|
|
lineEdit.ApplyTemplate();
|
|
host.UpdateLayout();
|
|
Dispatcher.UIThread.RunJobs();
|
|
|
|
var frames = lineEdit.GetVisualDescendants()
|
|
.OfType<PixelAlignedBorder>()
|
|
.Where(border => border.Name is
|
|
"PART_LeftAddOn" or "PART_ContentFrame" or "PART_RightAddOn")
|
|
.ToDictionary(border => border.Name!);
|
|
var left = frames["PART_LeftAddOn"];
|
|
var content = frames["PART_ContentFrame"];
|
|
var right = frames["PART_RightAddOn"];
|
|
var expectedBorderBrush = GetThemeResource<IBrush>(SharedTokenKind.ColorBorder);
|
|
var expectedPadding = GetThemeResource<Thickness>(SharedTokenKind.InputPadding);
|
|
|
|
left.StyleKey.ShouldBe(left.GetType());
|
|
content.StyleKey.ShouldBe(content.GetType());
|
|
right.StyleKey.ShouldBe(right.GetType());
|
|
BrushShouldHaveSameColor(left.BorderBrush, expectedBorderBrush);
|
|
BrushShouldHaveSameColor(content.BorderBrush, expectedBorderBrush);
|
|
BrushShouldHaveSameColor(right.BorderBrush, expectedBorderBrush);
|
|
left.BorderThickness.ShouldBe(new Thickness(1, 1, 0, 1));
|
|
content.BorderThickness.ShouldBe(new Thickness(1));
|
|
right.BorderThickness.ShouldBe(new Thickness(0, 1, 1, 1));
|
|
left.Padding.ShouldBe(expectedPadding);
|
|
content.Padding.ShouldBe(expectedPadding);
|
|
right.Padding.ShouldBe(expectedPadding);
|
|
|
|
var physicalPixel = 1 / host.RenderScaling;
|
|
Math.Abs(left.Bounds.Right - content.Bounds.Left).ShouldBeLessThanOrEqualTo(physicalPixel + 0.001);
|
|
Math.Abs(content.Bounds.Right - right.Bounds.Left).ShouldBeLessThanOrEqualTo(physicalPixel + 0.001);
|
|
left.Bounds.Height.ShouldBe(content.Bounds.Height, 0.001);
|
|
right.Bounds.Height.ShouldBe(content.Bounds.Height, 0.001);
|
|
|
|
lineEdit.Status = InputControlStatus.Error;
|
|
Dispatcher.UIThread.RunJobs();
|
|
|
|
var errorBrush = GetThemeResource<IBrush>(SharedTokenKind.ColorError);
|
|
BrushShouldHaveSameColor(left.BorderBrush, errorBrush);
|
|
BrushShouldHaveSameColor(content.BorderBrush, errorBrush);
|
|
BrushShouldHaveSameColor(right.BorderBrush, errorBrush);
|
|
|
|
lineEdit.Status = InputControlStatus.Default;
|
|
lineEdit.StyleVariant = InputControlStyleVariant.Filled;
|
|
Dispatcher.UIThread.RunJobs();
|
|
|
|
var filledBrush = GetThemeResource<IBrush>(SharedTokenKind.ColorFillTertiary);
|
|
BrushShouldHaveSameColor(left.Background, filledBrush);
|
|
BrushShouldHaveSameColor(left.BorderBrush, filledBrush);
|
|
BrushShouldHaveSameColor(right.Background, filledBrush);
|
|
BrushShouldHaveSameColor(right.BorderBrush, filledBrush);
|
|
|
|
lineEdit.StyleVariant = InputControlStyleVariant.Outlined;
|
|
lineEdit.IsEnabled = false;
|
|
Dispatcher.UIThread.RunJobs();
|
|
|
|
var disabledBackground = GetThemeResource<IBrush>(SharedTokenKind.ColorBgContainerDisabled);
|
|
BrushShouldHaveSameColor(left.Background, disabledBackground);
|
|
BrushShouldHaveSameColor(left.BorderBrush, expectedBorderBrush);
|
|
BrushShouldHaveSameColor(right.Background, disabledBackground);
|
|
BrushShouldHaveSameColor(right.BorderBrush, expectedBorderBrush);
|
|
}
|
|
finally
|
|
{
|
|
host.Close();
|
|
}
|
|
}
|
|
|
|
private static T GetThemeResource<T>(object key)
|
|
{
|
|
var application = Application.Current;
|
|
application.ShouldNotBeNull();
|
|
application!.TryGetResource(key, application.ActualThemeVariant, out var value).ShouldBeTrue();
|
|
value.ShouldBeAssignableTo<T>();
|
|
return (T)value!;
|
|
}
|
|
|
|
private static void BrushShouldHaveSameColor(IBrush? actual, IBrush? expected)
|
|
{
|
|
GetSolidBrushColor(actual).ShouldBe(GetSolidBrushColor(expected));
|
|
}
|
|
|
|
private static Color GetSolidBrushColor(IBrush? brush)
|
|
{
|
|
brush.ShouldNotBeNull();
|
|
brush.ShouldBeAssignableTo<ISolidColorBrush>();
|
|
return ((ISolidColorBrush)brush!).Color;
|
|
}
|
|
}
|