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