7 (defpackage :alexandria-test
8 (:use
:cl
:alexandria
:sb-rt
))
10 (in-package :alexandria-test
)
14 (deftest copy-hash-table
.1
15 (let ((orig (make-hash-table :test
'eq
:size
123))
17 (setf (gethash orig orig
) t
19 (let ((eq-copy (copy-hash-table orig
))
20 (eql-copy (copy-hash-table orig
:test
'eql
))
21 (equal-copy (copy-hash-table orig
:test
'equal
))
22 (equalp-copy (copy-hash-table orig
:test
'equalp
)))
23 (list (hash-table-size eq-copy
)
24 (hash-table-count eql-copy
)
25 (gethash orig eq-copy
)
26 (gethash (copy-seq foo
) eql-copy
)
27 (gethash foo eql-copy
)
28 (gethash (copy-seq foo
) equal-copy
)
29 (gethash "FOO" equal-copy
)
30 (gethash "FOO" equalp-copy
))))
31 (123 2 t nil t t nil t
))
33 (deftest maphash-keys
.1
35 (table (make-hash-table)))
37 (setf (gethash i table
) t
))
38 (maphash-keys (lambda (k) (push k keys
)) table
)
39 (set-equal keys
'(0 1 2 3 4 5 6 7 8 9)))
42 (deftest maphash-values
.1
44 (table (make-hash-table)))
46 (setf (gethash i table
) (- i
)))
47 (maphash-values (lambda (v) (push v vals
)) table
)
48 (set-equal vals
'(0 -
1 -
2 -
3 -
4 -
5 -
6 -
7 -
8 -
9)))
51 (deftest hash-table-keys
.1
52 (let ((table (make-hash-table)))
54 (setf (gethash i table
) t
))
55 (set-equal (hash-table-keys table
) '(0 1 2 3 4 5 6 7 8 9)))
58 (deftest hash-table-values
.1
59 (let ((table (make-hash-table)))
61 (setf (gethash (gensym) table
) i
))
62 (set-equal (hash-table-values table
) '(0 1 2 3 4 5 6 7 8 9)))
65 (deftest hash-table-alist
.1
66 (let ((table (make-hash-table)))
68 (setf (gethash i table
) (- i
)))
69 (let ((alist (hash-table-alist table
)))
75 (10 (0 .
0) (3 . -
3) (9 . -
9) nil
))
77 (deftest hash-table-plist
.1
78 (let ((table (make-hash-table)))
80 (setf (gethash i table
) (- i
)))
81 (let ((plist (hash-table-plist table
)))
89 (deftest alist-hash-table
.1
90 (let* ((alist '((0 a
) (1 b
) (2 c
)))
91 (table (alist-hash-table alist
)))
92 (list (hash-table-count table
)
96 (hash-table-test table
)))
99 (deftest plist-hash-table
.1
100 (let* ((plist '(:a
1 :b
2 :c
3))
101 (table (plist-hash-table plist
:test
'eq
)))
102 (list (hash-table-count table
)
108 (hash-table-test table
)))
109 (3 1 2 3 nil nil eq
))
114 (let ((disjunction (disjoin (lambda (x)
115 (and (consp x
) :cons
))
117 (and (stringp x
) :string
)))))
118 (list (funcall disjunction
'zot
)
119 (funcall disjunction
'(foo bar
))
120 (funcall disjunction
"test")))
124 (let ((conjunction (conjoin #'consp
129 (list (funcall conjunction
'zot
)
130 (funcall conjunction
'(foo))
131 (funcall conjunction
'("foo"))))
135 (let ((composite (compose '1+
138 #'read-from-string
)))
139 (funcall composite
"1"))
144 (locally (declare (notinline compose
))
148 #'read-from-string
))))
149 (funcall composite
"2"))
153 (let ((compose-form (funcall (compiler-macro-function 'compose
)
159 (let ((fun (funcall (compile nil
`(lambda () ,compose-form
)))))
163 (deftest multiple-value-compose
.1
164 (let ((composite (multiple-value-compose
169 (with-input-from-string (s x
)
170 (values (read s
) (read s
)))))))
171 (multiple-value-list (funcall composite
"2 7")))
174 (deftest multiple-value-compose
.2
175 (let ((composite (locally (declare (notinline multiple-value-compose
))
176 (multiple-value-compose
181 (with-input-from-string (s x
)
182 (values (read s
) (read s
))))))))
183 (multiple-value-list (funcall composite
"2 11")))
186 (deftest multiple-value-compose
.3
187 (let ((compose-form (funcall (compiler-macro-function 'multiple-value-compose
)
188 '(multiple-value-compose
193 (with-input-from-string (s x
)
194 (values (read s
) (read s
)))))
196 (let ((fun (funcall (compile nil
`(lambda () ,compose-form
)))))
197 (multiple-value-list (funcall fun
"2 9"))))
201 (let ((curried (curry '+ 3)))
202 (funcall curried
1 5))
206 (let ((curried (locally (declare (notinline curry
))
212 (let ((curried-form (funcall (compiler-macro-function 'curry
)
215 (let ((fun (funcall (compile nil
`(lambda () ,curried-form
)))))
220 (let ((r (rcurry '/ 2)))
227 (let* ((list '(1 2 3))
229 (appendf list
'(4 5 6) '(7 8))
230 (list list
(eq list orig
)))
231 ((1 2 3 4 5 6 7 8) nil
))
233 (deftest circular-list
.1
234 (let ((circle (circular-list 1 2 3)))
239 (eq circle
(nthcdr 3 circle
))))
242 (deftest circular-list-p
.1
243 (let* ((circle (circular-list 1 2 3 4))
244 (tree (list circle circle
))
245 (dotted (cons circle t
))
246 (proper (list 1 2 3 circle
))
247 (tailcirc (list* 1 2 3 circle
)))
248 (list (circular-list-p circle
)
249 (circular-list-p tree
)
250 (circular-list-p dotted
)
251 (circular-list-p proper
)
252 (circular-list-p tailcirc
)))
255 (deftest circular-tree-p
.1
256 (let* ((circle (circular-list 1 2 3 4))
257 (tree1 (list circle circle
))
258 (tree2 (let* ((level2 (list 1 nil
2))
259 (level1 (list level2
)))
260 (setf (second level2
) level1
)
262 (dotted (cons circle t
))
263 (proper (list 1 2 3 circle
))
264 (tailcirc (list* 1 2 3 circle
))
265 (quite-proper (list 1 2 3))
266 (quite-dotted (list 1 (cons 2 3))))
267 (list (circular-tree-p circle
)
268 (circular-tree-p tree1
)
269 (circular-tree-p tree2
)
270 (circular-tree-p dotted
)
271 (circular-tree-p proper
)
272 (circular-tree-p tailcirc
)
273 (circular-tree-p quite-proper
)
274 (circular-tree-p quite-dotted
)))
275 (t t t t t t nil nil
))
277 (deftest proper-list-p
.1
281 (l4 (list (cons 1 2) 3))
282 (l5 (circular-list 1 2)))
283 (list (proper-list-p l1
)
290 (deftest proper-list.type
.1
294 (l4 (list (cons 1 2) 3))
295 (l5 (circular-list 1 2)))
296 (list (typep l1
'proper-list
)
297 (typep l2
'proper-list
)
298 (typep l3
'proper-list
)
299 (typep l4
'proper-list
)
300 (typep l5
'proper-list
)))
310 (deftest lastcar.error
.2
313 (lastcar (circular-list 1 2 3))
319 (deftest setf-lastcar
.1
320 (let ((l (list 1 2 3 4)))
323 (setf (lastcar l
) 42)
328 (deftest make-circular-list
.1
329 (let ((l (make-circular-list 3 :initial-element
:x
)))
331 (list (eq l
(nthcdr 3 l
))
338 (deftest circular-list.type
.1
339 (let* ((l1 (list 1 2 3))
340 (l2 (circular-list 1 2 3))
341 (l3 (list* 1 2 3 l2
)))
342 (list (typep l1
'circular-list
)
343 (typep l2
'circular-list
)
344 (typep l3
'circular-list
)))
347 (deftest ensure-list
.1
350 (list (ensure-list x
)
379 (setp '(a :a
) :key
'character
)
383 (setp '(a :a
) :key
'character
:test
(constantly nil
))
387 (set-equal '(1 2 3) '(3 1 2))
391 (set-equal '("Xa") '("Xb")
392 :test
(lambda (a b
) (eql (char a
0) (char b
0))))
396 (set-equal '(1 2) '(4 2))
400 (set-equal '(a b c
) '(:a
:b
:c
) :key
'string
:test
'equal
)
404 (set-equal '(a d c
) '(:a
:b
:c
) :key
'string
:test
'equal
)
407 (deftest map-product
.1
408 (map-product 'cons
'(2 3) '(1 4))
409 ((2 .
1) (2 .
4) (3 .
1) (3 .
4)))
412 (flatten '((1) 2 (((3 4))) ((((5)) 6)) 7))
416 (let ((orig '(a 1 b
2 c
3 d
4)))
417 (list (sans orig
'a
'c
)
421 (sans orig
'd
42 "zot")
422 (sans orig
'a
'b
'c
'd
)
423 (sans orig
'a
'b
'c
'd
'x
)
424 (equal orig
'(a 1 b
2 c
3 d
4))))
435 (mappend (compose 'list
'*) '(1 2 3) '(1 2 3))
441 (list (clamp 1.5 1 2)
449 (deftest gaussian-random
.1
458 (iota 3 :start
0.0d0
)
462 (iota 3 :start
2 :step
3.0)
486 (median '(100 0 99 1 98 2 97))
490 (median '(100 0 99 1 98 2 97 96))
497 (deftest standard-deviation
)
519 (let ((xv (vector 0 0 0))
521 (maxf (svref xv
(incf p
)) (incf p
))
532 (let ((xv (vector 10 10 10))
534 (minf (svref xv
(incf p
)) (incf p
))
541 (deftest array-index.type
)
549 (list (rotate (list 1 2 3) 0)
550 (rotate (list 1 2 3) 1)
551 (rotate (list 1 2 3) 2)
552 (rotate (list 1 2 3) 3)
553 (rotate (list 1 2 3) 4))
561 (list (rotate (vector 1 2 3 4) 0)
562 (rotate (vector 1 2 3 4))
563 (rotate (vector 1 2 3 4) 2)
564 (rotate (vector 1 2 3 4) 3)
565 (rotate (vector 1 2 3 4) 4)
566 (rotate (vector 1 2 3 4) 5))
575 (list (rotate (list 1 2 3) 0)
576 (rotate (list 1 2 3) -
1)
577 (rotate (list 1 2 3) -
2)
578 (rotate (list 1 2 3) -
3)
579 (rotate (list 1 2 3) -
4))
587 (list (rotate (vector 1 2 3 4) 0)
588 (rotate (vector 1 2 3 4) -
1)
589 (rotate (vector 1 2 3 4) -
2)
590 (rotate (vector 1 2 3 4) -
3)
591 (rotate (vector 1 2 3 4) -
4)
592 (rotate (vector 1 2 3 4) -
5))
601 (let ((s (suffle (iota 100))))
602 (list (equal s
(iota 100))
607 (typep x
'(integer 0 99)))
611 (deftest random-elt
.1
612 (let ((s1 #(1 2 3 4))
614 (list (dotimes (i 1000 nil
)
615 (unless (member (random-elt s1
) s2
)
617 (when (/= (random-elt s1
) (random-elt s1
))
619 (dotimes (i 1000 nil
)
620 (unless (member (random-elt s2
) s2
)
622 (when (/= (random-elt s2
) (random-elt s2
))
650 (deftest proper-sequence.type
.1
652 (typep x
'proper-sequence
))
656 (circular-list 1 2 3 4)))
668 (deftest sequence-of-length-p
.1
669 (mapcar #'sequence-of-length-p
690 (t t t t t t nil nil nil nil
))
692 (deftest copy-sequence
.1
693 (let ((l (list 1 2 3))
694 (v (vector #\a #\b #\c
)))
695 (let ((l.list
(copy-sequence 'list l
))
696 (l.vector
(copy-sequence 'vector l
))
697 (l.spec-v
(copy-sequence '(vector fixnum
) l
))
698 (v.vector
(copy-sequence 'vector v
))
699 (v.list
(copy-sequence 'list v
))
700 (v.string
(copy-sequence 'string v
)))
701 (list (member l
(list l.list l.vector l.spec-v
))
702 (member v
(list v.vector v.list v.string
))
704 (equalp l.vector
#(1 2 3))
705 (eq 'fixnum
(array-element-type l.spec-v
))
707 (equal v.list
'(#\a #\b #\c
))
708 (equal "abc" v.string
))))
709 (nil nil t t t t t t
))
718 (deftest first-elt.error
.1
733 (deftest setf-first-elt
.1
734 (let ((l (list 1 2 3))
735 (s (copy-seq "foobar"))
736 (v (vector :a
:b
:c
)))
737 (setf (first-elt l
) -
1
754 (deftest last-elt.error
.1
764 (circular-list 1 2 3)
765 (list* 1 2 3 (circular-list 4 5))))
773 (deftest setf-last-elt
.1
774 (let ((l (list 1 2 3))
775 (s (copy-seq "foobar"))
776 (b (copy-seq #*010101001)))
777 (setf (last-elt l
) '???
785 (deftest starts-with
.1
786 (list (starts-with 1 '(1 2 3))
787 (starts-with 1 #(1 2 3))
788 (starts-with #\x
"xyz")
789 (starts-with 2 '(1 2 3))
790 (starts-with 3 #(1 2 3))
792 (starts-with nil nil
))
793 (t t t nil nil nil nil
))
795 (deftest starts-with
.2
796 (values (starts-with 1 '(-1 2 3) :key
'-
)
797 (starts-with "foo" '("foo" "bar") :test
'equal
)
798 (starts-with "f" '(#\f) :key
'string
:test
'equal
)
799 (starts-with -
1 '(0 1 2) :key
#'1+)
800 (starts-with "zot" '("ZOT") :test
'equal
))
808 (list (ends-with 3 '(1 2 3))
809 (ends-with 3 #(1 2 3))
810 (ends-with #\z
"xyz")
811 (ends-with 2 '(1 2 3))
812 (ends-with 1 #(1 2 3))
815 (t t t nil nil nil nil
))
818 (values (ends-with 2 '(0 13 1) :key
'1+)
819 (ends-with "foo" (vector "bar" "foo") :test
'equal
)
820 (ends-with "X" (vector 1 2 #\X
) :key
'string
:test
'equal
)
821 (ends-with "foo" "foo" :test
'equal
))
827 (deftest ends-with.error
.1
829 (ends-with 3 (circular-list 3 3 3 1 3 3))
834 (deftest with-unique-names
.1
835 (let ((*gensym-counter
* 0))
836 (let ((syms (with-unique-names (foo bar quux
)
837 (list foo bar quux
))))
838 (list (find-if #'symbol-package syms
)
839 (equal '("FOO0" "BAR1" "QUUX2")
840 (mapcar #'symbol-name syms
)))))
844 (macrolet ((cons1.good
(x)
850 (list (cons1.good
(incf y
))
854 ((1 .
1) 1 (2 .
3) 3))
856 (deftest parse-body
.1
857 (parse-body '("doc" "body") :documentation t
)
862 (deftest parse-body
.2
863 (parse-body '("body") :documentation t
)
868 (deftest parse-body
.3
869 (parse-body '("doc" "body"))
874 (deftest parse-body
.4
875 (parse-body '((declare (foo)) "doc" (declare (bar)) body
) :documentation t
)
877 ((declare (foo)) (declare (bar)))
880 (deftest parse-body
.5
881 (parse-body '((declare (foo)) "doc" (declare (bar)) body
))
882 ("doc" (declare (bar)) body
)
888 (deftest ensure-symbol
.1
889 (ensure-symbol :cons
:cl
)
892 (deftest ensure-symbol
.2
893 (ensure-symbol "CONS")
896 (deftest ensure-symbol
.3
897 (ensure-symbol 'foo
:keyword
)
900 (deftest ensure-symbol
.4
904 (deftest format-symbol
.1
905 (let ((s (format-symbol nil
"X-~D" 13)))
906 (list (symbol-package s
)
910 (deftest format-symbol
.2
911 (format-symbol :keyword
"SYM-~A" :bolic
)
914 (deftest format-symbol
.3
915 (let ((*package
* (find-package :cl
)))
916 (format-symbol t
"FIND-~A" 'package
))
919 (deftest make-keyword
.1
920 (list (make-keyword 'zot
)
925 (deftest make-gensym-list
.1
926 (let ((*gensym-counter
* 0))
927 (let ((syms (make-gensym-list 3 "FOO")))
928 (list (find-if 'symbol-package syms
)
929 (equal '("FOO0" "FOO1" "FOO2")
930 (mapcar 'symbol-name syms
)))))
936 (let ((f (of-type 'string
)))
937 (list (funcall f
"foo")
942 (type= 'string
'string
)
947 (type= 'list
'(or null cons
))
952 (type= 'null
'(and symbol list
))
957 (type= 'string
'(satisfies emptyp
))
962 (type= 'string
'list
)
968 (declaim (notinline opaque
))
973 (if-let (x (opaque :ok
))
979 (if-let (x (opaque nil
))
1009 (y (prog1 x
(setf x nil
))))
1015 (when-let (x (opaque :ok
))
1034 (deftest when-let
*.1