using System.Collections.Immutable;
using AtomUI.Generator.Localization.Catalog;
using AtomUI.Generator.Localization.Xliff;
using AtomUI.Build.Tasks.LocalizationBuild;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Text;
using Shouldly;
using Xunit;
namespace AtomUI.Generator.Tests.Localization;
public class TranslationBundleCompilerTests
{
[Fact]
public void Compile_Maps_Validated_Values_To_Ordinal_Catalog_Slots()
{
var catalog = new LanguageCatalogInfo(
"Installed.Module",
"Installed.Strings",
"Installed",
"global::Installed.Strings",
[
new LanguageCatalogUnitInfo("Body", Location.None),
new LanguageCatalogUnitInfo("Title", Location.None)
],
Location.None);
var source = Input(
catalog,
LanguageFileSourceKind.ModuleBuiltIn,
SourceXliff(catalog.MetadataName));
var target = Input(
catalog,
LanguageFileSourceKind.StaticLanguagePack,
TargetXliff(catalog.MetadataName));
var workItem = new CatalogCompilationWorkItem(
new CatalogSymbolEntry(catalog, ownsCatalog: true),
[Resolution(catalog, source), Resolution(catalog, target)]);
var validation = CatalogSemanticValidator.Validate(workItem);
validation.Diagnostics.ShouldBeEmpty();
var compiled = TranslationBundleCompiler.Compile(validation.Input.ShouldNotBeNull());
var bundle = compiled.Bundles.Single(bundle => bundle.Language == "zh-CN");
bundle.Values.ShouldBe(["本文", "标题"]);
}
private static LanguageInputResolution Resolution(
LanguageCatalogInfo catalog,
LanguageFileInput input)
{
return new LanguageInputResolution(
input,
LanguageInputActivationState.Active,
catalog);
}
private static LanguageFileInput Input(
LanguageCatalogInfo catalog,
LanguageFileSourceKind sourceKind,
string content)
{
var document = Xliff21Parser.Parse(content).Document!;
return new LanguageFileInput(
new AdditionalLanguageFile(
$"{sourceKind}/{document.TargetLanguage ?? "en-US"}.xlf",
SourceText.From(content),
document),
catalog.ModuleId,
sourceKind,
$"{catalog.ModuleId}.{sourceKind}",
sourceKind == LanguageFileSourceKind.StaticLanguagePack
? LanguageFileContractValidation.Deferred
: LanguageFileContractValidation.Verified,
sourceKind == LanguageFileSourceKind.StaticLanguagePack
? LanguageSourceFingerprint.Compute(document)
: null);
}
private static string SourceXliff(string fileId)
{
return $$"""
Title
Body
""";
}
private static string TargetXliff(string fileId)
{
return $$"""
Title标题
Body本文
""";
}
}