1 // Copyright 2012 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.
17 func TestReader(t
*testing
.T
) {
18 r
:= strings
.NewReader("0123456789")
27 {seek
: os
.SEEK_SET
, off
: 0, n
: 20, want
: "0123456789"},
28 {seek
: os
.SEEK_SET
, off
: 1, n
: 1, want
: "1"},
29 {seek
: os
.SEEK_CUR
, off
: 1, wantpos
: 3, n
: 2, want
: "34"},
30 {seek
: os
.SEEK_SET
, off
: -1, seekerr
: "strings.Reader.Seek: negative position"},
31 {seek
: os
.SEEK_SET
, off
: 1 << 33, wantpos
: 1 << 33},
32 {seek
: os
.SEEK_CUR
, off
: 1, wantpos
: 1<<33 + 1},
33 {seek
: os
.SEEK_SET
, n
: 5, want
: "01234"},
34 {seek
: os
.SEEK_CUR
, n
: 5, want
: "56789"},
35 {seek
: os
.SEEK_END
, off
: -1, n
: 1, wantpos
: 9, want
: "9"},
38 for i
, tt
:= range tests
{
39 pos
, err
:= r
.Seek(tt
.off
, tt
.seek
)
40 if err
== nil && tt
.seekerr
!= "" {
41 t
.Errorf("%d. want seek error %q", i
, tt
.seekerr
)
44 if err
!= nil && err
.Error() != tt
.seekerr
{
45 t
.Errorf("%d. seek error = %q; want %q", i
, err
.Error(), tt
.seekerr
)
48 if tt
.wantpos
!= 0 && tt
.wantpos
!= pos
{
49 t
.Errorf("%d. pos = %d, want %d", i
, pos
, tt
.wantpos
)
51 buf
:= make([]byte, tt
.n
)
54 t
.Errorf("%d. read = %v", i
, err
)
57 got
:= string(buf
[:n
])
59 t
.Errorf("%d. got %q; want %q", i
, got
, tt
.want
)
64 func TestReadAfterBigSeek(t
*testing
.T
) {
65 r
:= strings
.NewReader("0123456789")
66 if _
, err
:= r
.Seek(1<<31+5, os
.SEEK_SET
); err
!= nil {
69 if n
, err
:= r
.Read(make([]byte, 10)); n
!= 0 || err
!= io
.EOF
{
70 t
.Errorf("Read = %d, %v; want 0, EOF", n
, err
)
74 func TestReaderAt(t
*testing
.T
) {
75 r
:= strings
.NewReader("0123456789")
82 {0, 10, "0123456789", nil},
83 {1, 10, "123456789", io
.EOF
},
84 {1, 9, "123456789", nil},
87 {-1, 0, "", "strings.Reader.ReadAt: negative offset"},
89 for i
, tt
:= range tests
{
90 b
:= make([]byte, tt
.n
)
91 rn
, err
:= r
.ReadAt(b
, tt
.off
)
94 t
.Errorf("%d. got %q; want %q", i
, got
, tt
.want
)
96 if fmt
.Sprintf("%v", err
) != fmt
.Sprintf("%v", tt
.wanterr
) {
97 t
.Errorf("%d. got error = %v; want %v", i
, err
, tt
.wanterr
)
102 func TestReaderAtConcurrent(t
*testing
.T
) {
103 // Test for the race detector, to verify ReadAt doesn't mutate
105 r
:= strings
.NewReader("0123456789")
106 var wg sync
.WaitGroup
107 for i
:= 0; i
< 5; i
++ {
112 r
.ReadAt(buf
[:], int64(i
))
118 func TestEmptyReaderConcurrent(t
*testing
.T
) {
119 // Test for the race detector, to verify a Read that doesn't yield any bytes
120 // is okay to use from multiple goroutines. This was our historic behavior.
121 // See golang.org/issue/7856
122 r
:= strings
.NewReader("")
123 var wg sync
.WaitGroup
124 for i
:= 0; i
< 5; i
++ {
139 func TestWriteTo(t
*testing
.T
) {
140 const str
= "0123456789"
141 for i
:= 0; i
<= len(str
); i
++ {
143 r
:= strings
.NewReader(s
)
145 n
, err
:= r
.WriteTo(&b
)
146 if expect
:= int64(len(s
)); n
!= expect
{
147 t
.Errorf("got %v; want %v", n
, expect
)
150 t
.Errorf("for length %d: got error = %v; want nil", len(s
), err
)
153 t
.Errorf("got string %q; want %q", b
.String(), s
)
156 t
.Errorf("reader contains %v bytes; want 0", r
.Len())