1 ;;;; This software is part of the SBCL system. See the README file for
4 ;;;; While most of SBCL is derived from the CMU CL system, the test
5 ;;;; files (like this one) were written from scratch after the fork
8 ;;;; This software is in the public domain and is provided with
9 ;;;; absolutely no warranty. See the COPYING and CREDITS files for
10 ;;;; more information.
12 (cl:in-package :cl-user)
14 (use-package :test-util)
19 (:export #:code #:code-msg #:%code-msg))
21 (define-condition code ()
22 ((msg :reader code-msg :reader %code-msg :initarg :msg)))
27 (define-condition code1 (code)
28 ((msg :accessor code-msg :initarg :msg)))
30 (let ((code (make-condition 'code :msg 1)))
31 (assert (typep code 'code))
32 (assert (eql (code-msg code) 1))
33 (assert (eql (%code-msg code) 1)))
34 (let ((code (make-condition 'code1 :msg 1)))
35 (assert (typep code 'code))
36 (assert (eql (code-msg code) 1))
37 (assert (eql (%code-msg code) 1))
38 (setf (code-msg code) 2)
39 (assert (eql (code-msg code) 2))
40 (assert (eql (%code-msg code) 1)))
44 ;;; Check that initializing the condition class metaobject doesn't create
45 ;;; any instances. Reported by Marco Baringer on sbcl-devel Mon, 05 Jul 2004.
46 (defvar *condition-count* 0)
47 (define-condition counted-condition () ((slot :initform (incf *condition-count*))))
48 (defmethod frob-counted-condition ((x counted-condition)) x)
49 (assert (= 0 *condition-count*))
50 (assert (typep (sb-mop:class-prototype (find-class 'counted-condition))
51 '(and condition counted-condition)))
53 (define-condition picky-condition () ())
56 (error 'picky-condition)
58 (assert (eq (car (compute-restarts)) (car (compute-restarts c))))))
62 (typep c '(or null picky-condition)))
65 ;;; adapted from Helmut Eller on cmucl-imp
69 (error 'picky-condition)
71 (invoke-restart (find-restart 'give-it c))))
73 :test (lambda (c) (typep c 'picky-condition))
76 ;;; In sbcl-1.0.9, a condition derived from CL:STREAM-ERROR (or
77 ;;; CL:READER-ERROR or or CL:PARSE-ERROR) didn't inherit a usable
78 ;;; PRINT-OBJECT method --- the PRINT-OBJECT code implicitly assumed
79 ;;; that CL:STREAM-ERROR was like a SIMPLE-CONDITION, with args and
80 ;;; format control, which seems to be a preANSIism.
82 ;;; (The spec for DEFINE-CONDITION says that if :REPORT is not
83 ;;; supplied, "information about how to report this type of condition
84 ;;; is inherited from the PARENT-TYPE." The spec doesn't explicitly
85 ;;; forbid the inherited printer from trying to read slots which
86 ;;; aren't portably specified for the condition, but it doesn't seem
87 ;;; reasonable for the inherited printer to do so. It does seem
88 ;;; reasonable for app code to derive a new condition from
89 ;;; CL:READER-ERROR (perhaps for an error in a readmacro) or
90 ;;; CL:PARSE-ERROR (perhaps for an error in an operator
91 ;;; READ-MY-FAVORITE-DATA-STRUCTURE) or CL:STREAM-ERROR (dunno why
92 ;;; offhand, but perhaps for some Gray-stream-ish reason), not define
93 ;;; a :REPORT method for its new condition, and expect to inherit from
94 ;;; the application's printer all the cruft required for describing
95 ;;; the location of the error in the input.)
96 (define-condition my-stream-error-1-0-9 (stream-error) ())
97 (define-condition parse-foo-error-1-0-9 (parse-error) ())
98 (define-condition read-bar-error-1-0-9 (reader-error) ())
99 (with-test (:name :printable-conditions :fails-on :win32)
100 (let (;; instances created initializing all the slots specified in
102 (parse-foo-error-1-0-9 (make-condition 'parse-foo-error-1-0-9
103 :stream *standard-input*))
104 (read-foo-error-1-0-9 (make-condition 'read-bar-error-1-0-9
105 :stream *standard-input*))
106 (my-stream-error-1-0-9 (make-condition 'my-stream-error-1-0-9
107 :stream *standard-input*)))
108 ;; should be printable
110 my-stream-error-1-0-9
111 parse-foo-error-1-0-9
112 read-foo-error-1-0-9))
113 ;; whether escaped or not
114 (dolist (*print-escape* '(nil t))
115 (write c :stream (make-string-output-stream))))))
117 ;;; Reported by Michael Weber: restart computation in :TEST-FUNCTION used to
118 ;;; cause infinite recursion.
119 (defun restart-test-finds-restarts ()
122 (return-from restart-test-finds-restarts 42))
125 (find-restart 'qux))))
126 (when (find-restart 'bar)
127 (invoke-restart 'bar))))
128 (assert (not (restart-test-finds-restarts)))
130 (with-test (:name :bug-896379)
131 (let ((*evaluator-mode* :compile))
132 (handler-bind ((style-warning #'error))
133 (let ((reader (gensym "READER"))
134 (name (gensym "FOO-ERROR")))
135 (eval `(define-condition ,name (error)
136 ((slot :initarg :slot :reader ,reader))
137 (:report (lambda (c stream)
138 (format stream "Oops: ~S" (,reader c))))))))))
140 (with-test (:name :define-condition-result)
141 (let ((name (gensym "CONDITION")))
143 (eq (eval `(define-condition ,name () ()))