Files
dxfmakros/tests/test_omniflo.lsp
T
m.stangl 041d292681 Omniflo-Testsuite hinzugefuegt (Python + AutoLISP)
tests/test_omniflo.py (350 Zeilen):
  Python-Tests fuer den Omniflo Bogen/Weiche Export. Testet:
  - Unit-Tests fuer build_bogen_merkmale / build_weiche_merkmale gegen
    Testdefinitionen aus omniflo_tests.json (kein BricsCAD erforderlich)
  - Merkmale-Werte gegen den JSON-Katalog (omniflo_boegen/weichen.json)
  - Korrekte Anzahl und Reihenfolge der Elemente in process_blocks()
  - CSV-Ausgabeformat (Header, Spaltenanzahl, Merkmale als JSON)
  - Integrationstest: liest eine tatsaechliche CSV aus einem BricsCAD-
    Lauf (falls DXFM_TESTOUT gesetzt und Datei vorhanden)
  Importiert direkt aus lib/export_csv.py (build_lookup, process_blocks,
  build_bogen_merkmale, build_weiche_merkmale, load_json).

tests/test_omniflo.lsp (173 Zeilen):
  AutoLISP-Tests fuer omni:insert-bogen und omni:insert-weiche.
  Prueft Block-Einfuegung, Attribut-Setzung (HOEHE, DREHUNG, ARTINR)
  und Fehlerverhalten bei ungueltigen Parametern. Laeuft direkt in
  BricsCAD via (load "tests/test_omniflo.lsp").

tests/testdata/omniflo_tests.json (114 Zeilen):
  Testdaten fuer test_omniflo.py: Definiert Testfaelle fuer Boegen
  (je Winkel: 22.5, 45, 67.5, 90, 180) und Weichen (90°, 45°, koerper,
  parallel) mit erwarteten Merkmale-Feldern und Beispiel-SivasNr.

tests/conftest.py:
  Pytest-Fixtures fuer den Testlauf: data_dir, testdata_dir,
  output_dir und omniflo_lookup (laedt Katalog-JSON falls vorhanden,
  sonst leeres Dict als Fallback).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-12 11:27:08 +02:00

174 lines
6.1 KiB
Common Lisp

