aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorJoakim Verona2015-01-15 14:54:25 +0100
committerJoakim Verona2015-01-15 14:54:25 +0100
commit0298a2c6a10bc3b79cb2f45a1961dd7ac6da4e6d (patch)
tree6c7ea25ac137f5764d931e841598a3c1ea434ab0 /test
parenta1124bc117e41019de49c82d13d1a72a50df977d (diff)
parent0e97c44c3699c4606a04f589828acdf9c03f447e (diff)
downloademacs-0298a2c6a10bc3b79cb2f45a1961dd7ac6da4e6d.tar.gz
emacs-0298a2c6a10bc3b79cb2f45a1961dd7ac6da4e6d.zip
merge master
Diffstat (limited to 'test')
-rw-r--r--test/ChangeLog11
-rw-r--r--test/automated/cl-generic-tests.el133
-rw-r--r--test/automated/eieio-test-methodinvoke.el72
3 files changed, 188 insertions, 28 deletions
diff --git a/test/ChangeLog b/test/ChangeLog
index 83bb8bf00c7..a33ec8793f4 100644
--- a/test/ChangeLog
+++ b/test/ChangeLog
@@ -1,3 +1,14 @@
12015-01-15 Stefan Monnier <monnier@iro.umontreal.ca>
2
3 * automated/eieio-test-methodinvoke.el (eieio-test-method-store): Add
4 keysym arg instead of relying on internal var eieio--generic-call-key.
5 Update all callers.
6 (eieio-test-cl-generic-1): New tests.
7
82015-01-14 Stefan Monnier <monnier@iro.umontreal.ca>
9
10 * automated/cl-generic-tests.el: New file.
11
12015-01-08 Stefan Monnier <monnier@iro.umontreal.ca> 122015-01-08 Stefan Monnier <monnier@iro.umontreal.ca>
2 13
3 * automated/eieio-tests.el (eieio-test-23-inheritance-check): Don't use 14 * automated/eieio-tests.el (eieio-test-23-inheritance-check): Don't use
diff --git a/test/automated/cl-generic-tests.el b/test/automated/cl-generic-tests.el
new file mode 100644
index 00000000000..17bce6a3157
--- /dev/null
+++ b/test/automated/cl-generic-tests.el
@@ -0,0 +1,133 @@
1;;; cl-generic-tests.el --- Tests for cl-generic.el functionality -*- lexical-binding: t; -*-
2
3;; Copyright (C) 2015 Free Software Foundation, Inc.
4
5;; Author: Stefan Monnier <monnier@iro.umontreal.ca>
6
7;; This file is part of GNU Emacs.
8
9;; GNU Emacs is free software: you can redistribute it and/or modify
10;; it under the terms of the GNU General Public License as published by
11;; the Free Software Foundation, either version 3 of the License, or
12;; (at your option) any later version.
13
14;; GNU Emacs is distributed in the hope that it will be useful,
15;; but WITHOUT ANY WARRANTY; without even the implied warranty of
16;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17;; GNU General Public License for more details.
18
19;; You should have received a copy of the GNU General Public License
20;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
21
22;;; Commentary:
23
24;;; Code:
25
26(require 'ert)
27(require 'cl-lib)
28
29(cl-defgeneric cl--generic-1 (x y))
30(cl-defgeneric (setf cl--generic-1) (v y z) "My generic doc.")
31
32(ert-deftest cl-generic-test-0 ()
33 (cl-defgeneric cl--generic-1 (x y))
34 (cl-defmethod cl--generic-1 ((x t) y) (cons x y))
35 (should (equal (cl--generic-1 'a 'b) '(a . b))))
36
37(ert-deftest cl-generic-test-1-eql ()
38 (cl-defgeneric cl--generic-1 (x y))
39 (cl-defmethod cl--generic-1 ((x t) y) (cons x y))
40 (cl-defmethod cl--generic-1 ((_x (eql 4)) _y)
41 (cons "quatre" (cl-call-next-method)))
42 (cl-defmethod cl--generic-1 ((_x (eql 5)) _y)
43 (cons "cinq" (cl-call-next-method)))
44 (cl-defmethod cl--generic-1 ((_x (eql 6)) y)
45 (cons "six" (cl-call-next-method 'a y)))
46 (should (equal (cl--generic-1 'a nil) '(a)))
47 (should (equal (cl--generic-1 4 nil) '("quatre" 4)))
48 (should (equal (cl--generic-1 5 nil) '("cinq" 5)))
49 (should (equal (cl--generic-1 6 nil) '("six" a))))
50
51(cl-defstruct cl-generic-struct-parent a b)
52(cl-defstruct (cl-generic-struct-child1 (:include cl-generic-struct-parent)) c)
53(cl-defstruct (cl-generic-struct-child11 (:include cl-generic-struct-child1)) d)
54(cl-defstruct (cl-generic-struct-child2 (:include cl-generic-struct-parent)) e)
55
56(ert-deftest cl-generic-test-2-struct ()
57 (cl-defgeneric cl--generic-1 (x y) "My doc.")
58 (cl-defmethod cl--generic-1 ((x t) y) "Doc 1." (cons x y))
59 (cl-defmethod cl--generic-1 ((_x cl-generic-struct-parent) y)
60 "Doc 2." (cons "parent" (cl-call-next-method 'a y)))
61 (cl-defmethod cl--generic-1 ((_x cl-generic-struct-child1) _y)
62 (cons "child1" (cl-call-next-method)))
63 (cl-defmethod cl--generic-1 :around ((_x t) _y)
64 (cons "around" (cl-call-next-method)))
65 (cl-defmethod cl--generic-1 :around ((_x cl-generic-struct-child11) _y)
66 (cons "child11" (cl-call-next-method)))
67 (cl-defmethod cl--generic-1 ((_x cl-generic-struct-child2) _y)
68 (cons "child2" (cl-call-next-method)))
69 (should (equal (cl--generic-1 (make-cl-generic-struct-child1) nil)
70 '("around" "child1" "parent" a)))
71 (should (equal (cl--generic-1 (make-cl-generic-struct-child2) nil)
72 '("around""child2" "parent" a)))
73 (should (equal (cl--generic-1 (make-cl-generic-struct-child11) nil)
74 '("child11" "around""child1" "parent" a))))
75
76(ert-deftest cl-generic-test-3-setf ()
77 (cl-defmethod (setf cl--generic-1) (v (y t) z) (list v y z))
78 (cl-defmethod (setf cl--generic-1) (v (_y (eql 4)) z) (list v "four" z))
79 (should (equal (setf (cl--generic-1 'a 'b) 'v) '(v a b)))
80 (should (equal (setf (cl--generic-1 4 'b) 'v) '(v "four" b)))
81 (let ((x ()))
82 (should (equal (setf (cl--generic-1 (progn (push 1 x) 'a)
83 (progn (push 2 x) 'b))
84 (progn (push 3 x) 'v))
85 '(v a b)))
86 (should (equal x '(3 2 1)))))
87
88(ert-deftest cl-generic-test-4-overlapping-tagcodes ()
89 (cl-defgeneric cl--generic-1 (x y) "My doc.")
90 (cl-defmethod cl--generic-1 ((y t) z) (list y z))
91 (cl-defmethod cl--generic-1 ((_y (eql 4)) _z)
92 (cons "four" (cl-call-next-method)))
93 (cl-defmethod cl--generic-1 ((_y integer) _z)
94 (cons "integer" (cl-call-next-method)))
95 (cl-defmethod cl--generic-1 ((_y number) _z)
96 (cons "number" (cl-call-next-method)))
97 (should (equal (cl--generic-1 'a 'b) '(a b)))
98 (should (equal (cl--generic-1 1 'b) '("integer" "number" 1 b)))
99 (should (equal (cl--generic-1 4 'b) '("four" "integer" "number" 4 b))))
100
101(ert-deftest cl-generic-test-5-alias ()
102 (cl-defgeneric cl--generic-1 (x y) "My doc.")
103 (defalias 'cl--generic-2 #'cl--generic-1)
104 (cl-defmethod cl--generic-1 ((y t) z) (list y z))
105 (cl-defmethod cl--generic-2 ((_y (eql 4)) _z)
106 (cons "four" (cl-call-next-method)))
107 (should (equal (cl--generic-1 4 'b) '("four" 4 b))))
108
109(ert-deftest cl-generic-test-6-multiple-dispatch ()
110 (cl-defgeneric cl--generic-1 (x y) "My doc.")
111 (cl-defmethod cl--generic-1 (x y) (list x y))
112 (cl-defmethod cl--generic-1 (_x (_y integer))
113 (cons "y-int" (cl-call-next-method)))
114 (cl-defmethod cl--generic-1 ((_x integer) _y)
115 (cons "x-int" (cl-call-next-method)))
116 (cl-defmethod cl--generic-1 ((_x integer) (_y integer))
117 (cons "x&y-int" (cl-call-next-method)))
118 (should (equal (cl--generic-1 1 2) '("x&y-int" "x-int" "y-int" 1 2))))
119
120(ert-deftest cl-generic-test-7-apo ()
121 (cl-defgeneric cl--generic-1 (x y)
122 (:documentation "My doc.") (:argument-precedence-order y x))
123 (cl-defmethod cl--generic-1 (x y) (list x y))
124 (cl-defmethod cl--generic-1 (_x (_y integer))
125 (cons "y-int" (cl-call-next-method)))
126 (cl-defmethod cl--generic-1 ((_x integer) _y)
127 (cons "x-int" (cl-call-next-method)))
128 (cl-defmethod cl--generic-1 ((_x integer) (_y integer))
129 (cons "x&y-int" (cl-call-next-method)))
130 (should (equal (cl--generic-1 1 2) '("x&y-int" "y-int" "x-int" 1 2))))
131
132(provide 'cl-generic-tests)
133;;; cl-generic-tests.el ends here
diff --git a/test/automated/eieio-test-methodinvoke.el b/test/automated/eieio-test-methodinvoke.el
index 2de836ceda5..6362fc5a8d9 100644
--- a/test/automated/eieio-test-methodinvoke.el
+++ b/test/automated/eieio-test-methodinvoke.el
@@ -58,12 +58,10 @@
58(defvar eieio-test-method-order-list nil 58(defvar eieio-test-method-order-list nil
59 "List of symbols stored during method invocation.") 59 "List of symbols stored during method invocation.")
60 60
61(defun eieio-test-method-store () 61(defun eieio-test-method-store (keysym)
62 "Store current invocation class symbol in the invocation order list." 62 "Store current invocation class symbol in the invocation order list."
63 (let* ((keysym (aref [ :STATIC :BEFORE :PRIMARY :AFTER ] 63 ;; FIXME: Don't depend on `eieio--scoped-class'!
64 (or eieio--generic-call-key 0))) 64 (let* ((c (list keysym (eieio--class-symbol (eieio--scoped-class)))))
65 ;; FIXME: Don't depend on `eieio--scoped-class'!
66 (c (list keysym (eieio--class-symbol (eieio--scoped-class)))))
67 (push c eieio-test-method-order-list))) 65 (push c eieio-test-method-order-list)))
68 66
69(defun eieio-test-match (rightanswer) 67(defun eieio-test-match (rightanswer)
@@ -88,36 +86,36 @@
88(defclass eitest-B (eitest-B-base1 eitest-B-base2) ()) 86(defclass eitest-B (eitest-B-base1 eitest-B-base2) ())
89 87
90(defmethod eitest-F :BEFORE ((p eitest-B-base1)) 88(defmethod eitest-F :BEFORE ((p eitest-B-base1))
91 (eieio-test-method-store)) 89 (eieio-test-method-store :BEFORE))
92 90
93(defmethod eitest-F :BEFORE ((p eitest-B-base2)) 91(defmethod eitest-F :BEFORE ((p eitest-B-base2))
94 (eieio-test-method-store)) 92 (eieio-test-method-store :BEFORE))
95 93
96(defmethod eitest-F :BEFORE ((p eitest-B)) 94(defmethod eitest-F :BEFORE ((p eitest-B))
97 (eieio-test-method-store)) 95 (eieio-test-method-store :BEFORE))
98 96
99(defmethod eitest-F ((p eitest-B)) 97(defmethod eitest-F ((p eitest-B))
100 (eieio-test-method-store) 98 (eieio-test-method-store :PRIMARY)
101 (call-next-method)) 99 (call-next-method))
102 100
103(defmethod eitest-F ((p eitest-B-base1)) 101(defmethod eitest-F ((p eitest-B-base1))
104 (eieio-test-method-store) 102 (eieio-test-method-store :PRIMARY)
105 (call-next-method)) 103 (call-next-method))
106 104
107(defmethod eitest-F ((p eitest-B-base2)) 105(defmethod eitest-F ((p eitest-B-base2))
108 (eieio-test-method-store) 106 (eieio-test-method-store :PRIMARY)
109 (when (next-method-p) 107 (when (next-method-p)
110 (call-next-method)) 108 (call-next-method))
111 ) 109 )
112 110
113(defmethod eitest-F :AFTER ((p eitest-B-base1)) 111(defmethod eitest-F :AFTER ((p eitest-B-base1))
114 (eieio-test-method-store)) 112 (eieio-test-method-store :AFTER))
115 113
116(defmethod eitest-F :AFTER ((p eitest-B-base2)) 114(defmethod eitest-F :AFTER ((p eitest-B-base2))
117 (eieio-test-method-store)) 115 (eieio-test-method-store :AFTER))
118 116
119(defmethod eitest-F :AFTER ((p eitest-B)) 117(defmethod eitest-F :AFTER ((p eitest-B))
120 (eieio-test-method-store)) 118 (eieio-test-method-store :AFTER))
121 119
122(ert-deftest eieio-test-method-order-list-3 () 120(ert-deftest eieio-test-method-order-list-3 ()
123 (let ((eieio-test-method-order-list nil) 121 (let ((eieio-test-method-order-list nil)
@@ -152,15 +150,15 @@
152;;; Return value from :PRIMARY 150;;; Return value from :PRIMARY
153;; 151;;
154(defmethod eitest-I :BEFORE ((a eitest-A)) 152(defmethod eitest-I :BEFORE ((a eitest-A))
155 (eieio-test-method-store) 153 (eieio-test-method-store :BEFORE)
156 ":before") 154 ":before")
157 155
158(defmethod eitest-I :PRIMARY ((a eitest-A)) 156(defmethod eitest-I :PRIMARY ((a eitest-A))
159 (eieio-test-method-store) 157 (eieio-test-method-store :PRIMARY)
160 ":primary") 158 ":primary")
161 159
162(defmethod eitest-I :AFTER ((a eitest-A)) 160(defmethod eitest-I :AFTER ((a eitest-A))
163 (eieio-test-method-store) 161 (eieio-test-method-store :AFTER)
164 ":after") 162 ":after")
165 163
166(ert-deftest eieio-test-method-order-list-5 () 164(ert-deftest eieio-test-method-order-list-5 ()
@@ -179,17 +177,17 @@
179 177
180;; Just use the obsolete name once, to make sure it also works. 178;; Just use the obsolete name once, to make sure it also works.
181(defmethod constructor :STATIC ((p C-base1) &rest args) 179(defmethod constructor :STATIC ((p C-base1) &rest args)
182 (eieio-test-method-store) 180 (eieio-test-method-store :STATIC)
183 (if (next-method-p) (call-next-method)) 181 (if (next-method-p) (call-next-method))
184 ) 182 )
185 183
186(defmethod eieio-constructor :STATIC ((p C-base2) &rest args) 184(defmethod eieio-constructor :STATIC ((p C-base2) &rest args)
187 (eieio-test-method-store) 185 (eieio-test-method-store :STATIC)
188 (if (next-method-p) (call-next-method)) 186 (if (next-method-p) (call-next-method))
189 ) 187 )
190 188
191(defmethod eieio-constructor :STATIC ((p C) &rest args) 189(defmethod eieio-constructor :STATIC ((p C) &rest args)
192 (eieio-test-method-store) 190 (eieio-test-method-store :STATIC)
193 (call-next-method) 191 (call-next-method)
194 ) 192 )
195 193
@@ -216,24 +214,24 @@
216 214
217(defmethod eitest-F ((p D)) 215(defmethod eitest-F ((p D))
218 "D" 216 "D"
219 (eieio-test-method-store) 217 (eieio-test-method-store :PRIMARY)
220 (call-next-method)) 218 (call-next-method))
221 219
222(defmethod eitest-F ((p D-base0)) 220(defmethod eitest-F ((p D-base0))
223 "D-base0" 221 "D-base0"
224 (eieio-test-method-store) 222 (eieio-test-method-store :PRIMARY)
225 ;; This should have no next 223 ;; This should have no next
226 ;; (when (next-method-p) (call-next-method)) 224 ;; (when (next-method-p) (call-next-method))
227 ) 225 )
228 226
229(defmethod eitest-F ((p D-base1)) 227(defmethod eitest-F ((p D-base1))
230 "D-base1" 228 "D-base1"
231 (eieio-test-method-store) 229 (eieio-test-method-store :PRIMARY)
232 (call-next-method)) 230 (call-next-method))
233 231
234(defmethod eitest-F ((p D-base2)) 232(defmethod eitest-F ((p D-base2))
235 "D-base2" 233 "D-base2"
236 (eieio-test-method-store) 234 (eieio-test-method-store :PRIMARY)
237 (when (next-method-p) 235 (when (next-method-p)
238 (call-next-method)) 236 (call-next-method))
239 ) 237 )
@@ -258,21 +256,21 @@
258(defclass E (E-base1 E-base2) () :method-invocation-order :breadth-first) 256(defclass E (E-base1 E-base2) () :method-invocation-order :breadth-first)
259 257
260(defmethod eitest-F ((p E)) 258(defmethod eitest-F ((p E))
261 (eieio-test-method-store) 259 (eieio-test-method-store :PRIMARY)
262 (call-next-method)) 260 (call-next-method))
263 261
264(defmethod eitest-F ((p E-base0)) 262(defmethod eitest-F ((p E-base0))
265 (eieio-test-method-store) 263 (eieio-test-method-store :PRIMARY)
266 ;; This should have no next 264 ;; This should have no next
267 ;; (when (next-method-p) (call-next-method)) 265 ;; (when (next-method-p) (call-next-method))
268 ) 266 )
269 267
270(defmethod eitest-F ((p E-base1)) 268(defmethod eitest-F ((p E-base1))
271 (eieio-test-method-store) 269 (eieio-test-method-store :PRIMARY)
272 (call-next-method)) 270 (call-next-method))
273 271
274(defmethod eitest-F ((p E-base2)) 272(defmethod eitest-F ((p E-base2))
275 (eieio-test-method-store) 273 (eieio-test-method-store :PRIMARY)
276 (when (next-method-p) 274 (when (next-method-p)
277 (call-next-method)) 275 (call-next-method))
278 ) 276 )
@@ -380,3 +378,21 @@
380 '(CNM-1-1 CNM-2 INIT))) 378 '(CNM-1-1 CNM-2 INIT)))
381 (should (equal (eieio-test-arguments-for 'CNM-2) 379 (should (equal (eieio-test-arguments-for 'CNM-2)
382 '(INIT))))) 380 '(INIT)))))
381
382;;; Check cl-generic integration.
383
384(cl-defgeneric eieio-test--1 (x y))
385
386(ert-deftest eieio-test-cl-generic-1 ()
387 (cl-defmethod eieio-test--1 (x y) (list x y))
388 (cl-defmethod eieio-test--1 ((_x CNM-0) y)
389 (cons "CNM-0" (cl-call-next-method 7 y)))
390 (cl-defmethod eieio-test--1 ((_x CNM-1-1) _y)
391 (cons "CNM-1-1" (cl-call-next-method)))
392 (cl-defmethod eieio-test--1 ((_x CNM-1-2) y)
393 (cons "CNM-1-2" (cl-call-next-method)))
394 (should (equal (eieio-test--1 4 5) '(4 5)))
395 (should (equal (eieio-test--1 (make-instance 'CNM-0) 5)
396 '("CNM-0" 7 5)))
397 (should (equal (eieio-test--1 (make-instance 'CNM-2) 5)
398 '("CNM-1-1" "CNM-1-2" "CNM-0" 7 5))))