aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorNicolas Petton2015-04-18 16:22:16 +0200
committerNicolas Petton2015-04-18 16:22:16 +0200
commitc3acb3258df5fc0987fdd233062632ed030923d9 (patch)
tree73b138d8439969ec13ac3a355188f77e11dd6bd8 /test
parenta0ef1017b87b25ebde9d31d8e4036ef3386fcd85 (diff)
downloademacs-c3acb3258df5fc0987fdd233062632ed030923d9.tar.gz
emacs-c3acb3258df5fc0987fdd233062632ed030923d9.zip
New library map.el similar to seq.el but for mapping data structures.
* test/automated/map-test.el: New file. * lisp/emacs-lisp/map.el: New file.
Diffstat (limited to 'test')
-rw-r--r--test/automated/map-test.el324
1 files changed, 324 insertions, 0 deletions
diff --git a/test/automated/map-test.el b/test/automated/map-test.el
new file mode 100644
index 00000000000..8a12be84aa1
--- /dev/null
+++ b/test/automated/map-test.el
@@ -0,0 +1,324 @@
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 (alist-name vec-name ht-name &rest body)
33 (declare (indent 3))
34 `(let ((,alist-name '((a . 2)
35 (b . 3)
36 (c . 4)))
37 (,vec-name (make-vector 3 nil))
38 (,ht-name (make-hash-table)))
39 (aset ,vec-name 0 'a)
40 (aset ,vec-name 1 'b)
41 (aset ,vec-name 2 'c)
42 (puthash 'a 2 ,ht-name)
43 (puthash 'b 3 ,ht-name)
44 (puthash 'c 4 ,ht-name)
45 (progn
46 ,@body)))
47
48(ert-deftest test-map-elt ()
49 (with-maps-do alist vec ht
50 (assert (= 2 (map-elt alist 'a)))
51 (assert (= 3 (map-elt alist 'b)))
52 (assert (= 4 (map-elt alist 'c)))
53 (assert (null (map-elt alist 'd)))
54 (assert (= 2 (map-elt ht 'a)))
55 (assert (= 3 (map-elt ht 'b)))
56 (assert (= 4 (map-elt ht 'c)))
57 (assert (null (map-elt ht 'd)))
58 (assert (eq 'a (map-elt vec 0)))
59 (assert (eq 'b (map-elt vec 1)))
60 (assert (eq 'c (map-elt vec 2)))
61 (assert (null (map-elt vec 3)))))
62
63(ert-deftest test-map-elt-default ()
64 (with-maps-do alist vec ht
65 (assert (= 5 (map-elt alist 'd 5)))
66 (assert (= 5 (map-elt vec 4 5)))
67 (assert (= 5 (map-elt ht 'd 5)))))
68
69(ert-deftest test-map-put ()
70 (with-maps-do alist vec ht
71 (map-put alist 'd 4)
72 (assert (= (map-elt alist 'd) 4))
73 (map-put alist 'd 5)
74 (assert (= (map-elt alist 'd) 5))
75 (map-put ht 'd 4)
76 (assert (= (map-elt ht 'd) 4))
77 (map-put ht 'd 5)
78 (assert (= (map-elt ht 'd) 5))
79 (map-put vec 0 'd)
80 (assert (eq (map-elt vec 0) 'd))
81 (should-error (map-put vec 4 'd))))
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 alist vec ht
97 (map-delete alist 'a)
98 (assert (null (map-elt alist 'a)))
99 (map-delete ht 'a)
100 (assert (null (map-elt ht 'a)))
101 (map-delete vec 2)
102 (assert (null (map-elt vec 2)))))
103
104(ert-deftest test-map-delete-return-value ()
105 (let ((ht (make-hash-table)))
106 (assert (eq (map-delete ht 'a) ht))))
107
108(ert-deftest test-map-nested-elt ()
109 (let ((vec [a b [c d [e f]]]))
110 (assert (eq (map-nested-elt vec '(2 2 0)) 'e)))
111 (let ((alist '((a . 1)
112 (b . ((c . 2)
113 (d . 3)
114 (e . ((f . 4)
115 (g . 5))))))))
116 (assert (eq (map-nested-elt alist '(b e f))
117 4)))
118 (let ((ht (make-hash-table)))
119 (map-put ht 'a 1)
120 (map-put ht 'b (make-hash-table))
121 (map-put (map-elt ht 'b) 'c 2)
122 (assert (eq (map-nested-elt ht '(b c))
123 2))))
124
125(ert-deftest test-map-nested-elt-default ()
126 (let ((vec [a b [c d]]))
127 (assert (null (map-nested-elt vec '(2 3))))
128 (assert (null (map-nested-elt vec '(2 1 1))))
129 (assert (= 4 (map-nested-elt vec '(2 1 1) 4)))))
130
131(ert-deftest test-map-p ()
132 (assert (map-p nil))
133 (assert (map-p '((a . b) (c . d))))
134 (assert (map-p '(a b c d)))
135 (assert (map-p []))
136 (assert (map-p [1 2 3]))
137 (assert (map-p (make-hash-table)))
138 (assert (map-p "hello"))
139 (with-maps-do alist vec ht
140 (assert (map-p alist))
141 (assert (map-p vec))
142 (assert (map-p ht))
143 (assert (not (map-p 1)))
144 (assert (not (map-p 'hello)))))
145
146(ert-deftest test-map-keys ()
147 (with-maps-do alist vec ht
148 (assert (equal (map-keys alist) '(a b c)))
149 (assert (equal (map-keys vec) '(0 1 2)))
150 (assert (equal (map-keys ht) '(a b c)))))
151
152(ert-deftest test-map-values ()
153 (with-maps-do alist vec ht
154 (assert (equal (map-values alist) '(2 3 4)))
155 (assert (equal (map-values vec) '(a b c)))
156 (assert (equal (map-values ht) '(2 3 4)))))
157
158(ert-deftest test-map-pairs ()
159 (with-maps-do alist vec ht
160 (assert (equal (map-pairs alist) alist))
161 (assert (equal (map-pairs vec) '((0 . a)
162 (1 . b)
163 (2 . c))))
164 (assert (equal (map-pairs ht) alist))))
165
166(ert-deftest test-map-length ()
167 (let ((ht (make-hash-table)))
168 (puthash 'a 1 ht)
169 (puthash 'b 2 ht)
170 (puthash 'c 3 ht)
171 (puthash 'd 4 ht)
172 (assert (= 0 (map-length nil)))
173 (assert (= 0 (map-length [])))
174 (assert (= 0 (map-length (make-hash-table))))
175 (assert (= 5 (map-length [0 1 2 3 4])))
176 (assert (= 2 (map-length '((a . 1) (b . 2)))))
177 (assert (= 4 (map-length ht)))))
178
179(ert-deftest test-map-copy ()
180 (with-maps-do alist vec ht
181 (dolist (map (list alist vec ht))
182 (let ((copy (map-copy map)))
183 (assert (equal (map-keys map) (map-keys copy)))
184 (assert (equal (map-values map) (map-values copy)))
185 (assert (not (eq map copy)))))))
186
187(ert-deftest test-map-apply ()
188 (with-maps-do alist vec ht
189 (dolist (map (list alist ht))
190 (assert (equal (map-apply (lambda (k v) (cons (symbol-name k) v))
191 map)
192 '(("a" . 2) ("b" . 3) ("c" . 4)))))
193 (assert (equal (map-apply (lambda (k v) (cons (1+ k) v))
194 vec)
195 '((1 . a)
196 (2 . b)
197 (3 . c))))))
198
199(ert-deftest test-map-keys-apply ()
200 (with-maps-do alist vec ht
201 (dolist (map (list alist ht))
202 (assert (equal (map-keys-apply (lambda (k) (symbol-name k))
203 map)
204 '("a" "b" "c"))))
205 (assert (equal (map-keys-apply (lambda (k) (1+ k))
206 vec)
207 '(1 2 3)))))
208
209(ert-deftest test-map-values-apply ()
210 (with-maps-do alist vec ht
211 (dolist (map (list alist ht))
212 (assert (equal (map-values-apply (lambda (v) (1+ v))
213 map)
214 '(3 4 5))))
215 (assert (equal (map-values-apply (lambda (v) (symbol-name v))
216 vec)
217 '("a" "b" "c")))))
218
219(ert-deftest test-map-filter ()
220 (with-maps-do alist vec ht
221 (dolist (map (list alist ht))
222 (assert (equal (map-keys (map-filter (lambda (k v)
223 (<= 3 v))
224 map))
225 '(b c)))
226 (assert (null (map-filter (lambda (k v)
227 (eq 'd k))
228 map))))
229 (assert (null (map-filter (lambda (k v)
230 (eq 3 v))
231 [1 2 4 5])))
232 (assert (equal (map-filter (lambda (k v)
233 (eq 3 k))
234 [1 2 4 5])
235 '((3 . 5))))))
236
237(ert-deftest test-map-remove ()
238 (with-maps-do alist vec ht
239 (dolist (map (list alist ht))
240 (assert (equal (map-keys (map-remove (lambda (k v)
241 (<= 3 v))
242 map))
243 '(a)))
244 (assert (equal (map-keys (map-remove (lambda (k v)
245 (eq 'd k))
246 map))
247 (map-keys map))))
248 (assert (equal (map-remove (lambda (k v)
249 (eq 3 v))
250 [1 2 4 5])
251 '((0 . 1)
252 (1 . 2)
253 (2 . 4)
254 (3 . 5))))
255 (assert (null (map-remove (lambda (k v)
256 (>= k 0))
257 [1 2 4 5])))))
258
259(ert-deftest test-map-empty-p ()
260 (assert (map-empty-p nil))
261 (assert (not (map-empty-p '((a . b) (c . d)))))
262 (assert (map-empty-p []))
263 (assert (not (map-empty-p [1 2 3])))
264 (assert (map-empty-p (make-hash-table)))
265 (assert (not (map-empty-p "hello")))
266 (assert (map-empty-p "")))
267
268(ert-deftest test-map-contains-key-p ()
269 (assert (map-contains-key-p '((a . 1) (b . 2)) 'a))
270 (assert (not (map-contains-key-p '((a . 1) (b . 2)) 'c)))
271 (assert (map-contains-key-p '(("a" . 1)) "a"))
272 (assert (not (map-contains-key-p '(("a" . 1)) "a" #'eq)))
273 (assert (map-contains-key-p [a b c] 2))
274 (assert (not (map-contains-key-p [a b c] 3))))
275
276(ert-deftest test-map-some-p ()
277 (with-maps-do alist vec ht
278 (dolist (map (list alist ht))
279 (assert (equal (map-some-p (lambda (k v)
280 (eq 'a k))
281 map)
282 (cons 'a 2)))
283 (assert (not (map-some-p (lambda (k v)
284 (eq 'd k))
285 map))))
286 (assert (equal (map-some-p (lambda (k v)
287 (> k 1))
288 vec)
289 (cons 2 'c)))
290 (assert (not (map-some-p (lambda (k v)
291 (> k 3))
292 vec)))))
293
294(ert-deftest test-map-every-p ()
295 (with-maps-do alist vec ht
296 (dolist (map (list alist ht vec))
297 (assert (map-every-p (lambda (k v)
298 k)
299 map))
300 (assert (not (map-every-p (lambda (k v)
301 nil)
302 map))))
303 (assert (map-every-p (lambda (k v)
304 (>= k 0))
305 vec))
306 (assert (not (map-every-p (lambda (k v)
307 (> k 3))
308 vec)))))
309
310(ert-deftest test-map-into ()
311 (with-maps-do alist vec ht
312 (assert (hash-table-p (map-into alist 'hash-table)))
313 (assert (equal (map-into (map-into alist 'hash-table) 'list)
314 alist))
315 (assert (listp (map-into ht 'list)))
316 (assert (equal (map-keys (map-into (map-into ht 'list) 'hash-table))
317 (map-keys ht)))
318 (assert (equal (map-values (map-into (map-into ht 'list) 'hash-table))
319 (map-values ht)))
320 (assert (null (map-into nil 'list)))
321 (assert (map-empty-p (map-into nil 'hash-table)))))
322
323(provide 'map-tests)
324;;; map-tests.el ends here