import { describe, expect, it } from 'vitest'; import { validateProject } from '@/domain/validation/engine'; import { buildSignalPlan } from '@/domain/plan/signalPlan'; import { createStandardIntersectionProject } from '@/domain/model/factory'; import { REGELBREITE } from '@/domain/geometrie/vermessung'; import type { Lageplan } from '@/domain/geometrie/lageplan'; import type { Project } from '@/domain/model/project'; /* * Zwei Dokumente desselben Vorgangs duerfen sich nicht widersprechen. * * Der Pruefbericht sagte "Ob ein einzelner eingetragener Weg wirklich von hier * stammt, fuehrt das Projekt nicht mit." Der Ausdruck sagte in derselben * Planunterlage das Gegenteil: "fuehrt das Projekt je Beziehung mit; * ausgewiesen wird es in der Spalte 'Herkunft der Wege'". * * Beide Saetze stammen aus verschiedenen Zeiten: Der erste ist aelter als * Schemastand 9, mit dem Conflict.wegnachweis eingefuehrt wurde. Er blieb * stehen, weil ihn nichts festhielt. Ein Bearbeiter, der beide liest, kann * nicht entscheiden, welchem er glauben soll - und die Frage ist nicht * nebensaechlich: Es geht darum, ob die Herkunft eines sicherheitsrelevanten * Masses nachgewiesen ist. */ const STICHTAG = new Date('2026-01-01T12:00:00Z'); /** Lageplan mit einem Massstab, der zum Vermessen zu grob ist. */ function groberLageplan(meterJeBildpunkt: number): Lageplan { const bildbreite = 1000; return { arbeitsbereiche: [], signalgeber: [], bild: null, kalibrierung: { von: { x: 0, y: 0 }, bis: { x: bildbreite, y: 0 }, laengeMeter: bildbreite * meterJeBildpunkt, herkunft: 'georeferenziert', }, haltlinien: [], // Eine gezeichnete Fahrlinie bedeutet: Hier wird abgegriffen. linien: [ { id: 'lin-1', name: 'K1 geradeaus', mode: 'kfz', movement: 'geradeaus', haltlinieId: null, startT: 0, signalGroupId: null, breiteMeter: REGELBREITE.kfz, punkte: [ { x: 100, y: 100 }, { x: 400, y: 100 }, ], }, ], }; } function berichtstexte(project: Project): string { const bericht = validateProject(project, buildSignalPlan(project), STICHTAG); return bericht.findings.map((f) => `${f.title} ${f.message} ${f.suggestion}`).join('\n'); } describe('Pruefbericht und Ausdruck sagen dasselbe ueber die Wegherkunft', () => { it('behauptet im Pruefbericht nicht, die Herkunft werde nicht mitgefuehrt', () => { const roh = createStandardIntersectionProject('Wegherkunft', STICHTAG); // 2 m je Bildpunkt: eindeutig zu grob, die Regel schlaegt an. const projekt: Project = { ...roh, lageplan: groberLageplan(2) }; const text = berichtstexte(projekt); expect(text, 'die Regel zur groben Unterlage muss anschlagen').toContain( 'zum Vermessen zu grob', ); // Genau die Formulierungen, die dem Ausdruck widersprachen. expect(text).not.toContain('führt das Projekt nicht mit'); expect(text).not.toMatch(/Herkunft[^.]*nicht mit(?:geführt)?/); expect(text).not.toMatch(/stammt, führt das Projekt nicht/); }); it('verweist stattdessen auf die Spalte, die es tatsaechlich gibt', () => { const roh = createStandardIntersectionProject('Wegherkunft', STICHTAG); const projekt: Project = { ...roh, lageplan: groberLageplan(2) }; // Der Ausdruck fuehrt diese Spalte in der Rechenwegtabelle; der Bericht // soll dorthin zeigen, statt das Gegenteil zu behaupten. expect(berichtstexte(projekt)).toContain('Herkunft der Wege'); }); it('das Modell fuehrt die Herkunft je Beziehung wirklich mit', () => { // Die Grundlage der beiden Zusicherungen oben. Faellt das Feld weg, sind // sie gegenstandslos - dann muss dieser Test zuerst umfallen. const projekt = createStandardIntersectionProject('Wegherkunft', STICHTAG); expect(projekt.conflicts.length).toBeGreaterThan(0); for (const konflikt of projekt.conflicts) { expect(konflikt.wegnachweis).toBeDefined(); expect(['lageplan', 'handeingabe', 'unbestimmt']).toContain(konflikt.wegnachweis.herkunft); } }); });