blob: 34e0a9a82402ab124bf287f63ab50b4cb5d241a8 [file] [log] [blame]
Johannes Gijsberscb9015d2004-12-12 16:20:22 +00001import sys
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002import types
Johannes Gijsberscb9015d2004-12-12 16:20:22 +00003import unittest
4import inspect
R. David Murray19d8cc52010-06-17 02:06:12 +00005import linecache
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006import datetime
Guido van Rossum813b0e52007-05-21 18:11:34 +00007import collections
Christian Heimesa3538eb2007-11-06 11:44:48 +00008from os.path import normcase
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00009
Benjamin Petersonee8712c2008-05-20 21:35:26 +000010from test.support import TESTFN, run_unittest
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000011
Johannes Gijsberscb9015d2004-12-12 16:20:22 +000012from test import inspect_fodder as mod
13from test import inspect_fodder2 as mod2
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000014
R. David Murray74b89242009-05-13 17:33:03 +000015# C module for test_findsource_binary
R. David Murrayb5655772009-05-14 16:17:50 +000016import unicodedata
R. David Murray74b89242009-05-13 17:33:03 +000017
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000018# Functions tested in this suite:
19# ismodule, isclass, ismethod, isfunction, istraceback, isframe, iscode,
Christian Heimes7131fd92008-02-19 14:21:46 +000020# isbuiltin, isroutine, isgenerator, isgeneratorfunction, getmembers,
21# getdoc, getfile, getmodule, getsourcefile, getcomments, getsource,
22# getclasstree, getargspec, getargvalues, formatargspec, formatargvalues,
23# currentframe, stack, trace, isdatadescriptor
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000024
Nick Coghlanf088e5e2008-12-14 11:50:48 +000025# NOTE: There are some additional tests relating to interaction with
26# zipimport in the test_zipimport_support test module.
27
Johannes Gijsberscb9015d2004-12-12 16:20:22 +000028modfile = mod.__file__
Thomas Wouters0e3f5912006-08-11 14:57:12 +000029if modfile.endswith(('c', 'o')):
Johannes Gijsberscb9015d2004-12-12 16:20:22 +000030 modfile = modfile[:-1]
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000031
Christian Heimesa3538eb2007-11-06 11:44:48 +000032# Normalize file names: on Windows, the case of file names of compiled
33# modules depends on the path used to start the python executable.
34modfile = normcase(modfile)
35
36def revise(filename, *args):
37 return (normcase(filename),) + args
38
Georg Brandl1a3284e2007-12-02 09:40:06 +000039import builtins
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000040
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000041try:
42 1/0
43except:
Guido van Rossume7ba4952007-06-06 23:52:48 +000044 tb = sys.exc_info()[2]
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000045
Johannes Gijsberscb9015d2004-12-12 16:20:22 +000046git = mod.StupidGit()
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000047
Johannes Gijsberscb9015d2004-12-12 16:20:22 +000048class IsTestBase(unittest.TestCase):
49 predicates = set([inspect.isbuiltin, inspect.isclass, inspect.iscode,
50 inspect.isframe, inspect.isfunction, inspect.ismethod,
Christian Heimes7131fd92008-02-19 14:21:46 +000051 inspect.ismodule, inspect.istraceback,
52 inspect.isgenerator, inspect.isgeneratorfunction])
Tim Peters5a9fb3c2005-01-07 16:01:32 +000053
Johannes Gijsberscb9015d2004-12-12 16:20:22 +000054 def istest(self, predicate, exp):
55 obj = eval(exp)
Georg Brandlab91fde2009-08-13 08:51:18 +000056 self.assertTrue(predicate(obj), '%s(%s)' % (predicate.__name__, exp))
Tim Peters5a9fb3c2005-01-07 16:01:32 +000057
Johannes Gijsberscb9015d2004-12-12 16:20:22 +000058 for other in self.predicates - set([predicate]):
Christian Heimes7131fd92008-02-19 14:21:46 +000059 if predicate == inspect.isgeneratorfunction and\
60 other == inspect.isfunction:
61 continue
Georg Brandlab91fde2009-08-13 08:51:18 +000062 self.assertFalse(other(obj), 'not %s(%s)' % (other.__name__, exp))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000063
Christian Heimes7131fd92008-02-19 14:21:46 +000064def generator_function_example(self):
65 for i in range(2):
66 yield i
67
Johannes Gijsberscb9015d2004-12-12 16:20:22 +000068class TestPredicates(IsTestBase):
Christian Heimes227c8002008-03-03 20:34:40 +000069 def test_sixteen(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +000070 count = len([x for x in dir(inspect) if x.startswith('is')])
Christian Heimes7131fd92008-02-19 14:21:46 +000071 # This test is here for remember you to update Doc/library/inspect.rst
Christian Heimes78644762008-03-04 23:39:23 +000072 # which claims there are 16 such functions
Christian Heimes227c8002008-03-03 20:34:40 +000073 expected = 16
Thomas Wouters0e3f5912006-08-11 14:57:12 +000074 err_msg = "There are %d (not %d) is* functions" % (count, expected)
75 self.assertEqual(count, expected, err_msg)
Tim Peters5a9fb3c2005-01-07 16:01:32 +000076
Christian Heimes7131fd92008-02-19 14:21:46 +000077
Johannes Gijsberscb9015d2004-12-12 16:20:22 +000078 def test_excluding_predicates(self):
79 self.istest(inspect.isbuiltin, 'sys.exit')
80 self.istest(inspect.isbuiltin, '[].append')
Neal Norwitz221085d2007-02-25 20:55:47 +000081 self.istest(inspect.iscode, 'mod.spam.__code__')
Johannes Gijsberscb9015d2004-12-12 16:20:22 +000082 self.istest(inspect.isframe, 'tb.tb_frame')
83 self.istest(inspect.isfunction, 'mod.spam')
Christian Heimes4a22b5d2007-11-25 09:39:14 +000084 self.istest(inspect.isfunction, 'mod.StupidGit.abuse')
Johannes Gijsberscb9015d2004-12-12 16:20:22 +000085 self.istest(inspect.ismethod, 'git.argue')
86 self.istest(inspect.ismodule, 'mod')
87 self.istest(inspect.istraceback, 'tb')
Guido van Rossum813b0e52007-05-21 18:11:34 +000088 self.istest(inspect.isdatadescriptor, 'collections.defaultdict.default_factory')
Christian Heimes7131fd92008-02-19 14:21:46 +000089 self.istest(inspect.isgenerator, '(x for x in range(2))')
90 self.istest(inspect.isgeneratorfunction, 'generator_function_example')
Thomas Wouters0e3f5912006-08-11 14:57:12 +000091 if hasattr(types, 'GetSetDescriptorType'):
92 self.istest(inspect.isgetsetdescriptor,
93 'type(tb.tb_frame).f_locals')
94 else:
Georg Brandlab91fde2009-08-13 08:51:18 +000095 self.assertFalse(inspect.isgetsetdescriptor(type(tb.tb_frame).f_locals))
Thomas Wouters0e3f5912006-08-11 14:57:12 +000096 if hasattr(types, 'MemberDescriptorType'):
97 self.istest(inspect.ismemberdescriptor, 'datetime.timedelta.days')
98 else:
Georg Brandlab91fde2009-08-13 08:51:18 +000099 self.assertFalse(inspect.ismemberdescriptor(datetime.timedelta.days))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000100
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000101 def test_isroutine(self):
Georg Brandlab91fde2009-08-13 08:51:18 +0000102 self.assertTrue(inspect.isroutine(mod.spam))
103 self.assertTrue(inspect.isroutine([].count))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000104
Benjamin Petersonc4656002009-01-17 22:41:18 +0000105 def test_isclass(self):
106 self.istest(inspect.isclass, 'mod.StupidGit')
107 self.assertTrue(inspect.isclass(list))
108
109 class CustomGetattr(object):
110 def __getattr__(self, attr):
111 return None
112 self.assertFalse(inspect.isclass(CustomGetattr()))
113
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000114 def test_get_slot_members(self):
115 class C(object):
116 __slots__ = ("a", "b")
117
118 x = C()
119 x.a = 42
120 members = dict(inspect.getmembers(x))
Georg Brandlab91fde2009-08-13 08:51:18 +0000121 self.assertTrue('a' in members)
122 self.assertTrue('b' not in members)
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000123
Benjamin Peterson8f6713f2009-11-13 02:29:35 +0000124 def test_isabstract(self):
125 from abc import ABCMeta, abstractmethod
126
127 class AbstractClassExample(metaclass=ABCMeta):
128
129 @abstractmethod
130 def foo(self):
131 pass
132
133 class ClassExample(AbstractClassExample):
134 def foo(self):
135 pass
136
137 a = ClassExample()
138
139 # Test general behaviour.
140 self.assertTrue(inspect.isabstract(AbstractClassExample))
141 self.assertFalse(inspect.isabstract(ClassExample))
142 self.assertFalse(inspect.isabstract(a))
143 self.assertFalse(inspect.isabstract(int))
144 self.assertFalse(inspect.isabstract(5))
145
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000146
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000147class TestInterpreterStack(IsTestBase):
148 def __init__(self, *args, **kwargs):
149 unittest.TestCase.__init__(self, *args, **kwargs)
Tim Peters5a9fb3c2005-01-07 16:01:32 +0000150
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000151 git.abuse(7, 8, 9)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000152
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000153 def test_abuse_done(self):
154 self.istest(inspect.istraceback, 'git.ex[2]')
155 self.istest(inspect.isframe, 'mod.fr')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000156
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000157 def test_stack(self):
Georg Brandlab91fde2009-08-13 08:51:18 +0000158 self.assertTrue(len(mod.st) >= 5)
Christian Heimesa3538eb2007-11-06 11:44:48 +0000159 self.assertEqual(revise(*mod.st[0][1:]),
Tim Peters5a9fb3c2005-01-07 16:01:32 +0000160 (modfile, 16, 'eggs', [' st = inspect.stack()\n'], 0))
Christian Heimesa3538eb2007-11-06 11:44:48 +0000161 self.assertEqual(revise(*mod.st[1][1:]),
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000162 (modfile, 9, 'spam', [' eggs(b + d, c + f)\n'], 0))
Christian Heimesa3538eb2007-11-06 11:44:48 +0000163 self.assertEqual(revise(*mod.st[2][1:]),
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000164 (modfile, 43, 'argue', [' spam(a, b, c)\n'], 0))
Christian Heimesa3538eb2007-11-06 11:44:48 +0000165 self.assertEqual(revise(*mod.st[3][1:]),
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000166 (modfile, 39, 'abuse', [' self.argue(a, b, c)\n'], 0))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000167
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000168 def test_trace(self):
169 self.assertEqual(len(git.tr), 3)
Christian Heimesa3538eb2007-11-06 11:44:48 +0000170 self.assertEqual(revise(*git.tr[0][1:]),
171 (modfile, 43, 'argue', [' spam(a, b, c)\n'], 0))
172 self.assertEqual(revise(*git.tr[1][1:]),
173 (modfile, 9, 'spam', [' eggs(b + d, c + f)\n'], 0))
174 self.assertEqual(revise(*git.tr[2][1:]),
175 (modfile, 18, 'eggs', [' q = y / 0\n'], 0))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000176
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000177 def test_frame(self):
178 args, varargs, varkw, locals = inspect.getargvalues(mod.fr)
179 self.assertEqual(args, ['x', 'y'])
180 self.assertEqual(varargs, None)
181 self.assertEqual(varkw, None)
182 self.assertEqual(locals, {'x': 11, 'p': 11, 'y': 14})
183 self.assertEqual(inspect.formatargvalues(args, varargs, varkw, locals),
184 '(x=11, y=14)')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000185
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000186 def test_previous_frame(self):
187 args, varargs, varkw, locals = inspect.getargvalues(mod.fr.f_back)
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000188 self.assertEqual(args, ['a', 'b', 'c', 'd', 'e', 'f'])
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000189 self.assertEqual(varargs, 'g')
190 self.assertEqual(varkw, 'h')
191 self.assertEqual(inspect.formatargvalues(args, varargs, varkw, locals),
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000192 '(a=7, b=8, c=9, d=3, e=4, f=5, *g=(), **h={})')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000193
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000194class GetSourceBase(unittest.TestCase):
195 # Subclasses must override.
196 fodderFile = None
Tim Peters5a9fb3c2005-01-07 16:01:32 +0000197
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000198 def __init__(self, *args, **kwargs):
199 unittest.TestCase.__init__(self, *args, **kwargs)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000200
Philip Jenveya27c5bd2009-05-28 06:09:08 +0000201 with open(inspect.getsourcefile(self.fodderFile)) as fp:
202 self.source = fp.read()
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000203
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000204 def sourcerange(self, top, bottom):
205 lines = self.source.split("\n")
206 return "\n".join(lines[top-1:bottom]) + "\n"
Tim Peterse0b2d7a2001-09-22 06:10:55 +0000207
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000208 def assertSourceEqual(self, obj, top, bottom):
209 self.assertEqual(inspect.getsource(obj),
210 self.sourcerange(top, bottom))
Tim Peters5a9fb3c2005-01-07 16:01:32 +0000211
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000212class TestRetrievingSourceCode(GetSourceBase):
213 fodderFile = mod
Tim Peters5a9fb3c2005-01-07 16:01:32 +0000214
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000215 def test_getclasses(self):
216 classes = inspect.getmembers(mod, inspect.isclass)
217 self.assertEqual(classes,
218 [('FesteringGob', mod.FesteringGob),
219 ('MalodorousPervert', mod.MalodorousPervert),
220 ('ParrotDroppings', mod.ParrotDroppings),
221 ('StupidGit', mod.StupidGit)])
222 tree = inspect.getclasstree([cls[1] for cls in classes], 1)
223 self.assertEqual(tree,
Thomas Wouters725af872006-04-15 09:13:19 +0000224 [(object, ()),
225 [(mod.ParrotDroppings, (object,)),
226 (mod.StupidGit, (object,)),
227 [(mod.MalodorousPervert, (mod.StupidGit,)),
228 [(mod.FesteringGob, (mod.MalodorousPervert,
229 mod.ParrotDroppings))
230 ]
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000231 ]
232 ]
233 ])
Tim Peters5a9fb3c2005-01-07 16:01:32 +0000234
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000235 def test_getfunctions(self):
236 functions = inspect.getmembers(mod, inspect.isfunction)
237 self.assertEqual(functions, [('eggs', mod.eggs),
238 ('spam', mod.spam)])
Johannes Gijsbersc473c992004-08-18 12:40:31 +0000239
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000240 def test_getdoc(self):
241 self.assertEqual(inspect.getdoc(mod), 'A module docstring.')
242 self.assertEqual(inspect.getdoc(mod.StupidGit),
243 'A longer,\n\nindented\n\ndocstring.')
244 self.assertEqual(inspect.getdoc(git.abuse),
245 'Another\n\ndocstring\n\ncontaining\n\ntabs')
Johannes Gijsbersc473c992004-08-18 12:40:31 +0000246
Georg Brandl0c77a822008-06-10 16:37:50 +0000247 def test_cleandoc(self):
248 self.assertEqual(inspect.cleandoc('An\n indented\n docstring.'),
249 'An\nindented\ndocstring.')
250
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000251 def test_getcomments(self):
252 self.assertEqual(inspect.getcomments(mod), '# line 1\n')
253 self.assertEqual(inspect.getcomments(mod.StupidGit), '# line 20\n')
Johannes Gijsbersc473c992004-08-18 12:40:31 +0000254
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000255 def test_getmodule(self):
Thomas Wouters89f507f2006-12-13 04:49:30 +0000256 # Check actual module
257 self.assertEqual(inspect.getmodule(mod), mod)
258 # Check class (uses __module__ attribute)
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000259 self.assertEqual(inspect.getmodule(mod.StupidGit), mod)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000260 # Check a method (no __module__ attribute, falls back to filename)
261 self.assertEqual(inspect.getmodule(mod.StupidGit.abuse), mod)
262 # Do it again (check the caching isn't broken)
263 self.assertEqual(inspect.getmodule(mod.StupidGit.abuse), mod)
264 # Check a builtin
Georg Brandl1a3284e2007-12-02 09:40:06 +0000265 self.assertEqual(inspect.getmodule(str), sys.modules["builtins"])
Thomas Wouters89f507f2006-12-13 04:49:30 +0000266 # Check filename override
267 self.assertEqual(inspect.getmodule(None, modfile), mod)
Johannes Gijsbersc473c992004-08-18 12:40:31 +0000268
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000269 def test_getsource(self):
270 self.assertSourceEqual(git.abuse, 29, 39)
271 self.assertSourceEqual(mod.StupidGit, 21, 46)
Johannes Gijsbersc473c992004-08-18 12:40:31 +0000272
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000273 def test_getsourcefile(self):
Christian Heimesa3538eb2007-11-06 11:44:48 +0000274 self.assertEqual(normcase(inspect.getsourcefile(mod.spam)), modfile)
275 self.assertEqual(normcase(inspect.getsourcefile(git.abuse)), modfile)
R. David Murray19d8cc52010-06-17 02:06:12 +0000276 fn = "_non_existing_filename_used_for_sourcefile_test.py"
277 co = compile("None", fn, "exec")
R. David Murray0217eb82010-06-17 13:27:40 +0000278 self.assertEqual(inspect.getsourcefile(co), None)
R. David Murray19d8cc52010-06-17 02:06:12 +0000279 linecache.cache[co.co_filename] = (1, None, "None", co.co_filename)
280 self.assertEqual(normcase(inspect.getsourcefile(co)), fn)
Johannes Gijsbersc473c992004-08-18 12:40:31 +0000281
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000282 def test_getfile(self):
283 self.assertEqual(inspect.getfile(mod.StupidGit), mod.__file__)
Johannes Gijsbersc473c992004-08-18 12:40:31 +0000284
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000285 def test_getmodule_recursion(self):
Christian Heimes45f9af32007-11-27 21:50:00 +0000286 from types import ModuleType
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000287 name = '__inspect_dummy'
Christian Heimes45f9af32007-11-27 21:50:00 +0000288 m = sys.modules[name] = ModuleType(name)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000289 m.__file__ = "<string>" # hopefully not a real filename...
290 m.__loader__ = "dummy" # pretend the filename is understood by a loader
Georg Brandl7cae87c2006-09-06 06:51:57 +0000291 exec("def x(): pass", m.__dict__)
Neal Norwitz221085d2007-02-25 20:55:47 +0000292 self.assertEqual(inspect.getsourcefile(m.x.__code__), '<string>')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000293 del sys.modules[name]
294 inspect.getmodule(compile('a=10','','single'))
295
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000296class TestDecorators(GetSourceBase):
297 fodderFile = mod2
Johannes Gijsbersc473c992004-08-18 12:40:31 +0000298
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000299 def test_wrapped_decorator(self):
Christian Heimes09aaa882008-02-23 15:01:06 +0000300 self.assertSourceEqual(mod2.wrapped, 14, 17)
Johannes Gijsbersc473c992004-08-18 12:40:31 +0000301
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000302 def test_replacing_decorator(self):
303 self.assertSourceEqual(mod2.gone, 9, 10)
Tim Peterse0b2d7a2001-09-22 06:10:55 +0000304
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000305class TestOneliners(GetSourceBase):
306 fodderFile = mod2
307 def test_oneline_lambda(self):
308 # Test inspect.getsource with a one-line lambda function.
309 self.assertSourceEqual(mod2.oll, 25, 25)
Tim Peters5a9fb3c2005-01-07 16:01:32 +0000310
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000311 def test_threeline_lambda(self):
312 # Test inspect.getsource with a three-line lambda function,
313 # where the second and third lines are _not_ indented.
Tim Peters5a9fb3c2005-01-07 16:01:32 +0000314 self.assertSourceEqual(mod2.tll, 28, 30)
315
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000316 def test_twoline_indented_lambda(self):
317 # Test inspect.getsource with a two-line lambda function,
318 # where the second line _is_ indented.
319 self.assertSourceEqual(mod2.tlli, 33, 34)
Tim Peters5a9fb3c2005-01-07 16:01:32 +0000320
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000321 def test_onelinefunc(self):
322 # Test inspect.getsource with a regular one-line function.
323 self.assertSourceEqual(mod2.onelinefunc, 37, 37)
Tim Peters5a9fb3c2005-01-07 16:01:32 +0000324
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000325 def test_manyargs(self):
326 # Test inspect.getsource with a regular function where
327 # the arguments are on two lines and _not_ indented and
328 # the body on the second line with the last arguments.
329 self.assertSourceEqual(mod2.manyargs, 40, 41)
Tim Peters5a9fb3c2005-01-07 16:01:32 +0000330
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000331 def test_twolinefunc(self):
332 # Test inspect.getsource with a regular function where
333 # the body is on two lines, following the argument list and
334 # continued on the next line by a \\.
335 self.assertSourceEqual(mod2.twolinefunc, 44, 45)
Tim Peters5a9fb3c2005-01-07 16:01:32 +0000336
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000337 def test_lambda_in_list(self):
338 # Test inspect.getsource with a one-line lambda function
339 # defined in a list, indented.
340 self.assertSourceEqual(mod2.a[1], 49, 49)
Tim Peters5a9fb3c2005-01-07 16:01:32 +0000341
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000342 def test_anonymous(self):
343 # Test inspect.getsource with a lambda function defined
344 # as argument to another function.
345 self.assertSourceEqual(mod2.anonymous, 55, 55)
346
Johannes Gijsbersa5855d52005-03-12 16:37:11 +0000347class TestBuggyCases(GetSourceBase):
348 fodderFile = mod2
349
350 def test_with_comment(self):
351 self.assertSourceEqual(mod2.with_comment, 58, 59)
352
353 def test_multiline_sig(self):
354 self.assertSourceEqual(mod2.multiline_sig[0], 63, 64)
355
Armin Rigodd5c0232005-09-25 11:45:45 +0000356 def test_nested_class(self):
357 self.assertSourceEqual(mod2.func69().func71, 71, 72)
358
359 def test_one_liner_followed_by_non_name(self):
360 self.assertSourceEqual(mod2.func77, 77, 77)
361
362 def test_one_liner_dedent_non_name(self):
363 self.assertSourceEqual(mod2.cls82.func83, 83, 83)
364
365 def test_with_comment_instead_of_docstring(self):
366 self.assertSourceEqual(mod2.func88, 88, 90)
367
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000368 def test_method_in_dynamic_class(self):
369 self.assertSourceEqual(mod2.method_in_dynamic_class, 95, 97)
370
R. David Murrayb5655772009-05-14 16:17:50 +0000371 @unittest.skipIf(
372 not hasattr(unicodedata, '__file__') or
373 unicodedata.__file__[-4:] in (".pyc", ".pyo"),
374 "unicodedata is not an external binary module")
R. David Murray74b89242009-05-13 17:33:03 +0000375 def test_findsource_binary(self):
R. David Murrayb5655772009-05-14 16:17:50 +0000376 self.assertRaises(IOError, inspect.getsource, unicodedata)
377 self.assertRaises(IOError, inspect.findsource, unicodedata)
R. David Murray74b89242009-05-13 17:33:03 +0000378
R. David Murray19d8cc52010-06-17 02:06:12 +0000379 def test_findsource_code_in_linecache(self):
380 lines = ["x=1"]
381 co = compile(lines[0], "_dynamically_created_file", "exec")
382 self.assertRaises(IOError, inspect.findsource, co)
383 self.assertRaises(IOError, inspect.getsource, co)
384 linecache.cache[co.co_filename] = (1, None, lines, co.co_filename)
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000385 self.assertEqual(inspect.findsource(co), (lines,0))
386 self.assertEqual(inspect.getsource(co), lines[0])
R. David Murray19d8cc52010-06-17 02:06:12 +0000387
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000388# Helper for testing classify_class_attrs.
Tim Peters13b49d32001-09-23 02:00:29 +0000389def attrs_wo_objs(cls):
390 return [t[:3] for t in inspect.classify_class_attrs(cls)]
391
Tim Peters5a9fb3c2005-01-07 16:01:32 +0000392class TestClassesAndFunctions(unittest.TestCase):
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000393 def test_newstyle_mro(self):
394 # The same w/ new-class MRO.
395 class A(object): pass
396 class B(A): pass
397 class C(A): pass
398 class D(B, C): pass
Tim Peters13b49d32001-09-23 02:00:29 +0000399
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000400 expected = (D, B, C, A, object)
401 got = inspect.getmro(D)
402 self.assertEqual(expected, got)
Tim Peters13b49d32001-09-23 02:00:29 +0000403
Christian Heimes3795b532007-11-08 13:48:53 +0000404 def assertArgSpecEquals(self, routine, args_e, varargs_e=None,
405 varkw_e=None, defaults_e=None, formatted=None):
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000406 args, varargs, varkw, defaults = inspect.getargspec(routine)
407 self.assertEqual(args, args_e)
408 self.assertEqual(varargs, varargs_e)
409 self.assertEqual(varkw, varkw_e)
410 self.assertEqual(defaults, defaults_e)
411 if formatted is not None:
412 self.assertEqual(inspect.formatargspec(args, varargs, varkw, defaults),
413 formatted)
Tim Peters13b49d32001-09-23 02:00:29 +0000414
Christian Heimes3795b532007-11-08 13:48:53 +0000415 def assertFullArgSpecEquals(self, routine, args_e, varargs_e=None,
416 varkw_e=None, defaults_e=None,
417 kwonlyargs_e=[], kwonlydefaults_e=None,
418 ann_e={}, formatted=None):
419 args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, ann = \
420 inspect.getfullargspec(routine)
421 self.assertEqual(args, args_e)
422 self.assertEqual(varargs, varargs_e)
423 self.assertEqual(varkw, varkw_e)
424 self.assertEqual(defaults, defaults_e)
425 self.assertEqual(kwonlyargs, kwonlyargs_e)
426 self.assertEqual(kwonlydefaults, kwonlydefaults_e)
427 self.assertEqual(ann, ann_e)
428 if formatted is not None:
429 self.assertEqual(inspect.formatargspec(args, varargs, varkw, defaults,
430 kwonlyargs, kwonlydefaults, ann),
431 formatted)
432
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000433 def test_getargspec(self):
Christian Heimes3795b532007-11-08 13:48:53 +0000434 self.assertArgSpecEquals(mod.eggs, ['x', 'y'], formatted='(x, y)')
Tim Peters13b49d32001-09-23 02:00:29 +0000435
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000436 self.assertArgSpecEquals(mod.spam,
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000437 ['a', 'b', 'c', 'd', 'e', 'f'],
438 'g', 'h', (3, 4, 5),
439 '(a, b, c, d=3, e=4, f=5, *g, **h)')
Tim Peters13b49d32001-09-23 02:00:29 +0000440
Christian Heimes3795b532007-11-08 13:48:53 +0000441 self.assertRaises(ValueError, self.assertArgSpecEquals,
442 mod2.keyworded, [])
443
444 self.assertRaises(ValueError, self.assertArgSpecEquals,
445 mod2.annotated, [])
Benjamin Peterson9953a8d2009-01-17 04:15:01 +0000446 self.assertRaises(ValueError, self.assertArgSpecEquals,
447 mod2.keyword_only_arg, [])
448
Christian Heimes3795b532007-11-08 13:48:53 +0000449
450 def test_getfullargspec(self):
451 self.assertFullArgSpecEquals(mod2.keyworded, [], varargs_e='arg1',
452 kwonlyargs_e=['arg2'],
453 kwonlydefaults_e={'arg2':1},
454 formatted='(*arg1, arg2=1)')
455
456 self.assertFullArgSpecEquals(mod2.annotated, ['arg1'],
Christian Heimesc9543e42007-11-28 08:28:28 +0000457 ann_e={'arg1' : list},
Christian Heimes3795b532007-11-08 13:48:53 +0000458 formatted='(arg1: list)')
Benjamin Peterson9953a8d2009-01-17 04:15:01 +0000459 self.assertFullArgSpecEquals(mod2.keyword_only_arg, [],
460 kwonlyargs_e=['arg'],
461 formatted='(*, arg)')
462
Christian Heimes3795b532007-11-08 13:48:53 +0000463
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000464 def test_getargspec_method(self):
465 class A(object):
466 def m(self):
467 pass
468 self.assertArgSpecEquals(A.m, ['self'])
Tim Peters13b49d32001-09-23 02:00:29 +0000469
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000470 def test_classify_newstyle(self):
471 class A(object):
Tim Peters13b49d32001-09-23 02:00:29 +0000472
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000473 def s(): pass
474 s = staticmethod(s)
Tim Peters13b49d32001-09-23 02:00:29 +0000475
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000476 def c(cls): pass
477 c = classmethod(c)
Tim Peters13b49d32001-09-23 02:00:29 +0000478
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000479 def getp(self): pass
480 p = property(getp)
Tim Peters13b49d32001-09-23 02:00:29 +0000481
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000482 def m(self): pass
Tim Peters13b49d32001-09-23 02:00:29 +0000483
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000484 def m1(self): pass
Tim Peters13b49d32001-09-23 02:00:29 +0000485
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000486 datablob = '1'
Tim Peters13b49d32001-09-23 02:00:29 +0000487
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000488 attrs = attrs_wo_objs(A)
Georg Brandlab91fde2009-08-13 08:51:18 +0000489 self.assertTrue(('s', 'static method', A) in attrs, 'missing static method')
490 self.assertTrue(('c', 'class method', A) in attrs, 'missing class method')
491 self.assertTrue(('p', 'property', A) in attrs, 'missing property')
492 self.assertTrue(('m', 'method', A) in attrs,
Christian Heimes4a22b5d2007-11-25 09:39:14 +0000493 'missing plain method: %r' % attrs)
Georg Brandlab91fde2009-08-13 08:51:18 +0000494 self.assertTrue(('m1', 'method', A) in attrs, 'missing plain method')
495 self.assertTrue(('datablob', 'data', A) in attrs, 'missing data')
Tim Peters13b49d32001-09-23 02:00:29 +0000496
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000497 class B(A):
Tim Peters13b49d32001-09-23 02:00:29 +0000498
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000499 def m(self): pass
Tim Peters13b49d32001-09-23 02:00:29 +0000500
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000501 attrs = attrs_wo_objs(B)
Georg Brandlab91fde2009-08-13 08:51:18 +0000502 self.assertTrue(('s', 'static method', A) in attrs, 'missing static method')
503 self.assertTrue(('c', 'class method', A) in attrs, 'missing class method')
504 self.assertTrue(('p', 'property', A) in attrs, 'missing property')
505 self.assertTrue(('m', 'method', B) in attrs, 'missing plain method')
506 self.assertTrue(('m1', 'method', A) in attrs, 'missing plain method')
507 self.assertTrue(('datablob', 'data', A) in attrs, 'missing data')
Tim Peters13b49d32001-09-23 02:00:29 +0000508
509
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000510 class C(A):
Tim Peters13b49d32001-09-23 02:00:29 +0000511
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000512 def m(self): pass
513 def c(self): pass
Tim Peters13b49d32001-09-23 02:00:29 +0000514
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000515 attrs = attrs_wo_objs(C)
Georg Brandlab91fde2009-08-13 08:51:18 +0000516 self.assertTrue(('s', 'static method', A) in attrs, 'missing static method')
517 self.assertTrue(('c', 'method', C) in attrs, 'missing plain method')
518 self.assertTrue(('p', 'property', A) in attrs, 'missing property')
519 self.assertTrue(('m', 'method', C) in attrs, 'missing plain method')
520 self.assertTrue(('m1', 'method', A) in attrs, 'missing plain method')
521 self.assertTrue(('datablob', 'data', A) in attrs, 'missing data')
Tim Peters13b49d32001-09-23 02:00:29 +0000522
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000523 class D(B, C):
Tim Peters13b49d32001-09-23 02:00:29 +0000524
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000525 def m1(self): pass
Tim Peters13b49d32001-09-23 02:00:29 +0000526
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000527 attrs = attrs_wo_objs(D)
Georg Brandlab91fde2009-08-13 08:51:18 +0000528 self.assertTrue(('s', 'static method', A) in attrs, 'missing static method')
529 self.assertTrue(('c', 'method', C) in attrs, 'missing plain method')
530 self.assertTrue(('p', 'property', A) in attrs, 'missing property')
531 self.assertTrue(('m', 'method', B) in attrs, 'missing plain method')
532 self.assertTrue(('m1', 'method', D) in attrs, 'missing plain method')
533 self.assertTrue(('datablob', 'data', A) in attrs, 'missing data')
Jeremy Hyltonc4bf5ed2003-06-27 18:43:12 +0000534
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000535def test_main():
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000536 run_unittest(TestDecorators, TestRetrievingSourceCode, TestOneliners,
Johannes Gijsbersa5855d52005-03-12 16:37:11 +0000537 TestBuggyCases,
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000538 TestInterpreterStack, TestClassesAndFunctions, TestPredicates)
Martin v. Löwis893ffa42003-10-31 15:35:53 +0000539
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000540if __name__ == "__main__":
541 test_main()