183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# Tests universal newline support for both reading and parsing files. 283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport unittest 383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport os 483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport sys 583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom test import test_support 683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehif not hasattr(sys.stdin, 'newlines'): 883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise unittest.SkipTest, \ 983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh "This Python does not have universal newline support" 1083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 1183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehFATX = 'x' * (2**14) 1283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 1383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehDATA_TEMPLATE = [ 1483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh "line1=1", 1583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh "line2='this is a very long line designed to go past the magic " + 1683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh "hundred character limit that is inside fileobject.c and which " + 1783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh "is meant to speed up the common case, but we also want to test " + 1883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh "the uncommon case, naturally.'", 1983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh "def line3():pass", 2083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh "line4 = '%s'" % FATX, 2183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ] 2283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 2383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehDATA_LF = "\n".join(DATA_TEMPLATE) + "\n" 2483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehDATA_CR = "\r".join(DATA_TEMPLATE) + "\r" 2583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehDATA_CRLF = "\r\n".join(DATA_TEMPLATE) + "\r\n" 2683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 2783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# Note that DATA_MIXED also tests the ability to recognize a lone \r 2883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# before end-of-file. 2983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehDATA_MIXED = "\n".join(DATA_TEMPLATE) + "\r" 3083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehDATA_SPLIT = [x + "\n" for x in DATA_TEMPLATE] 3183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehdel x 3283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 3383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass TestGenericUnivNewlines(unittest.TestCase): 3483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # use a class variable DATA to define the data to write to the file 3583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # and a class variable NEWLINE to set the expected newlines value 3683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh READMODE = 'U' 3783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh WRITEMODE = 'wb' 3883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 3983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def setUp(self): 4083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh with open(test_support.TESTFN, self.WRITEMODE) as fp: 4183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh fp.write(self.DATA) 4283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 4383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def tearDown(self): 4483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh try: 4583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh os.unlink(test_support.TESTFN) 4683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh except: 4783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh pass 4883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 4983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def test_read(self): 5083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh with open(test_support.TESTFN, self.READMODE) as fp: 5183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh data = fp.read() 5283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.assertEqual(data, DATA_LF) 5383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.assertEqual(repr(fp.newlines), repr(self.NEWLINE)) 5483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 5583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def test_readlines(self): 5683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh with open(test_support.TESTFN, self.READMODE) as fp: 5783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh data = fp.readlines() 5883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.assertEqual(data, DATA_SPLIT) 5983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.assertEqual(repr(fp.newlines), repr(self.NEWLINE)) 6083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 6183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def test_readline(self): 6283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh with open(test_support.TESTFN, self.READMODE) as fp: 6383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh data = [] 6483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh d = fp.readline() 6583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh while d: 6683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh data.append(d) 6783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh d = fp.readline() 6883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.assertEqual(data, DATA_SPLIT) 6983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.assertEqual(repr(fp.newlines), repr(self.NEWLINE)) 7083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 7183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def test_seek(self): 7283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh with open(test_support.TESTFN, self.READMODE) as fp: 7383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh fp.readline() 7483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh pos = fp.tell() 7583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh data = fp.readlines() 7683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.assertEqual(data, DATA_SPLIT[1:]) 7783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh fp.seek(pos) 7883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh data = fp.readlines() 7983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.assertEqual(data, DATA_SPLIT[1:]) 8083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 8183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def test_execfile(self): 8283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh namespace = {} 8383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh with test_support.check_py3k_warnings(): 8483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh execfile(test_support.TESTFN, namespace) 8583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh func = namespace['line3'] 8683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.assertEqual(func.func_code.co_firstlineno, 3) 8783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.assertEqual(namespace['line4'], FATX) 8883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 8983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 9083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass TestNativeNewlines(TestGenericUnivNewlines): 9183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh NEWLINE = None 9283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh DATA = DATA_LF 9383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh READMODE = 'r' 9483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh WRITEMODE = 'w' 9583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 9683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass TestCRNewlines(TestGenericUnivNewlines): 9783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh NEWLINE = '\r' 9883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh DATA = DATA_CR 9983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 10083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass TestLFNewlines(TestGenericUnivNewlines): 10183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh NEWLINE = '\n' 10283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh DATA = DATA_LF 10383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 10483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass TestCRLFNewlines(TestGenericUnivNewlines): 10583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh NEWLINE = '\r\n' 10683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh DATA = DATA_CRLF 10783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 10883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def test_tell(self): 10983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh with open(test_support.TESTFN, self.READMODE) as fp: 11083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.assertEqual(repr(fp.newlines), repr(None)) 11183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh data = fp.readline() 11283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh pos = fp.tell() 11383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.assertEqual(repr(fp.newlines), repr(self.NEWLINE)) 11483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 11583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass TestMixedNewlines(TestGenericUnivNewlines): 11683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh NEWLINE = ('\r', '\n') 11783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh DATA = DATA_MIXED 11883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 11983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 12083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehdef test_main(): 12183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh test_support.run_unittest( 12283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh TestNativeNewlines, 12383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh TestCRNewlines, 12483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh TestLFNewlines, 12583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh TestCRLFNewlines, 12683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh TestMixedNewlines 12783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ) 12883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 12983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehif __name__ == '__main__': 13083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh test_main() 131