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