import { describe, expect, it, vi } from 'vitest'; import type { WegeVorschlag } from '../../src/domain/geometrie/ableitung'; /* * Punkt X.5 - "Winkel 0,0 Grad" in der Ausgabe des Pruefstueck-Werkzeugs. * * `winkelGrad` = 0 heisst "laengs" und nicht "null Grad": Der Konfliktbereich * fuehrt den Winkel des Schnitts mit, der sein Ende bestimmt hat; stammt das * Ende aus einem gemeinsamen Stueck oder gibt es gar keinen Punktschnitt, * gehoert dazu kein Schnittwinkel, und `vermessung.ts` traegt 0 ein. Die * Ansicht sagt dazu seit der Fassung 5.9.0 "längs" (lageplanView.ts); die * Stichprobenausgabe des Werkzeugs behauptete daneben einen Schnitt unter null * Grad und damit, die Linien kreuzten sich nicht. * * GEPRUEFT WIRD DIE ZEILE, NICHT DER BAUSTEIN: Der falsche Satz entsteht dort, * wo die Zeile zusammengesetzt wird. Eine Wache allein auf einer Hilfsfunktion * bliebe gruen, sobald die Zusammensetzung wieder selbst `toFixed(1)` rechnet - * der erzeugte vierarmige Knotenpunkt enthaelt keine Beziehung mit * `winkelGrad === 0`, ueber die Ausgabe waere der Rueckfall also nicht zu * bemerken. `stichprobenzeile` ist deshalb die Stelle, die hier haengt. * * ERZEUGNISSE BLEIBEN UNBERUEHRT: Der Satz steht in einem `console.log` und in * keiner erzeugten Datei - weder `beispiele/vierarmiger-knotenpunkt.lsap` noch * `beispiele/*.svg` enthalten das Wort "Winkel". Die Beispieldateien sind * deshalb nicht neu zu bauen, und `schemaVersion: 7` der Projektdatei bleibt * unangetastet. * * WARUM `node:fs` HIER GESTELLT IST: Das Werkzeug ist ein Skript - schon sein * Einbinden rechnet den Knotenpunkt durch und schreibt die beiden * Beispieldateien. Ein Test darf das Erzeugnis nicht anfassen; geschrieben wird * deshalb nichts. Dass die Stellung wirklich gegriffen hat, sichert der letzte * Fall zu - griffe sie einmal nicht, schriebe der Testlauf das Pruefstueck mit * der heutigen Schemafassung neu und zerstoerte `schemaVersion: 7` still. */ const geschrieben = vi.fn(); vi.mock('node:fs', async () => { const echt = await vi.importActual('node:fs'); return { ...echt, writeFileSync: (...args: readonly unknown[]): void => { geschrieben(...args); }, mkdirSync: (): undefined => undefined, }; }); const stumm = vi.spyOn(console, 'log').mockImplementation(() => {}); const { stichprobenzeile } = await import('../../tools/vierarmigerKnotenpunkt'); stumm.mockRestore(); /** Beziehung mit den uebrigen Angaben fest, damit nur der Winkel wechselt. */ function beziehung(winkelGrad: number): WegeVorschlag { return { vonLinieId: 'arm-nord-geradeaus', nachLinieId: 'arm-west-geradeaus', vonName: 'Nord geradeaus', nachName: 'West geradeaus', raeumweg: 21.5, einfahrweg: 8.25, winkelGrad, bestehend: null, abweichung: false, }; } describe('X.5: Schnittwinkel in der Stichprobenausgabe', () => { it('nennt den Wert 0 in der Zeile "laengs" und nicht "0.0 Grad"', () => { const zeile = stichprobenzeile(beziehung(0)); expect(zeile).toContain('Winkel laengs'); expect(zeile).not.toContain('0.0 Grad'); }); it('gibt jeden echten Schnittwinkel mit einer Nachkommastelle in Grad an', () => { expect(stichprobenzeile(beziehung(90))).toContain('Winkel 90.0 Grad'); expect(stichprobenzeile(beziehung(87.25))).toContain('Winkel 87.3 Grad'); }); it('nennt Namen und beide Wege der Beziehung weiter mit', () => { const zeile = stichprobenzeile(beziehung(90)); expect(zeile).toContain('Nord geradeaus'); expect(zeile).toContain('raeumt vor'); expect(zeile).toContain('West geradeaus'); expect(zeile).toContain('Raeumweg 21.50 m'); expect(zeile).toContain('Einfahrweg 8.25 m'); }); it('hat die Schreibaufrufe des Werkzeugs abgefangen statt sie auf die Platte zu lassen', () => { // Das Werkzeug schreibt beim Einbinden zwei Dateien. Diese Zusicherung // belegt, dass die Stellung gegriffen hat: Beide Aufrufe sind bei der // Ersatzfassung angekommen. Griffe sie einmal nicht, waere hier nichts // verzeichnet - und der Testlauf haette `beispiele/*` neu geschrieben. const ziele = geschrieben.mock.calls.map((aufruf) => String(aufruf[0])); expect(ziele.some((ziel) => ziel.endsWith('vierarmiger-knotenpunkt.lsap'))).toBe(true); expect(ziele.some((ziel) => ziel.endsWith('.svg'))).toBe(true); }); });