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