Files
DOSSIER-STANDALONE/scripts/probe-command-line.mjs
T
karim ca859c4aa4 Browser-BIM (cad): semantisches Modell, abgeleitete 2D/3D-Sichten, Zeichenwerkzeuge
Standalone-Browser-Port von DOSSIER. Enthaelt das semantische Modell mit
Plan-/3D-Ableitung, Zeichen- und Editierwerkzeuge, Rhino-artiges Befehlssystem,
dockbares Panel-System, Resource-Manager, DXF/.lin/.pat-Import, i18n (de/en)
sowie Projektdokumentation und Probe-Harness.
2026-06-30 20:52:27 +02:00

94 lines
3.4 KiB
JavaScript

// Probe für das Rhino-artige Befehlssystem (Tier 0 + Line).
// Treibt: Tab → „line"⏎ → „0,0"⏎ → „r3,0"⏎ und screenshotet das Ergebnis.
// Erwartung: eine deutlich DUNKLE 3-m-Linie im Plan + Command-Line zeigt Prompts.
//
// Headless Puppeteer (swiftshader für WebGL). Zweiter Lauf mit „3<45" prüft die
// polare Eingabe. Vorlage: scripts/probe-tools.mjs.
import puppeteer from "puppeteer";
const URL = process.env.PROBE_URL || "http://localhost:5173/";
const browser = await puppeteer.launch({
headless: "new",
args: ["--no-sandbox", "--use-gl=swiftshader", "--enable-unsafe-swiftshader"],
});
const page = await browser.newPage();
await page.setViewport({ width: 1200, height: 800, deviceScaleFactor: 2 });
const logs = [];
page.on("console", (m) => logs.push(`[${m.type()}] ${m.text()}`));
page.on("pageerror", (e) => logs.push(`[PAGEERROR] ${e.message}`));
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
try {
await page.goto(URL, { waitUntil: "networkidle0", timeout: 20000 });
} catch (e) {
logs.push(`[GOTO-ERROR] ${e.message}`);
}
await sleep(600);
// Zählt 2D-Zeichenlinien + liefert die computed stroke der ersten (Tinte-Check).
async function inkInfo() {
return page.evaluate(() => {
const lines = [...document.querySelectorAll(".plan-svg line.draw2d")];
const first = lines[0];
const stroke = first ? getComputedStyle(first).stroke : null;
return { count: lines.length, stroke };
});
}
// Tippt einen Befehl/Eine Zeile in die fokussierte Command-Line + Enter.
async function typeLine(text) {
await page.type(".cmdline-input", text, { delay: 12 });
await page.keyboard.press("Enter");
await sleep(150);
}
// 1) Tab → Command-Line fokussieren (globaler Tab-Handler in App).
// Erst in den Body klicken, damit Tab nicht von einem anderen Feld geschluckt wird.
await page.mouse.click(600, 400);
await sleep(80);
await page.keyboard.press("Tab");
await sleep(120);
const focused1 = await page.evaluate(
() => document.activeElement?.className || "",
);
// 2) Befehl + zwei getippte Koordinaten. Startpunkt 1,7 liegt ÜBER dem Raum
// (freies Papier), damit die 3-m-Linie eindeutig sichtbar ist (nicht von einer
// Wandkante überdeckt). Verlangt: 1,7 ⏎ r3,0 ⏎ → 3-m-Linie nach rechts.
await typeLine("line");
const promptAfterLine = await page.evaluate(
() => document.querySelector(".cmdline-prompt")?.textContent || "",
);
await typeLine("1,2");
const promptAfterStart = await page.evaluate(
() => document.querySelector(".cmdline-prompt")?.textContent || "",
);
await typeLine("r3,0");
await sleep(200);
const ink1 = await inkInfo();
await page.screenshot({ path: "scripts/probe-command-line.png" });
// 3) Zweiter Lauf: polare Eingabe 3<45 (neue Linie ab Ursprung).
await page.mouse.click(600, 400);
await sleep(80);
await page.keyboard.press("Tab");
await sleep(120);
await typeLine("line");
await typeLine("1,1");
await typeLine("3<45");
await sleep(200);
const ink2 = await inkInfo();
await page.screenshot({ path: "scripts/probe-command-line-polar.png" });
console.log("focused after Tab:", focused1);
console.log("prompt after 'line':", JSON.stringify(promptAfterLine));
console.log("prompt after '0,0':", JSON.stringify(promptAfterStart));
console.log("ink (after 0,0 + r3,0):", JSON.stringify(ink1));
console.log("ink (after polar 3<45):", JSON.stringify(ink2));
console.log("=== Logs ===");
console.log(logs.length ? logs.join("\n") : "(keine)");
await browser.close();