github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/gnovm/stdlibs/strings/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 strings_test 6 7 import ( 8 "io" 9 "strings" 10 "testing" 11 ) 12 13 func TestReader(t *testing.T) { 14 r := strings.NewReader("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: "strings.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 := strings.NewReader("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 := strings.NewReader("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, "", "strings.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 /* XXX removed sync usage 118 func TestReaderAtConcurrent(t *testing.T) { 119 // Test for the race detector, to verify ReadAt doesn't mutate 120 // any state. 121 r := strings.NewReader("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 := strings.NewReader("") 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 /* XXX const cannot be sliced yet 157 func TestWriteTo(t *testing.T) { 158 const str = "0123456789" 159 for i := 0; i <= len(str); i++ { 160 s := str[i:] 161 r := strings.NewReader(s) 162 var b bytes.Buffer 163 n, err := r.WriteTo(&b) 164 if expect := int64(len(s)); n != expect { 165 t.Errorf("got %v; want %v", n, expect) 166 } 167 if err != nil { 168 t.Errorf("for length %d: got error = %v; want nil", len(s), err) 169 } 170 if b.String() != s { 171 t.Errorf("got string %q; want %q", b.String(), s) 172 } 173 if r.Len() != 0 { 174 t.Errorf("reader contains %v bytes; want 0", r.Len()) 175 } 176 } 177 } 178 */ 179 180 // tests that Len is affected by reads, but Size is not. 181 func TestReaderLenSize(t *testing.T) { 182 r := strings.NewReader("abc") 183 io.CopyN(io.Discard, r, 1) 184 if r.Len() != 2 { 185 t.Errorf("Len = %d; want 2", r.Len()) 186 } 187 if r.Size() != 3 { 188 t.Errorf("Size = %d; want 3", r.Size()) 189 } 190 } 191 192 func TestReaderReset(t *testing.T) { 193 r := strings.NewReader("世界") 194 if _, _, err := r.ReadRune(); err != nil { 195 t.Errorf("ReadRune: unexpected error: %v", err) 196 } 197 198 const want = "abcdef" 199 r.Reset(want) 200 if err := r.UnreadRune(); err == nil { 201 t.Errorf("UnreadRune: expected error, got nil") 202 } 203 buf, err := io.ReadAll(r) 204 if err != nil { 205 t.Errorf("ReadAll: unexpected error: %v", err) 206 } 207 if got := string(buf); got != want { 208 t.Errorf("ReadAll: got %q, want %q", got, want) 209 } 210 } 211 212 func TestReaderZero(t *testing.T) { 213 if l := (&strings.Reader{}).Len(); l != 0 { 214 t.Errorf("Len: got %d, want 0", l) 215 } 216 217 if n, err := (&strings.Reader{}).Read(nil); n != 0 || err != io.EOF { 218 t.Errorf("Read: got %d, %v; want 0, io.EOF", n, err) 219 } 220 221 if n, err := (&strings.Reader{}).ReadAt(nil, 11); n != 0 || err != io.EOF { 222 t.Errorf("ReadAt: got %d, %v; want 0, io.EOF", n, err) 223 } 224 225 if b, err := (&strings.Reader{}).ReadByte(); b != 0 || err != io.EOF { 226 t.Errorf("ReadByte: got %d, %v; want 0, io.EOF", b, err) 227 } 228 229 if ch, size, err := (&strings.Reader{}).ReadRune(); ch != 0 || size != 0 || err != io.EOF { 230 t.Errorf("ReadRune: got %d, %d, %v; want 0, 0, io.EOF", ch, size, err) 231 } 232 233 if offset, err := (&strings.Reader{}).Seek(11, io.SeekStart); offset != 11 || err != nil { 234 t.Errorf("Seek: got %d, %v; want 11, nil", offset, err) 235 } 236 237 if s := (&strings.Reader{}).Size(); s != 0 { 238 t.Errorf("Size: got %d, want 0", s) 239 } 240 241 if (&strings.Reader{}).UnreadByte() == nil { 242 t.Errorf("UnreadByte: got nil, want error") 243 } 244 245 if (&strings.Reader{}).UnreadRune() == nil { 246 t.Errorf("UnreadRune: got nil, want error") 247 } 248 249 if n, err := (&strings.Reader{}).WriteTo(io.Discard); n != 0 || err != nil { 250 t.Errorf("WriteTo: got %d, %v; want 0, nil", n, err) 251 } 252 }