fix(config): VersionResolver 改为 4 层逐级回退(agent/game/channel/market 每层 merge 全字段)

原实现资源字段 game_zip/game_version 只在 game/channel/market 三层覆盖、app 字段只在
market 层,漏了 agent 层。按 4 层模型:每个字段取最深命中层非空值、深层缺省逐级回退到根。
Acc 合并为单个 merge() 每层调用。新增 agent层回退/app上浮回退/四层全覆盖 3 个单测。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
lanterngamescn
2026-06-27 18:49:05 +08:00
co-authored by Claude Opus 4.8
parent 763ee42345
commit a6ef891507
3 changed files with 73 additions and 39 deletions
+42
View File
@@ -143,5 +143,47 @@ export default function versionResolverTest() {
expect(d.gameDownload).assertEqual('http://tsgames.daoqi88.cn/zip2/gamehall.zip');
expect(d.appVersion).assertEqual(49);
});
it('agent_level_resource_fallback', 0, () => {
// 4 层回退:game_zip/game_version 仅在 agent(1) 层;game/channel/market 命中但不携带 → 回退取 agent 层
const remote: RemoteConfig = {
agentlist: [{
agentid: 'A1', game_version: 200, game_zip: 'agent.zip', game_size: '9.9M',
gamelist: [{ gameid: 'G1',
channellist: [{ channelid: 'C1',
marketlist: [{ marketid: 3 }] }] }],
}],
};
const d: VersionDecision = VersionResolver.resolve(remote, keys);
expect(d.gameVersion).assertEqual(200);
expect(d.gameDownload).assertEqual('agent.zip');
expect(d.gameSize).assertEqual('9.9M');
});
it('app_fields_fall_back_above_market', 0, () => {
// 4 层回退:app 字段在 channel(3) 层;market(4) 命中但无 app → 回退取 channel 层
const remote: RemoteConfig = {
agentlist: [{ agentid: 'A1',
gamelist: [{ gameid: 'G1',
channellist: [{ channelid: 'C1', app_version: 70, app_download: 'ch.apk',
marketlist: [{ marketid: 3 }] }] }] }],
};
const d: VersionDecision = VersionResolver.resolve(remote, keys);
expect(d.appVersion).assertEqual(70);
expect(d.appDownload).assertEqual('ch.apk');
});
it('deepest_market_overrides_agent_resource', 0, () => {
// 4 层全部携带 game_zipmarket(4) 最深,应覆盖 agent/game/channel
const remote: RemoteConfig = {
agentlist: [{ agentid: 'A1', game_zip: 'a.zip', game_version: 10,
gamelist: [{ gameid: 'G1', game_zip: 'g.zip', game_version: 20,
channellist: [{ channelid: 'C1', game_zip: 'c.zip', game_version: 30,
marketlist: [{ marketid: 3, game_zip: 'm.zip', game_version: 40 }] }] }] }],
};
const d: VersionDecision = VersionResolver.resolve(remote, keys);
expect(d.gameVersion).assertEqual(40);
expect(d.gameDownload).assertEqual('m.zip');
});
});
}