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