lsa-planer

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

/ tests domain altformatVerkehrsart.test.ts

3,4 KB Rohdatei
tests/domain/altformatVerkehrsart.test.ts — 86 Zeilen
1 import { describe, expect, it } from 'vitest';
2 import { loadProject } from '@/domain/model/migrate';
3 import { buildSignalPlan, intergreenBetween } from '@/domain/plan/signalPlan';
4
5 /*
6 * Befund 4, behoben in Fassung 5.10.0.
7 *
8 * Die Auswahlliste der Fassung 4.3.3 kennt vier Verkehrsarten: kfz, fuss, rad
9 * und `opnv`. Die Uebernahme prueft auf 'oepnv', 'öpnv', 'bus' und 'bahn' -
10 * `opnv` (ohne e) enthaelt keine davon und fiel stumm auf 'kfz'. Aus jeder
11 * OePNV-Gruppe wurde damit ein Kraftfahrzeugstrom: geraeumt mit 10,0 m/s statt
12 * mit Vmax/3,6, ueberfahren mit der Gelbzeit statt mit der OePNV-Staffel. Die
13 * Zwischenzeit fiel je Beziehung eine Sekunde zu kurz aus - die gefaehrliche
14 * Richtung -, und `issues` blieb dazu leer.
15 */
16 const DATUM = new Date('2026-09-05T08:00:00Z');
17
18 /**
19 * Ein Altprojekt mit zwei einander widersprechenden Stroemen. Ohne
20 * `zwischenzeiten.parameter` gelten die Rueckfallwege der Uebernahme:
21 * Raeumweg 20 m, Einfahrweg 10 m.
22 */
23 function altprojekt(typ: string): Record<string, unknown> {
24 return {
25 metadata: { version: '4.3.3' },
26 projektdaten: { projektBezeichnung: 'Übernahme' },
27 signalgruppen: [
28 { id: 'SG-1', nummer: 'B1', typ, richtung: 'geradeaus', geschwindigkeit: 50 },
29 { id: 'SG-2', nummer: 'K1', typ: 'kfz', richtung: 'geradeaus', geschwindigkeit: 50 },
30 ],
31 sperrmatrix: {
32 matrix: [
33 [false, true],
34 [true, false],
35 ],
36 },
37 zwischenzeiten: { matrix: [] },
38 phasen: [
39 { id: 'PH-1', bezeichnung: 'Phase 1', signalgruppen: ['SG-1'] },
40 { id: 'PH-2', bezeichnung: 'Phase 2', signalgruppen: ['SG-2'] },
41 ],
42 };
43 }
44
45 function zwischenzeitVonB1(typ: string): number {
46 const { project } = loadProject(altprojekt(typ), DATUM);
47 const b1 = project.signalGroups.find((g) => g.name === 'B1')!;
48 const k1 = project.signalGroups.find((g) => g.name === 'K1')!;
49 return intergreenBetween(buildSignalPlan(project).intergreens, b1.id, k1.id);
50 }
51
52 describe('Befund 4: OePNV-Verkehrsart der Fassung 4.3.3', () => {
53 it('erkennt den gespeicherten Wert "opnv" als OePNV-Strom', () => {
54 const { project } = loadProject(altprojekt('opnv'), DATUM);
55 const b1 = project.signalGroups.find((g) => g.name === 'B1')!;
56
57 expect(b1.mode).toBe('oepnv');
58 expect(b1.vehicleClass).toBe('bus');
59 });
60
61 it('raeumt danach nach der OePNV-Regel und nicht mehr mit dem Kfz-Regelwert', () => {
62 // Raeumweg 20 m + Fahrzeuglaenge 6 m; vZul 50 km/h.
63 // OePNV: tr = 26 / 13,89 = 1,87 s, tue = 5 s (Staffel), te = 10 / 11,1 = 0,90 s -> 6 s.
64 // Kfz geradeaus: tr = 26 / 10,0 = 2,60 s, tue = 3 s (Gelbzeit) -> 5 s.
65 expect(zwischenzeitVonB1('opnv')).toBe(6);
66 expect(zwischenzeitVonB1('öpnv')).toBe(6);
67 expect(zwischenzeitVonB1('kfz')).toBe(5);
68 });
69
70 it('meldet eine unbekannte Verkehrsart, statt sie stumm zum Kfz-Strom zu machen', () => {
71 const { project, issues } = loadProject(altprojekt('MIV'), DATUM);
72 const meldung = issues.find((i) => i.path === 'signalgruppen[0]');
73
74 expect(meldung).toBeDefined();
75 expect(meldung!.severity).toBe('warnung');
76 expect(meldung!.message).toContain('MIV');
77 expect(project.signalGroups[0]!.mode).toBe('kfz');
78 });
79
80 it('schweigt zu den vier Werten der Auswahlliste und zum fehlenden Eintrag', () => {
81 for (const typ of ['kfz', 'fuss', 'rad', 'opnv', '']) {
82 const { issues } = loadProject(altprojekt(typ), DATUM);
83 expect(issues.filter((i) => i.path.startsWith('signalgruppen['))).toEqual([]);
84 }
85 });
86 });