mirror of
https://github.com/GeWuYou/GFramework.git
synced 2026-05-06 16:16:44 +08:00
- 实现了对嵌套对象和对象数组元数据捕获的测试 - 添加了标量、对象、数组、整数和布尔类型常量元数据测试 - 验证了空字符串常量原始值和显示元数据的保留功能 - 测试了对象常量可比较键的构建逻辑 - 实现了嵌套映射和对象数组解析功能的测试 - 验证了复杂映射键的保留功能 - 添加了缺失和未知嵌套属性报告的测试 - 实现了对象数组项目问题检测功能的测试 - 验证了深层枚举不匹配的报告功能 - 测试了标量常量不匹配检测功能 - 实现了各种类型常量匹配验证的测试 - 验证了对象常量比较标准化但保持数组顺序的功能 - 添加了对象和数组常量不匹配检测的测试 - 实现了整数和布尔常量标量标准化及不匹配测试 - 验证了数字范围和字符串长度不匹配检测功能 - 测试了独占边界、模式和数组项目计数不匹配检测 - 实现了支持字符串格式验证的测试 - 验证了受支持字符串格式接受功能 - 添加了独占最大值和最大项目违规检测的测试 - 实现了对象属性计数不匹配报告功能的测试 - 验证了唯一对象属性计数约束功能 - 测试了倍数和唯一项目违规检测功能 - 实现了包含匹配计数违规报告的测试 - 验证了结构无效项目时跳过包含匹配计数功能 - 测试了仅值级违规时继续包含匹配计数功能 - 实现了最大包含违规检测的测试 - 验证了满足包含约束接受功能 - 测试了对象包含匹配允许额外声明字段功能 - 实现了大十进制倍数无浮点漂移接受的测试 - 验证了非实际倍数大数字拒绝功能 - 测试了科学记数法数字接受功能 - 实现了Unicode语义应用模式的测试 - 验证了无效数组项目跳过唯一项目检查功能 - 测试了一次通过报告每个唯一项目重复功能 - 实现了避免不同对象唯一项目可比较键冲突的测试 - 验证了标量范围和长度元数据捕获功能 - 测试了独占边界、模式和数组项目计数元数据捕获 - 实现了支持字符串格式元数据捕获的测试
114 lines
5.0 KiB
JavaScript
114 lines
5.0 KiB
JavaScript
const test = require("node:test");
|
||
const assert = require("node:assert/strict");
|
||
const {createLocalizer} = require("../src/localization");
|
||
const {ValidationMessageKeys} = require("../src/localizationKeys");
|
||
|
||
test("createLocalizer should default to English strings", () => {
|
||
const localizer = createLocalizer("en");
|
||
|
||
assert.equal(localizer.languageTag, "en");
|
||
assert.equal(localizer.isChinese, false);
|
||
assert.equal(localizer.t("webview.button.save"), "Save Form");
|
||
assert.equal(
|
||
localizer.t("message.batchEditUpdated", {count: 2, domain: "monster"}),
|
||
"Batch updated 2 config file(s) in 'monster'.");
|
||
});
|
||
|
||
test("createLocalizer should switch to Simplified Chinese for zh languages", () => {
|
||
const localizer = createLocalizer("zh-cn");
|
||
|
||
assert.equal(localizer.languageTag, "zh-CN");
|
||
assert.equal(localizer.isChinese, true);
|
||
assert.equal(localizer.t("webview.button.save"), "保存表单");
|
||
assert.equal(
|
||
localizer.t("message.batchEditUpdated", {count: 2, domain: "monster"}),
|
||
"已在“monster”中批量更新 2 个配置文件。");
|
||
});
|
||
|
||
test("createLocalizer should fall back to English for Traditional Chinese locales", () => {
|
||
const localizer = createLocalizer("zh-TW");
|
||
|
||
assert.equal(localizer.languageTag, "zh-tw");
|
||
assert.equal(localizer.isChinese, false);
|
||
assert.equal(localizer.t("webview.button.save"), "Save Form");
|
||
assert.equal(
|
||
localizer.t("message.batchEditUpdated", {count: 2, domain: "monster"}),
|
||
"Batch updated 2 config file(s) in 'monster'.");
|
||
});
|
||
|
||
test("createLocalizer should expose object property-count validation keys in English", () => {
|
||
const localizer = createLocalizer("en");
|
||
|
||
assert.equal(
|
||
localizer.t(ValidationMessageKeys.minPropertiesViolation, {displayPath: "reward", value: 2}),
|
||
"Property 'reward' must contain at least 2 properties.");
|
||
assert.equal(
|
||
localizer.t(ValidationMessageKeys.maxPropertiesViolation, {displayPath: "reward", value: 3}),
|
||
"Property 'reward' must contain at most 3 properties.");
|
||
});
|
||
|
||
test("createLocalizer should expose object property-count validation keys in Simplified Chinese", () => {
|
||
const localizer = createLocalizer("zh-cn");
|
||
|
||
assert.equal(
|
||
localizer.t(ValidationMessageKeys.minPropertiesViolation, {displayPath: "reward", value: 2}),
|
||
"对象属性“reward”至少需要包含 2 个子属性。");
|
||
assert.equal(
|
||
localizer.t(ValidationMessageKeys.maxPropertiesViolation, {displayPath: "reward", value: 3}),
|
||
"对象属性“reward”最多只能包含 3 个子属性。");
|
||
});
|
||
|
||
test("createLocalizer should expose contains-count validation keys", () => {
|
||
const englishLocalizer = createLocalizer("en");
|
||
const chineseLocalizer = createLocalizer("zh-cn");
|
||
|
||
assert.equal(
|
||
englishLocalizer.t(ValidationMessageKeys.minContainsViolation, {displayPath: "dropRates", value: 2}),
|
||
"Property 'dropRates' must contain at least 2 items matching the 'contains' schema.");
|
||
assert.equal(
|
||
chineseLocalizer.t(ValidationMessageKeys.maxContainsViolation, {displayPath: "dropRates", value: 1}),
|
||
"属性“dropRates”最多只能包含 1 个匹配 contains 条件的元素。");
|
||
});
|
||
|
||
test("createLocalizer should expose not validation keys", () => {
|
||
const englishLocalizer = createLocalizer("en");
|
||
const chineseLocalizer = createLocalizer("zh-cn");
|
||
|
||
assert.equal(
|
||
englishLocalizer.t(ValidationMessageKeys.notViolation, {displayPath: "name"}),
|
||
"Property 'name' must not match the forbidden 'not' schema.");
|
||
assert.equal(
|
||
chineseLocalizer.t(ValidationMessageKeys.notViolation, {displayPath: "name"}),
|
||
"属性“name”不能匹配被 `not` 禁止的 schema。");
|
||
});
|
||
|
||
test("createLocalizer should expose dependentRequired validation keys", () => {
|
||
const englishLocalizer = createLocalizer("en");
|
||
const chineseLocalizer = createLocalizer("zh-cn");
|
||
|
||
assert.equal(
|
||
englishLocalizer.t("webview.hint.dependentRequired", {
|
||
trigger: "reward.itemId",
|
||
dependencies: "reward.itemCount, reward.bonusCount"
|
||
}),
|
||
"When reward.itemId is set: require reward.itemCount, reward.bonusCount");
|
||
assert.equal(
|
||
chineseLocalizer.t("webview.hint.dependentRequired", {
|
||
trigger: "reward.itemId",
|
||
dependencies: "reward.itemCount, reward.bonusCount"
|
||
}),
|
||
"当 reward.itemId 出现时:还必须声明 reward.itemCount, reward.bonusCount");
|
||
assert.equal(
|
||
englishLocalizer.t(ValidationMessageKeys.dependentRequiredViolation, {
|
||
displayPath: "reward.itemCount",
|
||
triggerProperty: "reward.itemId"
|
||
}),
|
||
"Property 'reward.itemCount' is required when sibling property 'reward.itemId' is present.");
|
||
assert.equal(
|
||
chineseLocalizer.t(ValidationMessageKeys.dependentRequiredViolation, {
|
||
displayPath: "reward.itemCount",
|
||
triggerProperty: "reward.itemId"
|
||
}),
|
||
"属性“reward.itemId”存在时,必须同时声明属性“reward.itemCount”。");
|
||
});
|