1
"""Unit tests for memory-based file-like objects.
2
StringIO -- for unicode strings
6
from __future__ import unicode_literals
9
from test import test_support
17
has_c_implementation = True
19
has_c_implementation = False
22
class MemoryTestMixin:
24
def write_ops(self, f, t):
25
self.assertEqual(f.write(t("blah.")), 5)
26
self.assertEqual(f.seek(0), 0)
27
self.assertEqual(f.write(t("Hello.")), 6)
28
self.assertEqual(f.tell(), 6)
29
self.assertEqual(f.seek(5), 5)
30
self.assertEqual(f.tell(), 5)
31
self.assertEqual(f.write(t(" world\n\n\n")), 9)
32
self.assertEqual(f.seek(0), 0)
33
self.assertEqual(f.write(t("h")), 1)
34
self.assertEqual(f.truncate(12), 12)
35
self.assertEqual(f.tell(), 12)
38
buf = self.buftype("hello world\n")
39
memio = self.ioclass(buf)
41
self.write_ops(memio, self.buftype)
42
self.assertEqual(memio.getvalue(), buf)
43
memio = self.ioclass()
44
self.write_ops(memio, self.buftype)
45
self.assertEqual(memio.getvalue(), buf)
46
self.assertRaises(TypeError, memio.write, None)
48
self.assertRaises(ValueError, memio.write, self.buftype(""))
50
def test_writelines(self):
51
buf = self.buftype("1234567890")
52
memio = self.ioclass()
54
self.assertEqual(memio.writelines([buf] * 100), None)
55
self.assertEqual(memio.getvalue(), buf * 100)
57
self.assertEqual(memio.getvalue(), buf * 100)
58
memio = self.ioclass()
59
self.assertRaises(TypeError, memio.writelines, [buf] + [1])
60
self.assertEqual(memio.getvalue(), buf)
61
self.assertRaises(TypeError, memio.writelines, None)
63
self.assertRaises(ValueError, memio.writelines, [])
65
def test_writelines_error(self):
66
memio = self.ioclass()
68
yield self.buftype('spam')
69
raise KeyboardInterrupt
71
self.assertRaises(KeyboardInterrupt, memio.writelines, error_gen())
73
def test_truncate(self):
74
buf = self.buftype("1234567890")
75
memio = self.ioclass(buf)
77
self.assertRaises(ValueError, memio.truncate, -1)
79
self.assertEqual(memio.truncate(), 6)
80
self.assertEqual(memio.getvalue(), buf[:6])
81
self.assertEqual(memio.truncate(4), 4)
82
self.assertEqual(memio.getvalue(), buf[:4])
83
self.assertEqual(memio.tell(), 4)
85
self.assertEqual(memio.getvalue(), buf[:4] + buf)
87
self.assertEqual(memio.truncate(None), pos)
88
self.assertEqual(memio.tell(), pos)
89
self.assertRaises(TypeError, memio.truncate, '0')
91
self.assertRaises(ValueError, memio.truncate, 0)
94
buf = self.buftype("1234567890")
95
memio = self.ioclass(buf)
96
self.assertEqual(memio.getvalue(), buf)
97
memio = self.ioclass(None)
98
self.assertEqual(memio.getvalue(), self.EOF)
99
memio.__init__(buf * 2)
100
self.assertEqual(memio.getvalue(), buf * 2)
102
self.assertEqual(memio.getvalue(), buf)
105
buf = self.buftype("1234567890")
106
memio = self.ioclass(buf)
108
self.assertEqual(memio.read(0), self.EOF)
109
self.assertEqual(memio.read(1), buf[:1])
110
self.assertEqual(memio.read(4), buf[1:5])
111
self.assertEqual(memio.read(900), buf[5:])
112
self.assertEqual(memio.read(), self.EOF)
114
self.assertEqual(memio.read(), buf)
115
self.assertEqual(memio.read(), self.EOF)
116
self.assertEqual(memio.tell(), 10)
118
self.assertEqual(memio.read(-1), buf)
120
self.assertEqual(type(memio.read()), type(buf))
122
self.assertEqual(type(memio.read()), type(buf))
124
self.assertEqual(memio.read(None), buf)
125
self.assertRaises(TypeError, memio.read, '')
127
self.assertRaises(ValueError, memio.read)
129
def test_readline(self):
130
buf = self.buftype("1234567890\n")
131
memio = self.ioclass(buf * 2)
133
self.assertEqual(memio.readline(0), self.EOF)
134
self.assertEqual(memio.readline(), buf)
135
self.assertEqual(memio.readline(), buf)
136
self.assertEqual(memio.readline(), self.EOF)
138
self.assertEqual(memio.readline(5), buf[:5])
139
self.assertEqual(memio.readline(5), buf[5:10])
140
self.assertEqual(memio.readline(5), buf[10:15])
142
self.assertEqual(memio.readline(-1), buf)
144
self.assertEqual(memio.readline(0), self.EOF)
146
buf = self.buftype("1234567890\n")
147
memio = self.ioclass((buf * 3)[:-1])
148
self.assertEqual(memio.readline(), buf)
149
self.assertEqual(memio.readline(), buf)
150
self.assertEqual(memio.readline(), buf[:-1])
151
self.assertEqual(memio.readline(), self.EOF)
153
self.assertEqual(type(memio.readline()), type(buf))
154
self.assertEqual(memio.readline(None), buf)
155
self.assertRaises(TypeError, memio.readline, '')
157
self.assertRaises(ValueError, memio.readline)
159
def test_readlines(self):
160
buf = self.buftype("1234567890\n")
161
memio = self.ioclass(buf * 10)
163
self.assertEqual(memio.readlines(), [buf] * 10)
165
self.assertEqual(memio.readlines(), [buf[5:]] + [buf] * 9)
167
self.assertEqual(memio.readlines(15), [buf] * 2)
169
self.assertEqual(memio.readlines(-1), [buf] * 10)
171
self.assertEqual(memio.readlines(0), [buf] * 10)
173
self.assertEqual(type(memio.readlines()[0]), type(buf))
175
self.assertEqual(memio.readlines(None), [buf] * 10)
176
self.assertRaises(TypeError, memio.readlines, '')
178
self.assertRaises(ValueError, memio.readlines)
180
def test_iterator(self):
181
buf = self.buftype("1234567890\n")
182
memio = self.ioclass(buf * 10)
184
self.assertEqual(iter(memio), memio)
185
self.failUnless(hasattr(memio, '__iter__'))
186
self.failUnless(hasattr(memio, 'next'))
189
self.assertEqual(line, buf)
191
self.assertEqual(i, 10)
195
self.assertEqual(line, buf)
197
self.assertEqual(i, 10)
198
memio = self.ioclass(buf * 2)
200
self.assertRaises(ValueError, memio.next)
202
def test_getvalue(self):
203
buf = self.buftype("1234567890")
204
memio = self.ioclass(buf)
206
self.assertEqual(memio.getvalue(), buf)
208
self.assertEqual(memio.getvalue(), buf)
209
self.assertEqual(type(memio.getvalue()), type(buf))
210
memio = self.ioclass(buf * 1000)
211
self.assertEqual(memio.getvalue()[-3:], self.buftype("890"))
212
memio = self.ioclass(buf)
214
self.assertRaises(ValueError, memio.getvalue)
217
buf = self.buftype("1234567890")
218
memio = self.ioclass(buf)
221
self.assertRaises(ValueError, memio.seek, -1)
222
self.assertRaises(ValueError, memio.seek, 1, -1)
223
self.assertRaises(ValueError, memio.seek, 1, 3)
224
self.assertEqual(memio.seek(0), 0)
225
self.assertEqual(memio.seek(0, 0), 0)
226
self.assertEqual(memio.read(), buf)
227
self.assertEqual(memio.seek(3), 3)
228
self.assertEqual(memio.seek(0, 1), 3)
229
self.assertEqual(memio.read(), buf[3:])
230
self.assertEqual(memio.seek(len(buf)), len(buf))
231
self.assertEqual(memio.read(), self.EOF)
232
memio.seek(len(buf) + 1)
233
self.assertEqual(memio.read(), self.EOF)
234
self.assertEqual(memio.seek(0, 2), len(buf))
235
self.assertEqual(memio.read(), self.EOF)
237
self.assertRaises(ValueError, memio.seek, 0)
239
def test_overseek(self):
240
buf = self.buftype("1234567890")
241
memio = self.ioclass(buf)
243
self.assertEqual(memio.seek(len(buf) + 1), 11)
244
self.assertEqual(memio.read(), self.EOF)
245
self.assertEqual(memio.tell(), 11)
246
self.assertEqual(memio.getvalue(), buf)
247
memio.write(self.EOF)
248
self.assertEqual(memio.getvalue(), buf)
250
self.assertEqual(memio.getvalue(), buf + self.buftype('\0') + buf)
253
buf = self.buftype("1234567890")
254
memio = self.ioclass(buf)
256
self.assertEqual(memio.tell(), 0)
258
self.assertEqual(memio.tell(), 5)
260
self.assertEqual(memio.tell(), 10000)
262
self.assertRaises(ValueError, memio.tell)
264
def test_flush(self):
265
buf = self.buftype("1234567890")
266
memio = self.ioclass(buf)
268
self.assertEqual(memio.flush(), None)
270
def test_flags(self):
271
memio = self.ioclass()
273
self.assertEqual(memio.writable(), True)
274
self.assertEqual(memio.readable(), True)
275
self.assertEqual(memio.seekable(), True)
276
self.assertEqual(memio.isatty(), False)
277
self.assertEqual(memio.closed, False)
279
self.assertEqual(memio.writable(), True)
280
self.assertEqual(memio.readable(), True)
281
self.assertEqual(memio.seekable(), True)
282
self.assertRaises(ValueError, memio.isatty)
283
self.assertEqual(memio.closed, True)
285
def test_subclassing(self):
286
buf = self.buftype("1234567890")
288
class MemIO(self.ioclass):
293
class MemIO(self.ioclass):
294
def __init__(me, a, b):
295
self.ioclass.__init__(me, a)
298
self.assertEqual(test1(), buf)
299
self.assertEqual(test2(), buf)
302
class PyBytesIOTest(MemoryTestMixin, unittest.TestCase):
305
return s.encode("ascii")
306
ioclass = io._BytesIO
309
def test_read1(self):
310
buf = self.buftype("1234567890")
311
memio = self.ioclass(buf)
313
self.assertRaises(TypeError, memio.read1)
314
self.assertEqual(memio.read(), buf)
316
def test_readinto(self):
317
buf = self.buftype("1234567890")
318
memio = self.ioclass(buf)
320
b = bytearray(b"hello")
321
self.assertEqual(memio.readinto(b), 5)
322
self.assertEqual(b, b"12345")
323
self.assertEqual(memio.readinto(b), 5)
324
self.assertEqual(b, b"67890")
325
self.assertEqual(memio.readinto(b), 0)
326
self.assertEqual(b, b"67890")
327
b = bytearray(b"hello world")
329
self.assertEqual(memio.readinto(b), 10)
330
self.assertEqual(b, b"1234567890d")
333
self.assertEqual(memio.readinto(b), 0)
334
self.assertEqual(b, b"")
335
self.assertRaises(TypeError, memio.readinto, '')
336
a = array.array(b'b', map(ord, b"hello world"))
337
memio = self.ioclass(buf)
339
self.assertEqual(a.tostring(), b"1234567890d")
341
self.assertRaises(ValueError, memio.readinto, b)
343
def test_relative_seek(self):
344
buf = self.buftype("1234567890")
345
memio = self.ioclass(buf)
347
self.assertEqual(memio.seek(-1, 1), 0)
348
self.assertEqual(memio.seek(3, 1), 3)
349
self.assertEqual(memio.seek(-4, 1), 0)
350
self.assertEqual(memio.seek(-1, 2), 9)
351
self.assertEqual(memio.seek(1, 1), 10)
352
self.assertEqual(memio.seek(1, 2), 11)
354
self.assertEqual(memio.read(), buf[-3:])
357
self.assertEqual(memio.read(), buf[1:])
359
def test_unicode(self):
360
memio = self.ioclass()
362
self.assertRaises(TypeError, self.ioclass, "1234567890")
363
self.assertRaises(TypeError, memio.write, "1234567890")
364
self.assertRaises(TypeError, memio.writelines, ["1234567890"])
366
def test_bytes_array(self):
369
a = array.array(b'b', map(ord, buf))
370
memio = self.ioclass(a)
371
self.assertEqual(memio.getvalue(), buf)
372
self.assertEqual(memio.write(a), 10)
373
self.assertEqual(memio.getvalue(), buf)
376
class PyStringIOTest(MemoryTestMixin, unittest.TestCase):
378
ioclass = io.StringIO
381
def test_relative_seek(self):
382
memio = self.ioclass()
384
self.assertRaises(IOError, memio.seek, -1, 1)
385
self.assertRaises(IOError, memio.seek, 3, 1)
386
self.assertRaises(IOError, memio.seek, -3, 1)
387
self.assertRaises(IOError, memio.seek, -1, 2)
388
self.assertRaises(IOError, memio.seek, 1, 1)
389
self.assertRaises(IOError, memio.seek, 1, 2)
391
# XXX: For the Python version of io.StringIO, this is highly
392
# dependent on the encoding used for the underlying buffer.
393
# def test_widechar(self):
394
# buf = self.buftype("\U0002030a\U00020347")
395
# memio = self.ioclass(buf)
397
# self.assertEqual(memio.getvalue(), buf)
398
# self.assertEqual(memio.write(buf), len(buf))
399
# self.assertEqual(memio.tell(), len(buf))
400
# self.assertEqual(memio.getvalue(), buf)
401
# self.assertEqual(memio.write(buf), len(buf))
402
# self.assertEqual(memio.tell(), len(buf) * 2)
403
# self.assertEqual(memio.getvalue(), buf + buf)
405
if has_c_implementation:
406
class CBytesIOTest(PyBytesIOTest):
410
tests = [PyBytesIOTest, PyStringIOTest]
411
if has_c_implementation:
412
tests.extend([CBytesIOTest])
413
test_support.run_unittest(*tests)
415
if __name__ == '__main__':