import { describe, expect, it } from 'vitest'; import { parseProject } from '@/domain/model/schema'; import { mindestfreigabezeitDerGruppe } from '@/domain/plan/signalPlan'; import { RILSA_DEFAULTS } from '@/domain/rilsa/constants'; /* * Befund 3, behoben in Fassung 5.10.0. * * `blindenzusatz` war das letzte Wahrheitsmerkmal, das beim Einlesen ueber die * schweigende Fassung `bool` lief: Ein dastehender, aber unlesbarer Eintrag * ("ja", 1, "WAHR") wurde ohne eine einzige Meldung zu `false` und stand beim * naechsten Speichern so in der Datei - die Angabe war endgueltig fort. * * Fachlich ist das der schwerste der vier Faelle: Mit Zusatzeinrichtung wird * die GANZE Furt freigegeben, ohne sie nur die halbe. Bei 14 m Raeumweg sind * das 6 s statt 12 s - die Furt wird um die Haelfte zu kurz freigegeben, also * genau der Schaden, mit dem `project.ts` den Schemasprung auf 11 begruendet. */ const DATUM = new Date('2026-09-05T08:00:00Z'); /** Eine Furt mit 14 m Raeumweg; oberhalb 12 m ist der Furtbedarf massgebend. */ function furtDatei(blindenzusatz: unknown): Record { const furt: Record = { id: 'f', name: 'F1', mode: 'fuss' }; if (blindenzusatz !== undefined) furt['blindenzusatz'] = blindenzusatz; return { schemaVersion: 13, signalGroups: [{ id: 'k', name: 'K1', mode: 'kfz' }, furt], conflicts: [ { fromId: 'f', toId: 'k', clearingDistance: 14, enteringDistance: 3 }, { fromId: 'k', toId: 'f', clearingDistance: 15, enteringDistance: 5 }, ], }; } describe('Befund 3: unlesbarer Blindenzusatz beim Einlesen', () => { it('meldet einen unlesbaren Eintrag und nennt die Folge fuer die Freigabezeit', () => { const { project, issues } = parseProject(furtDatei('ja'), DATUM); const furt = project.signalGroups.find((g) => g.id === 'f')!; const meldung = issues.find((i) => i.path === 'signalGroups[1].blindenzusatz'); expect(meldung).toBeDefined(); expect(meldung!.severity).toBe('warnung'); expect(meldung!.message).toContain('Zusatzeinrichtung für Blinde und Sehbehinderte'); expect(meldung!.message).toContain('kein Wahrheitswert'); expect(meldung!.message).toContain('halben Furtlänge'); // Der Rueckfall bleibt `false` - ein erfundenes `true` waere eine Aussage // ueber die Oertlichkeit, die niemand getroffen hat. Gemeldet wird sie. expect(furt.blindenzusatz).toBe(false); expect(mindestfreigabezeitDerGruppe(project, furt, RILSA_DEFAULTS).wert).toBe(6); }); it('meldet ebenso eine Zahl und einen deutschen Wahrheitswert', () => { for (const wert of [1, 'WAHR']) { const { issues } = parseProject(furtDatei(wert), DATUM); expect(issues.filter((i) => i.path === 'signalGroups[1].blindenzusatz')).toHaveLength(1); } }); it('behandelt `null` wie ein fehlendes Feld: keine Angabe, keine Meldung', () => { const { project, issues } = parseProject(furtDatei(null), DATUM); const furt = project.signalGroups.find((g) => g.id === 'f')!; // Kein erfundenes Feld: Sonst bekaeme jede alte Datei beim Speichern eine // Angabe hinzu, die niemand gemacht hat. expect('blindenzusatz' in (furt as object)).toBe(false); expect(issues.filter((i) => i.path.startsWith('signalGroups'))).toEqual([]); }); it('laesst gesetzte Wahrheitswerte unveraendert und schweigt dazu', () => { const gesetzt = parseProject(furtDatei(true), DATUM); const furtJa = gesetzt.project.signalGroups.find((g) => g.id === 'f')!; expect(furtJa.blindenzusatz).toBe(true); expect(mindestfreigabezeitDerGruppe(gesetzt.project, furtJa, RILSA_DEFAULTS).wert).toBe(12); const alsText = parseProject(furtDatei('false'), DATUM); const furtNein = alsText.project.signalGroups.find((g) => g.id === 'f')!; expect(furtNein.blindenzusatz).toBe(false); expect(alsText.issues.filter((i) => i.path.startsWith('signalGroups'))).toEqual([]); }); });