0.8.20.21:
[sbcl.git] / tests / stream.impure.lisp
index 598c55a..f133a35 100644 (file)
       (when (probe-file test)
        (delete-file test)))))
 
+;;; test for read-write invariance of signed bytes, from Bruno Haible
+;;; cmucl-imp 2004-09-06
+(defun bin-stream-test (&key (size (integer-length most-positive-fixnum))
+                        (type 'unsigned-byte) (file-name "stream-impure.tmp")
+                        (num-bytes 10)
+                        (bytes (if (eq type 'signed-byte)
+                                   (loop :repeat num-bytes :collect
+                                         (- (random (ash 1 size))
+                                            (ash 1 (1- size))))
+                                   (loop :repeat num-bytes :collect
+                                         (random (ash 1 size))))))
+  (with-open-file (foo file-name :direction :output :if-exists :supersede
+                       :element-type (list type size))
+    (dolist (byte bytes)
+      (write-byte byte foo)))
+  (unwind-protect
+       (with-open-file (foo file-name :direction :input
+                            :element-type (list type size))
+         (list (stream-element-type foo) (file-length foo) bytes
+               (loop :for byte :in bytes :for nb = (read-byte foo) :collect nb
+                     :unless (= nb byte) :do
+                     (flet ((by-out (sz by)
+                              (format nil "~v,'0,' ,4:b"
+                                      (+ sz (floor sz 4)) by)))
+                       (error "~& * [(~s ~s)] ~a != ~a~%" type size
+                              (by-out size byte) (by-out size nb))))))
+    (delete-file file-name)))
+(loop for size from 2 to 40 do (bin-stream-test :size size :type 'signed-byte))
+
 ;;; success
 (quit :unix-status 104)