lsa-planer

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

/ tests domain settings.test.ts

2,8 KB Rohdatei
tests/domain/settings.test.ts — 64 Zeilen
1 import { describe, expect, it } from 'vitest';
2 import { resolveRilsaSettings, settingFields } from '@/domain/rilsa/settings';
3 import { RILSA_DEFAULTS } from '@/domain/rilsa/constants';
4
5 describe('Vorgabenverwaltung', () => {
6 it('liefert ohne Anpassungen exakt die Regelwerte', () => {
7 const { defaults, notes, deviations } = resolveRilsaSettings(undefined);
8 expect(defaults).toEqual(RILSA_DEFAULTS);
9 expect(notes).toHaveLength(0);
10 expect(deviations).toHaveLength(0);
11 });
12
13 it('uebernimmt zulaessige Anpassungen und weist sie als Abweichung aus', () => {
14 const { defaults, deviations } = resolveRilsaSettings({ saturationFlow: 1900 });
15 expect(defaults.capacity.saturationFlow).toBe(1900);
16 expect(deviations).toHaveLength(1);
17 expect(deviations[0]!.key).toBe('saturationFlow');
18 // Regelwert 2000 Kfz/h (HBS 2015; Befund B3 - hier standen 1800).
19 expect(deviations[0]!.standardValue).toBe(2000);
20 });
21
22 it('laesst sicherheitsrelevante Mindestwerte nicht unterschreiten', () => {
23 // Im Altbestand liess sich die Gelbzeit ueber das Formel-Studio auf 0 setzen.
24 const { defaults, notes } = resolveRilsaSettings({
25 yellowKfzUpTo50: 0,
26 redYellow: 0,
27 minGreenKfz: 1,
28 });
29
30 expect(defaults.yellowBySpeed[0]!.yellow).toBe(3);
31 expect(defaults.redYellow).toBe(1);
32 expect(defaults.minGreen.kfz).toBe(5);
33 expect(notes.filter((n) => n.severity === 'fehler')).toHaveLength(3);
34 });
35
36 it('begrenzt eine zu hohe Raeumgeschwindigkeit', () => {
37 const { defaults, notes } = resolveRilsaSettings({ clearingSpeedKfzStraight: 20 });
38 expect(defaults.clearingSpeed.kfzStraight).toBe(10);
39 expect(notes.some((n) => n.code.startsWith('vorgabe-ueberschritten'))).toBe(true);
40 });
41
42 it('weist ungueltige Eingaben ab, statt mit NaN weiterzurechnen', () => {
43 const { defaults, notes } = resolveRilsaSettings({ saturationFlow: Number.NaN });
44 expect(defaults.capacity.saturationFlow).toBe(RILSA_DEFAULTS.capacity.saturationFlow);
45 expect(notes.some((n) => n.code.startsWith('vorgabe-ungueltig'))).toBe(true);
46 });
47
48 it('faellt bei widerspruechlichen Umlaufzeitgrenzen auf die Regelwerte zurueck', () => {
49 const { defaults } = resolveRilsaSettings({ cycleTimeMin: 110, cycleTimeMax: 60 });
50 expect(defaults.cycleTime.min).toBe(RILSA_DEFAULTS.cycleTime.min);
51 expect(defaults.cycleTime.max).toBe(RILSA_DEFAULTS.cycleTime.max);
52 });
53
54 it('beschreibt jeden anpassbaren Kennwert fuer die Oberflaeche', () => {
55 const fields = settingFields();
56 expect(fields.length).toBeGreaterThan(30);
57 for (const field of fields) {
58 expect(field.label).not.toBe('');
59 expect(Number.isFinite(field.standard)).toBe(true);
60 expect(field.min).toBeLessThanOrEqual(field.standard);
61 expect(field.max).toBeGreaterThanOrEqual(field.standard);
62 }
63 });
64 });