import { describe, expect, it } from 'vitest'; import { createStandardIntersectionProject } from '@/domain/model/factory'; import * as actions from '@/app/actions'; import type { Project } from '@/domain/model/project'; /* * Befund 39, behoben in Fassung 5.10.0 - "Nur Beziehungen ohne erfasste Wege * aendern" ueberschrieb einen eingetragenen Einfahrweg. * * Das Kontrollkaestchen im Sammelfenster sagt "Nur Beziehungen ohne erfasste * Wege ändern", der Kopfkommentar von `setzeAlleWege` sagt "`nurLeere` laesst * bereits vermassene Beziehungen unberuehrt". Geprueft wurde aber allein * `clearingDistance`. Eine Beziehung, an der nur der Einfahrweg eingetragen * ist, galt damit als leer: Ihr Einfahrweg wurde mit dem Sammelwert * ueberschrieben, und ihr Herkunftsnachweis fiel auf "handeingabe". * * Der Einfahrweg geht mit negativem Vorzeichen in die Zwischenzeit ein * (tz = tue + sr/vr - se/ve). Gegenueber dem richtigen Ergebnis - dem * gemessenen Einfahrweg - faellt sie damit zu kurz aus. * * GEGEN DEN ALTSTAND schlagen die ersten beiden Faelle fehl. Der dritte und * vierte halten die Grenzen der Regel fest und bestehen auch dort. */ const DATUM = new Date('2026-01-01T00:00:00Z'); /** * Vorlage, deren erste Beziehung nur einen Einfahrweg traegt. * * Der Zustand ist regulaer herstellbar: Raeumweg und Einfahrweg sind in der * Ansicht "Zwischenzeiten" zwei voneinander unabhaengige Zahlenfelder, und ein * Raeumweg von 0 m wird zwar gemeldet, aber nicht erzwungen. Der Einfahrweg * steht hier unmittelbar im Modell, damit der Herkunftsnachweis der Vorlage * ("unbestimmt") erhalten bleibt und die Sammelbearbeitung an ihm nachweisbar * wird. */ function nurEinfahrwegErfasst(): { projekt: Project; fromId: string; toId: string } { const roh = createStandardIntersectionProject('Sammelwege', DATUM); const erste = roh.conflicts[0]!; const projekt: Project = { ...roh, conflicts: roh.conflicts.map((c) => c.id === erste.id ? { ...c, clearingDistance: 0, enteringDistance: 4 } : { ...c, clearingDistance: 0, enteringDistance: 0 }, ), }; return { projekt, fromId: erste.fromId, toId: erste.toId }; } describe('Befund 39 - Sammelvorgabe der Wege nur fuer leere Beziehungen', () => { it('laesst einen eingetragenen Einfahrweg stehen', () => { const { projekt, fromId, toId } = nurEinfahrwegErfasst(); const gesetzt = actions.setzeAlleWege(projekt, 22, 10, true); const beziehung = gesetzt.conflicts.find((c) => c.fromId === fromId && c.toId === toId)!; expect(beziehung.enteringDistance).toBe(4); // Der Raeumweg bleibt bei 0 m; dass er fehlt, meldet der Pruefbericht // eigens ('konflikte.raeumweg-fehlt'), still geht das nicht durch. expect(beziehung.clearingDistance).toBe(0); }); it('ruehrt die uebersprungene Beziehung ueberhaupt nicht an', () => { // Auch den Herkunftsnachweis nicht: Das Haekchen sagt zu, an diesen // Beziehungen aendere sich nichts. `aendereKonflikt` setzt ihn auf // "handeingabe", sobald ein wegrelevantes Feld beruehrt wird. const { projekt, fromId, toId } = nurEinfahrwegErfasst(); const vorher = projekt.conflicts.find((c) => c.fromId === fromId && c.toId === toId)!; const gesetzt = actions.setzeAlleWege(projekt, 22, 10, true); const beziehung = gesetzt.conflicts.find((c) => c.fromId === fromId && c.toId === toId)!; expect(beziehung).toEqual(vorher); expect(beziehung.wegnachweis.herkunft).toBe('unbestimmt'); }); it('setzt die uebrigen, wirklich leeren Beziehungen', () => { const { projekt, fromId, toId } = nurEinfahrwegErfasst(); const gesetzt = actions.setzeAlleWege(projekt, 22, 10, true); const andere = gesetzt.conflicts.filter((c) => !(c.fromId === fromId && c.toId === toId)); expect(andere.length).toBeGreaterThan(0); for (const beziehung of andere) { expect(beziehung.clearingDistance).toBe(22); expect(beziehung.enteringDistance).toBe(10); } }); it('setzt ohne das Haekchen weiterhin alle Beziehungen', () => { const { projekt, fromId, toId } = nurEinfahrwegErfasst(); const gesetzt = actions.setzeAlleWege(projekt, 22, 10, false); const beziehung = gesetzt.conflicts.find((c) => c.fromId === fromId && c.toId === toId)!; expect(beziehung.enteringDistance).toBe(10); expect(beziehung.clearingDistance).toBe(22); }); });