/
test.lisp
33 lines (28 loc) · 1.07 KB
/
test.lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
; From
; http://www.gigamonkeys.com/book/practical-building-a-unit-test-framework.html
;
; I added *test-silent-pass*
(defvar *test-name* nil)
(defvar *test-silent-pass* t)
(defmacro deftest (name parameters &body body)
"Define a test function. Within a test function we can call
other test functions or use `check' to run individual test
cases."
`(defun ,name ,parameters
(let ((*test-name* (append *test-name* (list ',name))))
,@body)))
(defmacro check (&body forms)
"Run each expression in `forms' as a test case."
`(combine-results
,@(loop for f in forms collect `(report-result ,f ',f))))
(defmacro combine-results (&body forms)
"Combine the results (as booleans) of evaluating `forms' in order."
(let ((result (gensym)))
`(let ((,result t))
,@(loop for f in forms collect `(unless ,f (setf ,result nil)))
,result)))
(defun report-result (result form)
"Report the results of a single test case. Called by `check'."
(unless (and *test-silent-pass* result)
(format t "~:[FAIL~;pass~] ~a: ~a~%" result *test-name* form))
result)