Files
dxfmakros/tests/test_foerderer.lsp
T

225 lines
8.2 KiB
Common Lisp

;; ============================================================
;; test_foerderer.lsp - Automatischer Integrationstest fuer VarioFoerderer
;;
;; Liest Testfaelle aus tests/testdata/foerderer_tests.json.
;; Speichert:
;; - tests/output/foerderer_results.json (Ergebnisse)
;;
;; Voraussetzungen:
;; - SSG_LIB geladen (VarioFoerderer.lsp, ssg_core.lsp)
;; - Umgebungsvariable DXFMAKRO gesetzt
;;
;; Aufruf in BricsCAD:
;; (load (strcat (getenv "DXFMAKRO") "/tests/test_foerderer.lsp"))
;; TEST_FOERDERER
;; ============================================================
;; --- Ergebnis eines Testfalls als JSON-String erzeugen ---
(defun foerderer:test-result-json (test-id richtung deltaL deltaH status
winkel L_GF L_VF /
json)
(setq json (strcat " {\n"
" \"test_id\": \"" test-id "\",\n"
" \"richtung\": \"" richtung "\",\n"
" \"deltaL\": " (rtos deltaL 2 0) ",\n"
" \"deltaH\": " (rtos deltaH 2 0) ",\n"
" \"status\": \"" status "\""))
(if winkel
(setq json (strcat json ",\n"
" \"winkel\": " (itoa winkel) ",\n"
" \"L_GF\": " (rtos L_GF 2 1) ",\n"
" \"L_VF\": " (rtos L_VF 2 1)))
)
(setq json (strcat json "\n }"))
json
)
;; --- JSON-Export der Foerderer-Testergebnisse ---
(defun foerderer:export-results (tests-out-dir / out-json f first)
(if (null *foerderer-test-results*)
(princ "\n Keine Foerderer-Ergebnisse vorhanden.")
(progn
(vl-mkdir tests-out-dir)
(setq out-json (strcat tests-out-dir "/foerderer_results.json"))
(setq f (open out-json "w"))
(if f
(progn
(write-line "[" f)
(setq first T)
(foreach r *foerderer-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_FOERDERER - Hauptbefehl
;; ============================================================
(defun c:TEST_FOERDERER ( / json-datei testdaten cfg tests
eintrag test-id richtung deltaL deltaH
ergebnis best-winkel L_GF L_VF
y-offset y-abstand idx
anz-gebaut anz-nicht-gebaut results-list
startpunkt vf-nummer hoehe-von hoehe-bis lastEnt
tests-out-dir old-dxfm-results)
;; Bibliothek initialisieren (laedt Block-Library und extrahiert Masse)
(if (not *lib-initialized*)
(init-bibliothek)
)
(ssg-start "TEST_FOERDERER" '(("OSMODE") ("CECOLOR") ("ATTREQ") ("ATTDIA")))
(setvar "OSMODE" 0)
(setvar "ATTREQ" 0)
(setvar "ATTDIA" 0)
;; Testdaten aus JSON laden
(setq json-datei
(strcat (getenv "DXFMAKRO")
"\\tests\\testdata\\foerderer_tests.json"))
(setq testdaten (ssg-load-json json-datei))
(if (null testdaten)
(progn
(alert (strcat "Testdaten nicht gefunden:\n" json-datei))
(ssg-end)
(exit)
)
)
;; Konfiguration aus erstem Eintrag (ohne test_id)
(setq cfg (car testdaten))
(setq y-abstand (ssg-val cfg "y_abstand"))
(if (or (null y-abstand) (= y-abstand 0)) (setq y-abstand 400))
;; Nur Eintraege mit test_id sind Testfaelle
(setq tests
(vl-remove-if-not
'(lambda (e) (ssg-val e "test_id"))
testdaten))
(setq y-offset 0)
(setq idx 0)
(setq results-list '())
(setq anz-gebaut 0)
(setq anz-nicht-gebaut 0)
(princ "\n")
(princ "\n================================================================")
(princ "\n TEST_FOERDERER - Variofoerderer Integrationstest")
(princ "\n================================================================")
(princ (strcat "\n Testdaten: " json-datei))
(princ (strcat "\n Testfaelle: " (itoa (length tests))))
(princ (strcat "\n Y-Abstand: " (rtos y-abstand 2 0) " mm"))
(princ "\n================================================================")
;; ==========================================================
;; Alle Testfaelle aus JSON ausfuehren
;; ==========================================================
(foreach eintrag tests
(setq test-id (ssg-val eintrag "test_id"))
(setq richtung (ssg-val eintrag "richtung"))
(setq deltaL (float (ssg-val eintrag "deltaL")))
(setq deltaH (float (ssg-val eintrag "deltaH")))
(setq idx (1+ idx))
;; Geometrisch unmoeglich: Ab mit deltaH=0
(if (and (= richtung "Ab") (< deltaH 1))
(progn
(setq anz-nicht-gebaut (1+ anz-nicht-gebaut))
(princ (strcat "\n " (itoa idx) ". " test-id " -> GEOMETRISCH_UNMOEGLICH"))
(setq results-list (cons
(foerderer:test-result-json test-id richtung deltaL deltaH
"GEOMETRISCH_UNMOEGLICH" nil nil nil)
results-list))
)
(progn
(setq ergebnis (berechne-alle-winkel deltaL deltaH richtung))
(setq best-winkel (car ergebnis))
(setq L_GF (cadr ergebnis))
(setq L_VF (caddr ergebnis))
(if (and best-winkel L_GF L_VF (> L_GF 0) (> L_VF 0))
(progn
(setq anz-gebaut (1+ anz-gebaut))
(princ (strcat "\n " (itoa idx) ". " test-id " -> GEBAUT "
(itoa best-winkel) " Grad L_GF=" (rtos L_GF 2 1)
" L_VF=" (rtos L_VF 2 1)))
(setq startpunkt (list 0 y-offset 0))
(setq vf-nummer idx)
(setq hoehe-von 0)
(setq hoehe-bis (if (= richtung "Auf") deltaH (- deltaH)))
(setq lastEnt (entlast))
(variofoerderer-einfuegen deltaL deltaH richtung best-winkel
(/ L_GF 2.0) (/ L_GF 2.0) L_VF
startpunkt "links")
(vf-block-erstellen "standard" "links" vf-nummer 0
hoehe-von hoehe-bis deltaH deltaL L_VF L_GF
richtung best-winkel startpunkt lastEnt)
(setq results-list (cons
(foerderer:test-result-json test-id richtung deltaL deltaH
"GEBAUT" best-winkel L_GF L_VF)
results-list))
)
(progn
(setq anz-nicht-gebaut (1+ anz-nicht-gebaut))
(princ (strcat "\n " (itoa idx) ". " test-id " -> NICHT_GEBAUT"))
(setq results-list (cons
(foerderer:test-result-json test-id richtung deltaL deltaH
"NICHT_GEBAUT" nil nil nil)
results-list))
)
)
)
)
(setq y-offset (- y-offset y-abstand))
)
;; ==========================================================
;; Zusammenfassung
;; ==========================================================
(princ "\n================================================================")
(princ (strcat "\n Ergebnis: " (itoa anz-gebaut) " GEBAUT, "
(itoa anz-nicht-gebaut) " NICHT_GEBAUT"))
(princ "\n================================================================")
;; Ergebnisse in globaler Variable speichern
(setq *foerderer-test-results* (reverse results-list))
;; CSV- und Sivas-Export nach tests/output/
(setq tests-out-dir (strcat (getenv "DXFMAKRO") "/tests/output"))
(vl-mkdir tests-out-dir)
(setq old-dxfm-results (getenv "DXFM_RESULTS"))
(setenv "DXFM_RESULTS" tests-out-dir)
(princ "\n================================================================")
(princ "\n[TEST_FOERDERER] CSV-Export -> foerderer_export.csv")
(csv:run-export "FOERDERER_CSV" "export_csv.py" "foerderer_export.csv")
(princ "\n[TEST_FOERDERER] Sivas-Export -> foerderer_sivas.csv")
(csv:run-export "FOERDERER_SIVAS" "export_sivas.py" "foerderer_sivas.csv")
(setenv "DXFM_RESULTS" (if old-dxfm-results old-dxfm-results ""))
(ssg-end)
(princ "\n================================================================")
(princ "\n TEST_FOERDERER abgeschlossen.")
(princ "\n================================================================")
(princ)
)