X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Frun.lisp;h=58877e05b75bad19e48dcc49a936e6eada64af77;hb=4f250825a6c2a0686666277ab394c31984f62e0c;hp=af9e8a5126f5897eff73e6d35e70f88dee3dfbb9;hpb=585f4cd1ed1626cfe96fadeae64cb04f4e6e2dd0;p=fiveam.git diff --git a/src/run.lisp b/src/run.lisp index af9e8a5..58877e0 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)) @@ -104,19 +107,6 @@ run.")) (and (satisfies-depends-p #'every)) (or (satisfies-depends-p #'some)) (not (satisfies-depends-p #'notany)))))) - -(defun handle-unexpected-error (test error) - "Handler for unexpected conditions raised during test - execution." - (when (not *debug-on-error*) - (format *test-dribble* "F") - (with-run-state (result-list) - (push (make-instance 'unexpected-test-failure - :test-case test - :reason (format nil "Unexpected Error: ~S." error) - :condition test) - result-list) - (throw 'run-block result-list)))) (defun results-status (result-list) "Given a list of test results (generated while running a test) @@ -136,23 +126,42 @@ run.")) (defmethod run-test-lambda ((test test-case)) (with-run-state (result-list) - (catch 'run-block - (bind-run-state ((current-test test)) - (handler-bind ((error (lambda (e) (handle-unexpected-error test e)))) - (restart-case - (let ((results (return-result-list (test-lambda test)))) - (setf (status test) (results-status results) - result-list (nconc result-list results))) - (retest () - :report (lambda (stream) - (format stream "~@" test)) - (%run test)) - (ignore () - :report (lambda (stream) - (format stream "~@" test)) - (push (make-instance 'test-failure :test-case test - :reason "Failure restart.") - result-list)))))))) + (bind-run-state ((current-test test)) + (labels ((abort-test (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 ((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 + (let ((*readtable* (copy-readtable))) + (funcall (test-lambda test))) + (retest () + :report (lambda (stream) + (format stream "~@" test)) + (return-from run-it (run-it))) + (ignore () + :report (lambda (stream) + (format stream "~@" test)) + (abort-test (make-instance 'test-failure :test-case test + :reason "Failure restart.")))) + result-list)))) + (let ((results (run-it))) + (setf (status test) (results-status results) + result-list (nconc result-list results))))))) (defgeneric %run (test-spec) (:documentation "Internal method for running a test. Does not @@ -162,6 +171,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 '())) @@ -186,7 +198,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)))