2
;;;; Author: Paul Dietz
3
;;;; Created: Sun May 11 19:53:37 2003
4
;;;; Contains: Tests of REMOVE-METHOD
8
(defparameter *remove-meth-gf-01*
9
(defgeneric remove-meth-gf-01 (x)))
11
(defparameter *remove-meth-gf-01-method-t*
12
(defmethod remove-meth-gf-01 ((x t)) x))
14
(defparameter *remove-meth-gf-02*
15
(defgeneric remove-meth-gf-02 (x)))
17
(defparameter *remove-meth-gf-02-method-t*
18
(defmethod remove-meth-gf-02 ((x t)) x))
20
;;; remove method must not signal an error if the method
21
;;; does not belong to the generic function
23
(deftest remove-method.1
25
(eqt (remove-method *remove-meth-gf-01* *remove-meth-gf-02-method-t*)
27
(remove-meth-gf-01 :good))
30
;;; Add, then remove, a method
32
(deftest remove-method.2
35
(remove-meth-gf-01 10)
36
(progn (setf meth (eval '(defmethod remove-meth-gf-01 ((x integer))
39
(remove-meth-gf-01 10)
40
(eqt *remove-meth-gf-01*
41
(remove-method *remove-meth-gf-01* meth))
42
(remove-meth-gf-01 10)))
45
;;; Add two disjoint methods, then remove
47
(deftest remove-method.3
50
(mapcar #'remove-meth-gf-01 '(19 a))
52
(setf meth1 (eval '(defmethod remove-meth-gf-01 ((x symbol))
55
(mapcar #'remove-meth-gf-01 '(19 a)))
57
(setf meth2 (eval '(defmethod remove-meth-gf-01 ((x number))
60
(mapcar #'remove-meth-gf-01 '(19 a)))
61
(eqt *remove-meth-gf-01* (remove-method *remove-meth-gf-01* meth1))
62
(mapcar #'remove-meth-gf-01 '(19 a))
63
(eqt *remove-meth-gf-01* (remove-method *remove-meth-gf-01* meth2))
64
(mapcar #'remove-meth-gf-01 '(19 a))))
65
(19 a) (19 (a)) (20 (a)) t (20 a) t (19 a))
67
;;; Remove in the other order
69
(deftest remove-method.4
72
(mapcar #'remove-meth-gf-01 '(19 a))
74
(setf meth1 (eval '(defmethod remove-meth-gf-01 ((x symbol))
77
(mapcar #'remove-meth-gf-01 '(19 a)))
79
(setf meth2 (eval '(defmethod remove-meth-gf-01 ((x number))
82
(mapcar #'remove-meth-gf-01 '(19 a)))
83
(eqt *remove-meth-gf-01* (remove-method *remove-meth-gf-01* meth2))
84
(mapcar #'remove-meth-gf-01 '(19 a))
85
(eqt *remove-meth-gf-01* (remove-method *remove-meth-gf-01* meth1))
86
(mapcar #'remove-meth-gf-01 '(19 a))))
87
(19 a) (19 (a)) (20 (a)) t (19 (a)) t (19 a))
89
;;; Now methods that shadow one another
91
(deftest remove-method.5
94
(mapcar #'remove-meth-gf-01 '(10 20.0))
96
(setf meth1 (eval '(defmethod remove-meth-gf-01 ((x integer))
99
(mapcar #'remove-meth-gf-01 '(10 20.0)))
101
(setf meth2 (eval '(defmethod remove-meth-gf-01 ((x number))
104
(mapcar #'remove-meth-gf-01 '(10 20.0)))
105
(eqt *remove-meth-gf-01* (remove-method *remove-meth-gf-01* meth1))
106
(mapcar #'remove-meth-gf-01 '(10 20.0))
107
(eqt *remove-meth-gf-01* (remove-method *remove-meth-gf-01* meth2))
108
(mapcar #'remove-meth-gf-01 '(10 20.0))))
109
(10 20.0) (9 20.0) (9 21.0) t (11 21.0) t (10 20.0))
111
(deftest remove-method.6
114
(mapcar #'remove-meth-gf-01 '(10 20.0))
116
(setf meth1 (eval '(defmethod remove-meth-gf-01 ((x integer))
119
(mapcar #'remove-meth-gf-01 '(10 20.0)))
121
(setf meth2 (eval '(defmethod remove-meth-gf-01 ((x number))
124
(mapcar #'remove-meth-gf-01 '(10 20.0)))
125
(eqt *remove-meth-gf-01* (remove-method *remove-meth-gf-01* meth2))
126
(mapcar #'remove-meth-gf-01 '(10 20.0))
127
(eqt *remove-meth-gf-01* (remove-method *remove-meth-gf-01* meth1))
128
(mapcar #'remove-meth-gf-01 '(10 20.0))))
129
(10 20.0) (9 20.0) (9 21.0) t (9 20.0) t (10 20.0))
131
(deftest remove-method.7
134
(mapcar #'remove-meth-gf-01 '(10 20.0))
136
(setf meth1 (eval '(defmethod remove-meth-gf-01 ((x number))
139
(mapcar #'remove-meth-gf-01 '(10 20.0)))
141
(setf meth2 (eval '(defmethod remove-meth-gf-01 ((x integer))
144
(mapcar #'remove-meth-gf-01 '(10 20.0)))
145
(eqt *remove-meth-gf-01* (remove-method *remove-meth-gf-01* meth1))
146
(mapcar #'remove-meth-gf-01 '(10 20.0))
147
(eqt *remove-meth-gf-01* (remove-method *remove-meth-gf-01* meth2))
148
(mapcar #'remove-meth-gf-01 '(10 20.0))))
149
(10 20.0) (11 21.0) (9 21.0) t (9 20.0) t (10 20.0))
151
(deftest remove-method.8
154
(mapcar #'remove-meth-gf-01 '(10 20.0))
156
(setf meth1 (eval '(defmethod remove-meth-gf-01 ((x number))
159
(mapcar #'remove-meth-gf-01 '(10 20.0)))
161
(setf meth2 (eval '(defmethod remove-meth-gf-01 ((x integer))
164
(mapcar #'remove-meth-gf-01 '(10 20.0)))
165
(eqt *remove-meth-gf-01* (remove-method *remove-meth-gf-01* meth2))
166
(mapcar #'remove-meth-gf-01 '(10 20.0))
167
(eqt *remove-meth-gf-01* (remove-method *remove-meth-gf-01* meth1))
168
(mapcar #'remove-meth-gf-01 '(10 20.0))))
169
(10 20.0) (11 21.0) (9 21.0) t (11 21.0) t (10 20.0))
171
;;; Adding and removing auxiliary methods
173
(declaim (special *rmgf-03-var*))
175
(defparameter *remove-meth-gf-03*
176
(defgeneric remove-meth-gf-03 (x)))
178
(defparameter *remove-meth-gf-03-method-t*
179
(defmethod remove-meth-gf-03 ((x t)) (list *rmgf-03-var* x)))
181
(deftest remove-method.9
182
(let (meth (*rmgf-03-var* 0))
184
(mapcar #'remove-meth-gf-03 '(5 a))
186
(setf meth (eval '(defmethod remove-meth-gf-03 :before ((x number))
187
(incf *rmgf-03-var*))))
188
(mapcar #'remove-meth-gf-03 '(5 a)))
189
(eqt *remove-meth-gf-03* (remove-method *remove-meth-gf-03* meth))
190
(mapcar #'remove-meth-gf-03 '(5 a))))
196
(deftest remove-method.10
197
(let (meth (*rmgf-03-var* 0))
199
(mapcar #'remove-meth-gf-03 '(5 a))
201
(setf meth (eval '(defmethod remove-meth-gf-03 :after ((x number))
202
(incf *rmgf-03-var*))))
203
(mapcar #'remove-meth-gf-03 '(5 a)))
204
(eqt *remove-meth-gf-03* (remove-method *remove-meth-gf-03* meth))
205
(mapcar #'remove-meth-gf-03 '(5 a))))
211
(deftest remove-method.11
212
(let (meth (*rmgf-03-var* 0))
214
(mapcar #'remove-meth-gf-03 '(5 a))
216
(setf meth (eval '(defmethod remove-meth-gf-03 :around ((x number))
218
(prog1 (call-next-method)
219
(decf *rmgf-03-var*)))))
220
(mapcar #'remove-meth-gf-03 '(5 a)))
221
(eqt *remove-meth-gf-03* (remove-method *remove-meth-gf-03* meth))
222
(mapcar #'remove-meth-gf-03 '(5 a))))
228
;;; Must add tests for nonstandard method combinations