Files
quixos-protocol/test/qx-format-cli.test.ts

56 lines
2.7 KiB
TypeScript

import assert from "node:assert/strict";
import { spawnSync } from "node:child_process";
import { mkdtempSync, readFileSync, writeFileSync, rmSync } from "node:fs";
import { tmpdir } from "node:os";
import { join, resolve } from "node:path";
import test from "node:test";
import { formatQx } from "../src/capability-language/source.js";
const cli = resolve(process.cwd(), "dist/src/capability-language/tool-cli.js");
const run = (...args: string[]) => spawnSync(process.execPath, [cli, "format", ...args], { encoding: "utf8" });
const source = `workspace Test id "w" revision "w@1" commit "${"1".repeat(40)}" {\n// 雪 🦊 comment preserved\n}\n`;
test("QX batch checks are read-only; writes match single-file formatting and remain idempotent", (t) => {
const root = mkdtempSync(join(tmpdir(), "qx-format-"));
t.after(() => rmSync(root, { recursive: true, force: true }));
const files = [join(root, "one.qx"), join(root, "two 雪.qx")];
for (const file of files) writeFileSync(file, source);
const check = run("--check", ...files);
assert.notEqual(check.status, 0, check.stderr);
for (const file of files) {
assert(check.stderr.includes(file));
assert.equal(readFileSync(file, "utf8"), source);
}
const single = run(files[0]!);
assert.equal(single.status, 0, single.stderr);
assert.equal(single.stdout, formatQx(source));
const write = run("--write", ...files);
assert.equal(write.status, 0, write.stderr);
for (const file of files) assert.equal(readFileSync(file, "utf8"), single.stdout);
assert.equal(run("--check", ...files).status, 0);
assert.equal(run("--write", ...files).stdout, "");
writeFileSync(files[0]!, source);
assert.equal(run(files[0]!, "--write").status, 0);
assert.equal(readFileSync(files[0]!, "utf8"), single.stdout);
});
test("QX batch errors report every failure and do not truncate valid work", (t) => {
const root = mkdtempSync(join(tmpdir(), "qx-format-errors-"));
t.after(() => rmSync(root, { recursive: true, force: true }));
const broken = join(root, "broken.qx"),
missing = join(root, "missing.qx"),
valid = join(root, "valid.qx");
writeFileSync(broken, "workspace { invalid");
writeFileSync(valid, source);
const result = run("--write", broken, missing, valid);
assert.notEqual(result.status, 0);
assert(result.stderr.includes(broken));
assert(result.stderr.includes(missing));
assert.equal(readFileSync(broken, "utf8"), "workspace { invalid");
assert.equal(readFileSync(valid, "utf8"), formatQx(source));
writeFileSync(valid, source);
assert.notEqual(run("--write", valid, "--unknown").status, 0);
assert.equal(readFileSync(valid, "utf8"), source, "Validate arguments before writing any file");
assert.notEqual(run("--check").status, 0);
});