github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/gnovm/stdlibs/bytes/reader_test.gno (about) 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. 4 5 package bytes_test 6 7 import ( 8 "bytes" 9 "io" 10 "testing" 11 ) 12 13 func TestReader(t *testing.T) { 14 r := bytes.NewReader([]byte("0123456789")) 15 tests := []struct { 16 off int64 17 seek int 18 n int 19 want string 20 wantpos int64 21 readerr error 22 seekerr string 23 }{ 24 {seek: io.SeekStart, off: 0, n: 20, want: "0123456789"}, 25 {seek: io.SeekStart, off: 1, n: 1, want: "1"}, 26 {seek: io.SeekCurrent, off: 1, wantpos: 3, n: 2, want: "34"}, 27 {seek: io.SeekStart, off: -1, seekerr: "bytes.Reader.Seek: negative position"}, 28 {seek: io.SeekStart, off: 1 << 33, wantpos: 1 << 33, readerr: io.EOF}, 29 {seek: io.SeekCurrent, off: 1, wantpos: 1<<33 + 1, readerr: io.EOF}, 30 {seek: io.SeekStart, n: 5, want: "01234"}, 31 {seek: io.SeekCurrent, n: 5, want: "56789"}, 32 {seek: io.SeekEnd, off: -1, n: 1, wantpos: 9, want: "9"}, 33 } 34 35 for i, tt := range tests { 36 pos, err := r.Seek(tt.off, tt.seek) 37 if err == nil && tt.seekerr != "" { 38 t.Errorf("%d. want seek error %q", i, tt.seekerr) 39 continue 40 } 41 if err != nil && err.Error() != tt.seekerr { 42 t.Errorf("%d. seek error = %q; want %q", i, err.Error(), tt.seekerr) 43 continue 44 } 45 if tt.wantpos != 0 && tt.wantpos != pos { 46 t.Errorf("%d. pos = %d, want %d", i, pos, tt.wantpos) 47 } 48 buf := make([]byte, tt.n) 49 n, err := r.Read(buf) 50 if err != tt.readerr { 51 t.Errorf("%d. read = %v; want %v", i, err, tt.readerr) 52 continue 53 } 54 got := string(buf[:n]) 55 if got != tt.want { 56 t.Errorf("%d. got %q; want %q", i, got, tt.want) 57 } 58 } 59 } 60 61 func TestReadAfterBigSeek(t *testing.T) { 62 r := bytes.NewReader([]byte("0123456789")) 63 if _, err := r.Seek(1<<31+5, io.SeekStart); err != nil { 64 t.Fatal(err) 65 } 66 if n, err := r.Read(make([]byte, 10)); n != 0 || err != io.EOF { 67 t.Errorf("Read = %d, %v; want 0, EOF", n, err) 68 } 69 } 70 71 func TestReaderAt(t *testing.T) { 72 r := bytes.NewReader([]byte("0123456789")) 73 tests := []struct { 74 off int64 75 n int 76 want string 77 wanterr interface{} 78 }{ 79 {0, 10, "0123456789", nil}, 80 {1, 10, "123456789", io.EOF}, 81 {1, 9, "123456789", nil}, 82 {11, 10, "", io.EOF}, 83 {0, 0, "", nil}, 84 {-1, 0, "", "bytes.Reader.ReadAt: negative offset"}, 85 } 86 for i, tt := range tests { 87 b := make([]byte, tt.n) 88 rn, err := r.ReadAt(b, tt.off) 89 got := string(b[:rn]) 90 if got != tt.want { 91 t.Errorf("%d. got %q; want %q", i, got, tt.want) 92 } 93 /* XXX replace with switch statement due to fmt.Sprintf incompat 94 if fmt.Sprintf("%v", err) != fmt.Sprintf("%v", tt.wanterr) { 95 t.Errorf("%d. got error = %v; want %v", i, err, tt.wanterr) 96 } 97 */ 98 switch werr := tt.wanterr.(type) { 99 case nil: 100 if err != nil { 101 t.Errorf("%d. got error = %v; want %v", i, err, tt.wanterr) 102 } 103 case error: 104 if err.Error() != werr.Error() { 105 t.Errorf("%d. got error = %v; want %v", i, err, tt.wanterr) 106 } 107 case string: 108 if err.Error() != werr { 109 t.Errorf("%d. got error = %v; want %v", i, err, tt.wanterr) 110 } 111 default: 112 panic("should not happen") 113 } 114 } 115 } 116 117 /* 118 func TestReaderAtConcurrent(t *testing.T) { 119 // Test for the race detector, to verify ReadAt doesn't mutate 120 // any state. 121 r := NewReader([]byte("0123456789")) 122 var wg sync.WaitGroup 123 for i := 0; i < 5; i++ { 124 wg.Add(1) 125 go func(i int) { 126 defer wg.Done() 127 var buf [1]byte 128 r.ReadAt(buf[:], int64(i)) 129 }(i) 130 } 131 wg.Wait() 132 } 133 134 func TestEmptyReaderConcurrent(t *testing.T) { 135 // Test for the race detector, to verify a Read that doesn't yield any bytes 136 // is okay to use from multiple goroutines. This was our historic behavior. 137 // See golang.org/issue/7856 138 r := NewReader([]byte{}) 139 var wg sync.WaitGroup 140 for i := 0; i < 5; i++ { 141 wg.Add(2) 142 go func() { 143 defer wg.Done() 144 var buf [1]byte 145 r.Read(buf[:]) 146 }() 147 go func() { 148 defer wg.Done() 149 r.Read(nil) 150 }() 151 } 152 wg.Wait() 153 } 154 */ 155 156 func TestReaderWriteTo(t *testing.T) { 157 for i := 0; i < 30; i += 3 { 158 var l int 159 if i > 0 { 160 l = len(testString) / i 161 } 162 s := testString[:l] 163 r := bytes.NewReader(testBytes[:l]) 164 var b bytes.Buffer 165 n, err := r.WriteTo(&b) 166 if expect := int64(len(s)); n != expect { 167 t.Errorf("got %v; want %v", n, expect) 168 } 169 if err != nil { 170 t.Errorf("for length %d: got error = %v; want nil", l, err) 171 } 172 if b.String() != s { 173 t.Errorf("got string %q; want %q", b.String(), s) 174 } 175 if r.Len() != 0 { 176 t.Errorf("reader contains %v bytes; want 0", r.Len()) 177 } 178 } 179 } 180 181 func TestReaderLen(t *testing.T) { 182 const data = "hello world" 183 r := bytes.NewReader([]byte(data)) 184 if got, want := r.Len(), 11; got != want { 185 t.Errorf("r.Len(): got %d, want %d", got, want) 186 } 187 if n, err := r.Read(make([]byte, 10)); err != nil || n != 10 { 188 t.Errorf("Read failed: read %d %v", n, err) 189 } 190 if got, want := r.Len(), 1; got != want { 191 t.Errorf("r.Len(): got %d, want %d", got, want) 192 } 193 if n, err := r.Read(make([]byte, 1)); err != nil || n != 1 { 194 t.Errorf("Read failed: read %d %v; want 1, nil", n, err) 195 } 196 if got, want := r.Len(), 0; got != want { 197 t.Errorf("r.Len(): got %d, want %d", got, want) 198 } 199 } 200 201 var UnreadRuneErrorTests = []struct { 202 name string 203 f func(*bytes.Reader) 204 }{ 205 {"Read", func(r *bytes.Reader) { r.Read([]byte{0}) }}, 206 {"ReadByte", func(r *bytes.Reader) { r.ReadByte() }}, 207 {"UnreadRune", func(r *bytes.Reader) { r.UnreadRune() }}, 208 {"Seek", func(r *bytes.Reader) { r.Seek(0, io.SeekCurrent) }}, 209 {"WriteTo", func(r *bytes.Reader) { r.WriteTo(&bytes.Buffer{}) }}, 210 } 211 212 func TestUnreadRuneError(t *testing.T) { 213 for _, tt := range UnreadRuneErrorTests { 214 reader := bytes.NewReader([]byte("0123456789")) 215 if _, _, err := reader.ReadRune(); err != nil { 216 // should not happen 217 t.Fatal(err) 218 } 219 tt.f(reader) 220 err := reader.UnreadRune() 221 if err == nil { 222 t.Errorf("Unreading after %s: expected error", tt.name) 223 } 224 } 225 } 226 227 func TestReaderDoubleUnreadRune(t *testing.T) { 228 buf := bytes.NewBuffer([]byte("groucho")) 229 if _, _, err := buf.ReadRune(); err != nil { 230 // should not happen 231 t.Fatal(err) 232 } 233 if err := buf.UnreadByte(); err != nil { 234 // should not happen 235 t.Fatal(err) 236 } 237 if err := buf.UnreadByte(); err == nil { 238 t.Fatal("UnreadByte: expected error, got nil") 239 } 240 } 241 242 // verify that copying from an empty reader always has the same results, 243 // regardless of the presence of a WriteTo method. 244 func TestReaderCopyNothing(t *testing.T) { 245 type nErr struct { 246 n int64 247 err error 248 } 249 type justReader struct { 250 io.Reader 251 } 252 type justWriter struct { 253 io.Writer 254 } 255 discard := justWriter{io.Discard} // hide ReadFrom 256 257 var with, withOut nErr 258 with.n, with.err = io.Copy(discard, bytes.NewReader(nil)) 259 withOut.n, withOut.err = io.Copy(discard, justReader{bytes.NewReader(nil)}) 260 if with != withOut { 261 t.Errorf("behavior differs: with = %#v; without: %#v", with, withOut) 262 } 263 } 264 265 // tests that Len is affected by reads, but Size is not. 266 func TestReaderLenSize(t *testing.T) { 267 r := bytes.NewReader([]byte("abc")) 268 io.CopyN(io.Discard, r, 1) 269 if r.Len() != 2 { 270 t.Errorf("Len = %d; want 2", r.Len()) 271 } 272 if r.Size() != 3 { 273 t.Errorf("Size = %d; want 3", r.Size()) 274 } 275 } 276 277 func TestReaderReset(t *testing.T) { 278 r := bytes.NewReader([]byte("世界")) 279 if _, _, err := r.ReadRune(); err != nil { 280 t.Errorf("ReadRune: unexpected error: %v", err) 281 } 282 283 const want = "abcdef" 284 r.Reset([]byte(want)) 285 if err := r.UnreadRune(); err == nil { 286 t.Errorf("UnreadRune: expected error, got nil") 287 } 288 buf, err := io.ReadAll(r) 289 if err != nil { 290 t.Errorf("ReadAll: unexpected error: %v", err) 291 } 292 if got := string(buf); got != want { 293 t.Errorf("ReadAll: got %q, want %q", got, want) 294 } 295 } 296 297 func TestReaderZero(t *testing.T) { 298 if l := (&bytes.Reader{}).Len(); l != 0 { 299 t.Errorf("Len: got %d, want 0", l) 300 } 301 302 if n, err := (&bytes.Reader{}).Read(nil); n != 0 || err != io.EOF { 303 t.Errorf("Read: got %d, %v; want 0, io.EOF", n, err) 304 } 305 306 if n, err := (&bytes.Reader{}).ReadAt(nil, 11); n != 0 || err != io.EOF { 307 t.Errorf("ReadAt: got %d, %v; want 0, io.EOF", n, err) 308 } 309 310 if b, err := (&bytes.Reader{}).ReadByte(); b != 0 || err != io.EOF { 311 t.Errorf("ReadByte: got %d, %v; want 0, io.EOF", b, err) 312 } 313 314 if ch, size, err := (&bytes.Reader{}).ReadRune(); ch != 0 || size != 0 || err != io.EOF { 315 t.Errorf("ReadRune: got %d, %d, %v; want 0, 0, io.EOF", ch, size, err) 316 } 317 318 if offset, err := (&bytes.Reader{}).Seek(11, io.SeekStart); offset != 11 || err != nil { 319 t.Errorf("Seek: got %d, %v; want 11, nil", offset, err) 320 } 321 322 if s := (&bytes.Reader{}).Size(); s != 0 { 323 t.Errorf("Size: got %d, want 0", s) 324 } 325 326 if (&bytes.Reader{}).UnreadByte() == nil { 327 t.Errorf("UnreadByte: got nil, want error") 328 } 329 330 if (&bytes.Reader{}).UnreadRune() == nil { 331 t.Errorf("UnreadRune: got nil, want error") 332 } 333 334 if n, err := (&bytes.Reader{}).WriteTo(io.Discard); n != 0 || err != nil { 335 t.Errorf("WriteTo: got %d, %v; want 0, nil", n, err) 336 } 337 }