lsa-planer

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

/ tests domain freigabezeitVorgabeAufgerundet.test.ts

3,2 KB Rohdatei
tests/domain/freigabezeitVorgabeAufgerundet.test.ts — 79 Zeilen
1 import { describe, expect, it } from 'vitest';
2 import { distributeGreenTimes } from '@/domain/rilsa/greenSplit';
3
4 /*
5 * Nachtrag zur Behebung von Befund 31 (Fassung 5.9.0).
6 *
7 * Die Freigabezeitverteilung rundet eine gebrochene Untergrenze jetzt schon vor
8 * dem Summenausgleich auf die naechste ganze Sekunde auf, statt sie hinterher
9 * anzuheben und damit die Umlaufzeit zu sprengen. Das deckt sich mit dem, was
10 * das Programm sonst tut - "Signalzeiten werden in ganzen Sekunden"
11 * (signalPlan.ts) - und ist die sichere Richtung.
12 *
13 * Es geschah aber STUMM. Wer 5,5 s als feste Freigabezeit einer Phase in einer
14 * Projektdatei stehen hat, bekam 6 s geschaltet, ohne dass es irgendwo stand:
15 * weder im Rechenweg noch im Pruefbericht. Fuer die von Hand vorgegebene
16 * Zwischenzeit macht dasselbe Programm es seit jeher richtig und meldet
17 * `zwischenzeit-vorgabe-aufgerundet`. Diese Wache verlangt dieselbe Auskunft
18 * fuer die Freigabezeit.
19 *
20 * Ueber die Oberflaeche ist der Fall nicht erreichbar - das Feld "Feste
21 * Freigabezeit" hat Schrittweite 1 -, ueber eine eingelesene Projektdatei
22 * schon.
23 */
24
25 /** Zwei Phasen; die erste traegt eine feste Freigabezeit von `vorgabe`. */
26 function zweiPhasen(vorgabe: number) {
27 return distributeGreenTimes(
28 80,
29 [
30 { id: 'p1', weight: 0.4, minGreen: vorgabe, maxGreen: vorgabe },
31 { id: 'p2', weight: 0.6, minGreen: 10, maxGreen: 60 },
32 ],
33 [5, 5],
34 );
35 }
36
37 describe('Gebrochene feste Freigabezeit aus einer Projektdatei', () => {
38 it('schaltet die naechste ganze Sekunde statt der halben', () => {
39 const ergebnis = zweiPhasen(5.5);
40 expect(ergebnis.phases[0]?.green).toBe(6);
41 // Die Summe muss weiter genau aufgehen - das war der Befund.
42 const summe = ergebnis.phases.reduce((s, p) => s + p.green, 0);
43 expect(summe).toBe(ergebnis.availableGreen);
44 });
45
46 it('sagt, dass es aufgerundet hat, und nennt beide Werte', () => {
47 const notiz = zweiPhasen(5.5).notes.find((n) => n.code === 'freigabezeit-vorgabe-aufgerundet');
48 expect(notiz, 'Das Aufrunden der Vorgabe muss im Rechenweg stehen').toBeDefined();
49 expect(notiz!.severity).toBe('hinweis');
50 // Deutsches Dezimalkomma, wie in jeder anderen Meldung der Unterlage.
51 expect(notiz!.message).toContain('5,5 s');
52 expect(notiz!.message).toContain('6 s');
53 expect(notiz!.message).not.toMatch(/\d\.\d/);
54 });
55
56 it('schweigt bei einer ganzzahligen Vorgabe - dem Regelfall', () => {
57 const notizen = zweiPhasen(6).notes.filter(
58 (n) => n.code === 'freigabezeit-vorgabe-aufgerundet',
59 );
60 expect(notizen).toHaveLength(0);
61 });
62
63 it('meldet auch die gebrochene Mindestfreigabezeit ohne feste Vorgabe', () => {
64 // Untergrenze gebrochen, Obergrenze offen: Auch hier wird aufgerundet, und
65 // auch hier muss es dastehen.
66 const ergebnis = distributeGreenTimes(
67 80,
68 [
69 { id: 'p1', weight: 0.4, minGreen: 12.5, maxGreen: 60 },
70 { id: 'p2', weight: 0.6, minGreen: 10, maxGreen: 60 },
71 ],
72 [5, 5],
73 );
74 const notiz = ergebnis.notes.find((n) => n.code === 'freigabezeit-vorgabe-aufgerundet');
75 expect(notiz, 'Auch die gebrochene Mindestfreigabezeit wird gemeldet').toBeDefined();
76 expect(notiz!.message).toContain('12,5 s');
77 expect(notiz!.message).toContain('13 s');
78 });
79 });