import { describe, it, expect } from 'vitest'; import { shieldPath, pennantPath, toPx, fromPx, artboardClipPath, ARTBOARD_PRESETS, } from '../artboardShapes'; import type { ArtboardConfig } from '../../types/canvas'; describe('artboardShapes', () => { describe('ARTBOARD_PRESETS', () => { it('has presets for all shapes', () => { const shapes = ['rect', 'square', 'circle', 'oval', 'shield', 'pennant', 'custom'] as const; for (const s of shapes) { expect(ARTBOARD_PRESETS[s]).toBeDefined(); expect(ARTBOARD_PRESETS[s].width).toBeGreaterThan(0); expect(ARTBOARD_PRESETS[s].height).toBeGreaterThan(0); } }); it('square preset has equal width and height', () => { expect(ARTBOARD_PRESETS.square.width).toBe(ARTBOARD_PRESETS.square.height); }); it('circle preset has equal width and height', () => { expect(ARTBOARD_PRESETS.circle.width).toBe(ARTBOARD_PRESETS.circle.height); }); }); describe('shieldPath', () => { it('produces a closed SVG path', () => { const p = shieldPath(100, 120); expect(p).toContain('M'); expect(p).toContain('Z'); }); it('stays within bounding box', () => { const p = shieldPath(200, 300); // path starts at indent, ends at w-indent so all coords ≤ 200/300 expect(p).toBeTruthy(); }); }); describe('pennantPath', () => { it('produces a triangular closed path', () => { const p = pennantPath(100, 200); expect(p).toBe('M 0 0 L 100 0 L 50 200 Z'); }); }); describe('toPx / fromPx', () => { it('converts inches to pixels at 96 PPI', () => { expect(toPx(1, 'inches')).toBe(96); expect(toPx(2, 'inches')).toBe(192); }); it('converts mm to pixels', () => { const px = toPx(25.4, 'mm'); expect(px).toBeCloseTo(96, 1); }); it('fromPx inverts toPx for inches', () => { expect(fromPx(96, 'inches')).toBe(1); }); it('fromPx inverts toPx for mm', () => { expect(fromPx(toPx(10, 'mm'), 'mm')).toBeCloseTo(10, 5); }); }); describe('artboardClipPath', () => { it('returns undefined for rect', () => { const cfg: ArtboardConfig = { shape: 'rect', width: 4, height: 6, unit: 'inches' }; expect(artboardClipPath(cfg)).toBeUndefined(); }); it('returns a path string for shield', () => { const cfg: ArtboardConfig = { shape: 'shield', width: 4, height: 5, unit: 'inches' }; const p = artboardClipPath(cfg); expect(p).toBeDefined(); expect(p).toContain('Z'); }); it('returns a triangular path for pennant', () => { const cfg: ArtboardConfig = { shape: 'pennant', width: 3, height: 8, unit: 'inches' }; const p = artboardClipPath(cfg); expect(p).toBeDefined(); expect(p).toContain('Z'); }); it('returns custom clipPath when shape is custom', () => { const cfg: ArtboardConfig = { shape: 'custom', width: 4, height: 4, unit: 'inches', clipPath: 'M 0 0 L 50 0 L 50 50 Z', }; expect(artboardClipPath(cfg)).toBe('M 0 0 L 50 0 L 50 50 Z'); }); }); });