;; -*- Mode: Lisp; -*- (in-package :cl-user) (defmacro blah (name format number result) `(progn (push (list ',name ',format ',number ',result) *tests*) ',name)) (defvar *tests* nil) (blah format.e.gb.001 "~,3e" 11234123 "1.123E+7") ;original bug found. (blah format.e.gb.002 "~5e" 1 "1.0E+0") (blah format.e.gb.003 "~,,,0e" 1 "0.1E+1") (blah format.e.gb.004 "~0,,,0e" 1 ".1E+1") (blah format.e.gb.005 "~3,,,0e" 1 ".1E+1") (blah format.e.gb.006 "~4,,,0e" 1 ".1E+1") (blah format.e.gb.007 "~5,,,0e" 1 ".1E+1") (blah format.e.gb.008 "~6,,,0e" 1 "0.1E+1") (blah format.e.gb.009 "~7,,,0e" 1 " 0.1E+1") (blah format.e.gb.010 "~,,,0,'@e" 1 "0.1E+1") (blah format.e.gb.011 "~0,,,0,'@e" 1 "") (blah format.e.gb.012 "~3,,,0,'@e" 1 "@@@") (blah format.e.gb.013 "~4,,,0,'@e" 1 "@@@@") (blah format.e.gb.014 "~5,,,0,'@e" 1 ".1E+1") (blah format.e.gb.015 "~6,,,0,'@e" 1 "0.1E+1") (blah format.e.gb.016 "~7,,,0,'@e" 1 " 0.1E+1") (blah format.e.gb.020 "~,4,,0e" #.pi "0.3142E+1") (blah format.e.gb.021 "~,4,,-1e" #.pi "0.0314E+2") (blah format.e.gb.022 "~,4,,-2e" #.pi "0.0031E+3") (blah format.e.gb.023 "~,4,,-3e" #.pi "0.0003E+4") ;; (blah format.e.gb.024 "~,4,,-4e" #.pi "0.0000D+5") <-- User Error (blah format.e.gb.030 "~,,,3e" 0 "000.0E+0") (blah format.e.gb.031 "~,,,3e" 1 "100.0E-2") (blah format.e.gb.040 "~,5,3,3e" 1 "100.000E-002") (blah format.e.gb.041 "~1,5,3,3e" 1 "100.000E-002") (blah format.e.gb.042 "~12,5,3,3,'@e" 1 "100.000E-002") (blah format.e.gb.043 "~11,5,3,3,'@e" 1 "@@@@@@@@@@@") (blah format.e.gb.044 "~12,5,3,3,'@e" 0 "000.000E+000") (blah format.e.gb.050 "~4,0,,0e" 0 ".E+0") (blah format.e.gb.051 "~,1,,2e" 1234 "12.E+2") (blah format.e.gb.052 "~,1,,2e" 1200 "12.E+2") ;; corner case: ;; (format nil "~7,,,-2e" 0) => "0.00E+0" or " 0.0E+0" ? (defun run () (loop for (name format number desired) in (reverse *tests*) do (let* ((x (coerce number 'double-float)) (actual (let ((*read-default-float-format* 'double-float)) (ignore-errors (string-upcase (format nil format x)))))) (format t "~&~A ~S~36T~S~45T~S~60T~A~%" name format (if (= number pi) 'pi number) actual (if (string-equal actual desired) "ok" "*** FAIL") ) (unless (string-equal actual desired) (format t "~45T~S~%" desired)))) (values)) (run)