Merge from mainline (167278:168000).
[official-gcc/graphite-test-results.git] / libgo / go / testing / iotest / reader.go
blob647520a09fc3bd16546ccef39ee6032027812efc
1 // Copyright 2009 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.
5 // The iotest package implements Readers and Writers
6 // useful only for testing.
7 package iotest
9 import (
10 "io"
11 "os"
14 // OneByteReader returns a Reader that implements
15 // each non-empty Read by reading one byte from r.
16 func OneByteReader(r io.Reader) io.Reader { return &oneByteReader{r} }
18 type oneByteReader struct {
19 r io.Reader
22 func (r *oneByteReader) Read(p []byte) (int, os.Error) {
23 if len(p) == 0 {
24 return 0, nil
26 return r.r.Read(p[0:1])
29 // HalfReader returns a Reader that implements Read
30 // by reading half as many requested bytes from r.
31 func HalfReader(r io.Reader) io.Reader { return &halfReader{r} }
33 type halfReader struct {
34 r io.Reader
37 func (r *halfReader) Read(p []byte) (int, os.Error) {
38 return r.r.Read(p[0 : (len(p)+1)/2])
42 // DataErrReader returns a Reader that returns the final
43 // error with the last data read, instead of by itself with
44 // zero bytes of data.
45 func DataErrReader(r io.Reader) io.Reader { return &dataErrReader{r, nil, make([]byte, 1024)} }
47 type dataErrReader struct {
48 r io.Reader
49 unread []byte
50 data []byte
53 func (r *dataErrReader) Read(p []byte) (n int, err os.Error) {
54 // loop because first call needs two reads:
55 // one to get data and a second to look for an error.
56 for {
57 if len(r.unread) == 0 {
58 n1, err1 := r.r.Read(r.data)
59 r.unread = r.data[0:n1]
60 err = err1
62 if n > 0 {
63 break
65 n = copy(p, r.unread)
66 r.unread = r.unread[n:]
68 return