3 (:export #:with-test #:report-test-status #:*failures*
4 #:really-invoke-debugger
5 #:*break-on-failure* #:*break-on-expected-failure*))
7 (in-package :test-util)
9 (defvar *test-count* 0)
10 (defvar *test-file* nil)
11 (defvar *failures* nil)
12 (defvar *break-on-failure* nil)
13 (defvar *break-on-expected-failure* nil)
15 (defmacro with-test ((&key fails-on name) &body body)
19 (when (expected-failure-p ,fails-on)
20 (fail-test :unexpected-success ',name nil)))
22 (if (expected-failure-p ,fails-on)
23 (fail-test :expected-failure ',name error)
24 (fail-test :unexpected-failure ',name error)))))
26 (defun report-test-status ()
27 (with-standard-io-syntax
28 (with-open-file (stream "test-status.lisp-expr"
30 :if-exists :supersede)
31 (format stream "~s~%" *failures*))))
34 (unless (eq *test-file* *load-pathname*)
35 (setf *test-file* *load-pathname*)
36 (setf *test-count* 0))
39 (defun fail-test (type test-name condition)
40 (push (list type *test-file* (or test-name *test-count*))
42 (when (or (and *break-on-failure*
43 (not (eq type :expected-failure)))
44 *break-on-expected-failure*)
45 (really-invoke-debugger condition)))
47 (defun expected-failure-p (fails-on)
48 (sb-impl::featurep fails-on))
50 (defun really-invoke-debugger (condition)
51 (with-simple-restart (continue "Continue")
52 (let ((*invoke-debugger-hook* *invoke-debugger-hook*))
54 (invoke-debugger condition))))