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); } });