1 ;;;; tests related to lists
3 ;;;; This software is part of the SBCL system. See the README file for
6 ;;;; While most of SBCL is derived from the CMU CL system, the test
7 ;;;; files (like this one) were written from scratch after the fork
10 ;;;; This software is in the public domain and is provided with
11 ;;;; absolutely no warranty. See the COPYING and CREDITS files for
12 ;;;; more information.
16 ;;; Since *another* BUTLAST problem was reported (anonymously!) on the
17 ;;; SourceForge summary page magical bugs web interface 2001-09-01, it
18 ;;; looks as though it's past time to start accumulating regression
21 '((:args
((1 2 3 4 5)) :result
(1 2 3 4))
22 (:args
((1 2 3 4 5) 6) :result nil
)
23 (:args
(nil) :result nil
)
24 (:args
((1 2 3) 0) :result
(1 2 3))
25 (:args
((1 2 3) 1) :result
(1 2))
26 (:args
((1 2 3)) :result
(1 2))
27 (:args
((1 2 3) 2) :result
(1))
28 (:args
((1 2 3) 3) :result nil
)
29 (:args
((1 2 3) 4) :result nil
)
30 (:args
((1 2 3 .
4) 0) :result
(1 2 3 .
4))
31 (:args
((1 2 3 .
4) 1) :result
(1 2))
32 (:args
((1 2 3 .
4)) :result
(1 2))
33 (:args
((1 2 3 .
4) 2) :result
(1))
34 (:args
((1 2 3 .
4) 3) :result nil
)
35 (:args
((1 2 3 .
4) 4) :result nil
)))
36 (destructuring-bind (&key args result
) testcase
37 (destructuring-bind (list &rest rest
) args
39 (let ((actual-result (apply #'butlast args
)))
40 (when (and (consp list
) (eq actual-result list
))
41 (error "not a copy in BUTLAST for ~S" args
))
42 (unless (equal actual-result result
)
43 (error "failed BUTLAST for ~S" args
)))
44 ;; Test with NBUTLAST.
45 (let* ((copied-list (copy-list list
))
46 (actual-result (apply #'nbutlast copied-list rest
)))
47 (unless (equal actual-result result
)
48 (error "failed NBUTLAST for ~S" args
))))))
50 (multiple-value-bind (result error
)
51 (ignore-errors (apply #'butlast
(list t
)))
52 (assert (null result
))
53 (assert (typep error
'type-error
)))
55 ;;; reported by Paul Dietz on cmucl-imp: LDIFF does not check type of
56 ;;; its first argument
57 (assert (not (ignore-errors (ldiff 1 2))))
59 ;;; evaluation order in PUSH, PUSHNEW
60 (let ((a (map 'vector
#'list
'(a b c
))))
62 (pushnew (incf i
) (aref a
(incf i
)))
63 (assert (equalp a
#((a) (b) (1 c
))))))
65 (symbol-macrolet ((s (aref a
(incf i
))))
66 (let ((a (map 'vector
#'list
'(a b c
))))
69 (assert (equalp a
#((a) (t b
) (c))))
71 (assert (equalp a
#((a) (t b
) (1 c
))))
73 (assert (eql (pop s
) 't
))
74 (assert (equalp a
#((a) (b) (1 c
)))))))
76 ;;; Type checking in NCONC
77 (let ((tests '((((1 .
2)) (1 .
2))
78 (((1 .
2) (3 .
4)) (1 3 .
4))
81 (loop for
(args result
) in tests
82 do
(assert (equal (apply 'nconc
(copy-tree args
)) result
))
83 do
(let ((exp `(nconc ,@ (mapcar (lambda (arg)
86 (assert (equal (funcall (compile nil
`(lambda () ,exp
))) result
)))))
88 (let ((tests '(((3 (1 .
2)) 3)
89 (((1 .
2) 3 (4 .
5)) 3))))
90 (macrolet ((check-error (form failed-arg
)
91 `(multiple-value-bind (.result. .error.
)
93 (assert (null .result.
))
94 (assert (typep .error.
'type-error
))
95 (assert (eq (type-error-expected-type .error.
) 'list
))
96 (assert (equal (type-error-datum .error.
) ,failed-arg
)))))
97 (loop for
(args fail
) in tests
98 do
(check-error (apply #'nconc
(copy-tree args
)) fail
)
99 do
(let ((exp `(nconc ,@ (mapcar (lambda (arg)
102 (check-error (funcall (compile nil
`(lambda () ,exp
))) fail
)))))
104 (dolist (test '((append 1 2)
105 (append (1 2) nil
(3 .
4) nil
)
106 (append nil
(1 2) nil
(3 .
4) nil
)
109 (nreconc (1 2 .
3) (4 5))
110 (copy-alist ((1 .
2) (3 .
4) .
5))))
111 (assert (raises-error?
(apply (first test
) (copy-tree (rest test
)))
114 ;;; Bug reported by Paul Dietz: NSET-EXCLUSIVE-OR should not return
115 ;;; extra elements, even when given "sets" contain duplications
116 (assert (equal (remove-duplicates (sort (nset-exclusive-or (list 1 2 1 3)