X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Ftest.lisp;h=29e836189709a8f2f445b8f0ce86912a2741c452;hb=5c649363640c2060387ed91132791e52e2c52c11;hp=82b0c6cb7d11fe3c6c36c84c89db92395a30efc2;hpb=1454981ac5f4f7ea8fe741a8125efbf0b09497ea;p=fiveam.git diff --git a/src/test.lisp b/src/test.lisp index 82b0c6c..29e8361 100644 --- a/src/test.lisp +++ b/src/test.lisp @@ -12,14 +12,19 @@ ;;;; 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 suite named NAME. If NAME is a list it must be of the + "Create a test named NAME. If NAME is a list it must be of the form: - (name &key depends-on suite) + (name &key depends-on suite fixture compile-at profile) NAME is the symbol which names the test. @@ -40,27 +45,49 @@ If DEPENDS-ON is a symbol it is interpreted as `(AND ,depends-on), this is accomadate the common case of one test depending on another. -SUITE defaults to the current value of *SUITE*." - (destructuring-bind (name &key depends-on (suite nil suite-supplied-p)) - (ensure-list name) - (let (lambda description) - (setf description (if (stringp (car body)) - (pop body) - "") - lambda body) - `(progn - (setf (get-test ',name) - (make-instance 'test-case - :name ',name - :test-lambda (lambda () ,@lambda) - :description ,description - :depends-on ',depends-on)) - ,(if suite-supplied-p - `(setf (gethash ',name (tests (get-test ',suite))) - ',name) - `(setf (gethash ',name (tests (or *suite* (get-test 'NIL)))) - ',name)) - ',name)))) +FIXTURE specifies a fixtrue to wrap the body in. + +If PROFILE is T profiling information will be collected as well." + (let* ((tmp (gensym)) + (suite-arg (getf (cdr (ensure-list name)) :suite tmp)) + (suite-form (cond + ((eq tmp suite-arg) '*suite*) + (t `(get-test ',suite-arg))))) + (when (consp name) + (remf (cdr name) :suite)) + (destructuring-bind (name &key depends-on (compile-at :run-time) fixture profile) + (append (ensure-list name) (default-test-args suite)) + (declare (type (member :run-time :definition-time) compile-at)) + (let ((description (if (stringp (car body)) + (pop body) + "")) + (effective-body (if fixture + (destructuring-bind (name &rest args) + (ensure-list fixture) + `((with-fixture ,name ,args ,@body))) + body))) + `(progn + (setf (get-test ',name) (make-instance 'test-case + :name ',name + :runtime-package ,*package* + :test-lambda + (lambda () + ,@ (ecase compile-at + (:run-time `((funcall + (let ((*package* (find-package ',(package-name *package*)))) + (compile nil '(lambda () + ,@effective-body)))))) + (:definition-time effective-body))) + :description ,description + :depends-on ',depends-on + :collect-profiling-info ,profile)) + (setf (gethash ',name (tests ,suite-form)) ',name) + (when *run-test-when-defined* + (run! ',name)) + ',name))))) + +(defvar *run-test-when-defined* nil + "When non-NIL tests are run as soon as they are defined.") ;; Copyright (c) 2002-2003, Edward Marco Baringer ;; All rights reserved.