PageRenderTime 28ms CodeModel.GetById 19ms app.highlight 6ms RepoModel.GetById 1ms app.codeStats 1ms

/Lib/test/test_linecache.py

http://unladen-swallow.googlecode.com/
Python | 129 lines | 106 code | 15 blank | 8 comment | 18 complexity | d6f6cd34788876ee71e6c037ccce5345 MD5 | raw file
  1""" Tests for the linecache module """
  2
  3import linecache
  4import unittest
  5import os.path
  6from test import test_support as support
  7
  8
  9FILENAME = linecache.__file__
 10INVALID_NAME = '!@$)(!@#_1'
 11EMPTY = ''
 12TESTS = 'cjkencodings_test inspect_fodder inspect_fodder2 mapping_tests'
 13TESTS = TESTS.split()
 14TEST_PATH = os.path.dirname(support.__file__)
 15MODULES = "linecache unittest".split()
 16MODULE_PATH = os.path.dirname(FILENAME)
 17
 18SOURCE_1 = '''
 19" Docstring "
 20
 21def function():
 22    return result
 23
 24'''
 25
 26SOURCE_2 = '''
 27def f():
 28    return 1 + 1
 29
 30a = f()
 31
 32'''
 33
 34class LineCacheTests(unittest.TestCase):
 35
 36    def test_getline(self):
 37        getline = linecache.getline
 38
 39        # Bad values for line number should return an empty string
 40        self.assertEquals(getline(FILENAME, 2**15), EMPTY)
 41        self.assertEquals(getline(FILENAME, -1), EMPTY)
 42
 43        # Float values currently raise TypeError, should it?
 44        self.assertRaises(TypeError, getline, FILENAME, 1.1)
 45
 46        # Bad filenames should return an empty string
 47        self.assertEquals(getline(EMPTY, 1), EMPTY)
 48        self.assertEquals(getline(INVALID_NAME, 1), EMPTY)
 49
 50        # Check whether lines correspond to those from file iteration
 51        for entry in TESTS:
 52            filename = os.path.join(TEST_PATH, entry) + '.py'
 53            for index, line in enumerate(open(filename)):
 54                self.assertEquals(line, getline(filename, index + 1))
 55
 56        # Check module loading
 57        for entry in MODULES:
 58            filename = os.path.join(MODULE_PATH, entry) + '.py'
 59            for index, line in enumerate(open(filename)):
 60                self.assertEquals(line, getline(filename, index + 1))
 61
 62        # Check that bogus data isn't returned (issue #1309567)
 63        empty = linecache.getlines('a/b/c/__init__.py')
 64        self.assertEquals(empty, [])
 65
 66    def test_clearcache(self):
 67        cached = []
 68        for entry in TESTS:
 69            filename = os.path.join(TEST_PATH, entry) + '.py'
 70            cached.append(filename)
 71            linecache.getline(filename, 1)
 72
 73        # Are all files cached?
 74        cached_empty = [fn for fn in cached if fn not in linecache.cache]
 75        self.assertEquals(cached_empty, [])
 76
 77        # Can we clear the cache?
 78        linecache.clearcache()
 79        cached_empty = [fn for fn in cached if fn in linecache.cache]
 80        self.assertEquals(cached_empty, [])
 81
 82    def test_checkcache(self):
 83        getline = linecache.getline
 84        try:
 85            # Create a source file and cache its contents
 86            source_name = os.path.join(TEST_PATH, 'linecache_test.py')
 87            source = open(source_name, 'w')
 88            source.write(SOURCE_1)
 89            source.close()
 90            getline(source_name, 1)
 91
 92            # Keep a copy of the old contents
 93            source_list = []
 94            source = open(source_name)
 95            for index, line in enumerate(source):
 96                self.assertEquals(line, getline(source_name, index + 1))
 97                source_list.append(line)
 98            source.close()
 99
100            source = open(source_name, 'w')
101            source.write(SOURCE_2)
102            source.close()
103
104            # Try to update a bogus cache entry
105            linecache.checkcache('dummy')
106
107            # Check that the cache matches the old contents
108            for index, line in enumerate(source_list):
109                self.assertEquals(line, getline(source_name, index + 1))
110
111            # Update the cache and check whether it matches the new source file
112            linecache.checkcache(source_name)
113            source = open(source_name)
114            for index, line in enumerate(source):
115                self.assertEquals(line, getline(source_name, index + 1))
116                source_list.append(line)
117            source.close()
118
119        finally:
120            try:
121                source.close()
122            finally:
123                support.unlink(source_name)
124
125def test_main():
126    support.run_unittest(LineCacheTests)
127
128if __name__ == "__main__":
129    test_main()