From fed941d7b186cae1d3f363cec7008c4c7a5518e7 Mon Sep 17 00:00:00 2001 From: Michael Stangl Date: Mon, 22 Jun 2026 10:42:20 +0200 Subject: [PATCH] =?UTF-8?q?Neuer=20Abschnitt=20'alltests.json=20=E2=80=94?= =?UTF-8?q?=20Testregistry'=20erklaert=20Zweck,=20Format=20und=20save-Opti?= =?UTF-8?q?onen.=20Workflow-Abschnitt=20aktualisiert:=20korrekte=20Beschre?= =?UTF-8?q?ibung=20von=20SSG=5FRUN=5FALL=5FTESTS,=20Vergleichstabelle=20vs?= =?UTF-8?q?.=20Einzeltest,=20und=20Namenskonventionen=20fuer=20LISP-Datei,?= =?UTF-8?q?=20Befehl=20und=20Export-Funktion.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/README.md | 103 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 83 insertions(+), 20 deletions(-) diff --git a/tests/README.md b/tests/README.md index f22820b..68cd40d 100644 --- a/tests/README.md +++ b/tests/README.md @@ -8,6 +8,9 @@ Die Tests folgen einer **zweistufigen Architektur**: 2. **Python-Validierung** (`.py`) — pruefen die Ergebnisse mit pytest + ezdxf ``` +tests/alltests.json + | + v BricsCAD Kommandozeile | | | SSG_RUN_ALL_TESTS | @@ -18,14 +21,14 @@ BricsCAD Kommandozeile | | | v v | tests/output/ | - kreisel_results.json | - kreisel_tests.dxf | - foerderer_results.json | - foerderer_tests.dxf | - kseinaus_results.json | - kseinaus_tests.dxf | - omniflo_results.json | - omniflo_tests.dxf | + kreisel_results.json (immer) | + kreisel_tests.dxf (save: dxf) | + foerderer_results.json (immer) | + foerderer_tests.dwg (save: dwg) | + kseinaus_results.json (immer) | + (keine Zeichnung) (save: null) | + omniflo_results.json (immer) | + omniflo_tests.dxf (save: dxf) | omniflo_export.csv | | bin\run_tests.bat --runall @@ -36,6 +39,36 @@ tests/output/ | test_omniflo.py ``` +## alltests.json — Testregistry + +Die Datei `tests/alltests.json` ist die zentrale Registry aller Test-Module. +`SSG_RUN_ALL_TESTS` liest sie beim Start — die Testliste ist **nicht** hartcodiert in `test_run_all.lsp`. + +```json +[ + { "name": "kreisel", "save": "dxf" }, + { "name": "foerderer", "save": "dwg" }, + { "name": "kseinaus", "save": null }, + { "name": "omniflo", "save": "dxf" } +] +``` + +Felder pro Eintrag: + +| Feld | Typ | Bedeutung | +| --- | --- | --- | +| `name` | String | Basisname des Testmoduls (Pflicht) | +| `save` | `"dxf"` / `"dwg"` / `null` | Ob und als welches Format die Zeichnung gespeichert wird | + +**JSON-Export laeuft immer** — unabhaengig vom `save`-Feld. Die Datei `_results.json` +wird in `tests/output/` geschrieben, sobald der Test abgeschlossen ist. + +**Wann welches `save` verwenden:** + +- `"dxf"` — wenn ein Python-Test (ezdxf) die Geometrie der Zeichnung pruefen soll +- `"dwg"` — wenn die Zeichnung zur manuellen Kontrolle oder als DWG-Referenz erhalten bleiben soll +- `null` (oder Feld weglassen) — wenn nur der JSON-Export benoetigt wird + ## Ablauf fuer den Anwender 1. **BricsCAD starten** (ueber `bin\start_briscad.bat`) und die LISP-Testrunner ausfuehren (siehe Abschnitt "LISP-Tests in BricsCAD ausfuehren"). Die Testrunner erzeugen Bloecke in der Zeichnung und speichern Ergebnisse nach `tests/output/`. @@ -96,22 +129,33 @@ Dann alle Tests auf einmal ausfuehren: SSG_RUN_ALL_TESTS ``` -Oder einen einzelnen Test: +`SSG_RUN_ALL_TESTS` liest die Testliste aus `tests/alltests.json` und fuehrt fuer jedes Modul aus: + +1. Zeichnung leeren (ERASE ALL + PURGE x5) — saubere Basis fuer jeden Test +2. `test_.lsp` laden und `TEST_` ausfuehren +3. JSON-Export aufrufen: `:export-results` — **immer**, unabhaengig von `save` +4. Zeichnung speichern — nur wenn `"save"` in `alltests.json` gesetzt ist (`"dxf"` oder `"dwg"`) +5. Bei Fehler: weiter mit naechstem Test (`vl-catch-all-apply`) + +**Einzeltest** (z.B. nur Kreisel pruefen): ```lisp -;; Einzeltest (z.B. Kreisel) +;; Test-Datei laden und Befehl ausfuehren (load (strcat (getenv "DXFMAKRO") "/tests/test_kreisel.lsp")) TEST_KREISEL -;; Ergebnisse manuell exportieren: +;; JSON-Export manuell aufrufen: (kreisel:export-results (strcat (getenv "DXFMAKRO") "/tests/output")) ``` -`SSG_RUN_ALL_TESTS` fuehrt fuer jedes Modul in `*test-module*` folgendes aus: -- Zeichnung leeren (ERASE + PURGE) -- Testdatei laden und Befehl ausfuehren -- JSON-Export aufrufen (`:export-results`) -- DXF speichern (`_tests.dxf`) -- Bei Fehler: weiter mit naechstem Test (vl-catch-all-apply) +**Unterschied SSG_RUN_ALL_TESTS vs. Einzeltest:** + +| | SSG_RUN_ALL_TESTS | Einzeltest | +| --- | --- | --- | +| Testliste | aus `alltests.json` | manuell gewaehlter Test | +| Zeichnung leeren | automatisch vor jedem Test | nein (Zeichnung bleibt) | +| JSON-Export | automatisch nach jedem Test | manuell aufrufen | +| DXF/DWG speichern | gemaess `save` in `alltests.json` | manuell (SAVEAS / DXFOUT) | +| Fehlerisolation | ja (Fehler unterbricht nicht weitere Tests) | nein | ### 2. Python-Validierung ausfuehren @@ -229,13 +273,32 @@ Fuer ein neues Modul eine neue `.lsp`-Datei erstellen nach dem Muster: ) ``` -Dann den Basisnamen in `*test-module*` (in `test_run_all.lsp`) eintragen: +Dann den Basisnamen in `tests/alltests.json` eintragen: -```lisp -(setq *test-module* '("kreisel" "foerderer" "kseinaus" "omniflo" "")) +```json +{ "name": "", "save": "dxf" } ``` +`"save"` waehlen je nach Bedarf (`"dxf"`, `"dwg"` oder `null`). +`test_run_all.lsp` leitet alle Namen aus dem `"name"`-Feld ab — **nichts** in `test_run_all.lsp` aendern. + +### Namenskonventionen (werden von test_run_all.lsp automatisch abgeleitet) + +Aus dem Basisnamen `` in `alltests.json` entstehen durch Konvention: + +| Element | Schema | Beispiel fuer `"name": "kreisel"` | +| --- | --- | --- | +| LISP-Datei | `tests/test_.lsp` | `tests/test_kreisel.lsp` | +| BricsCAD-Befehl | `TEST_` (Grossbuchstaben) | `TEST_KREISEL` | +| Export-Funktion | `:export-results` | `kreisel:export-results` | +| JSON-Ergebnis | `output/_results.json` | `output/kreisel_results.json` | +| DXF/DWG-Datei | `output/_tests.dxf/.dwg` | `output/kreisel_tests.dxf` | + +Die Export-Funktion **muss** exakt so heissen: `:export-results` (Namespace-Notation mit Doppelpunkt). +Sie nimmt genau einen Parameter entgegen: den Pfad zum Output-Verzeichnis. + Wichtig: + - `omni:load-json` erwartet ein **flaches JSON-Array** mit flachen Objekten (kein Nesting) - `omni:val` liest Werte aus den geladenen Eintraegen - Script-Funktionen (z.B. `kreisel-insert-script`) muessen **ohne User-Interaktion** funktionieren