import { describe, expect, test } from "bun:test"; import { drawingPlugin } from "../plugins/drawingPlugin"; import { createPointerEvent, createTestCanvas } from "./canvasTestUtils"; describe("drawing plugin", () => { test("records drawn points and adds element", () => { const drawnPoints: string[] = []; const drawnRegions: any[] = []; const harness = createTestCanvas((canvas) => canvas.addPlugins(drawingPlugin({ movementThreshold: 0 })), { data: { zoom: 1 }, contextProperties: { addDrawnPoint: (_event, point) => drawnPoints.push(point.id), addDrawnElement: (_event, region) => { drawnRegions.push(region); return { type: "none" } as const; }, getElementId: (_element: any) => "", // unused filterElements: () => [], }, }); harness.handlers.onPointerDown?.(createPointerEvent({ x: 0, y: 0 })); expect(harness.getMode().type).toBe("drawing"); expect(harness.getData().drawnPoints.length).toBe(1); harness.handlers.onPointerUp?.(createPointerEvent({ x: 0, y: 0 })); expect(drawnPoints.length).toBeGreaterThanOrEqual(2); expect(drawnRegions.length).toBe(1); expect(harness.getMode().type).toBe("none"); expect(harness.getData().drawnPoints.length).toBe(0); }); test("respects movement threshold and canDraw guard", () => { const harness = createTestCanvas((canvas) => canvas.addPlugins(drawingPlugin({ movementThreshold: 5 })), { data: { zoom: 1 }, contextProperties: { canDraw: () => false, getElementId: (_element: any) => "", filterElements: () => [], }, }); harness.handlers.onPointerDown?.(createPointerEvent({ x: 0, y: 0 })); harness.handlers.onPointerMove?.(createPointerEvent({ x: 1, y: 0 })); expect(harness.getMode().type).toBe("none"); harness.handlers.onPointerMove?.(createPointerEvent({ x: 10, y: 0 })); expect(harness.getMode().type).toBe("none"); }); test("can return a new mode from addDrawnElement", () => { const harness = createTestCanvas((canvas) => canvas.addPlugins(drawingPlugin({ movementThreshold: 0 })), { data: { zoom: 1 }, contextProperties: { getElementId: (_element: any) => "", filterElements: () => [], addDrawnElement: () => ({ type: "custom" } as const), }, }); harness.handlers.onPointerDown?.(createPointerEvent({ x: 0, y: 0 })); harness.handlers.onPointerUp?.(createPointerEvent({ x: 0, y: 0 })); expect(harness.getMode().type).toBe("custom"); }); });