blob: a0a909058c736825166dc923acde8eac458ea453 [file] [log] [blame]
Jack Jansen518d2612002-04-14 20:17:18 +00001# Tests universal newline support for both reading and parsing files.
Antoine Pitrou19690592009-06-12 20:14:08 +00002
Antoine Pitrou47a5f482009-06-12 20:41:52 +00003# NOTE: this file tests the new `io` library backported from Python 3.x.
4# Similar tests for the builtin file object can be found in test_univnewlines2k.py.
5
Antoine Pitrou19690592009-06-12 20:14:08 +00006from __future__ import print_function
7from __future__ import unicode_literals
8
9import io
10import _pyio as pyio
Jack Jansen518d2612002-04-14 20:17:18 +000011import unittest
Jack Jansen518d2612002-04-14 20:17:18 +000012import os
13import sys
Antoine Pitrou19690592009-06-12 20:14:08 +000014from test import test_support as support
Jack Jansen518d2612002-04-14 20:17:18 +000015
Jack Jansen518d2612002-04-14 20:17:18 +000016if not hasattr(sys.stdin, 'newlines'):
Antoine Pitrou19690592009-06-12 20:14:08 +000017 raise unittest.SkipTest(
18 "This Python does not have universal newline support")
Jack Jansen518d2612002-04-14 20:17:18 +000019
Tim Petersea572b22002-04-21 06:12:02 +000020FATX = 'x' * (2**14)
21
22DATA_TEMPLATE = [
23 "line1=1",
Antoine Pitrou19690592009-06-12 20:14:08 +000024 "line2='this is a very long line designed to go past any default " +
25 "buffer limits that exist in io.py but we also want to test " +
Tim Petersea572b22002-04-21 06:12:02 +000026 "the uncommon case, naturally.'",
27 "def line3():pass",
28 "line4 = '%s'" % FATX,
29 ]
30
31DATA_LF = "\n".join(DATA_TEMPLATE) + "\n"
32DATA_CR = "\r".join(DATA_TEMPLATE) + "\r"
33DATA_CRLF = "\r\n".join(DATA_TEMPLATE) + "\r\n"
34
35# Note that DATA_MIXED also tests the ability to recognize a lone \r
36# before end-of-file.
37DATA_MIXED = "\n".join(DATA_TEMPLATE) + "\r"
38DATA_SPLIT = [x + "\n" for x in DATA_TEMPLATE]
Tim Petersea572b22002-04-21 06:12:02 +000039
Jack Jansen518d2612002-04-14 20:17:18 +000040class TestGenericUnivNewlines(unittest.TestCase):
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
Antoine Pitrou19690592009-06-12 20:14:08 +000043 READMODE = 'r'
Jack Jansen518d2612002-04-14 20:17:18 +000044 WRITEMODE = 'wb'
45
46 def setUp(self):
Antoine Pitrou19690592009-06-12 20:14:08 +000047 data = self.DATA
48 if "b" in self.WRITEMODE:
49 data = data.encode("ascii")
50 with self.open(support.TESTFN, self.WRITEMODE) as fp:
51 fp.write(data)
Jack Jansen518d2612002-04-14 20:17:18 +000052
53 def tearDown(self):
54 try:
Antoine Pitrou19690592009-06-12 20:14:08 +000055 os.unlink(support.TESTFN)
Jack Jansen518d2612002-04-14 20:17:18 +000056 except:
57 pass
Tim Peters863ac442002-04-16 01:38:40 +000058
Jack Jansen518d2612002-04-14 20:17:18 +000059 def test_read(self):
Antoine Pitrou19690592009-06-12 20:14:08 +000060 with self.open(support.TESTFN, self.READMODE) as fp:
Philip Jenvey6a111022009-05-28 05:58:44 +000061 data = fp.read()
Jack Jansen518d2612002-04-14 20:17:18 +000062 self.assertEqual(data, DATA_LF)
Antoine Pitrou19690592009-06-12 20:14:08 +000063 self.assertEqual(set(fp.newlines), set(self.NEWLINE))
Tim Peters863ac442002-04-16 01:38:40 +000064
Jack Jansen518d2612002-04-14 20:17:18 +000065 def test_readlines(self):
Antoine Pitrou19690592009-06-12 20:14:08 +000066 with self.open(support.TESTFN, self.READMODE) as fp:
Philip Jenvey6a111022009-05-28 05:58:44 +000067 data = fp.readlines()
Jack Jansen518d2612002-04-14 20:17:18 +000068 self.assertEqual(data, DATA_SPLIT)
Antoine Pitrou19690592009-06-12 20:14:08 +000069 self.assertEqual(set(fp.newlines), set(self.NEWLINE))
Jack Jansen518d2612002-04-14 20:17:18 +000070
71 def test_readline(self):
Antoine Pitrou19690592009-06-12 20:14:08 +000072 with self.open(support.TESTFN, self.READMODE) as fp:
Philip Jenvey6a111022009-05-28 05:58:44 +000073 data = []
Jack Jansen518d2612002-04-14 20:17:18 +000074 d = fp.readline()
Philip Jenvey6a111022009-05-28 05:58:44 +000075 while d:
76 data.append(d)
77 d = fp.readline()
Jack Jansen518d2612002-04-14 20:17:18 +000078 self.assertEqual(data, DATA_SPLIT)
Antoine Pitrou19690592009-06-12 20:14:08 +000079 self.assertEqual(set(fp.newlines), set(self.NEWLINE))
Tim Peters863ac442002-04-16 01:38:40 +000080
Jack Jansen518d2612002-04-14 20:17:18 +000081 def test_seek(self):
Antoine Pitrou19690592009-06-12 20:14:08 +000082 with self.open(support.TESTFN, self.READMODE) as fp:
Philip Jenvey6a111022009-05-28 05:58:44 +000083 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()
Jack Jansen518d2612002-04-14 20:17:18 +000089 self.assertEqual(data, DATA_SPLIT[1:])
Tim Peters863ac442002-04-16 01:38:40 +000090
Tim Peters863ac442002-04-16 01:38:40 +000091
Jack Jansen518d2612002-04-14 20:17:18 +000092class TestCRNewlines(TestGenericUnivNewlines):
Tim Petersea572b22002-04-21 06:12:02 +000093 NEWLINE = '\r'
94 DATA = DATA_CR
Tim Peters863ac442002-04-16 01:38:40 +000095
Jack Jansen518d2612002-04-14 20:17:18 +000096class TestLFNewlines(TestGenericUnivNewlines):
Tim Petersea572b22002-04-21 06:12:02 +000097 NEWLINE = '\n'
98 DATA = DATA_LF
Tim Peters863ac442002-04-16 01:38:40 +000099
Jack Jansen518d2612002-04-14 20:17:18 +0000100class TestCRLFNewlines(TestGenericUnivNewlines):
Tim Petersea572b22002-04-21 06:12:02 +0000101 NEWLINE = '\r\n'
102 DATA = DATA_CRLF
Tim Peters863ac442002-04-16 01:38:40 +0000103
Guido van Rossumad8fb0d2007-09-22 20:18:03 +0000104 def test_tell(self):
Antoine Pitrou19690592009-06-12 20:14:08 +0000105 with self.open(support.TESTFN, self.READMODE) as fp:
Philip Jenvey6a111022009-05-28 05:58:44 +0000106 self.assertEqual(repr(fp.newlines), repr(None))
107 data = fp.readline()
108 pos = fp.tell()
Guido van Rossumad8fb0d2007-09-22 20:18:03 +0000109 self.assertEqual(repr(fp.newlines), repr(self.NEWLINE))
110
Jack Jansen518d2612002-04-14 20:17:18 +0000111class TestMixedNewlines(TestGenericUnivNewlines):
Tim Petersea572b22002-04-21 06:12:02 +0000112 NEWLINE = ('\r', '\n')
113 DATA = DATA_MIXED
Tim Peters863ac442002-04-16 01:38:40 +0000114
Jack Jansen518d2612002-04-14 20:17:18 +0000115
116def test_main():
Antoine Pitrou19690592009-06-12 20:14:08 +0000117 base_tests = (TestCRNewlines,
118 TestLFNewlines,
119 TestCRLFNewlines,
120 TestMixedNewlines)
121 tests = []
122 # Test the C and Python implementations.
123 for test in base_tests:
124 class CTest(test):
125 open = io.open
126 CTest.__name__ = str("C" + test.__name__)
127 class PyTest(test):
128 open = staticmethod(pyio.open)
129 PyTest.__name__ = str("Py" + test.__name__)
130 tests.append(CTest)
131 tests.append(PyTest)
132 support.run_unittest(*tests)
Jack Jansen518d2612002-04-14 20:17:18 +0000133
134if __name__ == '__main__':
135 test_main()