import { describe, expect, it } from 'vitest'; import { loadProject } from '@/domain/model/migrate'; import { buildSignalPlan } from '@/domain/plan/signalPlan'; /* * Fassung 5.10.0: Der Kommentar an der Uebernahme aus 4.x begruendete sie nur * fuer die Mindestfreigabezeit, uebernahm daneben aber auch "maxGruen". Seit * den Befunden 36 und 42 geht die Hoechstfreigabezeit je Signalgruppe in die * Freigabezeitverteilung ein; der Kommentar nennt sie jetzt mit. * * Die Aussage des Kommentars war bis hierher von keiner Wache gedeckt: Weder * tests/domain/migrate.test.ts noch * tests/domain/hoechstfreigabezeitGruppe.test.ts pruefen, dass * "maxGruen" aus einer 4.x-Datei ankommt. Die zweite belegt, dass ein gesetztes * `maxGreenOverride` wirkt; hier steht der Weg dorthin. * * Beide Faelle bestehen auch ohne die Kommentaraenderung - sie aendert kein * Verhalten. Sie halten fest, was der Kommentar zusagt. */ const DATUM = new Date('2026-01-01T00:00:00Z'); /** * Ein Ausschnitt einer 4.x-Datei, gekuerzt auf das, was die beiden Faelle * brauchen. K2 traegt mit 30 s eine kleinere Hoechstfreigabezeit als die feste * Freigabezeit von 35 s der Phase, in der K2 laeuft. */ const altprojekt = { metadata: { id: 'LSA-1731600000000-abc123def', version: '4.3.3' }, projektdaten: { projektBezeichnung: 'Aufstieg 4.x' }, signalgruppen: [ { id: 'SG-1', nummer: 'K1', typ: 'kfz', richtung: 'geradeaus', minGruen: 5, maxGruen: 40 }, { id: 'SG-2', nummer: 'K2', typ: 'kfz', richtung: 'links', minGruen: 5, maxGruen: 30 }, { id: 'SG-3', nummer: 'F1', typ: 'fussgaenger', richtung: '', minGruen: 6, maxGruen: 20 }, ], sperrmatrix: { matrix: [ [false, false, true], [false, false, true], [true, true, false], ], }, zwischenzeiten: { parameter: { raeumweg: 24, einfahrweg: 9 }, matrix: [] }, phasen: [ { id: 'PH-1', nummer: 1, bezeichnung: 'Phase 1', signalgruppen: ['SG-1', 'SG-2'], dauer: 35 }, { id: 'PH-2', nummer: 2, bezeichnung: 'Phase 2', signalgruppen: ['SG-3'], dauer: 15 }, ], signalplan: { umlaufzeit: 70, signalbilder: [] }, umlaufzeit: { verfahren: 'webster', eingabe: 70 }, lageplan: null, pruefungen: {}, }; describe('R1.4 - Hoechstfreigabezeit aus einer 4.x-Datei', () => { it('uebernimmt "maxGruen" in maxGreenOverride', () => { const gruppen = loadProject(altprojekt, DATUM).project.signalGroups; const wert = (name: string) => gruppen.find((g) => g.name === name)?.maxGreenOverride; expect(wert('K1')).toBe(40); expect(wert('K2')).toBe(30); expect(wert('F1')).toBe(20); // Die Mindestfreigabezeit kommt daneben unveraendert mit. expect(gruppen.find((g) => g.name === 'K1')?.minGreenOverride).toBe(5); }); it('laesst den uebernommenen Wert im Signalzeitenplan zur Wirkung kommen', () => { // Der uebernommene Wert ist kein totes Feld mehr: Er ist kleiner als die // feste Freigabezeit seiner Phase und wird deshalb als wirkungslos // gemeldet - eine Meldung, die es ohne gelesene Vorgabe nicht gaebe. const projekt = loadProject(altprojekt, DATUM).project; const notiz = buildSignalPlan(projekt).notes.find( (n) => n.code === 'hoechstfreigabezeit-unter-fester-freigabezeit', ); expect(notiz, 'die Vorgabe aus der 4.x-Datei erreicht die Verteilung nicht').toBeDefined(); expect(notiz!.message).toContain('K2'); expect(notiz!.message).toContain('30'); }); });