import assert from "node:assert/strict"; import test from "node:test"; import { advanceGraphCamera } from "../apps/platform-web/src/screens/spatial/graph/camera.ts"; const viewport = { width: 800, height: 600 }; function wheel(overrides = {}) { return { deltaX: 0, deltaY: 0, deltaMode: 0, shiftKey: false, zoom: false, x: 0, y: 0, ...overrides, }; } test("pans along both axes in graph-space units at the current scale", () => { const next = advanceGraphCamera( { center: { x: 3, y: -2 }, scale: 2 }, wheel({ deltaX: 20, deltaY: -10 }), viewport, ); assert.deepEqual(next, { center: { x: 13, y: -7 }, scale: 2 }); }); test("converts line-mode wheel deltas using sixteen pixels per line", () => { const next = advanceGraphCamera( { center: { x: 0, y: 0 }, scale: 1 }, wheel({ deltaX: 2, deltaY: 3, deltaMode: 1 }), viewport, ); assert.deepEqual(next, { center: { x: 32, y: 48 }, scale: 1 }); }); test("shift-wheel maps a vertical delta to horizontal panning", () => { const next = advanceGraphCamera( { center: { x: 8, y: 4 }, scale: 2 }, wheel({ deltaY: 12, shiftKey: true }), viewport, ); assert.deepEqual(next, { center: { x: 14, y: 4 }, scale: 2 }); }); test("zoom keeps the graph point beneath the pointer fixed", () => { const camera = { center: { x: 40, y: -12 }, scale: 1.25 }; const input = wheel({ deltaY: -80, zoom: true, x: 180, y: 260 }); const size = { width: 600, height: 500 }; const before = { x: camera.center.x + (input.x - size.width / 2) / camera.scale, y: camera.center.y + (input.y - size.height / 2) / camera.scale, }; const next = advanceGraphCamera(camera, input, size); const after = { x: next.center.x + (input.x - size.width / 2) / next.scale, y: next.center.y + (input.y - size.height / 2) / next.scale, }; assert.ok(Math.abs(after.x - before.x) < 1e-10); assert.ok(Math.abs(after.y - before.y) < 1e-10); }); test("clamps zoom to the configured minimum and viewport maximum", () => { const camera = { center: { x: 0, y: 0 }, scale: 1 }; const size = { width: 800, height: 600 }; const zoomIn = advanceGraphCamera( camera, wheel({ deltaY: -10_000, zoom: true, x: 400, y: 300 }), size, ); const zoomOut = advanceGraphCamera( camera, wheel({ deltaY: 10_000, zoom: true, x: 400, y: 300 }), size, ); assert.equal(zoomIn.scale, 2.4); assert.equal(zoomOut.scale, 0.22); });