csharpc-sharpdotnetxamlavaloniauicross-platformcross-platform-xamlavaloniaguimulti-platformuser-interfacedotnetcore
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
211 lines
7.7 KiB
211 lines
7.7 KiB
using System;
|
|
using Avalonia.Platform;
|
|
using Avalonia.Styling;
|
|
using Avalonia.UnitTests;
|
|
using Xunit;
|
|
|
|
namespace Avalonia.Controls.UnitTests;
|
|
|
|
public class ThemeVariantTests : ScopedTestBase
|
|
{
|
|
[Fact]
|
|
public void Application_ActualThemeVariant_Falls_Back_To_Light_Without_Platform_Settings()
|
|
{
|
|
var application = new Application();
|
|
application.InitializeThemeVariant();
|
|
|
|
Assert.Equal(ThemeVariant.Light, application.ActualThemeVariant);
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData(PlatformThemeVariant.Light)]
|
|
[InlineData(PlatformThemeVariant.Dark)]
|
|
public void Application_ActualThemeVariant_Is_Initialized_From_Platform_Settings(
|
|
PlatformThemeVariant platformThemeVariant)
|
|
{
|
|
using var app = StartApplication(new TestPlatformSettings(platformThemeVariant));
|
|
|
|
Assert.Equal((ThemeVariant)platformThemeVariant, Application.Current!.ActualThemeVariant);
|
|
}
|
|
|
|
[Fact]
|
|
public void Application_ActualThemeVariant_Follows_Platform_Settings_Changes()
|
|
{
|
|
var platformSettings = new TestPlatformSettings(PlatformThemeVariant.Light);
|
|
using var app = StartApplication(platformSettings);
|
|
var application = Application.Current!;
|
|
|
|
var raised = 0;
|
|
application.ActualThemeVariantChanged += (_, _) => ++raised;
|
|
|
|
platformSettings.ThemeVariant = PlatformThemeVariant.Dark;
|
|
|
|
Assert.Equal(ThemeVariant.Dark, application.ActualThemeVariant);
|
|
Assert.Equal(1, raised);
|
|
}
|
|
|
|
[Fact]
|
|
public void Application_RequestedThemeVariant_Overrides_Platform_Settings()
|
|
{
|
|
var platformSettings = new TestPlatformSettings(PlatformThemeVariant.Light);
|
|
using var app = StartApplication(platformSettings);
|
|
var application = Application.Current!;
|
|
|
|
application.RequestedThemeVariant = ThemeVariant.Dark;
|
|
|
|
Assert.Equal(ThemeVariant.Dark, application.ActualThemeVariant);
|
|
|
|
platformSettings.ThemeVariant = PlatformThemeVariant.Light;
|
|
Assert.Equal(ThemeVariant.Dark, application.ActualThemeVariant);
|
|
}
|
|
|
|
[Fact]
|
|
public void Application_ActualThemeVariant_Reverts_To_Platform_Settings_When_Requesting_Default()
|
|
{
|
|
var platformSettings = new TestPlatformSettings(PlatformThemeVariant.Dark);
|
|
using var app = StartApplication(platformSettings);
|
|
var application = Application.Current!;
|
|
|
|
application.RequestedThemeVariant = ThemeVariant.Light;
|
|
Assert.Equal(ThemeVariant.Light, application.ActualThemeVariant);
|
|
|
|
application.RequestedThemeVariant = ThemeVariant.Default;
|
|
Assert.Equal(ThemeVariant.Dark, application.ActualThemeVariant);
|
|
}
|
|
|
|
[Fact]
|
|
public void Application_ActualThemeVariant_Reverts_To_Platform_Settings_When_Requesting_Null()
|
|
{
|
|
var platformSettings = new TestPlatformSettings(PlatformThemeVariant.Dark);
|
|
using var app = StartApplication(platformSettings);
|
|
var application = Application.Current!;
|
|
|
|
application.RequestedThemeVariant = ThemeVariant.Light;
|
|
Assert.Equal(ThemeVariant.Light, application.ActualThemeVariant);
|
|
|
|
application.RequestedThemeVariant = null;
|
|
Assert.Equal(ThemeVariant.Dark, application.ActualThemeVariant);
|
|
}
|
|
|
|
[Fact]
|
|
public void Application_Custom_ThemeVariant_Is_Used_As_Is()
|
|
{
|
|
var custom = new ThemeVariant("Custom", ThemeVariant.Dark);
|
|
using var app = StartApplication(new TestPlatformSettings(PlatformThemeVariant.Light));
|
|
var application = Application.Current!;
|
|
|
|
application.RequestedThemeVariant = custom;
|
|
|
|
Assert.Equal(custom, application.ActualThemeVariant);
|
|
}
|
|
|
|
[Fact]
|
|
public void TopLevel_ActualThemeVariant_Is_Initialized_From_Application()
|
|
{
|
|
using var app = StartApplication(new TestPlatformSettings(PlatformThemeVariant.Light));
|
|
|
|
BindApplicationAsThemeVariantHost();
|
|
Application.Current!.RequestedThemeVariant = ThemeVariant.Dark;
|
|
|
|
var window = new Window();
|
|
|
|
Assert.Equal(ThemeVariant.Dark, window.ActualThemeVariant);
|
|
}
|
|
|
|
[Fact]
|
|
public void TopLevel_ActualThemeVariant_Is_Initialized_From_Platform_Settings_Without_ThemeVariantHost()
|
|
{
|
|
using var app = StartApplication(new TestPlatformSettings(PlatformThemeVariant.Dark));
|
|
|
|
var window = new Window();
|
|
|
|
Assert.Equal(ThemeVariant.Dark, window.ActualThemeVariant);
|
|
}
|
|
|
|
[Fact]
|
|
public void TopLevel_ActualThemeVariant_Follows_Application()
|
|
{
|
|
var platformSettings = new TestPlatformSettings(PlatformThemeVariant.Light);
|
|
using var app = StartApplication(platformSettings);
|
|
var application = Application.Current!;
|
|
|
|
BindApplicationAsThemeVariantHost();
|
|
|
|
var window = new Window();
|
|
Assert.Equal(ThemeVariant.Light, window.ActualThemeVariant);
|
|
|
|
application.RequestedThemeVariant = ThemeVariant.Dark;
|
|
Assert.Equal(ThemeVariant.Dark, window.ActualThemeVariant);
|
|
|
|
application.RequestedThemeVariant = ThemeVariant.Default;
|
|
Assert.Equal(ThemeVariant.Light, window.ActualThemeVariant);
|
|
|
|
platformSettings.ThemeVariant = PlatformThemeVariant.Dark;
|
|
Assert.Equal(ThemeVariant.Dark, window.ActualThemeVariant);
|
|
}
|
|
|
|
[Fact]
|
|
public void TopLevel_RequestedThemeVariant_Overrides_Application_And_Is_Sent_To_Platform_Impl()
|
|
{
|
|
using var app = StartApplication(new TestPlatformSettings(PlatformThemeVariant.Dark));
|
|
|
|
BindApplicationAsThemeVariantHost();
|
|
|
|
var window = new Window { RequestedThemeVariant = ThemeVariant.Light };
|
|
|
|
Assert.Equal(ThemeVariant.Dark, Application.Current!.ActualThemeVariant);
|
|
Assert.Equal(ThemeVariant.Light, window.ActualThemeVariant);
|
|
}
|
|
|
|
[Fact]
|
|
public void TopLevel_ActualThemeVariant_Is_Inherited_By_Children()
|
|
{
|
|
using var app = StartApplication(new TestPlatformSettings(PlatformThemeVariant.Dark));
|
|
|
|
BindApplicationAsThemeVariantHost();
|
|
|
|
var child = new Border();
|
|
var scope = new ThemeVariantScope { Child = child };
|
|
var window = new Window { Content = scope };
|
|
window.Show();
|
|
|
|
Assert.Equal(ThemeVariant.Dark, scope.ActualThemeVariant);
|
|
Assert.Equal(ThemeVariant.Dark, child.ActualThemeVariant);
|
|
|
|
scope.RequestedThemeVariant = ThemeVariant.Light;
|
|
|
|
Assert.Equal(ThemeVariant.Dark, window.ActualThemeVariant);
|
|
Assert.Equal(ThemeVariant.Light, scope.ActualThemeVariant);
|
|
Assert.Equal(ThemeVariant.Light, child.ActualThemeVariant);
|
|
}
|
|
|
|
[Fact]
|
|
public void ThemeVariantScope_Requesting_Default_Reinherits_From_Parent()
|
|
{
|
|
using var app = StartApplication(new TestPlatformSettings(PlatformThemeVariant.Light));
|
|
|
|
BindApplicationAsThemeVariantHost();
|
|
Application.Current!.RequestedThemeVariant = ThemeVariant.Dark;
|
|
|
|
var child = new Border();
|
|
var scope = new ThemeVariantScope { Child = child };
|
|
var window = new Window { Content = scope };
|
|
window.Show();
|
|
|
|
scope.RequestedThemeVariant = ThemeVariant.Light;
|
|
Assert.Equal(ThemeVariant.Light, scope.ActualThemeVariant);
|
|
Assert.Equal(ThemeVariant.Light, child.ActualThemeVariant);
|
|
|
|
scope.RequestedThemeVariant = ThemeVariant.Default;
|
|
Assert.Equal(ThemeVariant.Dark, scope.ActualThemeVariant);
|
|
Assert.Equal(ThemeVariant.Dark, child.ActualThemeVariant);
|
|
}
|
|
|
|
private static IDisposable StartApplication(TestPlatformSettings platformSettings)
|
|
=> UnitTestApplication.Start(TestServices.StyledWindow.With(
|
|
platformSettings: platformSettings,
|
|
windowingPlatform: new MockWindowingPlatform()));
|
|
|
|
private static void BindApplicationAsThemeVariantHost()
|
|
=> AvaloniaLocator.CurrentMutable.Bind<IThemeVariantHost>().ToConstant(Application.Current!);
|
|
}
|
|
|