import { test } from 'node:test'; import assert from 'node:assert/strict'; import { join, sep } from 'node:path'; import { writeFileSync, mkdirSync } from 'node:fs'; import { makeTempMonorepo, makeGameProject, cleanup } from './helpers.mjs'; import { readCreatorVersion, listGameProjects, BUILD_WORKSPACE, GAMES_DIR } from '../lib/paths.mjs'; test('readCreatorVersion 读取 package.json 的 creator.version', () => { const mono = makeTempMonorepo(); try { assert.equal(readCreatorVersion(mono.host), '3.8.8'); } finally { cleanup(mono.root); } }); test('readCreatorVersion 缺字段返回 null', () => { const mono = makeTempMonorepo(); try { const dir = makeGameProject(mono.games, 'nover'); // 覆写成无 creator 字段 writeFileSync(join(dir, 'package.json'), JSON.stringify({ name: 'nover' })); assert.equal(readCreatorVersion(dir), null); } finally { cleanup(mono.root); } }); test('listGameProjects 只列出含 package.json 的子目录', () => { const mono = makeTempMonorepo(); try { makeGameProject(mono.games, 'doudizhu'); makeGameProject(mono.games, 'niuniu'); mkdirSync(join(mono.games, 'not-a-project')); // 无 package.json,应被忽略 const found = listGameProjects(mono.games).map((p) => p.split(/[\\/]/).pop()).sort(); assert.deepEqual(found, ['doudizhu', 'niuniu']); } finally { cleanup(mono.root); } }); test('listGameProjects 对不存在的目录返回空数组', () => { assert.deepEqual(listGameProjects('/no/such/dir'), []); }); test('BUILD_WORKSPACE 不在 GAMES_DIR 之下(红线③:临时工程不得置于 games/ 下)', () => { assert.ok( BUILD_WORKSPACE !== GAMES_DIR && !BUILD_WORKSPACE.startsWith(GAMES_DIR + sep), `BUILD_WORKSPACE(${BUILD_WORKSPACE}) 不应落在 GAMES_DIR(${GAMES_DIR}) 之下`, ); });