[CHANGE] Nur noch EIN Test baut die HundM-Geometrie: Spec wird TEST_HUNDM05

Nach dem gruenen VF_SPEC_BAU-Lauf bauten zwei Tests dieselben 5 Ketten. Der
Spec-Pfad ist jetzt der routinemaessige Bau-Test, der Aufzeichnungs-Pfad der
abgeschaltete Regressionstest fuer das Journal-Format.

Umbenennungen:
- tests/testdata/vf_spec_hundm05.json -> tests/testdata/hundm05.json
  Die Spec ist das Eingabeformat und die Datei, in der weitere Ketten der
  Anlage nachgetragen werden. spec_ids jetzt VF_hundm05_LZ_* (wie im
  Aufzeichnungs-Protokoll), damit sich die Ergebnisse beider Laeufe paaren
  lassen.
- tests/testdata/hundm05.json -> tests/testdata/hm_recformat.json
  tests/test_hundm05.lsp -> tests/test_hm_recformat.lsp (TEST_HM_RECFORMAT,
  Praefix hmrec:, Export hm_recformat:export-results)
  tests/test_hundm05.py -> tests/test_hm_recformat.py
  In alltests.json auf "disabled": true.

Neu: tests/test_hundm05.lsp (TEST_HUNDM05) baut die Spec - OHNE eigene
Bau-Logik, es ruft vsp-bau-datei aus Lisp/vf_spec.lsp. Damit gibt es genau
einen Code-Pfad, der aus einer Spec Geometrie erzeugt; c:VF_SPEC_BAU nutzt
denselben. tests/test_hundm05.py prueft das Ergebnis (die 9 Tests, die
vorher in test_vf_spec.py standen); test_vf_spec.py ist jetzt reiner
Uebersetzer-Test ohne CAD.

Warum das Aufzeichnungsformat bleibt (Details in
doc/TODO-plan-vf-interactive.md Abschnitt 4.7):
- hm_recformat.json ist die EINZIGE eingecheckte Kopie der Originaldaten
  (data/polylines.dxf ist mit 124 MB per .gitignore ausgeschlossen). Die Spec
  ist daraus abgeleitet; ohne die Aufzeichnung faellt die rechte Seite des
  Rundlauf-Beweises weg.
- Es prueft eine ANDERE Invariante: das Journal kommt roh aus der XDATA einer
  Kundenzeichnung. TEST_HM_RECFORMAT ist damit der einzige Test dafuer, dass
  ein BESTEHENDER VF_n-Block weiter abspielbar ist - also dass
  Doppelklick-Edit und 2D/3D-Konvertierung an Altbestand funktionieren. Ein
  spec-gebautes Journal kann das nicht zeigen, es kommt aus dem Uebersetzer.
- Es dokumentiert die Frage-Reihenfolge (kommentar je Eintrag); die Spec
  verbirgt den Dialog, das ist ihr Zweck.

Weitere Anpassungen:
- Ergebnisdatei heisst nach der Spec-Datei (<basisname>_results.json), damit
  Befehl und Testrunner in dieselbe Datei schreiben. Verzeichnis: tests/output
  (Override DXFM_VF_SPEC_OUT); NICHT DXFM_RESULTS - das sind die Sivas-/
  CSV-Exporte, dort landete die Datei ausserhalb des Testbaums.
- Neu *vsp-dim-override* fuer TEST_HUNDM05_2D/_3D: wird je Kette angewandt,
  weil der Abbruch-Handler in vf-linienzug-modus *ssg-ils-dim* zurueck setzt.
- Das Anlagenkuerzel der test_id in lib/vf_journal_export.py kam aus dem
  Namen der Ziel-JSON. Nach der Umbenennung haette eine Regenerierung die ids
  stillschweigend auf VF_hm_recformat_LZ_* geaendert und die Paarung der
  beiden Laeufe zerlegt - jetzt feste Konstante TEST_ID_ANLAGE.
- conftest: hundm05_* Fixtures -> hmrec_* (die Spec-Fixtures stehen in
  tests/test_hundm05.py).

