Files

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;
}
}