PageRenderTime 47ms CodeModel.GetById 35ms app.highlight 9ms RepoModel.GetById 1ms app.codeStats 0ms

/Lib/test/test_StringIO.py

http://unladen-swallow.googlecode.com/
Python | 146 lines | 109 code | 26 blank | 11 comment | 6 complexity | 3d83d03836dd0d1cd9121ecece162d31 MD5 | raw file
  1# Tests StringIO and cStringIO
  2
  3import unittest
  4import StringIO
  5import cStringIO
  6import types
  7from test import test_support
  8
  9
 10class TestGenericStringIO(unittest.TestCase):
 11    # use a class variable MODULE to define which module is being tested
 12
 13    # Line of data to test as string
 14    _line = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!'
 15
 16    # Constructor to use for the test data (._line is passed to this
 17    # constructor)
 18    constructor = str
 19
 20    def setUp(self):
 21        self._line = self.constructor(self._line)
 22        self._lines = self.constructor((self._line + '\n') * 5)
 23        self._fp = self.MODULE.StringIO(self._lines)
 24
 25    def test_reads(self):
 26        eq = self.assertEqual
 27        self.assertRaises(TypeError, self._fp.seek)
 28        eq(self._fp.read(10), self._line[:10])
 29        eq(self._fp.readline(), self._line[10:] + '\n')
 30        eq(len(self._fp.readlines(60)), 2)
 31
 32    def test_writes(self):
 33        f = self.MODULE.StringIO()
 34        self.assertRaises(TypeError, f.seek)
 35        f.write(self._line[:6])
 36        f.seek(3)
 37        f.write(self._line[20:26])
 38        f.write(self._line[52])
 39        self.assertEqual(f.getvalue(), 'abcuvwxyz!')
 40
 41    def test_writelines(self):
 42        f = self.MODULE.StringIO()
 43        f.writelines([self._line[0], self._line[1], self._line[2]])
 44        f.seek(0)
 45        self.assertEqual(f.getvalue(), 'abc')
 46
 47    def test_writelines_error(self):
 48        def errorGen():
 49            yield 'a'
 50            raise KeyboardInterrupt()
 51        f = self.MODULE.StringIO()
 52        self.assertRaises(KeyboardInterrupt, f.writelines, errorGen())
 53
 54    def test_truncate(self):
 55        eq = self.assertEqual
 56        f = self.MODULE.StringIO()
 57        f.write(self._lines)
 58        f.seek(10)
 59        f.truncate()
 60        eq(f.getvalue(), 'abcdefghij')
 61        f.truncate(5)
 62        eq(f.getvalue(), 'abcde')
 63        f.write('xyz')
 64        eq(f.getvalue(), 'abcdexyz')
 65        self.assertRaises(IOError, f.truncate, -1)
 66        f.close()
 67        self.assertRaises(ValueError, f.write, 'frobnitz')
 68
 69    def test_closed_flag(self):
 70        f = self.MODULE.StringIO()
 71        self.assertEqual(f.closed, False)
 72        f.close()
 73        self.assertEqual(f.closed, True)
 74        f = self.MODULE.StringIO("abc")
 75        self.assertEqual(f.closed, False)
 76        f.close()
 77        self.assertEqual(f.closed, True)
 78
 79    def test_isatty(self):
 80        f = self.MODULE.StringIO()
 81        self.assertRaises(TypeError, f.isatty, None)
 82        self.assertEqual(f.isatty(), False)
 83        f.close()
 84        self.assertRaises(ValueError, f.isatty)
 85
 86    def test_iterator(self):
 87        eq = self.assertEqual
 88        unless = self.failUnless
 89        eq(iter(self._fp), self._fp)
 90        # Does this object support the iteration protocol?
 91        unless(hasattr(self._fp, '__iter__'))
 92        unless(hasattr(self._fp, 'next'))
 93        i = 0
 94        for line in self._fp:
 95            eq(line, self._line + '\n')
 96            i += 1
 97        eq(i, 5)
 98        self._fp.close()
 99        self.assertRaises(ValueError, self._fp.next)
100
101class TestStringIO(TestGenericStringIO):
102    MODULE = StringIO
103
104    def test_unicode(self):
105
106        if not test_support.have_unicode: return
107
108        # The StringIO module also supports concatenating Unicode
109        # snippets to larger Unicode strings. This is tested by this
110        # method. Note that cStringIO does not support this extension.
111
112        f = self.MODULE.StringIO()
113        f.write(self._line[:6])
114        f.seek(3)
115        f.write(unicode(self._line[20:26]))
116        f.write(unicode(self._line[52]))
117        s = f.getvalue()
118        self.assertEqual(s, unicode('abcuvwxyz!'))
119        self.assertEqual(type(s), types.UnicodeType)
120
121class TestcStringIO(TestGenericStringIO):
122    MODULE = cStringIO
123
124import sys
125if sys.platform.startswith('java'):
126    # Jython doesn't have a buffer object, so we just do a useless
127    # fake of the buffer tests.
128    buffer = str
129
130class TestBufferStringIO(TestStringIO):
131    constructor = buffer
132
133class TestBuffercStringIO(TestcStringIO):
134    constructor = buffer
135
136
137def test_main():
138    test_support.run_unittest(
139        TestStringIO,
140        TestcStringIO,
141        TestBufferStringIO,
142        TestBuffercStringIO
143    )
144
145if __name__ == '__main__':
146    test_main()