GFramework/GFramework.Game.Tests/Setting/GodotLocalizationSettingsTests.cs
GeWuYou e3652db030 fix/review-followups: 修复审查反馈并补充提交流程规则
- 修复 Core、Cqrs、Godot 与 Game 模块中的异常契约、空值校验和线程亲和性问题
- 更新 Settings API 为 ApplyAsync 并同步实现、调用点、测试与中文文档
- 补充 AGENTS.md 中的构建校验、自动提交与分支创建规则
- 整理 Logging、WeakCache 与 Resource 相关实现的行为与文档一致性
2026-04-18 19:37:25 +08:00

75 lines
2.6 KiB
C#

using GFramework.Core.Abstractions.Localization;
using GFramework.Game.Abstractions.Setting;
using GFramework.Game.Abstractions.Setting.Data;
using GFramework.Godot.Setting;
using GFramework.Godot.Setting.Data;
namespace GFramework.Game.Tests.Setting;
/// <summary>
/// 覆盖 Godot 本地化设置应用器的语言同步行为,防止持久化语言仅影响 Godot 而未同步框架管理器。
/// </summary>
[TestFixture]
public sealed class GodotLocalizationSettingsTests
{
[Test]
public async Task ApplyAsync_ShouldSyncEnglishToGodotLocaleAndFrameworkLanguage()
{
var manager = new Mock<ILocalizationManager>(MockBehavior.Strict);
manager.Setup(it => it.SetLanguage("eng"));
string? appliedLocale = null;
var applicator = CreateApplicator("English", manager.Object, locale => appliedLocale = locale);
await applicator.ApplyAsync();
Assert.That(appliedLocale, Is.EqualTo("en"));
manager.Verify(it => it.SetLanguage("eng"), Times.Once);
}
[Test]
public async Task ApplyAsync_ShouldSyncChineseToGodotLocaleAndFrameworkLanguage()
{
var manager = new Mock<ILocalizationManager>(MockBehavior.Strict);
manager.Setup(it => it.SetLanguage("zhs"));
string? appliedLocale = null;
var applicator = CreateApplicator("简体中文", manager.Object, locale => appliedLocale = locale);
await applicator.ApplyAsync();
Assert.That(appliedLocale, Is.EqualTo("zh_CN"));
manager.Verify(it => it.SetLanguage("zhs"), Times.Once);
}
[Test]
public async Task ApplyAsync_ShouldFallbackUnknownLanguageToEnglish()
{
var manager = new Mock<ILocalizationManager>(MockBehavior.Strict);
manager.Setup(it => it.SetLanguage("eng"));
string? appliedLocale = null;
var applicator = CreateApplicator("Esperanto", manager.Object, locale => appliedLocale = locale);
await applicator.ApplyAsync();
Assert.That(appliedLocale, Is.EqualTo("en"));
manager.Verify(it => it.SetLanguage("eng"), Times.Once);
}
private static GodotLocalizationSettings CreateApplicator(
string language,
ILocalizationManager manager,
Action<string> applyGodotLocale)
{
var settingsModel = new Mock<ISettingsModel>(MockBehavior.Strict);
settingsModel.Setup(it => it.GetData<LocalizationSettings>()).Returns(new LocalizationSettings
{
Language = language
});
return new GodotLocalizationSettings(settingsModel.Object, new LocalizationMap(), () => manager,
applyGodotLocale);
}
}