lsa-planer

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

/ tests domain vorlageEinfahrweg.test.ts

3,6 KB Rohdatei
tests/domain/vorlageEinfahrweg.test.ts — 85 Zeilen
1 import { describe, expect, it } from 'vitest';
2 import { createStandardIntersectionProject } from '@/domain/model/factory';
3 import { buildSignalPlan, intergreenBetween } from '@/domain/plan/signalPlan';
4 import type { Project } from '@/domain/model/project';
5
6 /*
7 * Befund 40, behoben in Fassung 5.10.0.
8 *
9 * Die Vorlage "Beispielprojekt" leitete beide Wege aus EINEM Merkmal ab: aus
10 * der Verkehrsart des raeumenden Stroms. Der Einfahrweg gehoert aber zum
11 * einfahrenden Strom - `einfahrenderStrom(to, conflict)` nimmt `to.mode` und
12 * `conflict.enteringDistance`. Fuer die vier gemischten Paare stand er deshalb
13 * genau verkehrt herum: Die einfahrende Fussgaengerfurt bekam 8 m statt 6 m,
14 * das einfahrende Kraftfahrzeug 6 m statt 8 m.
15 *
16 * Der zu lange Einfahrweg verlaengert te und verkuerzt damit die Zwischenzeit -
17 * ausgerechnet in der Richtung "Kfz raeumt, Fussgaenger faehrt ein".
18 *
19 * NACHGEZOGEN MIT FASSUNG 5.43.0: Auch die 6 m waren noch zu lang. Die Vorlage
20 * legt den querenden Kfz-Strom an den Fahrbahnrand, und dort ist nach
21 * RiLSA 2015 die Einfahrzeit des Fussgaengers 0 s - der Einfahrweg der Furt ist
22 * deshalb jetzt 0 m, und K1 nach F2 ergibt 6 s statt 2 s. Die Aussage dieses
23 * Befunds bleibt: Der Einfahrweg gehoert zum einfahrenden Strom; der des
24 * einfahrenden Kraftfahrzeugs bleibt 8 m.
25 */
26 const DATUM = new Date('2026-09-05T08:00:00Z');
27
28 function beziehung(projekt: Project, von: string, nach: string) {
29 const vonId = projekt.signalGroups.find((g) => g.name === von)!.id;
30 const nachId = projekt.signalGroups.find((g) => g.name === nach)!.id;
31 return projekt.conflicts.find((c) => c.fromId === vonId && c.toId === nachId)!;
32 }
33
34 function zwischenzeit(projekt: Project, von: string, nach: string): number {
35 const vonId = projekt.signalGroups.find((g) => g.name === von)!.id;
36 const nachId = projekt.signalGroups.find((g) => g.name === nach)!.id;
37 return intergreenBetween(buildSignalPlan(projekt).intergreens, vonId, nachId);
38 }
39
40 describe('Befund 40: Einfahrweg der Vorlage gehoert zum einfahrenden Strom', () => {
41 const projekt = createStandardIntersectionProject('Beispiel', DATUM);
42
43 it('gibt der einfahrenden Furt den Einfahrweg der Furt', () => {
44 for (const [von, nach] of [
45 ['K1', 'F2'],
46 ['K3', 'F1'],
47 ] as const) {
48 const c = beziehung(projekt, von, nach);
49 // Das Kraftfahrzeug raeumt, die Furt faehrt ein - vom Fahrbahnrand aus.
50 expect(c.clearingDistance).toBe(22);
51 expect(c.enteringDistance).toBe(0);
52 }
53 });
54
55 it('gibt dem einfahrenden Kraftfahrzeug den Einfahrweg der Fahrbahn', () => {
56 for (const [von, nach] of [
57 ['F2', 'K1'],
58 ['F1', 'K3'],
59 ] as const) {
60 const c = beziehung(projekt, von, nach);
61 // Die Furt raeumt, das Kraftfahrzeug faehrt ein.
62 expect(c.clearingDistance).toBe(12);
63 expect(c.enteringDistance).toBe(8);
64 }
65 });
66
67 it('laesst die reinen Kfz-Paare unveraendert', () => {
68 const c = beziehung(projekt, 'K1', 'K3');
69 expect(c.clearingDistance).toBe(22);
70 expect(c.enteringDistance).toBe(8);
71 });
72
73 it('rechnet der einfahrenden Furt dadurch die volle Zwischenzeit zu', () => {
74 // tue 3 s (Gelbzeit 50 km/h) + tr (22 + 6) / 10,0 = 2,8 s
75 // - te 0 s (Fahrbahnrand) -> 5,8 s -> 6 s.
76 // Mit dem Einfahrweg des Kraftfahrzeugs (8 m) waeren es 0,47 s -> 1 s, mit
77 // den 6 m bis 5.42.1 1,8 s -> 2 s.
78 expect(zwischenzeit(projekt, 'K1', 'F2')).toBe(6);
79 expect(zwischenzeit(projekt, 'K3', 'F1')).toBe(6);
80
81 // Die Gegenrichtung bleibt bei 10 s: tr 12 / 1,2 = 10 s - te 8 / 11,1.
82 expect(zwischenzeit(projekt, 'F2', 'K1')).toBe(10);
83 expect(zwischenzeit(projekt, 'F1', 'K3')).toBe(10);
84 });
85 });