import { describe, expect, test } from "bun:test"; import { linePlugin } from "../plugins/linePlugin"; import { createPointerEvent, createTestCanvas } from "./canvasTestUtils"; describe("line plugin", () => { test("highlights and moves an endpoint", () => { const line = { rect: { x: 0, y: 0, width: 10, height: 10 }, start: { id: "start", x: 0, y: 0 }, end: { id: "end", x: 1, y: 1 }, }; const moves: any[] = []; const harness = createTestCanvas( (canvas) => canvas.addPlugins( linePlugin<{ snapshot: string }>({ movementThreshold: 0 }) ), { data: { zoom: 1, pointHandleSize: 8 }, contextProperties: { getLine: () => line, getStateSnapshot: () => ({ snapshot: "state" }), moveLinePoint: (params) => moves.push(params), }, } ); harness.handlers.onPointerMove?.(createPointerEvent({ x: 0, y: 0 })); expect(harness.getData().highlightedPointId).toBe("start"); harness.handlers.onPointerDown?.(createPointerEvent({ x: 0, y: 0 })); expect(harness.getMode().type).toBe("movingLinePoint"); harness.handlers.onPointerMove?.(createPointerEvent({ x: 5, y: 5 })); expect(moves[0]).toMatchObject({ id: "start", snapshot: { snapshot: "state" }, }); harness.handlers.onPointerUp?.(createPointerEvent({ x: 5, y: 5 })); expect(harness.getMode().type).toBe("none"); }); test("movement threshold prevents move and clears on leave", () => { const line = { rect: { x: 0, y: 0, width: 10, height: 10 }, start: { id: "start", x: 0, y: 0 }, end: { id: "end", x: 1, y: 1 }, }; const moves: any[] = []; const harness = createTestCanvas( (canvas) => canvas.addPlugins( linePlugin<{ snapshot: string }>({ movementThreshold: 20 }) ), { data: { zoom: 1, pointHandleSize: 8 }, contextProperties: { getLine: () => line, getStateSnapshot: () => ({ snapshot: "state" }), moveLinePoint: (params) => moves.push(params), }, } ); harness.handlers.onPointerDown?.(createPointerEvent({ x: 0, y: 0 })); harness.handlers.onPointerMove?.(createPointerEvent({ x: 1, y: 1 })); expect(moves.length).toBe(0); harness.handlers.onPointerLeave?.(createPointerEvent({})); expect(harness.getData().highlightedPointId).toBeUndefined(); }); });