test_univnewlines2k.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. # Tests universal newline support for both reading and parsing files.
  2. import unittest
  3. import os
  4. import sys
  5. from test import test_support
  6. if not hasattr(sys.stdin, 'newlines'):
  7. raise unittest.SkipTest, \
  8. "This Python does not have universal newline support"
  9. FATX = 'x' * (2**14)
  10. DATA_TEMPLATE = [
  11. "line1=1",
  12. "line2='this is a very long line designed to go past the magic " +
  13. "hundred character limit that is inside fileobject.c and which " +
  14. "is meant to speed up the common case, but we also want to test " +
  15. "the uncommon case, naturally.'",
  16. "def line3():pass",
  17. "line4 = '%s'" % FATX,
  18. ]
  19. DATA_LF = "\n".join(DATA_TEMPLATE) + "\n"
  20. DATA_CR = "\r".join(DATA_TEMPLATE) + "\r"
  21. DATA_CRLF = "\r\n".join(DATA_TEMPLATE) + "\r\n"
  22. # Note that DATA_MIXED also tests the ability to recognize a lone \r
  23. # before end-of-file.
  24. DATA_MIXED = "\n".join(DATA_TEMPLATE) + "\r"
  25. DATA_SPLIT = [x + "\n" for x in DATA_TEMPLATE]
  26. del x
  27. class TestGenericUnivNewlines(unittest.TestCase):
  28. # use a class variable DATA to define the data to write to the file
  29. # and a class variable NEWLINE to set the expected newlines value
  30. READMODE = 'U'
  31. WRITEMODE = 'wb'
  32. def setUp(self):
  33. with open(test_support.TESTFN, self.WRITEMODE) as fp:
  34. fp.write(self.DATA)
  35. def tearDown(self):
  36. try:
  37. os.unlink(test_support.TESTFN)
  38. except:
  39. pass
  40. def test_read(self):
  41. with open(test_support.TESTFN, self.READMODE) as fp:
  42. data = fp.read()
  43. self.assertEqual(data, DATA_LF)
  44. self.assertEqual(repr(fp.newlines), repr(self.NEWLINE))
  45. def test_readlines(self):
  46. with open(test_support.TESTFN, self.READMODE) as fp:
  47. data = fp.readlines()
  48. self.assertEqual(data, DATA_SPLIT)
  49. self.assertEqual(repr(fp.newlines), repr(self.NEWLINE))
  50. def test_readline(self):
  51. with open(test_support.TESTFN, self.READMODE) as fp:
  52. data = []
  53. d = fp.readline()
  54. while d:
  55. data.append(d)
  56. d = fp.readline()
  57. self.assertEqual(data, DATA_SPLIT)
  58. self.assertEqual(repr(fp.newlines), repr(self.NEWLINE))
  59. def test_seek(self):
  60. with open(test_support.TESTFN, self.READMODE) as fp:
  61. fp.readline()
  62. pos = fp.tell()
  63. data = fp.readlines()
  64. self.assertEqual(data, DATA_SPLIT[1:])
  65. fp.seek(pos)
  66. data = fp.readlines()
  67. self.assertEqual(data, DATA_SPLIT[1:])
  68. def test_execfile(self):
  69. namespace = {}
  70. with test_support.check_py3k_warnings():
  71. execfile(test_support.TESTFN, namespace)
  72. func = namespace['line3']
  73. self.assertEqual(func.func_code.co_firstlineno, 3)
  74. self.assertEqual(namespace['line4'], FATX)
  75. class TestNativeNewlines(TestGenericUnivNewlines):
  76. NEWLINE = None
  77. DATA = DATA_LF
  78. READMODE = 'r'
  79. WRITEMODE = 'w'
  80. class TestCRNewlines(TestGenericUnivNewlines):
  81. NEWLINE = '\r'
  82. DATA = DATA_CR
  83. class TestLFNewlines(TestGenericUnivNewlines):
  84. NEWLINE = '\n'
  85. DATA = DATA_LF
  86. class TestCRLFNewlines(TestGenericUnivNewlines):
  87. NEWLINE = '\r\n'
  88. DATA = DATA_CRLF
  89. def test_tell(self):
  90. with open(test_support.TESTFN, self.READMODE) as fp:
  91. self.assertEqual(repr(fp.newlines), repr(None))
  92. data = fp.readline()
  93. pos = fp.tell()
  94. self.assertEqual(repr(fp.newlines), repr(self.NEWLINE))
  95. class TestMixedNewlines(TestGenericUnivNewlines):
  96. NEWLINE = ('\r', '\n')
  97. DATA = DATA_MIXED
  98. def test_main():
  99. test_support.run_unittest(
  100. TestNativeNewlines,
  101. TestCRNewlines,
  102. TestLFNewlines,
  103. TestCRLFNewlines,
  104. TestMixedNewlines
  105. )
  106. if __name__ == '__main__':
  107. test_main()