X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=tests%2Fexternal-format.impure.lisp;h=a642770af84b7d11e3439ebe6dcdf399eb792781;hb=47bf3e24a52a2687bd8f07c4674cb9e81163085d;hp=c86b6ef2fb0070813c897d53dde46116cbb6371b;hpb=175c318c892b0627b36fa3c4db66f59680242204;p=sbcl.git diff --git a/tests/external-format.impure.lisp b/tests/external-format.impure.lisp index c86b6ef..a642770 100644 --- a/tests/external-format.impure.lisp +++ b/tests/external-format.impure.lisp @@ -89,6 +89,58 @@ (assert (equal (read-line s nil s) "AB")) (assert (equal (read-line s nil s) s)))) +;;; And again with more data to account for buffering (this was briefly) +;;; broken in early 0.9.6. +(with-open-file (s "external-format-test.txt" :direction :output + :if-exists :supersede :element-type '(unsigned-byte 8)) + (let ((a (make-array 50 + :element-type '(unsigned-byte 64) + :initial-contents (map 'list #'char-code + "1234567890123456789012345678901234567890123456789.")))) + (setf (aref a 49) (char-code #\Newline)) + (dotimes (i 40) + (write-sequence a s)) + (write-byte #xe0 s) + (dotimes (i 40) + (write-sequence a s)))) +(with-test (:name (:character-decode-large :attempt-resync)) + (with-open-file (s "external-format-test.txt" :direction :input + :external-format :utf-8) + (handler-bind + ((sb-int:character-decoding-error #'(lambda (decoding-error) + (declare (ignore decoding-error)) + (invoke-restart + 'sb-int:attempt-resync))) + ;; The failure mode is an infinite loop, add a timeout to detetct it. + (sb-ext:timeout (lambda () (error "Timeout")))) + (sb-ext:with-timeout 5 + (dotimes (i 80) + (assert (equal (read-line s nil s) + "1234567890123456789012345678901234567890123456789"))))))) + +(with-test (:name (:character-decode-large :force-end-of-file) + :fails-on :sbcl) + (error "We can't reliably test this due to WITH-TIMEOUT race condition") + ;; This test will currently fail. But sometimes it will fail in + ;; ungracefully due to the WITH-TIMEOUT race mentioned above. This + ;; rightfully confuses some people, so we'll skip running the code + ;; for now. -- JES, 2006-01-27 + #+nil + (with-open-file (s "external-format-test.txt" :direction :input + :external-format :utf-8) + (handler-bind + ((sb-int:character-decoding-error #'(lambda (decoding-error) + (declare (ignore decoding-error)) + (invoke-restart + 'sb-int:force-end-of-file))) + ;; The failure mode is an infinite loop, add a timeout to detetct it. + (sb-ext:timeout (lambda () (error "Timeout")))) + (sb-ext:with-timeout 5 + (dotimes (i 80) + (assert (equal (read-line s nil s) + "1234567890123456789012345678901234567890123456789"))) + (assert (equal (read-line s nil s) s)))))) + ;;; Test character encode restarts. (with-open-file (s "external-format-test.txt" :direction :output :if-exists :supersede :external-format :latin-1) @@ -158,6 +210,49 @@ :external-format :koi8-r) (let ((char (read-char s))) (assert (= (char-code (eval char)) #xB0)))) +(delete-file "external-format-test.txt") + +(let* ((koi8-r-codes (coerce '(240 210 201 215 197 212 33) '(vector (unsigned-byte 8)))) + (uni-codes #(1055 1088 1080 1074 1077 1090 33)) + (string (octets-to-string koi8-r-codes :external-format :koi8-r)) + (uni-decoded (map 'vector #'char-code string))) + (assert (equalp (map 'vector #'char-code (octets-to-string koi8-r-codes :external-format :koi8-r)) + uni-codes)) + (assert (equalp (string-to-octets (map 'string #'code-char uni-codes) :external-format :koi8-r) + koi8-r-codes))) -(delete-file "external-format-test.txt") +;;; tests of FILE-STRING-LENGTH +(let ((standard-characters "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!$\"'(),_-./:;?+<=>#%&*@[\\]{|}`^~")) + (do-external-formats (xf) + (with-open-file (s "external-format-test.txt" :direction :output + :external-format xf) + (loop for x across standard-characters + for position = (file-position s) + for char-length = (file-string-length s x) + do (write-char x s) + do (assert (= (file-position s) (+ position char-length)))) + (let ((position (file-position s)) + (string-length (file-string-length s standard-characters))) + (write-string standard-characters s) + (assert (= (file-position s) (+ position string-length))))) + (delete-file "external-format-test.txt"))) + +(let ((char-codes '(0 1 255 256 511 512 1023 1024 2047 2048 4095 4096 + 8191 8192 16383 16384 32767 32768 65535 65536 131071 + 131072 262143 262144))) + (with-open-file (s "external-format-test.txt" :direction :output + :external-format :utf-8) + (dolist (code char-codes) + (let* ((char (code-char code)) + (position (file-position s)) + (char-length (file-string-length s char))) + (write-char char s) + (assert (= (file-position s) (+ position char-length))))) + (let* ((string (map 'string #'code-char char-codes)) + (position (file-position s)) + (string-length (file-string-length s string))) + (write-string string s) + (assert (= (file-position s) (+ position string-length)))))) + +;;;; success \ No newline at end of file