Files
LanMountainDesktop/tests/LanMountainDesktop.Tests/CornerRadiusStyleTests.cs

95 lines
3.7 KiB
C#
Raw Normal View History

2026-04-08 00:55:10 +08:00
using Avalonia;
2026-08-11 23:03:55 +08:00
using LanMountainDesktop.AirAppSdk;
using LanMountainDesktop.AirAppSdk;
2026-04-08 00:55:10 +08:00
using LanMountainDesktop.Shared.Contracts;
using Xunit;
namespace LanMountainDesktop.Tests;
public sealed class CornerRadiusStyleTests
{
[Theory]
[InlineData("Sharp", "Sharp")]
[InlineData("Balanced", "Balanced")]
[InlineData("Rounded", "Rounded")]
[InlineData("Open", "Open")]
[InlineData("Fluent", "Fluent")]
2026-04-08 00:55:10 +08:00
[InlineData("Unknown", "Balanced")]
[InlineData(null, "Balanced")]
public void NormalizeCornerRadiusStyle_ReturnsValidStyleOrDefault(string? input, string expected)
{
Assert.Equal(expected, GlobalAppearanceSettings.NormalizeCornerRadiusStyle(input));
}
[Fact]
public void FluentStyle_ReturnsFluentDesignSystemValues()
{
2026-08-11 23:03:55 +08:00
var tokens = LanMountainDesktop.AirAppSdk.AppearanceCornerRadiusTokenFactory.Create(
GlobalAppearanceSettings.CornerRadiusStyleFluent);
// Microsoft Fluent Design System: ControlCornerRadius = 4px, OverlayCornerRadius = 8px
Assert.Equal(new CornerRadius(2), tokens.Micro);
Assert.Equal(new CornerRadius(4), tokens.Xs);
Assert.Equal(new CornerRadius(4), tokens.Sm);
Assert.Equal(new CornerRadius(8), tokens.Md);
Assert.Equal(new CornerRadius(8), tokens.Lg);
Assert.Equal(new CornerRadius(12), tokens.Xl);
Assert.Equal(new CornerRadius(16), tokens.Island);
Assert.Equal(new CornerRadius(8), tokens.Component);
}
2026-04-08 00:55:10 +08:00
[Fact]
2026-08-11 23:03:55 +08:00
public void AirAppAppearanceContext_ResolveCornerRadius_ReturnsFixedTokenValues()
2026-04-08 00:55:10 +08:00
{
2026-08-11 23:03:55 +08:00
var context = new AirAppAppearanceContext(new AirAppAppearanceSnapshot(
CornerRadiusTokens: new AirAppCornerRadiusTokens(
2026-04-08 00:55:10 +08:00
Micro: 6d,
Xs: 12d,
Sm: 14d,
Md: 20d,
Lg: 28d,
Xl: 32d,
Island: 36d,
Component: 24d),
ThemeVariant: "Light"));
2026-04-12 13:52:52 +08:00
// Preset resolution should return fixed values from tokens
2026-08-11 23:03:55 +08:00
Assert.Equal(20d, context.ResolveCornerRadius(AirAppCornerRadiusPreset.Md), 3);
Assert.Equal(15d, context.ResolveCornerRadius(AirAppCornerRadiusPreset.Md, maximum: 15d), 3);
2026-04-12 13:52:52 +08:00
// ResolveScaledCornerRadius returns baseRadius as-is when no min/max specified
Assert.Equal(18d, context.ResolveScaledCornerRadius(18d), 3);
2026-08-11 23:03:55 +08:00
Assert.Equal(24d, context.ResolveCornerRadius(AirAppCornerRadiusPreset.Component), 3);
2026-04-08 00:55:10 +08:00
}
[Fact]
2026-08-11 23:03:55 +08:00
public void AirAppComponentContext_ProvidesDirectTokenAccess()
2026-04-08 00:55:10 +08:00
{
2026-08-11 23:03:55 +08:00
var appearanceContext = new AirAppAppearanceContext(new AirAppAppearanceSnapshot(
CornerRadiusTokens: new AirAppCornerRadiusTokens(6, 12, 14, 20, 28, 32, 36, 24),
2026-04-08 00:55:10 +08:00
ThemeVariant: "Dark"));
2026-08-11 23:03:55 +08:00
var context = new AirAppComponentContext(
new LanMountainDesktop.AirAppSdk.AirAppManifest("plugin.id", "AirApp Name", "plugin.dll"),
"C:\\AirApps\\plugin.id",
2026-04-08 00:55:10 +08:00
"C:\\Data\\plugin.id",
new NullServiceProvider(),
new Dictionary<string, object?>(),
"component-1",
null,
96d,
appearanceContext);
2026-04-12 13:52:52 +08:00
// ResolveScaledCornerRadius returns baseRadius as-is when no min/max specified
Assert.Equal(12d, context.ResolveScaledCornerRadius(12d), 3);
// When min/max specified, value is clamped
Assert.Equal(12d, context.ResolveScaledCornerRadius(12d, 8d, 18d), 3);
// Component token access
Assert.Equal(24d, context.CornerRadiusTokens.Component, 3);
2026-04-08 00:55:10 +08:00
}
private sealed class NullServiceProvider : IServiceProvider
{
public object? GetService(Type serviceType) => null;
}
}