X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=tests%2Fexternal-format.impure.lisp;h=11586b9f7fa4226f077de58af9181f8f0a4f6336;hb=6501a925cc45f347d1243ce10d34e8b7202ae917;hp=dcc9df7317934a835d6a1567e27128c5100fc8d8;hpb=99a8f9e012fd2b5edc9a0927edfc537332081997;p=sbcl.git diff --git a/tests/external-format.impure.lisp b/tests/external-format.impure.lisp index dcc9df7..11586b9 100644 --- a/tests/external-format.impure.lisp +++ b/tests/external-format.impure.lisp @@ -23,23 +23,31 @@ (defvar *test-path* "external-format-test.tmp") -(do-external-formats (xf) - (with-open-file (s #-win32 "/dev/null" #+win32 "nul" :direction :input :external-format xf) - (assert (eq (read-char s nil s) s)))) +(with-test (:name :end-of-file) + (do-external-formats (xf) + (with-open-file (s #-win32 "/dev/null" #+win32 "nul" :direction :input :external-format xf) + (assert (eq (read-char s nil s) s))))) ;;; Test standard character read-write equivalency over all external formats. -(let ((standard-characters "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!$\"'(),_-./:;?+<=>#%&*@[\\]{|}`^~")) - (do-external-formats (xf) - (with-open-file (s *test-path* :direction :output - :if-exists :supersede :external-format xf) - (loop for character across standard-characters - do (write-char character s))) - (with-open-file (s *test-path* :direction :input - :external-format xf) - (loop for character across standard-characters - do (let ((got (read-char s))) - (unless (eql character got) - (error "wanted ~S, got ~S" character got))))))) +(macrolet + ((frob () + (let ((tests nil)) + (do-external-formats (xf) + (pushnew `(with-test (:name (:standard-character :read-write-equivalency ,xf)) + (let ((standard-characters "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!$\"'(),_-./:;?+<=>#%&*@[\\]{|}`^~")) + (with-open-file (s *test-path* :direction :output + :if-exists :supersede :external-format ,xf) + (loop for character across standard-characters + do (write-char character s))) + (with-open-file (s *test-path* :direction :input + :external-format ,xf) + (loop for character across standard-characters + do (let ((got (read-char s))) + (unless (eql character got) + (error "wanted ~S, got ~S" character got))))))) + tests :key #'cadr :test #'equal)) + `(progn ,@tests)))) + (frob)) (delete-file *test-path*) #-sb-unicode @@ -925,4 +933,92 @@ (assert (char= (char string 0) (code-char #x10100))) (assert (char= (char string 1) #\replacement_character)))))) +;;; utf tests +(with-test (:name (:utf-16le :roundtrip)) + (let ((string (map 'string 'code-char '(#x20 #x200 #x2000 #xfffd #x10fffd)))) + (with-open-file (s *test-path* :direction :output :if-exists :supersede + :external-format :utf-16le) + (write-string string s)) + (with-open-file (s *test-path* :external-format :utf-16le) + (assert (string= string (read-line s)))))) +(with-test (:name (:utf-16be :roundtrip)) + (let ((string (map 'string 'code-char '(#x20 #x200 #x2000 #xfffd #x10fffd)))) + (with-open-file (s *test-path* :direction :output :if-exists :supersede + :external-format :utf-16be) + (write-string string s)) + (with-open-file (s *test-path* :external-format :utf-16be) + (assert (string= string (read-line s)))))) +(with-test (:name (:utf-16le :encoding-error)) + (let ((string (map 'string 'code-char '(#x20 #xfffe #xdc00 #xd800 #x1fffe #x20)))) + (with-open-file (s *test-path* :direction :output :if-exists :supersede + :external-format '(:utf-16le :replacement #\?)) + (write-string string s)) + (with-open-file (s *test-path* :external-format :utf-16le) + (assert (string= " ???? " (read-line s)))))) +(with-test (:name (:utf-16be :encoding-error)) + (let ((string (map 'string 'code-char '(#x20 #xfffe #xdc00 #xd800 #x1fffe #x20)))) + (with-open-file (s *test-path* :direction :output :if-exists :supersede + :external-format '(:utf-16be :replacement #\?)) + (write-string string s)) + (with-open-file (s *test-path* :external-format :utf-16be) + (assert (string= " ???? " (read-line s)))))) + +(with-test (:name (:utf-32le :roundtrip)) + (let ((string (map 'string 'code-char '(#x20 #x200 #x2000 #xfffd #x10fffd)))) + (with-open-file (s *test-path* :direction :output :if-exists :supersede + :external-format :utf-32le) + (write-string string s)) + (with-open-file (s *test-path* :external-format :utf-32le) + (assert (string= string (read-line s)))))) +(with-test (:name (:utf-32be :roundtrip)) + (let ((string (map 'string 'code-char '(#x20 #x200 #x2000 #xfffd #x10fffd)))) + (with-open-file (s *test-path* :direction :output :if-exists :supersede + :external-format :utf-32be) + (write-string string s)) + (with-open-file (s *test-path* :external-format :utf-32be) + (assert (string= string (read-line s)))))) +(with-test (:name (:utf-32le :encoding-error)) + (let ((string (map 'string 'code-char '(#x20 #xfffe #xdc00 #xd800 #x1fffe #x20)))) + (with-open-file (s *test-path* :direction :output :if-exists :supersede + :external-format '(:utf-32le :replacement #\?)) + (write-string string s)) + (with-open-file (s *test-path* :external-format :utf-32le) + (assert (string= " ???? " (read-line s)))))) +(with-test (:name (:utf-32be :encoding-error)) + (let ((string (map 'string 'code-char '(#x20 #xfffe #xdc00 #xd800 #x1fffe #x20)))) + (with-open-file (s *test-path* :direction :output :if-exists :supersede + :external-format '(:utf-32be :replacement #\?)) + (write-string string s)) + (with-open-file (s *test-path* :external-format :utf-32be) + (assert (string= " ???? " (read-line s)))))) + +(with-test (:name :invalid-external-format) + (labels ((test-error (e) + (assert (typep e 'error)) + (unless (equal "Undefined external-format: :BAD-FORMAT" + (princ-to-string e)) + (error "Bad error:~% ~A" e))) + (test (direction) + (test-error + (handler-case + (open "/dev/null" :direction direction :external-format :bad-format + :if-exists :overwrite) + (error (e) e))))) + (test :input) + (test :output) + (test :io) + (test-error + (handler-case + (run-program "sh" '() :input :stream :external-format :bad-format) + (error (e) e))) + (test-error + (handler-case + (string-to-octets "foobar" :external-format :bad-format) + (error (e) e))) + (test-error + (let ((octets (string-to-octets "foobar" :external-format :latin1))) + (handler-case + (octets-to-string octets :external-format :bad-format) + (error (e) e)))))) + ;;;; success