Reduce repeated compiler startup in monorepo QX formatting
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
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);
|
||||
});
|
||||
Reference in New Issue
Block a user