/Lib/test/test_StringIO.py

http://unladen-swallow.googlecode.com/ · Python · 146 lines · 109 code · 26 blank · 11 comment · 4 complexity · 3d83d03836dd0d1cd9121ecece162d31 MD5 · raw file

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