Verifiziert: 98 pytest-Tests gruen (die 9 Ergebnis-Tests warten auf einen
neuen TEST_HUNDM05-Lauf), alle .lsp lint-sauber, Spec-Regenerierung
idempotent, TEST_VF_SPEC in BricsCAD 28 PASS / 0 FAIL.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-03 11:11:12 +02:00
parent 428f1ced70
commit 5902343352
20 changed files with 3221 additions and 2953 deletions
+59 -27
View File
@@ -77,6 +77,11 @@
(if (not (boundp '*vsp-erster-dl*)) (setq *vsp-erster-dl* T))
(if (not (boundp '*vsp-wo*)) (setq *vsp-wo* "Spec"))
(if (not (boundp '*vsp-prompts*)) (setq *vsp-prompts* 0))
;; Erzwungene Bau-Dimension ("2D"/"3D") fuer einen ganzen Lauf. nil = die
;; Spec bzw. die Sitzung entscheidet. Muss JE KETTE neu gesetzt werden,
;; darum in vsp-bau-aus-spec und nicht einmal aussen: der Abbruch-Handler in
;; vf-linienzug-modus setzt *ssg-ils-dim* zurueck.
(if (not (boundp '*vsp-dim-override*)) (setq *vsp-dim-override* nil))
;; Fehler sammeln (aeltester zuerst) statt beim ersten abzubrechen: eine
;; handgeschriebene Spec hat selten genau einen Tippfehler.
@@ -684,7 +689,7 @@
;; Eine Kette aus einer Spec bauen. Rueckgabe: Ergebnis-Record (Alist).
;; Die Klammer um vf-linienzug-modus ist dieselbe wie in
;; tests/test_hundm05.lsp: *error* sichern, fangen, *error* zurueck. Weil
;; tests/test_hm_recformat.lsp: *error* sichern, fangen, *error* zurueck. Weil
;; gefangen wird, laeuft der Abbruch-Handler der Modus-Funktion NICHT - eine
;; abgebrochene Kette bleibt also als lose Geometrie liegen und ist per
;; c:VF_SEKTION_RESTORE rettbar (vfl-segment-xdata-sichern hat pro Iteration
@@ -716,7 +721,11 @@
;; Dimension je Kette neu setzen: der Abbruch-Handler in
;; vf-linienzug-modus setzt *ssg-ils-dim* zurueck, eine abgebrochene
;; Kette wuerde die folgenden sonst in der falschen Dimension bauen.
(setq dim (ssg-val kopf "dim"))
;; Vorrang: expliziter Lauf-Override (Testbefehle _2D/_3D) vor dem
;; Feld in der Spec. Ist keines gesetzt, gilt die Sitzung.
(setq dim (if (and (boundp '*vsp-dim-override*) *vsp-dim-override*)
*vsp-dim-override*
(ssg-val kopf "dim")))
(if dim (setq *ssg-ils-dim* dim))
(setq rec (vsp-set rec "dimension" (vsp-dim-text)))
(princ (strcat " -> " (itoa (length journal)) " Journal-Eintraege, "
@@ -811,7 +820,7 @@
;; TEIL 8: BEFEHL
;; ============================================================
;; Fragt nichts. Spec-Datei aus DXFM_VF_SPEC, sonst
;; tests/testdata/vf_spec_hundm05.json; Ergebnisse nach DXFM_RESULTS bzw.
;; tests/testdata/hundm05.json (die Ketten der Anlage HundM);
;; tests/output.
;; ssg-ensure gibt es nur, wenn das Menue geladen wurde (SSG_LIB.mnl). Im
@@ -831,30 +840,23 @@
"\n Ergebnis: " (itoa ok) " OK, " (itoa rest) " Fehler"
"\n================================================")))
(defun c:VF_SPEC_BAU ( / datei ziel specs records alt-dim)
;; Eine Spec-Datei bauen. Rueckgabe: Liste der Ergebnis-Records (nil, wenn
;; die Datei nicht lesbar war). Schreibt NICHTS - das entscheidet der
;; Aufrufer (der Befehl legt die Datei selbst ab, der Testrunner ueber
;; <name>:export-results). Genutzt von c:VF_SPEC_BAU UND von
;; tests/test_hundm05.lsp, damit es nur EINEN Weg gibt, der Geometrie aus
;; einer Spec erzeugt.
(defun vsp-bau-datei (datei / specs records alt-dim)
(vsp-modul-sichern "Gefaellestrecke")
(setq datei (getenv "DXFM_VF_SPEC"))
(if (or (null datei) (= datei ""))
(setq datei (strcat (getenv "DXFMAKRO")
"/tests/testdata/vf_spec_hundm05.json")))
;; Ergebnis-JSON gehoert nach tests/output - dort liegen alle
;; Testergebnisse (Konvention test_run_all.lsp, von den
;; pytest-Fixtures gelesen, per .gitignore ausgeschlossen).
;; NICHT DXFM_RESULTS: das ist das Verzeichnis der Sivas-/CSV-
;; Exporte, dort wuerde die Datei ausserhalb des Testbaums landen.
(setq ziel (getenv "DXFM_VF_SPEC_OUT"))
(if (or (null ziel) (= ziel ""))
(setq ziel (strcat (getenv "DXFMAKRO") "/tests/output")))
(setq ziel (strcat ziel "/vf_spec_results.json"))
(princ (strcat "\n================================================"
"\n VF_SPEC_BAU - " datei
"\n================================================"))
(setq specs (vsp-json-laden datei))
(if (null specs)
(princ "\n[VF_SPEC] Keine Specs gelesen - Abbruch.")
(progn
(cond
((null specs)
(princ "\n[VF_SPEC] Keine Specs gelesen - Abbruch.")
nil)
(T
(ssg-start "VF_SPEC_BAU" '(("OSMODE") ("CECOLOR") ("ATTREQ") ("ATTDIA")))
;; Ohne ATTREQ/ATTDIA 0 fragt jedes (command "_.INSERT" ...) nach
;; Attributwerten - der wahrscheinlichste Haenger im Batch.
(setvar "OSMODE" 0)
(setvar "ATTREQ" 0)
(setvar "ATTDIA" 0)
@@ -873,10 +875,40 @@
(princ (strcat "\n[VF_SPEC] FEHLER in der Spec-Schleife: "
(vl-catch-all-error-message records)))
(setq records '())))
(vl-mkdir (vl-filename-directory ziel))
(vsp-results-schreiben records ziel)
(vsp-bilanz records)
(ssg-end)))
(ssg-end)
records)))
;; Standard-Spec-Datei: DXFM_VF_SPEC, sonst die HundM-Ketten.
(defun vsp-standard-datei ( / datei)
(setq datei (getenv "DXFM_VF_SPEC"))
(if (or (null datei) (= datei ""))
(setq datei (strcat (getenv "DXFMAKRO") "/tests/testdata/hundm05.json")))
datei)
;; Ergebnis-Datei zur Spec-Datei: gleicher Basisname, Endung _results.json,
;; im Testausgabe-Verzeichnis. Damit schreibt ein Lauf mit hundm05.json nach
;; hundm05_results.json - dieselbe Datei, die der Testrunner erwartet, also
;; keine zweite Kopie derselben Ergebnisse.
;; NICHT DXFM_RESULTS als Verzeichnis: das sind die Sivas-/CSV-Exporte, dort
;; wuerde die Datei ausserhalb des Testbaums landen.
(defun vsp-ziel-datei (spec-datei / verz)
(setq verz (getenv "DXFM_VF_SPEC_OUT"))
(if (or (null verz) (= verz ""))
(setq verz (strcat (getenv "DXFMAKRO") "/tests/output")))
(strcat verz "/" (vl-filename-base spec-datei) "_results.json"))
(defun c:VF_SPEC_BAU ( / datei ziel records)
(setq datei (vsp-standard-datei))
(setq ziel (vsp-ziel-datei datei))
(princ (strcat "\n================================================"
"\n VF_SPEC_BAU - " datei
"\n================================================"))
(setq records (vsp-bau-datei datei))
(if records
(progn
(vl-mkdir (vl-filename-directory ziel))
(vsp-results-schreiben records ziel)))
(princ))
(princ "\n[vf_spec] geladen (VF_SPEC_BAU)")