import { describe, expect, it } from "vitest"; import { defineToolcraft } from "../schema/define-toolcraft"; import { createToolcraftState } from "../state/create-template-state"; import { TOOLCRAFT_MAX_EXPORT_EDGE_PX, TOOLCRAFT_MAX_EXPORT_PIXELS, resolveToolcraftExportFrame, validateToolcraftArtifactSize, } from "./export-frame"; function state(mode: "finite" | "infinite") { return createToolcraftState( defineToolcraft({ canvas: { enabled: true, size: { height: 720, unit: "px", width: 1280 }, }, panels: {}, }), { canvas: { mode } }, ); } describe("Toolcraft export frame", () => { it("uses the active artboard for finite export", () => { expect(resolveToolcraftExportFrame(state("finite"), null)).toEqual({ frame: { height: 720, width: 1280, x: 0, y: 0 }, ok: true, }); }); it("outward-rounds tight scene bounds for infinite export", () => { expect( resolveToolcraftExportFrame(state("infinite"), { height: 200.2, width: 100.4, x: -50.25, y: 10.75, }), ).toEqual({ frame: { height: 201, width: 102, x: -51, y: 10 }, ok: true, }); }); it("preserves typed empty and unavailable failures", () => { expect(resolveToolcraftExportFrame(state("infinite"), null)).toMatchObject({ code: "empty-scene", ok: false, }); expect( resolveToolcraftExportFrame(state("infinite"), { code: "scene-bounds-unavailable", message: "Missing product bounds.", ok: false, }), ).toEqual({ code: "scene-bounds-unavailable", message: "Missing product bounds.", ok: false, }); }); it("validates actual artifact pixels without constraining world coordinates", () => { expect( validateToolcraftArtifactSize({ height: TOOLCRAFT_MAX_EXPORT_EDGE_PX, width: TOOLCRAFT_MAX_EXPORT_EDGE_PX, }), ).toEqual({ ok: true }); expect(TOOLCRAFT_MAX_EXPORT_PIXELS).toBe(67_108_864); expect( validateToolcraftArtifactSize({ height: 1, width: TOOLCRAFT_MAX_EXPORT_EDGE_PX + 1, }), ).toMatchObject({ code: "scene-export-too-large", ok: false }); }); });