86 lines
3.6 KiB
TypeScript
86 lines
3.6 KiB
TypeScript
/**
|
||
* 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);
|
||
});
|
||
});
|