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 unittest.SkipTest, \
|
---|
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 | with open(test_support.TESTFN, self.WRITEMODE) as fp:
|
---|
41 | fp.write(self.DATA)
|
---|
42 |
|
---|
43 | def tearDown(self):
|
---|
44 | try:
|
---|
45 | os.unlink(test_support.TESTFN)
|
---|
46 | except:
|
---|
47 | pass
|
---|
48 |
|
---|
49 | def test_read(self):
|
---|
50 | with open(test_support.TESTFN, self.READMODE) as fp:
|
---|
51 | data = fp.read()
|
---|
52 | self.assertEqual(data, DATA_LF)
|
---|
53 | self.assertEqual(repr(fp.newlines), repr(self.NEWLINE))
|
---|
54 |
|
---|
55 | def test_readlines(self):
|
---|
56 | with open(test_support.TESTFN, self.READMODE) as fp:
|
---|
57 | data = fp.readlines()
|
---|
58 | self.assertEqual(data, DATA_SPLIT)
|
---|
59 | self.assertEqual(repr(fp.newlines), repr(self.NEWLINE))
|
---|
60 |
|
---|
61 | def test_readline(self):
|
---|
62 | with open(test_support.TESTFN, self.READMODE) as fp:
|
---|
63 | data = []
|
---|
64 | d = fp.readline()
|
---|
65 | while d:
|
---|
66 | data.append(d)
|
---|
67 | d = fp.readline()
|
---|
68 | self.assertEqual(data, DATA_SPLIT)
|
---|
69 | self.assertEqual(repr(fp.newlines), repr(self.NEWLINE))
|
---|
70 |
|
---|
71 | def test_seek(self):
|
---|
72 | with open(test_support.TESTFN, self.READMODE) as fp:
|
---|
73 | fp.readline()
|
---|
74 | pos = fp.tell()
|
---|
75 | data = fp.readlines()
|
---|
76 | self.assertEqual(data, DATA_SPLIT[1:])
|
---|
77 | fp.seek(pos)
|
---|
78 | data = fp.readlines()
|
---|
79 | self.assertEqual(data, DATA_SPLIT[1:])
|
---|
80 |
|
---|
81 | def test_execfile(self):
|
---|
82 | namespace = {}
|
---|
83 | with test_support.check_py3k_warnings():
|
---|
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 | def test_tell(self):
|
---|
109 | with open(test_support.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))
|
---|
114 |
|
---|
115 | class TestMixedNewlines(TestGenericUnivNewlines):
|
---|
116 | NEWLINE = ('\r', '\n')
|
---|
117 | DATA = DATA_MIXED
|
---|
118 |
|
---|
119 |
|
---|
120 | def test_main():
|
---|
121 | test_support.run_unittest(
|
---|
122 | TestNativeNewlines,
|
---|
123 | TestCRNewlines,
|
---|
124 | TestLFNewlines,
|
---|
125 | TestCRLFNewlines,
|
---|
126 | TestMixedNewlines
|
---|
127 | )
|
---|
128 |
|
---|
129 | if __name__ == '__main__':
|
---|
130 | test_main()
|
---|