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 (multiple-value-bind (result error)
105 (ignore-errors (append 1 2))
106 (assert (null result))
107 (assert (typep error 'type-error)))