67 lines
2.3 KiB
TypeScript
67 lines
2.3 KiB
TypeScript
|
|
/**
|
||
|
|
* CAD-14 Phase 4a: toolOptionsService — zentraler Store fuer
|
||
|
|
* Werkzeug-Optionen (Laenge, Breite, chordCount, Winkel...).
|
||
|
|
* Quelle der Defaults: optionsSchema der V2-Werkzeuge.
|
||
|
|
* Der InteractionDispatcher liest darueber getOptions.
|
||
|
|
*/
|
||
|
|
import { describe, it, expect, beforeEach } from 'vitest';
|
||
|
|
import {
|
||
|
|
getToolOption,
|
||
|
|
setToolOption,
|
||
|
|
getToolOptions,
|
||
|
|
resetToolOptions,
|
||
|
|
subscribeToolOptions,
|
||
|
|
defaultsFromSchema,
|
||
|
|
setToolOptionsDefaults,
|
||
|
|
} from '../src/services/toolOptionsService';
|
||
|
|
|
||
|
|
describe('CAD-14 Phase 4a: toolOptionsService', () => {
|
||
|
|
beforeEach(() => {
|
||
|
|
resetToolOptions();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('defaultsFromSchema: leitet Defaults aus optionsSchema ab', () => {
|
||
|
|
const defaults = defaultsFromSchema([
|
||
|
|
{ key: 'length', label: 'Länge', type: 'number', min: 10, max: 1000 },
|
||
|
|
{ key: 'chordCount', label: 'Gurtrohre', type: 'number', min: 1, max: 4 },
|
||
|
|
] as never);
|
||
|
|
// number ohne expliziten default: min clamped auf sinnvollen Start
|
||
|
|
expect(defaults.length).toBeDefined();
|
||
|
|
expect(defaults.chordCount).toBeDefined();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('set/get: Wert wird gespeichert und gelesen', () => {
|
||
|
|
setToolOption('truss', 'length', 175);
|
||
|
|
expect(getToolOption('truss', 'length')).toBe(175);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('getToolOption ohne Set: default aus Schema (defaultsFromSchema)', () => {
|
||
|
|
setToolOptionsDefaults('truss', { length: 200, chordCount: 2, trussWidth: 29 });
|
||
|
|
expect(getToolOption('truss', 'length')).toBe(200);
|
||
|
|
expect(getToolOption('truss', 'chordCount')).toBe(2);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('getToolOptions liefert Gesamtsatz (defaults + gesetzte Werte)', () => {
|
||
|
|
setToolOptionsDefaults('truss', { length: 200, trussWidth: 29 });
|
||
|
|
setToolOption('truss', 'length', 300);
|
||
|
|
const all = getToolOptions('truss');
|
||
|
|
expect(all.length).toBe(300);
|
||
|
|
expect(all.trussWidth).toBe(29);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('subscribe: Benachrichtigung bei Änderung (UI-Update)', () => {
|
||
|
|
let notified = 0;
|
||
|
|
const unsub = subscribeToolOptions(() => { notified++; });
|
||
|
|
setToolOption('truss', 'length', 250);
|
||
|
|
unsub();
|
||
|
|
setToolOption('truss', 'length', 260);
|
||
|
|
expect(notified).toBe(1);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('resetToolOptions leert alles', () => {
|
||
|
|
setToolOptionsDefaults('truss', { length: 200 });
|
||
|
|
resetToolOptions();
|
||
|
|
expect(getToolOption('truss', 'length', 99)).toBe(99);
|
||
|
|
});
|
||
|
|
});
|