X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fsuite.lisp;h=8fd22182c0aaa8512f0c077293f970ed7148d819;hb=08b391a6ecfb01d739fabaedad8557c21971b197;hp=9ac85f0d287f731365885f602b7d9497ad405c01;hpb=d714f36c13cb1e81cf27fed5305bd7b0f48793ff;p=fiveam.git diff --git a/src/suite.lisp b/src/suite.lisp index 9ac85f0..8fd2218 100644 --- a/src/suite.lisp +++ b/src/suite.lisp @@ -16,7 +16,7 @@ ;;;; ** Creating Suits -(defvar *suites* (make-hash-table)) +(defvar *suites* (make-hash-table :test 'eql)) (defmacro def-suite (name &key description (in nil in-p) (fixture nil fixture-p)) "Define a new test-suite named NAME. @@ -31,11 +31,10 @@ DESCRIPTION is just a string. FIXTURE is the fixture argument (exactly like the :fixture argument to def-test) to pass to tests in this suite." `(eval-when (:compile-toplevel :load-toplevel :execute) - (setf (gethash ',name *suites*) - (make-suite ',name - ,@(when description `(:description ,description)) - ,@(when in-p `(:in ',in)) - ,@(when fixture-p `(:fixture ',fixture)))) + (make-suite ',name + ,@(when description `(:description ,description)) + ,@(when in-p `(:in ',in)) + ,@(when fixture-p `(:fixture ',fixture))) ',name)) (defmacro def-suite* (name &rest def-suite-args) @@ -43,13 +42,22 @@ def-test) to pass to tests in this suite." (def-suite ,name ,@def-suite-args) (in-suite ,name))) -(defun make-suite (name &key description ((:in parent-suite)) fixture) +(defun remove-from-suites (test-name) + (when (get-test test-name) + ;; if this suite alruady exists, and its :IN some other suite, remove it. + (dolist (s (list-all-suites)) + (when (gethash test-name (tests s)) + (remhash test-name (tests s)))))) + +(defun make-suite (name &key description ((:in parent-suite) *suite*) fixture) "Create a new test suite object. Overrides any existing suite named NAME." + (remove-from-suites name) (let ((suite (make-instance 'test-suite :name name :fixture fixture))) (when description (setf (description suite) description)) + (setf (gethash name *suites*) suite) (loop for i in (ensure-list parent-suite) for in-suite = (get-test i) do (progn @@ -67,8 +75,7 @@ Overrides any existing suite named NAME." ;;;; ** Managing the Current Suite -(defvar *suite* (setf (get-test 'NIL) - (make-suite 'NIL :description "Default global suite")) +(defvar *suite* (setf (get-test 'T) (make-suite 'T :description "Default global suite" :in nil)) "The current test suite object") (defmacro in-suite (suite-name) @@ -80,11 +87,13 @@ See also: DEF-SUITE *SUITE*" `(eval-when (:compile-toplevel :load-toplevel :execute) (%in-suite ,suite-name))) -(defmacro in-suite* (suite-name &key in) +(defmacro in-suite* (suite-name &key (in nil in-p)) "Just like in-suite, but silently creates missing suites." - `(%in-suite ,suite-name :in ,in :fail-on-error nil)) + `(%in-suite ,suite-name + ,@(when in-p `(:in ,in)) + :fail-on-error nil)) -(defmacro %in-suite (suite-name &key (fail-on-error t) in) +(defmacro %in-suite (suite-name &key (fail-on-error t) (in nil in-p)) (with-gensyms (suite) `(progn (if-let (,suite (get-test ',suite-name)) @@ -93,7 +102,7 @@ See also: DEF-SUITE *SUITE*" (when ,fail-on-error (cerror "Create a new suite named ~A." "Unknown suite ~A." ',suite-name)) - (setf (get-test ',suite-name) (make-suite ',suite-name :in ',in) + (setf (get-test ',suite-name) (make-suite ',suite-name ,@(when in-p `(:in ',in))) *suite* (get-test ',suite-name)))) ',suite-name)))