import { describe, expect, it } from 'vitest'; import { createStandardIntersectionProject } from '@/domain/model/factory'; import { buildSignalPlan, intergreenBetween } from '@/domain/plan/signalPlan'; import type { Project } from '@/domain/model/project'; /* * Befund 40, behoben in Fassung 5.10.0. * * Die Vorlage "Beispielprojekt" leitete beide Wege aus EINEM Merkmal ab: aus * der Verkehrsart des raeumenden Stroms. Der Einfahrweg gehoert aber zum * einfahrenden Strom - `einfahrenderStrom(to, conflict)` nimmt `to.mode` und * `conflict.enteringDistance`. Fuer die vier gemischten Paare stand er deshalb * genau verkehrt herum: Die einfahrende Fussgaengerfurt bekam 8 m statt 6 m, * das einfahrende Kraftfahrzeug 6 m statt 8 m. * * Der zu lange Einfahrweg verlaengert te und verkuerzt damit die Zwischenzeit - * ausgerechnet in der Richtung "Kfz raeumt, Fussgaenger faehrt ein". * * NACHGEZOGEN MIT FASSUNG 5.43.0: Auch die 6 m waren noch zu lang. Die Vorlage * legt den querenden Kfz-Strom an den Fahrbahnrand, und dort ist nach * RiLSA 2015 die Einfahrzeit des Fussgaengers 0 s - der Einfahrweg der Furt ist * deshalb jetzt 0 m, und K1 nach F2 ergibt 6 s statt 2 s. Die Aussage dieses * Befunds bleibt: Der Einfahrweg gehoert zum einfahrenden Strom; der des * einfahrenden Kraftfahrzeugs bleibt 8 m. */ const DATUM = new Date('2026-09-05T08:00:00Z'); function beziehung(projekt: Project, von: string, nach: string) { const vonId = projekt.signalGroups.find((g) => g.name === von)!.id; const nachId = projekt.signalGroups.find((g) => g.name === nach)!.id; return projekt.conflicts.find((c) => c.fromId === vonId && c.toId === nachId)!; } function zwischenzeit(projekt: Project, von: string, nach: string): number { const vonId = projekt.signalGroups.find((g) => g.name === von)!.id; const nachId = projekt.signalGroups.find((g) => g.name === nach)!.id; return intergreenBetween(buildSignalPlan(projekt).intergreens, vonId, nachId); } describe('Befund 40: Einfahrweg der Vorlage gehoert zum einfahrenden Strom', () => { const projekt = createStandardIntersectionProject('Beispiel', DATUM); it('gibt der einfahrenden Furt den Einfahrweg der Furt', () => { for (const [von, nach] of [ ['K1', 'F2'], ['K3', 'F1'], ] as const) { const c = beziehung(projekt, von, nach); // Das Kraftfahrzeug raeumt, die Furt faehrt ein - vom Fahrbahnrand aus. expect(c.clearingDistance).toBe(22); expect(c.enteringDistance).toBe(0); } }); it('gibt dem einfahrenden Kraftfahrzeug den Einfahrweg der Fahrbahn', () => { for (const [von, nach] of [ ['F2', 'K1'], ['F1', 'K3'], ] as const) { const c = beziehung(projekt, von, nach); // Die Furt raeumt, das Kraftfahrzeug faehrt ein. expect(c.clearingDistance).toBe(12); expect(c.enteringDistance).toBe(8); } }); it('laesst die reinen Kfz-Paare unveraendert', () => { const c = beziehung(projekt, 'K1', 'K3'); expect(c.clearingDistance).toBe(22); expect(c.enteringDistance).toBe(8); }); it('rechnet der einfahrenden Furt dadurch die volle Zwischenzeit zu', () => { // tue 3 s (Gelbzeit 50 km/h) + tr (22 + 6) / 10,0 = 2,8 s // - te 0 s (Fahrbahnrand) -> 5,8 s -> 6 s. // Mit dem Einfahrweg des Kraftfahrzeugs (8 m) waeren es 0,47 s -> 1 s, mit // den 6 m bis 5.42.1 1,8 s -> 2 s. expect(zwischenzeit(projekt, 'K1', 'F2')).toBe(6); expect(zwischenzeit(projekt, 'K3', 'F1')).toBe(6); // Die Gegenrichtung bleibt bei 10 s: tr 12 / 1,2 = 10 s - te 8 / 11,1. expect(zwischenzeit(projekt, 'F2', 'K1')).toBe(10); expect(zwischenzeit(projekt, 'F1', 'K3')).toBe(10); }); });