blob: c1df23e851b6a870d7bce75c05cf261f47344dd6 [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
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005import datetime
Guido van Rossum813b0e52007-05-21 18:11:34 +00006import collections
Christian Heimesa3538eb2007-11-06 11:44:48 +00007from os.path import normcase
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +00008
Benjamin Petersonee8712c2008-05-20 21:35:26 +00009from test.support import TESTFN, run_unittest
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000010
Johannes Gijsberscb9015d2004-12-12 16:20:22 +000011from test import inspect_fodder as mod
12from test import inspect_fodder2 as mod2
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000013
R. David Murray74b89242009-05-13 17:33:03 +000014# C module for test_findsource_binary
R. David Murrayb5655772009-05-14 16:17:50 +000015import unicodedata
R. David Murray74b89242009-05-13 17:33:03 +000016
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000017# Functions tested in this suite:
18# ismodule, isclass, ismethod, isfunction, istraceback, isframe, iscode,
Christian Heimes7131fd92008-02-19 14:21:46 +000019# isbuiltin, isroutine, isgenerator, isgeneratorfunction, getmembers,
20# getdoc, getfile, getmodule, getsourcefile, getcomments, getsource,
21# getclasstree, getargspec, getargvalues, formatargspec, formatargvalues,
22# currentframe, stack, trace, isdatadescriptor
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000023
Nick Coghlanf088e5e2008-12-14 11:50:48 +000024# NOTE: There are some additional tests relating to interaction with
25# zipimport in the test_zipimport_support test module.
26
Johannes Gijsberscb9015d2004-12-12 16:20:22 +000027modfile = mod.__file__
Thomas Wouters0e3f5912006-08-11 14:57:12 +000028if modfile.endswith(('c', 'o')):
Johannes Gijsberscb9015d2004-12-12 16:20:22 +000029 modfile = modfile[:-1]
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000030
Christian Heimesa3538eb2007-11-06 11:44:48 +000031# Normalize file names: on Windows, the case of file names of compiled
32# modules depends on the path used to start the python executable.
33modfile = normcase(modfile)
34
35def revise(filename, *args):
36 return (normcase(filename),) + args
37
Georg Brandl1a3284e2007-12-02 09:40:06 +000038import builtins
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000039
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000040try:
41 1/0
42except:
Guido van Rossume7ba4952007-06-06 23:52:48 +000043 tb = sys.exc_info()[2]
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000044
Johannes Gijsberscb9015d2004-12-12 16:20:22 +000045git = mod.StupidGit()
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000046
Johannes Gijsberscb9015d2004-12-12 16:20:22 +000047class IsTestBase(unittest.TestCase):
48 predicates = set([inspect.isbuiltin, inspect.isclass, inspect.iscode,
49 inspect.isframe, inspect.isfunction, inspect.ismethod,
Christian Heimes7131fd92008-02-19 14:21:46 +000050 inspect.ismodule, inspect.istraceback,
51 inspect.isgenerator, inspect.isgeneratorfunction])
Tim Peters5a9fb3c2005-01-07 16:01:32 +000052
Johannes Gijsberscb9015d2004-12-12 16:20:22 +000053 def istest(self, predicate, exp):
54 obj = eval(exp)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000055 self.assertTrue(predicate(obj), '%s(%s)' % (predicate.__name__, exp))
Tim Peters5a9fb3c2005-01-07 16:01:32 +000056
Johannes Gijsberscb9015d2004-12-12 16:20:22 +000057 for other in self.predicates - set([predicate]):
Christian Heimes7131fd92008-02-19 14:21:46 +000058 if predicate == inspect.isgeneratorfunction and\
59 other == inspect.isfunction:
60 continue
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000061 self.assertFalse(other(obj), 'not %s(%s)' % (other.__name__, exp))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000062
Christian Heimes7131fd92008-02-19 14:21:46 +000063def generator_function_example(self):
64 for i in range(2):
65 yield i
66
Johannes Gijsberscb9015d2004-12-12 16:20:22 +000067class TestPredicates(IsTestBase):
Christian Heimes227c8002008-03-03 20:34:40 +000068 def test_sixteen(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +000069 count = len([x for x in dir(inspect) if x.startswith('is')])
Christian Heimes7131fd92008-02-19 14:21:46 +000070 # This test is here for remember you to update Doc/library/inspect.rst
Christian Heimes78644762008-03-04 23:39:23 +000071 # which claims there are 16 such functions
Christian Heimes227c8002008-03-03 20:34:40 +000072 expected = 16
Thomas Wouters0e3f5912006-08-11 14:57:12 +000073 err_msg = "There are %d (not %d) is* functions" % (count, expected)
74 self.assertEqual(count, expected, err_msg)
Tim Peters5a9fb3c2005-01-07 16:01:32 +000075
Christian Heimes7131fd92008-02-19 14:21:46 +000076
Johannes Gijsberscb9015d2004-12-12 16:20:22 +000077 def test_excluding_predicates(self):
78 self.istest(inspect.isbuiltin, 'sys.exit')
79 self.istest(inspect.isbuiltin, '[].append')
Neal Norwitz221085d2007-02-25 20:55:47 +000080 self.istest(inspect.iscode, 'mod.spam.__code__')
Johannes Gijsberscb9015d2004-12-12 16:20:22 +000081 self.istest(inspect.isframe, 'tb.tb_frame')
82 self.istest(inspect.isfunction, 'mod.spam')
Christian Heimes4a22b5d2007-11-25 09:39:14 +000083 self.istest(inspect.isfunction, 'mod.StupidGit.abuse')
Johannes Gijsberscb9015d2004-12-12 16:20:22 +000084 self.istest(inspect.ismethod, 'git.argue')
85 self.istest(inspect.ismodule, 'mod')
86 self.istest(inspect.istraceback, 'tb')
Guido van Rossum813b0e52007-05-21 18:11:34 +000087 self.istest(inspect.isdatadescriptor, 'collections.defaultdict.default_factory')
Christian Heimes7131fd92008-02-19 14:21:46 +000088 self.istest(inspect.isgenerator, '(x for x in range(2))')
89 self.istest(inspect.isgeneratorfunction, 'generator_function_example')
Thomas Wouters0e3f5912006-08-11 14:57:12 +000090 if hasattr(types, 'GetSetDescriptorType'):
91 self.istest(inspect.isgetsetdescriptor,
92 'type(tb.tb_frame).f_locals')
93 else:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000094 self.assertFalse(inspect.isgetsetdescriptor(type(tb.tb_frame).f_locals))
Thomas Wouters0e3f5912006-08-11 14:57:12 +000095 if hasattr(types, 'MemberDescriptorType'):
96 self.istest(inspect.ismemberdescriptor, 'datetime.timedelta.days')
97 else:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000098 self.assertFalse(inspect.ismemberdescriptor(datetime.timedelta.days))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +000099
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000100 def test_isroutine(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000101 self.assertTrue(inspect.isroutine(mod.spam))
102 self.assertTrue(inspect.isroutine([].count))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000103
Benjamin Petersonc4656002009-01-17 22:41:18 +0000104 def test_isclass(self):
105 self.istest(inspect.isclass, 'mod.StupidGit')
106 self.assertTrue(inspect.isclass(list))
107
108 class CustomGetattr(object):
109 def __getattr__(self, attr):
110 return None
111 self.assertFalse(inspect.isclass(CustomGetattr()))
112
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000113 def test_get_slot_members(self):
114 class C(object):
115 __slots__ = ("a", "b")
116
117 x = C()
118 x.a = 42
119 members = dict(inspect.getmembers(x))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000120 self.assertTrue('a' in members)
121 self.assertTrue('b' not in members)
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000122
123
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000124class TestInterpreterStack(IsTestBase):
125 def __init__(self, *args, **kwargs):
126 unittest.TestCase.__init__(self, *args, **kwargs)
Tim Peters5a9fb3c2005-01-07 16:01:32 +0000127
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000128 git.abuse(7, 8, 9)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000129
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000130 def test_abuse_done(self):
131 self.istest(inspect.istraceback, 'git.ex[2]')
132 self.istest(inspect.isframe, 'mod.fr')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000133
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000134 def test_stack(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000135 self.assertTrue(len(mod.st) >= 5)
Christian Heimesa3538eb2007-11-06 11:44:48 +0000136 self.assertEqual(revise(*mod.st[0][1:]),
Tim Peters5a9fb3c2005-01-07 16:01:32 +0000137 (modfile, 16, 'eggs', [' st = inspect.stack()\n'], 0))
Christian Heimesa3538eb2007-11-06 11:44:48 +0000138 self.assertEqual(revise(*mod.st[1][1:]),
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000139 (modfile, 9, 'spam', [' eggs(b + d, c + f)\n'], 0))
Christian Heimesa3538eb2007-11-06 11:44:48 +0000140 self.assertEqual(revise(*mod.st[2][1:]),
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000141 (modfile, 43, 'argue', [' spam(a, b, c)\n'], 0))
Christian Heimesa3538eb2007-11-06 11:44:48 +0000142 self.assertEqual(revise(*mod.st[3][1:]),
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000143 (modfile, 39, 'abuse', [' self.argue(a, b, c)\n'], 0))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000144
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000145 def test_trace(self):
146 self.assertEqual(len(git.tr), 3)
Christian Heimesa3538eb2007-11-06 11:44:48 +0000147 self.assertEqual(revise(*git.tr[0][1:]),
148 (modfile, 43, 'argue', [' spam(a, b, c)\n'], 0))
149 self.assertEqual(revise(*git.tr[1][1:]),
150 (modfile, 9, 'spam', [' eggs(b + d, c + f)\n'], 0))
151 self.assertEqual(revise(*git.tr[2][1:]),
152 (modfile, 18, 'eggs', [' q = y / 0\n'], 0))
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000153
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000154 def test_frame(self):
155 args, varargs, varkw, locals = inspect.getargvalues(mod.fr)
156 self.assertEqual(args, ['x', 'y'])
157 self.assertEqual(varargs, None)
158 self.assertEqual(varkw, None)
159 self.assertEqual(locals, {'x': 11, 'p': 11, 'y': 14})
160 self.assertEqual(inspect.formatargvalues(args, varargs, varkw, locals),
161 '(x=11, y=14)')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000162
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000163 def test_previous_frame(self):
164 args, varargs, varkw, locals = inspect.getargvalues(mod.fr.f_back)
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000165 self.assertEqual(args, ['a', 'b', 'c', 'd', 'e', 'f'])
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000166 self.assertEqual(varargs, 'g')
167 self.assertEqual(varkw, 'h')
168 self.assertEqual(inspect.formatargvalues(args, varargs, varkw, locals),
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000169 '(a=7, b=8, c=9, d=3, e=4, f=5, *g=(), **h={})')
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000170
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000171class GetSourceBase(unittest.TestCase):
172 # Subclasses must override.
173 fodderFile = None
Tim Peters5a9fb3c2005-01-07 16:01:32 +0000174
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000175 def __init__(self, *args, **kwargs):
176 unittest.TestCase.__init__(self, *args, **kwargs)
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000177
Philip Jenveya27c5bd2009-05-28 06:09:08 +0000178 with open(inspect.getsourcefile(self.fodderFile)) as fp:
179 self.source = fp.read()
Ka-Ping Yee6397c7c2001-02-27 14:43:21 +0000180
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000181 def sourcerange(self, top, bottom):
182 lines = self.source.split("\n")
183 return "\n".join(lines[top-1:bottom]) + "\n"
Tim Peterse0b2d7a2001-09-22 06:10:55 +0000184
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000185 def assertSourceEqual(self, obj, top, bottom):
186 self.assertEqual(inspect.getsource(obj),
187 self.sourcerange(top, bottom))
Tim Peters5a9fb3c2005-01-07 16:01:32 +0000188
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000189class TestRetrievingSourceCode(GetSourceBase):
190 fodderFile = mod
Tim Peters5a9fb3c2005-01-07 16:01:32 +0000191
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000192 def test_getclasses(self):
193 classes = inspect.getmembers(mod, inspect.isclass)
194 self.assertEqual(classes,
195 [('FesteringGob', mod.FesteringGob),
196 ('MalodorousPervert', mod.MalodorousPervert),
197 ('ParrotDroppings', mod.ParrotDroppings),
198 ('StupidGit', mod.StupidGit)])
199 tree = inspect.getclasstree([cls[1] for cls in classes], 1)
200 self.assertEqual(tree,
Thomas Wouters725af872006-04-15 09:13:19 +0000201 [(object, ()),
202 [(mod.ParrotDroppings, (object,)),
203 (mod.StupidGit, (object,)),
204 [(mod.MalodorousPervert, (mod.StupidGit,)),
205 [(mod.FesteringGob, (mod.MalodorousPervert,
206 mod.ParrotDroppings))
207 ]
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000208 ]
209 ]
210 ])
Tim Peters5a9fb3c2005-01-07 16:01:32 +0000211
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000212 def test_getfunctions(self):
213 functions = inspect.getmembers(mod, inspect.isfunction)
214 self.assertEqual(functions, [('eggs', mod.eggs),
215 ('spam', mod.spam)])
Johannes Gijsbersc473c992004-08-18 12:40:31 +0000216
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000217 def test_getdoc(self):
218 self.assertEqual(inspect.getdoc(mod), 'A module docstring.')
219 self.assertEqual(inspect.getdoc(mod.StupidGit),
220 'A longer,\n\nindented\n\ndocstring.')
221 self.assertEqual(inspect.getdoc(git.abuse),
222 'Another\n\ndocstring\n\ncontaining\n\ntabs')
Johannes Gijsbersc473c992004-08-18 12:40:31 +0000223
Georg Brandl0c77a822008-06-10 16:37:50 +0000224 def test_cleandoc(self):
225 self.assertEqual(inspect.cleandoc('An\n indented\n docstring.'),
226 'An\nindented\ndocstring.')
227
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000228 def test_getcomments(self):
229 self.assertEqual(inspect.getcomments(mod), '# line 1\n')
230 self.assertEqual(inspect.getcomments(mod.StupidGit), '# line 20\n')
Johannes Gijsbersc473c992004-08-18 12:40:31 +0000231
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000232 def test_getmodule(self):
Thomas Wouters89f507f2006-12-13 04:49:30 +0000233 # Check actual module
234 self.assertEqual(inspect.getmodule(mod), mod)
235 # Check class (uses __module__ attribute)
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000236 self.assertEqual(inspect.getmodule(mod.StupidGit), mod)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000237 # Check a method (no __module__ attribute, falls back to filename)
238 self.assertEqual(inspect.getmodule(mod.StupidGit.abuse), mod)
239 # Do it again (check the caching isn't broken)
240 self.assertEqual(inspect.getmodule(mod.StupidGit.abuse), mod)
241 # Check a builtin
Georg Brandl1a3284e2007-12-02 09:40:06 +0000242 self.assertEqual(inspect.getmodule(str), sys.modules["builtins"])
Thomas Wouters89f507f2006-12-13 04:49:30 +0000243 # Check filename override
244 self.assertEqual(inspect.getmodule(None, modfile), mod)
Johannes Gijsbersc473c992004-08-18 12:40:31 +0000245
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000246 def test_getsource(self):
247 self.assertSourceEqual(git.abuse, 29, 39)
248 self.assertSourceEqual(mod.StupidGit, 21, 46)
Johannes Gijsbersc473c992004-08-18 12:40:31 +0000249
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000250 def test_getsourcefile(self):
Christian Heimesa3538eb2007-11-06 11:44:48 +0000251 self.assertEqual(normcase(inspect.getsourcefile(mod.spam)), modfile)
252 self.assertEqual(normcase(inspect.getsourcefile(git.abuse)), modfile)
Johannes Gijsbersc473c992004-08-18 12:40:31 +0000253
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000254 def test_getfile(self):
255 self.assertEqual(inspect.getfile(mod.StupidGit), mod.__file__)
Johannes Gijsbersc473c992004-08-18 12:40:31 +0000256
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000257 def test_getmodule_recursion(self):
Christian Heimes45f9af32007-11-27 21:50:00 +0000258 from types import ModuleType
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000259 name = '__inspect_dummy'
Christian Heimes45f9af32007-11-27 21:50:00 +0000260 m = sys.modules[name] = ModuleType(name)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000261 m.__file__ = "<string>" # hopefully not a real filename...
262 m.__loader__ = "dummy" # pretend the filename is understood by a loader
Georg Brandl7cae87c2006-09-06 06:51:57 +0000263 exec("def x(): pass", m.__dict__)
Neal Norwitz221085d2007-02-25 20:55:47 +0000264 self.assertEqual(inspect.getsourcefile(m.x.__code__), '<string>')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000265 del sys.modules[name]
266 inspect.getmodule(compile('a=10','','single'))
267
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000268class TestDecorators(GetSourceBase):
269 fodderFile = mod2
Johannes Gijsbersc473c992004-08-18 12:40:31 +0000270
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000271 def test_wrapped_decorator(self):
Christian Heimes09aaa882008-02-23 15:01:06 +0000272 self.assertSourceEqual(mod2.wrapped, 14, 17)
Johannes Gijsbersc473c992004-08-18 12:40:31 +0000273
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000274 def test_replacing_decorator(self):
275 self.assertSourceEqual(mod2.gone, 9, 10)
Tim Peterse0b2d7a2001-09-22 06:10:55 +0000276
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000277class TestOneliners(GetSourceBase):
278 fodderFile = mod2
279 def test_oneline_lambda(self):
280 # Test inspect.getsource with a one-line lambda function.
281 self.assertSourceEqual(mod2.oll, 25, 25)
Tim Peters5a9fb3c2005-01-07 16:01:32 +0000282
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000283 def test_threeline_lambda(self):
284 # Test inspect.getsource with a three-line lambda function,
285 # where the second and third lines are _not_ indented.
Tim Peters5a9fb3c2005-01-07 16:01:32 +0000286 self.assertSourceEqual(mod2.tll, 28, 30)
287
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000288 def test_twoline_indented_lambda(self):
289 # Test inspect.getsource with a two-line lambda function,
290 # where the second line _is_ indented.
291 self.assertSourceEqual(mod2.tlli, 33, 34)
Tim Peters5a9fb3c2005-01-07 16:01:32 +0000292
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000293 def test_onelinefunc(self):
294 # Test inspect.getsource with a regular one-line function.
295 self.assertSourceEqual(mod2.onelinefunc, 37, 37)
Tim Peters5a9fb3c2005-01-07 16:01:32 +0000296
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000297 def test_manyargs(self):
298 # Test inspect.getsource with a regular function where
299 # the arguments are on two lines and _not_ indented and
300 # the body on the second line with the last arguments.
301 self.assertSourceEqual(mod2.manyargs, 40, 41)
Tim Peters5a9fb3c2005-01-07 16:01:32 +0000302
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000303 def test_twolinefunc(self):
304 # Test inspect.getsource with a regular function where
305 # the body is on two lines, following the argument list and
306 # continued on the next line by a \\.
307 self.assertSourceEqual(mod2.twolinefunc, 44, 45)
Tim Peters5a9fb3c2005-01-07 16:01:32 +0000308
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000309 def test_lambda_in_list(self):
310 # Test inspect.getsource with a one-line lambda function
311 # defined in a list, indented.
312 self.assertSourceEqual(mod2.a[1], 49, 49)
Tim Peters5a9fb3c2005-01-07 16:01:32 +0000313
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000314 def test_anonymous(self):
315 # Test inspect.getsource with a lambda function defined
316 # as argument to another function.
317 self.assertSourceEqual(mod2.anonymous, 55, 55)
318
Johannes Gijsbersa5855d52005-03-12 16:37:11 +0000319class TestBuggyCases(GetSourceBase):
320 fodderFile = mod2
321
322 def test_with_comment(self):
323 self.assertSourceEqual(mod2.with_comment, 58, 59)
324
325 def test_multiline_sig(self):
326 self.assertSourceEqual(mod2.multiline_sig[0], 63, 64)
327
Armin Rigodd5c0232005-09-25 11:45:45 +0000328 def test_nested_class(self):
329 self.assertSourceEqual(mod2.func69().func71, 71, 72)
330
331 def test_one_liner_followed_by_non_name(self):
332 self.assertSourceEqual(mod2.func77, 77, 77)
333
334 def test_one_liner_dedent_non_name(self):
335 self.assertSourceEqual(mod2.cls82.func83, 83, 83)
336
337 def test_with_comment_instead_of_docstring(self):
338 self.assertSourceEqual(mod2.func88, 88, 90)
339
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000340 def test_method_in_dynamic_class(self):
341 self.assertSourceEqual(mod2.method_in_dynamic_class, 95, 97)
342
R. David Murrayb5655772009-05-14 16:17:50 +0000343 @unittest.skipIf(
344 not hasattr(unicodedata, '__file__') or
345 unicodedata.__file__[-4:] in (".pyc", ".pyo"),
346 "unicodedata is not an external binary module")
R. David Murray74b89242009-05-13 17:33:03 +0000347 def test_findsource_binary(self):
R. David Murrayb5655772009-05-14 16:17:50 +0000348 self.assertRaises(IOError, inspect.getsource, unicodedata)
349 self.assertRaises(IOError, inspect.findsource, unicodedata)
R. David Murray74b89242009-05-13 17:33:03 +0000350
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000351# Helper for testing classify_class_attrs.
Tim Peters13b49d32001-09-23 02:00:29 +0000352def attrs_wo_objs(cls):
353 return [t[:3] for t in inspect.classify_class_attrs(cls)]
354
Tim Peters5a9fb3c2005-01-07 16:01:32 +0000355class TestClassesAndFunctions(unittest.TestCase):
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000356 def test_newstyle_mro(self):
357 # The same w/ new-class MRO.
358 class A(object): pass
359 class B(A): pass
360 class C(A): pass
361 class D(B, C): pass
Tim Peters13b49d32001-09-23 02:00:29 +0000362
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000363 expected = (D, B, C, A, object)
364 got = inspect.getmro(D)
365 self.assertEqual(expected, got)
Tim Peters13b49d32001-09-23 02:00:29 +0000366
Christian Heimes3795b532007-11-08 13:48:53 +0000367 def assertArgSpecEquals(self, routine, args_e, varargs_e=None,
368 varkw_e=None, defaults_e=None, formatted=None):
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000369 args, varargs, varkw, defaults = inspect.getargspec(routine)
370 self.assertEqual(args, args_e)
371 self.assertEqual(varargs, varargs_e)
372 self.assertEqual(varkw, varkw_e)
373 self.assertEqual(defaults, defaults_e)
374 if formatted is not None:
375 self.assertEqual(inspect.formatargspec(args, varargs, varkw, defaults),
376 formatted)
Tim Peters13b49d32001-09-23 02:00:29 +0000377
Christian Heimes3795b532007-11-08 13:48:53 +0000378 def assertFullArgSpecEquals(self, routine, args_e, varargs_e=None,
379 varkw_e=None, defaults_e=None,
380 kwonlyargs_e=[], kwonlydefaults_e=None,
381 ann_e={}, formatted=None):
382 args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, ann = \
383 inspect.getfullargspec(routine)
384 self.assertEqual(args, args_e)
385 self.assertEqual(varargs, varargs_e)
386 self.assertEqual(varkw, varkw_e)
387 self.assertEqual(defaults, defaults_e)
388 self.assertEqual(kwonlyargs, kwonlyargs_e)
389 self.assertEqual(kwonlydefaults, kwonlydefaults_e)
390 self.assertEqual(ann, ann_e)
391 if formatted is not None:
392 self.assertEqual(inspect.formatargspec(args, varargs, varkw, defaults,
393 kwonlyargs, kwonlydefaults, ann),
394 formatted)
395
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000396 def test_getargspec(self):
Christian Heimes3795b532007-11-08 13:48:53 +0000397 self.assertArgSpecEquals(mod.eggs, ['x', 'y'], formatted='(x, y)')
Tim Peters13b49d32001-09-23 02:00:29 +0000398
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000399 self.assertArgSpecEquals(mod.spam,
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000400 ['a', 'b', 'c', 'd', 'e', 'f'],
401 'g', 'h', (3, 4, 5),
402 '(a, b, c, d=3, e=4, f=5, *g, **h)')
Tim Peters13b49d32001-09-23 02:00:29 +0000403
Christian Heimes3795b532007-11-08 13:48:53 +0000404 self.assertRaises(ValueError, self.assertArgSpecEquals,
405 mod2.keyworded, [])
406
407 self.assertRaises(ValueError, self.assertArgSpecEquals,
408 mod2.annotated, [])
Benjamin Peterson9953a8d2009-01-17 04:15:01 +0000409 self.assertRaises(ValueError, self.assertArgSpecEquals,
410 mod2.keyword_only_arg, [])
411
Christian Heimes3795b532007-11-08 13:48:53 +0000412
413 def test_getfullargspec(self):
414 self.assertFullArgSpecEquals(mod2.keyworded, [], varargs_e='arg1',
415 kwonlyargs_e=['arg2'],
416 kwonlydefaults_e={'arg2':1},
417 formatted='(*arg1, arg2=1)')
418
419 self.assertFullArgSpecEquals(mod2.annotated, ['arg1'],
Christian Heimesc9543e42007-11-28 08:28:28 +0000420 ann_e={'arg1' : list},
Christian Heimes3795b532007-11-08 13:48:53 +0000421 formatted='(arg1: list)')
Benjamin Peterson9953a8d2009-01-17 04:15:01 +0000422 self.assertFullArgSpecEquals(mod2.keyword_only_arg, [],
423 kwonlyargs_e=['arg'],
424 formatted='(*, arg)')
425
Christian Heimes3795b532007-11-08 13:48:53 +0000426
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000427 def test_getargspec_method(self):
428 class A(object):
429 def m(self):
430 pass
431 self.assertArgSpecEquals(A.m, ['self'])
Tim Peters13b49d32001-09-23 02:00:29 +0000432
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000433 def test_classify_newstyle(self):
434 class A(object):
Tim Peters13b49d32001-09-23 02:00:29 +0000435
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000436 def s(): pass
437 s = staticmethod(s)
Tim Peters13b49d32001-09-23 02:00:29 +0000438
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000439 def c(cls): pass
440 c = classmethod(c)
Tim Peters13b49d32001-09-23 02:00:29 +0000441
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000442 def getp(self): pass
443 p = property(getp)
Tim Peters13b49d32001-09-23 02:00:29 +0000444
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000445 def m(self): pass
Tim Peters13b49d32001-09-23 02:00:29 +0000446
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000447 def m1(self): pass
Tim Peters13b49d32001-09-23 02:00:29 +0000448
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000449 datablob = '1'
Tim Peters13b49d32001-09-23 02:00:29 +0000450
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000451 attrs = attrs_wo_objs(A)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000452 self.assertTrue(('s', 'static method', A) in attrs, 'missing static method')
453 self.assertTrue(('c', 'class method', A) in attrs, 'missing class method')
454 self.assertTrue(('p', 'property', A) in attrs, 'missing property')
455 self.assertTrue(('m', 'method', A) in attrs,
Christian Heimes4a22b5d2007-11-25 09:39:14 +0000456 'missing plain method: %r' % attrs)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000457 self.assertTrue(('m1', 'method', A) in attrs, 'missing plain method')
458 self.assertTrue(('datablob', 'data', A) in attrs, 'missing data')
Tim Peters13b49d32001-09-23 02:00:29 +0000459
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000460 class B(A):
Tim Peters13b49d32001-09-23 02:00:29 +0000461
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000462 def m(self): pass
Tim Peters13b49d32001-09-23 02:00:29 +0000463
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000464 attrs = attrs_wo_objs(B)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000465 self.assertTrue(('s', 'static method', A) in attrs, 'missing static method')
466 self.assertTrue(('c', 'class method', A) in attrs, 'missing class method')
467 self.assertTrue(('p', 'property', A) in attrs, 'missing property')
468 self.assertTrue(('m', 'method', B) in attrs, 'missing plain method')
469 self.assertTrue(('m1', 'method', A) in attrs, 'missing plain method')
470 self.assertTrue(('datablob', 'data', A) in attrs, 'missing data')
Tim Peters13b49d32001-09-23 02:00:29 +0000471
472
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000473 class C(A):
Tim Peters13b49d32001-09-23 02:00:29 +0000474
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000475 def m(self): pass
476 def c(self): pass
Tim Peters13b49d32001-09-23 02:00:29 +0000477
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000478 attrs = attrs_wo_objs(C)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000479 self.assertTrue(('s', 'static method', A) in attrs, 'missing static method')
480 self.assertTrue(('c', 'method', C) in attrs, 'missing plain method')
481 self.assertTrue(('p', 'property', A) in attrs, 'missing property')
482 self.assertTrue(('m', 'method', C) in attrs, 'missing plain method')
483 self.assertTrue(('m1', 'method', A) in attrs, 'missing plain method')
484 self.assertTrue(('datablob', 'data', A) in attrs, 'missing data')
Tim Peters13b49d32001-09-23 02:00:29 +0000485
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000486 class D(B, C):
Tim Peters13b49d32001-09-23 02:00:29 +0000487
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000488 def m1(self): pass
Tim Peters13b49d32001-09-23 02:00:29 +0000489
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000490 attrs = attrs_wo_objs(D)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000491 self.assertTrue(('s', 'static method', A) in attrs, 'missing static method')
492 self.assertTrue(('c', 'method', C) in attrs, 'missing plain method')
493 self.assertTrue(('p', 'property', A) in attrs, 'missing property')
494 self.assertTrue(('m', 'method', B) in attrs, 'missing plain method')
495 self.assertTrue(('m1', 'method', D) in attrs, 'missing plain method')
496 self.assertTrue(('datablob', 'data', A) in attrs, 'missing data')
Jeremy Hyltonc4bf5ed2003-06-27 18:43:12 +0000497
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000498def test_main():
Johannes Gijsbers1542f342004-12-12 16:46:28 +0000499 run_unittest(TestDecorators, TestRetrievingSourceCode, TestOneliners,
Johannes Gijsbersa5855d52005-03-12 16:37:11 +0000500 TestBuggyCases,
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000501 TestInterpreterStack, TestClassesAndFunctions, TestPredicates)
Martin v. Löwis893ffa42003-10-31 15:35:53 +0000502
Johannes Gijsberscb9015d2004-12-12 16:20:22 +0000503if __name__ == "__main__":
504 test_main()