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);
|
|||
|
|
});
|
|||
|
|
});
|