31 lines
2.4 KiB
TypeScript
31 lines
2.4 KiB
TypeScript
import assert from "node:assert/strict";
|
|
import test from "node:test";
|
|
import { compileCapabilityResourceSource } from "../src/capability-language/parser.js";
|
|
import { generateTypeScriptBindings, type BindingSchema } from "../src/bindings/index.js";
|
|
const source = { repository: "https://example.test/p.git", commit: "1".repeat(40) };
|
|
const schemaFor = (body: string): BindingSchema => {
|
|
const compiled = compileCapabilityResourceSource(`external atom Thing id "thing"; package Demo id "demo" revision "demo@1" { ${body} }`, { source });
|
|
assert.equal(compiled.ok, true, JSON.stringify(compiled.diagnostics));
|
|
if (!compiled.ok || compiled.resource.kind !== "package") throw new Error("expected package");
|
|
return { format: "quixos-bindings", version: 1, interfaces: [], packages: [compiled.resource.revision] };
|
|
};
|
|
test("generator uses exact IDs, restricted ports, nominal references, and lossless scalar types", () => {
|
|
const schema = schemaFor('operation run id "run-id" : list<int64> -> optional<atom-ref<Thing>> mode call receiver atom Thing requires { state payload id "payload-id" : bytes [read]; };');
|
|
const generated = generateTypeScriptBindings(schema, "demo@1");
|
|
assert.match(generated, /Array<bigint>/);
|
|
assert.match(generated, /Promise<Uint8Array>/);
|
|
assert.match(generated, /QxObjectRef<"atom:thing">/);
|
|
assert.doesNotMatch(generated, /"set":/);
|
|
assert.match(generated, /"run-id": bindQxHandler/);
|
|
assert.equal(generateTypeScriptBindings(schema, "demo@1"), generated);
|
|
});
|
|
test("missing external types and constructor signatures fail generation", () => {
|
|
const schema = schemaFor('function run id "run" : unit -> message "example.Payload";');
|
|
assert.throws(() => generateTypeScriptBindings(schema, "demo@1"), /Missing TypeScript message binding/);
|
|
assert.match(generateTypeScriptBindings(schema, "demo@1", { messages: { "example.Payload": { module: "./payload.js", export: "payload" } } }), /BindingValue<typeof message0>/);
|
|
const constructor = schemaFor('function run id "run" : unit -> unit requires { constructor thing id "ctor" : Thing; };');
|
|
assert.throws(() => generateTypeScriptBindings(constructor, "demo@1"), /explicit input contract/);
|
|
const typed = schemaFor('function run id "run" : unit -> unit requires { constructor thing id "ctor" : Thing input string; };');
|
|
assert.match(generateTypeScriptBindings(typed, "demo@1"), /construct.*input: string/);
|
|
});
|