Files
systemic-game-design-course/tools/test/start-module.test.mjs
T
Lucas WintherandClaude Opus 5.5 6f576940b7 fix: module 10 review round 1 (module-local SpellGrid cards, cast target check, CLI without panic hook)
- SpellGrid cards move to course/10-spellgrid/cards; start-module and
  verify-references stage course/cards plus module-local cards up to the module,
  so M5-M9 workspaces get exactly the pre-M10 card set.
- cast() rejects a chosen-target spell without a target (checkCast/checkPlay);
  new test_10_targeted_spell_needs_target.
- Rust CLI pre-validates instead of swapping the global panic hook.
- Catalog: CRIER noun; DEATHRATTLE/BATTLECRY note on lexicon vs catalog role.
- Lesson: design note on mid-movement reparse.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-29 05:11:09 +01:00

79 lines
2.9 KiB
JavaScript

import { test } from "node:test";
import assert from "node:assert/strict";
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
import { join } from "node:path";
import { run, copyFixture, fixtures } from "./helpers.mjs";
const env = { COURSE_ROOT: join(fixtures, "course") };
test("start_module_copies_tests", () => {
const ws = copyFixture("ws-start");
const r = run("start-module.mjs", ["01", ws], env);
assert.equal(r.code, 0, r.out);
assert.ok(existsSync(join(ws, "tests/m01.rs")));
assert.match(r.out, /newGame, summon, play/);
});
test("start_module_copies_course_cards", () => {
const ws = copyFixture("ws-start");
const r = run("start-module.mjs", ["01", ws], env);
assert.equal(r.code, 0, r.out);
assert.ok(existsSync(join(ws, "cards/test-fixture.json")));
});
test("start_module_copies_module_cards_up_to_the_module", () => {
const early = copyFixture("ws-start");
assert.equal(run("start-module.mjs", ["01", early], env).code, 0);
assert.ok(existsSync(join(early, "cards/test-fixture.json")));
assert.ok(!existsSync(join(early, "cards/module-fixture.json")));
const later = copyFixture("ws-start");
mkdirSync(join(later, "tests"), { recursive: true });
writeFileSync(join(later, "tests/m02.rs"), "");
const r = run("start-module.mjs", ["03", later], env);
assert.equal(r.code, 0, r.out);
assert.ok(existsSync(join(later, "cards/test-fixture.json")));
assert.ok(existsSync(join(later, "cards/module-fixture.json")));
});
test("start_module_copies_module_levels", () => {
const ws = copyFixture("ws-start");
mkdirSync(join(ws, "tests"), { recursive: true });
writeFileSync(join(ws, "tests/m02.rs"), "");
const r = run("start-module.mjs", ["03", ws], env);
assert.equal(r.code, 0, r.out);
assert.ok(existsSync(join(ws, "levels/fixture-level.json")));
});
test("start_module_uses_track", () => {
const ws = copyFixture("ws-start-ts");
assert.equal(run("start-module.mjs", ["01", ws], env).code, 0);
assert.ok(existsSync(join(ws, "tests/m01.test.ts")));
assert.ok(!existsSync(join(ws, "tests/m01.rs")));
});
test("start_module_accepts_when_previous_present", () => {
const ws = copyFixture("ws-start");
mkdirSync(join(ws, "tests"), { recursive: true });
writeFileSync(join(ws, "tests/m02.rs"), "");
const r = run("start-module.mjs", ["03", ws], env);
assert.equal(r.code, 0, r.out);
assert.ok(existsSync(join(ws, "tests/m03.rs")));
});
test("start_module_refuses_skipping", () => {
const ws = copyFixture("ws-start");
mkdirSync(join(ws, "tests"), { recursive: true });
writeFileSync(join(ws, "tests/m01.rs"), "");
const r = run("start-module.mjs", ["03", ws], env);
assert.equal(r.code, 1);
assert.match(r.out, /finish module 02 first/);
assert.ok(!existsSync(join(ws, "tests/m03.rs")));
});
test("start_module_00_not_startable", () => {
const ws = copyFixture("ws-start");
const r = run("start-module.mjs", ["00", ws], env);
assert.notEqual(r.code, 0);
assert.match(r.out, /naive-engine/);
});