memio - limitedbuffer_test.go
1 package memio
2
3 import (
4 "bytes"
5 "io"
6 "testing"
7 )
8
9 var (
10 _ io.Reader = &LimitedBuffer{}
11 _ io.Writer = &LimitedBuffer{}
12 _ io.WriterTo = &LimitedBuffer{}
13 _ io.ReaderFrom = &LimitedBuffer{}
14 _ io.ReaderAt = &LimitedBuffer{}
15 _ io.WriterAt = &LimitedBuffer{}
16 )
17
18 func TestLimitedBufferWrite(t *testing.T) {
19 data := []byte("Beep")
20 writer := LimitedBuffer(data)[:0:4]
21 if n, err := writer.Write([]byte("J")); n != 1 {
22 t.Errorf("expecting to write 1 byte, wrote %d", n)
23 return
24 } else if err != nil {
25 t.Errorf("got error: %q", err.Error())
26 return
27 } else if string(data) != "Jeep" {
28 t.Errorf("expecting %q, got %q", "Jeep ", string(data))
29 return
30 }
31 if n, err := writer.Write([]byte("ohn")); n != 3 {
32 t.Errorf("expecting to write 3 bytes, wrote %d", n)
33 return
34 } else if err != nil {
35 t.Errorf("got error: %q", err.Error())
36 return
37 } else if string(data) != "John" {
38 t.Errorf("expecting %q, got %q", "John ", string(data))
39 return
40 }
41 if n, err := writer.Write([]byte("ny")); err != io.ErrShortBuffer {
42 t.Errorf("expecting io.ErrShortBuffer, got: %s", err)
43 return
44 } else if n != 0 {
45 t.Errorf("expecting to write 0 bytes, wrote %d", n)
46 }
47 }
48
49 type byteReader byte
50
51 func (b byteReader) Read(p []byte) (int, error) {
52 if int(b) < len(p) {
53 p = p[:b]
54 }
55 for i := byte(0); i < byte(len(p)); i++ {
56 p[i] = i
57 }
58 return len(p), nil
59 }
60
61 func TestLimitedBufferReadFrom(t *testing.T) {
62 l := make(LimitedBuffer, 0, 30)
63 n, err := l.ReadFrom(byteReader(1))
64 if n != 30 {
65 t.Errorf("expecting to read 30 bytes, read %d", n)
66 } else if err != nil {
67 t.Errorf("go unexpected error: %s", err)
68 } else if !bytes.Equal(l, bytes.Repeat([]byte{0}, 30)) {
69 t.Errorf("expecting 30 0's, got %v", l)
70 }
71
72 l = l[:0]
73 n, err = l.ReadFrom(byteReader(2))
74 if n != 30 {
75 t.Errorf("expecting to read 30 bytes, read %d", n)
76 } else if err != nil {
77 t.Errorf("go unexpected error: %s", err)
78 } else if !bytes.Equal(l, bytes.Repeat([]byte{0, 1}, 15)) {
79 t.Errorf("expecting 15 [0, 1]'s, got %v", l)
80 }
81
82 l = l[:0]
83 n, err = l.ReadFrom(byteReader(3))
84 if n != 30 {
85 t.Errorf("expecting to read 30 bytes, read %d", n)
86 } else if err != nil {
87 t.Errorf("go unexpected error: %s", err)
88 } else if !bytes.Equal(l, bytes.Repeat([]byte{0, 1, 2}, 10)) {
89 t.Errorf("expecting 10 [0, 1, 2]'s, got %v", l)
90 }
91
92 l = l[:0]
93 n, err = l.ReadFrom(io.LimitReader(byteReader(4), 20))
94 if n != 20 {
95 t.Errorf("expecting to read 20 bytes, read %d", n)
96 } else if err != nil {
97 t.Errorf("go unexpected error: %s", err)
98 } else if !bytes.Equal(l, bytes.Repeat([]byte{0, 1, 2, 3}, 5)) {
99 t.Errorf("expecting 5 [0, 1, 2, 3]'s, got %v", l)
100 }
101 }
102