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