lsa-planer

LSA-Planer Professional – Planungssoftware für Lichtsignalanlagen nach RiLSA 2015 und § 45 StVO. EUPL-1.2.

/ tests domain hoechstfreigabezeitAus4x.test.ts

3,4 KB Rohdatei
tests/domain/hoechstfreigabezeitAus4x.test.ts — 79 Zeilen
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 });