]> code.delx.au - gnu-emacs/blob - test/automated/map-tests.el
9a0d99e04de84b8bb80da42452b664a9eb406de0
[gnu-emacs] / test / automated / map-tests.el
1 ;;; map-tests.el --- Tests for map.el
2
3 ;; Copyright (C) 2015 Free Software Foundation, Inc.
4
5 ;; Author: Nicolas Petton <nicolas@petton.fr>
6 ;; Maintainer: emacs-devel@gnu.org
7
8 ;; This file is part of GNU Emacs.
9
10 ;; GNU Emacs is free software: you can redistribute it and/or modify
11 ;; it under the terms of the GNU General Public License as published by
12 ;; the Free Software Foundation, either version 3 of the License, or
13 ;; (at your option) any later version.
14
15 ;; GNU Emacs is distributed in the hope that it will be useful,
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 ;; GNU General Public License for more details.
19
20 ;; You should have received a copy of the GNU General Public License
21 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
22
23 ;;; Commentary:
24
25 ;; Tests for map.el
26
27 ;;; Code:
28
29 (require 'ert)
30 (require 'map)
31
32 (defmacro with-maps-do (var &rest body)
33 "Successively bind VAR to an alist, vector and hash-table.
34 Each map is built from the following alist data:
35 '((0 . 3) (1 . 4) (2 . 5)).
36 Evaluate BODY for each created map.
37
38 \(fn (var map) body)"
39 (declare (indent 1) (debug t))
40 (let ((alist (make-symbol "alist"))
41 (vec (make-symbol "vec"))
42 (ht (make-symbol "ht")))
43 `(let ((,alist '((0 . 3)
44 (1 . 4)
45 (2 . 5)))
46 (,vec (make-vector 3 nil))
47 (,ht (make-hash-table)))
48 (aset ,vec 0 '3)
49 (aset ,vec 1 '4)
50 (aset ,vec 2 '5)
51 (puthash '0 3 ,ht)
52 (puthash '1 4 ,ht)
53 (puthash '2 5 ,ht)
54 (dolist (,var (list ,alist ,vec ,ht))
55 ,@body))))
56
57 (ert-deftest test-map-elt ()
58 (with-maps-do map
59 (assert (= 3 (map-elt map 0)))
60 (assert (= 4 (map-elt map 1)))
61 (assert (= 5 (map-elt map 2)))
62 (assert (null (map-elt map 4)))))
63
64 (ert-deftest test-map-elt-default ()
65 (with-maps-do map
66 (assert (= 5 (map-elt map 7 5)))))
67
68 (ert-deftest test-map-put ()
69 (with-maps-do map
70 (map-put map 2 'hello)
71 (assert (eq (map-elt map 2) 'hello)))
72 (let ((ht (make-hash-table)))
73 (map-put ht 2 'a)
74 (assert (eq (map-elt ht 2)
75 'a)))
76 (let ((alist '((0 . a) (1 . b) (2 . c))))
77 (map-put alist 2 'a)
78 (assert (eq (map-elt alist 2)
79 'a)))
80 (let ((vec [3 4 5]))
81 (should-error (map-put vec 3 6))))
82
83 (ert-deftest test-map-put-literal ()
84 (assert (= (map-elt (map-put [1 2 3] 1 4) 1)
85 4))
86 (assert (= (map-elt (map-put (make-hash-table) 'a 2) 'a)
87 2))
88 (should-error (map-put '((a . 1)) 'b 2))
89 (should-error (map-put '() 'a 1)))
90
91 (ert-deftest test-map-put-return-value ()
92 (let ((ht (make-hash-table)))
93 (assert (eq (map-put ht 'a 'hello) ht))))
94
95 (ert-deftest test-map-delete ()
96 (with-maps-do map
97 (map-delete map 1)
98 (assert (null (map-elt map 1)))))
99
100 (ert-deftest test-map-delete-return-value ()
101 (let ((ht (make-hash-table)))
102 (assert (eq (map-delete ht 'a) ht))))
103
104 (ert-deftest test-map-nested-elt ()
105 (let ((vec [a b [c d [e f]]]))
106 (assert (eq (map-nested-elt vec '(2 2 0)) 'e)))
107 (let ((alist '((a . 1)
108 (b . ((c . 2)
109 (d . 3)
110 (e . ((f . 4)
111 (g . 5))))))))
112 (assert (eq (map-nested-elt alist '(b e f))
113 4)))
114 (let ((ht (make-hash-table)))
115 (map-put ht 'a 1)
116 (map-put ht 'b (make-hash-table))
117 (map-put (map-elt ht 'b) 'c 2)
118 (assert (eq (map-nested-elt ht '(b c))
119 2))))
120
121 (ert-deftest test-map-nested-elt-default ()
122 (let ((vec [a b [c d]]))
123 (assert (null (map-nested-elt vec '(2 3))))
124 (assert (null (map-nested-elt vec '(2 1 1))))
125 (assert (= 4 (map-nested-elt vec '(2 1 1) 4)))))
126
127 (ert-deftest test-map-p ()
128 (assert (map-p nil))
129 (assert (map-p '((a . b) (c . d))))
130 (assert (map-p '(a b c d)))
131 (assert (map-p []))
132 (assert (map-p [1 2 3]))
133 (assert (map-p (make-hash-table)))
134 (assert (map-p "hello"))
135 (assert (not (map-p 1)))
136 (assert (not (map-p 'hello))))
137
138 (ert-deftest test-map-keys ()
139 (with-maps-do map
140 (assert (equal (map-keys map) '(0 1 2))))
141 (assert (null (map-keys nil)))
142 (assert (null (map-keys []))))
143
144 (ert-deftest test-map-values ()
145 (with-maps-do map
146 (assert (equal (map-values map) '(3 4 5)))))
147
148 (ert-deftest test-map-pairs ()
149 (with-maps-do map
150 (assert (equal (map-pairs map) '((0 . 3)
151 (1 . 4)
152 (2 . 5))))))
153
154 (ert-deftest test-map-length ()
155 (let ((ht (make-hash-table)))
156 (puthash 'a 1 ht)
157 (puthash 'b 2 ht)
158 (puthash 'c 3 ht)
159 (puthash 'd 4 ht)
160 (assert (= 0 (map-length nil)))
161 (assert (= 0 (map-length [])))
162 (assert (= 0 (map-length (make-hash-table))))
163 (assert (= 5 (map-length [0 1 2 3 4])))
164 (assert (= 2 (map-length '((a . 1) (b . 2)))))
165 (assert (= 4 (map-length ht)))))
166
167 (ert-deftest test-map-copy ()
168 (with-maps-do map
169 (let ((copy (map-copy map)))
170 (assert (equal (map-keys map) (map-keys copy)))
171 (assert (equal (map-values map) (map-values copy)))
172 (assert (not (eq map copy))))))
173
174 (ert-deftest test-map-apply ()
175 (with-maps-do map
176 (assert (equal (map-apply (lambda (k v) (cons (int-to-string k) v))
177 map)
178 '(("0" . 3) ("1" . 4) ("2" . 5)))))
179 (let ((vec [a b c]))
180 (assert (equal (map-apply (lambda (k v) (cons (1+ k) v))
181 vec)
182 '((1 . a)
183 (2 . b)
184 (3 . c))))))
185
186 (ert-deftest test-map-keys-apply ()
187 (with-maps-do map
188 (assert (equal (map-keys-apply (lambda (k) (int-to-string k))
189 map)
190 '("0" "1" "2"))))
191 (let ((vec [a b c]))
192 (assert (equal (map-keys-apply (lambda (k) (1+ k))
193 vec)
194 '(1 2 3)))))
195
196 (ert-deftest test-map-values-apply ()
197 (with-maps-do map
198 (assert (equal (map-values-apply (lambda (v) (1+ v))
199 map)
200 '(4 5 6))))
201 (let ((vec [a b c]))
202 (assert (equal (map-values-apply (lambda (v) (symbol-name v))
203 vec)
204 '("a" "b" "c")))))
205
206 (ert-deftest test-map-filter ()
207 (with-maps-do map
208 (assert (equal (map-keys (map-filter (lambda (k v)
209 (<= 4 v))
210 map))
211 '(1 2)))
212 (assert (null (map-filter (lambda (k v)
213 (eq 'd k))
214 map))))
215 (assert (null (map-filter (lambda (k v)
216 (eq 3 v))
217 [1 2 4 5])))
218 (assert (equal (map-filter (lambda (k v)
219 (eq 3 k))
220 [1 2 4 5])
221 '((3 . 5)))))
222
223 (ert-deftest test-map-remove ()
224 (with-maps-do map
225 (assert (equal (map-keys (map-remove (lambda (k v)
226 (>= v 4))
227 map))
228 '(0)))
229 (assert (equal (map-keys (map-remove (lambda (k v)
230 (eq 'd k))
231 map))
232 (map-keys map))))
233 (assert (equal (map-remove (lambda (k v)
234 (eq 3 v))
235 [1 2 4 5])
236 '((0 . 1)
237 (1 . 2)
238 (2 . 4)
239 (3 . 5))))
240 (assert (null (map-remove (lambda (k v)
241 (>= k 0))
242 [1 2 4 5]))))
243
244 (ert-deftest test-map-empty-p ()
245 (assert (map-empty-p nil))
246 (assert (not (map-empty-p '((a . b) (c . d)))))
247 (assert (map-empty-p []))
248 (assert (not (map-empty-p [1 2 3])))
249 (assert (map-empty-p (make-hash-table)))
250 (assert (not (map-empty-p "hello")))
251 (assert (map-empty-p "")))
252
253 (ert-deftest test-map-contains-key-p ()
254 (assert (map-contains-key-p '((a . 1) (b . 2)) 'a))
255 (assert (not (map-contains-key-p '((a . 1) (b . 2)) 'c)))
256 (assert (map-contains-key-p '(("a" . 1)) "a"))
257 (assert (not (map-contains-key-p '(("a" . 1)) "a" #'eq)))
258 (assert (map-contains-key-p [a b c] 2))
259 (assert (not (map-contains-key-p [a b c] 3))))
260
261 (ert-deftest test-map-some-p ()
262 (with-maps-do map
263 (assert (equal (map-some-p (lambda (k v)
264 (eq 1 k))
265 map)
266 (cons 1 4)))
267 (assert (not (map-some-p (lambda (k v)
268 (eq 'd k))
269 map))))
270 (let ((vec [a b c]))
271 (assert (equal (map-some-p (lambda (k v)
272 (> k 1))
273 vec)
274 (cons 2 'c)))
275 (assert (not (map-some-p (lambda (k v)
276 (> k 3))
277 vec)))))
278
279 (ert-deftest test-map-every-p ()
280 (with-maps-do map
281 (assert (map-every-p (lambda (k v)
282 k)
283 map))
284 (assert (not (map-every-p (lambda (k v)
285 nil)
286 map))))
287 (let ((vec [a b c]))
288 (assert (map-every-p (lambda (k v)
289 (>= k 0))
290 vec))
291 (assert (not (map-every-p (lambda (k v)
292 (> k 3))
293 vec)))))
294
295 (ert-deftest test-map-into ()
296 (let* ((alist '((a . 1) (b . 2)))
297 (ht (map-into alist 'hash-table)))
298 (assert (hash-table-p ht))
299 (assert (equal (map-into (map-into alist 'hash-table) 'list)
300 alist))
301 (assert (listp (map-into ht 'list)))
302 (assert (equal (map-keys (map-into (map-into ht 'list) 'hash-table))
303 (map-keys ht)))
304 (assert (equal (map-values (map-into (map-into ht 'list) 'hash-table))
305 (map-values ht)))
306 (assert (null (map-into nil 'list)))
307 (assert (map-empty-p (map-into nil 'hash-table)))
308 (should-error (map-into [1 2 3] 'string))))
309
310 (provide 'map-tests)
311 ;;; map-tests.el ends here