lsa-planer
LSA-Planer Professional – Planungssoftware für Lichtsignalanlagen nach RiLSA 2015 und § 45 StVO. EUPL-1.2.
/ tests domain hoechstfreigabezeitKennwert.test.ts
| 1 | import { describe, expect, it } from 'vitest'; |
| 2 | import { distributeGreenTimes } from '@/domain/rilsa/greenSplit'; |
| 3 | import { settingFields } from '@/domain/rilsa/settings'; |
| 4 | |
| 5 | /* |
| 6 | * Befund 75, behoben in Fassung 5.11.0. |
| 7 | * |
| 8 | * Die Unterlagen sagen zu, "jeden Kennwert auf (zu listen), mit dem das |
| 9 | * Programm rechnet". Die Hoechstfreigabezeit (Vorgabenfeld `maxGreen`, |
| 10 | * Regelwert 120 s, Herkunft "Planungspraxis") kam darin nicht vor - das Wort |
| 11 | * stand in keiner Unterlage. |
| 12 | * |
| 13 | * Sie ist aber ein rechnender Kennwert und kein blosser Anzeigewert: Sie |
| 14 | * begrenzt jede Phase in der Freigabezeitverteilung und loest die Warnung |
| 15 | * 'freigabezeit-rest' aus, die eine von Hand vorgegebene Freigabezeit |
| 16 | * ueberschreiben darf. |
| 17 | * |
| 18 | * Gedruckt wird sie ohnehin: Das Fundstellenverzeichnis der Planunterlage |
| 19 | * entsteht ueber `settingFieldsByQuelle`, das saemtliche Vorgabenfelder |
| 20 | * durchlaeuft. Ein Pruefer bekam damit eine Zeile unter "Planungspraxis" |
| 21 | * gedruckt, deren Herkunft er in den Unterlagen nicht wiederfand. |
| 22 | * |
| 23 | * NUR DIE HOECHSTFREIGABEZEIT: Von den fuenf Vorgabenfeldern mit der Herkunft |
| 24 | * `praxis` sind die uebrigen vier dort belegt. Die drei |
| 25 | * Koordinierungs-Kennwerte fehlen dort ebenfalls, gehen aber in keine Zahl ein |
| 26 | * und sind unter "Was nicht abgebildet ist" ausdruecklich abgegrenzt. |
| 27 | */ |
| 28 | |
| 29 | /** Das Vorgabenfeld, um das es geht. */ |
| 30 | const FELD = settingFields().find((f) => f.key === 'maxGreen'); |
| 31 | |
| 32 | describe('Hoechstfreigabezeit - Kennwert und Selbstauskunft', () => { |
| 33 | /* |
| 34 | * Zuerst der Sachstand: Der Kennwert rechnet wirklich. Waere er eines Tages |
| 35 | * nur noch eine Feldgrenze ohne Rechenwirkung, faellt dieser Fall - und die |
| 36 | * Zeile in den Unterlagen waere zu Recht wieder verzichtbar. |
| 37 | */ |
| 38 | it('kappt die Freigabezeitverteilung an der Hoechstfreigabezeit', () => { |
| 39 | // Verfuegbar sind 90 - 2 x 5 = 80 s; auf die erste Phase entfielen nach |
| 40 | // Gewicht 24 s. Mit einer Obergrenze von 20 s sind es 20. |
| 41 | const phasen = (obergrenze: number | undefined) => [ |
| 42 | { |
| 43 | id: 'p1', |
| 44 | weight: 0.3, |
| 45 | minGreen: 5, |
| 46 | ...(obergrenze === undefined ? {} : { maxGreen: obergrenze }), |
| 47 | }, |
| 48 | { id: 'p2', weight: 0.7, minGreen: 5, maxGreen: 200 }, |
| 49 | ]; |
| 50 | const ohne = distributeGreenTimes(90, phasen(undefined), [5, 5]); |
| 51 | const mit = distributeGreenTimes(90, phasen(20), [5, 5]); |
| 52 | expect(ohne.phases.find((p) => p.id === 'p1')?.green, 'ohne Obergrenze').toBe(24); |
| 53 | expect(mit.phases.find((p) => p.id === 'p1')?.green, 'mit Obergrenze 20 s').toBe(20); |
| 54 | }); |
| 55 | |
| 56 | it('meldet die Verteilung, wenn alle Phasen an der Hoechstfreigabezeit liegen', () => { |
| 57 | // Die Warnung darf eine von Hand vorgegebene Freigabezeit ueberschreiben - |
| 58 | // deshalb ist die Hoechstfreigabezeit mehr als eine Feldgrenze. |
| 59 | const ergebnis = distributeGreenTimes( |
| 60 | 90, |
| 61 | [ |
| 62 | { id: 'p1', weight: 0.5, minGreen: 5, maxGreen: 20 }, |
| 63 | { id: 'p2', weight: 0.5, minGreen: 5, maxGreen: 20 }, |
| 64 | ], |
| 65 | [5, 5], |
| 66 | ); |
| 67 | expect( |
| 68 | ergebnis.notes.map((n) => n.code), |
| 69 | 'Meldungen der Verteilung', |
| 70 | ).toContain('freigabezeit-rest'); |
| 71 | }); |
| 72 | |
| 73 | /* |
| 74 | * NACHGEZOGEN (Fassung 5.12.0): Das Feld hing an der Sammelquelle |
| 75 | * 'praxis'; es traegt jetzt die eigene Fundstelle 'praxis-hoechstfreigabezeit' |
| 76 | * (Wache: `kennwertquellen.test.ts`). Gemessen wird hier weiter das, |
| 77 | * worum es Befund 75 ging - die Herkunft ist Planungspraxis und kein |
| 78 | * Regelwerk -, aber nicht mehr am Schluessel der Sammelquelle. |
| 79 | */ |
| 80 | it('fuehrt das Vorgabenfeld die Herkunft Planungspraxis', () => { |
| 81 | expect(FELD, 'Vorgabenfeld maxGreen').toBeDefined(); |
| 82 | expect(FELD!.quellenSchluessel, 'Herkunft der Hoechstfreigabezeit').toBe( |
| 83 | 'praxis-hoechstfreigabezeit', |
| 84 | ); |
| 85 | expect(FELD!.quelle.kurz, 'Kurzform der Herkunft').toBe('Planungspraxis'); |
| 86 | expect(FELD!.quelle.regelwerk, 'Regelwerk der Herkunft').not.toContain('RiLSA'); |
| 87 | }); |
| 88 | }); |