0.8.19.3:
[sbcl.git] / tests / print.impure.lisp
index e3184bc..4fbe7c1 100644 (file)
   (assert (string= (princ-to-string #\7)
                   (write-to-string #\7 :escape nil :readably nil))))
 
+;;; in FORMAT, ~^ inside ~:{ should go to the next case, not break
+;;; iteration, even if one argument is just a one-element list.
+(assert (string= (format nil "~:{~A~^~}" '((A) (C D))) "AC"))
+
+;;; errors should be raised if pprint and justification are mixed
+;;; injudiciously...
+(dolist (x (list "~<~:;~>~_" "~<~:;~>~I" "~<~:;~>~W"
+                 "~<~:;~>~:T" "~<~:;~>~<~:>" "~_~<~:;~>"
+                 "~I~<~:;~>" "~W~<~:;~>" "~:T~<~:;~>" "~<~:>~<~:;~>"))
+  (assert (raises-error? (format nil x nil)))
+  (assert (raises-error? (format nil (eval `(formatter ,x)) nil))))
+;;; ...but not in judicious cases.
+(dolist (x (list "~<~;~>~_" "~<~;~>~I" "~<~;~>~W"
+                 "~<~;~>~:T" "~<~;~>~<~>" "~_~<~;~>"
+                 "~I~<~;~>" "~W~<~;~>" "~:T~<~;~>" "~<~>~<~;~>"
+                 "~<~:;~>~T" "~T~<~:;~>"))
+  (assert (format nil x nil))
+  (assert (format nil (eval `(formatter ,x)) nil)))
+
+;;; bug 350: bignum printing so memory-hungry that heap runs out
+;;; -- just don't stall here forever on a slow box
+(handler-case
+    (with-timeout 10
+      (print (ash 1 1000000)))
+  (timeout ()
+    (print 'timeout!)))
+
+;;; a spot of random-testing for rational printing
+(defvar *seed-state* (make-random-state))
+(print *seed-state*) ; so that we can reproduce errors
+(let ((seed (make-random-state *seed-state*)))
+  (loop repeat 42
+     do (let ((n (random (ash 1 1000) seed))
+              (d (random (ash 1 1000) seed)))
+          (when (zerop (random 2 seed))
+            (setf n (- n)))
+          (let ((r (/ n d)))
+            (loop for base from 2 to 36
+               do (let ((*print-base* base)
+                        (*read-base* base)
+                        (*print-radix* nil))
+                    (assert (= r (read-from-string (prin1-to-string r))))
+                    (if (= 36 base)
+                        (decf *read-base*)
+                        (incf *read-base*))
+                    (assert (not (eql r (read-from-string (prin1-to-string r)))))
+                    (let ((*print-radix* t))
+                      (assert (= r (read-from-string 
+                                    (princ-to-string r)))))))))
+       (write-char #\.)
+       (finish-output)))
+
+;;;; Bugs, found by PFD
+;;; NIL parameter for ~^ means `not supplied'
+(loop for (format arg result) in
+      '(("~:{~D~v^~D~}" ((3 1 4) (1 0 2) (7 nil) (5 nil 6)) "341756")
+        ("~:{~1,2,v^~A~}" ((nil 0) (3 1) (0 2)) "02"))
+      do (assert (string= (funcall #'format nil format arg) result))
+      do (assert (string= (with-output-to-string (s)
+                            (funcall (eval `(formatter ,format)) s arg))
+                          result)))
+
+;;; NIL first parameter for ~R is equivalent to no parameter.
+(assert (string= (format nil "~VR" nil 5) "five"))
+(assert (string= (format nil (formatter "~VR") nil 6) "six"))
+
+;;; CSR inserted a bug into Burger & Dybvig's float printer.  Caught
+;;; by Raymond Toy
+(assert (string= (format nil "~E" 1d23) "1.0d+23"))
+
+;;; Fixed-format bugs from CLISP's test suite (reported by Bruno
+;;; Haible, bug 317)
+(assert (string= (format nil "~1F" 10) "10."))
+(assert (string= (format nil "~0F" 10) "10."))
+(assert (string= (format nil "~2F" 1234567.1) "1234567."))
+
+;;; here's one that seems to fail most places.  I think this is right,
+;;; and most of the other answers I've seen are definitely wrong.
+(assert (string= (format nil "~G" 1d23) "100000000000000000000000.    "))
+
+;;; Adam Warner's test case
+(assert (string= (format nil "~@F" 1.23) "+1.23"))
+
 ;;; success
 (quit :unix-status 104)