import { describe, expect, it } from "vitest"; import type { ToolcraftCanvasState } from "./types"; import { createToolcraftCanvasModePatch, getToolcraftCanvasFrame, normalizeToolcraftCanvasMode, } from "./canvas-frame"; import { isToolcraftCanvasStateHistoryPatch } from "./history-patch-metadata"; const finiteCanvas: ToolcraftCanvasState = { mode: "finite", offset: { x: 37, y: -19 }, size: { height: 720, unit: "px", width: 1280 }, zoom: 135, }; describe("Toolcraft canvas frame", () => { it("projects finite and infinite canvas state through one discriminant", () => { expect(getToolcraftCanvasFrame(finiteCanvas)).toEqual({ kind: "finite", size: finiteCanvas.size, }); expect( getToolcraftCanvasFrame({ ...finiteCanvas, mode: "infinite" }), ).toEqual({ kind: "infinite" }); }); it("creates atomic mode-only history patches in both directions", () => { const infinitePatch = createToolcraftCanvasModePatch( finiteCanvas, "infinite", ); const finitePatch = createToolcraftCanvasModePatch( { ...finiteCanvas, mode: "infinite" }, "finite", ); expect(infinitePatch?.after).toEqual({ "canvas.mode": "infinite" }); expect(infinitePatch?.before).toEqual({ "canvas.mode": "finite" }); expect(infinitePatch?.label).toBe("Enable Infinity canvas"); expect(finitePatch?.after).toEqual({ "canvas.mode": "finite" }); expect(finitePatch?.before).toEqual({ "canvas.mode": "infinite" }); expect(finitePatch?.label).toBe("Disable Infinity canvas"); expect(isToolcraftCanvasStateHistoryPatch(infinitePatch ?? undefined)).toBe( true, ); expect(isToolcraftCanvasStateHistoryPatch(finitePatch ?? undefined)).toBe( true, ); }); it("treats repeated mode writes as no-ops and legacy values as finite", () => { expect(createToolcraftCanvasModePatch(finiteCanvas, "finite")).toBeNull(); expect(normalizeToolcraftCanvasMode(undefined)).toBe("finite"); expect(normalizeToolcraftCanvasMode("invalid")).toBe("finite"); }); });