X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=tests%2Flist.pure.lisp;h=3bc5349cfe779eb01ad0945a4a23e3797310bc58;hb=98f3f617894ce24a40764aa98606ce68c5482cf0;hp=e1270e15a71e109f71334e9627e7f9f45e41a22e;hpb=25070981025894faaef260a38b83fd0bbcfdc80d;p=sbcl.git diff --git a/tests/list.pure.lisp b/tests/list.pure.lisp index e1270e1..3bc5349 100644 --- a/tests/list.pure.lisp +++ b/tests/list.pure.lisp @@ -55,3 +55,53 @@ ;;; reported by Paul Dietz on cmucl-imp: LDIFF does not check type of ;;; its first argument (assert (not (ignore-errors (ldiff 1 2)))) + +;;; evaluation order in PUSH, PUSHNEW +(let ((a (map 'vector #'list '(a b c)))) + (let ((i 0)) + (pushnew (incf i) (aref a (incf i))) + (assert (equalp a #((a) (b) (1 c)))))) + +(symbol-macrolet ((s (aref a (incf i)))) + (let ((a (map 'vector #'list '(a b c)))) + (let ((i 0)) + (push t s) + (assert (equalp a #((a) (t b) (c)))) + (pushnew 1 s) + (assert (equalp a #((a) (t b) (1 c)))) + (setq i 0) + (assert (eql (pop s) 't)) + (assert (equalp a #((a) (b) (1 c))))))) + +;;; Type checking in NCONC +(let ((tests '((((1 . 2)) (1 . 2)) + (((1 . 2) (3 . 4)) (1 3 . 4)) + (((1 . 2) 3) (1 . 3)) + ((3) 3)))) + (loop for (args result) in tests + do (assert (equal (apply 'nconc (copy-tree args)) result)) + do (let ((exp `(nconc ,@ (mapcar (lambda (arg) + `',(copy-tree arg)) + args)))) + (assert (equal (funcall (compile nil `(lambda () ,exp))) result))))) + +(let ((tests '(((3 (1 . 2)) 3) + (((1 . 2) 3 (4 . 5)) 3)))) + (macrolet ((check-error (form failed-arg) + `(multiple-value-bind (.result. .error.) + (ignore-errors ,form) + (assert (null .result.)) + (assert (typep .error. 'type-error)) + (assert (eq (type-error-expected-type .error.) 'list)) + (assert (equal (type-error-datum .error.) ,failed-arg))))) + (loop for (args fail) in tests + do (check-error (apply #'nconc (copy-tree args)) fail) + do (let ((exp `(nconc ,@ (mapcar (lambda (arg) + `',(copy-tree arg)) + args)))) + (check-error (funcall (compile nil `(lambda () ,exp))) fail))))) + +(multiple-value-bind (result error) + (ignore-errors (append 1 2)) + (assert (null result)) + (assert (typep error 'type-error)))