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