1.0.3.9: Allow characters as string designators for SHADOW
[sbcl.git] / tests / eval.impure.lisp
index 6b6293d..a3db89d 100644 (file)
                      '(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))
                (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))))
+
 ;;; success