;; ============================================================
;; test_omniflo.lsp - Automatischer Integrationstest fuer Omniflo
;;
;; Laedt Testfaelle aus tests/testdata/omniflo_tests.json,
;; fuegt je einen Bogen und Weiche jeden Typs in verschiedenen
;; Hoehen ein (Versatz in x-Richtung je 200mm) und exportiert
;; die CSV-Datei nach tests/output/omniflo_export.csv.
;;
;; Voraussetzungen:
;; - SSG_LIB geladen (OmniModulInsert.lsp, export.lsp)
;; - Umgebungsvariablen DXFMAKRO, DXFM_DATA gesetzt
;;
;; Aufruf in BricsCAD:
;; (load "tests/test_omniflo.lsp")
;; TEST_OMNIFLO_EXPORT
;; ============================================================
;; --- Omniflo Block non-interaktiv an gegebenem Punkt einfuegen ---
;; sivasnr-str : String der SivasNr (= Dateiname ohne .dxf)
;; insert-pt : Einfuegepunkt als Liste (x y z)
;; hoehe-str : Hoehe als String (fuer HOEHE-Attribut)
;; drehung-str : Drehung als String (fuer DREHUNG-Attribut)
(defun omni:test-insert (sivasnr-str insert-pt hoehe-str drehung-str /
dxf-pfad data-pfad blockEnt angleDeg)
(setq data-pfad (getenv "DXFM_DATA"))
(if (null data-pfad)
(progn
(princ "\n[TEST_OMNIFLO] FEHLER: DXFM_DATA nicht gesetzt!")
nil
)
(progn
(setq dxf-pfad (strcat data-pfad "/omniflo/" sivasnr-str ".dxf"))
(if (not (findfile dxf-pfad))
(progn
(princ (strcat "\n[TEST_OMNIFLO] WARNUNG: DXF nicht gefunden: " dxf-pfad))
nil
)
(progn
(setq angleDeg (if drehung-str (atof drehung-str) 0.0))
(setvar "ATTREQ" 0)
(setvar "ATTDIA" 0)
(command "_.INSERT" dxf-pfad insert-pt "" "" angleDeg)
(setq blockEnt (entlast))
(if (and blockEnt
(= (cdr (assoc 0 (entget blockEnt))) "INSERT"))
(ssg-attrib-set-on blockEnt
(list (cons "HOEHE" (if hoehe-str hoehe-str "2000"))
(cons "DREHUNG" (if drehung-str drehung-str "0"))))
)
(princ (strcat "\n[TEST_OMNIFLO] OK: " sivasnr-str
" H=" (if hoehe-str hoehe-str "2000")))
blockEnt
)
)
)
)
)
;; ============================================================
;; C:TEST_OMNIFLO_EXPORT
;;
;; Liest omniflo_tests.json, fuegt alle Testbloecke ein,
;; exportiert CSV nach tests/output/.
;; ============================================================
(defun c:TEST_OMNIFLO_EXPORT (/ tests-json-pfad testfaelle
x-pos x-schritt
idx eintrag sivasnr hoehe-str drehung-str
insert-pt anzahl-ok anzahl-fehler
tests-out-dir old-results)
(if (not *lib-initialized*)
(init-bibliothek)
)
(ssg-start "TEST_OMNIFLO_EXPORT"
'(("OSMODE") ("ATTREQ") ("ATTDIA")))
(setvar "OSMODE" 0)
(setvar "ATTREQ" 0)
(setvar "ATTDIA" 0)
;; Testdaten laden
(setq tests-json-pfad
(strcat (getenv "DXFMAKRO") "/tests/testdata/omniflo_tests.json"))
(if (not (findfile tests-json-pfad))
(progn
(princ (strcat "\n[TEST_OMNIFLO] FEHLER: Testdaten nicht gefunden: "
tests-json-pfad))
(ssg-end)
(princ)
)
(progn
(setq testfaelle (omni:load-json tests-json-pfad))
(if (null testfaelle)
(progn
(princ "\n[TEST_OMNIFLO] FEHLER: Testdaten konnten nicht geladen werden.")
(ssg-end)
(princ)
)
(progn
(princ "\n================================================================")
(princ "\n TEST_OMNIFLO_EXPORT")
(princ (strcat "\n " (itoa (length testfaelle)) " Testfaelle geladen"))
(princ "\n================================================================")
;; Alle Bloecke einfuegen
(setq x-pos 0.0)
(setq x-schritt 200.0)
(setq anzahl-ok 0)
(setq anzahl-fehler 0)
(setq idx 0)
(foreach eintrag testfaelle
(setq idx (1+ idx))
(setq sivasnr (omni:val eintrag "sivasnr"))
(setq hoehe-str (omni:val eintrag "hoehe"))
(if (null hoehe-str) (setq hoehe-str "2000"))
(if (numberp hoehe-str)
(setq hoehe-str (rtos hoehe-str 2 0))
)
(setq drehung-str (omni:val eintrag "drehung"))
(if (null drehung-str) (setq drehung-str "0"))
(if (numberp drehung-str)
(setq drehung-str (rtos drehung-str 2 1))
)
(setq insert-pt (list x-pos 0.0 (atof hoehe-str)))
(princ (strcat "\n " (itoa idx) ". "
(or (omni:val eintrag "description") sivasnr)
" -> (" (rtos x-pos 2 0) ", 0, " hoehe-str ")"))
(if (omni:test-insert sivasnr insert-pt hoehe-str drehung-str)
(setq anzahl-ok (1+ anzahl-ok))
(setq anzahl-fehler (1+ anzahl-fehler))
)
(setq x-pos (+ x-pos x-schritt))
)
;; Zusammenfassung
(princ "\n================================================================")
(princ (strcat "\n Eingefuegt: " (itoa anzahl-ok)
" OK, " (itoa anzahl-fehler) " Fehler"))
(princ "\n================================================================")
;; CSV-Export nach tests/output/
(setq tests-out-dir
(strcat (getenv "DXFMAKRO") "/tests/output"))
(vl-mkdir tests-out-dir)
(setq old-results (getenv "DXFM_RESULTS"))
(setenv "DXFM_RESULTS" tests-out-dir)
(princ "\n[TEST_OMNIFLO] Starte OMNI_EXPORT -> tests/output/omniflo_export.csv")
(c:OMNI_EXPORT)
(setenv "DXFM_RESULTS" (if old-results old-results ""))
(ssg-end)
(princ "\n================================================================")
(princ "\n TEST_OMNIFLO_EXPORT abgeschlossen.")
(princ (strcat "\n CSV: " tests-out-dir "/omniflo_export.csv"))
(princ "\n================================================================")
(princ)
)
)
)
)
)