lsa-planer

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

/ tests domain engstelleAnsaetze.test.ts

4,6 KB Rohdatei
tests/domain/engstelleAnsaetze.test.ts — 111 Zeilen
1 import { describe, expect, it } from 'vitest';
2 import { buildSignalPlan } from '@/domain/plan/signalPlan';
3 import { wartezeitBefunde } from '@/domain/validation/rules';
4 import {
5 createConflict,
6 createEmptyProject,
7 createPhase,
8 createSignalGroup,
9 } from '@/domain/model/factory';
10 import type { RilsaOverrides } from '@/domain/rilsa/settings';
11 import type { Project } from '@/domain/model/project';
12
13 /**
14 * Befund 30, behoben in Fassung 5.10.0.
15 *
16 * Der Vorschlag zur Wartezeit an der einstreifigen Verkehrsfuehrung nannte zwei
17 * fest eingeschriebene Raeumgeschwindigkeiten ("räumt mit 10 m/s statt mit
18 * 7 m/s") und riet zum Verzicht auf einen Laengenzuschlag fuer Lastzuege.
19 * Beide Geschwindigkeiten sind Vorgabenwerte, und der Abbieger wird zusaetzlich
20 * auf den Geradeauswert gekappt - wer geradeaus absenkt, bekam einen gedruckten
21 * Satz, der einen Gewinn von 0 s als Sprung von 7 auf 10 m/s auswies. Der
22 * Lastzug-Halbsatz bringt mit den Regelkennwerten ebenfalls nichts: dort sind
23 * Pkw, Lkw, Bus und Lastzug mit derselben fiktiven Laenge angesetzt.
24 *
25 * Dasselbe Muster ist in derselben Datei fuer die Gelbzeit bereits behoben
26 * (gelbzeitSatz, "KEINE ZAHL AUS DEM SATZ").
27 */
28
29 const DATUM = new Date('2026-01-01T00:00:00Z');
30
31 /** Einstreifige Verkehrsfuehrung, deren Wartezeit die Schwelle reisst. */
32 function engstelle(laenge: number, rilsa: RilsaOverrides = {}): Project {
33 const basis = createEmptyProject('Arbeitsstelle', DATUM, 'einstreifig');
34 const nord = createSignalGroup({ name: 'A1', mode: 'kfz', index: 0 });
35 const sued = createSignalGroup({ name: 'A2', mode: 'kfz', index: 1 });
36 const p1 = createPhase('Richtung Nord', [nord.id]);
37 const p2 = createPhase('Richtung Sued', [sued.id]);
38 return {
39 ...basis,
40 signalGroups: [nord, sued],
41 conflicts: [
42 { ...createConflict(nord.id, sued.id), clearingDistance: laenge, enteringDistance: 0 },
43 { ...createConflict(sued.id, nord.id), clearingDistance: laenge, enteringDistance: 0 },
44 ],
45 phases: [p1, p2],
46 program: { ...basis.program, phaseOrder: [p1.id, p2.id] },
47 settings: { ...basis.settings, rilsa },
48 };
49 }
50
51 /** Der Vorschlagstext des ersten Wartezeitbefunds. */
52 function vorschlag(projekt: Project): string {
53 const befunde = wartezeitBefunde(buildSignalPlan(projekt));
54 expect(befunde.length, 'Ohne Befund prueft der Fall nichts').toBeGreaterThan(0);
55 return befunde[0]!.suggestion;
56 }
57
58 describe('Vorschlag zur Engstelle nennt die wirksamen Kennwerte', () => {
59 it('nimmt die Raeumgeschwindigkeiten aus den Vorgaben des Plans', () => {
60 // Regelkennwerte: 10,0 m/s geradeaus, 7,0 m/s abbiegend - in derselben
61 // Schreibweise wie Ansicht und Ausdruck.
62 const text = vorschlag(engstelle(800));
63
64 expect(text).toContain('10,0 m/s');
65 expect(text).toContain('7,0 m/s');
66 });
67
68 it('verspricht keinen Gewinn, wenn geradeaus abgesenkt ist', () => {
69 // "Räumgeschwindigkeit Kfz geradeaus" auf 5 m/s: Der Abbieger wird auf
70 // denselben Wert gekappt (clearingSpeedFor). Der Wechsel von abbiegend auf
71 // geradeaus bringt dann 0 s - und der Satz darf ihn nicht anpreisen.
72 const text = vorschlag(engstelle(800, { clearingSpeedKfzStraight: 5 }));
73
74 expect(text).not.toContain('10 m/s');
75 expect(text).not.toContain('10,0 m/s');
76 expect(text).not.toContain('7,0 m/s');
77 expect(text).not.toContain('statt mit');
78 expect(text).toContain('5,0 m/s');
79 });
80
81 it('verspricht auch dann nichts, wenn beide Werte gleich gesetzt sind', () => {
82 // Abbiegend auf den Geradeauswert angehoben - zulaessig bis zur Obergrenze.
83 const text = vorschlag(engstelle(800, { clearingSpeedKfzTurning: 10 }));
84
85 expect(text).not.toContain('statt mit');
86 expect(text).toContain('10,0 m/s');
87 });
88
89 it('laesst den Lastzug-Halbsatz weg, solange kein Zuschlag hinterlegt ist', () => {
90 // Mit den Regelkennwerten sind Pkw, Lkw, Bus und Lastzug gleich lang
91 // angesetzt; die Fahrzeugart zu wechseln aendert die Zwischenzeit um 0 s.
92 expect(vorschlag(engstelle(800))).not.toContain('Lastzüge');
93 });
94
95 it('nennt den Lastzugzuschlag, wo er tatsaechlich hinterlegt ist', () => {
96 // Ueber die Vorgabenverwaltung ist eine laengere Bemessung als oertliche
97 // Verschaerfung vorgesehen. Dann - und nur dann - bringt der Rat etwas.
98 const text = vorschlag(engstelle(800, { vehicleLengthLastzug: 18 }));
99
100 expect(text).toContain('Lastzüge');
101 expect(text).toContain('18 m');
102 expect(text).toContain('6 m');
103 });
104
105 it('behaelt den dritten Weg - ein anderes Verfahren', () => {
106 const text = vorschlag(engstelle(800));
107
108 expect(text).toContain('Handschaltung');
109 expect(text).toContain('kürzere Engstelle');
110 });
111 });