2010-m1s1-compilation/test-unitaire.lisp

61 lines
2.2 KiB
Common Lisp
Executable File

;; TODO : exploser tout ça en plein de petites fonctions, c'est trop gros...
;; Mutation cons.
(let ((tests nil))
(defmacro deftest (module test expected)
(if (not (assoc module tests))
(setf tests (cons `(,module . (() . ())) tests)))
(let ((mod-tests (assoc module tests)))
(setf (cddr mod-tests)
(cons (cons test expected)
(cddr mod-tests))))
nil)
(defmacro run-test (&rest modules)
(let ((failures 0)
(modules (if (eq T (car modules))
(mapcar #'car tests)
modules)))
(if (every
(lambda (mod)
(if (member (car mod) modules)
(progn
(format t "~&Module ~w :~&" (car mod))
(let ((vars (cadr mod)))
(mapcar (lambda (test)
(let* ((res (eval `(let ,vars ,(car test))))
(expect (eval `(let ,vars ,(cdr test)))))
(if (equal expect res)
(format t "~& [SUCCESS] ~w~&" (car test))
(progn (format t " [FAILURE] Test : ~w~& got : ~w~& expected : ~w~&" (car test) res expect)
(setf failures (+ failures 1))))))
(reverse (cddr mod))))))
(if (not (= failures 0))
(format t "Module ~w failed ~w tests. Stopping.~&" (car mod) failures))
(= failures 0))
tests)
(progn (format t "All modules passed all tests successfully.~&")
t)
nil)))
(defun show-test ()
tests)
(defmacro deftestvar (module nom valeur)
(if (not (assoc module tests))
(setf tests (cons `(,module . (() . ())) tests)))
(let ((mod-vars (assoc module tests)))
(setf (cadr mod-vars)
(cons (list nom valeur)
(cadr mod-vars))))
nil))
;; Test de debugage du test unitaire
;(deftest environnement nil nil)
;(deftest environnement (eq 42 42) T) ;; Test qui fail
;(deftest vm T T)
;(deftest environnement2 (eq 42 42) nil)
;(show-test)
;(run-test environnement)
;; TODO : every ne mappe pas la liste dans le bon ordre, et vm est
;; exécuté avant environnement quel que soit l'ordre des paramètres.
;(run-test environnement vm)
;(run-test environnement vm environnement2)
;(run-test t) ;; t => tous