X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=tests%2Finterface.impure.lisp;h=63e7c7a79e7a50b7bd6e00e4c7d4000380f8fca0;hb=HEAD;hp=43912780827e5df29d660b70c894e1f35fc96759;hpb=2e52fa0553c5a256f482ee14e30608acf55e5f48;p=sbcl.git diff --git a/tests/interface.impure.lisp b/tests/interface.impure.lisp index 4391278..63e7c7a 100644 --- a/tests/interface.impure.lisp +++ b/tests/interface.impure.lisp @@ -30,55 +30,60 @@ (assert (string= (documentation #'(setf foo) 'function) "(setf foo) documentation")) +(with-test (:name :disassemble) ;;; DISASSEMBLE shouldn't fail on closures or unpurified functions -(defun disassemble-fun (x) x) -(disassemble 'disassemble-fun) - -(let ((x 1)) (defun disassemble-closure (y) (if y (setq x y) x))) -(disassemble 'disassemble-closure) - -#+sb-eval -(progn - ;; Nor should it fail on interpreted functions - (let ((sb-ext:*evaluator-mode* :interpret)) - (eval `(defun disassemble-eval (x) x)) - (disassemble 'disassemble-eval)) - - ;; disassemble-eval should still be an interpreted function. - ;; clhs disassemble: "(If that function is an interpreted function, - ;; it is first compiled but the result of this implicit compilation - ;; is not installed.)" - (assert (sb-eval:interpreted-function-p #'disassemble-eval))) - -;; nor should it fail on generic functions or other funcallable instances -(defgeneric disassemble-generic (x)) -(disassemble 'disassemble-generic) -(let ((fin (sb-mop:make-instance 'sb-mop:funcallable-standard-object))) - (disassemble fin)) + (defun disassemble-fun (x) x) + (disassemble 'disassemble-fun) + + (let ((x 1)) (defun disassemble-closure (y) (if y (setq x y) x))) + (disassemble 'disassemble-closure) + + #+sb-eval + (progn + ;; Nor should it fail on interpreted functions + (let ((sb-ext:*evaluator-mode* :interpret)) + (eval `(defun disassemble-eval (x) x)) + (disassemble 'disassemble-eval)) + + ;; disassemble-eval should still be an interpreted function. + ;; clhs disassemble: "(If that function is an interpreted function, + ;; it is first compiled but the result of this implicit compilation + ;; is not installed.)" + (assert (sb-eval:interpreted-function-p #'disassemble-eval))) + + ;; nor should it fail on generic functions or other funcallable instances + (defgeneric disassemble-generic (x)) + (disassemble 'disassemble-generic) + (let ((fin (make-instance 'sb-mop:funcallable-standard-object))) + (disassemble fin))) ;;; while we're at it, much the same applies to ;;; FUNCTION-LAMBDA-EXPRESSION: (defun fle-fun (x) x) -(function-lambda-expression #'fle-fun) (let ((x 1)) (defun fle-closure (y) (if y (setq x y) x))) -(function-lambda-expression #'fle-closure) - -#+sb-eval -(progn - ;; Nor should it fail on interpreted functions - (let ((sb-ext:*evaluator-mode* :interpret)) - (eval `(defun fle-eval (x) x)) - (function-lambda-expression #'fle-eval)) - - ;; fle-eval should still be an interpreted function. - (assert (sb-eval:interpreted-function-p #'fle-eval))) - -;; nor should it fail on generic functions or other funcallable instances -(defgeneric fle-generic (x)) -(function-lambda-expression #'fle-generic) -(let ((fin (sb-mop:make-instance 'sb-mop:funcallable-standard-object))) - (function-lambda-expression fin)) + +(with-test (:name :function-lambda-expression) + (flet ((fle-name (x) + (nth-value 2 (function-lambda-expression x)))) + (assert (eql (fle-name #'fle-fun) 'fle-fun)) + (assert (eql (fle-name #'fle-closure) 'fle-closure)) + (assert (eql (fle-name #'disassemble-generic) 'disassemble-generic)) + (function-lambda-expression + (make-instance 'sb-mop:funcallable-standard-object)) + (function-lambda-expression + (make-instance 'generic-function)) + (function-lambda-expression + (make-instance 'standard-generic-function)) + #+sb-eval + (progn + (let ((sb-ext:*evaluator-mode* :interpret)) + (eval `(defun fle-eval (x) x)) + (assert (eql (fle-name #'fle-eval) 'fle-eval))) + + ;; fle-eval should still be an interpreted function. + (assert (sb-eval:interpreted-function-p #'fle-eval))))) + ;;; support for DESCRIBE tests (defstruct to-be-described a b) @@ -86,6 +91,10 @@ (let ((sb-ext:*evaluator-mode* :compile)) (eval `(let (x) (defun closure-to-describe () (incf x))))) +(with-test (:name :describe-empty-gf) + (describe (make-instance 'generic-function)) + (describe (make-instance 'standard-generic-function))) + ;;; DESCRIBE should run without signalling an error. (with-test (:name (describe :no-error)) (describe (make-to-be-described)) @@ -232,22 +241,21 @@ "bar" (incf x y))) -(with-test (:name (documentation closure)) +(with-test (:name (documentation :closure)) (assert (string= (documentation 'docfoo 'function) "bar")) - (assert (string= (documentation #'docfoo t) "bar")) (assert (string= (setf (documentation 'docfoo 'function) "baz") "baz")) (assert (string= (documentation 'docfoo 'function) "baz")) - (assert (string= (documentation #'docfoo t) "bar")) + (assert (string= (documentation #'docfoo t) "baz")) (assert (string= (setf (documentation #'docfoo t) "zot") "zot")) (assert (string= (documentation #'docfoo t) "zot")) - (assert (string= (documentation 'docfoo 'function) "baz")) + (assert (string= (documentation 'docfoo 'function) "zot")) (assert (not (setf (documentation 'docfoo 'function) nil))) - (assert (string= (documentation 'docfoo 'function) "zot"))) + (assert (not (documentation 'docfoo 'function)))) -(with-test (:name (documentation built-in-macro) :skipped-on '(not :sb-doc)) +(with-test (:name (documentation :built-in-macro) :skipped-on '(not :sb-doc)) (assert (documentation 'trace 'function))) -(with-test (:name (documentation built-in-function) :skipped-on '(not :sb-doc)) +(with-test (:name (documentation :built-in-function) :skipped-on '(not :sb-doc)) (assert (documentation 'cons 'function))) (with-test (:name :describe-generic-function-with-assumed-type) @@ -311,6 +319,27 @@ (equal (documentation 'test 'function) (documentation 'test2 'function))))) - +(with-test (:name :setf-documentation-on-nil) + (assert + (handler-case + (assert (equal (setf (documentation nil 'function) "foo") "foo")) + (style-warning () t) + (:no-error (x) + (declare (ignore x)) + nil)))) + +(with-test (:name (trace generic-function)) + (defgeneric traced-gf (x)) + (defmethod traced-gf (x) (1+ x)) + (assert (= (traced-gf 3) 4)) + (trace traced-gf) + (let ((output (with-output-to-string (*trace-output*) + (assert (= (traced-gf 3) 4))))) + (assert (> (length output) 0))) + (assert (typep #'traced-gf 'standard-generic-function)) + (untrace traced-gf) + (let ((output (with-output-to-string (*trace-output*) + (assert (= (traced-gf 3) 4))))) + (assert (= (length output) 0)))) ;;;; success