summary refs log tree commit diff stats
path: root/test.lisp
diff options
context:
space:
mode:
Diffstat (limited to 'test.lisp')
-rw-r--r--test.lisp31
1 files changed, 31 insertions, 0 deletions
diff --git a/test.lisp b/test.lisp
new file mode 100644
index 0000000..5f65ccc
--- /dev/null
+++ b/test.lisp
@@ -0,0 +1,31 @@
+;(in-package :test)
+
+(defvar *test-name* nil)
+
+(defmacro with-gensyms ((&rest names) &body body)
+  `(let ,(loop for n in names collect `(,n (gensym)))
+     ,@body))
+
+(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."
+  (with-gensyms (result)
+    `(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'."
+  (format t "~:[FAIL~;pass~] ... ~a: ~a~%" result *test-name* form)
+  result)