Implement reusable interface conformance rules

This commit is contained in:
Timothy J. Aveni
2026-09-23 00:17:13 -07:00
parent 20e9f4b056
commit 8455599c3c
14 changed files with 2387 additions and 1638 deletions
+19
View File
@@ -1,3 +1,4 @@
import { qxSourceManifest } from "../src/capability-language/source-loader.js";
import assert from "node:assert/strict";
import test from "node:test";
import { mkdtemp, writeFile, readFile, rm, symlink } from "node:fs/promises";
@@ -119,3 +120,21 @@ test("lowering diagnostics map to the imported file", async () => {
assert.equal(position.fileName, "bad.qx");
assert.equal(position.line, 2);
});
test("source manifests include resource imports in deduplicated workspace fragments", async (t) => {
const root = await mkdtemp(path.join(os.tmpdir(), "qx-source-manifest-"));
t.after(() => rm(root, { recursive: true, force: true }));
await writeFile(
path.join(root, "workspace.qx"),
addWorkspaceImport(addWorkspaceImport(workspace, "left.qx"), "right.qx"),
);
await writeFile(path.join(root, "left.qx"), 'fragment {import "rules.qx";}');
await writeFile(path.join(root, "right.qx"), 'fragment {import "rules.qx";}');
await writeFile(path.join(root, "rules.qx"), "fragment {import interface Person; import package Runtime;}");
const manifest = await qxSourceManifest(root);
assert.deepEqual(manifest.imports, [
{ kind: "interface", binding: "Person" },
{ kind: "package", binding: "Runtime" },
]);
assert.deepEqual([...manifest.sourceFiles].sort(), ["left.qx", "right.qx", "rules.qx", "workspace.qx"]);
});