X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Frun.lisp;h=bc36025ff16215733719d12375bbfecf02bbb8f1;hb=aeda92bda135a87daff3b1267fb08c149df61040;hp=c070f44040c3a2a2c28046ab88e7af3d2ff3df0d;hpb=bdbb83cf3847669c0e929e4292a25e2d48fa9f81;p=fiveam.git diff --git a/src/run.lisp b/src/run.lisp index c070f44..bc36025 100644 --- a/src/run.lisp +++ b/src/run.lisp @@ -66,7 +66,7 @@ run.")) (:unknown (setf (status test) :resolving) (if (or (not (depends-on test)) - (resolve-dependencies (depends-on test))) + (eql t (resolve-dependencies (depends-on test)))) (progn (run-test-lambda test) (status test)) @@ -131,7 +131,7 @@ run.")) (add-result 'unexpected-test-failure :test-expr nil :test-case test - :reason (format nil "Unexpected Error: ~S." e) + :reason (format nil "Unexpected Error: ~S~%~A." e e) :condition e)) (run-it () (let ((result-list '())) @@ -147,7 +147,12 @@ run.")) (abort-test e) (return-from run-it result-list))))) (restart-case - (funcall (test-lambda test)) + (let ((*readtable* (copy-readtable)) + (*package* (runtime-package test))) + (if (collect-profiling-info test) + (setf (profiling-info test) + (arnesi:collect-timing (test-lambda test))) + (funcall (test-lambda test)))) (retest () :report (lambda (stream) (format stream "~@" test)) @@ -170,17 +175,27 @@ run.")) (defmethod %run ((test test-case)) (run-resolving-dependencies test)) +(defmethod %run ((tests list)) + (mapc #'%run tests)) + (defmethod %run ((suite test-suite)) (let ((suite-results '())) - (bind-run-state ((result-list '())) - (loop for test being the hash-values of (tests suite) - do (%run test) - finally (setf suite-results result-list))) - (setf (status suite) (every (lambda (res) - (typep res 'test-passed)) - suite-results)) - (with-run-state (result-list) - (setf result-list (nconc result-list suite-results))))) + (flet ((run-tests () + (loop + for test being the hash-values of (tests suite) + do (%run test)))) + (unwind-protect + (bind-run-state ((result-list '())) + (unwind-protect + (if (collect-profiling-info suite) + (setf (profiling-info suite) (collect-timing #'run-tests)) + (run-tests))) + (setf suite-results result-list + (status suite) (every (lambda (res) + (typep res 'test-passed)) + suite-results))) + (with-run-state (result-list) + (setf result-list (nconc result-list suite-results))))))) (defmethod %run ((test-name symbol)) (when-bind test (get-test test-name) @@ -203,21 +218,28 @@ run.")) detailed-text-explainer with output going to *test-dribble*" (explain (make-instance 'detailed-text-explainer) result-list *test-dribble*)) +(defun debug! (&optional (test-spec *suite*)) + "Calls (run! test-spec) but enters the debugger if any kind of error happens." + (let ((*debug-on-error* t) + (*debug-on-failure* t)) + (run! test-spec))) + (defun run (test-spec) - "Run the test specified by TEST-SPEC. + "Run the test specified by TEST-SPEC. TEST-SPEC can be either a symbol naming a test or test suite, or a testable-object object. This function changes the operations performed by the !, !! and !!! functions." - (psetf *!* (lambda () - (loop for test being the hash-keys of *test* - do (setf (status (get-test test)) :unknown)) - (bind-run-state ((result-list '())) - (%run test-spec) - result-list)) - *!!* *!* - *!!!* *!!*) - (funcall *!*)) + (psetf *!* (lambda () + (loop for test being the hash-keys of *test* + do (setf (status (get-test test)) :unknown)) + (bind-run-state ((result-list '())) + (with-simple-restart (explain "Ignore the rest of the tests and explain current results") + (%run test-spec)) + result-list)) + *!!* *!* + *!!!* *!!*) + (funcall *!*)) (defun ! () "Rerun the most recently run test and explain the results."