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: 12, y: -8 }, size: { height: 720, unit: "px", width: 1280 }, zoom: 100, }; 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 and recenter history patches", () => { const infinitePatch = createToolcraftCanvasModePatch( finiteCanvas, "infinite", ); const finitePatch = createToolcraftCanvasModePatch( { ...finiteCanvas, mode: "infinite" }, "finite", ); expect(infinitePatch).toMatchObject({ after: { "canvas.mode": "infinite" }, before: { "canvas.mode": "finite" }, label: "Enable Infinity canvas", }); expect(finitePatch).toMatchObject({ after: { "canvas.mode": "finite", "canvas.offset": { x: 0, y: 0 }, }, before: { "canvas.mode": "infinite", "canvas.offset": finiteCanvas.offset, }, label: "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"); }); });