2
;;;; Author: Paul Dietz
3
;;;; Created: Sat May 17 20:55:50 2003
4
;;;; Contains: Tests of DEFGENERIC
8
;;; Various error cases
10
(defun defgeneric-testfn-01 (x) x)
12
(deftest defgeneric.error.1
13
;; Cannot make ordinary functions generic
14
(let* ((name 'defgeneric-testfn-01)
15
(fn (symbol-function name)))
16
(if (not (typep fn 'generic-function))
18
(progn (eval `(defgeneric ,name ())) :bad)
19
(program-error () :good))
23
(defmacro defgeneric-testmacro-02 (x) x)
25
(deftest defgeneric.error.2
26
;; Cannot make macros generic
27
(let* ((name 'defgeneric-testmacro-02))
29
(progn (eval `(defgeneric ,name ())) :bad)
30
(program-error () :good)))
33
(deftest defgeneric.error.3
34
;; Cannot make special operators generic
35
(loop for name in *cl-special-operator-symbols*
38
(progn (eval `(defgeneric ,name ())) t)
39
(program-error () nil))
40
when result collect name)
43
(deftest defgeneric.error.4
44
(signals-error (defgeneric defgeneric-error-fn.4 (x y)
45
(:argument-precedence-order x y x))
49
(deftest defgeneric.error.5
50
(signals-error (defgeneric defgeneric-error-fn.5 (x)
51
(:documentation "some documentation")
52
(:documentation "illegally repeated documentation"))
56
(deftest defgeneric.error.6
57
(signals-error (defgeneric defgeneric-error-fn.6 (x)
62
(deftest defgeneric.error.7
65
(eval '(defgeneric defgeneric-error-fn.7 (x y)
71
(deftest defgeneric.error.8
72
(signals-error (defgeneric defgeneric-error-fn.8 (x y)
73
(:argument-precedence-order x))
78
;;; Non-congruent methods cause defgeneric to signal an error
80
(deftest defgeneric.error.9
83
(eval '(defgeneric defgeneric-error-fn.9 (x)
84
(:method ((x t)(y t)) t)))
90
(deftest defgeneric.error.10
93
(eval '(defgeneric defgeneric-error-fn.10 (x &optional y)
99
(deftest defgeneric.error.11
102
(eval '(defgeneric defgeneric-error-fn.11 (x &optional y)
103
(:method (x &optional y z) t)))
108
(deftest defgeneric.error.12
111
(eval '(defgeneric defgeneric-error-fn.12 (x &rest y)
117
(deftest defgeneric.error.13
120
(eval '(defgeneric defgeneric-error-fn.13 (x)
121
(:method (x &rest y) t)))
126
(deftest defgeneric.error.14
129
(eval '(defgeneric defgeneric-error-fn.14 (x &key)
135
(deftest defgeneric.error.15
138
(eval '(defgeneric defgeneric-error-fn.15 (x &key y)
144
(deftest defgeneric.error.16
147
(eval '(defgeneric defgeneric-error-fn.16 (x)
148
(:method (x &key) t)))
153
(deftest defgeneric.error.17
156
(eval '(defgeneric defgeneric-error-fn.17 (x)
157
(:method (x &key foo) t)))
162
(deftest defgeneric.error.18
165
(eval '(defgeneric defgeneric-error-fn.18 (x &key foo)
166
(:method (x &key) t)))
171
(deftest defgeneric.error.19
174
(eval '(defgeneric defgeneric-error-fn.19 (x &key foo)
175
(:method (x &key bar) t)))
180
;;; A close reading of the rules for keyword arguments to
181
;;; generic functions convinced me that the following two
182
;;; error tests are necessary. See sections 7.6.5 of the CLHS.
184
(deftest defgeneric.error.20
186
(let ((fn (defgeneric defgeneric-error-fn.20 (x &key)
187
(:method ((x number) &key foo) (list x foo))
188
(:method ((x symbol) &key bar) (list x bar)))))
189
(funcall fn 1 :bar 'a))
193
(deftest defgeneric.error.21
195
(let ((fn (defgeneric defgeneric-error-fn.21 (x &key)
196
(:method ((x number) &key foo &allow-other-keys) (list x foo))
197
(:method ((x symbol) &key bar) (list x bar)))))
198
(funcall fn 'x :foo 'a))
204
(deftest defgeneric.error.22
206
(defgeneric defgeneric-error-fn.22 (x))
207
(defmethod defgeneric-error-fn.22 ((x t)) nil)
209
(eval '(defgeneric defgeneric-error-fn.22 (x y)))
216
(deftest defgeneric.1
217
(let ((fn (eval '(defgeneric defgeneric.fun.1 (x y z)
218
(:method ((x t) (y t) (z t)) (list x y z))))))
219
(declare (type function fn))
221
(typep* fn 'generic-function)
222
(typep* fn 'standard-generic-function)
223
(funcall fn 'a 'b 'c)
225
(apply fn (list 4 5 6))
226
(mapcar fn '(1 2) '(3 4) '(5 6))
227
(defgeneric.fun.1 'd 'e 'f)))
228
t t (a b c) (1 2 3) (4 5 6) ((1 3 5) (2 4 6)) (d e f))
230
(deftest defgeneric.2
231
(let ((fn (eval '(defgeneric defgeneric.fun.2 (x y z)
232
(:documentation "boo!")
233
(:method ((x t) (y t) (z t)) (vector x y z))))))
234
(declare (type function fn))
236
(typep* fn 'generic-function)
237
(typep* fn 'standard-generic-function)
238
(funcall fn 'a 'b 'c)
239
(defgeneric.fun.2 'd 'e 'f)
240
(let ((doc (documentation fn t)))
242
(and (stringp doc) (string=t doc "boo!"))))
243
(let ((doc (documentation fn 'function)))
245
(and (stringp doc) (string=t doc "boo!"))))
246
(setf (documentation fn t) "foo")
247
(let ((doc (documentation fn t)))
249
(and (stringp doc) (string=t doc "foo"))))
250
(setf (documentation fn 'function) "bar")
251
(let ((doc (documentation fn t)))
253
(and (stringp doc) (string=t doc "bar"))))))
255
t t #(a b c) #(d e f) t t "foo" t "bar" t)
257
(deftest defgeneric.3
258
(let ((fn (eval '(defgeneric defgeneric.fun.3 (x y)
259
(:method ((x t) (y symbol)) (list x y))
260
(:method ((x symbol) (y t)) (list y x))))))
261
(declare (type function fn))
263
(typep* fn 'generic-function)
264
(typep* fn 'standard-generic-function)
273
(deftest defgeneric.4
274
(let ((fn (eval '(defgeneric defgeneric.fun.4 (x y)
275
(:argument-precedence-order y x)
276
(:method ((x t) (y symbol)) (list x y))
277
(:method ((x symbol) (y t)) (list y x))))))
278
(declare (type function fn))
280
(typep* fn 'generic-function)
281
(typep* fn 'standard-generic-function)
290
(deftest defgeneric.5
291
(let ((fn (eval '(defgeneric defgeneric.fun.5 ()
292
(:method () (values))))))
293
(declare (type function fn))
295
(typep* fn 'generic-function)
296
(typep* fn 'standard-generic-function)
297
(multiple-value-list (funcall fn))
298
(multiple-value-list (defgeneric.fun.5))
299
(multiple-value-list (apply fn nil))))
302
(deftest defgeneric.6
303
(let ((fn (eval '(defgeneric defgeneric.fun.6 ()
304
(:method () (values 'a 'b 'c))))))
305
(declare (type function fn))
307
(typep* fn 'generic-function)
308
(typep* fn 'standard-generic-function)
309
(multiple-value-list (funcall fn))
310
(multiple-value-list (defgeneric.fun.6))
311
(multiple-value-list (apply fn nil))))
312
t t (a b c) (a b c) (a b c))
314
(deftest defgeneric.7
315
(let ((fn (eval '(defgeneric defgeneric.fun.7 ()
316
(:method () (return-from defgeneric.fun.7 'a) 'b)))))
317
(declare (type function fn))
319
(typep* fn 'generic-function)
320
(typep* fn 'standard-generic-function)
321
(multiple-value-list (funcall fn))
322
(multiple-value-list (defgeneric.fun.7))
323
(multiple-value-list (apply fn nil))))
326
(deftest defgeneric.8
327
(let ((fn (eval '(defgeneric defgeneric.fun.8 (x &optional y z)
328
(:method ((x number) &optional y z)
330
(:method ((p symbol) &optional q r)
332
(declare (type function fn))
334
(typep* fn 'generic-function)
335
(typep* fn 'standard-generic-function)
336
(multiple-value-list (funcall fn 1))
337
(multiple-value-list (funcall fn 1 2))
338
(multiple-value-list (funcall fn 1 2 3))
339
(multiple-value-list (defgeneric.fun.8 'a))
340
(multiple-value-list (defgeneric.fun.8 'a 'b))
341
(multiple-value-list (defgeneric.fun.8 'a 'b 'c))
342
(multiple-value-list (apply fn '(x y z)))))
352
(deftest defgeneric.9
353
(let ((fn (eval '(defgeneric defgeneric.fun.9 (x &optional y z)
354
(:method ((x number) &optional (y 10) (z 20))
356
(:method ((p symbol) &optional (q 's) (r 't))
358
(declare (type function fn))
365
(funcall fn 'a 'b 'c)))
373
(deftest defgeneric.10
374
(let ((fn (eval '(defgeneric defgeneric.fun.10 (x &rest y)
375
(:method ((x number) &key foo) (list x foo))))))
376
(declare (type function fn))
379
(funcall fn 1 :foo 'a)
380
(defgeneric.fun.10 5/3 :foo 'x :foo 'y)
381
(defgeneric.fun.10 10 :bar t :allow-other-keys t)
382
(defgeneric.fun.10 20 :allow-other-keys nil :foo 'x)))
389
(deftest defgeneric.11
390
(let ((fn (eval '(defgeneric defgeneric.fun.11 (x &key)
391
(:method ((x number) &key foo) (list x foo))))))
392
(declare (type function fn))
395
(funcall fn 1 :foo 'a)
396
(defgeneric.fun.11 5/3 :foo 'x :foo 'y)
397
(defgeneric.fun.11 11 :bar t :allow-other-keys t)
398
(defgeneric.fun.11 20 :allow-other-keys nil :foo 'x)))
405
(deftest defgeneric.12
406
(let ((fn (eval '(defgeneric defgeneric.fun.12 (x &key foo bar baz)
407
(:method ((x number) &rest y) (list x y))))))
408
(declare (type function fn))
411
(funcall fn 1 :foo 'a)
412
(defgeneric.fun.12 5/3 :foo 'x :foo 'y :bar 'z)
413
(defgeneric.fun.12 11 :zzz t :allow-other-keys t)
414
(defgeneric.fun.12 20 :allow-other-keys nil :foo 'x)))
417
(5/3 (:foo x :foo y :bar z))
418
(11 (:zzz t :allow-other-keys t))
419
(20 (:allow-other-keys nil :foo x)))
421
(deftest defgeneric.13
422
(let ((fn (eval '(defgeneric defgeneric.fun.13 (x &key)
423
(:method ((x number) &key foo) (list x foo))
424
(:method ((x symbol) &key bar) (list x bar))))))
425
(declare (type function fn))
429
(funcall fn 1 :foo 2)
430
;; (funcall fn 1 :foo 2 :bar 3)
431
;; (funcall fn 1 :bar 4)
432
;; (funcall fn 'a :foo 'b)
433
(funcall fn 'a :bar 'b)
434
;; (funcall fn 'a :foo 'c :bar 'b)
446
(deftest defgeneric.14
447
(let ((fn (eval '(defgeneric defgeneric.fun.14 (x &key &allow-other-keys)
448
(:method ((x number) &key foo) (list x foo))
449
(:method ((x symbol) &key bar) (list x bar))))))
450
(declare (type function fn))
454
(funcall fn 1 :foo 2)
455
(funcall fn 1 :foo 2 :bar 3)
456
(funcall fn 1 :bar 4)
457
(funcall fn 'a :foo 'b)
458
(funcall fn 'a :bar 'b)
459
(funcall fn 'a :foo 'c :bar 'b)
460
(funcall fn 1 :baz 10)
461
(funcall fn 'a :baz 10)
462
(funcall fn 1 :allow-other-keys nil :baz 'a)
463
(funcall fn 'a :allow-other-keys nil :baz 'b)
478
(deftest defgeneric.15
479
(let ((fn (eval '(defgeneric defgeneric.fun.15 (x &key)
480
(:method ((x number) &key foo &allow-other-keys)
482
(:method ((x symbol) &key bar) (list x bar))))))
483
(declare (type function fn))
487
(funcall fn 1 :foo 2)
488
(funcall fn 1 :foo 2 :bar 3)
489
(funcall fn 1 :bar 4)
490
(funcall fn 'a :allow-other-keys t :foo 'b)
491
(funcall fn 'a :bar 'b)
492
(funcall fn 'a :foo 'c :bar 'b :allow-other-keys t)
493
(funcall fn 1 :baz 10)
494
;; (funcall fn 'a :baz 10)
495
(funcall fn 1 :allow-other-keys nil :baz 'a)
496
;; (funcall fn 'a :allow-other-keys nil :baz 'b)
512
(deftest defgeneric.16
513
(let ((fn (eval '(defgeneric defgeneric.fun.16 (x &key)
514
(:method ((x number) &key (foo 'a))
516
(:method ((x symbol) &key foo)
518
(declare (type function fn))
521
(funcall fn 1 :foo nil)
522
(funcall fn 1 :foo 2)
524
(funcall fn 'x :foo nil)
525
(funcall fn 'x :foo 'y)))
533
(deftest defgeneric.17
534
(let ((fn (eval '(defgeneric defgeneric.fun.17 (x &key)
535
(:method ((x number) &key (foo 'a foo-p))
536
(list x foo (notnot foo-p)))
537
(:method ((x symbol) &key foo)
539
(declare (type function fn))
542
(funcall fn 1 :foo nil)
543
(funcall fn 1 :foo 2)
545
(funcall fn 'x :foo nil)
546
(funcall fn 'x :foo 'y)))
554
(deftest defgeneric.18
555
(let ((fn (eval '(defgeneric defgeneric.fun.18 (x &optional y)
556
(:method ((x number) &optional (y 'a))
558
(:method ((x symbol) &optional (z nil z-p))
559
(list x z (notnot z-p)))))))
560
(declare (type function fn))
575
(deftest defgeneric.19
576
(let ((fn (eval '(defgeneric defgeneric.fun.19 (x &key)
577
(:method ((x number) &key ((:bar foo) 'a foo-p))
578
(list x foo (notnot foo-p)))))))
579
(declare (type function fn))
582
(funcall fn 1 :bar nil)
583
(funcall fn 1 :bar 2)))
588
(deftest defgeneric.20
589
(let ((fn (eval '(defgeneric defgeneric.fun.20 (x &optional y z)
591
&optional (y (1+ x) y-p)
592
(z (if y-p (1+ y) (+ x 10))
594
(list x y (notnot y-p) z (notnot z-p)))))))
595
(declare (type function fn))
604
(deftest defgeneric.21
605
(let ((fn (eval '(defgeneric defgeneric.fun.21 (x &key)
608
(z (if y-p (1+ y) (+ x 10))
610
(list x y (notnot y-p) z (notnot z-p)))))))
611
(declare (type function fn))
615
(funcall fn 1 :y 5 :z 9)
617
(funcall fn 1 :z 8 :y 4)))
624
(deftest defgeneric.22
625
(let ((fn (eval '(defgeneric defgeneric.fun.22 (x &key)
626
(:method ((x number) &key ((:allow-other-keys y)))
628
(declare (type function fn))
631
(funcall fn 1 :allow-other-keys nil)
632
(funcall fn 1 :allow-other-keys t)
633
(funcall fn 1 :foo 'x :allow-other-keys t :bar 'y)
634
(funcall fn 1 :allow-other-keys t :foo 'x)
635
(funcall fn 1 :allow-other-keys nil :allow-other-keys t)
636
(funcall fn 1 :foo 'x :allow-other-keys t :allow-other-keys nil)
637
(funcall fn 1 :allow-other-keys t 'foo 'y :allow-other-keys nil)
638
(funcall fn 1 :allow-other-keys t :allow-other-keys nil '#:foo 'z)))
649
(deftest defgeneric.23
650
(let ((fn (eval '(defgeneric defgeneric.fun.23 (x)
651
(:method ((x number) &aux (y (1+ x))) (list x y))
652
(:method ((x symbol) &aux (z (list x))) (list x z))))))
653
(declare (type function fn))
660
(deftest defgeneric.24
661
(let ((fn (eval '(defgeneric defgeneric.fun.24 (x)
662
(:method ((x number) &aux (y (1+ x)) (z (1+ y)))
664
(:method ((x symbol) &aux (y (list x)) (z (list x y)))
672
(deftest defgeneric.25
673
(let ((fn (eval '(defgeneric defgeneric.fun.25 (x &optional y &key)
674
(:method ((x symbol) &optional (y 'd y-p)
675
&key ((:foo bar) (list x y) bar-p)
676
&aux (z (list x y (notnot y-p)
677
bar (notnot bar-p))))
679
(declare (type function fn))
683
(funcall fn 'a 'b :foo 'c)))
688
(deftest defgeneric.26
689
(let ((fn (eval '(defgeneric defgeneric.fun.26 (x)
690
(declare (optimize (safety 3)))
691
(:method ((x symbol)) x)
692
(declare (optimize (debug 3)))))))
693
(declare (type function fn))
698
(when (subtypep (class-of (find-class 'standard-method))
700
(defclass substandard-method (standard-method) ())
701
(deftest defgeneric.27
702
(let ((fn (eval '(defgeneric defgeneric.fun.27 (x y)
703
(:method-class substandard-method)
704
(:method ((x number) (y number)) (+ x y))
705
(:method ((x string) (y string))
706
(concatenate 'string x y))))))
707
(declare (type function fn))
710
(funcall fn "1" "2")))
714
(deftest defgeneric.28
715
(let ((fn (eval '(defgeneric defgeneric.fun.28 (x &key)
716
(:method ((x integer) &key foo) (list x foo))
717
(:method ((x number) &key bar) (list x bar))
718
(:method ((x t) &key baz) (list x baz))))))
719
(declare (type function fn))
723
(funcall fn 1 :foo 'a)
724
(funcall fn 1 :bar 'b)
725
(funcall fn 1 :baz 'c)
726
(funcall fn 1 :bar 'b :baz 'c)
727
(funcall fn 1 :foo 'a :bar 'b)
728
(funcall fn 1 :foo 'a :baz 'c)
729
(funcall fn 1 :foo 'a :bar 'b :baz 'c)
732
(funcall fn 5/3 :bar 'b)
733
(funcall fn 5/3 :baz 'c)
734
(funcall fn 5/3 :bar 'b :baz 'c)
737
(funcall fn 'x :baz 'c)
741
(1 nil) (1 a) (1 nil) (1 nil)
742
(1 nil) (1 a) (1 a) (1 a)
744
(5/3 nil) (5/3 b) (5/3 nil) (5/3 b)
748
(defclass defgeneric.29.class.1 () ())
749
(defclass defgeneric.29.class.2 () ())
750
(defclass defgeneric.29.class.3
751
(defgeneric.29.class.1 defgeneric.29.class.2)
754
(deftest defgeneric.29
756
(eval '(defgeneric defgeneric.fun.29 (x &key)
757
(:method ((x defgeneric.29.class.1) &key foo) foo)
758
(:method ((x defgeneric.29.class.2) &key bar) bar)))))
759
(declare (type function fn))
760
(let ((x (make-instance 'defgeneric.29.class.3)))
763
(funcall fn x :foo 'a)
764
(funcall fn x :bar 'b)
765
(funcall fn x :foo 'a :bar 'b)
766
(funcall fn x :bar 'b :foo 'a))))
769
;;; I'm not sure this one is proper
770
;;; Added :metaclass at prompting of Martin Simmons
771
(when (subtypep (class-of (find-class 'standard-generic-function))
773
(defclass substandard-generic-function (standard-generic-function) ()
774
(:metaclass #.(class-name (class-of
775
(find-class 'standard-generic-function)))))
776
(deftest defgeneric.30
778
(eval '(defgeneric defgeneric.fun.29 (x)
779
(:generic-function-class substandard-generic-function)
780
(:method ((x symbol)) 1)
781
(:method ((x integer)) 2)))))
782
(declare (type function fn))
784
(typep* fn 'substandard-generic-function)
785
(typep* fn 'standard-generic-function)
786
(typep* fn 'generic-function)
787
(typep* fn 'function)
790
(defgeneric.fun.29 'x)
791
(defgeneric.fun.29 12345678901234567890)))
794
(deftest defgeneric.31
796
(defgeneric defgeneric.fun.31 (x) (:method ((x t)) t))
797
(defgeneric defgeneric.fun.31 (x y) (:method ((x t) (y t)) (list x y)))
798
(defgeneric.fun.31 'a 'b))
801
(deftest defgeneric.32
803
(defgeneric defgeneric.fun.32 (x) (:method ((x symbol)) :bad))
804
(defgeneric defgeneric.fun.32 (x) (:method ((x t)) :good))
805
(defgeneric.fun.32 'x))
808
(deftest defgeneric.33
811
'(defgeneric (setf defgeneric.fun.33) (x y &rest args)
812
(:method (x (y cons) &rest args)
813
(assert (null args)) (setf (car y) x))
814
(:method (x (y array) &rest args)
815
(setf (apply #'aref y args) x))))))
816
(declare (type function fn))
818
(let ((z (list 'a 'b)))
820
(setf (defgeneric.fun.33 z) 'c)
822
(let ((a (make-array '(10) :initial-element nil)))
824
(setf (defgeneric.fun.33 a 5) 'd)
827
(d #(nil nil nil nil nil d nil nil nil nil)))
829
(deftest defgeneric.34
830
(let ((fn (eval '(defgeneric #:defgeneric.fun.34 (x)
831
(:method ((x t)) (list x :good))))))
835
(deftest defgeneric.35
836
(let ((fn (eval '(defgeneric defgeneric.fun.35 (x)
837
(:method ((x (eql 'a)))
838
(declare (optimize (speed 0)))
840
(declare (optimize (safety 3)))
842
(declare (type function fn))
845
(let ((method (first (compute-applicable-methods fn '(a)))))
847
(let ((doc (documentation method t)))
849
(or (null doc) (equalt doc "FOO"))
850
(setf (documentation method t) "BAR")
851
(let ((doc (documentation method t)))
852
(or (null doc) (equalt doc "BAR")))