import { describe, expect, it } from 'vitest'; import { ASSISTENT_VORGABE, projektAusAngaben } from '@/ui/assistent'; import type { AssistentAngaben } from '@/ui/assistent'; import type { Project } from '@/domain/model/project'; /** * Befund 53: Phasenname der dreiarmigen Einmuendung. * * Die Einmuendung uebernahm die Phasenliste der Kreuzung unveraendert und hiess * damit "Phase 2 - Ost/West", obwohl die Anlage nur die Zufahrten Nord, Sued * und Ost hat. Der Name ist kein Anzeigetext, sondern ein Datum: Er geht ueber * createPhase in das Projekt, ueberlebt Speichern und Oeffnen und steht in * Phasenansicht, Signalzeitenplan und gedruckter Planunterlage. Eine Unterlage * nach Paragraph 45 StVO nennt dort einen Arm, den es nicht gibt. * * Die Benennung im selben Schalter ist armbezogen - der fuenfte Arm heisst * "Phase 3 - Nordost". Nach derselben Regel heisst die zweite Phase der * Einmuendung "Ost". */ const FESTES_DATUM = new Date('2026-01-01T00:00:00Z'); function baue(teil: Partial): Project { return projektAusAngaben({ ...ASSISTENT_VORGABE, ...teil }, 'Pruefung', FESTES_DATUM); } /** Namen der Zufahrten, die eine Phase im Namen fuehrt - Nord, Süd, Ost, West. */ function genannteArme(name: string): readonly string[] { return ['Nord', 'Süd', 'Ost', 'West'].filter((arm) => // "Nordost" darf nicht als "Nord" durchgehen. new RegExp(`(^|[^A-Za-zÄÖÜäöüß])${arm}($|[^A-Za-zÄÖÜäöüß])`).test(name), ); } describe('Phasennamen des gefuehrten Einstiegs nennen nur vorhandene Zufahrten', () => { it('nennt bei der Einmuendung keinen Westarm', () => { const projekt = baue({ form: 'einmuendung' }); expect(projekt.intersection.arms.map((a) => a.name)).toEqual(['Nord', 'Süd', 'Ost']); expect(projekt.phases.map((p) => p.name)).toEqual(['Phase 1 – Nord/Süd', 'Phase 2 – Ost']); }); it('nennt bei jeder Knotenform nur Arme, die die Anlage hat', () => { for (const form of ['kreuzung', 'einmuendung', 'fuenfarmig'] as const) { const projekt = baue({ form }); const vorhanden = new Set(projekt.intersection.arms.map((a) => a.name)); for (const phase of projekt.phases) { for (const arm of genannteArme(phase.name)) { expect(vorhanden.has(arm), `${form}: "${phase.name}" nennt "${arm}"`).toBe(true); } } } }); it('laesst Kreuzung und fuenfarmigen Knotenpunkt bei "Ost/West"', () => { // Dort gibt es einen Westarm; die Namen bleiben, wie sie waren. expect(baue({ form: 'kreuzung' }).phases.map((p) => p.name)).toEqual([ 'Phase 1 – Nord/Süd', 'Phase 2 – Ost/West', ]); expect(baue({ form: 'fuenfarmig' }).phases.map((p) => p.name)).toEqual([ 'Phase 1 – Nord/Süd', 'Phase 2 – Ost/West', 'Phase 3 – Nordost', ]); }); });