import test from 'node:test'; import assert from 'node:assert/strict'; import { MARKUP_DEFAULT_COLOR, MARKUP_DEFAULT_SHAPE, getArrowGeometry, getMarkupPreviewStrokeWidth, sanitizeMarkupColor, sanitizeMarkupShape, } from '../src/markupShapeGeometry.js'; test('markup defaults use arrow and red', () => { assert.equal(MARKUP_DEFAULT_SHAPE, 'arrow'); assert.equal(MARKUP_DEFAULT_COLOR, '#ff0000'); assert.equal(sanitizeMarkupColor(undefined), '#ff0000'); }); test('sanitizeMarkupShape falls back to arrow and red', () => { assert.deepEqual( sanitizeMarkupShape( { kind: 'triangle', x1: 0.1, y1: 0.2, x2: 0.9, y2: 0.8, width: 5, color: 'not-a-color', }, MARKUP_DEFAULT_SHAPE, MARKUP_DEFAULT_COLOR, 3, ), { kind: 'arrow', x1: 0.1, y1: 0.2, x2: 0.9, y2: 0.8, width: 5, color: '#ff0000', }, ); }); test('getArrowGeometry keeps the shaft at the head base with no rounded overlap', () => { const arrow = getArrowGeometry( { x1: 0, y1: 0, x2: 1, y2: 0, width: 4, }, 100, 100, ); assert.equal(arrow.line, '0,0 84,0'); assert.equal(arrow.head, '100,0 84,6 84,-6'); }); test('getMarkupPreviewStrokeWidth matches backend preview scaling', () => { assert.equal(getMarkupPreviewStrokeWidth(10, 256, 256), 10); assert.equal(getMarkupPreviewStrokeWidth(10, 1024, 768), 20); });