[Python-checkins] r56149 - python/branches/cpy_merge/Lib/test/test_memoryio.py

alexandre.vassalotti python-checkins at python.org
Mon Jul 2 20:20:18 CEST 2007


Author: alexandre.vassalotti
Date: Mon Jul  2 20:20:18 2007
New Revision: 56149

Added:
   python/branches/cpy_merge/Lib/test/test_memoryio.py
Log:
Add unit tests for memory-based IO.

Not perfect, but it's a start.


Added: python/branches/cpy_merge/Lib/test/test_memoryio.py
==============================================================================
--- (empty file)
+++ python/branches/cpy_merge/Lib/test/test_memoryio.py	Mon Jul  2 20:20:18 2007
@@ -0,0 +1,248 @@
+"""Unit tests for memory-based file-like objects.
+StringIO -- for unicode strings
+BytesIO -- for bytes
+"""
+
+import unittest
+from test import test_support
+
+import io
+
+try:
+    import _string_io, _bytes_io
+    has_c_implementation = True
+except ImportError:
+    has_c_implementation = False
+
+
+class MemoryTestMixin:
+
+    def write_ops(self, f):
+        t = self.buftype
+        self.assertEqual(f.write(t("blah.")), 5)
+        self.assertEqual(f.seek(0), 0)
+        self.assertEqual(f.write(t("Hello.")), 6)
+        self.assertEqual(f.tell(), 6)
+        self.assertEqual(f.seek(-1, 1), 5)
+        self.assertEqual(f.tell(), 5)
+        self.assertEqual(f.write(t(" world\n\n\n")), 9)
+        self.assertEqual(f.seek(0), 0)
+        self.assertEqual(f.write(t("h")), 1)
+        self.assertEqual(f.seek(-1, 2), 13)
+        self.assertEqual(f.tell(), 13)
+        self.assertEqual(f.truncate(12), 12)
+        self.assertEqual(f.tell(), 13)
+
+    def test_write(self):
+        buf = self.buftype("hello world\n")
+        memio = self.ioclass(buf)
+
+        self.write_ops(memio)
+
+    def test_write_noinit(self):
+        memio = self.ioclass()
+
+        self.write_ops(memio)
+
+    def test_writelines(self):
+        buf = self.buftype("1234567890")
+        memio = self.ioclass()
+
+        memio.writelines([buf] * 100)
+        self.assertEqual(memio.getvalue(), buf * 100)
+
+    def test_writelines_error(self):
+        memio = self.ioclass()
+        def error_gen():
+            yield self.buftype('spam')
+            raise KeyboardInterrupt
+
+        self.assertRaises(KeyboardInterrupt, memio.writelines, error_gen())
+
+    def test_truncate(self):
+        buf = self.buftype("1234567890")
+        memio = self.ioclass(buf)
+
+        memio.seek(6)
+        self.assertEqual(memio.truncate(), 6)
+        self.assertEqual(memio.getvalue(), buf[:6])
+        self.assertEqual(memio.truncate(4), 4)
+        self.assertEqual(memio.getvalue(), buf[:4])
+        self.assertEqual(memio.tell(), 4)
+        memio.write(buf)
+        self.assertEqual(memio.getvalue(), buf[:4] + buf)
+        self.assertRaises(IOError, memio.truncate, -1)
+
+    def test_close(self):
+        buf = self.buftype("1234567890")
+        memio = self.ioclass(buf)
+
+        self.assertEqual(memio.closed, False)
+        memio.close()
+        self.assertRaises(ValueError, memio.read)
+        self.assertRaises(ValueError, memio.write, buf)
+        self.assertRaises(ValueError, memio.writelines, buf)
+        self.assertRaises(ValueError, memio.seek, 3)
+        self.assertRaises(ValueError, memio.truncate)
+        self.assertRaises(ValueError, memio.getvalue)
+        self.assertRaises(ValueError, memio.tell)
+        self.assertEqual(memio.closed, True)
+
+    def test_init(self):
+        buf = self.buftype("1234567890")
+        memio = self.ioclass(buf)
+
+    def read_ops(self, f, data):
+        t = self.buftype
+        data = f.read(5)
+        self.assertEqual(data, t("hello"))
+        self.assertEqual(f.readinto(data), 5)
+        self.assertEqual(data, t(" worl"))
+        self.assertEqual(f.readinto(data), 2)
+        self.assertEqual(len(data), 5)
+        self.assertEqual(data[:2], t("d\n"))
+        self.assertEqual(f.seek(0), 0)
+        self.assertEqual(f.read(20), t("hello world\n"))
+        self.assertEqual(f.read(1), t(""))
+        self.assertEqual(f.readinto(t("x")), 0)
+        self.assertEqual(f.seek(-6, 2), 6)
+        self.assertEqual(f.read(5), t("world"))
+        self.assertEqual(f.read(0), t(""))
+        self.assertEqual(f.readinto(t("")), 0)
+        self.assertEqual(f.seek(-6, 1), 5)
+        self.assertEqual(f.read(5), t(" worl"))
+        self.assertEqual(f.tell(), 10)
+
+    def test_read(self):
+        buf = self.buftype("1234567890")
+        memio = self.ioclass(buf)
+
+        self.assertEqual(memio.read(1), buf[:1])
+        self.assertEqual(memio.read(4), buf[1:5])
+        self.assertEqual(memio.read(900), buf[5:])
+        self.assertEqual(memio.read(), self.EOF)
+
+        buf = self.buftype("hello world\n")
+        memio = self.ioclass(buf)
+
+        self.read_ops(memio, buf)
+
+    def test_read_noargs(self):
+        buf = self.buftype("1234567890")
+        memio = self.ioclass(buf)
+
+        self.assertEqual(buf, memio.read())
+        self.assertEqual(self.EOF, memio.read())
+
+    def test_readline(self):
+        pass
+
+    def test_readlines(self):
+        pass
+
+    def test_iterator(self):
+        buf = self.buftype("1234567890\n")
+        memio = self.ioclass(buf * 10)
+
+        self.assertEqual(iter(memio), memio)
+        self.failUnless(hasattr(memio, '__iter__'))
+        self.failUnless(hasattr(memio, '__next__'))
+        i = 0
+        for line in memio:
+            self.assertEqual(line, buf)
+            i += 1
+        self.assertEqual(i, 10)
+
+        memio.seek(0)
+        i = 0
+        for line in memio:
+            self.assertEqual(line, buf)
+            i += 1
+        self.assertEqual(i, 10)
+
+    def test_getvalue(self):
+        buf = self.buftype("1234567890")
+        memio = self.ioclass(buf)
+
+        self.assertEqual(memio.getvalue(), buf)
+        memio = self.ioclass(buf * 1000)
+        self.assertEqual(memio.getvalue()[-3:], "890")
+
+    def test_seek(self):
+        buf = self.buftype("1234567890")
+        memio = self.ioclass(buf)
+
+        memio.read(5)
+        memio.seek(0)
+        self.assertEqual(buf, memio.read())
+
+        memio.seek(3)
+        self.assertEqual(buf[3:], memio.read())
+
+    def test_tell(self):
+        buf = self.buftype("1234567890")
+        memio = self.ioclass(buf)
+
+        self.assertEqual(0, memio.tell())
+        memio.seek(5)
+        self.assertEqual(5, memio.tell())
+        memio.seek(10000)
+        self.assertEqual(10000, memio.tell())
+
+    def test_flags(self):
+        memio = self.ioclass()
+
+        self.assertEqual(memio.writable(), True)
+        self.assertEqual(memio.readable(), True)
+        self.assertEqual(memio.seekable(), True)
+        self.assertEqual(memio.isatty(), False)
+        memio.close()
+        self.assertEqual(memio.writable(), True)
+        self.assertEqual(memio.readable(), True)
+        self.assertEqual(memio.seekable(), True)
+
+
+class PythonBytesIOTest(MemoryTestMixin, unittest.TestCase):
+    """
+    Test the Python implementation of BytesIO.
+    """
+    buftype = bytes
+    ioclass = io._BytesIO
+    EOF = b""
+
+
+class PythonStringIOTest(MemoryTestMixin, unittest.TestCase):
+    """
+    Test the Python implementation of StringIO.
+    """
+    buftype = str
+    ioclass = io._StringIO
+    EOF = ""
+
+if has_c_implementation:
+    class CBytesIOTest(MemoryTestMixin, unittest.TestCase):
+        """
+        Test the C implementation of BytesIO if available.
+        """
+        buftype = bytes
+        ioclass = _bytes_io.BytesIO
+        EOF = b""
+
+
+    class CStringIOTest(MemoryTestMixin, unittest.TestCase):
+        """
+        Test the C implementation of StringIO if available.
+        """
+        buftype = unicode
+        ioclass = _string_io.StringIO
+        EOF = u""
+
+def test_main():
+    if has_c_implementation:
+        test_support.run_unittest(PythonBytesIOTest, PythonStringIOTest,
+                                  CBytesIOTest, CStringIOTest)
+    else:
+        test_support.run_unittest(PythonBytesIOTest, PythonStringIOTest)
+
+if __name__ == '__main__':
+    test_main()


More information about the Python-checkins mailing list