lsa-planer

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

/ tests tools winkelangabe.test.ts

4,3 KB Rohdatei
tests/tools/winkelangabe.test.ts — 100 Zeilen
1 import { describe, expect, it, vi } from 'vitest';
2 import type { WegeVorschlag } from '../../src/domain/geometrie/ableitung';
3
4 /*
5 * Punkt X.5 - "Winkel 0,0 Grad" in der Ausgabe des Pruefstueck-Werkzeugs.
6 *
7 * `winkelGrad` = 0 heisst "laengs" und nicht "null Grad": Der Konfliktbereich
8 * fuehrt den Winkel des Schnitts mit, der sein Ende bestimmt hat; stammt das
9 * Ende aus einem gemeinsamen Stueck oder gibt es gar keinen Punktschnitt,
10 * gehoert dazu kein Schnittwinkel, und `vermessung.ts` traegt 0 ein. Die
11 * Ansicht sagt dazu seit der Fassung 5.9.0 "längs" (lageplanView.ts); die
12 * Stichprobenausgabe des Werkzeugs behauptete daneben einen Schnitt unter null
13 * Grad und damit, die Linien kreuzten sich nicht.
14 *
15 * GEPRUEFT WIRD DIE ZEILE, NICHT DER BAUSTEIN: Der falsche Satz entsteht dort,
16 * wo die Zeile zusammengesetzt wird. Eine Wache allein auf einer Hilfsfunktion
17 * bliebe gruen, sobald die Zusammensetzung wieder selbst `toFixed(1)` rechnet -
18 * der erzeugte vierarmige Knotenpunkt enthaelt keine Beziehung mit
19 * `winkelGrad === 0`, ueber die Ausgabe waere der Rueckfall also nicht zu
20 * bemerken. `stichprobenzeile` ist deshalb die Stelle, die hier haengt.
21 *
22 * ERZEUGNISSE BLEIBEN UNBERUEHRT: Der Satz steht in einem `console.log` und in
23 * keiner erzeugten Datei - weder `beispiele/vierarmiger-knotenpunkt.lsap` noch
24 * `beispiele/*.svg` enthalten das Wort "Winkel". Die Beispieldateien sind
25 * deshalb nicht neu zu bauen, und `schemaVersion: 7` der Projektdatei bleibt
26 * unangetastet.
27 *
28 * WARUM `node:fs` HIER GESTELLT IST: Das Werkzeug ist ein Skript - schon sein
29 * Einbinden rechnet den Knotenpunkt durch und schreibt die beiden
30 * Beispieldateien. Ein Test darf das Erzeugnis nicht anfassen; geschrieben wird
31 * deshalb nichts. Dass die Stellung wirklich gegriffen hat, sichert der letzte
32 * Fall zu - griffe sie einmal nicht, schriebe der Testlauf das Pruefstueck mit
33 * der heutigen Schemafassung neu und zerstoerte `schemaVersion: 7` still.
34 */
35
36 const geschrieben = vi.fn();
37
38 vi.mock('node:fs', async () => {
39 const echt = await vi.importActual<typeof import('node:fs')>('node:fs');
40 return {
41 ...echt,
42 writeFileSync: (...args: readonly unknown[]): void => {
43 geschrieben(...args);
44 },
45 mkdirSync: (): undefined => undefined,
46 };
47 });
48
49 const stumm = vi.spyOn(console, 'log').mockImplementation(() => {});
50 const { stichprobenzeile } = await import('../../tools/vierarmigerKnotenpunkt');
51 stumm.mockRestore();
52
53 /** Beziehung mit den uebrigen Angaben fest, damit nur der Winkel wechselt. */
54 function beziehung(winkelGrad: number): WegeVorschlag {
55 return {
56 vonLinieId: 'arm-nord-geradeaus',
57 nachLinieId: 'arm-west-geradeaus',
58 vonName: 'Nord geradeaus',
59 nachName: 'West geradeaus',
60 raeumweg: 21.5,
61 einfahrweg: 8.25,
62 winkelGrad,
63 bestehend: null,
64 abweichung: false,
65 };
66 }
67
68 describe('X.5: Schnittwinkel in der Stichprobenausgabe', () => {
69 it('nennt den Wert 0 in der Zeile "laengs" und nicht "0.0 Grad"', () => {
70 const zeile = stichprobenzeile(beziehung(0));
71
72 expect(zeile).toContain('Winkel laengs');
73 expect(zeile).not.toContain('0.0 Grad');
74 });
75
76 it('gibt jeden echten Schnittwinkel mit einer Nachkommastelle in Grad an', () => {
77 expect(stichprobenzeile(beziehung(90))).toContain('Winkel 90.0 Grad');
78 expect(stichprobenzeile(beziehung(87.25))).toContain('Winkel 87.3 Grad');
79 });
80
81 it('nennt Namen und beide Wege der Beziehung weiter mit', () => {
82 const zeile = stichprobenzeile(beziehung(90));
83
84 expect(zeile).toContain('Nord geradeaus');
85 expect(zeile).toContain('raeumt vor');
86 expect(zeile).toContain('West geradeaus');
87 expect(zeile).toContain('Raeumweg 21.50 m');
88 expect(zeile).toContain('Einfahrweg 8.25 m');
89 });
90
91 it('hat die Schreibaufrufe des Werkzeugs abgefangen statt sie auf die Platte zu lassen', () => {
92 // Das Werkzeug schreibt beim Einbinden zwei Dateien. Diese Zusicherung
93 // belegt, dass die Stellung gegriffen hat: Beide Aufrufe sind bei der
94 // Ersatzfassung angekommen. Griffe sie einmal nicht, waere hier nichts
95 // verzeichnet - und der Testlauf haette `beispiele/*` neu geschrieben.
96 const ziele = geschrieben.mock.calls.map((aufruf) => String(aufruf[0]));
97 expect(ziele.some((ziel) => ziel.endsWith('vierarmiger-knotenpunkt.lsap'))).toBe(true);
98 expect(ziele.some((ziel) => ziel.endsWith('.svg'))).toBe(true);
99 });
100 });