Added :compile-at parameter for test (:run-time :definition-time)
[fiveam.git] / src / test.lisp
index af7225a..b6e85db 100644 (file)
 ;;;; collection of tests and test suites.
 
 (deflookup-table test
+  :at-redefinition nil
   :documentation "Lookup table mapping test (and test suite)
   names to objects.")
 
+(defun test-names ()
+  (loop for test being the hash-keys of *test*
+        collect test))
+
 (defmacro test (name &body body)
   "Create a test named NAME. If NAME is a list it must be of the
 form:
@@ -41,8 +46,9 @@ If DEPENDS-ON is a symbol it is interpreted as `(AND
 depending on another.
 
 SUITE defaults to the current value of *SUITE*."
-  (destructuring-bind (name &key depends-on (suite nil suite-supplied-p))
+  (destructuring-bind (name &key depends-on (suite nil suite-supplied-p) (compile-at :run-time))
       (ensure-list name)
+    (declare (type (member :run-time :definition-time) compile-at))
     (let (description)
       (setf description (if (stringp (car body))
                            (pop body)
@@ -50,9 +56,13 @@ SUITE defaults to the current value of *SUITE*."
       `(progn
         (setf (get-test ',name) (make-instance 'test-case
                                                 :name ',name
+                                                :runtime-package ,*package*
                                                 :test-lambda
                                                 (lambda ()
-                                                  (funcall (compile nil '(lambda () ,@body))))
+                                                  ,@(ecase compile-at
+                                                           (:run-time `((funcall (let ((*package* ,*package*))
+                                                                                          (compile nil '(lambda () ,@body))))))
+                                                           (:definition-time body)))
                                                 :description ,description
                                                 :depends-on ',depends-on))
         ,(if suite-supplied-p