]>
Commit | Line | Data |
---|---|---|
4710c53d | 1 | # Tests universal newline support for both reading and parsing files.\r |
2 | \r | |
3 | # NOTE: this file tests the new `io` library backported from Python 3.x.\r | |
4 | # Similar tests for the builtin file object can be found in test_univnewlines2k.py.\r | |
5 | \r | |
6 | from __future__ import print_function\r | |
7 | from __future__ import unicode_literals\r | |
8 | \r | |
9 | import io\r | |
10 | import _pyio as pyio\r | |
11 | import unittest\r | |
12 | import os\r | |
13 | import sys\r | |
14 | from test import test_support as support\r | |
15 | \r | |
16 | if not hasattr(sys.stdin, 'newlines'):\r | |
17 | raise unittest.SkipTest(\r | |
18 | "This Python does not have universal newline support")\r | |
19 | \r | |
20 | FATX = 'x' * (2**14)\r | |
21 | \r | |
22 | DATA_TEMPLATE = [\r | |
23 | "line1=1",\r | |
24 | "line2='this is a very long line designed to go past any default " +\r | |
25 | "buffer limits that exist in io.py but we also want to test " +\r | |
26 | "the uncommon case, naturally.'",\r | |
27 | "def line3():pass",\r | |
28 | "line4 = '%s'" % FATX,\r | |
29 | ]\r | |
30 | \r | |
31 | DATA_LF = "\n".join(DATA_TEMPLATE) + "\n"\r | |
32 | DATA_CR = "\r".join(DATA_TEMPLATE) + "\r"\r | |
33 | DATA_CRLF = "\r\n".join(DATA_TEMPLATE) + "\r\n"\r | |
34 | \r | |
35 | # Note that DATA_MIXED also tests the ability to recognize a lone \r\r | |
36 | # before end-of-file.\r | |
37 | DATA_MIXED = "\n".join(DATA_TEMPLATE) + "\r"\r | |
38 | DATA_SPLIT = [x + "\n" for x in DATA_TEMPLATE]\r | |
39 | \r | |
40 | class TestGenericUnivNewlines(unittest.TestCase):\r | |
41 | # use a class variable DATA to define the data to write to the file\r | |
42 | # and a class variable NEWLINE to set the expected newlines value\r | |
43 | READMODE = 'r'\r | |
44 | WRITEMODE = 'wb'\r | |
45 | \r | |
46 | def setUp(self):\r | |
47 | data = self.DATA\r | |
48 | if "b" in self.WRITEMODE:\r | |
49 | data = data.encode("ascii")\r | |
50 | with self.open(support.TESTFN, self.WRITEMODE) as fp:\r | |
51 | fp.write(data)\r | |
52 | \r | |
53 | def tearDown(self):\r | |
54 | try:\r | |
55 | os.unlink(support.TESTFN)\r | |
56 | except:\r | |
57 | pass\r | |
58 | \r | |
59 | def test_read(self):\r | |
60 | with self.open(support.TESTFN, self.READMODE) as fp:\r | |
61 | data = fp.read()\r | |
62 | self.assertEqual(data, DATA_LF)\r | |
63 | self.assertEqual(set(fp.newlines), set(self.NEWLINE))\r | |
64 | \r | |
65 | def test_readlines(self):\r | |
66 | with self.open(support.TESTFN, self.READMODE) as fp:\r | |
67 | data = fp.readlines()\r | |
68 | self.assertEqual(data, DATA_SPLIT)\r | |
69 | self.assertEqual(set(fp.newlines), set(self.NEWLINE))\r | |
70 | \r | |
71 | def test_readline(self):\r | |
72 | with self.open(support.TESTFN, self.READMODE) as fp:\r | |
73 | data = []\r | |
74 | d = fp.readline()\r | |
75 | while d:\r | |
76 | data.append(d)\r | |
77 | d = fp.readline()\r | |
78 | self.assertEqual(data, DATA_SPLIT)\r | |
79 | self.assertEqual(set(fp.newlines), set(self.NEWLINE))\r | |
80 | \r | |
81 | def test_seek(self):\r | |
82 | with self.open(support.TESTFN, self.READMODE) as fp:\r | |
83 | fp.readline()\r | |
84 | pos = fp.tell()\r | |
85 | data = fp.readlines()\r | |
86 | self.assertEqual(data, DATA_SPLIT[1:])\r | |
87 | fp.seek(pos)\r | |
88 | data = fp.readlines()\r | |
89 | self.assertEqual(data, DATA_SPLIT[1:])\r | |
90 | \r | |
91 | \r | |
92 | class TestCRNewlines(TestGenericUnivNewlines):\r | |
93 | NEWLINE = '\r'\r | |
94 | DATA = DATA_CR\r | |
95 | \r | |
96 | class TestLFNewlines(TestGenericUnivNewlines):\r | |
97 | NEWLINE = '\n'\r | |
98 | DATA = DATA_LF\r | |
99 | \r | |
100 | class TestCRLFNewlines(TestGenericUnivNewlines):\r | |
101 | NEWLINE = '\r\n'\r | |
102 | DATA = DATA_CRLF\r | |
103 | \r | |
104 | def test_tell(self):\r | |
105 | with self.open(support.TESTFN, self.READMODE) as fp:\r | |
106 | self.assertEqual(repr(fp.newlines), repr(None))\r | |
107 | data = fp.readline()\r | |
108 | pos = fp.tell()\r | |
109 | self.assertEqual(repr(fp.newlines), repr(self.NEWLINE))\r | |
110 | \r | |
111 | class TestMixedNewlines(TestGenericUnivNewlines):\r | |
112 | NEWLINE = ('\r', '\n')\r | |
113 | DATA = DATA_MIXED\r | |
114 | \r | |
115 | \r | |
116 | def test_main():\r | |
117 | base_tests = (TestCRNewlines,\r | |
118 | TestLFNewlines,\r | |
119 | TestCRLFNewlines,\r | |
120 | TestMixedNewlines)\r | |
121 | tests = []\r | |
122 | # Test the C and Python implementations.\r | |
123 | for test in base_tests:\r | |
124 | class CTest(test):\r | |
125 | open = io.open\r | |
126 | CTest.__name__ = str("C" + test.__name__)\r | |
127 | class PyTest(test):\r | |
128 | open = staticmethod(pyio.open)\r | |
129 | PyTest.__name__ = str("Py" + test.__name__)\r | |
130 | tests.append(CTest)\r | |
131 | tests.append(PyTest)\r | |
132 | support.run_unittest(*tests)\r | |
133 | \r | |
134 | if __name__ == '__main__':\r | |
135 | test_main()\r |