1 // Copyright 2009 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
18 // Reads from a reader and rot13s the result.
19 type rot13Reader
struct {
23 func newRot13Reader(r io
.Reader
) *rot13Reader
{
24 r13
:= new(rot13Reader
)
29 func (r13
*rot13Reader
) Read(p
[]byte) (int, os
.Error
) {
34 for i
:= 0; i
< n
; i
++ {
35 c
:= p
[i
] |
0x20 // lowercase byte
36 if 'a' <= c
&& c
<= 'm' {
38 } else if 'n' <= c
&& c
<= 'z' {
45 // Call ReadByte to accumulate the text of a file
46 func readBytes(buf
*Reader
) string {
50 c
, e
:= buf
.ReadByte()
55 panic("Data: " + e
.String())
60 return string(b
[0:nb
])
63 func TestReaderSimple(t
*testing
.T
) {
65 b
:= NewReader(bytes
.NewBufferString(data
))
66 if s
:= readBytes(b
); s
!= "hello world" {
67 t
.Errorf("simple hello world test failed: got %q", s
)
70 b
= NewReader(newRot13Reader(bytes
.NewBufferString(data
)))
71 if s
:= readBytes(b
); s
!= "uryyb jbeyq" {
72 t
.Errorf("rot13 hello world test failed: got %q", s
)
77 type readMaker
struct {
79 fn
func(io
.Reader
) io
.Reader
82 var readMakers
= []readMaker
{
83 {"full", func(r io
.Reader
) io
.Reader
{ return r
}},
84 {"byte", iotest
.OneByteReader
},
85 {"half", iotest
.HalfReader
},
86 {"data+err", iotest
.DataErrReader
},
89 // Call ReadString (which ends up calling everything else)
90 // to accumulate the text of a file.
91 func readLines(b
*Reader
) string {
94 s1
, e
:= b
.ReadString('\n')
99 panic("GetLines: " + e
.String())
106 // Call Read to accumulate the text of a file
107 func reads(buf
*Reader
, m
int) string {
111 n
, e
:= buf
.Read(b
[nb
: nb
+m
])
117 return string(b
[0:nb
])
120 type bufReader
struct {
122 fn
func(*Reader
) string
125 var bufreaders
= []bufReader
{
126 {"1", func(b
*Reader
) string { return reads(b
, 1) }},
127 {"2", func(b
*Reader
) string { return reads(b
, 2) }},
128 {"3", func(b
*Reader
) string { return reads(b
, 3) }},
129 {"4", func(b
*Reader
) string { return reads(b
, 4) }},
130 {"5", func(b
*Reader
) string { return reads(b
, 5) }},
131 {"7", func(b
*Reader
) string { return reads(b
, 7) }},
132 {"bytes", readBytes
},
133 {"lines", readLines
},
136 var bufsizes
= []int{
137 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
138 23, 32, 46, 64, 93, 128, 1024, 4096,
141 func TestReader(t
*testing
.T
) {
145 for i
:= 0; i
< len(texts
)-1; i
++ {
146 texts
[i
] = str
+ "\n"
148 str
+= string(i%26
+ 'a')
150 texts
[len(texts
)-1] = all
152 for h
:= 0; h
< len(texts
); h
++ {
154 for i
:= 0; i
< len(readMakers
); i
++ {
155 for j
:= 0; j
< len(bufreaders
); j
++ {
156 for k
:= 0; k
< len(bufsizes
); k
++ {
157 readmaker
:= readMakers
[i
]
158 bufreader
:= bufreaders
[j
]
159 bufsize
:= bufsizes
[k
]
160 read
:= readmaker
.fn(bytes
.NewBufferString(text
))
161 buf
, _
:= NewReaderSize(read
, bufsize
)
162 s
:= bufreader
.fn(buf
)
164 t
.Errorf("reader=%s fn=%s bufsize=%d want=%q got=%q",
165 readmaker
.name
, bufreader
.name
, bufsize
, text
, s
)
173 // A StringReader delivers its data one string segment at a time via Read.
174 type StringReader
struct {
179 func (r
*StringReader
) Read(p
[]byte) (n
int, err os
.Error
) {
180 if r
.step
< len(r
.data
) {
190 func readRuneSegments(t
*testing
.T
, segments
[]string) {
192 want
:= strings
.Join(segments
, "")
193 r
:= NewReader(&StringReader
{data
: segments
})
195 rune
, _
, err
:= r
.ReadRune()
205 t
.Errorf("segments=%v got=%s want=%s", segments
, got
, want
)
209 var segmentList
= [][]string{
213 {"\u65e5", "\u672c", "\u8a9e"},
214 {"\U000065e5", "\U0000672c", "\U00008a9e"},
215 {"\xe6", "\x97\xa5\xe6", "\x9c\xac\xe8\xaa\x9e"},
216 {"Hello", ", ", "World", "!"},
217 {"Hello", ", ", "", "World", "!"},
220 func TestReadRune(t
*testing
.T
) {
221 for _
, s
:= range segmentList
{
222 readRuneSegments(t
, s
)
226 func TestUnreadRune(t
*testing
.T
) {
228 segments
:= []string{"Hello, world:", "日本語"}
229 data
:= strings
.Join(segments
, "")
230 r
:= NewReader(&StringReader
{data
: segments
})
233 rune
, _
, err
:= r
.ReadRune()
236 t
.Error("unexpected EOF")
241 // Put it back and read it again
242 if err
= r
.UnreadRune(); err
!= nil {
243 t
.Error("unexpected error on UnreadRune:", err
)
245 rune1
, _
, err
:= r
.ReadRune()
247 t
.Error("unexpected error reading after unreading:", err
)
250 t
.Errorf("incorrect rune after unread: got %c wanted %c", rune1
, rune
)
254 t
.Errorf("want=%q got=%q", data
, got
)
258 // Test that UnreadRune fails if the preceding operation was not a ReadRune.
259 func TestUnreadRuneError(t
*testing
.T
) {
260 buf
:= make([]byte, 3) // All runes in this test are 3 bytes long
261 r
:= NewReader(&StringReader
{data
: []string{"日本語日本語日本語"}})
262 if r
.UnreadRune() == nil {
263 t
.Error("expected error on UnreadRune from fresh buffer")
265 _
, _
, err
:= r
.ReadRune()
267 t
.Error("unexpected error on ReadRune (1):", err
)
269 if err
= r
.UnreadRune(); err
!= nil {
270 t
.Error("unexpected error on UnreadRune (1):", err
)
272 if r
.UnreadRune() == nil {
273 t
.Error("expected error after UnreadRune (1)")
275 // Test error after Read.
276 _
, _
, err
= r
.ReadRune() // reset state
278 t
.Error("unexpected error on ReadRune (2):", err
)
282 t
.Error("unexpected error on Read (2):", err
)
284 if r
.UnreadRune() == nil {
285 t
.Error("expected error after Read (2)")
287 // Test error after ReadByte.
288 _
, _
, err
= r
.ReadRune() // reset state
290 t
.Error("unexpected error on ReadRune (2):", err
)
293 _
, err
= r
.ReadByte()
295 t
.Error("unexpected error on ReadByte (2):", err
)
298 if r
.UnreadRune() == nil {
299 t
.Error("expected error after ReadByte")
301 // Test error after UnreadByte.
302 _
, _
, err
= r
.ReadRune() // reset state
304 t
.Error("unexpected error on ReadRune (3):", err
)
306 _
, err
= r
.ReadByte()
308 t
.Error("unexpected error on ReadByte (3):", err
)
312 t
.Error("unexpected error on UnreadByte (3):", err
)
314 if r
.UnreadRune() == nil {
315 t
.Error("expected error after UnreadByte (3)")
319 func TestUnreadRuneAtEOF(t
*testing
.T
) {
320 // UnreadRune/ReadRune should error at EOF (was a bug; used to panic)
321 r
:= NewReader(strings
.NewReader("x"))
325 _
, _
, err
:= r
.ReadRune()
327 t
.Error("expected error at EOF")
328 } else if err
!= os
.EOF
{
329 t
.Error("expected EOF; got", err
)
333 func TestReadWriteRune(t
*testing
.T
) {
335 byteBuf
:= new(bytes
.Buffer
)
336 w
:= NewWriter(byteBuf
)
337 // Write the runes out using WriteRune
338 buf
:= make([]byte, utf8
.UTFMax
)
339 for rune
:= 0; rune
< NRune
; rune
++ {
340 size
:= utf8
.EncodeRune(rune
, buf
)
341 nbytes
, err
:= w
.WriteRune(rune
)
343 t
.Fatalf("WriteRune(0x%x) error: %s", rune
, err
)
346 t
.Fatalf("WriteRune(0x%x) expected %d, got %d", rune
, size
, nbytes
)
351 r
:= NewReader(byteBuf
)
352 // Read them back with ReadRune
353 for rune
:= 0; rune
< NRune
; rune
++ {
354 size
:= utf8
.EncodeRune(rune
, buf
)
355 nr
, nbytes
, err
:= r
.ReadRune()
356 if nr
!= rune || nbytes
!= size || err
!= nil {
357 t
.Fatalf("ReadRune(0x%x) got 0x%x,%d not 0x%x,%d (err=%s)", r
, nr
, nbytes
, r
, size
, err
)
362 func TestWriter(t
*testing
.T
) {
365 for i
:= 0; i
< len(data
); i
++ {
366 data
[i
] = byte(' ' + i
%('~'-' '))
368 w
:= new(bytes
.Buffer
)
369 for i
:= 0; i
< len(bufsizes
); i
++ {
370 for j
:= 0; j
< len(bufsizes
); j
++ {
371 nwrite
:= bufsizes
[i
]
374 // Write nwrite bytes using buffer size bs.
375 // Check that the right amount makes it out
376 // and that the data is correct.
379 buf
, e
:= NewWriterSize(w
, bs
)
380 context
:= fmt
.Sprintf("nwrite=%d bufsize=%d", nwrite
, bs
)
382 t
.Errorf("%s: NewWriterSize %d: %v", context
, bs
, e
)
385 n
, e1
:= buf
.Write(data
[0:nwrite
])
386 if e1
!= nil || n
!= nwrite
{
387 t
.Errorf("%s: buf.Write %d = %d, %v", context
, nwrite
, n
, e1
)
390 if e
= buf
.Flush(); e
!= nil {
391 t
.Errorf("%s: buf.Flush = %v", context
, e
)
395 if len(written
) != nwrite
{
396 t
.Errorf("%s: %d bytes written", context
, len(written
))
398 for l
:= 0; l
< len(written
); l
++ {
399 if written
[i
] != data
[i
] {
400 t
.Errorf("%s: wrong bytes written")
401 t
.Errorf("want=%s", data
[0:len(written
)])
402 t
.Errorf("have=%s", written
)
409 // Check that write errors are returned properly.
411 type errorWriterTest
struct {
417 func (w errorWriterTest
) Write(p
[]byte) (int, os
.Error
) {
418 return len(p
) * w
.n
/ w
.m
, w
.err
421 var errorWriterTests
= []errorWriterTest
{
422 {0, 1, nil, io
.ErrShortWrite
},
423 {1, 2, nil, io
.ErrShortWrite
},
425 {0, 1, os
.EPIPE
, os
.EPIPE
},
426 {1, 2, os
.EPIPE
, os
.EPIPE
},
427 {1, 1, os
.EPIPE
, os
.EPIPE
},
430 func TestWriteErrors(t
*testing
.T
) {
431 for _
, w
:= range errorWriterTests
{
433 _
, e
:= buf
.Write([]byte("hello world"))
435 t
.Errorf("Write hello to %v: %v", w
, e
)
440 t
.Errorf("Flush %v: got %v, wanted %v", w
, e
, w
.expect
)
445 func TestNewReaderSizeIdempotent(t
*testing
.T
) {
447 b
, err
:= NewReaderSize(bytes
.NewBufferString("hello world"), BufSize
)
449 t
.Error("NewReaderSize create fail", err
)
451 // Does it recognize itself?
452 b1
, err2
:= NewReaderSize(b
, BufSize
)
454 t
.Error("NewReaderSize #2 create fail", err2
)
457 t
.Error("NewReaderSize did not detect underlying Reader")
459 // Does it wrap if existing buffer is too small?
460 b2
, err3
:= NewReaderSize(b
, 2*BufSize
)
462 t
.Error("NewReaderSize #3 create fail", err3
)
465 t
.Error("NewReaderSize did not enlarge buffer")
469 func TestNewWriterSizeIdempotent(t
*testing
.T
) {
471 b
, err
:= NewWriterSize(new(bytes
.Buffer
), BufSize
)
473 t
.Error("NewWriterSize create fail", err
)
475 // Does it recognize itself?
476 b1
, err2
:= NewWriterSize(b
, BufSize
)
478 t
.Error("NewWriterSize #2 create fail", err2
)
481 t
.Error("NewWriterSize did not detect underlying Writer")
483 // Does it wrap if existing buffer is too small?
484 b2
, err3
:= NewWriterSize(b
, 2*BufSize
)
486 t
.Error("NewWriterSize #3 create fail", err3
)
489 t
.Error("NewWriterSize did not enlarge buffer")
493 func TestWriteString(t
*testing
.T
) {
495 buf
:= new(bytes
.Buffer
)
496 b
, err
:= NewWriterSize(buf
, BufSize
)
498 t
.Error("NewWriterSize create fail", err
)
500 b
.WriteString("0") // easy
501 b
.WriteString("123456") // still easy
502 b
.WriteString("7890") // easy after flush
503 b
.WriteString("abcdefghijklmnopqrstuvwxy") // hard
507 t
.Error("WriteString", b
.err
)
509 s
:= "01234567890abcdefghijklmnopqrstuvwxyz"
510 if string(buf
.Bytes()) != s
{
511 t
.Errorf("WriteString wants %q gets %q", s
, string(buf
.Bytes()))
515 func TestBufferFull(t
*testing
.T
) {
516 buf
, _
:= NewReaderSize(strings
.NewReader("hello, world"), 5)
517 line
, err
:= buf
.ReadSlice(',')
518 if string(line
) != "hello" || err
!= ErrBufferFull
{
519 t
.Errorf("first ReadSlice(,) = %q, %v", line
, err
)
521 line
, err
= buf
.ReadSlice(',')
522 if string(line
) != "," || err
!= nil {
523 t
.Errorf("second ReadSlice(,) = %q, %v", line
, err
)
527 func TestPeek(t
*testing
.T
) {
528 p
:= make([]byte, 10)
529 buf
, _
:= NewReaderSize(strings
.NewReader("abcdefghij"), 4)
530 if s
, err
:= buf
.Peek(1); string(s
) != "a" || err
!= nil {
531 t
.Fatalf("want %q got %q, err=%v", "a", string(s
), err
)
533 if s
, err
:= buf
.Peek(4); string(s
) != "abcd" || err
!= nil {
534 t
.Fatalf("want %q got %q, err=%v", "abcd", string(s
), err
)
536 if _
, err
:= buf
.Peek(5); err
!= ErrBufferFull
{
537 t
.Fatalf("want ErrBufFull got %v", err
)
539 if _
, err
:= buf
.Read(p
[0:3]); string(p
[0:3]) != "abc" || err
!= nil {
540 t
.Fatalf("want %q got %q, err=%v", "abc", string(p
[0:3]), err
)
542 if s
, err
:= buf
.Peek(1); string(s
) != "d" || err
!= nil {
543 t
.Fatalf("want %q got %q, err=%v", "d", string(s
), err
)
545 if s
, err
:= buf
.Peek(2); string(s
) != "de" || err
!= nil {
546 t
.Fatalf("want %q got %q, err=%v", "de", string(s
), err
)
548 if _
, err
:= buf
.Read(p
[0:3]); string(p
[0:3]) != "def" || err
!= nil {
549 t
.Fatalf("want %q got %q, err=%v", "def", string(p
[0:3]), err
)
551 if s
, err
:= buf
.Peek(4); string(s
) != "ghij" || err
!= nil {
552 t
.Fatalf("want %q got %q, err=%v", "ghij", string(s
), err
)
554 if _
, err
:= buf
.Read(p
[0:4]); string(p
[0:4]) != "ghij" || err
!= nil {
555 t
.Fatalf("want %q got %q, err=%v", "ghij", string(p
[0:3]), err
)
557 if s
, err
:= buf
.Peek(0); string(s
) != "" || err
!= nil {
558 t
.Fatalf("want %q got %q, err=%v", "", string(s
), err
)
560 if _
, err
:= buf
.Peek(1); err
!= os
.EOF
{
561 t
.Fatalf("want EOF got %v", err
)
565 func TestPeekThenUnreadRune(t
*testing
.T
) {
566 // This sequence used to cause a crash.
567 r
:= NewReader(strings
.NewReader("x"))
571 r
.ReadRune() // Used to panic here