lsa-planer

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

/ tests domain hoechstfreigabezeitKennwert.test.ts

3,8 KB Rohdatei
tests/domain/hoechstfreigabezeitKennwert.test.ts — 88 Zeilen
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 });