blob: 3715c8a1b06249c976e94d7fcd1c1848956b9197 [file] [log] [blame]
Georg Brandl991f9202009-05-05 08:31:54 +00001""" Tests for the linecache module """
2
3import linecache
4import unittest
5import os.path
6from test import 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__)
Benjamin Petersonbed7d042009-07-19 21:01:52 +000015MODULES = "linecache abc".split()
Georg Brandl991f9202009-05-05 08:31:54 +000016MODULE_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
R. David Murrayba311052009-12-04 00:09:14 +000086 source_name = support.TESTFN + '.py'
87 with open(source_name, 'w') as source:
88 source.write(SOURCE_1)
89 source.close()
90 getline(source_name, 1)
Georg Brandl991f9202009-05-05 08:31:54 +000091
R. David Murrayba311052009-12-04 00:09:14 +000092 # 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()
Georg Brandl991f9202009-05-05 08:31:54 +000099
R. David Murrayba311052009-12-04 00:09:14 +0000100 source = open(source_name, 'w')
101 source.write(SOURCE_2)
102 source.close()
Georg Brandl991f9202009-05-05 08:31:54 +0000103
R. David Murrayba311052009-12-04 00:09:14 +0000104 # Try to update a bogus cache entry
105 linecache.checkcache('dummy')
Georg Brandl991f9202009-05-05 08:31:54 +0000106
R. David Murrayba311052009-12-04 00:09:14 +0000107 # 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))
Georg Brandl991f9202009-05-05 08:31:54 +0000110
R. David Murrayba311052009-12-04 00:09:14 +0000111 # 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)
Georg Brandl991f9202009-05-05 08:31:54 +0000117
118 finally:
R. David Murrayba311052009-12-04 00:09:14 +0000119 support.unlink(source_name)
Georg Brandl991f9202009-05-05 08:31:54 +0000120
121def test_main():
122 support.run_unittest(LineCacheTests)
123
124if __name__ == "__main__":
125 test_main()