]>
git.proxmox.com Git - mirror_edk2.git/blob - AppPkg/Applications/Python/Python-2.7.2/Lib/test/test_memoryio.py
1 """Unit tests for memory-based file-like objects.
2 StringIO -- for unicode strings
6 from __future__
import unicode_literals
7 from __future__
import print_function
10 from test
import test_support
as support
16 class MemorySeekTestMixin
:
19 buf
= self
.buftype("1234567890")
20 bytesIo
= self
.ioclass(buf
)
23 buf
= self
.buftype("1234567890")
24 bytesIo
= self
.ioclass(buf
)
26 self
.assertEqual(buf
[:1], bytesIo
.read(1))
27 self
.assertEqual(buf
[1:5], bytesIo
.read(4))
28 self
.assertEqual(buf
[5:], bytesIo
.read(900))
29 self
.assertEqual(self
.EOF
, bytesIo
.read())
31 def testReadNoArgs(self
):
32 buf
= self
.buftype("1234567890")
33 bytesIo
= self
.ioclass(buf
)
35 self
.assertEqual(buf
, bytesIo
.read())
36 self
.assertEqual(self
.EOF
, bytesIo
.read())
39 buf
= self
.buftype("1234567890")
40 bytesIo
= self
.ioclass(buf
)
44 self
.assertEqual(buf
, bytesIo
.read())
47 self
.assertEqual(buf
[3:], bytesIo
.read())
48 self
.assertRaises(TypeError, bytesIo
.seek
, 0.0)
51 buf
= self
.buftype("1234567890")
52 bytesIo
= self
.ioclass(buf
)
54 self
.assertEqual(0, bytesIo
.tell())
56 self
.assertEqual(5, bytesIo
.tell())
58 self
.assertEqual(10000, bytesIo
.tell())
61 class MemoryTestMixin
:
63 def test_detach(self
):
65 self
.assertRaises(self
.UnsupportedOperation
, buf
.detach
)
67 def write_ops(self
, f
, t
):
68 self
.assertEqual(f
.write(t("blah.")), 5)
69 self
.assertEqual(f
.seek(0), 0)
70 self
.assertEqual(f
.write(t("Hello.")), 6)
71 self
.assertEqual(f
.tell(), 6)
72 self
.assertEqual(f
.seek(5), 5)
73 self
.assertEqual(f
.tell(), 5)
74 self
.assertEqual(f
.write(t(" world\n\n\n")), 9)
75 self
.assertEqual(f
.seek(0), 0)
76 self
.assertEqual(f
.write(t("h")), 1)
77 self
.assertEqual(f
.truncate(12), 12)
78 self
.assertEqual(f
.tell(), 1)
81 buf
= self
.buftype("hello world\n")
82 memio
= self
.ioclass(buf
)
84 self
.write_ops(memio
, self
.buftype
)
85 self
.assertEqual(memio
.getvalue(), buf
)
86 memio
= self
.ioclass()
87 self
.write_ops(memio
, self
.buftype
)
88 self
.assertEqual(memio
.getvalue(), buf
)
89 self
.assertRaises(TypeError, memio
.write
, None)
91 self
.assertRaises(ValueError, memio
.write
, self
.buftype(""))
93 def test_writelines(self
):
94 buf
= self
.buftype("1234567890")
95 memio
= self
.ioclass()
97 self
.assertEqual(memio
.writelines([buf
] * 100), None)
98 self
.assertEqual(memio
.getvalue(), buf
* 100)
100 self
.assertEqual(memio
.getvalue(), buf
* 100)
101 memio
= self
.ioclass()
102 self
.assertRaises(TypeError, memio
.writelines
, [buf
] + [1])
103 self
.assertEqual(memio
.getvalue(), buf
)
104 self
.assertRaises(TypeError, memio
.writelines
, None)
106 self
.assertRaises(ValueError, memio
.writelines
, [])
108 def test_writelines_error(self
):
109 memio
= self
.ioclass()
111 yield self
.buftype('spam')
112 raise KeyboardInterrupt
114 self
.assertRaises(KeyboardInterrupt, memio
.writelines
, error_gen())
116 def test_truncate(self
):
117 buf
= self
.buftype("1234567890")
118 memio
= self
.ioclass(buf
)
120 self
.assertRaises(ValueError, memio
.truncate
, -1)
122 self
.assertEqual(memio
.truncate(), 6)
123 self
.assertEqual(memio
.getvalue(), buf
[:6])
124 self
.assertEqual(memio
.truncate(4), 4)
125 self
.assertEqual(memio
.getvalue(), buf
[:4])
126 # truncate() accepts long objects
127 self
.assertEqual(memio
.truncate(4L), 4)
128 self
.assertEqual(memio
.getvalue(), buf
[:4])
129 self
.assertEqual(memio
.tell(), 6)
132 self
.assertEqual(memio
.getvalue(), buf
[:4] + buf
)
134 self
.assertEqual(memio
.truncate(None), pos
)
135 self
.assertEqual(memio
.tell(), pos
)
136 self
.assertRaises(TypeError, memio
.truncate
, '0')
138 self
.assertRaises(ValueError, memio
.truncate
, 0)
141 buf
= self
.buftype("1234567890")
142 memio
= self
.ioclass(buf
)
143 self
.assertEqual(memio
.getvalue(), buf
)
144 memio
= self
.ioclass(None)
145 self
.assertEqual(memio
.getvalue(), self
.EOF
)
146 memio
.__init
__(buf
* 2)
147 self
.assertEqual(memio
.getvalue(), buf
* 2)
149 self
.assertEqual(memio
.getvalue(), buf
)
152 buf
= self
.buftype("1234567890")
153 memio
= self
.ioclass(buf
)
155 self
.assertEqual(memio
.read(0), self
.EOF
)
156 self
.assertEqual(memio
.read(1), buf
[:1])
157 # read() accepts long objects
158 self
.assertEqual(memio
.read(4L), buf
[1:5])
159 self
.assertEqual(memio
.read(900), buf
[5:])
160 self
.assertEqual(memio
.read(), self
.EOF
)
162 self
.assertEqual(memio
.read(), buf
)
163 self
.assertEqual(memio
.read(), self
.EOF
)
164 self
.assertEqual(memio
.tell(), 10)
166 self
.assertEqual(memio
.read(-1), buf
)
168 self
.assertEqual(type(memio
.read()), type(buf
))
170 self
.assertEqual(type(memio
.read()), type(buf
))
172 self
.assertEqual(memio
.read(None), buf
)
173 self
.assertRaises(TypeError, memio
.read
, '')
175 self
.assertRaises(ValueError, memio
.read
)
177 def test_readline(self
):
178 buf
= self
.buftype("1234567890\n")
179 memio
= self
.ioclass(buf
* 2)
181 self
.assertEqual(memio
.readline(0), self
.EOF
)
182 self
.assertEqual(memio
.readline(), buf
)
183 self
.assertEqual(memio
.readline(), buf
)
184 self
.assertEqual(memio
.readline(), self
.EOF
)
186 self
.assertEqual(memio
.readline(5), buf
[:5])
187 # readline() accepts long objects
188 self
.assertEqual(memio
.readline(5L), buf
[5:10])
189 self
.assertEqual(memio
.readline(5), buf
[10:15])
191 self
.assertEqual(memio
.readline(-1), buf
)
193 self
.assertEqual(memio
.readline(0), self
.EOF
)
195 buf
= self
.buftype("1234567890\n")
196 memio
= self
.ioclass((buf
* 3)[:-1])
197 self
.assertEqual(memio
.readline(), buf
)
198 self
.assertEqual(memio
.readline(), buf
)
199 self
.assertEqual(memio
.readline(), buf
[:-1])
200 self
.assertEqual(memio
.readline(), self
.EOF
)
202 self
.assertEqual(type(memio
.readline()), type(buf
))
203 self
.assertEqual(memio
.readline(), buf
)
204 self
.assertRaises(TypeError, memio
.readline
, '')
206 self
.assertRaises(ValueError, memio
.readline
)
208 def test_readlines(self
):
209 buf
= self
.buftype("1234567890\n")
210 memio
= self
.ioclass(buf
* 10)
212 self
.assertEqual(memio
.readlines(), [buf
] * 10)
214 self
.assertEqual(memio
.readlines(), [buf
[5:]] + [buf
] * 9)
216 # readlines() accepts long objects
217 self
.assertEqual(memio
.readlines(15L), [buf
] * 2)
219 self
.assertEqual(memio
.readlines(-1), [buf
] * 10)
221 self
.assertEqual(memio
.readlines(0), [buf
] * 10)
223 self
.assertEqual(type(memio
.readlines()[0]), type(buf
))
225 self
.assertEqual(memio
.readlines(None), [buf
] * 10)
226 self
.assertRaises(TypeError, memio
.readlines
, '')
228 self
.assertRaises(ValueError, memio
.readlines
)
230 def test_iterator(self
):
231 buf
= self
.buftype("1234567890\n")
232 memio
= self
.ioclass(buf
* 10)
234 self
.assertEqual(iter(memio
), memio
)
235 self
.assertTrue(hasattr(memio
, '__iter__'))
236 self
.assertTrue(hasattr(memio
, 'next'))
239 self
.assertEqual(line
, buf
)
241 self
.assertEqual(i
, 10)
245 self
.assertEqual(line
, buf
)
247 self
.assertEqual(i
, 10)
248 memio
= self
.ioclass(buf
* 2)
250 self
.assertRaises(ValueError, next
, memio
)
252 def test_getvalue(self
):
253 buf
= self
.buftype("1234567890")
254 memio
= self
.ioclass(buf
)
256 self
.assertEqual(memio
.getvalue(), buf
)
258 self
.assertEqual(memio
.getvalue(), buf
)
259 self
.assertEqual(type(memio
.getvalue()), type(buf
))
260 memio
= self
.ioclass(buf
* 1000)
261 self
.assertEqual(memio
.getvalue()[-3:], self
.buftype("890"))
262 memio
= self
.ioclass(buf
)
264 self
.assertRaises(ValueError, memio
.getvalue
)
267 buf
= self
.buftype("1234567890")
268 memio
= self
.ioclass(buf
)
271 self
.assertRaises(ValueError, memio
.seek
, -1)
272 self
.assertRaises(ValueError, memio
.seek
, 1, -1)
273 self
.assertRaises(ValueError, memio
.seek
, 1, 3)
274 self
.assertEqual(memio
.seek(0), 0)
275 self
.assertEqual(memio
.seek(0, 0), 0)
276 self
.assertEqual(memio
.read(), buf
)
277 self
.assertEqual(memio
.seek(3), 3)
278 # seek() accepts long objects
279 self
.assertEqual(memio
.seek(3L), 3)
280 self
.assertEqual(memio
.seek(0, 1), 3)
281 self
.assertEqual(memio
.read(), buf
[3:])
282 self
.assertEqual(memio
.seek(len(buf
)), len(buf
))
283 self
.assertEqual(memio
.read(), self
.EOF
)
284 memio
.seek(len(buf
) + 1)
285 self
.assertEqual(memio
.read(), self
.EOF
)
286 self
.assertEqual(memio
.seek(0, 2), len(buf
))
287 self
.assertEqual(memio
.read(), self
.EOF
)
289 self
.assertRaises(ValueError, memio
.seek
, 0)
291 def test_overseek(self
):
292 buf
= self
.buftype("1234567890")
293 memio
= self
.ioclass(buf
)
295 self
.assertEqual(memio
.seek(len(buf
) + 1), 11)
296 self
.assertEqual(memio
.read(), self
.EOF
)
297 self
.assertEqual(memio
.tell(), 11)
298 self
.assertEqual(memio
.getvalue(), buf
)
299 memio
.write(self
.EOF
)
300 self
.assertEqual(memio
.getvalue(), buf
)
302 self
.assertEqual(memio
.getvalue(), buf
+ self
.buftype('\0') + buf
)
305 buf
= self
.buftype("1234567890")
306 memio
= self
.ioclass(buf
)
308 self
.assertEqual(memio
.tell(), 0)
310 self
.assertEqual(memio
.tell(), 5)
312 self
.assertEqual(memio
.tell(), 10000)
314 self
.assertRaises(ValueError, memio
.tell
)
316 def test_flush(self
):
317 buf
= self
.buftype("1234567890")
318 memio
= self
.ioclass(buf
)
320 self
.assertEqual(memio
.flush(), None)
322 def test_flags(self
):
323 memio
= self
.ioclass()
325 self
.assertEqual(memio
.writable(), True)
326 self
.assertEqual(memio
.readable(), True)
327 self
.assertEqual(memio
.seekable(), True)
328 self
.assertEqual(memio
.isatty(), False)
329 self
.assertEqual(memio
.closed
, False)
331 self
.assertEqual(memio
.writable(), True)
332 self
.assertEqual(memio
.readable(), True)
333 self
.assertEqual(memio
.seekable(), True)
334 self
.assertRaises(ValueError, memio
.isatty
)
335 self
.assertEqual(memio
.closed
, True)
337 def test_subclassing(self
):
338 buf
= self
.buftype("1234567890")
340 class MemIO(self
.ioclass
):
345 class MemIO(self
.ioclass
):
346 def __init__(me
, a
, b
):
347 self
.ioclass
.__init
__(me
, a
)
350 self
.assertEqual(test1(), buf
)
351 self
.assertEqual(test2(), buf
)
353 def test_instance_dict_leak(self
):
354 # Test case for issue #6242.
355 # This will be caught by regrtest.py -R if this leak.
357 memio
= self
.ioclass()
360 def test_pickling(self
):
361 buf
= self
.buftype("1234567890")
362 memio
= self
.ioclass(buf
)
366 class PickleTestMemIO(self
.ioclass
):
367 def __init__(me
, initvalue
, foo
):
368 self
.ioclass
.__init
__(me
, initvalue
)
370 # __getnewargs__ is undefined on purpose. This checks that PEP 307
371 # is used to provide pickling support.
373 # Pickle expects the class to be on the module level. Here we use a
374 # little hack to allow the PickleTestMemIO class to derive from
375 # self.ioclass without having to define all combinations explicitly on
378 PickleTestMemIO
.__module
__ = '__main__'
379 __main__
.PickleTestMemIO
= PickleTestMemIO
380 submemio
= PickleTestMemIO(buf
, 80)
383 # We only support pickle protocol 2 and onward since we use extended
384 # __reduce__ API of PEP 307 to provide pickling support.
385 for proto
in range(2, pickle
.HIGHEST_PROTOCOL
):
386 for obj
in (memio
, submemio
):
387 obj2
= pickle
.loads(pickle
.dumps(obj
, protocol
=proto
))
388 self
.assertEqual(obj
.getvalue(), obj2
.getvalue())
389 self
.assertEqual(obj
.__class
__, obj2
.__class__
)
390 self
.assertEqual(obj
.foo
, obj2
.foo
)
391 self
.assertEqual(obj
.tell(), obj2
.tell())
393 self
.assertRaises(ValueError, pickle
.dumps
, obj
, proto
)
394 del __main__
.PickleTestMemIO
397 class PyBytesIOTest(MemoryTestMixin
, MemorySeekTestMixin
, unittest
.TestCase
):
399 UnsupportedOperation
= pyio
.UnsupportedOperation
403 return s
.encode("ascii")
404 ioclass
= pyio
.BytesIO
407 def test_read1(self
):
408 buf
= self
.buftype("1234567890")
409 memio
= self
.ioclass(buf
)
411 self
.assertRaises(TypeError, memio
.read1
)
412 self
.assertEqual(memio
.read(), buf
)
414 def test_readinto(self
):
415 buf
= self
.buftype("1234567890")
416 memio
= self
.ioclass(buf
)
418 b
= bytearray(b
"hello")
419 self
.assertEqual(memio
.readinto(b
), 5)
420 self
.assertEqual(b
, b
"12345")
421 self
.assertEqual(memio
.readinto(b
), 5)
422 self
.assertEqual(b
, b
"67890")
423 self
.assertEqual(memio
.readinto(b
), 0)
424 self
.assertEqual(b
, b
"67890")
425 b
= bytearray(b
"hello world")
427 self
.assertEqual(memio
.readinto(b
), 10)
428 self
.assertEqual(b
, b
"1234567890d")
431 self
.assertEqual(memio
.readinto(b
), 0)
432 self
.assertEqual(b
, b
"")
433 self
.assertRaises(TypeError, memio
.readinto
, '')
435 a
= array
.array(b
'b', b
"hello world")
436 memio
= self
.ioclass(buf
)
438 self
.assertEqual(a
.tostring(), b
"1234567890d")
440 self
.assertRaises(ValueError, memio
.readinto
, b
)
441 memio
= self
.ioclass(b
"123")
445 self
.assertEqual(b
, b
"")
447 def test_relative_seek(self
):
448 buf
= self
.buftype("1234567890")
449 memio
= self
.ioclass(buf
)
451 self
.assertEqual(memio
.seek(-1, 1), 0)
452 self
.assertEqual(memio
.seek(3, 1), 3)
453 self
.assertEqual(memio
.seek(-4, 1), 0)
454 self
.assertEqual(memio
.seek(-1, 2), 9)
455 self
.assertEqual(memio
.seek(1, 1), 10)
456 self
.assertEqual(memio
.seek(1, 2), 11)
458 self
.assertEqual(memio
.read(), buf
[-3:])
461 self
.assertEqual(memio
.read(), buf
[1:])
463 def test_unicode(self
):
464 memio
= self
.ioclass()
466 self
.assertRaises(TypeError, self
.ioclass
, "1234567890")
467 self
.assertRaises(TypeError, memio
.write
, "1234567890")
468 self
.assertRaises(TypeError, memio
.writelines
, ["1234567890"])
470 def test_bytes_array(self
):
473 a
= array
.array(b
'b', buf
)
474 memio
= self
.ioclass(a
)
475 self
.assertEqual(memio
.getvalue(), buf
)
476 self
.assertEqual(memio
.write(a
), 10)
477 self
.assertEqual(memio
.getvalue(), buf
)
479 def test_issue5449(self
):
480 buf
= self
.buftype("1234567890")
481 self
.ioclass(initial_bytes
=buf
)
482 self
.assertRaises(TypeError, self
.ioclass
, buf
, foo
=None)
485 class TextIOTestMixin
:
487 def test_newlines_property(self
):
488 memio
= self
.ioclass(newline
=None)
489 # The C StringIO decodes newlines in write() calls, but the Python
490 # implementation only does when reading. This function forces them to
491 # be decoded for testing.
495 self
.assertEqual(memio
.newlines
, None)
498 self
.assertEqual(memio
.newlines
, "\n")
501 self
.assertEqual(memio
.newlines
, ("\n", "\r\n"))
504 self
.assertEqual(memio
.newlines
, ("\r", "\n", "\r\n"))
506 def test_relative_seek(self
):
507 memio
= self
.ioclass()
509 self
.assertRaises(IOError, memio
.seek
, -1, 1)
510 self
.assertRaises(IOError, memio
.seek
, 3, 1)
511 self
.assertRaises(IOError, memio
.seek
, -3, 1)
512 self
.assertRaises(IOError, memio
.seek
, -1, 2)
513 self
.assertRaises(IOError, memio
.seek
, 1, 1)
514 self
.assertRaises(IOError, memio
.seek
, 1, 2)
516 def test_textio_properties(self
):
517 memio
= self
.ioclass()
519 # These are just dummy values but we nevertheless check them for fear
520 # of unexpected breakage.
521 self
.assertIsNone(memio
.encoding
)
522 self
.assertIsNone(memio
.errors
)
523 self
.assertFalse(memio
.line_buffering
)
525 def test_newline_none(self
):
527 memio
= self
.ioclass("a\nb\r\nc\rd", newline
=None)
528 self
.assertEqual(list(memio
), ["a\n", "b\n", "c\n", "d"])
530 self
.assertEqual(memio
.read(1), "a")
531 self
.assertEqual(memio
.read(2), "\nb")
532 self
.assertEqual(memio
.read(2), "\nc")
533 self
.assertEqual(memio
.read(1), "\n")
534 memio
= self
.ioclass(newline
=None)
535 self
.assertEqual(2, memio
.write("a\n"))
536 self
.assertEqual(3, memio
.write("b\r\n"))
537 self
.assertEqual(3, memio
.write("c\rd"))
539 self
.assertEqual(memio
.read(), "a\nb\nc\nd")
540 memio
= self
.ioclass("a\r\nb", newline
=None)
541 self
.assertEqual(memio
.read(3), "a\nb")
543 def test_newline_empty(self
):
545 memio
= self
.ioclass("a\nb\r\nc\rd", newline
="")
546 self
.assertEqual(list(memio
), ["a\n", "b\r\n", "c\r", "d"])
548 self
.assertEqual(memio
.read(4), "a\nb\r")
549 self
.assertEqual(memio
.read(2), "\nc")
550 self
.assertEqual(memio
.read(1), "\r")
551 memio
= self
.ioclass(newline
="")
552 self
.assertEqual(2, memio
.write("a\n"))
553 self
.assertEqual(2, memio
.write("b\r"))
554 self
.assertEqual(2, memio
.write("\nc"))
555 self
.assertEqual(2, memio
.write("\rd"))
557 self
.assertEqual(list(memio
), ["a\n", "b\r\n", "c\r", "d"])
559 def test_newline_lf(self
):
561 memio
= self
.ioclass("a\nb\r\nc\rd")
562 self
.assertEqual(list(memio
), ["a\n", "b\r\n", "c\rd"])
564 def test_newline_cr(self
):
566 memio
= self
.ioclass("a\nb\r\nc\rd", newline
="\r")
567 self
.assertEqual(memio
.read(), "a\rb\r\rc\rd")
569 self
.assertEqual(list(memio
), ["a\r", "b\r", "\r", "c\r", "d"])
571 def test_newline_crlf(self
):
573 memio
= self
.ioclass("a\nb\r\nc\rd", newline
="\r\n")
574 self
.assertEqual(memio
.read(), "a\r\nb\r\r\nc\rd")
576 self
.assertEqual(list(memio
), ["a\r\n", "b\r\r\n", "c\rd"])
578 def test_issue5265(self
):
579 # StringIO can duplicate newlines in universal newlines mode
580 memio
= self
.ioclass("a\r\nb\r\n", newline
=None)
581 self
.assertEqual(memio
.read(5), "a\nb\n")
584 class PyStringIOTest(MemoryTestMixin
, MemorySeekTestMixin
,
585 TextIOTestMixin
, unittest
.TestCase
):
587 ioclass
= pyio
.StringIO
588 UnsupportedOperation
= pyio
.UnsupportedOperation
592 class PyStringIOPickleTest(TextIOTestMixin
, unittest
.TestCase
):
593 """Test if pickle restores properly the internal state of StringIO.
596 UnsupportedOperation
= pyio
.UnsupportedOperation
599 class ioclass(pyio
.StringIO
):
600 def __new__(cls
, *args
, **kwargs
):
601 return pickle
.loads(pickle
.dumps(pyio
.StringIO(*args
, **kwargs
)))
602 def __init__(self
, *args
, **kwargs
):
606 class CBytesIOTest(PyBytesIOTest
):
608 UnsupportedOperation
= io
.UnsupportedOperation
610 test_bytes_array
= unittest
.skip(
611 "array.array() does not have the new buffer API"
612 )(PyBytesIOTest
.test_bytes_array
)
615 def test_getstate(self
):
616 memio
= self
.ioclass()
617 state
= memio
.__getstate
__()
618 self
.assertEqual(len(state
), 3)
619 bytearray(state
[0]) # Check if state[0] supports the buffer interface.
620 self
.assertIsInstance(state
[1], int)
621 self
.assertTrue(isinstance(state
[2], dict) or state
[2] is None)
623 self
.assertRaises(ValueError, memio
.__getstate
__)
625 def test_setstate(self
):
626 # This checks whether __setstate__ does proper input validation.
627 memio
= self
.ioclass()
628 memio
.__setstate
__((b
"no error", 0, None))
629 memio
.__setstate
__((bytearray(b
"no error"), 0, None))
630 memio
.__setstate
__((b
"no error", 0, {'spam': 3}))
631 self
.assertRaises(ValueError, memio
.__setstate
__, (b
"", -1, None))
632 self
.assertRaises(TypeError, memio
.__setstate
__, ("unicode", 0, None))
633 self
.assertRaises(TypeError, memio
.__setstate
__, (b
"", 0.0, None))
634 self
.assertRaises(TypeError, memio
.__setstate
__, (b
"", 0, 0))
635 self
.assertRaises(TypeError, memio
.__setstate
__, (b
"len-test", 0))
636 self
.assertRaises(TypeError, memio
.__setstate
__)
637 self
.assertRaises(TypeError, memio
.__setstate
__, 0)
639 self
.assertRaises(ValueError, memio
.__setstate
__, (b
"closed", 0, None))
642 class CStringIOTest(PyStringIOTest
):
643 ioclass
= io
.StringIO
644 UnsupportedOperation
= io
.UnsupportedOperation
646 # XXX: For the Python version of io.StringIO, this is highly
647 # dependent on the encoding used for the underlying buffer.
648 def test_widechar(self
):
649 buf
= self
.buftype("\U0002030a\U00020347")
650 memio
= self
.ioclass(buf
)
652 self
.assertEqual(memio
.getvalue(), buf
)
653 self
.assertEqual(memio
.write(buf
), len(buf
))
654 self
.assertEqual(memio
.tell(), len(buf
))
655 self
.assertEqual(memio
.getvalue(), buf
)
656 self
.assertEqual(memio
.write(buf
), len(buf
))
657 self
.assertEqual(memio
.tell(), len(buf
) * 2)
658 self
.assertEqual(memio
.getvalue(), buf
+ buf
)
660 def test_getstate(self
):
661 memio
= self
.ioclass()
662 state
= memio
.__getstate
__()
663 self
.assertEqual(len(state
), 4)
664 self
.assertIsInstance(state
[0], unicode)
665 self
.assertIsInstance(state
[1], str)
666 self
.assertIsInstance(state
[2], int)
667 self
.assertTrue(isinstance(state
[3], dict) or state
[3] is None)
669 self
.assertRaises(ValueError, memio
.__getstate
__)
671 def test_setstate(self
):
672 # This checks whether __setstate__ does proper input validation.
673 memio
= self
.ioclass()
674 memio
.__setstate
__(("no error", "\n", 0, None))
675 memio
.__setstate
__(("no error", "", 0, {'spam': 3}))
676 self
.assertRaises(ValueError, memio
.__setstate
__, ("", "f", 0, None))
677 self
.assertRaises(ValueError, memio
.__setstate
__, ("", "", -1, None))
678 self
.assertRaises(TypeError, memio
.__setstate
__, (b
"", "", 0, None))
679 # trunk is more tolerant than py3k on the type of the newline param
680 #self.assertRaises(TypeError, memio.__setstate__, ("", b"", 0, None))
681 self
.assertRaises(TypeError, memio
.__setstate
__, ("", "", 0.0, None))
682 self
.assertRaises(TypeError, memio
.__setstate
__, ("", "", 0, 0))
683 self
.assertRaises(TypeError, memio
.__setstate
__, ("len-test", 0))
684 self
.assertRaises(TypeError, memio
.__setstate
__)
685 self
.assertRaises(TypeError, memio
.__setstate
__, 0)
687 self
.assertRaises(ValueError, memio
.__setstate
__, ("closed", "", 0, None))
690 class CStringIOPickleTest(PyStringIOPickleTest
):
691 UnsupportedOperation
= io
.UnsupportedOperation
693 class ioclass(io
.StringIO
):
694 def __new__(cls
, *args
, **kwargs
):
695 return pickle
.loads(pickle
.dumps(io
.StringIO(*args
, **kwargs
),
697 def __init__(self
, *args
, **kwargs
):
702 tests
= [PyBytesIOTest
, PyStringIOTest
, CBytesIOTest
, CStringIOTest
,
703 PyStringIOPickleTest
, CStringIOPickleTest
]
704 support
.run_unittest(*tests
)
706 if __name__
== '__main__':