/** * Task H2 – Projekt-Templates: JSON-Presets für Branchen-Szenarien. * * Sechs Presets (halle/openair/saal/messe/buero/garten), jedes mit * gridSize/unit, Layer-Set, enabled plugins und library folder seed. * applyProjectTemplate überträgt die Layer in ein CADDocument * (bestehende Layer werden ersetzt — Template = Startzustand). */ import { describe, it, expect } from 'vitest'; import { CADDocument } from '../src/kernel/document/CADDocument'; import { createInMemoryDoc } from './helpers/inMemoryDoc'; import { PROJECT_TEMPLATES, getProjectTemplate, applyProjectTemplate, type ProjectTemplate, } from '../src/services/projectTemplates'; const EXPECTED_IDS = ['halle', 'openair', 'saal', 'messe', 'buero', 'garten']; describe('H2: Projekt-Templates', () => { it('enthält genau die 6 Branchen-Presets mit eindeutigen IDs', () => { expect(PROJECT_TEMPLATES.map((t) => t.id).sort()).toEqual([...EXPECTED_IDS].sort()); expect(new Set(PROJECT_TEMPLATES.map((t) => t.id)).size).toBe(6); }); it('jedes Preset hat Name, gridSize, unit, Layer (>=2), enabledPlugins und libraryFolderSeed', () => { for (const tpl of PROJECT_TEMPLATES) { expect(tpl.name.length).toBeGreaterThan(2); expect(tpl.gridSize).toBeGreaterThan(0); expect(['mm', 'cm', 'm']).toContain(tpl.unit); expect(tpl.layers.length).toBeGreaterThanOrEqual(2); expect(tpl.enabledPlugins.length).toBeGreaterThan(0); expect(tpl.libraryFolderSeed.length).toBeGreaterThan(2); // Layer haben gültige CADLayer-Struktur mit eindeutigen IDs const layerIds = new Set(tpl.layers.map((l) => l.id)); expect(layerIds.size).toBe(tpl.layers.length); expect(tpl.layers.every((l) => l.name.length > 0 && typeof l.visible === 'boolean')).toBe(true); } }); it('Szenario-spezifika: halle/openair/saal aktivieren event-tools, garten landscape', () => { const halle = getProjectTemplate('halle')!; expect(halle.enabledPlugins).toContain('event-tools'); const openair = getProjectTemplate('openair')!; expect(openair.enabledPlugins).toContain('event-tools'); const saal = getProjectTemplate('saal')!; expect(saal.enabledPlugins).toContain('event-tools'); const garten = getProjectTemplate('garten')!; expect(garten.libraryFolderSeed.toLowerCase()).toContain('garten'); const buero = getProjectTemplate('buero')!; expect(buero.unit).toBe('mm'); }); it('getProjectTemplate liefert undefined für unbekannte ID', () => { expect(getProjectTemplate('gibts-nicht')).toBeUndefined(); }); }); describe('H2: applyProjectTemplate', () => { it('setzt die Template-Layer im CADDocument (ersetzt bestehende)', () => { const { ydoc } = createInMemoryDoc(); const doc = new CADDocument(ydoc); // Bestehenden Layer simulieren ydoc.data.layers.set('alt', { id: 'alt', name: 'Alt', visible: true, locked: false, color: '#fff', lineType: 'solid', transparency: 0, sortOrder: 0, parentId: null, }); const tpl = getProjectTemplate('halle')!; applyProjectTemplate(doc, tpl); const layers = doc.getAllLayers(); expect(layers.map((l) => l.id)).toEqual(tpl.layers.map((l) => l.id)); expect(layers.find((l) => l.id === 'alt')).toBeUndefined(); }); it('Template-Layer sind danach über CADDocument lesbar', () => { const { ydoc } = createInMemoryDoc(); const doc = new CADDocument(ydoc); const tpl = getProjectTemplate('buero')!; applyProjectTemplate(doc, tpl); const first = doc.getLayer(tpl.layers[0].id); expect(first).toBeDefined(); expect(first!.name).toBe(tpl.layers[0].name); }); });