GFramework/tools/gframework-config-tool/test/configValidation.enum.test.js
GeWuYou 809e1f5ded docs(config): 添加游戏内容配置系统完整文档
- 新增 YAML 配置与 JSON Schema 结构描述支持
- 添加一对象一文件的目录组织方式说明
- 实现运行时只读查询功能详细文档
- 添加 Source Generator 生成配置类型的完整指南
- 集成 VS Code 插件提供配置浏览和校验功能
- 添加 Godot 文本配置桥接的使用说明
- 实现热重载模板和 Architecture 接入示例
- 添加运行时校验行为和错误处理机制
- 提供开发期热重载功能的详细配置方法
- 添加生成器接入约定和工具使用说明
2026-04-16 14:18:25 +08:00

102 lines
2.9 KiB
JavaScript

const test = require("node:test");
const assert = require("node:assert/strict");
const {
parseSchemaContent,
parseTopLevelYaml,
validateParsedConfig
} = require("../src/configValidation");
test("parseSchemaContent should capture object and array enum comparable metadata", () => {
const schema = parseSchemaContent(`
{
"type": "object",
"properties": {
"reward": {
"type": "object",
"properties": {
"gold": { "type": "integer" },
"itemId": { "type": "string" }
},
"enum": [
{ "gold": 10, "itemId": "potion" }
]
},
"dropItemIds": {
"type": "array",
"items": { "type": "string" },
"enum": [
["fire", "ice"]
]
}
}
}
`);
assert.deepEqual(schema.properties.reward.enumDisplayValues, ["{\"gold\":10,\"itemId\":\"potion\"}"]);
assert.match(schema.properties.reward.enumComparableValues[0], /^4:gold=/u);
assert.deepEqual(schema.properties.dropItemIds.enumDisplayValues, ["[\"fire\",\"ice\"]"]);
assert.equal(schema.properties.dropItemIds.enumComparableValues[0], "[13:string:4:fire,12:string:3:ice]");
});
test("validateParsedConfig should reject object values not declared in object enum", () => {
const schema = parseSchemaContent(`
{
"type": "object",
"required": ["reward"],
"properties": {
"reward": {
"type": "object",
"required": ["gold", "itemId"],
"properties": {
"gold": { "type": "integer" },
"itemId": { "type": "string" }
},
"enum": [
{ "gold": 10, "itemId": "potion" }
]
}
}
}
`);
const yaml = parseTopLevelYaml(`
reward:
gold: 10
itemId: elixir
`);
const diagnostics = validateParsedConfig(schema, yaml);
assert.equal(diagnostics.length, 1);
assert.match(diagnostics[0].message, /reward/u);
assert.match(diagnostics[0].message, /"itemId":"potion"/u);
});
test("validateParsedConfig should treat array enum candidates as order-sensitive", () => {
const schema = parseSchemaContent(`
{
"type": "object",
"required": ["dropItemIds"],
"properties": {
"dropItemIds": {
"type": "array",
"items": { "type": "string" },
"enum": [
["fire", "ice"]
]
}
}
}
`);
const yaml = parseTopLevelYaml(`
dropItemIds:
- ice
- fire
`);
const diagnostics = validateParsedConfig(schema, yaml);
assert.equal(diagnostics.length, 1);
assert.match(diagnostics[0].message, /dropItemIds/u);
assert.match(diagnostics[0].message, /\["fire","ice"\]/u);
});