diff options
author | Georg Brandl <georg@python.org> | 2009-05-05 08:31:54 (GMT) |
---|---|---|
committer | Georg Brandl <georg@python.org> | 2009-05-05 08:31:54 (GMT) |
commit | 991f9202bede42b033e499525755daed4a1c07be (patch) | |
tree | 84c34a12737228ad6109c46f42c86676c4a1c480 /Lib/test/test_linecache.py | |
parent | eaa84ef1e96f1f597ef54f40147de2e6a6980e34 (diff) | |
download | cpython-991f9202bede42b033e499525755daed4a1c07be.zip cpython-991f9202bede42b033e499525755daed4a1c07be.tar.gz cpython-991f9202bede42b033e499525755daed4a1c07be.tar.bz2 |
Merged revisions 72319-72320 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r72319 | georg.brandl | 2009-05-05 10:28:49 +0200 (Di, 05 Mai 2009) | 1 line
#1309567: fix linecache behavior of stripping subdirectories from paths when looking for relative filename matches. Also add a linecache test suite.
........
r72320 | georg.brandl | 2009-05-05 10:30:28 +0200 (Di, 05 Mai 2009) | 1 line
Add a news entry for r72319.
........
Diffstat (limited to 'Lib/test/test_linecache.py')
-rw-r--r-- | Lib/test/test_linecache.py | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/Lib/test/test_linecache.py b/Lib/test/test_linecache.py new file mode 100644 index 0000000..14d8d59 --- /dev/null +++ b/Lib/test/test_linecache.py @@ -0,0 +1,129 @@ +""" Tests for the linecache module """ + +import linecache +import unittest +import os.path +from test import support + + +FILENAME = linecache.__file__ +INVALID_NAME = '!@$)(!@#_1' +EMPTY = '' +TESTS = 'cjkencodings_test inspect_fodder inspect_fodder2 mapping_tests' +TESTS = TESTS.split() +TEST_PATH = os.path.dirname(support.__file__) +MODULES = "linecache unittest".split() +MODULE_PATH = os.path.dirname(FILENAME) + +SOURCE_1 = ''' +" Docstring " + +def function(): + return result + +''' + +SOURCE_2 = ''' +def f(): + return 1 + 1 + +a = f() + +''' + +class LineCacheTests(unittest.TestCase): + + def test_getline(self): + getline = linecache.getline + + # Bad values for line number should return an empty string + self.assertEquals(getline(FILENAME, 2**15), EMPTY) + self.assertEquals(getline(FILENAME, -1), EMPTY) + + # Float values currently raise TypeError, should it? + self.assertRaises(TypeError, getline, FILENAME, 1.1) + + # Bad filenames should return an empty string + self.assertEquals(getline(EMPTY, 1), EMPTY) + self.assertEquals(getline(INVALID_NAME, 1), EMPTY) + + # Check whether lines correspond to those from file iteration + for entry in TESTS: + filename = os.path.join(TEST_PATH, entry) + '.py' + for index, line in enumerate(open(filename)): + self.assertEquals(line, getline(filename, index + 1)) + + # Check module loading + for entry in MODULES: + filename = os.path.join(MODULE_PATH, entry) + '.py' + for index, line in enumerate(open(filename)): + self.assertEquals(line, getline(filename, index + 1)) + + # Check that bogus data isn't returned (issue #1309567) + empty = linecache.getlines('a/b/c/__init__.py') + self.assertEquals(empty, []) + + def test_clearcache(self): + cached = [] + for entry in TESTS: + filename = os.path.join(TEST_PATH, entry) + '.py' + cached.append(filename) + linecache.getline(filename, 1) + + # Are all files cached? + cached_empty = [fn for fn in cached if fn not in linecache.cache] + self.assertEquals(cached_empty, []) + + # Can we clear the cache? + linecache.clearcache() + cached_empty = [fn for fn in cached if fn in linecache.cache] + self.assertEquals(cached_empty, []) + + def test_checkcache(self): + getline = linecache.getline + try: + # Create a source file and cache its contents + source_name = os.path.join(TEST_PATH, 'linecache_test.py') + source = open(source_name, 'w') + source.write(SOURCE_1) + source.close() + getline(source_name, 1) + + # Keep a copy of the old contents + source_list = [] + source = open(source_name) + for index, line in enumerate(source): + self.assertEquals(line, getline(source_name, index + 1)) + source_list.append(line) + source.close() + + source = open(source_name, 'w') + source.write(SOURCE_2) + source.close() + + # Try to update a bogus cache entry + linecache.checkcache('dummy') + + # Check that the cache matches the old contents + for index, line in enumerate(source_list): + self.assertEquals(line, getline(source_name, index + 1)) + + # Update the cache and check whether it matches the new source file + linecache.checkcache(source_name) + source = open(source_name) + for index, line in enumerate(source): + self.assertEquals(line, getline(source_name, index + 1)) + source_list.append(line) + source.close() + + finally: + try: + source.close() + finally: + support.unlink(source_name) + +def test_main(): + support.run_unittest(LineCacheTests) + +if __name__ == "__main__": + test_main() |