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