aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Monnier2024-01-18 14:00:15 -0500
committerStefan Monnier2024-01-18 14:00:54 -0500
commitb07a86abb6d5bb3d5cd178bb77592ad7208882f5 (patch)
treeacc5209c2c0baf2f146a2abf8a65b2856e2313db
parente7a6ce847fd06c4f132bbac2f2fdc8474753ad3c (diff)
downloademacs-b07a86abb6d5bb3d5cd178bb77592ad7208882f5.tar.gz
emacs-b07a86abb6d5bb3d5cd178bb77592ad7208882f5.zip
* test/lisp/emacs-lisp/comp-cstr-tests.el: Use macros in a simpler way
(comp-cstr-test-ts): Move out of `cl-eval-when`. (comp-cstr-typespec-test): Delete. (comp-cstr-synthesize-tests): Make it take the tests as an argument. (comp-cstr-typespec-tests-alist): Delete var, pass its value to the macro instead.
-rw-r--r--test/lisp/emacs-lisp/comp-cstr-tests.el414
1 files changed, 204 insertions, 210 deletions
diff --git a/test/lisp/emacs-lisp/comp-cstr-tests.el b/test/lisp/emacs-lisp/comp-cstr-tests.el
index fb1770f1f4a..edc70b12d4b 100644
--- a/test/lisp/emacs-lisp/comp-cstr-tests.el
+++ b/test/lisp/emacs-lisp/comp-cstr-tests.el
@@ -29,218 +29,212 @@
29(require 'cl-lib) 29(require 'cl-lib)
30(require 'comp-cstr) 30(require 'comp-cstr)
31 31
32(cl-eval-when (compile eval load) 32(defun comp-cstr-test-ts (type-spec)
33 33 "Create a constraint from TYPE-SPEC and convert it back to type specifier."
34 (defun comp-cstr-test-ts (type-spec) 34 (let ((comp-ctxt (make-comp-cstr-ctxt)))
35 "Create a constraint from TYPE-SPEC and convert it back to type specifier." 35 (comp-cstr-to-type-spec (comp-type-spec-to-cstr type-spec))))
36 (let ((comp-ctxt (make-comp-cstr-ctxt))) 36
37 (comp-cstr-to-type-spec (comp-type-spec-to-cstr type-spec)))) 37(defmacro comp-cstr-synthesize-tests (typespec-tests-alist)
38 38 "Generate all tests from TYPESPEC-TESTS-ALIST.
39 (defun comp-cstr-typespec-test (number type-spec expected-type-spec) 39The arg is an alist of: type specifier -> expected type specifier."
40 `(ert-deftest ,(intern (concat "comp-cstr-test-" (int-to-string number))) ()
41 (should (equal (comp-cstr-test-ts ',type-spec)
42 ',expected-type-spec))))
43
44 (defconst comp-cstr-typespec-tests-alist
45 '(;; 1
46 (symbol . symbol)
47 ;; 2
48 ((or string array) . array)
49 ;; 3
50 ((or symbol number) . (or number symbol))
51 ;; 4
52 ((or cons atom) . t) ;; SBCL return T
53 ;; 5
54 ((or integer number) . number)
55 ;; 6
56 ((or (or integer symbol) number) . (or number symbol))
57 ;; 7
58 ((or (or integer symbol) (or number list)) . (or list number symbol))
59 ;; 8
60 ((or (or integer number) nil) . number)
61 ;; 9
62 ((member foo) . (member foo))
63 ;; 10
64 ((member foo bar) . (member bar foo))
65 ;; 11
66 ((or (member foo) (member bar)) . (member bar foo))
67 ;; 12
68 ((or (member foo) symbol) . symbol) ;; SBCL return (OR SYMBOL (MEMBER FOO))
69 ;; 13
70 ((or (member foo) number) . (or (member foo) number))
71 ;; 14
72 ((or (integer 1 3) number) . number)
73 ;; 15
74 (integer . integer)
75 ;; 16
76 ((integer 1 2) . (integer 1 2))
77 ;; 17
78 ((or (integer -1 0) (integer 3 4)) . (or (integer -1 0) (integer 3 4)))
79 ;; 18
80 ((or (integer -1 2) (integer 3 4)) . (integer -1 4))
81 ;; 19
82 ((or (integer -1 3) (integer 3 4)) . (integer -1 4))
83 ;; 20
84 ((or (integer -1 4) (integer 3 4)) . (integer -1 4))
85 ;; 21
86 ((or (integer -1 5) (integer 3 4)) . (integer -1 5))
87 ;; 22
88 ((or (integer -1 *) (integer 3 4)) . (integer -1 *))
89 ;; 23
90 ((or (integer -1 2) (integer * 4)) . (integer * 4))
91 ;; 24
92 ((and string array) . string)
93 ;; 25
94 ((and cons atom) . nil)
95 ;; 26
96 ((and (member foo) (member foo bar baz)) . (member foo))
97 ;; 27
98 ((and (member foo) (member bar)) . nil)
99 ;; 28
100 ((and (member foo) symbol) . (member foo))
101 ;; 29
102 ((and (member foo) string) . nil)
103 ;; 30
104 ((and (member foo) (integer 1 2)) . nil)
105 ;; 31
106 ((and (member 1 2) (member 3 2)) . (integer 2 2))
107 ;; 32
108 ((and number (integer 1 2)) . (integer 1 2))
109 ;; 33
110 ((and integer (integer 1 2)) . (integer 1 2))
111 ;; 34
112 ((and (integer -1 0) (integer 3 5)) . nil)
113 ;; 35
114 ((and (integer -1 2) (integer 3 5)) . nil)
115 ;; 36
116 ((and (integer -1 3) (integer 3 5)) . (integer 3 3))
117 ;; 37
118 ((and (integer -1 4) (integer 3 5)) . (integer 3 4))
119 ;; 38
120 ((and (integer -1 5) nil) . nil)
121 ;; 39
122 ((not symbol) . (not symbol))
123 ;; 40
124 ((or (member foo) (not (member foo bar))) . (not (member bar)))
125 ;; 41
126 ((or (member foo bar) (not (member foo))) . t)
127 ;; 42
128 ((or symbol (not sequence)) . (not sequence))
129 ;; 43
130 ((or symbol (not symbol)) . t)
131 ;; 44
132 ((or symbol (not sequence)) . (not sequence))
133 ;; 45 Conservative.
134 ((or vector (not sequence)) . t)
135 ;; 46
136 ((or (integer 1 10) (not (integer * 5))) . (not (integer * 0)))
137 ;; 47
138 ((or symbol (integer 1 10) (not (integer * 5))) . (not (integer * 0)))
139 ;; 48
140 ((or (not symbol) (integer 1 10) (not (integer * 5))) . (not (or symbol (integer * 0))))
141 ;; 49
142 ((or symbol (not (member foo))) . (not (member foo)))
143 ;; 50
144 ((or (not symbol) (not (member foo))) . (not symbol))
145 ;; 51 Conservative.
146 ((or (not (member foo)) string) . (not (member foo)))
147 ;; 52 Conservative.
148 ((or (member foo) (not string)) . (not string))
149 ;; 53
150 ((or (not (integer 1 2)) integer) . t)
151 ;; 54
152 ((or (not (integer 1 2)) (not integer)) . (not integer))
153 ;; 55
154 ((or (integer 1 2) (not integer)) . (not (or (integer * 0) (integer 3 *))))
155 ;; 56
156 ((or number (not (integer 1 2))) . t)
157 ;; 57
158 ((or atom (not (integer 1 2))) . t)
159 ;; 58
160 ((or atom (not (member foo))) . t)
161 ;; 59
162 ((and symbol (not cons)) . symbol)
163 ;; 60
164 ((and symbol (not symbol)) . nil)
165 ;; 61
166 ((and atom (not symbol)) . atom)
167 ;; 62
168 ((and atom (not string)) . (or array sequence atom))
169 ;; 63 Conservative
170 ((and symbol (not (member foo))) . symbol)
171 ;; 64 Conservative
172 ((and symbol (not (member 3))) . symbol)
173 ;; 65
174 ((and (not (member foo)) (integer 1 10)) . (integer 1 10))
175 ;; 66
176 ((and (member foo) (not (integer 1 10))) . (member foo))
177 ;; 67
178 ((and t (not (member foo))) . (not (member foo)))
179 ;; 68
180 ((and integer (not (integer 3 4))) . (or (integer * 2) (integer 5 *)))
181 ;; 69
182 ((and (integer 0 20) (not (integer 5 10))) . (or (integer 0 4) (integer 11 20)))
183 ;; 70
184 ((and (not (member a)) (not (member b))) . (not (member a b)))
185 ;; 71
186 ((and (not boolean) (not (member b))) . (not (or (member b) boolean)))
187 ;; 72
188 ((and t (integer 1 1)) . (integer 1 1))
189 ;; 73
190 ((not (integer -1 5)) . (not (integer -1 5)))
191 ;; 74
192 ((and boolean (or number marker)) . nil)
193 ;; 75
194 ((and atom (or number marker)) . number-or-marker)
195 ;; 76
196 ((and symbol (or number marker)) . nil)
197 ;; 77
198 ((and (or symbol string) (or number marker)) . nil)
199 ;; 78
200 ((and t t) . t)
201 ;; 79
202 ((and (or marker number) (integer 0 0)) . (integer 0 0))
203 ;; 80
204 ((and t (not t)) . nil)
205 ;; 81
206 ((or (integer 1 1) (not (integer 1 1))) . t)
207 ;; 82
208 ((not t) . nil)
209 ;; 83
210 ((not nil) . t)
211 ;; 84
212 ((or (not string) t) . t)
213 ;; 85
214 ((or (not vector) sequence) . sequence)
215 ;; 86
216 ((or (not symbol) null) . t)
217 ;; 87
218 ((and (or null integer) (not (or null integer))) . nil)
219 ;; 88
220 ((and (or (member a b c)) (not (or (member a b)))) . (member c))
221 ;; 89
222 ((or cons symbol) . (or list symbol)) ;; FIXME: Why `list'?
223 ;; 90
224 ((or string char-table bool-vector vector) . array)
225 ;; 91
226 ((or string char-table bool-vector vector number) . (or array number))
227 ;; 92
228 ((or string char-table bool-vector vector cons symbol number) .
229 (or number sequence symbol))
230 ;; 93?
231 ;; FIXME: I get `cons' rather than `list'?
232 ;;((or null cons) . list)
233 )
234 "Alist type specifier -> expected type specifier."))
235
236(defmacro comp-cstr-synthesize-tests ()
237 "Generate all tests from `comp-cstr-typespec-tests-alist'."
238 `(progn 40 `(progn
239 ,@(cl-loop 41 ,@(cl-loop
240 for i from 1 42 for i from 1
241 for (ts . exp-ts) in comp-cstr-typespec-tests-alist 43 for (type-spec . expected-type-spec) in typespec-tests-alist
242 append (list (comp-cstr-typespec-test i ts exp-ts))))) 44 collect
243 45 `(ert-deftest ,(intern (format "comp-cstr-test-%d" i)) ()
244(comp-cstr-synthesize-tests) 46 (should (equal (comp-cstr-test-ts ',type-spec)
47 ',expected-type-spec))))))
48
49(comp-cstr-synthesize-tests
50 (;; 1
51 (symbol . symbol)
52 ;; 2
53 ((or string array) . array)
54 ;; 3
55 ((or symbol number) . (or number symbol))
56 ;; 4
57 ((or cons atom) . t) ;; Like SBCL
58 ;; 5
59 ((or integer number) . number)
60 ;; 6
61 ((or (or integer symbol) number) . (or number symbol))
62 ;; 7
63 ((or (or integer symbol) (or number list)) . (or list number symbol))
64 ;; 8
65 ((or (or integer number) nil) . number)
66 ;; 9
67 ((member foo) . (member foo))
68 ;; 10
69 ((member foo bar) . (member bar foo))
70 ;; 11
71 ((or (member foo) (member bar)) . (member bar foo))
72 ;; 12
73 ((or (member foo) symbol) . symbol) ;; SBCL return (OR SYMBOL (MEMBER FOO))
74 ;; 13
75 ((or (member foo) number) . (or (member foo) number))
76 ;; 14
77 ((or (integer 1 3) number) . number)
78 ;; 15
79 (integer . integer)
80 ;; 16
81 ((integer 1 2) . (integer 1 2))
82 ;; 17
83 ((or (integer -1 0) (integer 3 4)) . (or (integer -1 0) (integer 3 4)))
84 ;; 18
85 ((or (integer -1 2) (integer 3 4)) . (integer -1 4))
86 ;; 19
87 ((or (integer -1 3) (integer 3 4)) . (integer -1 4))
88 ;; 20
89 ((or (integer -1 4) (integer 3 4)) . (integer -1 4))
90 ;; 21
91 ((or (integer -1 5) (integer 3 4)) . (integer -1 5))
92 ;; 22
93 ((or (integer -1 *) (integer 3 4)) . (integer -1 *))
94 ;; 23
95 ((or (integer -1 2) (integer * 4)) . (integer * 4))
96 ;; 24
97 ((and string array) . string)
98 ;; 25
99 ((and cons atom) . nil)
100 ;; 26
101 ((and (member foo) (member foo bar baz)) . (member foo))
102 ;; 27
103 ((and (member foo) (member bar)) . nil)
104 ;; 28
105 ((and (member foo) symbol) . (member foo))
106 ;; 29
107 ((and (member foo) string) . nil)
108 ;; 30
109 ((and (member foo) (integer 1 2)) . nil)
110 ;; 31
111 ((and (member 1 2) (member 3 2)) . (integer 2 2))
112 ;; 32
113 ((and number (integer 1 2)) . (integer 1 2))
114 ;; 33
115 ((and integer (integer 1 2)) . (integer 1 2))
116 ;; 34
117 ((and (integer -1 0) (integer 3 5)) . nil)
118 ;; 35
119 ((and (integer -1 2) (integer 3 5)) . nil)
120 ;; 36
121 ((and (integer -1 3) (integer 3 5)) . (integer 3 3))
122 ;; 37
123 ((and (integer -1 4) (integer 3 5)) . (integer 3 4))
124 ;; 38
125 ((and (integer -1 5) nil) . nil)
126 ;; 39
127 ((not symbol) . (not symbol))
128 ;; 40
129 ((or (member foo) (not (member foo bar))) . (not (member bar)))
130 ;; 41
131 ((or (member foo bar) (not (member foo))) . t)
132 ;; 42
133 ((or symbol (not sequence)) . (not sequence))
134 ;; 43
135 ((or symbol (not symbol)) . t)
136 ;; 44
137 ((or symbol (not sequence)) . (not sequence))
138 ;; 45 Conservative.
139 ((or vector (not sequence)) . t)
140 ;; 46
141 ((or (integer 1 10) (not (integer * 5))) . (not (integer * 0)))
142 ;; 47
143 ((or symbol (integer 1 10) (not (integer * 5))) . (not (integer * 0)))
144 ;; 48
145 ((or (not symbol) (integer 1 10) (not (integer * 5))) . (not (or symbol (integer * 0))))
146 ;; 49
147 ((or symbol (not (member foo))) . (not (member foo)))
148 ;; 50
149 ((or (not symbol) (not (member foo))) . (not symbol))
150 ;; 51 Conservative.
151 ((or (not (member foo)) string) . (not (member foo)))
152 ;; 52 Conservative.
153 ((or (member foo) (not string)) . (not string))
154 ;; 53
155 ((or (not (integer 1 2)) integer) . t)
156 ;; 54
157 ((or (not (integer 1 2)) (not integer)) . (not integer))
158 ;; 55
159 ((or (integer 1 2) (not integer)) . (not (or (integer * 0) (integer 3 *))))
160 ;; 56
161 ((or number (not (integer 1 2))) . t)
162 ;; 57
163 ((or atom (not (integer 1 2))) . t)
164 ;; 58
165 ((or atom (not (member foo))) . t)
166 ;; 59
167 ((and symbol (not cons)) . symbol)
168 ;; 60
169 ((and symbol (not symbol)) . nil)
170 ;; 61
171 ((and atom (not symbol)) . atom)
172 ;; 62
173 ((and atom (not string)) . (or array sequence atom))
174 ;; 63 Conservative
175 ((and symbol (not (member foo))) . symbol)
176 ;; 64 Conservative
177 ((and symbol (not (member 3))) . symbol)
178 ;; 65
179 ((and (not (member foo)) (integer 1 10)) . (integer 1 10))
180 ;; 66
181 ((and (member foo) (not (integer 1 10))) . (member foo))
182 ;; 67
183 ((and t (not (member foo))) . (not (member foo)))
184 ;; 68
185 ((and integer (not (integer 3 4))) . (or (integer * 2) (integer 5 *)))
186 ;; 69
187 ((and (integer 0 20) (not (integer 5 10))) . (or (integer 0 4) (integer 11 20)))
188 ;; 70
189 ((and (not (member a)) (not (member b))) . (not (member a b)))
190 ;; 71
191 ((and (not boolean) (not (member b))) . (not (or (member b) boolean)))
192 ;; 72
193 ((and t (integer 1 1)) . (integer 1 1))
194 ;; 73
195 ((not (integer -1 5)) . (not (integer -1 5)))
196 ;; 74
197 ((and boolean (or number marker)) . nil)
198 ;; 75
199 ((and atom (or number marker)) . number-or-marker)
200 ;; 76
201 ((and symbol (or number marker)) . nil)
202 ;; 77
203 ((and (or symbol string) (or number marker)) . nil)
204 ;; 78
205 ((and t t) . t)
206 ;; 79
207 ((and (or marker number) (integer 0 0)) . (integer 0 0))
208 ;; 80
209 ((and t (not t)) . nil)
210 ;; 81
211 ((or (integer 1 1) (not (integer 1 1))) . t)
212 ;; 82
213 ((not t) . nil)
214 ;; 83
215 ((not nil) . t)
216 ;; 84
217 ((or (not string) t) . t)
218 ;; 85
219 ((or (not vector) sequence) . sequence)
220 ;; 86
221 ((or (not symbol) null) . t)
222 ;; 87
223 ((and (or null integer) (not (or null integer))) . nil)
224 ;; 88
225 ((and (or (member a b c)) (not (or (member a b)))) . (member c))
226 ;; 89
227 ((or cons symbol) . (or list symbol)) ;; FIXME: Why `list'?
228 ;; 90
229 ((or string char-table bool-vector vector) . array)
230 ;; 91
231 ((or string char-table bool-vector vector number) . (or array number))
232 ;; 92
233 ((or string char-table bool-vector vector cons symbol number) .
234 (or number sequence symbol))
235 ;; 93?
236 ;; FIXME: I get `cons' rather than `list'?
237 ;;((or null cons) . list)
238 ))
245 239
246;;; comp-cstr-tests.el ends here 240;;; comp-cstr-tests.el ends here