Cards become JSON data in course/cards (one file per card, validated against card.schema.json and the catalog); the M5 references load them via registerCards and interpret effects, replacing content closures. Adds assemble(base, donor, half), the assemble/buffHand effects with an injected chooser, Fleshshape as the data-only Expansion Drop, and stages course/cards in verify-references and start-module. Co-Authored-By: Claude Opus 5.5 <[email protected]>
56 lines
1.9 KiB
JavaScript
56 lines
1.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_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/);
|
|
});
|