- C1: 4 个 CLI 脚本守卫加 process.argv[1] 空值短路,避免动态 import 时 pathToFileURL(undefined) 崩溃 - I1: check-cocos-version CLI 在宿主 creator.version 为 null 时报错 exit 1,避免 CI 虚假 OK - M1: scaffold 测试收紧 UUID 正则 - 新增 cli-entry 测试覆盖动态 import 场景 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
70 lines
2.5 KiB
JavaScript
70 lines
2.5 KiB
JavaScript
import { test } from 'node:test';
|
||
import assert from 'node:assert/strict';
|
||
import { join } from 'node:path';
|
||
import { existsSync, readFileSync, mkdirSync, writeFileSync } from 'node:fs';
|
||
import { makeTempMonorepo, makeSeed, cleanup } from './helpers.mjs';
|
||
import { copySeed, setProjectIdentity, scaffoldGameAssets } from '../lib/scaffold.mjs';
|
||
|
||
test('copySeed 复制种子并清理缓存目录', () => {
|
||
const mono = makeTempMonorepo();
|
||
try {
|
||
const seed = makeSeed(mono.root);
|
||
mkdirSync(join(seed, 'library'), { recursive: true }); // 模拟缓存
|
||
writeFileSync(join(seed, 'library', 'x'), '1');
|
||
const dest = join(mono.games, 'demo');
|
||
copySeed(seed, dest);
|
||
assert.ok(existsSync(join(dest, 'package.json')));
|
||
assert.ok(existsSync(join(dest, 'settings', 'v2.json')));
|
||
assert.ok(!existsSync(join(dest, 'library')), 'library 应被清理');
|
||
} finally {
|
||
cleanup(mono.root);
|
||
}
|
||
});
|
||
|
||
test('copySeed 拒绝覆盖已存在目标', () => {
|
||
const mono = makeTempMonorepo();
|
||
try {
|
||
const seed = makeSeed(mono.root);
|
||
const dest = join(mono.games, 'demo');
|
||
copySeed(seed, dest);
|
||
assert.throws(() => copySeed(seed, dest), /已存在/);
|
||
} finally {
|
||
cleanup(mono.root);
|
||
}
|
||
});
|
||
|
||
test('setProjectIdentity 改 name 并生成新 uuid', () => {
|
||
const mono = makeTempMonorepo();
|
||
try {
|
||
const seed = makeSeed(mono.root);
|
||
const dest = join(mono.games, 'demo');
|
||
copySeed(seed, dest);
|
||
const pkg = setProjectIdentity(dest, 'doudizhu');
|
||
assert.equal(pkg.name, 'doudizhu');
|
||
assert.notEqual(pkg.uuid, 'seed-uuid');
|
||
assert.match(pkg.uuid, /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/);
|
||
const onDisk = JSON.parse(readFileSync(join(dest, 'package.json'), 'utf8'));
|
||
assert.equal(onDisk.name, 'doudizhu');
|
||
assert.equal(onDisk.creator.version, '3.8.8'); // 引擎版本保留
|
||
} finally {
|
||
cleanup(mono.root);
|
||
}
|
||
});
|
||
|
||
test('scaffoldGameAssets 铺出 game 骨架(GameModule/theme/override)', () => {
|
||
const mono = makeTempMonorepo();
|
||
try {
|
||
const seed = makeSeed(mono.root);
|
||
const dest = join(mono.games, 'demo');
|
||
copySeed(seed, dest);
|
||
scaffoldGameAssets(dest, 'doudizhu');
|
||
const gm = readFileSync(join(dest, 'assets', 'game', 'GameModule.ts'), 'utf8');
|
||
assert.match(gm, /doudizhu/);
|
||
assert.match(gm, /docs\/protocol/); // 提醒协议 SSOT
|
||
assert.ok(existsSync(join(dest, 'assets', 'game', 'theme.ts')));
|
||
assert.ok(existsSync(join(dest, 'assets', 'game', 'override', '.gitkeep')));
|
||
} finally {
|
||
cleanup(mono.root);
|
||
}
|
||
});
|