sbcl.sbcl/tests/pprint.impure.lisp
Christophe Rhodes 8cd789d3fc 0.8.7.43:
Allow SET-PPRINT-DISPATCH to take symbols as arguments
	... possibly violate ANSI by immediate coercion to function
	... move things around so that I can add the pprinting
		functions to fndb (new host-pprint file)
	... also delete unused WHITESPACE-CHAR-P
2004-02-04 21:16:23 +00:00

149 lines
5.1 KiB
Common Lisp
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;;;; test of the pretty-printer
;;;; This software is part of the SBCL system. See the README file for
;;;; more information.
;;;;
;;;; 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.
(in-package :cl-user)
;;;; tests for former BUG 99, where pretty-printing was pretty messed
;;;; up, e.g. PPRINT-LOGICAL-BLOCK - because of CHECK-FOR-CIRCULARITY
;;;; - didn't really work:
;;;; "DESCRIBE interacts poorly with *PRINT-CIRCLE*, e.g. the output from
;;;; (let ((*print-circle* t)) (describe (make-hash-table)))
;;;; is weird, [...] #<HASH-TABLE :TEST EQL :COUNT 0 {90BBFC5}> is an . (EQL)
;;;; ..."
;;;; So, this was mainly a pretty printing problem.
;;; Create a circular list.
(eval-when (:compile-toplevel :load-toplevel :execute)
(defparameter *circ-list* '(1 1))
(prog1 nil
(setf (cdr *circ-list*) *circ-list*)))
;;; circular lists are still being printed correctly?
(assert (equal
(with-output-to-string (*standard-output*)
(let ((*print-circle* t))
(pprint-logical-block (*standard-output* *circ-list*)
(format *standard-output* "~S" *circ-list*))))
"#1=(1 . #1#)"))
;;; test from CLHS
(assert (equal
(with-output-to-string (*standard-output*)
(let ((a (list 1 2 3)))
(setf (cdddr a) a)
(let ((*print-circle* t))
(write a :stream *standard-output*))
:done))
"#1=(1 2 3 . #1#)"))
;;; test case 1 for bug 99
(assert (equal
(with-output-to-string (*standard-output*)
(let* ((*print-circle* t))
(format *standard-output* "~@<~S ~_is ~S. This was not seen!~:>"
'eql 'eql)))
"EQL is EQL. This was not seen!"))
;;; test case 2 for bug 99
(assert (equal
(with-output-to-string (*standard-output*)
(let* ((*print-circle* t))
(format *standard-output*
"~@<~S ~_is ~S and ~S. This was not seen!~:>"
'eql 'eql 'eql)))
"EQL is EQL and EQL. This was not seen!"))
;;; the original test for BUG 99 (only interactive), no obvious
;;; way to make an automated test:
;;; (LET ((*PRINT-CIRCLE* T)) (DESCRIBE (MAKE-HASH-TABLE)))
;;; bug 263: :PREFIX, :PER-LINE-PREFIX and :SUFFIX arguments of
;;; PPRINT-LOGICAL-BLOCK may be complex strings
(let ((list '(1 2 3))
(prefix (make-array 2
:element-type 'character
:displaced-to ";x"
:fill-pointer 1))
(suffix (make-array 2
:element-type 'character
:displaced-to ">xy"
:displaced-index-offset 1
:fill-pointer 1)))
(assert (equal (with-output-to-string (s)
(pprint-logical-block (s list
:per-line-prefix prefix
:suffix suffix)
(format s "~{~W~^~:@_~}" list)))
(format nil ";1~%~
;2~%~
;3x"))))
;;; bug 141b: not enough care taken to disambiguate ,.FOO and ,@FOO
;;; from , .FOO and , @FOO
(assert (equal
(with-output-to-string (s)
(write '`(, .foo) :stream s :pretty t :readably t))
"`(, .FOO)"))
(assert (equal
(with-output-to-string (s)
(write '`(, @foo) :stream s :pretty t :readably t))
"`(, @FOO)"))
(assert (equal
(with-output-to-string (s)
(write '`(, ?foo) :stream s :pretty t :readably t))
"`(,?FOO)"))
;;; bug reported by Paul Dietz on sbcl-devel: unquoted lambda lists
;;; were leaking the SB-IMPL::BACKQ-COMMA implementation.
(assert (equal
(with-output-to-string (s)
(write '`(foo ,x) :stream s :pretty t :readably t))
"`(FOO ,X)"))
(assert (equal
(with-output-to-string (s)
(write '`(foo ,@x) :stream s :pretty t :readably t))
"`(FOO ,@X)"))
#+nil ; '`(foo ,.x) => '`(foo ,@x) apparently.
(assert (equal
(with-output-to-string (s)
(write '`(foo ,.x) :stream s :pretty t :readably t))
"`(FOO ,.X)"))
(assert (equal
(with-output-to-string (s)
(write '`(lambda ,x) :stream s :pretty t :readably t))
"`(LAMBDA ,X)"))
(assert (equal
(with-output-to-string (s)
(write '`(lambda ,@x) :stream s :pretty t :readably t))
"`(LAMBDA ,@X)"))
#+nil ; see above
(assert (equal
(with-output-to-string (s)
(write '`(lambda ,.x) :stream s :pretty t :readably t))
"`(LAMBDA ,.X)"))
(assert (equal
(with-output-to-string (s)
(write '`(lambda (,x)) :stream s :pretty t :readably t))
"`(LAMBDA (,X))"))
;;; SET-PPRINT-DISPATCH should accept function name arguments
(defun ppd-function-name (s o)
(print (length o) s))
(set-pprint-dispatch '(cons (eql frob)) 'ppd-function-name)
(let ((s (with-output-to-string (s)
(pprint '(frob a b) s))))
(assert (position #\3 s)))
;;; success
(quit :unix-status 104)