| 307 | } |
| 308 | |
| 309 | func TestRuneIO(t *testing.T) { |
| 310 | const NRune = 1000 |
| 311 | // Built a test slice while we write the data |
| 312 | b := make([]byte, utf8.UTFMax*NRune) |
| 313 | var buf Buffer |
| 314 | n := 0 |
| 315 | for r := rune(0); r < NRune; r++ { |
| 316 | size := utf8.EncodeRune(b[n:], r) |
| 317 | nbytes, err := buf.WriteRune(r) |
| 318 | if err != nil { |
| 319 | t.Fatalf("WriteRune(%U) error: %s", r, err) |
| 320 | } |
| 321 | if nbytes != size { |
| 322 | t.Fatalf("WriteRune(%U) expected %d, got %d", r, size, nbytes) |
| 323 | } |
| 324 | n += size |
| 325 | } |
| 326 | b = b[0:n] |
| 327 | |
| 328 | // Check the resulting bytes |
| 329 | if !bytes.Equal(buf.Bytes(), b) { |
| 330 | t.Fatalf("incorrect result from WriteRune: %q not %q", buf.Bytes(), b) |
| 331 | } |
| 332 | |
| 333 | p := make([]byte, utf8.UTFMax) |
| 334 | // Read it back with ReadRune |
| 335 | for r := rune(0); r < NRune; r++ { |
| 336 | size := utf8.EncodeRune(p, r) |
| 337 | nr, nbytes, err := buf.ReadRune() |
| 338 | if nr != r || nbytes != size || err != nil { |
| 339 | t.Fatalf("ReadRune(%U) got %U,%d not %U,%d (err=%s)", r, nr, nbytes, r, size, err) |
| 340 | } |
| 341 | } |
| 342 | |
| 343 | // Check that UnreadRune works |
| 344 | buf.Reset() |
| 345 | |
| 346 | // check at EOF |
| 347 | if err := buf.UnreadRune(); err == nil { |
| 348 | t.Fatal("UnreadRune at EOF: got no error") |
| 349 | } |
| 350 | if _, _, err := buf.ReadRune(); err == nil { |
| 351 | t.Fatal("ReadRune at EOF: got no error") |
| 352 | } |
| 353 | if err := buf.UnreadRune(); err == nil { |
| 354 | t.Fatal("UnreadRune after ReadRune at EOF: got no error") |
| 355 | } |
| 356 | |
| 357 | // check not at EOF |
| 358 | buf.Write(b) |
| 359 | for r := rune(0); r < NRune; r++ { |
| 360 | r1, size, _ := buf.ReadRune() |
| 361 | if err := buf.UnreadRune(); err != nil { |
| 362 | t.Fatalf("UnreadRune(%U) got error %q", r, err) |
| 363 | } |
| 364 | r2, nbytes, err := buf.ReadRune() |
| 365 | if r1 != r2 || r1 != r || nbytes != size || err != nil { |
| 366 | t.Fatalf("ReadRune(%U) after UnreadRune got %U,%d not %U,%d (err=%s)", r, r2, nbytes, r, size, err) |