Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions tests/ConsoleMode.Tests/LocalizationTests.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
using System.Text.Json;
using System.Text.RegularExpressions;
using ConsoleMode.Models;
using ConsoleMode.Services;

namespace ConsoleMode.Tests;

public sealed class LocalizationTests
{
private static readonly Regex PlaceholderPattern = new(@"\{\d+\}", RegexOptions.Compiled);

[Fact]
public void Embedded_catalogs_support_en_us_and_pt_br_with_matching_keys()
{
Expand Down Expand Up @@ -56,6 +59,26 @@ public void Every_xaml_text_property_has_a_key_in_both_catalogs()
}
}

[Fact]
public void Catalog_placeholders_match_english()
{
var english = LoadCatalog(LocalizationService.EnglishUnitedStates);
foreach (var language in LocalizationService.SupportedLanguages
.Select(l => l.Code)
.Where(code => code != LocalizationService.EnglishUnitedStates))
{
var localized = LoadCatalog(language);
foreach (var key in english.Keys.Order())
{
var expected = ExtractPlaceholders(english[key]);
var actual = ExtractPlaceholders(localized[key]);
Assert.True(
expected.SetEquals(actual),
$"{language}:{key} has placeholders {{{string.Join(", ", actual.Order())}}}; expected {{{string.Join(", ", expected.Order())}}}.");
}
}
}

[Fact]
public void Display_mode_labels_follow_the_language_switch()
{
Expand Down Expand Up @@ -115,4 +138,15 @@ public void App_language_config_is_empty_until_chosen_and_roundtrips()
[InlineData(null, null, null, "en-US")]
public void Initial_language_follows_saved_choice_then_installer_then_windows(string? saved, string? installer, string? windows, string expected) =>
Assert.Equal(expected, LocalizationService.ResolveInitial(saved, installer, windows));

private static Dictionary<string, string> LoadCatalog(string language)
{
var resourceName = $"ConsoleMode.Localization.Strings.{language}.json";
using var stream = typeof(LocalizationService).Assembly.GetManifestResourceStream(resourceName);
Assert.NotNull(stream);
return JsonSerializer.Deserialize<Dictionary<string, string>>(stream!)!;
}

private static HashSet<string> ExtractPlaceholders(string value) =>
PlaceholderPattern.Matches(value).Select(match => match.Value).ToHashSet();
}
Loading