35299307d6
Bündelt den über mehrere Sessions gewachsenen, uncommitteten Stand in
einem Basis-Commit, damit Folge-Features isoliert darauf aufsetzen.
Verifikation: tsc --noEmit sauber, vitest 600/600 grün.
Enthalten (Details in PENDENZEN.md ✅-Liste / HANDOVER.md):
- truck-Integration: Profil-Extrusion + Verjüngung + Boolean-CSG (csgrs),
Crate src-tauri/trucksolid, Werkzeug `extrude`, ExtrudedSolid-Modell.
- kernel2d-Port nach Rust/WASM (Phasen 1–5, Diff-Harness).
- render3d 3D-Live-Schnitt = 2D-Schnitt: geschichteter Bodenaufbau,
Prioritäts-Verschneidung (section_boolean.rs), einstellbare
Schichttrennlinien, per-Hatch-Strichstärke, relativeToWall-Orientierung.
- Interop-Export IFC4/STL/OBJ (Loch-Ausschnitt wallMeshCut), Schnellexport.
- Projektdatei .obp + OS-Lock (lock.rs, LockConflictDialog).
- Layout-Blätter (Modell/Editor/Panel/PDF), Ausschnitte, Override-Engine,
Tragwerk-Stützen (Column), BIM-Tree-Panel.
- Bauteil-Typsystem (Tür/Fenster/Treppe-Typen), Betontreppe mit schräger
Laufplatte, Text-/Textbox-Werkzeug, Mess-Werkzeug, 2D/3D-Griffe für
Öffnungen/Treppen, Snap-Symbol-Restyle.
52 lines
1.7 KiB
TypeScript
52 lines
1.7 KiB
TypeScript
// Tests fuer saveTextFile. Vitest laeuft hier im "node"-Env (kein jsdom), daher
|
|
// stubben wir eine minimale DOM-/URL-Umgebung, um den Browser-Fallback-Pfad zu
|
|
// pruefen — ohne echten Tauri (kein `__TAURI_INTERNALS__`).
|
|
|
|
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
import { saveTextFile } from "./saveFile";
|
|
|
|
afterEach(() => {
|
|
vi.unstubAllGlobals();
|
|
vi.restoreAllMocks();
|
|
});
|
|
|
|
/** Stubt Blob, URL und ein rudimentaeres document fuer den Anchor-Download. */
|
|
function stubBrowserEnv() {
|
|
const clicked: string[] = [];
|
|
const anchor: Record<string, unknown> = {
|
|
click: () => clicked.push("click"),
|
|
};
|
|
vi.stubGlobal("URL", {
|
|
createObjectURL: () => "blob:stub",
|
|
revokeObjectURL: () => {},
|
|
});
|
|
vi.stubGlobal("document", {
|
|
createElement: () => anchor,
|
|
body: { appendChild: () => {}, removeChild: () => {} },
|
|
});
|
|
return { clicked, anchor };
|
|
}
|
|
|
|
describe("saveTextFile", () => {
|
|
it("nimmt im Nicht-Tauri-Umfeld den Browser-Download und liefert true", async () => {
|
|
// Kein __TAURI_INTERNALS__ → Browser-Pfad.
|
|
const hadWindow = typeof globalThis.window !== "undefined";
|
|
if (!hadWindow) vi.stubGlobal("window", {});
|
|
const { clicked, anchor } = stubBrowserEnv();
|
|
|
|
const ok = await saveTextFile("hallo", "modell.txt", "text/plain");
|
|
|
|
expect(ok).toBe(true);
|
|
expect(clicked).toContain("click");
|
|
expect(anchor.download).toBe("modell.txt");
|
|
});
|
|
|
|
it("nutzt den Standard-MIME-Typ ohne Angabe, ohne zu crashen", async () => {
|
|
const hadWindow = typeof globalThis.window !== "undefined";
|
|
if (!hadWindow) vi.stubGlobal("window", {});
|
|
stubBrowserEnv();
|
|
|
|
await expect(saveTextFile("x", "a.bin")).resolves.toBe(true);
|
|
});
|
|
});
|