memio - memio_test.go
1 package memio
2
3 import (
4 "io"
5 "testing"
6 )
7
8 var (
9 _ io.Reader = new(ReadMem)
10 _ io.Closer = new(ReadMem)
11 _ io.Seeker = new(ReadMem)
12 _ io.WriterTo = new(ReadMem)
13 _ io.ByteReader = new(ReadMem)
14 _ io.ReaderAt = new(ReadMem)
15
16 _ io.Writer = new(WriteMem)
17 _ io.Closer = new(WriteMem)
18 _ io.Seeker = new(WriteMem)
19 _ io.ReaderFrom = new(WriteMem)
20 _ io.ByteWriter = new(WriteMem)
21 _ io.WriterAt = new(WriteMem)
22 )
23
24 func TestRead(t *testing.T) {
25 data := []byte("Hello, World!")
26 reader := Open(data)
27 toRead := make([]byte, 5)
28 if n, err := reader.Read(toRead); n != 5 {
29 t.Errorf("expecting to read 5 bytes, read %d", n)
30 return
31 } else if err != nil {
32 t.Errorf("got error: %q", err.Error())
33 return
34 } else if string(toRead) != "Hello" {
35 t.Errorf("expecting %q, got %q", "Hello", string(toRead))
36 return
37 }
38 if n, err := reader.Read(toRead); n != 5 {
39 t.Errorf("expecting to read 5 bytes, read %d", n)
40 return
41 } else if err != nil {
42 t.Errorf("got error: %q", err.Error())
43 return
44 } else if string(toRead) != ", Wor" {
45 t.Errorf("expecting %q, got %q", ", Wor", string(toRead))
46 return
47 }
48 if n, err := reader.Read(toRead); n != 3 {
49 t.Errorf("expecting to read 3 bytes, read %d", n)
50 return
51 } else if err != nil {
52 t.Errorf("got error: %q", err.Error())
53 return
54 } else if string(toRead) != "ld!or" {
55 t.Errorf("expecting %q, got %q", "ld!or", string(toRead))
56 return
57 }
58 if n, err := reader.Read(toRead); n != 0 {
59 t.Errorf("expecting to read 0 bytes, read %d", n)
60 return
61 } else if err != io.EOF {
62 t.Errorf("expecting EOF")
63 }
64 if pos, err := reader.Seek(2, 0); pos != 2 {
65 t.Errorf("expected to be at position 2, got %d", pos)
66 return
67 } else if err != nil {
68 t.Errorf("got error: %q", err.Error())
69 return
70 } else if n, err := reader.Read(toRead); n != 5 {
71 t.Errorf("expecting to read 5 bytes, read %d", n)
72 return
73 } else if err != nil {
74 t.Errorf("got error: %q", err.Error())
75 return
76 } else if string(toRead) != "llo, " {
77 t.Errorf("expecting %q, got %q", "llo, ", string(toRead))
78 return
79 }
80 if pos, err := reader.Seek(2, 1); pos != 9 {
81 t.Errorf("expected to be at position 9, got %d", pos)
82 return
83 } else if err != nil {
84 t.Errorf("got error: %q", err.Error())
85 return
86 } else if n, err := reader.Read(toRead); n != 4 {
87 t.Errorf("expecting to read 4 bytes, read %d", n)
88 return
89 } else if err != nil {
90 t.Errorf("got error: %q", err.Error())
91 return
92 } else if string(toRead) != "rld! " {
93 t.Errorf("expecting %q, got %q", "rld! ", string(toRead))
94 return
95 }
96 if pos, err := reader.Seek(-6, 2); pos != 7 {
97 t.Errorf("expected to be at position 7, got %d", pos)
98 return
99 } else if err != nil {
100 t.Errorf("got error: %q", err.Error())
101 return
102 } else if n, err := reader.Read(toRead); n != 5 {
103 t.Errorf("expecting to read 5 bytes, read %d", n)
104 return
105 } else if err != nil {
106 t.Errorf("got error: %q", err.Error())
107 return
108 } else if string(toRead) != "World" {
109 t.Errorf("expecting %q, got %q", "World", string(toRead))
110 return
111 }
112 if _, err := reader.Seek(1, 0); err != nil {
113 t.Errorf("got error: %q", err.Error())
114 return
115 }
116 reader.Close()
117 }
118
119 func TestWrite(t *testing.T) {
120 data := []byte("Beep")
121 writer := Create(&data)
122 if n, err := writer.Write([]byte("J")); n != 1 {
123 t.Errorf("expecting to write 1 byte, wrote %d", n)
124 return
125 } else if err != nil {
126 t.Errorf("got error: %q", err.Error())
127 return
128 } else if string(data) != "Jeep" {
129 t.Errorf("expecting %q, got %q", "Jeep", string(data))
130 return
131 }
132 if n, err := writer.Write([]byte("ohn")); n != 3 {
133 t.Errorf("expecting to write 3 bytes, wrote %d", n)
134 return
135 } else if err != nil {
136 t.Errorf("got error: %q", err.Error())
137 return
138 } else if string(data) != "John" {
139 t.Errorf("expecting %q, got %q", "John", string(data))
140 return
141 }
142 if n, err := writer.Write([]byte("ny")); n != 2 {
143 t.Errorf("expecting to write 2 bytes, wrote %d", n)
144 return
145 } else if err != nil {
146 t.Errorf("got error: %q", err.Error())
147 return
148 } else if string(data) != "Johnny" {
149 t.Errorf("expecting %q, got %q", "Johnny", string(data))
150 return
151 }
152 if pos, err := writer.Seek(0, 0); pos != 0 {
153 t.Errorf("expected to be at position 0, got %d", pos)
154 } else if err != nil {
155 t.Errorf("got error: %q", err.Error())
156 return
157 } else if n, err := writer.Write([]byte("Edmund")); n != 6 {
158 t.Errorf("expecting to write 6 bytes, wrote %d", n)
159 return
160 } else if err != nil {
161 t.Errorf("got error: %q", err.Error())
162 return
163 } else if string(data) != "Edmund" {
164 t.Errorf("expecting %q, got %q", "Edmund", string(data))
165 return
166 }
167 if pos, err := writer.Seek(-4, 2); pos != 2 {
168 t.Errorf("expected to be at position 0, got %d", pos)
169 } else if err != nil {
170 t.Errorf("got error: %q", err.Error())
171 return
172 } else if n, err := writer.Write([]byte("war")); n != 3 {
173 t.Errorf("expecting to write 3 bytes, wrote %d", n)
174 return
175 } else if err != nil {
176 t.Errorf("got error: %q", err.Error())
177 return
178 } else if string(data) != "Edward" {
179 t.Errorf("expecting %q, got %q", "Edward", string(data))
180 return
181 }
182 if pos, err := writer.Seek(1, 1); pos != 6 {
183 t.Errorf("expected to be at position 6, got %d", pos)
184 } else if err != nil {
185 t.Errorf("got error: %q", err.Error())
186 return
187 } else if n, err := writer.Write([]byte("o")); n != 1 {
188 t.Errorf("expecting to write 1 bytes, wrote %d", n)
189 return
190 } else if err != nil {
191 t.Errorf("got error: %q", err.Error())
192 return
193 } else if string(data) != "Edwardo" {
194 t.Errorf("expecting %q, got %q", "Edwardo", string(data))
195 return
196 }
197 writer.Close()
198 _, err := writer.Seek(0, 0)
199 if err != ErrClosed {
200 t.Errorf("expecting close error")
201 return
202 }
203 _, err = writer.Write([]byte("Beep"))
204 if err != ErrClosed {
205 t.Errorf("expecting close error")
206 return
207 }
208 }
209
210 func TestNewWrite(t *testing.T) {
211 var data []byte
212 writer := Create(&data)
213 if n, err := writer.Write([]byte("Hello")); err != nil {
214 t.Errorf("got error: %q", err.Error())
215 } else if n != 5 {
216 t.Errorf("expecting to write 5 bytes, wrote %d", n)
217 } else if len(data) != 5 {
218 t.Errorf("expecting buf to have 5 bytes, has %d", n)
219 } else if string(data) != "Hello" {
220 t.Errorf("expecting %q, got %q", "Hello", string(data))
221 }
222 if n, err := writer.Write([]byte("World")); err != nil {
223 t.Errorf("got error: %q", err.Error())
224 } else if n != 5 {
225 t.Errorf("expecting to write 5 bytes, wrote %d", n)
226 } else if len(data) != 10 {
227 t.Errorf("expecting buf to have 5 bytes, has %d", n)
228 } else if string(data) != "HelloWorld" {
229 t.Errorf("expecting %q, got %q", "Hello", string(data))
230 }
231 }
232
233 func TestReadFrom(t *testing.T) {
234 const data = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
235 toRead := make([]byte, 0, 2480)
236 for i := 0; i < 40; i++ {
237 toRead = append(toRead, data...)
238 }
239 reader := Open(toRead)
240 var toWrite []byte
241 writer := Create(&toWrite)
242 if n, err := writer.ReadFrom(reader); err != nil {
243 t.Errorf("got error: %q", err.Error())
244 } else if n != 2480 {
245 t.Errorf("expecting to write 2480 bytes, wrote %d", n)
246 } else if string(toRead) != string(toWrite) {
247 t.Errorf("expecting %q, got %q", string(toRead), string(toWrite))
248 }
249 }
250
251 func TestTruncate(t *testing.T) {
252 data := make([]byte, 100)
253 for i := byte(0); i < 100; i++ {
254 data[i] = i % 10
255 }
256 w := Create(&data)
257 w.Truncate(75)
258 if len(data) != 75 {
259 t.Errorf("expecting length 75, got %d", len(data))
260 return
261 }
262 w.Truncate(90)
263 if len(data) != 90 {
264 t.Errorf("expecting length 90, got %d", len(data))
265 return
266 }
267 for i := byte(0); i < 75; i++ {
268 if data[i] != i%10 {
269 t.Errorf("at position %d, expecting value of %d, got %d", i, i%10, data[i])
270 return
271 }
272 }
273 for i := byte(75); i < 90; i++ {
274 if data[i] != 0 {
275 t.Errorf("at position %d, expecting value of 0, got %d", i, data[i])
276 return
277 }
278 }
279 w.Truncate(100)
280 if len(data) != 100 {
281 t.Errorf("expecting length 100, got %d", len(data))
282 return
283 }
284 for i := byte(90); i < 100; i++ {
285 if data[i] != 0 {
286 t.Errorf("at position %d, expecting value of 0, got %d", i, data[i])
287 return
288 }
289 }
290 }