Files
scriptc/tests/harness/opentui-native.mts
Chris Tate 3f66c8e20b Make LLVM the sole production backend
- Remove C emission, debugging options, and automatic backend fallback.
- Complete LLVM lowering and native bootstrap coverage across supported targets.
- Link executables and libraries with precompiled C runtime packs, including iOS and Android.
2026-09-29 20:54:09 -05:00

43 lines
2.5 KiB
TypeScript

// Opt-in smoke against the actual pinned OpenTUI static archive. The ordinary
// FFI suite uses a small C oracle so the full gate needs no external download.
import { strict as assert } from "node:assert";
import { execFileSync, spawnSync } from "node:child_process";
import { mkdirSync, writeFileSync } from "node:fs";
import { join, resolve } from "node:path";
import { compile, renderDiagnostics } from "../../packages/compiler/src/index.js";
const archive = process.argv[2];
if (!archive) throw new Error("usage: tsx tests/harness/opentui-native.mts /absolute/path/libopentui.a");
if (process.platform !== "darwin" && process.platform !== "linux") throw new Error("this probe supports macOS and Linux hosts");
const root = resolve(import.meta.dirname, "../..");
const fixtures = join(root, "tests/fixtures/opentui");
const out = join(root, "node_modules/.cache/scriptc-tests/opentui");
mkdirSync(out, { recursive: true });
const object = join(out, "adapter.o");
execFileSync("clang", ["-std=c11", "-O2", "-c", join(fixtures, "native.c"), "-o", object]);
const profile = join(out, "ffi.json");
writeFileSync(profile, JSON.stringify({
ffi_format: 6,
libraries: [object, resolve(archive)],
system_libraries: process.platform === "darwin" ? ["c++"] : ["stdc++", "m", "dl", "pthread"],
functions: [
{ name: "nativeCreate", symbol: "probe_create", params: [], returns: "u32" },
{ name: "nativeDestroy", symbol: "probe_destroy", params: ["u32"], returns: "void" },
{ name: "nativeAppend", symbol: "probe_append", params: ["u32", "string"], returns: "void" },
{ name: "nativeRead", symbol: "probe_read", params: ["u32", "mutable-bytes"], returns: "u32" },
{ name: "nativeRender", symbol: "probe_render", params: ["string", "mutable-bytes"], returns: "u32" },
],
}, null, 2));
for (const backend of ["llvm"] as const) {
const result = await compile(join(fixtures, "native.ts"), {
backend, dynamic: false, outDir: join(out, backend), outPath: join(out, `opentui-${backend}`), ffiProfilePath: profile,
});
if (!result.ok) throw new Error(renderDiagnostics(result.diagnostics, result.sourceTexts));
const child = spawnSync(result.binaryPath, [], { encoding: "utf8", timeout: 10_000 });
assert.ifError(child.error);
assert.equal(child.status, 0, child.stderr);
assert.equal(child.stderr, "");
assert.equal(child.stdout, "Hello, scriptc! café 🎉\n0 0 0\nHello, static OpenTUI!\n");
console.log(`${backend}: OpenTUI text buffer and renderer passed without a JS engine`);
}