aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorStefan Monnier2015-01-14 14:37:10 -0500
committerStefan Monnier2015-01-14 14:37:10 -0500
commit9def17e92bbb61e877bf092b562a92946cf43210 (patch)
tree5af1af25989bb45fcf7029fbf9ebf66281466232 /test
parente7db8e8d5de70be5e047c961cdfbf692d52e33c6 (diff)
downloademacs-9def17e92bbb61e877bf092b562a92946cf43210.tar.gz
emacs-9def17e92bbb61e877bf092b562a92946cf43210.zip
* lisp/emacs-lisp/cl-generic.el: New file.
* lisp/emacs-lisp/cl-macs.el (cl-flet): Allow (FUN EXP) forms. (cl-load-time-value, cl-labels): Use closures rather than backquoted lambdas. (cl-macrolet): Use `eval' to create the function value, and support CL style arguments in for the defined macros. * test/automated/cl-generic-tests.el: New file.
Diffstat (limited to 'test')
-rw-r--r--test/ChangeLog4
-rw-r--r--test/automated/cl-generic-tests.el131
2 files changed, 135 insertions, 0 deletions
diff --git a/test/ChangeLog b/test/ChangeLog
index 83bb8bf00c7..211a06c2cbd 100644
--- a/test/ChangeLog
+++ b/test/ChangeLog
@@ -1,3 +1,7 @@
12015-01-14 Stefan Monnier <monnier@iro.umontreal.ca>
2
3 * automated/cl-generic-tests.el: New file.
4
12015-01-08 Stefan Monnier <monnier@iro.umontreal.ca> 52015-01-08 Stefan Monnier <monnier@iro.umontreal.ca>
2 6
3 * automated/eieio-tests.el (eieio-test-23-inheritance-check): Don't use 7 * 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..5c5e5d1c7ce
--- /dev/null
+++ b/test/automated/cl-generic-tests.el
@@ -0,0 +1,131 @@
1;;; cl-generic-tests.el --- Tests for cl-generic.el functionality -*- lexical-binding: t; -*-
2
3;; Copyright (C) 2015 Stefan Monnier
4
5;; Author: Stefan Monnier <monnier@iro.umontreal.ca>
6
7;; This program is free software; you can redistribute it and/or modify
8;; it under the terms of the GNU General Public License as published by
9;; the Free Software Foundation, either version 3 of the License, or
10;; (at your option) any later version.
11
12;; This program is distributed in the hope that it will be useful,
13;; but WITHOUT ANY WARRANTY; without even the implied warranty of
14;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15;; GNU General Public License for more details.
16
17;; You should have received a copy of the GNU General Public License
18;; along with this program. If not, see <http://www.gnu.org/licenses/>.
19
20;;; Commentary:
21
22;;; Code:
23
24(require 'ert)
25(require 'cl-lib)
26
27(cl-defgeneric cl--generic-1 (x y))
28(cl-defgeneric (setf cl--generic-1) (v y z) "My generic doc.")
29
30(ert-deftest cl-generic-test-0 ()
31 (cl-defgeneric cl--generic-1 (x y))
32 (cl-defmethod cl--generic-1 ((x t) y) (cons x y))
33 (should (equal (cl--generic-1 'a 'b) '(a . b))))
34
35(ert-deftest cl-generic-test-1-eql ()
36 (cl-defgeneric cl--generic-1 (x y))
37 (cl-defmethod cl--generic-1 ((x t) y) (cons x y))
38 (cl-defmethod cl--generic-1 ((_x (eql 4)) _y)
39 (cons "quatre" (cl-call-next-method)))
40 (cl-defmethod cl--generic-1 ((_x (eql 5)) _y)
41 (cons "cinq" (cl-call-next-method)))
42 (cl-defmethod cl--generic-1 ((_x (eql 6)) y)
43 (cons "six" (cl-call-next-method 'a y)))
44 (should (equal (cl--generic-1 'a nil) '(a)))
45 (should (equal (cl--generic-1 4 nil) '("quatre" 4)))
46 (should (equal (cl--generic-1 5 nil) '("cinq" 5)))
47 (should (equal (cl--generic-1 6 nil) '("six" a))))
48
49(cl-defstruct cl-generic-struct-parent a b)
50(cl-defstruct (cl-generic-struct-child1 (:include cl-generic-struct-parent)) c)
51(cl-defstruct (cl-generic-struct-child11 (:include cl-generic-struct-child1)) d)
52(cl-defstruct (cl-generic-struct-child2 (:include cl-generic-struct-parent)) e)
53
54(ert-deftest cl-generic-test-2-struct ()
55 (cl-defgeneric cl--generic-1 (x y) "My doc.")
56 (cl-defmethod cl--generic-1 ((x t) y) "Doc 1." (cons x y))
57 (cl-defmethod cl--generic-1 ((_x cl-generic-struct-parent) y)
58 "Doc 2." (cons "parent" (cl-call-next-method 'a y)))
59 (cl-defmethod cl--generic-1 ((_x cl-generic-struct-child1) _y)
60 (cons "child1" (cl-call-next-method)))
61 (cl-defmethod cl--generic-1 :around ((_x t) _y)
62 (cons "around" (cl-call-next-method)))
63 (cl-defmethod cl--generic-1 :around ((_x cl-generic-struct-child11) _y)
64 (cons "child11" (cl-call-next-method)))
65 (cl-defmethod cl--generic-1 ((_x cl-generic-struct-child2) _y)
66 (cons "child2" (cl-call-next-method)))
67 (should (equal (cl--generic-1 (make-cl-generic-struct-child1) nil)
68 '("around" "child1" "parent" a)))
69 (should (equal (cl--generic-1 (make-cl-generic-struct-child2) nil)
70 '("around""child2" "parent" a)))
71 (should (equal (cl--generic-1 (make-cl-generic-struct-child11) nil)
72 '("child11" "around""child1" "parent" a))))
73
74(ert-deftest cl-generic-test-3-setf ()
75 (cl-defmethod (setf cl--generic-1) (v (y t) z) (list v y z))
76 (cl-defmethod (setf cl--generic-1) (v (_y (eql 4)) z) (list v "four" z))
77 (should (equal (setf (cl--generic-1 'a 'b) 'v) '(v a b)))
78 (should (equal (setf (cl--generic-1 4 'b) 'v) '(v "four" b)))
79 (let ((x ()))
80 (should (equal (setf (cl--generic-1 (progn (push 1 x) 'a)
81 (progn (push 2 x) 'b))
82 (progn (push 3 x) 'v))
83 '(v a b)))
84 (should (equal x '(3 2 1)))))
85
86(ert-deftest cl-generic-test-4-overlapping-tagcodes ()
87 (cl-defgeneric cl--generic-1 (x y) "My doc.")
88 (cl-defmethod cl--generic-1 ((y t) z) (list y z))
89 (cl-defmethod cl--generic-1 ((_y (eql 4)) _z)
90 (cons "four" (cl-call-next-method)))
91 (cl-defmethod cl--generic-1 ((_y integer) _z)
92 (cons "integer" (cl-call-next-method)))
93 (cl-defmethod cl--generic-1 ((_y number) _z)
94 (cons "number" (cl-call-next-method)))
95 (should (equal (cl--generic-1 'a 'b) '(a b)))
96 (should (equal (cl--generic-1 1 'b) '("integer" "number" 1 b)))
97 (should (equal (cl--generic-1 4 'b) '("four" "integer" "number" 4 b))))
98
99(ert-deftest cl-generic-test-5-alias ()
100 (cl-defgeneric cl--generic-1 (x y) "My doc.")
101 (defalias 'cl--generic-2 #'cl--generic-1)
102 (cl-defmethod cl--generic-1 ((y t) z) (list y z))
103 (cl-defmethod cl--generic-2 ((_y (eql 4)) _z)
104 (cons "four" (cl-call-next-method)))
105 (should (equal (cl--generic-1 4 'b) '("four" 4 b))))
106
107(ert-deftest cl-generic-test-6-multiple-dispatch ()
108 (cl-defgeneric cl--generic-1 (x y) "My doc.")
109 (cl-defmethod cl--generic-1 (x y) (list x y))
110 (cl-defmethod cl--generic-1 (_x (_y integer))
111 (cons "y-int" (cl-call-next-method)))
112 (cl-defmethod cl--generic-1 ((_x integer) _y)
113 (cons "x-int" (cl-call-next-method)))
114 (cl-defmethod cl--generic-1 ((_x integer) (_y integer))
115 (cons "x&y-int" (cl-call-next-method)))
116 (should (equal (cl--generic-1 1 2) '("x&y-int" "x-int" "y-int" 1 2))))
117
118(ert-deftest cl-generic-test-7-apo ()
119 (cl-defgeneric cl--generic-1 (x y)
120 (:documentation "My doc.") (:argument-precedence-order y x))
121 (cl-defmethod cl--generic-1 (x y) (list x y))
122 (cl-defmethod cl--generic-1 (_x (_y integer))
123 (cons "y-int" (cl-call-next-method)))
124 (cl-defmethod cl--generic-1 ((_x integer) _y)
125 (cons "x-int" (cl-call-next-method)))
126 (cl-defmethod cl--generic-1 ((_x integer) (_y integer))
127 (cons "x&y-int" (cl-call-next-method)))
128 (should (equal (cl--generic-1 1 2) '("x&y-int" "y-int" "x-int" 1 2))))
129
130(provide 'cl-generic-tests)
131;;; cl-generic-tests.el ends here