import { describe, expect, it } from 'vitest'; import { distributeGreenTimes } from '@/domain/rilsa/greenSplit'; import { settingFields } from '@/domain/rilsa/settings'; /* * Befund 75, behoben in Fassung 5.11.0. * * Die Unterlagen sagen zu, "jeden Kennwert auf (zu listen), mit dem das * Programm rechnet". Die Hoechstfreigabezeit (Vorgabenfeld `maxGreen`, * Regelwert 120 s, Herkunft "Planungspraxis") kam darin nicht vor - das Wort * stand in keiner Unterlage. * * Sie ist aber ein rechnender Kennwert und kein blosser Anzeigewert: Sie * begrenzt jede Phase in der Freigabezeitverteilung und loest die Warnung * 'freigabezeit-rest' aus, die eine von Hand vorgegebene Freigabezeit * ueberschreiben darf. * * Gedruckt wird sie ohnehin: Das Fundstellenverzeichnis der Planunterlage * entsteht ueber `settingFieldsByQuelle`, das saemtliche Vorgabenfelder * durchlaeuft. Ein Pruefer bekam damit eine Zeile unter "Planungspraxis" * gedruckt, deren Herkunft er in den Unterlagen nicht wiederfand. * * NUR DIE HOECHSTFREIGABEZEIT: Von den fuenf Vorgabenfeldern mit der Herkunft * `praxis` sind die uebrigen vier dort belegt. Die drei * Koordinierungs-Kennwerte fehlen dort ebenfalls, gehen aber in keine Zahl ein * und sind unter "Was nicht abgebildet ist" ausdruecklich abgegrenzt. */ /** Das Vorgabenfeld, um das es geht. */ const FELD = settingFields().find((f) => f.key === 'maxGreen'); describe('Hoechstfreigabezeit - Kennwert und Selbstauskunft', () => { /* * Zuerst der Sachstand: Der Kennwert rechnet wirklich. Waere er eines Tages * nur noch eine Feldgrenze ohne Rechenwirkung, faellt dieser Fall - und die * Zeile in den Unterlagen waere zu Recht wieder verzichtbar. */ it('kappt die Freigabezeitverteilung an der Hoechstfreigabezeit', () => { // Verfuegbar sind 90 - 2 x 5 = 80 s; auf die erste Phase entfielen nach // Gewicht 24 s. Mit einer Obergrenze von 20 s sind es 20. const phasen = (obergrenze: number | undefined) => [ { id: 'p1', weight: 0.3, minGreen: 5, ...(obergrenze === undefined ? {} : { maxGreen: obergrenze }), }, { id: 'p2', weight: 0.7, minGreen: 5, maxGreen: 200 }, ]; const ohne = distributeGreenTimes(90, phasen(undefined), [5, 5]); const mit = distributeGreenTimes(90, phasen(20), [5, 5]); expect(ohne.phases.find((p) => p.id === 'p1')?.green, 'ohne Obergrenze').toBe(24); expect(mit.phases.find((p) => p.id === 'p1')?.green, 'mit Obergrenze 20 s').toBe(20); }); it('meldet die Verteilung, wenn alle Phasen an der Hoechstfreigabezeit liegen', () => { // Die Warnung darf eine von Hand vorgegebene Freigabezeit ueberschreiben - // deshalb ist die Hoechstfreigabezeit mehr als eine Feldgrenze. const ergebnis = distributeGreenTimes( 90, [ { id: 'p1', weight: 0.5, minGreen: 5, maxGreen: 20 }, { id: 'p2', weight: 0.5, minGreen: 5, maxGreen: 20 }, ], [5, 5], ); expect( ergebnis.notes.map((n) => n.code), 'Meldungen der Verteilung', ).toContain('freigabezeit-rest'); }); /* * NACHGEZOGEN (Fassung 5.12.0): Das Feld hing an der Sammelquelle * 'praxis'; es traegt jetzt die eigene Fundstelle 'praxis-hoechstfreigabezeit' * (Wache: `kennwertquellen.test.ts`). Gemessen wird hier weiter das, * worum es Befund 75 ging - die Herkunft ist Planungspraxis und kein * Regelwerk -, aber nicht mehr am Schluessel der Sammelquelle. */ it('fuehrt das Vorgabenfeld die Herkunft Planungspraxis', () => { expect(FELD, 'Vorgabenfeld maxGreen').toBeDefined(); expect(FELD!.quellenSchluessel, 'Herkunft der Hoechstfreigabezeit').toBe( 'praxis-hoechstfreigabezeit', ); expect(FELD!.quelle.kurz, 'Kurzform der Herkunft').toBe('Planungspraxis'); expect(FELD!.quelle.regelwerk, 'Regelwerk der Herkunft').not.toContain('RiLSA'); }); });