X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=tests%2Feval.impure.lisp;h=5989e51e5979f30c0dc2641d69184b65fae707a9;hb=eb4330788f7b527b7d93a434a6fbb584c0563456;hp=9b8a0b6d20a5238bc08e54356eec86e403e22ce4;hpb=a260738d7a71680079d972b102b4e4db4e8dc3ae;p=sbcl.git diff --git a/tests/eval.impure.lisp b/tests/eval.impure.lisp index 9b8a0b6..5989e51 100644 --- a/tests/eval.impure.lisp +++ b/tests/eval.impure.lisp @@ -6,7 +6,7 @@ ;;;; While most of SBCL is derived from the CMU CL system, the test ;;;; files (like this one) were written from scratch after the fork ;;;; from CMU CL. -;;;; +;;;; ;;;; This software is in the public domain and is provided with ;;;; absolutely no warranty. See the COPYING and CREDITS files for ;;;; more information. @@ -18,6 +18,9 @@ (cl:in-package :cl-user) +(load "assertoid.lisp") +(use-package "ASSERTOID") + ;;; Until sbcl-0.7.9.x, EVAL was not correctly treating LOCALLY, ;;; MACROLET and SYMBOL-MACROLET, which should preserve top-levelness ;;; of their body forms: @@ -91,8 +94,107 @@ (symbol-macrolet ((foo (symbol-macrolet-bar 1))) (defmacro symbol-macrolet-bar (x) `(+ ,x 1)) (assert (= foo 2))) - -;;; success -(sb-ext:quit :unix-status 104) - +;;; Bug reported by Paul Dietz: CONSTANTP on a self-evaluating object +;;; must return T +(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)) + (defparameter ,var 2) + ,var) + ,var)) + '(1 2)))) + +;;; Bug 264: SYMBOL-MACROLET did not check for a bound SPECIAL +;;; declaration +(assert (raises-error? (progv '(foo) '(1) + (eval '(symbol-macrolet ((foo 3)) + (declare (special foo)) + foo))) + error)) + +;;; MAKE-PACKAGE (and other &key functions) should signal an error +;;; when given a NIL key. This is kind of a compiler test really, but +;;; this'll do as a resting place. +(handler-case + (eval '(make-package "FOO" nil nil)) + (error () :ok) + (:no-error (c) (error "MAKE-PACKAGE succeeded: ~S" c))) + +;;; FUNCTION +(defun function-eq-test () + 'ok) +(trace function-eq-test) +(assert (eq (eval '(function function-eq-test)) + (funcall (compile nil '(lambda () (function function-eq-test)))))) + +;;; No extra output, please +(assert (equal ".." + (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