X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=tests%2Fstream.impure.lisp;h=851990f688297ea68fc9379e80cfe48f01c7731c;hb=6b8baeece6cf870e3f979a9f09c32985c64c04de;hp=c0830a66b6e2c7f85af8b86f3d9b8a82d09622d7;hpb=81a75e4657328daad0d63bdbf9555ef4d309c39d;p=sbcl.git diff --git a/tests/stream.impure.lisp b/tests/stream.impure.lisp index c0830a6..851990f 100644 --- a/tests/stream.impure.lisp +++ b/tests/stream.impure.lisp @@ -91,7 +91,10 @@ (with-standard-io-syntax (prin1 'insert s))) (with-open-file (s p) - (assert (string= (read-line s) "THESE INSERTMBOLS"))) + (let ((line (read-line s)) + (want "THESE INSERTMBOLS")) + (unless (equal line want) + (error "wanted ~S, got ~S" want line)))) (delete-file p)) ;;; :DIRECTION :IO didn't work on non-existent pathnames @@ -291,6 +294,7 @@ (let ((sequence (make-array 1 :element-type '(signed-byte 8)))) (with-open-file (stream pathname :direction :input + :external-format :latin1 :element-type :default) (handler-case (progn (read-sequence sequence stream) @@ -298,8 +302,8 @@ (type-error (condition) (assert (eql (type-error-datum condition) (code-char 255))) (assert (subtypep (type-error-expected-type condition) - '(signed-byte 8)))))))) - + '(signed-byte 8))))))) + (delete-file pathname)) ;;; Check WRITE-SEQUENCE signals a TYPE-ERROR when the stream can't ;;; write a sequence element. @@ -410,6 +414,107 @@ (type-error (condition) (assert (= (type-error-datum condition) -1)) (assert (subtypep (type-error-expected-type condition) - '(unsigned-byte 8))))))) + '(unsigned-byte 8)))))) + + (delete-file pathname)) + +;;; writing looong lines. takes way too long and way too much space +;;; to test on 64 bit platforms +#-#.(cl:if (cl:= sb-vm:n-word-bits 64) '(and) '(or)) +(progn + (defun write-n-chars (n stream) + (format t "~&/writing ~D chars on a single line~%" n) + (finish-output t) + (loop repeat n + do (write-char #\x stream)) + (terpri stream) + n) + + (let ((test "long-lines-write-test.tmp")) + (unwind-protect + (with-open-file (f test + :direction :output + :external-format :ascii + :element-type 'character + :if-does-not-exist :create + :if-exists :supersede) + (write-n-chars (+ most-positive-fixnum 7) f)) + (when (probe-file test) + (delete-file test))))) +;;; read-sequence misreported the amount read and lost position +(let ((string (make-array (* 3 sb-impl::+ansi-stream-in-buffer-length+) + :element-type 'character))) + (dotimes (i (length string)) + (setf (char string i) (code-char (mod i char-code-limit)))) + (with-open-file (f "read-sequence-character-test-data.tmp" + :if-exists :supersede + :direction :output + :external-format :utf-8) + (write-sequence string f)) + (let ((copy + (with-open-file (f "read-sequence-character-test-data.tmp" + :if-does-not-exist :error + :direction :input + :external-format :utf-8) + (let ((buffer (make-array 128 :element-type 'character)) + (total 0)) + (with-output-to-string (datum) + (loop for n-read = (read-sequence buffer f) + do (write-sequence buffer datum :start 0 :end n-read) + (assert (<= (incf total n-read) (length string))) + while (and (= n-read 128)))))))) + (assert (equal copy string))) + (delete-file "read-sequence-character-test-data.tmp")) + +;;; ANSI-STREAM-OUTPUT-STREAM-P used to assume that a SYNONYM-STREAM's +;;; target was an ANSI stream, but it could be a user-defined stream, +;;; e.g., a SLIME stream. +(defclass user-output-stream (fundamental-output-stream) + ()) + +(let ((*stream* (make-instance 'user-output-stream))) + (declare (special *stream*)) + (with-open-stream (stream (make-synonym-stream '*stream*)) + (assert (output-stream-p stream)))) + +(defclass user-input-stream (fundamental-input-stream) + ()) + +(let ((*stream* (make-instance 'user-input-stream))) + (declare (special *stream*)) + (with-open-stream (stream (make-synonym-stream '*stream*)) + (assert (input-stream-p stream)))) + +;;; READ-LINE on ANSI-STREAM did not return T for the last line +;;; (reported by Yoshinori Tahara) +(let ((pathname "test-read-line-eol")) + (with-open-file (out pathname :direction :output :if-exists :supersede) + (format out "a~%b")) + (let ((result (with-open-file (in pathname) + (list (multiple-value-list (read-line in nil nil)) + (multiple-value-list (read-line in nil nil)) + (multiple-value-list (read-line in nil nil)))))) + (delete-file pathname) + (assert (equal result '(("a" nil) ("b" t) (nil t)))))) + +;;; READ-LINE used to work on closed streams because input buffers were left in place +(with-test (:name :bug-425) + ;; Normal close + (let ((f (open "stream.impure.lisp" :direction :input))) + (assert (stringp (read-line f))) + (close f) + (assert (eq :fii + (handler-case + (read-line f) + (sb-int:closed-stream-error () :fii))))) + ;; Abort + (let ((f (open "stream.impure.lisp" :direction :input))) + (assert (stringp (read-line f nil nil))) + (close f :abort t) + (assert (eq :faa + (handler-case + (read-line f) + (sb-int:closed-stream-error () :faa)))))) + ;;; success