lsa-planer

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

/ tests domain sammelwegeNurLeere.test.ts

4,3 KB Rohdatei
tests/domain/sammelwegeNurLeere.test.ts — 100 Zeilen
1 import { describe, expect, it } from 'vitest';
2 import { createStandardIntersectionProject } from '@/domain/model/factory';
3 import * as actions from '@/app/actions';
4 import type { Project } from '@/domain/model/project';
5
6 /*
7 * Befund 39, behoben in Fassung 5.10.0 - "Nur Beziehungen ohne erfasste Wege
8 * aendern" ueberschrieb einen eingetragenen Einfahrweg.
9 *
10 * Das Kontrollkaestchen im Sammelfenster sagt "Nur Beziehungen ohne erfasste
11 * Wege ändern", der Kopfkommentar von `setzeAlleWege` sagt "`nurLeere` laesst
12 * bereits vermassene Beziehungen unberuehrt". Geprueft wurde aber allein
13 * `clearingDistance`. Eine Beziehung, an der nur der Einfahrweg eingetragen
14 * ist, galt damit als leer: Ihr Einfahrweg wurde mit dem Sammelwert
15 * ueberschrieben, und ihr Herkunftsnachweis fiel auf "handeingabe".
16 *
17 * Der Einfahrweg geht mit negativem Vorzeichen in die Zwischenzeit ein
18 * (tz = tue + sr/vr - se/ve). Gegenueber dem richtigen Ergebnis - dem
19 * gemessenen Einfahrweg - faellt sie damit zu kurz aus.
20 *
21 * GEGEN DEN ALTSTAND schlagen die ersten beiden Faelle fehl. Der dritte und
22 * vierte halten die Grenzen der Regel fest und bestehen auch dort.
23 */
24
25 const DATUM = new Date('2026-01-01T00:00:00Z');
26
27 /**
28 * Vorlage, deren erste Beziehung nur einen Einfahrweg traegt.
29 *
30 * Der Zustand ist regulaer herstellbar: Raeumweg und Einfahrweg sind in der
31 * Ansicht "Zwischenzeiten" zwei voneinander unabhaengige Zahlenfelder, und ein
32 * Raeumweg von 0 m wird zwar gemeldet, aber nicht erzwungen. Der Einfahrweg
33 * steht hier unmittelbar im Modell, damit der Herkunftsnachweis der Vorlage
34 * ("unbestimmt") erhalten bleibt und die Sammelbearbeitung an ihm nachweisbar
35 * wird.
36 */
37 function nurEinfahrwegErfasst(): { projekt: Project; fromId: string; toId: string } {
38 const roh = createStandardIntersectionProject('Sammelwege', DATUM);
39 const erste = roh.conflicts[0]!;
40 const projekt: Project = {
41 ...roh,
42 conflicts: roh.conflicts.map((c) =>
43 c.id === erste.id
44 ? { ...c, clearingDistance: 0, enteringDistance: 4 }
45 : { ...c, clearingDistance: 0, enteringDistance: 0 },
46 ),
47 };
48 return { projekt, fromId: erste.fromId, toId: erste.toId };
49 }
50
51 describe('Befund 39 - Sammelvorgabe der Wege nur fuer leere Beziehungen', () => {
52 it('laesst einen eingetragenen Einfahrweg stehen', () => {
53 const { projekt, fromId, toId } = nurEinfahrwegErfasst();
54
55 const gesetzt = actions.setzeAlleWege(projekt, 22, 10, true);
56
57 const beziehung = gesetzt.conflicts.find((c) => c.fromId === fromId && c.toId === toId)!;
58 expect(beziehung.enteringDistance).toBe(4);
59 // Der Raeumweg bleibt bei 0 m; dass er fehlt, meldet der Pruefbericht
60 // eigens ('konflikte.raeumweg-fehlt'), still geht das nicht durch.
61 expect(beziehung.clearingDistance).toBe(0);
62 });
63
64 it('ruehrt die uebersprungene Beziehung ueberhaupt nicht an', () => {
65 // Auch den Herkunftsnachweis nicht: Das Haekchen sagt zu, an diesen
66 // Beziehungen aendere sich nichts. `aendereKonflikt` setzt ihn auf
67 // "handeingabe", sobald ein wegrelevantes Feld beruehrt wird.
68 const { projekt, fromId, toId } = nurEinfahrwegErfasst();
69 const vorher = projekt.conflicts.find((c) => c.fromId === fromId && c.toId === toId)!;
70
71 const gesetzt = actions.setzeAlleWege(projekt, 22, 10, true);
72
73 const beziehung = gesetzt.conflicts.find((c) => c.fromId === fromId && c.toId === toId)!;
74 expect(beziehung).toEqual(vorher);
75 expect(beziehung.wegnachweis.herkunft).toBe('unbestimmt');
76 });
77
78 it('setzt die uebrigen, wirklich leeren Beziehungen', () => {
79 const { projekt, fromId, toId } = nurEinfahrwegErfasst();
80
81 const gesetzt = actions.setzeAlleWege(projekt, 22, 10, true);
82
83 const andere = gesetzt.conflicts.filter((c) => !(c.fromId === fromId && c.toId === toId));
84 expect(andere.length).toBeGreaterThan(0);
85 for (const beziehung of andere) {
86 expect(beziehung.clearingDistance).toBe(22);
87 expect(beziehung.enteringDistance).toBe(10);
88 }
89 });
90
91 it('setzt ohne das Haekchen weiterhin alle Beziehungen', () => {
92 const { projekt, fromId, toId } = nurEinfahrwegErfasst();
93
94 const gesetzt = actions.setzeAlleWege(projekt, 22, 10, false);
95
96 const beziehung = gesetzt.conflicts.find((c) => c.fromId === fromId && c.toId === toId)!;
97 expect(beziehung.enteringDistance).toBe(10);
98 expect(beziehung.clearingDistance).toBe(22);
99 });
100 });