mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-30 11:50:28 +02:00
* libguile/strports.c (scm_mkstrport): Use UTF-8; ignore %default-port-encoding. Rename 'str_len' and 'c_pos' to 'num_bytes' and 'c_byte_pos'. Interpret 'pos' argument as a character index instead of a byte index. * module/ice-9/boot-9.scm (%cond-expand-features): Add srfi-6 to the list of core features. * module/srfi/srfi-6.scm (open-input-string, open-output-string): Simply re-export these, since the core versions are now compliant. * doc/ref/api-io.texi (String Ports): Remove text that describes non-compliant behavior of string ports with regard to encoding. * doc/ref/srfi-modules.texi (SRFI-0): Add srfi-6 to the list of core features. (SRFI-6): Remove text that mentions non-compliant behavior of core string ports. * module/ice-9/format.scm (format): * module/ice-9/pretty-print.scm (truncated-print): * module/rnrs/io/ports.scm (open-string-input-port, open-string-output-port): * test-suite/test-suite/lib.scm (format-test-name): * test-suite/tests/chars.test ("combining accent is pretty-printed", "combining X is pretty-printed"): * test-suite/tests/ecmascript.test (eread, eread/1): * test-suite/tests/rdelim.test: * test-suite/tests/reader.test (read-string): * test-suite/tests/regexp.test: * test-suite/tests/srfi-105.test (read-string): Don't set %default-port-encoding before creating string ports. * benchmark-suite/benchmarks/ports.bm (%latin1-port): Use 'set-port-encoding!' to set the string port encoding. (%utf8/ascii-port, %utf8/wide-port, "rdelim"): Don't set %default-port-encoding before creating string ports. * test-suite/tests/r6rs-ports.test ("lookahead-u8 non-ASCII"): Don't set %default-port-encoding before creating string ports. ("put-bytevector with UTF-16 string port", "put-bytevector with wrong-encoding string port"): Use 'set-port-encoding!' to set the string port encoding. * test-suite/tests/print.test (tprint): Use 'set-port-encoding!' to set the string port encoding. ("truncated-print"): Use 'pass-if-equal'. * test-suite/tests/ports.test ("encoding failure leads to exception", "%default-port-encoding is honored", "peek-char [latin-1]", "peek-char [utf-8]", "peek-char [utf-16]"): Remove tests. ("%default-port-encoding is ignored", "peek-char"): Add tests. ("suitable encoding [latin-1]", "suitable encoding [latin-3]", "wrong encoding, error", "wrong encoding, substitute", "wrong encoding, escape"): Use 'set-port-encoding!' to set the string port encoding. ("%default-port-encoding, wrong encoding"): Rewrite to use a file port instead of a string port.
248 lines
8.7 KiB
Scheme
248 lines
8.7 KiB
Scheme
;;;; rdelim.test --- Delimited I/O. -*- mode: scheme; coding: utf-8; -*-
|
||
;;;; Ludovic Courtès <ludo@gnu.org>
|
||
;;;;
|
||
;;;; Copyright (C) 2011, 2013 Free Software Foundation, Inc.
|
||
;;;;
|
||
;;;; This library is free software; you can redistribute it and/or
|
||
;;;; modify it under the terms of the GNU Lesser General Public
|
||
;;;; License as published by the Free Software Foundation; either
|
||
;;;; version 3 of the License, or (at your option) any later version.
|
||
;;;;
|
||
;;;; This library is distributed in the hope that it will be useful,
|
||
;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
;;;; Lesser General Public License for more details.
|
||
;;;;
|
||
;;;; You should have received a copy of the GNU Lesser General Public
|
||
;;;; License along with this library; if not, write to the Free Software
|
||
;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||
|
||
(define-module (test-suite test-rdelim)
|
||
#:use-module (ice-9 rdelim)
|
||
#:use-module ((rnrs io ports) #:select (open-bytevector-input-port))
|
||
#:use-module (test-suite lib))
|
||
|
||
(with-test-prefix "read-line"
|
||
|
||
(pass-if "one line"
|
||
(let* ((s "hello, world")
|
||
(p (open-input-string s)))
|
||
(and (string=? s (read-line p))
|
||
(eof-object? (read-line p)))))
|
||
|
||
(pass-if "two lines, trim"
|
||
(let* ((s "foo\nbar\n")
|
||
(p (open-input-string s)))
|
||
(and (equal? (string-tokenize s)
|
||
(list (read-line p) (read-line p)))
|
||
(eof-object? (read-line p)))))
|
||
|
||
(pass-if "two lines, concat"
|
||
(let* ((s "foo\nbar\n")
|
||
(p (open-input-string s)))
|
||
(and (equal? '("foo\n" "bar\n")
|
||
(list (read-line p 'concat)
|
||
(read-line p 'concat)))
|
||
(eof-object? (read-line p)))))
|
||
|
||
(pass-if "two lines, peek"
|
||
(let* ((s "foo\nbar\n")
|
||
(p (open-input-string s)))
|
||
(and (equal? '("foo" #\newline "bar" #\newline)
|
||
(list (read-line p 'peek) (read-char p)
|
||
(read-line p 'peek) (read-char p)))
|
||
(eof-object? (read-line p)))))
|
||
|
||
(pass-if "two lines, split"
|
||
(let* ((s "foo\nbar\n")
|
||
(p (open-input-string s)))
|
||
(and (equal? '(("foo" . #\newline)
|
||
("bar" . #\newline))
|
||
(list (read-line p 'split)
|
||
(read-line p 'split)))
|
||
(eof-object? (read-line p)))))
|
||
|
||
(pass-if "two Greek lines, trim"
|
||
(let* ((s "λαμβδα\nμυ\n")
|
||
(p (open-input-string s)))
|
||
(and (equal? (string-tokenize s)
|
||
(list (read-line p) (read-line p)))
|
||
(eof-object? (read-line p)))))
|
||
|
||
(pass-if "decoding error"
|
||
(let ((p (open-bytevector-input-port #vu8(65 255 66 67 68))))
|
||
(set-port-encoding! p "UTF-8")
|
||
(set-port-conversion-strategy! p 'error)
|
||
(catch 'decoding-error
|
||
(lambda ()
|
||
(read-line p)
|
||
#f)
|
||
(lambda (key subr message err port)
|
||
(and (eq? port p)
|
||
|
||
;; PORT should now point past the error.
|
||
(string=? (read-line p) "BCD")
|
||
(eof-object? (read-line p)))))))
|
||
|
||
(pass-if "decoding error, substitute"
|
||
(let ((p (open-bytevector-input-port #vu8(65 255 66 67 68))))
|
||
(set-port-encoding! p "UTF-8")
|
||
(set-port-conversion-strategy! p 'substitute)
|
||
(and (string=? (read-line p) "A?BCD")
|
||
(eof-object? (read-line p))))))
|
||
|
||
|
||
(with-test-prefix "read-delimited"
|
||
|
||
(pass-if "delimiter hit"
|
||
(let ((p (open-input-string "hello, world!")))
|
||
(and (string=? "hello" (read-delimited ",.;" p))
|
||
(string=? " world!" (read-delimited ",.;" p))
|
||
(eof-object? (read-delimited ",.;" p)))))
|
||
|
||
(pass-if "delimiter hit, split"
|
||
(equal? '("hello" . #\,)
|
||
(read-delimited ",.;"
|
||
(open-input-string "hello, world!")
|
||
'split)))
|
||
|
||
(pass-if "delimiter hit, concat"
|
||
(equal? '"hello,"
|
||
(read-delimited ",.;" (open-input-string "hello, world!")
|
||
'concat)))
|
||
|
||
(pass-if "delimiter hit, peek"
|
||
(let ((p (open-input-string "hello, world!")))
|
||
(and (string=? "hello" (read-delimited ",.;" p 'peek))
|
||
(char=? #\, (peek-char p)))))
|
||
|
||
(pass-if "eof"
|
||
(eof-object? (read-delimited "}{" (open-input-string "")))))
|
||
|
||
|
||
(with-test-prefix "read-delimited!"
|
||
|
||
(pass-if "delimiter hit"
|
||
(let ((s (make-string 123))
|
||
(p (open-input-string "hello, world!")))
|
||
(and (= 5 (read-delimited! ",.;" s p))
|
||
(string=? (substring s 0 5) "hello")
|
||
(= 7 (read-delimited! ",.;" s p))
|
||
(string=? (substring s 0 7) " world!")
|
||
(eof-object? (read-delimited! ",.;" s p)))))
|
||
|
||
(pass-if "delimiter hit, start+end"
|
||
(let ((s (make-string 123))
|
||
(p (open-input-string "hello, world!")))
|
||
(and (= 5 (read-delimited! ",.;" s p 'trim 10 30))
|
||
(string=? (substring s 10 15) "hello"))))
|
||
|
||
(pass-if "delimiter hit, split"
|
||
(let ((s (make-string 123)))
|
||
(and (equal? '(5 . #\,)
|
||
(read-delimited! ",.;" s
|
||
(open-input-string "hello, world!")
|
||
'split))
|
||
(string=? (substring s 0 5) "hello"))))
|
||
|
||
(pass-if "delimiter hit, concat"
|
||
(let ((s (make-string 123)))
|
||
(and (= 6 (read-delimited! ",.;" s
|
||
(open-input-string "hello, world!")
|
||
'concat))
|
||
(string=? (substring s 0 6) "hello,"))))
|
||
|
||
(pass-if "delimiter hit, peek"
|
||
(let ((s (make-string 123))
|
||
(p (open-input-string "hello, world!")))
|
||
(and (= 5 (read-delimited! ",.;" s p 'peek))
|
||
(string=? (substring s 0 5) "hello")
|
||
(char=? #\, (peek-char p)))))
|
||
|
||
(pass-if "string too small"
|
||
(let ((s (make-string 7)))
|
||
(and (= 7 (read-delimited! "}{" s
|
||
(open-input-string "hello, world!")))
|
||
(string=? s "hello, "))))
|
||
|
||
(pass-if "string too small, start+end"
|
||
(let ((s (make-string 123)))
|
||
(and (= 7 (read-delimited! "}{" s
|
||
(open-input-string "hello, world!")
|
||
'trim
|
||
70 77))
|
||
(string=? (substring s 70 77) "hello, "))))
|
||
|
||
(pass-if "string too small, split"
|
||
(let ((s (make-string 7)))
|
||
(and (equal? '(7 . #f)
|
||
(read-delimited! "}{" s
|
||
(open-input-string "hello, world!")
|
||
'split))
|
||
(string=? s "hello, "))))
|
||
|
||
(pass-if "eof"
|
||
(eof-object? (read-delimited! ":" (make-string 7)
|
||
(open-input-string ""))))
|
||
|
||
(pass-if "eof, split"
|
||
(eof-object? (read-delimited! ":" (make-string 7)
|
||
(open-input-string "")))))
|
||
|
||
(with-test-prefix "read-string"
|
||
|
||
(pass-if "short string"
|
||
(let* ((s "hello, world!")
|
||
(p (open-input-string s)))
|
||
(and (string=? (read-string p) s)
|
||
(string=? (read-string p) ""))))
|
||
|
||
(pass-if "100 chars"
|
||
(let* ((s (make-string 100 #\space))
|
||
(p (open-input-string s)))
|
||
(and (string=? (read-string p) s)
|
||
(string=? (read-string p) ""))))
|
||
|
||
(pass-if "longer than 100 chars"
|
||
(let* ((s (string-concatenate (make-list 20 "hello, world!")))
|
||
(p (open-input-string s)))
|
||
(and (string=? (read-string p) s)
|
||
(string=? (read-string p) "")))))
|
||
|
||
(with-test-prefix "read-string!"
|
||
|
||
(pass-if "buf smaller"
|
||
(let* ((s "hello, world!")
|
||
(len (1- (string-length s)))
|
||
(buf (make-string len #\.))
|
||
(p (open-input-string s)))
|
||
(and (= (read-string! buf p) len)
|
||
(string=? buf (substring s 0 len))
|
||
(= (read-string! buf p) 1)
|
||
(string=? (substring buf 0 1) (substring s len)))))
|
||
|
||
(pass-if "buf right size"
|
||
(let* ((s "hello, world!")
|
||
(len (string-length s))
|
||
(buf (make-string len #\.))
|
||
(p (open-input-string s)))
|
||
(and (= (read-string! buf p) len)
|
||
(string=? buf (substring s 0 len))
|
||
(= (read-string! buf p) 0)
|
||
(string=? buf (substring s 0 len)))))
|
||
|
||
(pass-if "buf bigger"
|
||
(let* ((s "hello, world!")
|
||
(len (string-length s))
|
||
(buf (make-string (1+ len) #\.))
|
||
(p (open-input-string s)))
|
||
(and (= (read-string! buf p) len)
|
||
(string=? (substring buf 0 len) s)
|
||
(= (read-string! buf p) 0)
|
||
(string=? (substring buf 0 len) s)
|
||
(string=? (substring buf len) ".")))))
|
||
|
||
;;; Local Variables:
|
||
;;; eval: (put 'with-test-prefix 'scheme-indent-function 1)
|
||
;;; eval: (put 'pass-if 'scheme-indent-function 1)
|
||
;;; End:
|