import { describe, expect, test } from "bun:test"; import { createInitialAppState } from "@editor/initial-state"; import { documentAddArtboardCommand, documentAddAssetCommand, documentAddImageLayerCommand, documentSetArtboardBoundsCommand } from "./document"; describe("document commands", () => { test("adds transparent artboard", () => { const next = documentAddArtboardCommand.execute( { state: createInitialAppState("Test") }, { id: "a1", name: "Artboard 1", bounds: { x: 0, y: 0, w: 320, h: 240 } }, ); expect(next.document.artboards).toEqual([ { id: "a1", name: "Artboard 1", bounds: { x: 0, y: 0, w: 320, h: 240 }, backgroundColor: "transparent", layers: [], }, ]); }); test("adds assets", () => { const next = documentAddAssetCommand.execute( { state: createInitialAppState("Test") }, { asset: { id: "asset-1", name: "Image", mimeType: "image/png", source: "blob:test", intrinsicSize: { w: 100, h: 50 } } }, ); expect(next.document.assets).toEqual([ { id: "asset-1", name: "Image", mimeType: "image/png", source: "blob:test", intrinsicSize: { w: 100, h: 50 } }, ]); }); test("adds image layers to artboards", () => { const state = documentAddArtboardCommand.execute( { state: createInitialAppState("Test") }, { id: "a1", name: "Artboard 1", bounds: { x: 0, y: 0, w: 320, h: 240 } }, ); const next = documentAddImageLayerCommand.execute( { state }, { artboardId: "a1", layer: { id: "l1", type: "image", name: "Image", visible: true, locked: false, opacity: 1, assetId: "asset-1", transform: { position: { x: 10, y: 20 }, scale: { x: 1, y: 1 }, rotation: 0 }, }, }, ); expect(next.document.artboards[0]?.layers.map((layer) => layer.id)).toEqual(["l1"]); }); test("sets artboard bounds", () => { const state = documentAddArtboardCommand.execute( { state: createInitialAppState("Test") }, { id: "a1", name: "Artboard 1", bounds: { x: 0, y: 0, w: 320, h: 240 } }, ); const next = documentSetArtboardBoundsCommand.execute({ state }, { id: "a1", bounds: { x: 10, y: 20, w: 640, h: 480 } }); expect(next.document.artboards[0]?.bounds).toEqual({ x: 10, y: 20, w: 640, h: 480 }); }); });