0.9.12.10:
[sbcl.git] / tests / eval.impure.lisp
index 9dfbc14..5989e51 100644 (file)
 (assert (constantp (find-class 'symbol)))
 (assert (constantp #p""))
 
+;;; More CONSTANTP tests
+;;;              form                   constantp sb-int:constant-form-value
+(dolist (test '((t                      t         t)
+                (x                      nil)
+                ('x                     t         x)
+                (:keyword               t         :keyword)
+                (42                     t         42)
+                ((if t :ok x)           t         :ok)
+                ((if t x :no)           nil)
+                ((progn
+                   (error "oops")
+                   t)                   nil)
+                ((progn 1 2 3)          t         3)
+                ((block foo :good)      t         :good)
+                ((block foo
+                   (return-from foo t)) nil)
+                ((progv
+                     (list (gensym))
+                     '(1)
+                   (+ 1))               nil)
+                ((progv
+                     '(x)
+                     (list (random 2))
+                   x)                   nil)
+                ((progv
+                     '(x)
+                     '(1)
+                   (1+ x))              t         2)
+                ((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))
+    (when c
+      (assert (eql v (sb-int:constant-form-value form))))))
+
 ;;; DEFPARAMETER must assign a dynamic variable
 (let ((var (gensym)))
   (assert (equal (eval `(list (let ((,var 1))
                (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)))
+
 ;;; success