diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2016-03-08 16:35:19 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2016-03-08 16:35:19 (GMT) |
commit | 674e2d0ea05dac2dbcd7156ffb229066aa8acc17 (patch) | |
tree | 82e4a3cbcea14fe2284a6897acc60a2a18a554e2 /Lib/test/test_fileinput.py | |
parent | 238fecd75cf79aa835d4e9e310be44a295698340 (diff) | |
parent | cc2dbc5844929da1f89e3f548a8d1312b4f0ba0e (diff) | |
download | cpython-674e2d0ea05dac2dbcd7156ffb229066aa8acc17.zip cpython-674e2d0ea05dac2dbcd7156ffb229066aa8acc17.tar.gz cpython-674e2d0ea05dac2dbcd7156ffb229066aa8acc17.tar.bz2 |
Issue #15068: Got rid of excessive buffering in fileinput.
The bufsize parameter is now deprecated and ignored.
Diffstat (limited to 'Lib/test/test_fileinput.py')
-rw-r--r-- | Lib/test/test_fileinput.py | 79 |
1 files changed, 75 insertions, 4 deletions
diff --git a/Lib/test/test_fileinput.py b/Lib/test/test_fileinput.py index ad81304..bdf4252 100644 --- a/Lib/test/test_fileinput.py +++ b/Lib/test/test_fileinput.py @@ -47,6 +47,42 @@ def remove_tempfiles(*names): if name: safe_unlink(name) +class LineReader: + + def __init__(self): + self._linesread = [] + + @property + def linesread(self): + try: + return self._linesread[:] + finally: + self._linesread = [] + + def openhook(self, filename, mode): + self.it = iter(filename.splitlines(True)) + return self + + def readline(self, size=None): + line = next(self.it, '') + self._linesread.append(line) + return line + + def readlines(self, hint=-1): + lines = [] + size = 0 + while True: + line = self.readline() + if not line: + return lines + lines.append(line) + size += len(line) + if size >= hint: + return lines + + def close(self): + pass + class BufferSizesTests(unittest.TestCase): def test_buffer_sizes(self): # First, run the tests with default and teeny buffer size. @@ -57,7 +93,11 @@ class BufferSizesTests(unittest.TestCase): t2 = writeTmp(2, ["Line %s of file 2\n" % (i+1) for i in range(10)]) t3 = writeTmp(3, ["Line %s of file 3\n" % (i+1) for i in range(5)]) t4 = writeTmp(4, ["Line %s of file 4\n" % (i+1) for i in range(1)]) - self.buffer_size_test(t1, t2, t3, t4, bs, round) + if bs: + with self.assertWarns(DeprecationWarning): + self.buffer_size_test(t1, t2, t3, t4, bs, round) + else: + self.buffer_size_test(t1, t2, t3, t4, bs, round) finally: remove_tempfiles(t1, t2, t3, t4) @@ -290,7 +330,7 @@ class FileInputTests(unittest.TestCase): self.addCleanup(safe_unlink, TESTFN) with FileInput(files=TESTFN, - openhook=hook_encoded('ascii'), bufsize=8) as fi: + openhook=hook_encoded('ascii')) as fi: try: self.assertEqual(fi.readline(), 'A\n') self.assertEqual(fi.readline(), 'B\n') @@ -458,6 +498,38 @@ class FileInputTests(unittest.TestCase): self.assertEqual(result, -1, "fileno() should return -1") + def test_readline_buffering(self): + src = LineReader() + with FileInput(files=['line1\nline2', 'line3\n'], + openhook=src.openhook) as fi: + self.assertEqual(src.linesread, []) + self.assertEqual(fi.readline(), 'line1\n') + self.assertEqual(src.linesread, ['line1\n']) + self.assertEqual(fi.readline(), 'line2') + self.assertEqual(src.linesread, ['line2']) + self.assertEqual(fi.readline(), 'line3\n') + self.assertEqual(src.linesread, ['', 'line3\n']) + self.assertEqual(fi.readline(), '') + self.assertEqual(src.linesread, ['']) + self.assertEqual(fi.readline(), '') + self.assertEqual(src.linesread, []) + + def test_iteration_buffering(self): + src = LineReader() + with FileInput(files=['line1\nline2', 'line3\n'], + openhook=src.openhook) as fi: + self.assertEqual(src.linesread, []) + self.assertEqual(next(fi), 'line1\n') + self.assertEqual(src.linesread, ['line1\n']) + self.assertEqual(next(fi), 'line2') + self.assertEqual(src.linesread, ['line2']) + self.assertEqual(next(fi), 'line3\n') + self.assertEqual(src.linesread, ['', 'line3\n']) + self.assertRaises(StopIteration, next, fi) + self.assertEqual(src.linesread, ['']) + self.assertRaises(StopIteration, next, fi) + self.assertEqual(src.linesread, []) + class MockFileInput: """A class that mocks out fileinput.FileInput for use during unit tests""" @@ -917,8 +989,7 @@ class Test_hook_encoded(unittest.TestCase): class MiscTest(unittest.TestCase): def test_all(self): - blacklist = {'DEFAULT_BUFSIZE'} - support.check__all__(self, fileinput, blacklist=blacklist) + support.check__all__(self, fileinput) if __name__ == "__main__": |