lsa-planer

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

/ tests tools vergleichbareProjektdatei.test.ts

3,0 KB Rohdatei
tests/tools/vergleichbareProjektdatei.test.ts — 67 Zeilen
1 import { readFileSync } from 'node:fs';
2 import { describe, expect, it } from 'vitest';
3
4 /*
5 * Befund 68 zur Fassung 5.10.0.
6 *
7 * `.gitattributes` fuehrte `*.lsap binary` unter der Ueberschrift
8 * "Binaerdateien, die Git gar nicht anfassen darf" zwischen png, ico, pdf und
9 * exe. Projektdateien sind aber reiner UTF-8-Text: Sie entstehen in
10 * `tools/vierarmigerKnotenpunkt.ts` ueber `JSON.stringify(..., null, 2)` und
11 * werden in `tests/domain/beispielprojekt.test.ts` mit `readFileSync(..., 'utf8')`
12 * wieder eingelesen.
13 *
14 * `binary` ist die Kurzform fuer `-text -diff`; `git check-attr` lieferte fuer
15 * die Datei "diff: unset". Damit zeigen `git diff`, `git show` und `git log -p`
16 * fuer sie nur noch "Binary files ... differ", und ein Zusammenfuehren bricht in
17 * den Konflikt statt zu mischen. Betroffen war ausgerechnet die eine erzeugte
18 * Datei, deren Inhalt fachlich beurteilt werden muss - sie ist zugleich das
19 * Pruefstueck fuer den Altdatei-Pfad (schemaVersion 7 gegen Programmstand 13).
20 *
21 * Das ist genau der Zustand, den der Kopf derselben Datei vermeiden will: "ein
22 * Vergleich, den man nicht mehr lesen kann, ist als Nachweis wertlos". Das
23 * Projekt hat diese Fehlerklasse schon einmal als Befund gefuehrt und behoben
24 * (siehe tests/render/nullzeichen.test.ts).
25 *
26 * WARUM KEIN `git check-attr` IM TESTFALL: Der Zusammenhang zwischen `binary`
27 * und der unlesbaren Vergleichsausgabe ist festgelegtes Verhalten von Git und
28 * braucht keinen zweiten Nachweis. Bewacht wird die Ursache - dass eine
29 * Textdatei des Baumes im Binaerblock steht.
30 */
31
32 const ATTRIBUTE = readFileSync('.gitattributes', 'utf8');
33 const BEISPIEL = 'beispiele/vierarmiger-knotenpunkt.lsap';
34
35 /** Endungen, die `.gitattributes` als binaer fuehrt. */
36 function binaerEndungen(): string[] {
37 const gefunden: string[] = [];
38 for (const zeile of ATTRIBUTE.split('\n')) {
39 const treffer = /^\*(\.[A-Za-z0-9]+)\s+binary\s*$/.exec(zeile.trim());
40 if (treffer) gefunden.push(treffer[1]!.toLowerCase());
41 }
42 return gefunden;
43 }
44
45 describe('.gitattributes - die Projektdatei bleibt vergleichbar', () => {
46 /*
47 * Zuerst der Sachstand: Die Beispieldatei ist reiner Text. Waere sie eines
48 * Tages wirklich binaer, faellt dieser Fall - und nicht der Abgleich darunter.
49 */
50 it('ist die Beispiel-Projektdatei reiner UTF-8-Text', () => {
51 const roh = readFileSync(BEISPIEL);
52 expect(roh.includes(0), 'Nullbyte in der Projektdatei').toBe(false);
53 const text = roh.toString('utf8');
54 expect(() => JSON.parse(text) as unknown, 'Projektdatei als JSON lesbar').not.toThrow();
55 expect(text.startsWith('{'), 'Projektdatei beginnt mit einer geschweiften Klammer').toBe(true);
56 });
57
58 it('fuehrt die Endung .lsap nicht im Binaerblock', () => {
59 expect(binaerEndungen(), 'als binaer gefuehrte Endungen').not.toContain('.lsap');
60 });
61
62 it('deckt die Regel fuer alle Dateien die Projektdatei ab', () => {
63 // Ohne eigenen Eintrag greift die Sammelzeile - sie normiert auf LF und
64 // laesst den Vergleich lesbar.
65 expect(ATTRIBUTE).toMatch(/^\*\s+text=auto eol=lf\s*$/m);
66 });
67 });