From: Stelian Ionescu Date: Sun, 29 Jul 2012 20:27:19 +0000 (+0200) Subject: Move most of the expansion of DEF-TEST into the function REGISTER-TEST X-Git-Url: http://repo.macrolet.net/gitweb/?p=fiveam.git;a=commitdiff_plain;h=ebf1d93971db80410bb860338eb6f79b9de68b23 Move most of the expansion of DEF-TEST into the function REGISTER-TEST That should reduce the size of FASLs containing tests --- diff --git a/src/test.lisp b/src/test.lisp index 9289c88..f9377cf 100644 --- a/src/test.lisp +++ b/src/test.lisp @@ -90,44 +90,48 @@ depending on another. FIXTURE specifies a fixture to wrap the body in. If PROFILE is T profiling information will be collected as well." - (let ((suite-form - (if suite-p - `(get-test ',suite) - (or suite '*suite*)))) - (check-type compile-at (member :run-time :definition-time)) - (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)) - (lambda-name - (format-symbol t "%~A-~A" '#:test name)) - (inner-lambda-name - (format-symbol t "%~A-~A" '#:inner-test name))) + (check-type compile-at (member :run-time :definition-time)) + (multiple-value-bind (forms decls docstring) + (parse-body body :documentation t :whole name) + (let* ((description (or docstring "")) + (body-forms (append decls forms)) + (suite-form (if suite-p + `(get-test ',suite) + (or suite '*suite*))) + (effective-body (if fixture + (destructuring-bind (name &rest args) + (ensure-list fixture) + `((with-fixture ,name ,args ,@body-forms))) + body-forms))) `(progn - (setf (get-test ',name) - (make-instance 'test-case - :name ',name - :runtime-package (find-package ,(package-name *package*)) - :test-lambda - (named-lambda ,lambda-name () - ,@ (ecase compile-at - (:run-time `((funcall - (let ((*package* (find-package ',(package-name *package*)))) - (compile ',inner-lambda-name - '(lambda () ,@effective-body)))))) - (:definition-time effective-body))) - :description ,description - :depends-on ',depends-on - :collect-profiling-info ,profile)) - (setf (gethash ',name (tests ,suite-form)) ',name) + (register-test ',name ,description ',effective-body ,suite-form ',depends-on ,compile-at ,profile) (when *run-test-when-defined* (run! ',name)) ',name)))) +(defun register-test (name description body suite depends-on compile-at profile) + (let ((lambda-name + (format-symbol t "%~A-~A" '#:test name)) + (inner-lambda-name + (format-symbol t "%~A-~A" '#:inner-test name))) + (setf (get-test name) + (make-instance 'test-case + :name name + :runtime-package (find-package (package-name *package*)) + :test-lambda + (eval + `(named-lambda ,lambda-name () + ,@(ecase compile-at + (:run-time `((funcall + (let ((*package* (find-package ',(package-name *package*)))) + (compile ',inner-lambda-name + '(lambda () ,@body)))))) + (:definition-time body)))) + :description description + :depends-on depends-on + :collect-profiling-info profile)) + (setf (gethash name (tests suite)) name))) + (defvar *run-test-when-defined* nil "When non-NIL tests are run as soon as they are defined.")