mirror of
https://github.com/AtomUI/AtomUI.git
synced 2026-10-18 22:46:38 +08:00
150 lines
5.3 KiB
C#
150 lines
5.3 KiB
C#
using AtomUI.Localization;
|
|
using Avalonia;
|
|
using Avalonia.Controls;
|
|
using Avalonia.Markup.Xaml;
|
|
using Avalonia.Markup.Xaml.MarkupExtensions;
|
|
using Avalonia.Media;
|
|
using Shouldly;
|
|
using Xunit;
|
|
|
|
namespace AtomUI.Core.Tests.Localization;
|
|
|
|
public class ApplicationLocalizationStartupTests
|
|
{
|
|
[Fact]
|
|
public void UseAtomUI_Publishes_Default_Application_Services()
|
|
{
|
|
HeadlessTestApp.Run(() =>
|
|
{
|
|
var application = Application.Current!;
|
|
|
|
application.GetLanguageManager().ShouldBeNull();
|
|
application.GetLocalizer().ShouldBeNull();
|
|
application.UseAtomUI();
|
|
|
|
var scope = ApplicationScopeRegistry.Get(application).ShouldNotBeNull();
|
|
application.GetLanguageManager().ShouldBeSameAs(scope.LanguageManager);
|
|
application.GetLocalizer().ShouldBeSameAs(scope.Localizer);
|
|
application.GetThemeManager().ShouldBeSameAs(scope.ThemeManager);
|
|
scope.LanguageManager.Current.CurrentLanguage.ShouldBe(LanguageTags.EnUS);
|
|
scope.LanguageManager.Current.Revision.ShouldBe(0);
|
|
});
|
|
}
|
|
|
|
[Fact]
|
|
public void UseAtomUI_Uses_Strongly_Typed_Language_Configuration_Before_First_Window()
|
|
{
|
|
HeadlessTestApp.Run(() =>
|
|
{
|
|
var application = Application.Current!;
|
|
|
|
application.UseAtomUI(builder =>
|
|
{
|
|
builder.Localization.AddTranslationBundle(new TranslationBundleDescriptor(
|
|
"AtomUI.Core.Tests:AtomUI.Core.Tests.Localization.GeneratedStartupLangResourceKind",
|
|
LanguageTags.ArSA,
|
|
TranslationSourceKind.ApplicationOverride,
|
|
"AtomUI.Core.Tests",
|
|
["العربية", "{0} عناصر"]));
|
|
builder.UseLanguages(
|
|
LanguageTags.ArSA,
|
|
[LanguageTags.ArSA, LanguageTags.EnUS]);
|
|
});
|
|
var window = new Window();
|
|
window.Show();
|
|
|
|
application.GetLanguageManager()!.Current.CurrentLanguage.ShouldBe(LanguageTags.ArSA);
|
|
window.FlowDirection.ShouldBe(FlowDirection.RightToLeft);
|
|
window.Close();
|
|
});
|
|
}
|
|
|
|
[Fact]
|
|
public void UseAtomUI_Invokes_Generated_Bootstrap_Before_User_Configuration()
|
|
{
|
|
HeadlessTestApp.Run(() =>
|
|
{
|
|
var application = (TestApplication)Application.Current!;
|
|
var configured = false;
|
|
application.ShouldBeAssignableTo<IGeneratedApplicationLanguageBootstrap>();
|
|
application.UseAtomUI(builder =>
|
|
{
|
|
configured = true;
|
|
builder.UseLanguages(
|
|
LanguageTags.EnUS,
|
|
[LanguageTags.EnUS, LanguageTags.ZhCN]);
|
|
});
|
|
|
|
configured.ShouldBeTrue();
|
|
application.GetLocalizer()!
|
|
.Get(GeneratedStartupLangResourceKind.Value)
|
|
.ShouldBe("English");
|
|
application.GetLocalizer()!
|
|
.Format(GeneratedStartupLangResourceKind.ItemCount, 3)
|
|
.ShouldBe("3 items");
|
|
});
|
|
}
|
|
|
|
[Fact]
|
|
public void Application_Dynamic_Enum_Resources_Refresh_After_Committed_Change()
|
|
{
|
|
HeadlessTestApp.Run(() =>
|
|
{
|
|
var application = (TestApplication)Application.Current!;
|
|
application.UseAtomUI(builder => builder.UseLanguages(
|
|
LanguageTags.EnUS,
|
|
[LanguageTags.EnUS, LanguageTags.ZhCN]));
|
|
|
|
var text = new TextBlock();
|
|
var extension = new GeneratedStartupLangResourceExtension(
|
|
GeneratedStartupLangResourceKind.Value);
|
|
var dynamicResource = extension.ProvideValue(
|
|
new ProvideValueServiceProvider(text, TextBlock.TextProperty))
|
|
.ShouldBeOfType<DynamicResourceExtension>();
|
|
dynamicResource.ResourceKey.ShouldBe(GeneratedStartupLangResourceKind.Value);
|
|
text.Bind(TextBlock.TextProperty, dynamicResource);
|
|
var window = new Window
|
|
{
|
|
Content = text
|
|
};
|
|
window.Show();
|
|
|
|
text.Text.ShouldBe("English");
|
|
application.GetLanguageManager()!.ChangeLanguage(LanguageTags.ZhCN);
|
|
text.Text.ShouldBe("中文");
|
|
application.GetLocalizer()!
|
|
.Format(GeneratedStartupLangResourceKind.ItemCount, 3)
|
|
.ShouldBe("3 项");
|
|
window.Close();
|
|
});
|
|
}
|
|
|
|
[Fact]
|
|
public void UseAtomUI_Rejects_Duplicate_Initialization()
|
|
{
|
|
HeadlessTestApp.Run(() =>
|
|
{
|
|
var application = Application.Current!;
|
|
application.UseAtomUI();
|
|
|
|
var exception = Should.Throw<InvalidOperationException>(() => application.UseAtomUI());
|
|
|
|
exception.Message.ShouldContain("already initialized");
|
|
});
|
|
}
|
|
|
|
private sealed class ProvideValueServiceProvider(
|
|
object targetObject,
|
|
object targetProperty) : IServiceProvider, IProvideValueTarget
|
|
{
|
|
public object TargetObject { get; } = targetObject;
|
|
|
|
public object TargetProperty { get; } = targetProperty;
|
|
|
|
public object? GetService(Type serviceType)
|
|
{
|
|
return serviceType == typeof(IProvideValueTarget) ? this : null;
|
|
}
|
|
}
|
|
}
|