test_univnewlines.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. # Tests universal newline support for both reading and parsing files.
  2. import io
  3. import _pyio as pyio
  4. import unittest
  5. import os
  6. import sys
  7. from test import support
  8. from test.support import os_helper
  9. if not hasattr(sys.stdin, 'newlines'):
  10. raise unittest.SkipTest(
  11. "This Python does not have universal newline support")
  12. FATX = 'x' * (2**14)
  13. DATA_TEMPLATE = [
  14. "line1=1",
  15. "line2='this is a very long line designed to go past any default " +
  16. "buffer limits that exist in io.py but we also want to test " +
  17. "the uncommon case, naturally.'",
  18. "def line3():pass",
  19. "line4 = '%s'" % FATX,
  20. ]
  21. DATA_LF = "\n".join(DATA_TEMPLATE) + "\n"
  22. DATA_CR = "\r".join(DATA_TEMPLATE) + "\r"
  23. DATA_CRLF = "\r\n".join(DATA_TEMPLATE) + "\r\n"
  24. # Note that DATA_MIXED also tests the ability to recognize a lone \r
  25. # before end-of-file.
  26. DATA_MIXED = "\n".join(DATA_TEMPLATE) + "\r"
  27. DATA_SPLIT = [x + "\n" for x in DATA_TEMPLATE]
  28. class CTest:
  29. open = io.open
  30. class PyTest:
  31. open = staticmethod(pyio.open)
  32. class TestGenericUnivNewlines:
  33. # use a class variable DATA to define the data to write to the file
  34. # and a class variable NEWLINE to set the expected newlines value
  35. READMODE = 'r'
  36. WRITEMODE = 'wb'
  37. def setUp(self):
  38. data = self.DATA
  39. if "b" in self.WRITEMODE:
  40. data = data.encode("ascii")
  41. with self.open(os_helper.TESTFN, self.WRITEMODE) as fp:
  42. fp.write(data)
  43. def tearDown(self):
  44. try:
  45. os.unlink(os_helper.TESTFN)
  46. except:
  47. pass
  48. def test_read(self):
  49. with self.open(os_helper.TESTFN, self.READMODE) as fp:
  50. data = fp.read()
  51. self.assertEqual(data, DATA_LF)
  52. self.assertEqual(repr(fp.newlines), repr(self.NEWLINE))
  53. def test_readlines(self):
  54. with self.open(os_helper.TESTFN, self.READMODE) as fp:
  55. data = fp.readlines()
  56. self.assertEqual(data, DATA_SPLIT)
  57. self.assertEqual(repr(fp.newlines), repr(self.NEWLINE))
  58. def test_readline(self):
  59. with self.open(os_helper.TESTFN, self.READMODE) as fp:
  60. data = []
  61. d = fp.readline()
  62. while d:
  63. data.append(d)
  64. d = fp.readline()
  65. self.assertEqual(data, DATA_SPLIT)
  66. self.assertEqual(repr(fp.newlines), repr(self.NEWLINE))
  67. def test_seek(self):
  68. with self.open(os_helper.TESTFN, self.READMODE) as fp:
  69. fp.readline()
  70. pos = fp.tell()
  71. data = fp.readlines()
  72. self.assertEqual(data, DATA_SPLIT[1:])
  73. fp.seek(pos)
  74. data = fp.readlines()
  75. self.assertEqual(data, DATA_SPLIT[1:])
  76. class TestCRNewlines(TestGenericUnivNewlines):
  77. NEWLINE = '\r'
  78. DATA = DATA_CR
  79. class CTestCRNewlines(CTest, TestCRNewlines, unittest.TestCase): pass
  80. class PyTestCRNewlines(PyTest, TestCRNewlines, unittest.TestCase): pass
  81. class TestLFNewlines(TestGenericUnivNewlines):
  82. NEWLINE = '\n'
  83. DATA = DATA_LF
  84. class CTestLFNewlines(CTest, TestLFNewlines, unittest.TestCase): pass
  85. class PyTestLFNewlines(PyTest, TestLFNewlines, unittest.TestCase): pass
  86. class TestCRLFNewlines(TestGenericUnivNewlines):
  87. NEWLINE = '\r\n'
  88. DATA = DATA_CRLF
  89. def test_tell(self):
  90. with self.open(os_helper.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 CTestCRLFNewlines(CTest, TestCRLFNewlines, unittest.TestCase): pass
  96. class PyTestCRLFNewlines(PyTest, TestCRLFNewlines, unittest.TestCase): pass
  97. class TestMixedNewlines(TestGenericUnivNewlines):
  98. NEWLINE = ('\r', '\n')
  99. DATA = DATA_MIXED
  100. class CTestMixedNewlines(CTest, TestMixedNewlines, unittest.TestCase): pass
  101. class PyTestMixedNewlines(PyTest, TestMixedNewlines, unittest.TestCase): pass
  102. if __name__ == '__main__':
  103. unittest.main()