X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=tests%2Feval.impure.lisp;h=c5de28bcde4bdd855a5ba1a8deff3a17aa6e5202;hb=0371580437ef7f3e39f0bfbb9e45264986408b19;hp=6b6293db9ba633682294c591f1e858a66444bdaf;hpb=444d2072bc52e60a41af62ee22e343e76109212f;p=sbcl.git diff --git a/tests/eval.impure.lisp b/tests/eval.impure.lisp index 6b6293d..c5de28b 100644 --- a/tests/eval.impure.lisp +++ b/tests/eval.impure.lisp @@ -128,12 +128,24 @@ '(x) '(1) (1+ x)) t 2) - ((unwind-protect 1 nil) t 1) - ((unwind-protect 1 - (xxx)) nil) - ((the integer 1) t 1) - ((the integer (+ 1 1)) t 2) - ((the integer (foo)) nil) + ((progv '(x) '(t) + (if x 1 2)) t 1) + ((unwind-protect 1 nil) t 1) + ((unwind-protect 1 + (xxx)) nil) + ((the integer 1) t 1) + ((the integer (+ 1 1)) t 2) + ((the integer (foo)) nil) + ((the symbol 1) nil) + ((the "bad type" 1) nil) + ((multiple-value-prog1 + (+ 1 1) + :nada) t 2) + ((multiple-value-prog1 + :nada + (/ 1 0)) nil) + ((/ 1 0) nil) + ((/ 1 1) t 1) ((+ 1 2) t 3))) (destructuring-bind (form c &optional v) test (assert (eql (constantp form) c)) @@ -176,4 +188,42 @@ (with-output-to-string (*standard-output*) (eval '(progn (princ ".") (let ((x 42)) t) (princ ".")))))) +;;; IF +(defun true () t) +(defun false () nil) +(defmacro oops () (throw :oops (list))) +(defun test-eval (ok form) (assert (eq ok (catch :oops (eval form))))) +(test-eval t '(if (false) (oops) t)) +(test-eval t '(if (true) t (oops))) +(test-eval nil '(if (not (if (false) t)) (oops))) + +;;; TAGBODY + +;;; As of SBCL 1.0.1.8, TAGBODY should not accept duplicate go tags, +;;; yet choked on two duplicate tags. Note that this test asserts a +;;; failure. +(with-test (:name :tagbody-dual-go-tags) + (progn + (defun tagbody-dual-go-tags () + (restart-case + (handler-bind ((error (lambda (c) + (declare (ignore c)) + (invoke-restart 'NOT-AN-ERROR)))) + (tagbody :A :A) nil) + (NOT-AN-ERROR () t))) + (assert (tagbody-dual-go-tags)))) + +;;; Ensure that NIL is a valid go tag. +(with-test (:name :tagbody-nil-is-valid-tag) + (progn + (defun tagbody-nil-is-valid-tag () + (tagbody (go NIL) NIL) t) + (assert (tagbody-nil-is-valid-tag)))) + +;;; top-level DECLARE is formally undefined, but we want it to raise +;;; an error rather than silently return NIL. +(defvar *scratch*) +(with-test (:name :toplevel-declare) + (assert (raises-error? (eval '(declare (type pathname *scratch*)))))) + ;;; success