mirror of
https://github.com/AtomUI/AtomUI.git
synced 2026-10-18 22:46:38 +08:00
117 lines
4.8 KiB
C#
117 lines
4.8 KiB
C#
using AtomUI.Localization;
|
|
using Avalonia.Controls;
|
|
using Avalonia.Styling;
|
|
|
|
namespace AtomUI.Localization.Performance;
|
|
|
|
internal static class LocalizationStateVerification
|
|
{
|
|
internal static bool Run()
|
|
{
|
|
try
|
|
{
|
|
using var runtime = LocalizationScenarios.BuildRuntime(2, 8, 3);
|
|
var manager = runtime.LanguageManager;
|
|
var expectedSlots = manager.SupportedLanguages.Count * runtime.Registry.Catalogs.Sum(
|
|
static catalog => catalog.Units.Count);
|
|
var actualSlots = runtime.Snapshots.Count * runtime.Registry.Catalogs.Sum(
|
|
static catalog => catalog.Units.Count);
|
|
|
|
if (actualSlots != expectedSlots)
|
|
{
|
|
Console.Error.WriteLine($"Localization verification failed: expected {expectedSlots} snapshot slots, got {actualSlots}.");
|
|
return false;
|
|
}
|
|
|
|
var host = new Border();
|
|
host.Resources.MergedDictionaries.Add(runtime.ResourceProvider);
|
|
var resourceNotifications = 0;
|
|
var languageEvents = 0;
|
|
((IResourceHost)host).ResourcesChanged += (_, _) => resourceNotifications++;
|
|
manager.LanguageChanged += (_, _) => languageEvents++;
|
|
var initialState = manager.Current;
|
|
if (initialState.CurrentLanguage != LanguageTags.EnUS || initialState.Revision != 0)
|
|
{
|
|
Console.Error.WriteLine(
|
|
$"Localization verification failed: expected initial en-US revision 0, got " +
|
|
$"'{initialState.CurrentLanguage.Value}' revision {initialState.Revision}.");
|
|
return false;
|
|
}
|
|
if (!VerifyResolvedValue(runtime, "en-US:0:0", "initial language"))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
var transitions = 0;
|
|
foreach (var language in manager.SupportedLanguages.Skip(1).Select(static definition => definition.Tag))
|
|
{
|
|
var previousState = manager.Current;
|
|
var result = manager.ChangeLanguage(language);
|
|
transitions++;
|
|
if (result.Status != LanguageChangeStatus.Committed ||
|
|
result.OldState != previousState ||
|
|
result.NewState.CurrentLanguage != language ||
|
|
result.NewState.Revision != previousState.Revision + 1)
|
|
{
|
|
Console.Error.WriteLine(
|
|
$"Localization verification failed: switch to '{language.Value}' did not return the expected committed revision.");
|
|
return false;
|
|
}
|
|
if (manager.Current != result.NewState)
|
|
{
|
|
Console.Error.WriteLine(
|
|
$"Localization verification failed: manager state does not match the committed '{language.Value}' revision.");
|
|
return false;
|
|
}
|
|
if (!VerifyResolvedValue(runtime, $"{language.Value}:0:0", $"language '{language.Value}'"))
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
if (resourceNotifications != transitions || languageEvents != transitions)
|
|
{
|
|
Console.Error.WriteLine(
|
|
$"Localization verification failed: expected {transitions} notifications/events, " +
|
|
$"got {resourceNotifications}/{languageEvents}.");
|
|
return false;
|
|
}
|
|
|
|
Console.WriteLine($"Localization state verification passed ({transitions} committed language changes).");
|
|
return true;
|
|
}
|
|
catch (Exception exception)
|
|
{
|
|
Console.Error.WriteLine($"Localization verification failed: {exception.Message}");
|
|
return false;
|
|
}
|
|
}
|
|
|
|
private static bool VerifyResolvedValue(
|
|
LocalizationRuntime runtime,
|
|
string expected,
|
|
string context)
|
|
{
|
|
var localized = runtime.Localizer.Get(LocalizationScenarios.Catalog0ResourceKind.Value);
|
|
if (!string.Equals(localized, expected, StringComparison.Ordinal))
|
|
{
|
|
Console.Error.WriteLine(
|
|
$"Localization verification failed: {context} localizer value should be '{expected}', got '{localized}'.");
|
|
return false;
|
|
}
|
|
|
|
if (!runtime.ResourceProvider.TryGetResource(
|
|
LocalizationScenarios.Catalog0ResourceKind.Value,
|
|
theme: null,
|
|
out var resource) ||
|
|
!string.Equals(resource as string, expected, StringComparison.Ordinal))
|
|
{
|
|
Console.Error.WriteLine(
|
|
$"Localization verification failed: {context} resource value should be '{expected}', got '{resource}'.");
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|