/** * The project's symbol scale: how large the scene view draws its icons, 0.1 to 4, default 1. */ import { describe, expect, it } from 'vitest'; import { SetSymbolScaleCommand } from '../../src/core/commands/projectCommands'; import { createEmptyProject } from '../../src/core/model/Project'; import { symbolScaleOf } from '../../src/core/model/symbolScale'; import { footprintOf, iconCorners } from '../../src/core/properties/bounds'; import { deserializeProject, serializeProject } from '../../src/core/store/serialize'; describe('symbol scale', () => { it('is 1 in a new project and in one written before there was any', () => { expect(createEmptyProject('p', 'P').symbolScale).toBe(1); expect(deserializeProject({ id: 'p', name: 'P', assets: [] }).symbolScale).toBe(1); }); it('survives a save and a load', () => { const project = { ...createEmptyProject('p', 'P'), symbolScale: 0.25 }; expect(deserializeProject(serializeProject(project)).symbolScale).toBe(0.25); }); it('reads untrusted JSON into the range 0.1 to 4', () => { expect(symbolScaleOf({ symbolScale: 0.05 })).toBe(0.1); expect(symbolScaleOf({ symbolScale: 12 })).toBe(4); expect(symbolScaleOf({ symbolScale: 2.5 })).toBe(2.5); expect(symbolScaleOf({ symbolScale: '2' })).toBe(1); expect(symbolScaleOf({ symbolScale: Number.NaN })).toBe(1); expect(symbolScaleOf(null)).toBe(1); }); it('is one undo step, clamped like a loaded project', () => { const project = createEmptyProject('p', 'P'); const command = new SetSymbolScaleCommand(7); command.execute(project); expect(project.symbolScale).toBe(4); command.undo(project); expect(project.symbolScale).toBe(1); }); it('grows the outline of an icon-only symbol with the icon, the padding stays', () => { const { w } = footprintOf('behavior', {}); const at = { x: 100, y: 50 }; const half = (corners: { x: number }[]) => (corners[1]!.x - corners[0]!.x) / 2; expect(half(iconCorners('behavior', {}, at, 1))).toBe(w / 2); expect(half(iconCorners('behavior', {}, at, 0.5))).toBe(w / 4); expect(half(iconCorners('behavior', {}, at, 2, 3))).toBe(w + 3); const corners = iconCorners('behavior', {}, at, 0.5); expect((corners[0]!.x + corners[2]!.x) / 2).toBe(100); expect((corners[0]!.y + corners[2]!.y) / 2).toBe(50); }); });