2
;;;; Author: Paul Dietz
3
;;;; Created: Sun Apr 27 16:23:59 2003
4
;;;; Contains: Tests of DEFCLASS with more involved inheritance
10
(defclass class-0301a ()
13
(defclass class-0301b ()
16
(defclass class-0301c (class-0301a class-0301b)
20
(let ((c (make-instance 'class-0301c)))
22
(typep* c 'class-0301a)
23
(typep* c 'class-0301b)
24
(typep* c 'class-0301c)
25
(typep* c (find-class 'class-0301a))
26
(typep* c (find-class 'class-0301b))
27
(typep* c (find-class 'class-0301c))
28
(map-slot-boundp* c '(a b c d))
29
(setf (slot-value c 'a) 'w)
30
(setf (slot-value c 'b) 'x)
31
(setf (slot-value c 'c) 'y)
32
(setf (slot-value c 'd) 'z)
33
(map-slot-boundp* c '(a b c d))
34
(map-slot-value c '(a b c d))))
44
(defclass class-0302a ()
45
((a :initform 'x) b (c :initform 'w)))
47
(defclass class-0302b ()
48
((a :initform 'y) (b :initform 'z)))
50
(defclass class-0302c (class-0302a class-0302b)
51
(a b (c :initform 'v) d))
54
(let ((c (make-instance 'class-0302c)))
56
(map-slot-boundp* c '(a b c d))
57
(map-slot-value c '(a b c))))
63
(defclass class-0303a ()
64
((a :allocation :class) b))
66
(defclass class-0303b ()
67
(a (b :allocation :class)))
69
(defclass class-0303c (class-0303a class-0303b) ())
72
(let ((c1 (make-instance 'class-0303a))
73
(c2 (make-instance 'class-0303b))
74
(c3 (make-instance 'class-0303c)))
75
(slot-makunbound c1 'a)
76
(slot-makunbound c2 'b)
78
(loop for c in (list c1 c2 c3)
79
collect (map-slot-boundp* c '(a b)))
80
(list (setf (slot-value c1 'a) 'x1)
83
(list (setf (slot-value c2 'a) 'x2)
87
(list (setf (slot-value c3 'a) 'x3)
92
(list (setf (slot-value c1 'b) 'y1)
96
(list (setf (slot-value c2 'b) 'y2)
100
(list (setf (slot-value c3 'b) 'y3)
103
(slot-value c3 'b))))
104
((nil nil) (nil nil) (nil nil))
115
(defclass class-0304a ()
118
(defclass class-0304b (class-0304a) ())
120
(defclass class-0304c (class-0304a)
123
(defclass class-0304d (class-0304b class-0304c)
126
(deftest class-0304.1
127
(slot-value (make-instance 'class-0304d) 'a)
132
(defclass class-0305a ()
134
(:default-initargs :a 'x))
136
(defclass class-0305b (class-0305a) ())
138
(defclass class-0305c (class-0305a)
140
(:default-initargs :a 'y))
142
(defclass class-0305d (class-0305b class-0305c)
145
(deftest class-0305.1
146
(slot-value (make-instance 'class-0305d) 'a)
150
;;; A test showing nonmonotonicity in the CLOS CPL algorithm
152
(defclass class-0306a () ((a :initform nil :reader a-slot)))
153
(defclass class-0306b (class-0306a) ((a :initform 'x)))
154
(defclass class-0306c (class-0306a) ((a :initform 'y)))
155
(defclass class-0306d (class-0306b) ())
156
(defclass class-0306e (class-0306b) ())
157
(defclass class-0306f (class-0306d class-0306c) ())
158
(defclass class-0306g (class-0306e) ())
159
(defclass class-0306h (class-0306f class-0306g) ())
161
;;; Class class-0306c should precede class-0306b in the
162
;;; CPL for class-0306h, even though it follows it in the CPLs
163
;;; for the direct superclasses of class-0306h.
165
(deftest class-0306.1
167
(mapcar #'make-instance
168
'(class-0306a class-0306b class-0306c class-0306d
169
class-0306e class-0306f class-0306g class-0306h))
170
collect (slot-value obj 'a))
173
(deftest class-0306.2
175
(mapcar #'make-instance
176
'(class-0306a class-0306b class-0306c class-0306d
177
class-0306e class-0306f class-0306g class-0306h))
178
collect (a-slot obj))
181
;;; A class redefinition test that came up in cmucl
183
(deftest class-0307.1
185
(setf (find-class 'class-0307a) nil
186
(find-class 'class-0307b) nil)
187
(eval '(defclass class-0307a () ()))
188
(eval '(defclass class-0307b (class-0307a) (a)))
189
(eval '(defclass class-0307a () ((a :initform nil))))
190
(eval '(defclass class-0307b (class-0307a) ((a :initform 'x))))
191
(slot-value (make-instance 'class-0307b) 'a))
194
(deftest class-0308.1
196
(setf (find-class 'class-0308a) nil
197
(find-class 'class-0308b) nil)
198
(eval '(defclass class-0308a () ()))
199
(eval '(defclass class-0308b (class-0308a) (a)))
200
(eval '(defclass class-0308a () ((a :initarg :a))))
201
(eval '(defclass class-0308b (class-0308a) ()))
202
(slot-value (make-instance 'class-0308b :a 'x) 'a))
205
;;; More class redefinition tests
207
(deftest class-0309.1
209
(setf (find-class 'class-0309) nil)
210
(let* ((class1 (eval '(defclass class-0309 () ((a) (b) (c)))))
211
(obj1 (make-instance 'class-0309)))
212
(setf (class-name class1) nil)
213
(let ((class2 (eval '(defclass class-0309 () ((a) (b) (c))))))
215
(eqt (class-of obj1) class1)
218
(typep* obj1 class2)))))
221
(deftest class-0310.1
223
(setf (find-class 'class-0310a) nil
224
(find-class 'class-0310b) nil)
225
(let* ((class1 (eval '(defclass class-0310a () ((a) (b) (c)))))
226
(obj1 (make-instance 'class-0310a)))
227
(setf (class-name class1) 'class-0310b)
228
(let ((class2 (eval '(defclass class-0310a () ((a) (b) (c))))))
230
(eqt (class-of obj1) class1)
235
(class-name class2)))))
236
t nil t nil class-0310b class-0310a)
238
(deftest class-0311.1
240
(setf (find-class 'class-0311) nil)
241
(let* ((class1 (eval '(defclass class-0311 () ((a) (b) (c)))))
242
(obj1 (make-instance 'class-0311)))
243
(setf (find-class 'class-0311) nil)
244
(let ((class2 (eval '(defclass class-0311 () ((a) (b) (c))))))
246
(eqt (class-of obj1) class1)
252
(eqt (find-class 'class-0311) class1)
253
(eqt (find-class 'class-0311) class2)))))
254
t nil t nil class-0311 class-0311 nil t)