Rework test infrastructure to keep track of tests which are disabled
[sbcl.git] / tests / test-util.lisp
index cdc422c..dbd66a7 100644 (file)
   (terpri *trace-output*)
   (force-output *trace-output*))
 
-(defmacro with-test ((&key fails-on name) &body body)
+(defmacro with-test ((&key fails-on broken-on skipped-on name) &body body)
   (let ((block-name (gensym)))
-    `(block ,block-name
-       (handler-bind ((error (lambda (error)
-                               (if (expected-failure-p ,fails-on)
-                                   (fail-test :expected-failure ',name error)
-                                   (fail-test :unexpected-failure ',name error))
-                               (return-from ,block-name))))
-         (progn
-           (log-msg "Running ~S" ',name)
-           (start-test)
-           ,@body
-           (if (expected-failure-p ,fails-on)
-               (fail-test :unexpected-success ',name nil)
-               (log-msg "Success ~S" ',name)))))))
+    `(cond
+       ((broken-p ,broken-on)
+       (fail-test :skipped-broken ',name "Test broken on this platform"))
+       ((skipped-p ,skipped-on)
+       (fail-test :skipped-disabled ',name "Test disabled for this combination of platform and features"))
+       (t
+       (block ,block-name
+         (handler-bind ((error (lambda (error)
+                                 (if (expected-failure-p ,fails-on)
+                                     (fail-test :expected-failure ',name error)
+                                     (fail-test :unexpected-failure ',name error))
+                                 (return-from ,block-name))))
+           (progn
+             (log-msg "Running ~S" ',name)
+             (start-test)
+             ,@body
+             (if (expected-failure-p ,fails-on)
+                 (fail-test :unexpected-success ',name nil)
+                 (log-msg "Success ~S" ',name)))))))))
 
 (defun report-test-status ()
   (with-standard-io-syntax
 (defun expected-failure-p (fails-on)
   (sb-impl::featurep fails-on))
 
+(defun broken-p (broken-on)
+  (sb-impl::featurep broken-on))
+
+(defun skipped-p (skipped-on)
+  (sb-impl::featurep skipped-on))
+
 (defun really-invoke-debugger (condition)
   (with-simple-restart (continue "Continue")
     (let ((*invoke-debugger-hook* *invoke-debugger-hook*))