pi_coder_2/tests/helpers.mjs

34 lines
1.6 KiB
JavaScript
Raw Normal View History

// Gemeinsame Test-Helfer.
//
// Wichtig: Die pi-Extension läuft nur im pi-Runtime (importiert @earendil-works/pi-coding-agent
// und typebox). Wir importieren sie daher NICHT direkt, sondern extrahieren die reinen,
// abhängigkeitsfreien Funktionen zur Testzeit aus der Quelle. So testen wir das Original
// (keine divergierende Kopie), ohne die laufende Extension umbauen oder das Runtime laden zu müssen.
import { readFileSync } from "node:fs";
import { fileURLToPath } from "node:url";
import { dirname, join } from "node:path";
export const repoRoot = join(dirname(fileURLToPath(import.meta.url)), "..");
export const extSource = readFileSync(join(repoRoot, "pi-coder-judge-extension.ts"), "utf8");
// Extrahiert eine Top-Level-Funktion (Einrückungstiefe 0) per Name aus der Extension-Quelle und
// gibt sie als ausführbare Funktion zurück. Nur für reine Funktionen ohne externe Bezüge geeignet.
// Die schließende "}" der Funktion steht auf Spalte 0; innere Blöcke sind eingerückt — deshalb
// matcht /^}/m zuverlässig das Funktionsende. Einfache TS-Annotationen (: string / : string[])
// werden vor der Auswertung entfernt.
export function extractFn(name) {
const re = new RegExp(`^function ${name}\\b[\\s\\S]*?^}`, "m");
const m = extSource.match(re);
if (!m) throw new Error(`Funktion '${name}' nicht in der Extension gefunden`);
const js = m[0].replace(/:\s*string(\[\])?/g, "");
return new Function(`${js}\nreturn ${name};`)();
}
export function readRepoFile(relPath) {
return readFileSync(join(repoRoot, relPath), "utf8");
}
export function readJson(relPath) {
return JSON.parse(readRepoFile(relPath));
}