lsa-planer
LSA-Planer Professional – Planungssoftware für Lichtsignalanlagen nach RiLSA 2015 und § 45 StVO. EUPL-1.2.
/ tests domain hoechstfreigabezeitAus4x.test.ts
| 1 | import { describe, expect, it } from 'vitest'; |
| 2 | import { loadProject } from '@/domain/model/migrate'; |
| 3 | import { buildSignalPlan } from '@/domain/plan/signalPlan'; |
| 4 | |
| 5 | /* |
| 6 | * Fassung 5.10.0: Der Kommentar an der Uebernahme aus 4.x begruendete sie nur |
| 7 | * fuer die Mindestfreigabezeit, uebernahm daneben aber auch "maxGruen". Seit |
| 8 | * den Befunden 36 und 42 geht die Hoechstfreigabezeit je Signalgruppe in die |
| 9 | * Freigabezeitverteilung ein; der Kommentar nennt sie jetzt mit. |
| 10 | * |
| 11 | * Die Aussage des Kommentars war bis hierher von keiner Wache gedeckt: Weder |
| 12 | * tests/domain/migrate.test.ts noch |
| 13 | * tests/domain/hoechstfreigabezeitGruppe.test.ts pruefen, dass |
| 14 | * "maxGruen" aus einer 4.x-Datei ankommt. Die zweite belegt, dass ein gesetztes |
| 15 | * `maxGreenOverride` wirkt; hier steht der Weg dorthin. |
| 16 | * |
| 17 | * Beide Faelle bestehen auch ohne die Kommentaraenderung - sie aendert kein |
| 18 | * Verhalten. Sie halten fest, was der Kommentar zusagt. |
| 19 | */ |
| 20 | |
| 21 | const DATUM = new Date('2026-01-01T00:00:00Z'); |
| 22 | |
| 23 | /** |
| 24 | * Ein Ausschnitt einer 4.x-Datei, gekuerzt auf das, was die beiden Faelle |
| 25 | * brauchen. K2 traegt mit 30 s eine kleinere Hoechstfreigabezeit als die feste |
| 26 | * Freigabezeit von 35 s der Phase, in der K2 laeuft. |
| 27 | */ |
| 28 | const altprojekt = { |
| 29 | metadata: { id: 'LSA-1731600000000-abc123def', version: '4.3.3' }, |
| 30 | projektdaten: { projektBezeichnung: 'Aufstieg 4.x' }, |
| 31 | signalgruppen: [ |
| 32 | { id: 'SG-1', nummer: 'K1', typ: 'kfz', richtung: 'geradeaus', minGruen: 5, maxGruen: 40 }, |
| 33 | { id: 'SG-2', nummer: 'K2', typ: 'kfz', richtung: 'links', minGruen: 5, maxGruen: 30 }, |
| 34 | { id: 'SG-3', nummer: 'F1', typ: 'fussgaenger', richtung: '', minGruen: 6, maxGruen: 20 }, |
| 35 | ], |
| 36 | sperrmatrix: { |
| 37 | matrix: [ |
| 38 | [false, false, true], |
| 39 | [false, false, true], |
| 40 | [true, true, false], |
| 41 | ], |
| 42 | }, |
| 43 | zwischenzeiten: { parameter: { raeumweg: 24, einfahrweg: 9 }, matrix: [] }, |
| 44 | phasen: [ |
| 45 | { id: 'PH-1', nummer: 1, bezeichnung: 'Phase 1', signalgruppen: ['SG-1', 'SG-2'], dauer: 35 }, |
| 46 | { id: 'PH-2', nummer: 2, bezeichnung: 'Phase 2', signalgruppen: ['SG-3'], dauer: 15 }, |
| 47 | ], |
| 48 | signalplan: { umlaufzeit: 70, signalbilder: [] }, |
| 49 | umlaufzeit: { verfahren: 'webster', eingabe: 70 }, |
| 50 | lageplan: null, |
| 51 | pruefungen: {}, |
| 52 | }; |
| 53 | |
| 54 | describe('R1.4 - Hoechstfreigabezeit aus einer 4.x-Datei', () => { |
| 55 | it('uebernimmt "maxGruen" in maxGreenOverride', () => { |
| 56 | const gruppen = loadProject(altprojekt, DATUM).project.signalGroups; |
| 57 | const wert = (name: string) => gruppen.find((g) => g.name === name)?.maxGreenOverride; |
| 58 | |
| 59 | expect(wert('K1')).toBe(40); |
| 60 | expect(wert('K2')).toBe(30); |
| 61 | expect(wert('F1')).toBe(20); |
| 62 | // Die Mindestfreigabezeit kommt daneben unveraendert mit. |
| 63 | expect(gruppen.find((g) => g.name === 'K1')?.minGreenOverride).toBe(5); |
| 64 | }); |
| 65 | |
| 66 | it('laesst den uebernommenen Wert im Signalzeitenplan zur Wirkung kommen', () => { |
| 67 | // Der uebernommene Wert ist kein totes Feld mehr: Er ist kleiner als die |
| 68 | // feste Freigabezeit seiner Phase und wird deshalb als wirkungslos |
| 69 | // gemeldet - eine Meldung, die es ohne gelesene Vorgabe nicht gaebe. |
| 70 | const projekt = loadProject(altprojekt, DATUM).project; |
| 71 | const notiz = buildSignalPlan(projekt).notes.find( |
| 72 | (n) => n.code === 'hoechstfreigabezeit-unter-fester-freigabezeit', |
| 73 | ); |
| 74 | |
| 75 | expect(notiz, 'die Vorgabe aus der 4.x-Datei erreicht die Verteilung nicht').toBeDefined(); |
| 76 | expect(notiz!.message).toContain('K2'); |
| 77 | expect(notiz!.message).toContain('30'); |
| 78 | }); |
| 79 | }); |