diff options
Diffstat (limited to 'src/pkg/bufio')
| -rw-r--r-- | src/pkg/bufio/bufio.go | 1 | ||||
| -rw-r--r-- | src/pkg/bufio/bufio_test.go | 47 | ||||
| -rw-r--r-- | src/pkg/bufio/example_test.go | 4 | ||||
| -rw-r--r-- | src/pkg/bufio/scan.go | 3 |
4 files changed, 46 insertions, 9 deletions
diff --git a/src/pkg/bufio/bufio.go b/src/pkg/bufio/bufio.go index ee69c2d31..df3501f2c 100644 --- a/src/pkg/bufio/bufio.go +++ b/src/pkg/bufio/bufio.go @@ -274,7 +274,6 @@ func (b *Reader) ReadSlice(delim byte) (line []byte, err error) { return b.buf, ErrBufferFull } } - panic("not reached") } // ReadLine is a low-level line-reading primitive. Most callers should use diff --git a/src/pkg/bufio/bufio_test.go b/src/pkg/bufio/bufio_test.go index b0e811443..79ed0f178 100644 --- a/src/pkg/bufio/bufio_test.go +++ b/src/pkg/bufio/bufio_test.go @@ -7,6 +7,7 @@ package bufio_test import ( . "bufio" "bytes" + "errors" "fmt" "io" "io/ioutil" @@ -434,9 +435,12 @@ func TestWriteErrors(t *testing.T) { t.Errorf("Write hello to %v: %v", w, e) continue } - e = buf.Flush() - if e != w.expect { - t.Errorf("Flush %v: got %v, wanted %v", w, e, w.expect) + // Two flushes, to verify the error is sticky. + for i := 0; i < 2; i++ { + e = buf.Flush() + if e != w.expect { + t.Errorf("Flush %d/2 %v: got %v, wanted %v", i+1, w, e, w.expect) + } } } } @@ -962,6 +966,43 @@ func TestNegativeRead(t *testing.T) { b.Read(make([]byte, 100)) } +var errFake = errors.New("fake error") + +type errorThenGoodReader struct { + didErr bool + nread int +} + +func (r *errorThenGoodReader) Read(p []byte) (int, error) { + r.nread++ + if !r.didErr { + r.didErr = true + return 0, errFake + } + return len(p), nil +} + +func TestReaderClearError(t *testing.T) { + r := &errorThenGoodReader{} + b := NewReader(r) + buf := make([]byte, 1) + if _, err := b.Read(nil); err != nil { + t.Fatalf("1st nil Read = %v; want nil", err) + } + if _, err := b.Read(buf); err != errFake { + t.Fatalf("1st Read = %v; want errFake", err) + } + if _, err := b.Read(nil); err != nil { + t.Fatalf("2nd nil Read = %v; want nil", err) + } + if _, err := b.Read(buf); err != nil { + t.Fatalf("3rd Read with buffer = %v; want nil", err) + } + if r.nread != 2 { + t.Errorf("num reads = %d; want 2", r.nread) + } +} + // An onlyReader only implements io.Reader, no matter what other methods the underlying implementation may have. type onlyReader struct { r io.Reader diff --git a/src/pkg/bufio/example_test.go b/src/pkg/bufio/example_test.go index b545ce39a..08a39441e 100644 --- a/src/pkg/bufio/example_test.go +++ b/src/pkg/bufio/example_test.go @@ -19,7 +19,7 @@ func ExampleScanner_lines() { fmt.Println(scanner.Text()) // Println will add back the final '\n' } if err := scanner.Err(); err != nil { - fmt.Fprintln(os.Stdout, "reading standard input:", err) + fmt.Fprintln(os.Stderr, "reading standard input:", err) } } @@ -37,7 +37,7 @@ func ExampleScanner_words() { count++ } if err := scanner.Err(); err != nil { - fmt.Fprintln(os.Stdout, "reading input:", err) + fmt.Fprintln(os.Stderr, "reading input:", err) } fmt.Printf("%d\n", count) // Output: 15 diff --git a/src/pkg/bufio/scan.go b/src/pkg/bufio/scan.go index 268ce6d1d..d94f7f9ad 100644 --- a/src/pkg/bufio/scan.go +++ b/src/pkg/bufio/scan.go @@ -27,8 +27,6 @@ import ( // control over error handling or large tokens, or must run sequential scans // on a reader, should use bufio.Reader instead. // -// TODO(r): Provide executable examples. -// type Scanner struct { r io.Reader // The reader provided by the client. split SplitFunc // The function to split the tokens. @@ -169,7 +167,6 @@ func (s *Scanner) Scan() bool { } s.end += n } - panic("not reached") } // advance consumes n bytes of the buffer. It reports whether the advance was legal. |
