lsa-planer
LSA-Planer Professional – Planungssoftware für Lichtsignalanlagen nach RiLSA 2015 und § 45 StVO. EUPL-1.2.
/ tests domain sammelwegeNurLeere.test.ts
| 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 | }); |