Introduction
Introduction Statistics Contact Development Disclaimer Help
ttests.lisp - clic - Clic is an command line interactive client for gopher writ…
git clone git://bitreich.org/clic/ git://hg6vgqziawt5s4dj.onion/clic/
Log
Files
Refs
Tags
LICENSE
---
ttests.lisp (54259B)
---
1 (in-package :cl-user)
2
3 (defpackage :alexandria-tests
4 (:use :cl :alexandria #+sbcl :sb-rt #-sbcl :rtest)
5 (:import-from #+sbcl :sb-rt #-sbcl :rtest
6 #:*compile-tests* #:*expected-failures*))
7
8 (in-package :alexandria-tests)
9
10 (defun run-tests (&key ((:compiled *compile-tests*)))
11 (do-tests))
12
13 (defun hash-table-test-name (name)
14 ;; Workaround for Clisp calling EQL in a hash-table FASTHASH-EQL.
15 (hash-table-test (make-hash-table :test name)))
16
17 ;;;; Arrays
18
19 (deftest copy-array.1
20 (let* ((orig (vector 1 2 3))
21 (copy (copy-array orig)))
22 (values (eq orig copy) (equalp orig copy)))
23 nil t)
24
25 (deftest copy-array.2
26 (let ((orig (make-array 1024 :fill-pointer 0)))
27 (vector-push-extend 1 orig)
28 (vector-push-extend 2 orig)
29 (vector-push-extend 3 orig)
30 (let ((copy (copy-array orig)))
31 (values (eq orig copy) (equalp orig copy)
32 (array-has-fill-pointer-p copy)
33 (eql (fill-pointer orig) (fill-pointer copy)))))
34 nil t t t)
35
36 (deftest copy-array.3
37 (let* ((orig (vector 1 2 3))
38 (copy (copy-array orig)))
39 (typep copy 'simple-array))
40 t)
41
42 (deftest copy-array.4
43 (let ((orig (make-array 21
44 :adjustable t
45 :fill-pointer 0)))
46 (dotimes (n 42)
47 (vector-push-extend n orig))
48 (let ((copy (copy-array orig
49 :adjustable nil
50 :fill-pointer nil)))
51 (typep copy 'simple-array)))
52 t)
53
54 (deftest array-index.1
55 (typep 0 'array-index)
56 t)
57
58 ;;;; Conditions
59
60 (deftest unwind-protect-case.1
61 (let (result)
62 (unwind-protect-case ()
63 (random 10)
64 (:normal (push :normal result))
65 (:abort (push :abort result))
66 (:always (push :always result)))
67 result)
68 (:always :normal))
69
70 (deftest unwind-protect-case.2
71 (let (result)
72 (unwind-protect-case ()
73 (random 10)
74 (:always (push :always result))
75 (:normal (push :normal result))
76 (:abort (push :abort result)))
77 result)
78 (:normal :always))
79
80 (deftest unwind-protect-case.3
81 (let (result1 result2 result3)
82 (ignore-errors
83 (unwind-protect-case ()
84 (error "FOOF!")
85 (:normal (push :normal result1))
86 (:abort (push :abort result1))
87 (:always (push :always result1))))
88 (catch 'foof
89 (unwind-protect-case ()
90 (throw 'foof 42)
91 (:normal (push :normal result2))
92 (:abort (push :abort result2))
93 (:always (push :always result2))))
94 (block foof
95 (unwind-protect-case ()
96 (return-from foof 42)
97 (:normal (push :normal result3))
98 (:abort (push :abort result3))
99 (:always (push :always result3))))
100 (values result1 result2 result3))
101 (:always :abort)
102 (:always :abort)
103 (:always :abort))
104
105 (deftest unwind-protect-case.4
106 (let (result)
107 (unwind-protect-case (aborted-p)
108 (random 42)
109 (:always (setq result aborted-p)))
110 result)
111 nil)
112
113 (deftest unwind-protect-case.5
114 (let (result)
115 (block foof
116 (unwind-protect-case (aborted-p)
117 (return-from foof)
118 (:always (setq result aborted-p))))
119 result)
120 t)
121
122 ;;;; Control flow
123
124 (deftest switch.1
125 (switch (13 :test =)
126 (12 :oops)
127 (13.0 :yay))
128 :yay)
129
130 (deftest switch.2
131 (switch (13)
132 ((+ 12 2) :oops)
133 ((- 13 1) :oops2)
134 (t :yay))
135 :yay)
136
137 (deftest eswitch.1
138 (let ((x 13))
139 (eswitch (x :test =)
140 (12 :oops)
141 (13.0 :yay)))
142 :yay)
143
144 (deftest eswitch.2
145 (let ((x 13))
146 (eswitch (x :key 1+)
147 (11 :oops)
148 (14 :yay)))
149 :yay)
150
151 (deftest cswitch.1
152 (cswitch (13 :test =)
153 (12 :oops)
154 (13.0 :yay))
155 :yay)
156
157 (deftest cswitch.2
158 (cswitch (13 :key 1-)
159 (12 :yay)
160 (13.0 :oops))
161 :yay)
162
163 (deftest multiple-value-prog2.1
164 (multiple-value-prog2
165 (values 1 1 1)
166 (values 2 20 200)
167 (values 3 3 3))
168 2 20 200)
169
170 (deftest nth-value-or.1
171 (multiple-value-bind (a b c)
172 (nth-value-or 1
173 (values 1 nil 1)
174 (values 2 2 2))
175 (= a b c 2))
176 t)
177
178 (deftest whichever.1
179 (let ((x (whichever 1 2 3)))
180 (and (member x '(1 2 3)) t))
181 t)
182
183 (deftest whichever.2
184 (let* ((a 1)
185 (b 2)
186 (c 3)
187 (x (whichever a b c)))
188 (and (member x '(1 2 3)) t))
189 t)
190
191 (deftest xor.1
192 (xor nil nil 1 nil)
193 1
194 t)
195
196 (deftest xor.2
197 (xor nil nil 1 2)
198 nil
199 nil)
200
201 (deftest xor.3
202 (xor nil nil nil)
203 nil
204 t)
205
206 ;;;; Definitions
207
208 (deftest define-constant.1
209 (let ((name (gensym)))
210 (eval `(define-constant ,name "FOO" :test 'equal))
211 (eval `(define-constant ,name "FOO" :test 'equal))
212 (values (equal "FOO" (symbol-value name))
213 (constantp name)))
214 t
215 t)
216
217 (deftest define-constant.2
218 (let ((name (gensym)))
219 (eval `(define-constant ,name 13))
220 (eval `(define-constant ,name 13))
221 (values (eql 13 (symbol-value name))
222 (constantp name)))
223 t
224 t)
225
226 ;;;; Errors
227
228 ;;; TYPEP is specified to return a generalized boolean and, for
229 ;;; example, ECL exploits this by returning the superclasses of ERROR
230 ;;; in this case.
231 (defun errorp (x)
232 (not (null (typep x 'error))))
233
234 (deftest required-argument.1
235 (multiple-value-bind (res err)
236 (ignore-errors (required-argument))
237 (errorp err))
238 t)
239
240 ;;;; Hash tables
241
242 (deftest ensure-gethash.1
243 (let ((table (make-hash-table))
244 (x (list 1)))
245 (multiple-value-bind (value already-there)
246 (ensure-gethash x table 42)
247 (and (= value 42)
248 (not already-there)
249 (= 42 (gethash x table))
250 (multiple-value-bind (value2 already-there2)
251 (ensure-gethash x table 13)
252 (and (= value2 42)
253 already-there2
254 (= 42 (gethash x table)))))))
255 t)
256
257 (deftest ensure-gethash.2
258 (let ((table (make-hash-table))
259 (count 0))
260 (multiple-value-call #'values
261 (ensure-gethash (progn (incf count) :foo)
262 (progn (incf count) table)
263 (progn (incf count) :bar))
264 (gethash :foo table)
265 count))
266 :bar nil :bar t 3)
267
268 (deftest copy-hash-table.1
269 (let ((orig (make-hash-table :test 'eq :size 123))
270 (foo "foo"))
271 (setf (gethash orig orig) t
272 (gethash foo orig) t)
273 (let ((eq-copy (copy-hash-table orig))
274 (eql-copy (copy-hash-table orig :test 'eql))
275 (equal-copy (copy-hash-table orig :test 'equal))
276 (equalp-copy (copy-hash-table orig :test 'equalp)))
277 (list (eql (hash-table-size eq-copy) (hash-table-size orig))
278 (eql (hash-table-rehash-size eq-copy)
279 (hash-table-rehash-size orig))
280 (hash-table-count eql-copy)
281 (gethash orig eq-copy)
282 (gethash (copy-seq foo) eql-copy)
283 (gethash foo eql-copy)
284 (gethash (copy-seq foo) equal-copy)
285 (gethash "FOO" equal-copy)
286 (gethash "FOO" equalp-copy))))
287 (t t 2 t nil t t nil t))
288
289 (deftest copy-hash-table.2
290 (let ((ht (make-hash-table))
291 (list (list :list (vector :A :B :C))))
292 (setf (gethash 'list ht) list)
293 (let* ((shallow-copy (copy-hash-table ht))
294 (deep1-copy (copy-hash-table ht :key 'copy-list))
295 (list (gethash 'list ht))
296 (shallow-list (gethash 'list shallow-copy))
297 (deep1-list (gethash 'list deep1-copy)))
298 (list (eq ht shallow-copy)
299 (eq ht deep1-copy)
300 (eq list shallow-list)
301 (eq list deep1-list) ; outer list was co…
302 (eq (second list) (second shallow-list))
303 (eq (second list) (second deep1-list)) ; inner vector wasn…
304 )))
305 (nil nil t nil t t))
306
307 (deftest maphash-keys.1
308 (let ((keys nil)
309 (table (make-hash-table)))
310 (declare (notinline maphash-keys))
311 (dotimes (i 10)
312 (setf (gethash i table) t))
313 (maphash-keys (lambda (k) (push k keys)) table)
314 (set-equal keys '(0 1 2 3 4 5 6 7 8 9)))
315 t)
316
317 (deftest maphash-values.1
318 (let ((vals nil)
319 (table (make-hash-table)))
320 (declare (notinline maphash-values))
321 (dotimes (i 10)
322 (setf (gethash i table) (- i)))
323 (maphash-values (lambda (v) (push v vals)) table)
324 (set-equal vals '(0 -1 -2 -3 -4 -5 -6 -7 -8 -9)))
325 t)
326
327 (deftest hash-table-keys.1
328 (let ((table (make-hash-table)))
329 (dotimes (i 10)
330 (setf (gethash i table) t))
331 (set-equal (hash-table-keys table) '(0 1 2 3 4 5 6 7 8 9)))
332 t)
333
334 (deftest hash-table-values.1
335 (let ((table (make-hash-table)))
336 (dotimes (i 10)
337 (setf (gethash (gensym) table) i))
338 (set-equal (hash-table-values table) '(0 1 2 3 4 5 6 7 8 9)))
339 t)
340
341 (deftest hash-table-alist.1
342 (let ((table (make-hash-table)))
343 (dotimes (i 10)
344 (setf (gethash i table) (- i)))
345 (let ((alist (hash-table-alist table)))
346 (list (length alist)
347 (assoc 0 alist)
348 (assoc 3 alist)
349 (assoc 9 alist)
350 (assoc nil alist))))
351 (10 (0 . 0) (3 . -3) (9 . -9) nil))
352
353 (deftest hash-table-plist.1
354 (let ((table (make-hash-table)))
355 (dotimes (i 10)
356 (setf (gethash i table) (- i)))
357 (let ((plist (hash-table-plist table)))
358 (list (length plist)
359 (getf plist 0)
360 (getf plist 2)
361 (getf plist 7)
362 (getf plist nil))))
363 (20 0 -2 -7 nil))
364
365 (deftest alist-hash-table.1
366 (let* ((alist '((0 a) (1 b) (2 c)))
367 (table (alist-hash-table alist)))
368 (list (hash-table-count table)
369 (gethash 0 table)
370 (gethash 1 table)
371 (gethash 2 table)
372 (eq (hash-table-test-name 'eql)
373 (hash-table-test table))))
374 (3 (a) (b) (c) t))
375
376 (deftest alist-hash-table.duplicate-keys
377 (let* ((alist '((0 a) (1 b) (0 c) (1 d) (2 e)))
378 (table (alist-hash-table alist)))
379 (list (hash-table-count table)
380 (gethash 0 table)
381 (gethash 1 table)
382 (gethash 2 table)))
383 (3 (a) (b) (e)))
384
385 (deftest plist-hash-table.1
386 (let* ((plist '(:a 1 :b 2 :c 3))
387 (table (plist-hash-table plist :test 'eq)))
388 (list (hash-table-count table)
389 (gethash :a table)
390 (gethash :b table)
391 (gethash :c table)
392 (gethash 2 table)
393 (gethash nil table)
394 (eq (hash-table-test-name 'eq)
395 (hash-table-test table))))
396 (3 1 2 3 nil nil t))
397
398 (deftest plist-hash-table.duplicate-keys
399 (let* ((plist '(:a 1 :b 2 :a 3 :b 4 :c 5))
400 (table (plist-hash-table plist)))
401 (list (hash-table-count table)
402 (gethash :a table)
403 (gethash :b table)
404 (gethash :c table)))
405 (3 1 2 5))
406
407 ;;;; Functions
408
409 (deftest disjoin.1
410 (let ((disjunction (disjoin (lambda (x)
411 (and (consp x) :cons))
412 (lambda (x)
413 (and (stringp x) :string)))))
414 (list (funcall disjunction 'zot)
415 (funcall disjunction '(foo bar))
416 (funcall disjunction "test")))
417 (nil :cons :string))
418
419 (deftest disjoin.2
420 (let ((disjunction (disjoin #'zerop)))
421 (list (funcall disjunction 0)
422 (funcall disjunction 1)))
423 (t nil))
424
425 (deftest conjoin.1
426 (let ((conjunction (conjoin #'consp
427 (lambda (x)
428 (stringp (car x)))
429 (lambda (x)
430 (char (car x) 0)))))
431 (list (funcall conjunction 'zot)
432 (funcall conjunction '(foo))
433 (funcall conjunction '("foo"))))
434 (nil nil #\f))
435
436 (deftest conjoin.2
437 (let ((conjunction (conjoin #'zerop)))
438 (list (funcall conjunction 0)
439 (funcall conjunction 1)))
440 (t nil))
441
442 (deftest compose.1
443 (let ((composite (compose '1+
444 (lambda (x)
445 (* x 2))
446 #'read-from-string)))
447 (funcall composite "1"))
448 3)
449
450 (deftest compose.2
451 (let ((composite
452 (locally (declare (notinline compose))
453 (compose '1+
454 (lambda (x)
455 (* x 2))
456 #'read-from-string))))
457 (funcall composite "2"))
458 5)
459
460 (deftest compose.3
461 (let ((compose-form (funcall (compiler-macro-function 'compose)
462 '(compose '1+
463 (lambda (x)
464 (* x 2))
465 #'read-from-string)
466 nil)))
467 (let ((fun (funcall (compile nil `(lambda () ,compose-form)))))
468 (funcall fun "3")))
469 7)
470
471 (deftest compose.4
472 (let ((composite (compose #'zerop)))
473 (list (funcall composite 0)
474 (funcall composite 1)))
475 (t nil))
476
477 (deftest multiple-value-compose.1
478 (let ((composite (multiple-value-compose
479 #'truncate
480 (lambda (x y)
481 (values y x))
482 (lambda (x)
483 (with-input-from-string (s x)
484 (values (read s) (read s)))))))
485 (multiple-value-list (funcall composite "2 7")))
486 (3 1))
487
488 (deftest multiple-value-compose.2
489 (let ((composite (locally (declare (notinline multiple-value-compose…
490 (multiple-value-compose
491 #'truncate
492 (lambda (x y)
493 (values y x))
494 (lambda (x)
495 (with-input-from-string (s x)
496 (values (read s) (read s))))))))
497 (multiple-value-list (funcall composite "2 11")))
498 (5 1))
499
500 (deftest multiple-value-compose.3
501 (let ((compose-form (funcall (compiler-macro-function 'multiple-valu…
502 '(multiple-value-compose
503 #'truncate
504 (lambda (x y)
505 (values y x))
506 (lambda (x)
507 (with-input-from-string (s x)
508 (values (read s) (read s)))))
509 nil)))
510 (let ((fun (funcall (compile nil `(lambda () ,compose-form)))))
511 (multiple-value-list (funcall fun "2 9"))))
512 (4 1))
513
514 (deftest multiple-value-compose.4
515 (let ((composite (multiple-value-compose #'truncate)))
516 (multiple-value-list (funcall composite 9 2)))
517 (4 1))
518
519 (deftest curry.1
520 (let ((curried (curry '+ 3)))
521 (funcall curried 1 5))
522 9)
523
524 (deftest curry.2
525 (let ((curried (locally (declare (notinline curry))
526 (curry '* 2 3))))
527 (funcall curried 7))
528 42)
529
530 (deftest curry.3
531 (let ((curried-form (funcall (compiler-macro-function 'curry)
532 '(curry '/ 8)
533 nil)))
534 (let ((fun (funcall (compile nil `(lambda () ,curried-form)))))
535 (funcall fun 2)))
536 4)
537
538 (deftest curry.4
539 (let* ((x 1)
540 (curried (curry (progn
541 (incf x)
542 (lambda (y z) (* x y z)))
543 3)))
544 (list (funcall curried 7)
545 (funcall curried 7)
546 x))
547 (42 42 2))
548
549 (deftest rcurry.1
550 (let ((r (rcurry '/ 2)))
551 (funcall r 8))
552 4)
553
554 (deftest rcurry.2
555 (let* ((x 1)
556 (curried (rcurry (progn
557 (incf x)
558 (lambda (y z) (* x y z)))
559 3)))
560 (list (funcall curried 7)
561 (funcall curried 7)
562 x))
563 (42 42 2))
564
565 (deftest named-lambda.1
566 (let ((fac (named-lambda fac (x)
567 (if (> x 1)
568 (* x (fac (- x 1)))
569 x))))
570 (funcall fac 5))
571 120)
572
573 (deftest named-lambda.2
574 (let ((fac (named-lambda fac (&key x)
575 (if (> x 1)
576 (* x (fac :x (- x 1)))
577 x))))
578 (funcall fac :x 5))
579 120)
580
581 ;;;; Lists
582
583 (deftest alist-plist.1
584 (alist-plist '((a . 1) (b . 2) (c . 3)))
585 (a 1 b 2 c 3))
586
587 (deftest plist-alist.1
588 (plist-alist '(a 1 b 2 c 3))
589 ((a . 1) (b . 2) (c . 3)))
590
591 (deftest unionf.1
592 (let* ((list (list 1 2 3))
593 (orig list))
594 (unionf list (list 1 2 4))
595 (values (equal orig (list 1 2 3))
596 (eql (length list) 4)
597 (set-difference list (list 1 2 3 4))
598 (set-difference (list 1 2 3 4) list)))
599 t
600 t
601 nil
602 nil)
603
604 (deftest nunionf.1
605 (let ((list (list 1 2 3)))
606 (nunionf list (list 1 2 4))
607 (values (eql (length list) 4)
608 (set-difference (list 1 2 3 4) list)
609 (set-difference list (list 1 2 3 4))))
610 t
611 nil
612 nil)
613
614 (deftest appendf.1
615 (let* ((list (list 1 2 3))
616 (orig list))
617 (appendf list '(4 5 6) '(7 8))
618 (list list (eq list orig)))
619 ((1 2 3 4 5 6 7 8) nil))
620
621 (deftest nconcf.1
622 (let ((list1 (list 1 2 3))
623 (list2 (list 4 5 6)))
624 (nconcf list1 list2 (list 7 8 9))
625 list1)
626 (1 2 3 4 5 6 7 8 9))
627
628 (deftest circular-list.1
629 (let ((circle (circular-list 1 2 3)))
630 (list (first circle)
631 (second circle)
632 (third circle)
633 (fourth circle)
634 (eq circle (nthcdr 3 circle))))
635 (1 2 3 1 t))
636
637 (deftest circular-list-p.1
638 (let* ((circle (circular-list 1 2 3 4))
639 (tree (list circle circle))
640 (dotted (cons circle t))
641 (proper (list 1 2 3 circle))
642 (tailcirc (list* 1 2 3 circle)))
643 (list (circular-list-p circle)
644 (circular-list-p tree)
645 (circular-list-p dotted)
646 (circular-list-p proper)
647 (circular-list-p tailcirc)))
648 (t nil nil nil t))
649
650 (deftest circular-list-p.2
651 (circular-list-p 'foo)
652 nil)
653
654 (deftest circular-tree-p.1
655 (let* ((circle (circular-list 1 2 3 4))
656 (tree1 (list circle circle))
657 (tree2 (let* ((level2 (list 1 nil 2))
658 (level1 (list level2)))
659 (setf (second level2) level1)
660 level1))
661 (dotted (cons circle t))
662 (proper (list 1 2 3 circle))
663 (tailcirc (list* 1 2 3 circle))
664 (quite-proper (list 1 2 3))
665 (quite-dotted (list 1 (cons 2 3))))
666 (list (circular-tree-p circle)
667 (circular-tree-p tree1)
668 (circular-tree-p tree2)
669 (circular-tree-p dotted)
670 (circular-tree-p proper)
671 (circular-tree-p tailcirc)
672 (circular-tree-p quite-proper)
673 (circular-tree-p quite-dotted)))
674 (t t t t t t nil nil))
675
676 (deftest circular-tree-p.2
677 (alexandria:circular-tree-p '#1=(#1#))
678 t)
679
680 (deftest proper-list-p.1
681 (let ((l1 (list 1))
682 (l2 (list 1 2))
683 (l3 (cons 1 2))
684 (l4 (list (cons 1 2) 3))
685 (l5 (circular-list 1 2)))
686 (list (proper-list-p l1)
687 (proper-list-p l2)
688 (proper-list-p l3)
689 (proper-list-p l4)
690 (proper-list-p l5)))
691 (t t nil t nil))
692
693 (deftest proper-list-p.2
694 (proper-list-p '(1 2 . 3))
695 nil)
696
697 (deftest proper-list.type.1
698 (let ((l1 (list 1))
699 (l2 (list 1 2))
700 (l3 (cons 1 2))
701 (l4 (list (cons 1 2) 3))
702 (l5 (circular-list 1 2)))
703 (list (typep l1 'proper-list)
704 (typep l2 'proper-list)
705 (typep l3 'proper-list)
706 (typep l4 'proper-list)
707 (typep l5 'proper-list)))
708 (t t nil t nil))
709
710 (deftest proper-list-length.1
711 (values
712 (proper-list-length nil)
713 (proper-list-length (list 1))
714 (proper-list-length (list 2 2))
715 (proper-list-length (list 3 3 3))
716 (proper-list-length (list 4 4 4 4))
717 (proper-list-length (list 5 5 5 5 5))
718 (proper-list-length (list 6 6 6 6 6 6))
719 (proper-list-length (list 7 7 7 7 7 7 7))
720 (proper-list-length (list 8 8 8 8 8 8 8 8))
721 (proper-list-length (list 9 9 9 9 9 9 9 9 9)))
722 0 1 2 3 4 5 6 7 8 9)
723
724 (deftest proper-list-length.2
725 (flet ((plength (x)
726 (handler-case
727 (proper-list-length x)
728 (type-error ()
729 :ok))))
730 (values
731 (plength (list* 1))
732 (plength (list* 2 2))
733 (plength (list* 3 3 3))
734 (plength (list* 4 4 4 4))
735 (plength (list* 5 5 5 5 5))
736 (plength (list* 6 6 6 6 6 6))
737 (plength (list* 7 7 7 7 7 7 7))
738 (plength (list* 8 8 8 8 8 8 8 8))
739 (plength (list* 9 9 9 9 9 9 9 9 9))))
740 :ok :ok :ok
741 :ok :ok :ok
742 :ok :ok :ok)
743
744 (deftest lastcar.1
745 (let ((l1 (list 1))
746 (l2 (list 1 2)))
747 (list (lastcar l1)
748 (lastcar l2)))
749 (1 2))
750
751 (deftest lastcar.error.2
752 (handler-case
753 (progn
754 (lastcar (circular-list 1 2 3))
755 nil)
756 (error ()
757 t))
758 t)
759
760 (deftest setf-lastcar.1
761 (let ((l (list 1 2 3 4)))
762 (values (lastcar l)
763 (progn
764 (setf (lastcar l) 42)
765 (lastcar l))))
766 4
767 42)
768
769 (deftest setf-lastcar.2
770 (let ((l (circular-list 1 2 3)))
771 (multiple-value-bind (res err)
772 (ignore-errors (setf (lastcar l) 4))
773 (typep err 'type-error)))
774 t)
775
776 (deftest make-circular-list.1
777 (let ((l (make-circular-list 3 :initial-element :x)))
778 (setf (car l) :y)
779 (list (eq l (nthcdr 3 l))
780 (first l)
781 (second l)
782 (third l)
783 (fourth l)))
784 (t :y :x :x :y))
785
786 (deftest circular-list.type.1
787 (let* ((l1 (list 1 2 3))
788 (l2 (circular-list 1 2 3))
789 (l3 (list* 1 2 3 l2)))
790 (list (typep l1 'circular-list)
791 (typep l2 'circular-list)
792 (typep l3 'circular-list)))
793 (nil t t))
794
795 (deftest ensure-list.1
796 (let ((x (list 1))
797 (y 2))
798 (list (ensure-list x)
799 (ensure-list y)))
800 ((1) (2)))
801
802 (deftest ensure-cons.1
803 (let ((x (cons 1 2))
804 (y nil)
805 (z "foo"))
806 (values (ensure-cons x)
807 (ensure-cons y)
808 (ensure-cons z)))
809 (1 . 2)
810 (nil)
811 ("foo"))
812
813 (deftest setp.1
814 (setp '(1))
815 t)
816
817 (deftest setp.2
818 (setp nil)
819 t)
820
821 (deftest setp.3
822 (setp "foo")
823 nil)
824
825 (deftest setp.4
826 (setp '(1 2 3 1))
827 nil)
828
829 (deftest setp.5
830 (setp '(1 2 3))
831 t)
832
833 (deftest setp.6
834 (setp '(a :a))
835 t)
836
837 (deftest setp.7
838 (setp '(a :a) :key 'character)
839 nil)
840
841 (deftest setp.8
842 (setp '(a :a) :key 'character :test (constantly nil))
843 t)
844
845 (deftest set-equal.1
846 (set-equal '(1 2 3) '(3 1 2))
847 t)
848
849 (deftest set-equal.2
850 (set-equal '("Xa") '("Xb")
851 :test (lambda (a b) (eql (char a 0) (char b 0))))
852 t)
853
854 (deftest set-equal.3
855 (set-equal '(1 2) '(4 2))
856 nil)
857
858 (deftest set-equal.4
859 (set-equal '(a b c) '(:a :b :c) :key 'string :test 'equal)
860 t)
861
862 (deftest set-equal.5
863 (set-equal '(a d c) '(:a :b :c) :key 'string :test 'equal)
864 nil)
865
866 (deftest set-equal.6
867 (set-equal '(a b c) '(a b c d))
868 nil)
869
870 (deftest map-product.1
871 (map-product 'cons '(2 3) '(1 4))
872 ((2 . 1) (2 . 4) (3 . 1) (3 . 4)))
873
874 (deftest map-product.2
875 (map-product #'cons '(2 3) '(1 4))
876 ((2 . 1) (2 . 4) (3 . 1) (3 . 4)))
877
878 (deftest flatten.1
879 (flatten '((1) 2 (((3 4))) ((((5)) 6)) 7))
880 (1 2 3 4 5 6 7))
881
882 (deftest remove-from-plist.1
883 (let ((orig '(a 1 b 2 c 3 d 4)))
884 (list (remove-from-plist orig 'a 'c)
885 (remove-from-plist orig 'b 'd)
886 (remove-from-plist orig 'b)
887 (remove-from-plist orig 'a)
888 (remove-from-plist orig 'd 42 "zot")
889 (remove-from-plist orig 'a 'b 'c 'd)
890 (remove-from-plist orig 'a 'b 'c 'd 'x)
891 (equal orig '(a 1 b 2 c 3 d 4))))
892 ((b 2 d 4)
893 (a 1 c 3)
894 (a 1 c 3 d 4)
895 (b 2 c 3 d 4)
896 (a 1 b 2 c 3)
897 nil
898 nil
899 t))
900
901 (deftest delete-from-plist.1
902 (let ((orig '(a 1 b 2 c 3 d 4 d 5)))
903 (list (delete-from-plist (copy-list orig) 'a 'c)
904 (delete-from-plist (copy-list orig) 'b 'd)
905 (delete-from-plist (copy-list orig) 'b)
906 (delete-from-plist (copy-list orig) 'a)
907 (delete-from-plist (copy-list orig) 'd 42 "zot")
908 (delete-from-plist (copy-list orig) 'a 'b 'c 'd)
909 (delete-from-plist (copy-list orig) 'a 'b 'c 'd 'x)
910 (equal orig (delete-from-plist orig))
911 (eq orig (delete-from-plist orig))))
912 ((b 2 d 4 d 5)
913 (a 1 c 3)
914 (a 1 c 3 d 4 d 5)
915 (b 2 c 3 d 4 d 5)
916 (a 1 b 2 c 3)
917 nil
918 nil
919 t
920 t))
921
922 (deftest mappend.1
923 (mappend (compose 'list '*) '(1 2 3) '(1 2 3))
924 (1 4 9))
925
926 (deftest assoc-value.1
927 (let ((key1 '(complex key))
928 (key2 'simple-key)
929 (alist '())
930 (result '()))
931 (push 1 (assoc-value alist key1 :test #'equal))
932 (push 2 (assoc-value alist key1 :test 'equal))
933 (push 42 (assoc-value alist key2))
934 (push 43 (assoc-value alist key2 :test 'eq))
935 (push (assoc-value alist key1 :test #'equal) result)
936 (push (assoc-value alist key2) result)
937
938 (push 'very (rassoc-value alist (list 2 1) :test #'equal))
939 (push (cdr (assoc '(very complex key) alist :test #'equal)) result)
940 result)
941 ((2 1) (43 42) (2 1)))
942
943 ;;;; Numbers
944
945 (deftest clamp.1
946 (list (clamp 1.5 1 2)
947 (clamp 2.0 1 2)
948 (clamp 1.0 1 2)
949 (clamp 3 1 2)
950 (clamp 0 1 2))
951 (1.5 2.0 1.0 2 1))
952
953 (deftest gaussian-random.1
954 (let ((min -0.2)
955 (max +0.2))
956 (multiple-value-bind (g1 g2)
957 (gaussian-random min max)
958 (values (<= min g1 max)
959 (<= min g2 max)
960 (/= g1 g2) ;uh
961 )))
962 t
963 t
964 t)
965
966 #+sbcl
967 (deftest gaussian-random.2
968 (handler-case
969 (sb-ext:with-timeout 2
970 (progn
971 (loop
972 :repeat 10000
973 :do (gaussian-random 0 nil))
974 'done))
975 (sb-ext:timeout ()
976 'timed-out))
977 done)
978
979 (deftest iota.1
980 (iota 3)
981 (0 1 2))
982
983 (deftest iota.2
984 (iota 3 :start 0.0d0)
985 (0.0d0 1.0d0 2.0d0))
986
987 (deftest iota.3
988 (iota 3 :start 2 :step 3.0)
989 (2.0 5.0 8.0))
990
991 (deftest map-iota.1
992 (let (all)
993 (declare (notinline map-iota))
994 (values (map-iota (lambda (x) (push x all))
995 3
996 :start 2
997 :step 1.1d0)
998 all))
999 3
1000 (4.2d0 3.1d0 2.0d0))
1001
1002 (deftest lerp.1
1003 (lerp 0.5 1 2)
1004 1.5)
1005
1006 (deftest lerp.2
1007 (lerp 0.1 1 2)
1008 1.1)
1009
1010 (deftest lerp.3
1011 (lerp 0.1 4 25)
1012 6.1)
1013
1014 (deftest mean.1
1015 (mean '(1 2 3))
1016 2)
1017
1018 (deftest mean.2
1019 (mean '(1 2 3 4))
1020 5/2)
1021
1022 (deftest mean.3
1023 (mean '(1 2 10))
1024 13/3)
1025
1026 (deftest median.1
1027 (median '(100 0 99 1 98 2 97))
1028 97)
1029
1030 (deftest median.2
1031 (median '(100 0 99 1 98 2 97 96))
1032 193/2)
1033
1034 (deftest variance.1
1035 (variance (list 1 2 3))
1036 2/3)
1037
1038 (deftest standard-deviation.1
1039 (< 0 (standard-deviation (list 1 2 3)) 1)
1040 t)
1041
1042 (deftest maxf.1
1043 (let ((x 1))
1044 (maxf x 2)
1045 x)
1046 2)
1047
1048 (deftest maxf.2
1049 (let ((x 1))
1050 (maxf x 0)
1051 x)
1052 1)
1053
1054 (deftest maxf.3
1055 (let ((x 1)
1056 (c 0))
1057 (maxf x (incf c))
1058 (list x c))
1059 (1 1))
1060
1061 (deftest maxf.4
1062 (let ((xv (vector 0 0 0))
1063 (p 0))
1064 (maxf (svref xv (incf p)) (incf p))
1065 (list p xv))
1066 (2 #(0 2 0)))
1067
1068 (deftest minf.1
1069 (let ((y 1))
1070 (minf y 0)
1071 y)
1072 0)
1073
1074 (deftest minf.2
1075 (let ((xv (vector 10 10 10))
1076 (p 0))
1077 (minf (svref xv (incf p)) (incf p))
1078 (list p xv))
1079 (2 #(10 2 10)))
1080
1081 (deftest subfactorial.1
1082 (mapcar #'subfactorial (iota 22))
1083 (1
1084 0
1085 1
1086 2
1087 9
1088 44
1089 265
1090 1854
1091 14833
1092 133496
1093 1334961
1094 14684570
1095 176214841
1096 2290792932
1097 32071101049
1098 481066515734
1099 7697064251745
1100 130850092279664
1101 2355301661033953
1102 44750731559645106
1103 895014631192902121
1104 18795307255050944540))
1105
1106 ;;;; Arrays
1107
1108 #+nil
1109 (deftest array-index.type)
1110
1111 #+nil
1112 (deftest copy-array)
1113
1114 ;;;; Sequences
1115
1116 (deftest rotate.1
1117 (list (rotate (list 1 2 3) 0)
1118 (rotate (list 1 2 3) 1)
1119 (rotate (list 1 2 3) 2)
1120 (rotate (list 1 2 3) 3)
1121 (rotate (list 1 2 3) 4))
1122 ((1 2 3)
1123 (3 1 2)
1124 (2 3 1)
1125 (1 2 3)
1126 (3 1 2)))
1127
1128 (deftest rotate.2
1129 (list (rotate (vector 1 2 3 4) 0)
1130 (rotate (vector 1 2 3 4))
1131 (rotate (vector 1 2 3 4) 2)
1132 (rotate (vector 1 2 3 4) 3)
1133 (rotate (vector 1 2 3 4) 4)
1134 (rotate (vector 1 2 3 4) 5))
1135 (#(1 2 3 4)
1136 #(4 1 2 3)
1137 #(3 4 1 2)
1138 #(2 3 4 1)
1139 #(1 2 3 4)
1140 #(4 1 2 3)))
1141
1142 (deftest rotate.3
1143 (list (rotate (list 1 2 3) 0)
1144 (rotate (list 1 2 3) -1)
1145 (rotate (list 1 2 3) -2)
1146 (rotate (list 1 2 3) -3)
1147 (rotate (list 1 2 3) -4))
1148 ((1 2 3)
1149 (2 3 1)
1150 (3 1 2)
1151 (1 2 3)
1152 (2 3 1)))
1153
1154 (deftest rotate.4
1155 (list (rotate (vector 1 2 3 4) 0)
1156 (rotate (vector 1 2 3 4) -1)
1157 (rotate (vector 1 2 3 4) -2)
1158 (rotate (vector 1 2 3 4) -3)
1159 (rotate (vector 1 2 3 4) -4)
1160 (rotate (vector 1 2 3 4) -5))
1161 (#(1 2 3 4)
1162 #(2 3 4 1)
1163 #(3 4 1 2)
1164 #(4 1 2 3)
1165 #(1 2 3 4)
1166 #(2 3 4 1)))
1167
1168 (deftest rotate.5
1169 (values (rotate (list 1) 17)
1170 (rotate (list 1) -5))
1171 (1)
1172 (1))
1173
1174 (deftest shuffle.1
1175 (let ((s (shuffle (iota 100))))
1176 (list (equal s (iota 100))
1177 (every (lambda (x)
1178 (member x s))
1179 (iota 100))
1180 (every (lambda (x)
1181 (typep x '(integer 0 99)))
1182 s)))
1183 (nil t t))
1184
1185 (deftest shuffle.2
1186 (let ((s (shuffle (coerce (iota 100) 'vector))))
1187 (list (equal s (coerce (iota 100) 'vector))
1188 (every (lambda (x)
1189 (find x s))
1190 (iota 100))
1191 (every (lambda (x)
1192 (typep x '(integer 0 99)))
1193 s)))
1194 (nil t t))
1195
1196 (deftest shuffle.3
1197 (let* ((orig (coerce (iota 21) 'vector))
1198 (copy (copy-seq orig)))
1199 (shuffle copy :start 10 :end 15)
1200 (list (every #'eql (subseq copy 0 10) (subseq orig 0 10))
1201 (every #'eql (subseq copy 15) (subseq orig 15))))
1202 (t t))
1203
1204 (deftest random-elt.1
1205 (let ((s1 #(1 2 3 4))
1206 (s2 '(1 2 3 4)))
1207 (list (dotimes (i 1000 nil)
1208 (unless (member (random-elt s1) s2)
1209 (return nil))
1210 (when (/= (random-elt s1) (random-elt s1))
1211 (return t)))
1212 (dotimes (i 1000 nil)
1213 (unless (member (random-elt s2) s2)
1214 (return nil))
1215 (when (/= (random-elt s2) (random-elt s2))
1216 (return t)))))
1217 (t t))
1218
1219 (deftest removef.1
1220 (let* ((x '(1 2 3))
1221 (x* x)
1222 (y #(1 2 3))
1223 (y* y))
1224 (removef x 1)
1225 (removef y 3)
1226 (list x x* y y*))
1227 ((2 3)
1228 (1 2 3)
1229 #(1 2)
1230 #(1 2 3)))
1231
1232 (deftest deletef.1
1233 (let* ((x (list 1 2 3))
1234 (x* x)
1235 (y (vector 1 2 3)))
1236 (deletef x 2)
1237 (deletef y 1)
1238 (list x x* y))
1239 ((1 3)
1240 (1 3)
1241 #(2 3)))
1242
1243 (deftest map-permutations.1
1244 (let ((seq (list 1 2 3))
1245 (seen nil)
1246 (ok t))
1247 (map-permutations (lambda (s)
1248 (unless (set-equal s seq)
1249 (setf ok nil))
1250 (when (member s seen :test 'equal)
1251 (setf ok nil))
1252 (push s seen))
1253 seq
1254 :copy t)
1255 (values ok (length seen)))
1256 t
1257 6)
1258
1259 (deftest proper-sequence.type.1
1260 (mapcar (lambda (x)
1261 (typep x 'proper-sequence))
1262 (list (list 1 2 3)
1263 (vector 1 2 3)
1264 #2a((1 2) (3 4))
1265 (circular-list 1 2 3 4)))
1266 (t t nil nil))
1267
1268 (deftest emptyp.1
1269 (mapcar #'emptyp
1270 (list (list 1)
1271 (circular-list 1)
1272 nil
1273 (vector)
1274 (vector 1)))
1275 (nil nil t t nil))
1276
1277 (deftest sequence-of-length-p.1
1278 (mapcar #'sequence-of-length-p
1279 (list nil
1280 #()
1281 (list 1)
1282 (vector 1)
1283 (list 1 2)
1284 (vector 1 2)
1285 (list 1 2)
1286 (vector 1 2)
1287 (list 1 2)
1288 (vector 1 2))
1289 (list 0
1290 0
1291 1
1292 1
1293 2
1294 2
1295 1
1296 1
1297 4
1298 4))
1299 (t t t t t t nil nil nil nil))
1300
1301 (deftest length=.1
1302 (mapcar #'length=
1303 (list nil
1304 #()
1305 (list 1)
1306 (vector 1)
1307 (list 1 2)
1308 (vector 1 2)
1309 (list 1 2)
1310 (vector 1 2)
1311 (list 1 2)
1312 (vector 1 2))
1313 (list 0
1314 0
1315 1
1316 1
1317 2
1318 2
1319 1
1320 1
1321 4
1322 4))
1323 (t t t t t t nil nil nil nil))
1324
1325 (deftest length=.2
1326 ;; test the compiler macro
1327 (macrolet ((x (&rest args)
1328 (funcall
1329 (compile nil
1330 `(lambda ()
1331 (length= ,@args))))))
1332 (list (x 2 '(1 2))
1333 (x '(1 2) '(3 4))
1334 (x '(1 2) 2)
1335 (x '(1 2) 2 '(3 4))
1336 (x 1 2 3)))
1337 (t t t t nil))
1338
1339 (deftest copy-sequence.1
1340 (let ((l (list 1 2 3))
1341 (v (vector #\a #\b #\c)))
1342 (declare (notinline copy-sequence))
1343 (let ((l.list (copy-sequence 'list l))
1344 (l.vector (copy-sequence 'vector l))
1345 (l.spec-v (copy-sequence '(vector fixnum) l))
1346 (v.vector (copy-sequence 'vector v))
1347 (v.list (copy-sequence 'list v))
1348 (v.string (copy-sequence 'string v)))
1349 (list (member l (list l.list l.vector l.spec-v))
1350 (member v (list v.vector v.list v.string))
1351 (equal l.list l)
1352 (equalp l.vector #(1 2 3))
1353 (type= (upgraded-array-element-type 'fixnum)
1354 (array-element-type l.spec-v))
1355 (equalp v.vector v)
1356 (equal v.list '(#\a #\b #\c))
1357 (equal "abc" v.string))))
1358 (nil nil t t t t t t))
1359
1360 (deftest first-elt.1
1361 (mapcar #'first-elt
1362 (list (list 1 2 3)
1363 "abc"
1364 (vector :a :b :c)))
1365 (1 #\a :a))
1366
1367 (deftest first-elt.error.1
1368 (mapcar (lambda (x)
1369 (handler-case
1370 (first-elt x)
1371 (type-error ()
1372 :type-error)))
1373 (list nil
1374 #()
1375 12
1376 :zot))
1377 (:type-error
1378 :type-error
1379 :type-error
1380 :type-error))
1381
1382 (deftest setf-first-elt.1
1383 (let ((l (list 1 2 3))
1384 (s (copy-seq "foobar"))
1385 (v (vector :a :b :c)))
1386 (setf (first-elt l) -1
1387 (first-elt s) #\x
1388 (first-elt v) 'zot)
1389 (values l s v))
1390 (-1 2 3)
1391 "xoobar"
1392 #(zot :b :c))
1393
1394 (deftest setf-first-elt.error.1
1395 (let ((l 'foo))
1396 (multiple-value-bind (res err)
1397 (ignore-errors (setf (first-elt l) 4))
1398 (typep err 'type-error)))
1399 t)
1400
1401 (deftest last-elt.1
1402 (mapcar #'last-elt
1403 (list (list 1 2 3)
1404 (vector :a :b :c)
1405 "FOOBAR"
1406 #*001
1407 #*010))
1408 (3 :c #\R 1 0))
1409
1410 (deftest last-elt.error.1
1411 (mapcar (lambda (x)
1412 (handler-case
1413 (last-elt x)
1414 (type-error ()
1415 :type-error)))
1416 (list nil
1417 #()
1418 12
1419 :zot
1420 (circular-list 1 2 3)
1421 (list* 1 2 3 (circular-list 4 5))))
1422 (:type-error
1423 :type-error
1424 :type-error
1425 :type-error
1426 :type-error
1427 :type-error))
1428
1429 (deftest setf-last-elt.1
1430 (let ((l (list 1 2 3))
1431 (s (copy-seq "foobar"))
1432 (b (copy-seq #*010101001)))
1433 (setf (last-elt l) '???
1434 (last-elt s) #\?
1435 (last-elt b) 0)
1436 (values l s b))
1437 (1 2 ???)
1438 "fooba?"
1439 #*010101000)
1440
1441 (deftest setf-last-elt.error.1
1442 (handler-case
1443 (setf (last-elt 'foo) 13)
1444 (type-error ()
1445 :type-error))
1446 :type-error)
1447
1448 (deftest starts-with.1
1449 (list (starts-with 1 '(1 2 3))
1450 (starts-with 1 #(1 2 3))
1451 (starts-with #\x "xyz")
1452 (starts-with 2 '(1 2 3))
1453 (starts-with 3 #(1 2 3))
1454 (starts-with 1 1)
1455 (starts-with nil nil))
1456 (t t t nil nil nil nil))
1457
1458 (deftest starts-with.2
1459 (values (starts-with 1 '(-1 2 3) :key '-)
1460 (starts-with "foo" '("foo" "bar") :test 'equal)
1461 (starts-with "f" '(#\f) :key 'string :test 'equal)
1462 (starts-with -1 '(0 1 2) :key #'1+)
1463 (starts-with "zot" '("ZOT") :test 'equal))
1464 t
1465 t
1466 t
1467 nil
1468 nil)
1469
1470 (deftest ends-with.1
1471 (list (ends-with 3 '(1 2 3))
1472 (ends-with 3 #(1 2 3))
1473 (ends-with #\z "xyz")
1474 (ends-with 2 '(1 2 3))
1475 (ends-with 1 #(1 2 3))
1476 (ends-with 1 1)
1477 (ends-with nil nil))
1478 (t t t nil nil nil nil))
1479
1480 (deftest ends-with.2
1481 (values (ends-with 2 '(0 13 1) :key '1+)
1482 (ends-with "foo" (vector "bar" "foo") :test 'equal)
1483 (ends-with "X" (vector 1 2 #\X) :key 'string :test 'equal)
1484 (ends-with "foo" "foo" :test 'equal))
1485 t
1486 t
1487 t
1488 nil)
1489
1490 (deftest ends-with.error.1
1491 (handler-case
1492 (ends-with 3 (circular-list 3 3 3 1 3 3))
1493 (type-error ()
1494 :type-error))
1495 :type-error)
1496
1497 (deftest sequences.passing-improper-lists
1498 (macrolet ((signals-error-p (form)
1499 `(handler-case
1500 (progn ,form nil)
1501 (type-error (e)
1502 t)))
1503 (cut (fn &rest args)
1504 (with-gensyms (arg)
1505 (print`(lambda (,arg)
1506 (apply ,fn (list ,@(substitute arg '_ args))))))))
1507 (let ((circular-list (make-circular-list 5 :initial-element :foo))
1508 (dotted-list (list* 'a 'b 'c 'd)))
1509 (loop for nth from 0
1510 for fn in (list
1511 (cut #'lastcar _)
1512 (cut #'rotate _ 3)
1513 (cut #'rotate _ -3)
1514 (cut #'shuffle _)
1515 (cut #'random-elt _)
1516 (cut #'last-elt _)
1517 (cut #'ends-with :foo _))
1518 nconcing
1519 (let ((on-circular-p (signals-error-p (funcall fn circu…
1520 (on-dotted-p (signals-error-p (funcall fn dotted-…
1521 (when (or (not on-circular-p) (not on-dotted-p))
1522 (append
1523 (unless on-circular-p
1524 (let ((*print-circle* t))
1525 (list
1526 (format nil
1527 "No appropriate error signalled when …
1528 circular-list nth))))
1529 (unless on-dotted-p
1530 (list
1531 (format nil
1532 "No appropriate error signalled when pa…
1533 dotted-list nth)))))))))
1534 nil)
1535
1536 ;;;; IO
1537
1538 (deftest read-stream-content-into-string.1
1539 (values (with-input-from-string (stream "foo bar")
1540 (read-stream-content-into-string stream))
1541 (with-input-from-string (stream "foo bar")
1542 (read-stream-content-into-string stream :buffer-size 1))
1543 (with-input-from-string (stream "foo bar")
1544 (read-stream-content-into-string stream :buffer-size 6))
1545 (with-input-from-string (stream "foo bar")
1546 (read-stream-content-into-string stream :buffer-size 7)))
1547 "foo bar"
1548 "foo bar"
1549 "foo bar"
1550 "foo bar")
1551
1552 (deftest read-stream-content-into-string.2
1553 (handler-case
1554 (let ((stream (make-broadcast-stream)))
1555 (read-stream-content-into-string stream :buffer-size 0))
1556 (type-error ()
1557 :type-error))
1558 :type-error)
1559
1560 #+(or)
1561 (defvar *octets*
1562 (map '(simple-array (unsigned-byte 8) (7)) #'char-code "foo bar"))
1563
1564 #+(or)
1565 (deftest read-stream-content-into-byte-vector.1
1566 (values (with-input-from-byte-vector (stream *octets*)
1567 (read-stream-content-into-byte-vector stream))
1568 (with-input-from-byte-vector (stream *octets*)
1569 (read-stream-content-into-byte-vector stream :initial-size…
1570 (with-input-from-byte-vector (stream *octets*)
1571 (read-stream-content-into-byte-vector stream 'alexandria::…
1572 (with-input-from-byte-vector (stream *octets*)
1573 (read-stream-content-into-byte-vector stream 'alexandria::…
1574 *octets*
1575 *octets*
1576 *octets*
1577 (subseq *octets* 0 3))
1578
1579 (deftest read-stream-content-into-byte-vector.2
1580 (handler-case
1581 (let ((stream (make-broadcast-stream)))
1582 (read-stream-content-into-byte-vector stream :initial-size 0))
1583 (type-error ()
1584 :type-error))
1585 :type-error)
1586
1587 ;;;; Macros
1588
1589 (deftest with-unique-names.1
1590 (let ((*gensym-counter* 0))
1591 (let ((syms (with-unique-names (foo bar quux)
1592 (list foo bar quux))))
1593 (list (find-if #'symbol-package syms)
1594 (equal '("FOO0" "BAR1" "QUUX2")
1595 (mapcar #'symbol-name syms)))))
1596 (nil t))
1597
1598 (deftest with-unique-names.2
1599 (let ((*gensym-counter* 0))
1600 (let ((syms (with-unique-names ((foo "_foo_") (bar -bar-) (quux #\…
1601 (list foo bar quux))))
1602 (list (find-if #'symbol-package syms)
1603 (equal '("_foo_0" "-BAR-1" "q2")
1604 (mapcar #'symbol-name syms)))))
1605 (nil t))
1606
1607 (deftest with-unique-names.3
1608 (let ((*gensym-counter* 0))
1609 (multiple-value-bind (res err)
1610 (ignore-errors
1611 (eval
1612 '(let ((syms
1613 (with-unique-names ((foo "_foo_") (bar -bar-) (quux…
1614 (list foo bar quux))))
1615 (list (find-if #'symbol-package syms)
1616 (equal '("_foo_0" "-BAR-1" "q2")
1617 (mapcar #'symbol-name syms))))))
1618 (errorp err)))
1619 t)
1620
1621 (deftest once-only.1
1622 (macrolet ((cons1.good (x)
1623 (once-only (x)
1624 `(cons ,x ,x)))
1625 (cons1.bad (x)
1626 `(cons ,x ,x)))
1627 (let ((y 0))
1628 (list (cons1.good (incf y))
1629 y
1630 (cons1.bad (incf y))
1631 y)))
1632 ((1 . 1) 1 (2 . 3) 3))
1633
1634 (deftest once-only.2
1635 (macrolet ((cons1 (x)
1636 (once-only ((y x))
1637 `(cons ,y ,y))))
1638 (let ((z 0))
1639 (list (cons1 (incf z))
1640 z
1641 (cons1 (incf z)))))
1642 ((1 . 1) 1 (2 . 2)))
1643
1644 (deftest parse-body.1
1645 (parse-body '("doc" "body") :documentation t)
1646 ("body")
1647 nil
1648 "doc")
1649
1650 (deftest parse-body.2
1651 (parse-body '("body") :documentation t)
1652 ("body")
1653 nil
1654 nil)
1655
1656 (deftest parse-body.3
1657 (parse-body '("doc" "body"))
1658 ("doc" "body")
1659 nil
1660 nil)
1661
1662 (deftest parse-body.4
1663 (parse-body '((declare (foo)) "doc" (declare (bar)) body) :documenta…
1664 (body)
1665 ((declare (foo)) (declare (bar)))
1666 "doc")
1667
1668 (deftest parse-body.5
1669 (parse-body '((declare (foo)) "doc" (declare (bar)) body))
1670 ("doc" (declare (bar)) body)
1671 ((declare (foo)))
1672 nil)
1673
1674 (deftest parse-body.6
1675 (multiple-value-bind (res err)
1676 (ignore-errors
1677 (parse-body '("foo" "bar" "quux")
1678 :documentation t))
1679 (errorp err))
1680 t)
1681
1682 ;;;; Symbols
1683
1684 (deftest ensure-symbol.1
1685 (ensure-symbol :cons :cl)
1686 cons
1687 :external)
1688
1689 (deftest ensure-symbol.2
1690 (ensure-symbol "CONS" :alexandria)
1691 cons
1692 :inherited)
1693
1694 (deftest ensure-symbol.3
1695 (ensure-symbol 'foo :keyword)
1696 :foo
1697 :external)
1698
1699 (deftest ensure-symbol.4
1700 (ensure-symbol #\* :alexandria)
1701 *
1702 :inherited)
1703
1704 (deftest format-symbol.1
1705 (let ((s (format-symbol nil '#:x-~d 13)))
1706 (list (symbol-package s)
1707 (string= (string '#:x-13) (symbol-name s))))
1708 (nil t))
1709
1710 (deftest format-symbol.2
1711 (format-symbol :keyword '#:sym-~a (string :bolic))
1712 :sym-bolic)
1713
1714 (deftest format-symbol.3
1715 (let ((*package* (find-package :cl)))
1716 (format-symbol t '#:find-~a (string 'package)))
1717 find-package)
1718
1719 (deftest make-keyword.1
1720 (list (make-keyword 'zot)
1721 (make-keyword "FOO")
1722 (make-keyword #\Q))
1723 (:zot :foo :q))
1724
1725 (deftest make-gensym-list.1
1726 (let ((*gensym-counter* 0))
1727 (let ((syms (make-gensym-list 3 "FOO")))
1728 (list (find-if 'symbol-package syms)
1729 (equal '("FOO0" "FOO1" "FOO2")
1730 (mapcar 'symbol-name syms)))))
1731 (nil t))
1732
1733 (deftest make-gensym-list.2
1734 (let ((*gensym-counter* 0))
1735 (let ((syms (make-gensym-list 3)))
1736 (list (find-if 'symbol-package syms)
1737 (equal '("G0" "G1" "G2")
1738 (mapcar 'symbol-name syms)))))
1739 (nil t))
1740
1741 ;;;; Type-system
1742
1743 (deftest of-type.1
1744 (locally
1745 (declare (notinline of-type))
1746 (let ((f (of-type 'string)))
1747 (list (funcall f "foo")
1748 (funcall f 'bar))))
1749 (t nil))
1750
1751 (deftest type=.1
1752 (type= 'string 'string)
1753 t
1754 t)
1755
1756 (deftest type=.2
1757 (type= 'list '(or null cons))
1758 t
1759 t)
1760
1761 (deftest type=.3
1762 (type= 'null '(and symbol list))
1763 t
1764 t)
1765
1766 (deftest type=.4
1767 (type= 'string '(satisfies emptyp))
1768 nil
1769 nil)
1770
1771 (deftest type=.5
1772 (type= 'string 'list)
1773 nil
1774 t)
1775
1776 (macrolet
1777 ((test (type numbers)
1778 `(deftest ,(format-symbol t '#:cdr5.~a (string type))
1779 (let ((numbers ,numbers))
1780 (values (mapcar (of-type ',(format-symbol t '#:negative-~a…
1781 (mapcar (of-type ',(format-symbol t '#:non-positiv…
1782 (mapcar (of-type ',(format-symbol t '#:non-negativ…
1783 (mapcar (of-type ',(format-symbol t '#:positive-~a…
1784 (t t t nil nil nil nil)
1785 (t t t t nil nil nil)
1786 (nil nil nil t t t t)
1787 (nil nil nil nil t t t))))
1788 (test fixnum (list most-negative-fixnum -42 -1 0 …
1789 (test integer (list (1- most-negative-fixnum) -42 -1 0 …
1790 (test rational (list (1- most-negative-fixnum) -42/13 -1 0 …
1791 (test real (list most-negative-long-float -42/13 -1 0 …
1792 (test float (list most-negative-short-float -42.02 -1.0 0.…
1793 (test short-float (list most-negative-short-float -42.02s0 -1.0s0 0.…
1794 (test single-float (list most-negative-single-float -42.02f0 -1.0f0 0.…
1795 (test double-float (list most-negative-double-float -42.02d0 -1.0d0 0.…
1796 (test long-float (list most-negative-long-float -42.02l0 -1.0l0 0.…
1797
1798 ;;;; Bindings
1799
1800 (declaim (notinline opaque))
1801 (defun opaque (x)
1802 x)
1803
1804 (deftest if-let.1
1805 (if-let (x (opaque :ok))
1806 x
1807 :bad)
1808 :ok)
1809
1810 (deftest if-let.2
1811 (if-let (x (opaque nil))
1812 :bad
1813 (and (not x) :ok))
1814 :ok)
1815
1816 (deftest if-let.3
1817 (let ((x 1))
1818 (if-let ((x 2)
1819 (y x))
1820 (+ x y)
1821 :oops))
1822 3)
1823
1824 (deftest if-let.4
1825 (if-let ((x 1)
1826 (y nil))
1827 :oops
1828 (and (not y) x))
1829 1)
1830
1831 (deftest if-let.5
1832 (if-let (x)
1833 :oops
1834 (not x))
1835 t)
1836
1837 (deftest if-let.error.1
1838 (handler-case
1839 (eval '(if-let x
1840 :oops
1841 :oops))
1842 (type-error ()
1843 :type-error))
1844 :type-error)
1845
1846 (deftest when-let.1
1847 (when-let (x (opaque :ok))
1848 (setf x (cons x x))
1849 x)
1850 (:ok . :ok))
1851
1852 (deftest when-let.2
1853 (when-let ((x 1)
1854 (y nil)
1855 (z 3))
1856 :oops)
1857 nil)
1858
1859 (deftest when-let.3
1860 (let ((x 1))
1861 (when-let ((x 2)
1862 (y x))
1863 (+ x y)))
1864 3)
1865
1866 (deftest when-let.error.1
1867 (handler-case
1868 (eval '(when-let x :oops))
1869 (type-error ()
1870 :type-error))
1871 :type-error)
1872
1873 (deftest when-let*.1
1874 (let ((x 1))
1875 (when-let* ((x 2)
1876 (y x))
1877 (+ x y)))
1878 4)
1879
1880 (deftest when-let*.2
1881 (let ((y 1))
1882 (when-let* (x y)
1883 (1+ x)))
1884 2)
1885
1886 (deftest when-let*.3
1887 (when-let* ((x t)
1888 (y (consp x))
1889 (z (error "OOPS")))
1890 t)
1891 nil)
1892
1893 (deftest when-let*.error.1
1894 (handler-case
1895 (eval '(when-let* x :oops))
1896 (type-error ()
1897 :type-error))
1898 :type-error)
1899
1900 (deftest doplist.1
1901 (let (keys values)
1902 (doplist (k v '(a 1 b 2 c 3) (values t (reverse keys) (reverse val…
1903 (push k keys)
1904 (push v values)))
1905 t
1906 (a b c)
1907 (1 2 3)
1908 nil
1909 nil)
1910
1911 (deftest count-permutations.1
1912 (values (count-permutations 31 7)
1913 (count-permutations 1 1)
1914 (count-permutations 2 1)
1915 (count-permutations 2 2)
1916 (count-permutations 3 2)
1917 (count-permutations 3 1))
1918 13253058000
1919 1
1920 2
1921 2
1922 6
1923 3)
1924
1925 (deftest binomial-coefficient.1
1926 (alexandria:binomial-coefficient 1239 139)
1927 2879490220228897020077169460056182671884717930992985883548000668352218…
1928
1929 ;; Exercise bignum case (at least on x86).
1930 (deftest binomial-coefficient.2
1931 (alexandria:binomial-coefficient 2000000000000 20)
1932 4309980411772728439504228795903384548563227227404023657417307484315306…
1933
1934 (deftest copy-stream.1
1935 (let ((data "sdkfjhsakfh weior763495ewofhsdfk sdfadlkfjhsadf woif sd…
1936 (values (equal data
1937 (with-input-from-string (in data)
1938 (with-output-to-string (out)
1939 (alexandria:copy-stream in out))))
1940 (equal (subseq data 10 20)
1941 (with-input-from-string (in data)
1942 (with-output-to-string (out)
1943 (alexandria:copy-stream in out :start 10 :end 2…
1944 (equal (subseq data 10)
1945 (with-input-from-string (in data)
1946 (with-output-to-string (out)
1947 (alexandria:copy-stream in out :start 10))))
1948 (equal (subseq data 0 20)
1949 (with-input-from-string (in data)
1950 (with-output-to-string (out)
1951 (alexandria:copy-stream in out :end 20))))))
1952 t
1953 t
1954 t
1955 t)
1956
1957 (deftest extremum.1
1958 (let ((n 0))
1959 (dotimes (i 10)
1960 (let ((data (shuffle (coerce (iota 10000 :start i) 'vector)))
1961 (ok t))
1962 (unless (eql i (extremum data #'<))
1963 (setf ok nil))
1964 (unless (eql i (extremum (coerce data 'list) #'<))
1965 (setf ok nil))
1966 (unless (eql (+ 9999 i) (extremum data #'>))
1967 (setf ok nil))
1968 (unless (eql (+ 9999 i) (extremum (coerce data 'list) #'>))
1969 (setf ok nil))
1970 (when ok
1971 (incf n))))
1972 (when (eql 10 (extremum #(100 1 10 1000) #'> :start 1 :end 3))
1973 (incf n))
1974 (when (eql -1000 (extremum #(100 1 10 -1000) #'> :key 'abs))
1975 (incf n))
1976 (when (eq nil (extremum "" (lambda (a b) (error "wtf? ~S, ~S" a b)…
1977 (incf n))
1978 n)
1979 13)
1980
1981 (deftest starts-with-subseq.string
1982 (starts-with-subseq "f" "foo" :return-suffix t)
1983 t
1984 "oo")
1985
1986 (deftest starts-with-subseq.vector
1987 (starts-with-subseq #(1) #(1 2 3) :return-suffix t)
1988 t
1989 #(2 3))
1990
1991 (deftest starts-with-subseq.list
1992 (starts-with-subseq '(1) '(1 2 3) :return-suffix t)
1993 t
1994 (2 3))
1995
1996 (deftest starts-with-subseq.start1
1997 (starts-with-subseq "foo" "oop" :start1 1)
1998 t
1999 nil)
2000
2001 (deftest starts-with-subseq.start2
2002 (starts-with-subseq "foo" "xfoop" :start2 1)
2003 t
2004 nil)
2005
2006 (deftest format-symbol.print-case-bound
2007 (let ((upper (intern "FOO-BAR"))
2008 (lower (intern "foo-bar"))
2009 (*print-escape* nil))
2010 (values
2011 (let ((*print-case* :downcase))
2012 (and (eq upper (format-symbol t "~A" upper))
2013 (eq lower (format-symbol t "~A" lower))))
2014 (let ((*print-case* :upcase))
2015 (and (eq upper (format-symbol t "~A" upper))
2016 (eq lower (format-symbol t "~A" lower))))
2017 (let ((*print-case* :capitalize))
2018 (and (eq upper (format-symbol t "~A" upper))
2019 (eq lower (format-symbol t "~A" lower))))))
2020 t
2021 t
2022 t)
2023
2024 (deftest iota.fp-start-and-complex-integer-step
2025 (equal '(#C(0.0 0.0) #C(0.0 2.0) #C(0.0 4.0))
2026 (iota 3 :start 0.0 :step #C(0 2)))
2027 t)
2028
2029 (deftest parse-ordinary-lambda-list.1
2030 (multiple-value-bind (req opt rest keys allowp aux keyp)
2031 (parse-ordinary-lambda-list '(a b c
2032 &optional o1 (o2 42) (o3 42 o3-sup…
2033 &key (k1) ((:key k2)) (k3 42 k3-su…
2034 :normalize t)
2035 (and (equal '(a b c) req)
2036 (equal '((o1 nil nil)
2037 (o2 42 nil)
2038 (o3 42 o3-supplied?))
2039 opt)
2040 (equal '(((:k1 k1) nil nil)
2041 ((:key k2) nil nil)
2042 ((:k3 k3) 42 k3-supplied?))
2043 keys)
2044 (not allowp)
2045 (not aux)
2046 (eq t keyp)))
2047 t)
You are viewing proxied material from bitreich.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.