lsa-planer
LSA-Planer Professional – Planungssoftware für Lichtsignalanlagen nach RiLSA 2015 und § 45 StVO. EUPL-1.2.
/ tests domain altformatVerkehrsart.test.ts
| 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 | }); |