More robust FILTER-LVAR through CASTs
[sbcl.git] / tests / condition.pure.lisp
index d40cdba..0b071d8 100644 (file)
@@ -6,20 +6,22 @@
 ;;;; While most of SBCL is derived from the CMU CL system, the test
 ;;;; files (like this one) were written from scratch after the fork
 ;;;; from CMU CL.
-;;;; 
+;;;;
 ;;;; This software is in the public domain and is provided with
 ;;;; absolutely no warranty. See the COPYING and CREDITS files for
 ;;;; more information.
 
 (cl:in-package :cl-user)
 
+(load "test-util.lisp")
+
 ;;; Until 0.7.7.21, (MAKE-CONDITION 'FILE-ERROR :PATHNAME "FOO")
 ;;; wasn't printable, because the REPORT function for FILE-ERROR
 ;;; referred to unbound slots. This was reported and fixed by Antonio
 ;;; Martinez (sbcl-devel 2002-09-10).
 (format t
-       "~&printable now: ~A~%"
-       (make-condition 'file-error :pathname "foo"))
+        "~&printable now: ~A~%"
+        (make-condition 'file-error :pathname "foo"))
 
 (assert (eq
          (block nil
 
 ;;; clauses in HANDLER-CASE are allowed to have declarations (and
 ;;; indeed, only declarations)
-(assert 
+(assert
  (null (handler-case (error "foo") (error () (declare (optimize speed))))))
 
 (handler-case
     (funcall (lambda (x) (check-type x fixnum) x) t)
   (type-error (c)
     (assert (and (subtypep (type-error-expected-type c) 'fixnum)
-                (subtypep 'fixnum (type-error-expected-type c))))
+                 (subtypep 'fixnum (type-error-expected-type c))))
     (assert (eq (type-error-datum c) t)))
   (:no-error (&rest rest) (error "no error: ~S" rest)))
 
 ;;; designators for a condition. Reported by Bruno Haible on cmucl-imp
 ;;; 2004-10-12.
 (flet ((test (&rest args)
-         (multiple-value-bind (res err) 
+         (multiple-value-bind (res err)
              (ignore-errors (apply #'error args))
            (assert (not res))
-           (assert (typep err 'type-error)))))
+           (assert (typep err 'type-error))
+           (assert (not (nth-value 1 (ignore-errors
+                                       (type-error-datum err)))))
+           (assert (not (nth-value 1 (ignore-errors
+                                       (type-error-expected-type err))))))))
   (test '#:no-such-condition)
   (test nil)
   (test t)
   (test 42)
   (test (make-instance 'standard-object)))
 
+;;; If CERROR is given a condition, any remaining arguments are only
+;;; used for the continue format control.
+(let ((x 0))
+  (handler-bind
+      ((simple-error (lambda (c) (incf x) (continue c))))
+    (cerror "Continue from ~A at ~A"
+            (make-condition 'simple-error :format-control "foo"
+                            :format-arguments nil)
+            'cerror (get-universal-time))
+    (assert (= x 1))))
+
+(with-test (:name :malformed-restart-case-clause)
+  (assert (eq :ok
+              (handler-case
+                  (macroexpand `(restart-case (error "foo")
+                                  (foo :report "quux" (quux))))
+                (simple-error (e)
+                  (assert (equal '(restart-case (foo :report "quux" (quux)))
+                                 (simple-condition-format-arguments e)))
+                  :ok)))))
+
+(with-test (:name :simple-condition-without-args)
+  (let ((sc (make-condition 'simple-condition)))
+    (assert (not (simple-condition-format-control sc)))
+    (assert (not (simple-condition-format-arguments sc)))
+    (assert (stringp (prin1-to-string sc)))
+    (assert
+     (eq :ok
+         (handler-case
+             (princ-to-string sc)
+           (simple-error (c)
+             (when (and (equal "No format-control for ~S"
+                               (simple-condition-format-control c))
+                        (eq sc (car
+                                (simple-condition-format-arguments c))))
+               :ok)))))))
+
+(with-test (:name :malformed-simple-condition-printing-type-error)
+  (assert (eq :type-error
+              (handler-case
+                  (princ-to-string
+                   (make-condition 'simple-error :format-control "" :format-arguments 8))
+                (type-error (e)
+                  (when (and (eq 'list (type-error-expected-type e))
+                             (eql 8 (type-error-datum e)))
+                    :type-error))))))