Files
dxfmakros/tests/test_omniflo.lsp

231 lines
8.2 KiB
Common Lisp

;; ============================================================
;; test_omniflo.lsp - Automatischer Integrationstest fuer Omniflo
;;
;; Laedt Testfaelle aus tests/testdata/omniflo_tests.json und
;; fuegt je einen Bogen und Weiche jeden Typs in verschiedenen
;; Hoehen ein (Versatz in x-Richtung je 200mm). Ergebnisse werden
;; ueber omniflo:export-results nach tests/output/omniflo_results.json
;; geschrieben (Aufruf durch SSG_RUN_ALL_TESTS oder manuell).
;;
;; Voraussetzungen:
;; - SSG_LIB geladen (OmniModulInsert.lsp, export.lsp)
;; - Umgebungsvariablen DXFMAKRO, DXFM_DATA gesetzt
;;
;; Aufruf in BricsCAD:
;; (load "tests/test_omniflo.lsp")
;; TEST_OMNIFLO
;; ============================================================
;; --- 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 omniflo-pfad blockEnt angleDeg)
(setq omniflo-pfad (getenv "DXFM_OMNIFLO"))
(if (null omniflo-pfad)
(progn
(princ "\n[TEST_OMNIFLO] FEHLER: DXFM_OMNIFLO nicht gesetzt!")
nil
)
(progn
(setq dxf-pfad (strcat omniflo-pfad "/" 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
)
)
)
)
)
;; --- Ergebnis eines Omniflo-Testfalls als JSON-String erzeugen ---
(defun omniflo:test-result-json (test-id sivasnr description hoehe status /
json)
(setq json (strcat " {\n"
" \"test_id\": \"" test-id "\",\n"
" \"sivasnr\": \"" (if sivasnr sivasnr "") "\",\n"
" \"description\": \"" (if description description "") "\",\n"
" \"hoehe\": \"" (if hoehe hoehe "") "\",\n"
" \"status\": \"" status "\"\n"
" }"))
json
)
;; --- JSON-Export der Omniflo-Testergebnisse ---
(defun omniflo:export-results (tests-out-dir / out-json f first)
(if (null *omniflo-test-results*)
(princ "\n Keine Omniflo-Ergebnisse vorhanden.")
(progn
(vl-mkdir tests-out-dir)
(setq out-json (strcat tests-out-dir "/omniflo_results.json"))
(setq f (open out-json "w"))
(if f
(progn
(write-line "[" f)
(setq first T)
(foreach r *omniflo-test-results*
(if (not first) (write-line "," f))
(write-line r f)
(setq first nil)
)
(write-line "]" f)
(close f)
(princ (strcat "\n Ergebnisse: " out-json))
)
(princ (strcat "\n FEHLER: Kann " out-json " nicht schreiben!"))
)
)
)
)
;; ============================================================
;; C:TEST_OMNIFLO
;;
;; Liest omniflo_tests.json und fuegt alle Testbloecke ein.
;; ============================================================
(defun c:TEST_OMNIFLO (/ tests-json-pfad testfaelle
x-val y-val
idx eintrag sivasnr hoehe-str drehung-str
description insert-pt anzahl-ok anzahl-fehler
results-list)
(ssg-start "TEST_OMNIFLO"
'(("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 (ssg-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")
(princ (strcat "\n " (itoa (length testfaelle)) " Testfaelle geladen"))
(princ "\n================================================================")
;; Alle Bloecke einfuegen
(setq anzahl-ok 0)
(setq anzahl-fehler 0)
(setq results-list nil)
(setq idx 0)
(foreach eintrag testfaelle
(setq idx (1+ idx))
(setq sivasnr (ssg-val eintrag "sivasnr"))
(setq hoehe-str (ssg-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 (ssg-val eintrag "drehung"))
(if (null drehung-str) (setq drehung-str "0"))
(if (numberp drehung-str)
(setq drehung-str (rtos drehung-str 2 1))
)
(setq description (ssg-val eintrag "description"))
;; x,y-Koordinaten aus JSON lesen (wie in omniflo_uebersicht.dxf)
(setq x-val (ssg-val eintrag "x"))
(setq y-val (ssg-val eintrag "y"))
(if (null x-val) (setq x-val 0.0))
(if (null y-val) (setq y-val 0.0))
(if (not (numberp x-val)) (setq x-val (atof x-val)))
(if (not (numberp y-val)) (setq y-val (atof y-val)))
(setq insert-pt (list x-val y-val (atof hoehe-str)))
(princ (strcat "\n " (itoa idx) ". "
(if description description (if sivasnr sivasnr "?"))
" -> (" (rtos x-val 2 0) ", " (rtos y-val 2 0) ", " hoehe-str ")"))
(if (omni:test-insert sivasnr insert-pt hoehe-str drehung-str)
(progn
(setq anzahl-ok (1+ anzahl-ok))
(setq results-list (cons
(omniflo:test-result-json (strcat "OMNI_" (itoa idx))
sivasnr description hoehe-str "OK")
results-list))
;; Beschriftung ueber dem Block einfuegen
(entmake
(list
'(0 . "TEXT")
'(8 . "ANNOTATION")
(cons 10 (list x-val (+ y-val 50) 0))
'(40 . 30)
(cons 1 sivasnr)
)
)
)
(progn
(setq anzahl-fehler (1+ anzahl-fehler))
(setq results-list (cons
(omniflo:test-result-json (strcat "OMNI_" (itoa idx))
sivasnr description hoehe-str "FEHLER")
results-list))
)
)
)
;; Zusammenfassung
(princ "\n================================================================")
(princ (strcat "\n Eingefuegt: " (itoa anzahl-ok)
" OK, " (itoa anzahl-fehler) " Fehler"))
(princ "\n================================================================")
;; Ergebnisse in globaler Variable speichern
(setq *omniflo-test-results* (reverse results-list))
(ssg-end)
(princ "\n================================================================")
(princ "\n TEST_OMNIFLO abgeschlossen.")
(princ "\n================================================================")
(princ)
)
)
)
)
)