183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# Tests universal newline support for both reading and parsing files.
283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport unittest
383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport os
483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport sys
583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom test import test_support
683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehif not hasattr(sys.stdin, 'newlines'):
883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    raise unittest.SkipTest, \
983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        "This Python does not have universal newline support"
1083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
1183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehFATX = 'x' * (2**14)
1283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
1383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehDATA_TEMPLATE = [
1483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    "line1=1",
1583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    "line2='this is a very long line designed to go past the magic " +
1683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        "hundred character limit that is inside fileobject.c and which " +
1783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        "is meant to speed up the common case, but we also want to test " +
1883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        "the uncommon case, naturally.'",
1983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    "def line3():pass",
2083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    "line4 = '%s'" % FATX,
2183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    ]
2283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
2383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehDATA_LF = "\n".join(DATA_TEMPLATE) + "\n"
2483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehDATA_CR = "\r".join(DATA_TEMPLATE) + "\r"
2583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehDATA_CRLF = "\r\n".join(DATA_TEMPLATE) + "\r\n"
2683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
2783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# Note that DATA_MIXED also tests the ability to recognize a lone \r
2883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# before end-of-file.
2983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehDATA_MIXED = "\n".join(DATA_TEMPLATE) + "\r"
3083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehDATA_SPLIT = [x + "\n" for x in DATA_TEMPLATE]
3183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehdel x
3283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
3383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass TestGenericUnivNewlines(unittest.TestCase):
3483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # use a class variable DATA to define the data to write to the file
3583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # and a class variable NEWLINE to set the expected newlines value
3683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    READMODE = 'U'
3783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    WRITEMODE = 'wb'
3883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
3983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def setUp(self):
4083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        with open(test_support.TESTFN, self.WRITEMODE) as fp:
4183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            fp.write(self.DATA)
4283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
4383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def tearDown(self):
4483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
4583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            os.unlink(test_support.TESTFN)
4683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        except:
4783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            pass
4883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
4983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_read(self):
5083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        with open(test_support.TESTFN, self.READMODE) as fp:
5183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            data = fp.read()
5283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(data, DATA_LF)
5383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(repr(fp.newlines), repr(self.NEWLINE))
5483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
5583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_readlines(self):
5683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        with open(test_support.TESTFN, self.READMODE) as fp:
5783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            data = fp.readlines()
5883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(data, DATA_SPLIT)
5983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(repr(fp.newlines), repr(self.NEWLINE))
6083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
6183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_readline(self):
6283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        with open(test_support.TESTFN, self.READMODE) as fp:
6383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            data = []
6483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            d = fp.readline()
6583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            while d:
6683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                data.append(d)
6783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                d = fp.readline()
6883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(data, DATA_SPLIT)
6983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(repr(fp.newlines), repr(self.NEWLINE))
7083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
7183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_seek(self):
7283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        with open(test_support.TESTFN, self.READMODE) as fp:
7383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            fp.readline()
7483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            pos = fp.tell()
7583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            data = fp.readlines()
7683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual(data, DATA_SPLIT[1:])
7783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            fp.seek(pos)
7883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            data = fp.readlines()
7983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(data, DATA_SPLIT[1:])
8083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
8183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_execfile(self):
8283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        namespace = {}
8383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        with test_support.check_py3k_warnings():
8483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            execfile(test_support.TESTFN, namespace)
8583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        func = namespace['line3']
8683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(func.func_code.co_firstlineno, 3)
8783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(namespace['line4'], FATX)
8883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
8983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
9083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass TestNativeNewlines(TestGenericUnivNewlines):
9183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    NEWLINE = None
9283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    DATA = DATA_LF
9383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    READMODE = 'r'
9483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    WRITEMODE = 'w'
9583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
9683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass TestCRNewlines(TestGenericUnivNewlines):
9783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    NEWLINE = '\r'
9883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    DATA = DATA_CR
9983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
10083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass TestLFNewlines(TestGenericUnivNewlines):
10183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    NEWLINE = '\n'
10283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    DATA = DATA_LF
10383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
10483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass TestCRLFNewlines(TestGenericUnivNewlines):
10583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    NEWLINE = '\r\n'
10683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    DATA = DATA_CRLF
10783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
10883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_tell(self):
10983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        with open(test_support.TESTFN, self.READMODE) as fp:
11083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual(repr(fp.newlines), repr(None))
11183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            data = fp.readline()
11283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            pos = fp.tell()
11383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(repr(fp.newlines), repr(self.NEWLINE))
11483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
11583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass TestMixedNewlines(TestGenericUnivNewlines):
11683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    NEWLINE = ('\r', '\n')
11783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    DATA = DATA_MIXED
11883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
11983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
12083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehdef test_main():
12183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    test_support.run_unittest(
12283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        TestNativeNewlines,
12383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        TestCRNewlines,
12483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        TestLFNewlines,
12583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        TestCRLFNewlines,
12683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        TestMixedNewlines
12783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh     )
12883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
12983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehif __name__ == '__main__':
13083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    test_main()
131