X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Frun.lisp;h=7ff6692fe4e060e2e32b0f94cee98d7ce5779376;hb=e3585826886c694d40d2a0f3a28ce181dd66300b;hp=b2bbf24506dbc7512fabc6dc25b210fdb97ce0d9;hpb=287c9bb8435332a4cb5f07fd4ef08c6a76c3499f;p=fiveam.git diff --git a/src/run.lisp b/src/run.lisp index b2bbf24..7ff6692 100644 --- a/src/run.lisp +++ b/src/run.lisp @@ -36,6 +36,9 @@ (defparameter *debug-on-error* nil "T if we should drop into a debugger on error, NIL otherwise.") +(defparameter *debug-on-failure* nil + "T if we should drop into a debugger on a failing check, NIL otherwise.") + (defun import-testing-symbols (package-designator) (import '(5am::is 5am::is-true 5am::is-false 5am::signals 5am::finishes) package-designator)) @@ -125,26 +128,35 @@ run.")) (with-run-state (result-list) (bind-run-state ((current-test test)) (labels ((abort-test (e) - (add-result 'unexpected-test-failure - :test-case test - :reason (format nil "Unexpected Error: ~S." e) - :condition e)) + (add-result 'unexpected-test-failure + :test-expr nil + :test-case test + :reason (format nil "Unexpected Error: ~S~%~A." e e) + :condition e)) (run-it () (let ((result-list '())) (declare (special result-list)) - (handler-bind ((error (lambda (e) - (unless *debug-on-error* + (handler-bind ((check-failure (lambda (e) + (declare (ignore e)) + (unless *debug-on-failure* + (invoke-restart + (find-restart 'ignore-failure))))) + (error (lambda (e) + (unless (or *debug-on-error* + (typep e 'check-failure)) (abort-test e) (return-from run-it result-list))))) (restart-case - (funcall (test-lambda test)) + (let ((*readtable* (copy-readtable)) + (*package* (runtime-package test))) + (funcall (test-lambda test))) (retest () :report (lambda (stream) (format stream "~@" test)) (return-from run-it (run-it))) (ignore () :report (lambda (stream) - (format stream "~@" test)) + (format stream "~@" test)) (abort-test (make-instance 'test-failure :test-case test :reason "Failure restart.")))) result-list)))) @@ -160,6 +172,9 @@ 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 '())) @@ -184,7 +199,7 @@ run.")) ;;;; ** Public entry points -(defun run! (test-spec) +(defun run! (&optional (test-spec *suite*)) "Equivalent to (explain (run TEST-SPEC))." (explain! (run test-spec))) @@ -193,6 +208,12 @@ 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.