lsa-planer

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

/ tests domain engstelle.test.ts

4,2 KB Rohdatei
tests/domain/engstelle.test.ts — 91 Zeilen
1 import { describe, expect, it } from 'vitest';
2 import { engstellenFolgen, umlaufBeiFreigabe } from '@/domain/rilsa/engstelle';
3 import { ANLAGENART_GRENZEN, RILSA_DEFAULTS } from '@/domain/rilsa/constants';
4
5 /*
6 * Die Zahlen, mit denen die Obergrenze der Umlaufzeit fuer eine Arbeitsstelle
7 * begruendet wird.
8 *
9 * Sie stehen im PDF-Ausdruck, in den Unterlagen und im Pruefstand-Kommentar
10 * von ANLAGENART_GRENZEN - und sie waren an allen diesen Stellen falsch:
11 * 125 s Zwischenzeit und 290 s Umlauf bei 1000 m Engstelle.
12 * Aus den Kennwerten dieses Programms folgen 104 s und 248 s. Die 125 s
13 * setzten eine Raeumgeschwindigkeit von 8,2 m/s voraus, die es nirgends gibt.
14 *
15 * Eine Zahl, die in eine Planunterlage gedruckt wird und sich aus keiner
16 * Rechnung des Programms ergibt, ist als Begruendung wertlos: Ein Pruefer, der
17 * sie nachrechnet, findet etwas anderes. Der Ausdruck rechnet sie deshalb
18 * inzwischen; dieser Test haelt die Rechnung fest.
19 */
20
21 describe('Folgen einer Engstellenlaenge', () => {
22 it('rechnet die Zwischenzeit nach dem Engstellenverfahren der RiLSA', () => {
23 /*
24 * UMGESTELLT MIT 5.27.0 auf RiLSA 2015, Abschnitt 5.2.2:
25 * tz = tue + sr/Vr * 3,6 mit tue = 4 s, sr = Abstand der Haltlinien OHNE
26 * Fahrzeuglaenge und Vr = 40 km/h bei zulaessig 50 km/h.
27 *
28 * 4 + 1000/40 * 3,6 = 4 + 90 = 94 s. Bis 5.26.0 rechnete das Programm
29 * hier die Knotenpunktformel: (1000 + 6)/10,0 + 3 = 103,6 -> 104 s.
30 */
31 const laenge = 1000;
32 expect(engstellenFolgen(laenge, 50).zwischenzeit).toBe(94);
33 // Die Fahrzeuglaenge geht NICHT mehr ein - das ist der halbe Unterschied.
34 expect(RILSA_DEFAULTS.vehicleLength.pkw).toBe(6);
35 });
36
37 it('waechst geradlinig mit der Laenge', () => {
38 // Je 100 m 9 s: Vr = 40 km/h. Bis 5.26.0 waren es 10 s je 100 m.
39 expect(engstellenFolgen(100, 50).zwischenzeit).toBe(13);
40 expect(engstellenFolgen(400, 50).zwischenzeit).toBe(40);
41 expect(engstellenFolgen(700, 50).zwischenzeit).toBe(67);
42 });
43
44 it('haengt die Raeumgeschwindigkeit an der zulaessigen Hoechstgeschwindigkeit', () => {
45 /*
46 * Der zweite Unterschied zum Knotenpunkt, und er dreht die Richtung um:
47 * Bei 40 km/h sind es 30 km/h Raeumgeschwindigkeit und damit WENIGER als
48 * die 10 m/s der Knotenpunktrechnung - die Zwischenzeit faellt laenger
49 * aus als bis 5.26.0.
50 */
51 // 4 + 200/50 * 3,6 = 18,4 -> 19 s
52 expect(engstellenFolgen(200, 60).zwischenzeit).toBe(19);
53 // 4 + 200/40 * 3,6 = 22 s
54 expect(engstellenFolgen(200, 50).zwischenzeit).toBe(22);
55 // 4 + 200/30 * 3,6 = 28 s; die Knotenpunktrechnung ergab 3 + 206/10 = 24 s.
56 expect(engstellenFolgen(200, 40).zwischenzeit).toBe(28);
57 // Unterhalb der Staffel bleibt es bei der kleinsten Stufe.
58 expect(engstellenFolgen(200, 30).zwischenzeit).toBe(28);
59 });
60
61 it('nennt als Umlauf die Untergrenze mit kuerzest zulaessiger Freigabe', () => {
62 // 2 x 94 s Zwischenzeit + 2 x 5 s Mindestfreigabe = 198 s.
63 expect(engstellenFolgen(1000, 50).umlaufzeit).toBe(198);
64 expect(engstellenFolgen(400, 50).umlaufzeit).toBe(90);
65 });
66
67 it('rechnet den Umlauf bei einer brauchbaren Freigabezeit', () => {
68 // Das ist die Zahl, mit der die Obergrenze begruendet wird: 20 s Freigabe
69 // je Richtung ist der Fall, den man tatsaechlich anordnen wuerde.
70 expect(umlaufBeiFreigabe(1000, 50, 20)).toBe(228);
71 expect(umlaufBeiFreigabe(400, 50, 20)).toBe(120);
72 });
73
74 it('bleibt mit der groessten Engstelle unter der Obergrenze der Anlagenart', () => {
75 // Die Herleitung traegt nur, solange sie das tut - sonst waere die
76 // Obergrenze nicht aus den uebrigen Schranken abgeleitet, sondern
77 // gegriffen.
78 const grenzen = ANLAGENART_GRENZEN.einstreifig;
79 expect(umlaufBeiFreigabe(grenzen.maxClearingDistance, 50, 20)).toBeLessThanOrEqual(
80 grenzen.cycleTime.max,
81 );
82 });
83
84 it('warnt, sobald die Wartezeit die Schranke der Anlagenart erreicht', () => {
85 const grenzen = ANLAGENART_GRENZEN.einstreifig;
86 expect(engstellenFolgen(120, 50).stufe).toBe('hinweis');
87 const lang = engstellenFolgen(grenzen.maxClearingDistance, 50);
88 expect(lang.wartezeit).toBeGreaterThanOrEqual(grenzen.warteZeitWarnung);
89 expect(lang.stufe).not.toBe('hinweis');
90 });
91 });