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