lsa-planer

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

/ tests domain blindenzusatz.test.ts

3,8 KB Rohdatei
tests/domain/blindenzusatz.test.ts — 81 Zeilen
1 import { describe, expect, it } from 'vitest';
2 import { parseProject } from '@/domain/model/schema';
3 import { mindestfreigabezeitDerGruppe } from '@/domain/plan/signalPlan';
4 import { RILSA_DEFAULTS } from '@/domain/rilsa/constants';
5
6 /*
7 * Befund 3, behoben in Fassung 5.10.0.
8 *
9 * `blindenzusatz` war das letzte Wahrheitsmerkmal, das beim Einlesen ueber die
10 * schweigende Fassung `bool` lief: Ein dastehender, aber unlesbarer Eintrag
11 * ("ja", 1, "WAHR") wurde ohne eine einzige Meldung zu `false` und stand beim
12 * naechsten Speichern so in der Datei - die Angabe war endgueltig fort.
13 *
14 * Fachlich ist das der schwerste der vier Faelle: Mit Zusatzeinrichtung wird
15 * die GANZE Furt freigegeben, ohne sie nur die halbe. Bei 14 m Raeumweg sind
16 * das 6 s statt 12 s - die Furt wird um die Haelfte zu kurz freigegeben, also
17 * genau der Schaden, mit dem `project.ts` den Schemasprung auf 11 begruendet.
18 */
19 const DATUM = new Date('2026-09-05T08:00:00Z');
20
21 /** Eine Furt mit 14 m Raeumweg; oberhalb 12 m ist der Furtbedarf massgebend. */
22 function furtDatei(blindenzusatz: unknown): Record<string, unknown> {
23 const furt: Record<string, unknown> = { id: 'f', name: 'F1', mode: 'fuss' };
24 if (blindenzusatz !== undefined) furt['blindenzusatz'] = blindenzusatz;
25 return {
26 schemaVersion: 13,
27 signalGroups: [{ id: 'k', name: 'K1', mode: 'kfz' }, furt],
28 conflicts: [
29 { fromId: 'f', toId: 'k', clearingDistance: 14, enteringDistance: 3 },
30 { fromId: 'k', toId: 'f', clearingDistance: 15, enteringDistance: 5 },
31 ],
32 };
33 }
34
35 describe('Befund 3: unlesbarer Blindenzusatz beim Einlesen', () => {
36 it('meldet einen unlesbaren Eintrag und nennt die Folge fuer die Freigabezeit', () => {
37 const { project, issues } = parseProject(furtDatei('ja'), DATUM);
38 const furt = project.signalGroups.find((g) => g.id === 'f')!;
39
40 const meldung = issues.find((i) => i.path === 'signalGroups[1].blindenzusatz');
41 expect(meldung).toBeDefined();
42 expect(meldung!.severity).toBe('warnung');
43 expect(meldung!.message).toContain('Zusatzeinrichtung für Blinde und Sehbehinderte');
44 expect(meldung!.message).toContain('kein Wahrheitswert');
45 expect(meldung!.message).toContain('halben Furtlänge');
46
47 // Der Rueckfall bleibt `false` - ein erfundenes `true` waere eine Aussage
48 // ueber die Oertlichkeit, die niemand getroffen hat. Gemeldet wird sie.
49 expect(furt.blindenzusatz).toBe(false);
50 expect(mindestfreigabezeitDerGruppe(project, furt, RILSA_DEFAULTS).wert).toBe(6);
51 });
52
53 it('meldet ebenso eine Zahl und einen deutschen Wahrheitswert', () => {
54 for (const wert of [1, 'WAHR']) {
55 const { issues } = parseProject(furtDatei(wert), DATUM);
56 expect(issues.filter((i) => i.path === 'signalGroups[1].blindenzusatz')).toHaveLength(1);
57 }
58 });
59
60 it('behandelt `null` wie ein fehlendes Feld: keine Angabe, keine Meldung', () => {
61 const { project, issues } = parseProject(furtDatei(null), DATUM);
62 const furt = project.signalGroups.find((g) => g.id === 'f')!;
63
64 // Kein erfundenes Feld: Sonst bekaeme jede alte Datei beim Speichern eine
65 // Angabe hinzu, die niemand gemacht hat.
66 expect('blindenzusatz' in (furt as object)).toBe(false);
67 expect(issues.filter((i) => i.path.startsWith('signalGroups'))).toEqual([]);
68 });
69
70 it('laesst gesetzte Wahrheitswerte unveraendert und schweigt dazu', () => {
71 const gesetzt = parseProject(furtDatei(true), DATUM);
72 const furtJa = gesetzt.project.signalGroups.find((g) => g.id === 'f')!;
73 expect(furtJa.blindenzusatz).toBe(true);
74 expect(mindestfreigabezeitDerGruppe(gesetzt.project, furtJa, RILSA_DEFAULTS).wert).toBe(12);
75
76 const alsText = parseProject(furtDatei('false'), DATUM);
77 const furtNein = alsText.project.signalGroups.find((g) => g.id === 'f')!;
78 expect(furtNein.blindenzusatz).toBe(false);
79 expect(alsText.issues.filter((i) => i.path.startsWith('signalGroups'))).toEqual([]);
80 });
81 });