test_inspect.py revision e66e7de5d69542d9f10010a83787ef4b87a70bf8
17e213255cee76f692dded963ec726b39319646c0Benjamin Petersonimport re 2cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbersimport sys 300decd7835f0c2488451cedc345f2fb0650378b5Barry Warsawimport types 4cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbersimport unittest 5cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbersimport inspect 6df1cf301c2da740f9271b3ff164d7f0e5cb9082cR. David Murrayimport linecache 700decd7835f0c2488451cedc345f2fb0650378b5Barry Warsawimport datetime 87e213255cee76f692dded963ec726b39319646c0Benjamin Petersonfrom UserList import UserList 97e213255cee76f692dded963ec726b39319646c0Benjamin Petersonfrom UserDict import UserDict 106397c7c9a96de6a253da0210239a6fdeafe42a18Ka-Ping Yee 1107627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xiclunafrom test.test_support import run_unittest, check_py3k_warnings 126397c7c9a96de6a253da0210239a6fdeafe42a18Ka-Ping Yee 1307627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xiclunawith check_py3k_warnings( 1407627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna ("tuple parameter unpacking has been removed", SyntaxWarning), 1507627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna quiet=True): 1607627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna from test import inspect_fodder as mod 1707627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna from test import inspect_fodder2 as mod2 186397c7c9a96de6a253da0210239a6fdeafe42a18Ka-Ping Yee 19996ba0260209aaac0e1cd29516dc2ba7120c698bR. David Murray# C module for test_findsource_binary 20878555401e28a6da0ce05d2de637058a20ea7504R. David Murrayimport unicodedata 21996ba0260209aaac0e1cd29516dc2ba7120c698bR. David Murray 226397c7c9a96de6a253da0210239a6fdeafe42a18Ka-Ping Yee# Functions tested in this suite: 236397c7c9a96de6a253da0210239a6fdeafe42a18Ka-Ping Yee# ismodule, isclass, ismethod, isfunction, istraceback, isframe, iscode, 24759bfc6207e7979d4eaeed2a2ae611e1804aef55Facundo Batista# isbuiltin, isroutine, isgenerator, isgeneratorfunction, getmembers, 25759bfc6207e7979d4eaeed2a2ae611e1804aef55Facundo Batista# getdoc, getfile, getmodule, getsourcefile, getcomments, getsource, 26759bfc6207e7979d4eaeed2a2ae611e1804aef55Facundo Batista# getclasstree, getargspec, getargvalues, formatargspec, formatargvalues, 27759bfc6207e7979d4eaeed2a2ae611e1804aef55Facundo Batista# currentframe, stack, trace, isdatadescriptor 286397c7c9a96de6a253da0210239a6fdeafe42a18Ka-Ping Yee 29a2053475bb8a908e1cc80c765e02c98a6f354b19Nick Coghlan# NOTE: There are some additional tests relating to interaction with 30a2053475bb8a908e1cc80c765e02c98a6f354b19Nick Coghlan# zipimport in the test_zipimport_support test module. 31a2053475bb8a908e1cc80c765e02c98a6f354b19Nick Coghlan 32cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbersmodfile = mod.__file__ 33b2afe855e5d75a570707d6bf0e32206e4b7b1c4dGeorg Brandlif modfile.endswith(('c', 'o')): 34cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers modfile = modfile[:-1] 356397c7c9a96de6a253da0210239a6fdeafe42a18Ka-Ping Yee 36cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbersimport __builtin__ 376397c7c9a96de6a253da0210239a6fdeafe42a18Ka-Ping Yee 386397c7c9a96de6a253da0210239a6fdeafe42a18Ka-Ping Yeetry: 3907627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna 1 // 0 406397c7c9a96de6a253da0210239a6fdeafe42a18Ka-Ping Yeeexcept: 416397c7c9a96de6a253da0210239a6fdeafe42a18Ka-Ping Yee tb = sys.exc_traceback 426397c7c9a96de6a253da0210239a6fdeafe42a18Ka-Ping Yee 43cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbersgit = mod.StupidGit() 44cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 45cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbersclass IsTestBase(unittest.TestCase): 46cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers predicates = set([inspect.isbuiltin, inspect.isclass, inspect.iscode, 47cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers inspect.isframe, inspect.isfunction, inspect.ismethod, 48759bfc6207e7979d4eaeed2a2ae611e1804aef55Facundo Batista inspect.ismodule, inspect.istraceback, 49759bfc6207e7979d4eaeed2a2ae611e1804aef55Facundo Batista inspect.isgenerator, inspect.isgeneratorfunction]) 505a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Peters 51cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def istest(self, predicate, exp): 52cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers obj = eval(exp) 535c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(predicate(obj), '%s(%s)' % (predicate.__name__, exp)) 545a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Peters 55cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers for other in self.predicates - set([predicate]): 56759bfc6207e7979d4eaeed2a2ae611e1804aef55Facundo Batista if predicate == inspect.isgeneratorfunction and\ 57759bfc6207e7979d4eaeed2a2ae611e1804aef55Facundo Batista other == inspect.isfunction: 58759bfc6207e7979d4eaeed2a2ae611e1804aef55Facundo Batista continue 595c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertFalse(other(obj), 'not %s(%s)' % (other.__name__, exp)) 60cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 61759bfc6207e7979d4eaeed2a2ae611e1804aef55Facundo Batistadef generator_function_example(self): 62759bfc6207e7979d4eaeed2a2ae611e1804aef55Facundo Batista for i in xrange(2): 63759bfc6207e7979d4eaeed2a2ae611e1804aef55Facundo Batista yield i 64759bfc6207e7979d4eaeed2a2ae611e1804aef55Facundo Batista 65cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbersclass TestPredicates(IsTestBase): 66728bee897ff35702dd6f651b9e551761ec843c01Christian Heimes def test_sixteen(self): 67cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers count = len(filter(lambda x:x.startswith('is'), dir(inspect))) 68759bfc6207e7979d4eaeed2a2ae611e1804aef55Facundo Batista # This test is here for remember you to update Doc/library/inspect.rst 6926bc177fe6b1710cc306adee3be17145db4686caGeorg Brandl # which claims there are 16 such functions 70728bee897ff35702dd6f651b9e551761ec843c01Christian Heimes expected = 16 71df80af7659c05e45bb3500ce4cecca1f3f426280Neal Norwitz err_msg = "There are %d (not %d) is* functions" % (count, expected) 72df80af7659c05e45bb3500ce4cecca1f3f426280Neal Norwitz self.assertEqual(count, expected, err_msg) 735a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Peters 74759bfc6207e7979d4eaeed2a2ae611e1804aef55Facundo Batista 75cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_excluding_predicates(self): 76cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.istest(inspect.isbuiltin, 'sys.exit') 77cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.istest(inspect.isbuiltin, '[].append') 78cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.istest(inspect.iscode, 'mod.spam.func_code') 79cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.istest(inspect.isframe, 'tb.tb_frame') 80cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.istest(inspect.isfunction, 'mod.spam') 81cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.istest(inspect.ismethod, 'mod.StupidGit.abuse') 82cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.istest(inspect.ismethod, 'git.argue') 83cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.istest(inspect.ismodule, 'mod') 84cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.istest(inspect.istraceback, 'tb') 85cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.istest(inspect.isdatadescriptor, '__builtin__.file.closed') 86cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.istest(inspect.isdatadescriptor, '__builtin__.file.softspace') 87759bfc6207e7979d4eaeed2a2ae611e1804aef55Facundo Batista self.istest(inspect.isgenerator, '(x for x in xrange(2))') 88759bfc6207e7979d4eaeed2a2ae611e1804aef55Facundo Batista self.istest(inspect.isgeneratorfunction, 'generator_function_example') 8900decd7835f0c2488451cedc345f2fb0650378b5Barry Warsaw if hasattr(types, 'GetSetDescriptorType'): 9000decd7835f0c2488451cedc345f2fb0650378b5Barry Warsaw self.istest(inspect.isgetsetdescriptor, 9100decd7835f0c2488451cedc345f2fb0650378b5Barry Warsaw 'type(tb.tb_frame).f_locals') 9200decd7835f0c2488451cedc345f2fb0650378b5Barry Warsaw else: 935c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertFalse(inspect.isgetsetdescriptor(type(tb.tb_frame).f_locals)) 9400decd7835f0c2488451cedc345f2fb0650378b5Barry Warsaw if hasattr(types, 'MemberDescriptorType'): 9500decd7835f0c2488451cedc345f2fb0650378b5Barry Warsaw self.istest(inspect.ismemberdescriptor, 'datetime.timedelta.days') 9600decd7835f0c2488451cedc345f2fb0650378b5Barry Warsaw else: 975c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertFalse(inspect.ismemberdescriptor(datetime.timedelta.days)) 98cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 99cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_isroutine(self): 1005c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(inspect.isroutine(mod.spam)) 1015c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(inspect.isroutine([].count)) 102cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 1035e5fbb612d8109078c2777e1759277f9144616d0Benjamin Peterson def test_isclass(self): 1045e5fbb612d8109078c2777e1759277f9144616d0Benjamin Peterson self.istest(inspect.isclass, 'mod.StupidGit') 1055e5fbb612d8109078c2777e1759277f9144616d0Benjamin Peterson self.assertTrue(inspect.isclass(list)) 1065e5fbb612d8109078c2777e1759277f9144616d0Benjamin Peterson 1075e5fbb612d8109078c2777e1759277f9144616d0Benjamin Peterson class newstyle(object): pass 1085e5fbb612d8109078c2777e1759277f9144616d0Benjamin Peterson self.assertTrue(inspect.isclass(newstyle)) 1095e5fbb612d8109078c2777e1759277f9144616d0Benjamin Peterson 1105e5fbb612d8109078c2777e1759277f9144616d0Benjamin Peterson class CustomGetattr(object): 1115e5fbb612d8109078c2777e1759277f9144616d0Benjamin Peterson def __getattr__(self, attr): 1125e5fbb612d8109078c2777e1759277f9144616d0Benjamin Peterson return None 1135e5fbb612d8109078c2777e1759277f9144616d0Benjamin Peterson self.assertFalse(inspect.isclass(CustomGetattr())) 1145e5fbb612d8109078c2777e1759277f9144616d0Benjamin Peterson 115b54447f31cf8f590ef526d2707f26041720f5784Amaury Forgeot d'Arc def test_get_slot_members(self): 116b54447f31cf8f590ef526d2707f26041720f5784Amaury Forgeot d'Arc class C(object): 117b54447f31cf8f590ef526d2707f26041720f5784Amaury Forgeot d'Arc __slots__ = ("a", "b") 118b54447f31cf8f590ef526d2707f26041720f5784Amaury Forgeot d'Arc 119b54447f31cf8f590ef526d2707f26041720f5784Amaury Forgeot d'Arc x = C() 120b54447f31cf8f590ef526d2707f26041720f5784Amaury Forgeot d'Arc x.a = 42 121b54447f31cf8f590ef526d2707f26041720f5784Amaury Forgeot d'Arc members = dict(inspect.getmembers(x)) 122aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn('a', members) 123aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertNotIn('b', members) 124b54447f31cf8f590ef526d2707f26041720f5784Amaury Forgeot d'Arc 125c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson def test_isabstract(self): 126c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson from abc import ABCMeta, abstractmethod 127c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson 128c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson class AbstractClassExample(object): 129c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson __metaclass__ = ABCMeta 130c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson 131c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson @abstractmethod 132c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson def foo(self): 133c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson pass 134c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson 135c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson class ClassExample(AbstractClassExample): 136c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson def foo(self): 137c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson pass 138c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson 139c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson a = ClassExample() 140c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson 141c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson # Test general behaviour. 142c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson self.assertTrue(inspect.isabstract(AbstractClassExample)) 143c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson self.assertFalse(inspect.isabstract(ClassExample)) 144c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson self.assertFalse(inspect.isabstract(a)) 145c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson self.assertFalse(inspect.isabstract(int)) 146c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson self.assertFalse(inspect.isabstract(5)) 147c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson 148b54447f31cf8f590ef526d2707f26041720f5784Amaury Forgeot d'Arc 149cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbersclass TestInterpreterStack(IsTestBase): 150cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def __init__(self, *args, **kwargs): 151cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers unittest.TestCase.__init__(self, *args, **kwargs) 1525a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Peters 153cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers git.abuse(7, 8, 9) 154cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 155cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_abuse_done(self): 156cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.istest(inspect.istraceback, 'git.ex[2]') 157cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.istest(inspect.isframe, 'mod.fr') 158cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 159cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_stack(self): 1605c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(len(mod.st) >= 5) 161cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(mod.st[0][1:], 1625a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Peters (modfile, 16, 'eggs', [' st = inspect.stack()\n'], 0)) 163cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(mod.st[1][1:], 164cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers (modfile, 9, 'spam', [' eggs(b + d, c + f)\n'], 0)) 165cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(mod.st[2][1:], 166cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers (modfile, 43, 'argue', [' spam(a, b, c)\n'], 0)) 167cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(mod.st[3][1:], 168cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers (modfile, 39, 'abuse', [' self.argue(a, b, c)\n'], 0)) 169cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 170cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_trace(self): 171cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(len(git.tr), 3) 172cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(git.tr[0][1:], (modfile, 43, 'argue', 173cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers [' spam(a, b, c)\n'], 0)) 174cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(git.tr[1][1:], (modfile, 9, 'spam', 175cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers [' eggs(b + d, c + f)\n'], 0)) 176cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(git.tr[2][1:], (modfile, 18, 'eggs', 177c68e9f0d200751692b9f54db337b80a465667faeMark Dickinson [' q = y // 0\n'], 0)) 178cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 179cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_frame(self): 180cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers args, varargs, varkw, locals = inspect.getargvalues(mod.fr) 181cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(args, ['x', 'y']) 182cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(varargs, None) 183cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(varkw, None) 184cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(locals, {'x': 11, 'p': 11, 'y': 14}) 185cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(inspect.formatargvalues(args, varargs, varkw, locals), 186cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers '(x=11, y=14)') 187cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 188cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_previous_frame(self): 189cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers args, varargs, varkw, locals = inspect.getargvalues(mod.fr.f_back) 190cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(args, ['a', 'b', 'c', 'd', ['e', ['f']]]) 191cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(varargs, 'g') 192cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(varkw, 'h') 193cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(inspect.formatargvalues(args, varargs, varkw, locals), 194cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers '(a=7, b=8, c=9, d=3, (e=4, (f=5,)), *g=(), **h={})') 195cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 196cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbersclass GetSourceBase(unittest.TestCase): 197cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers # Subclasses must override. 198cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers fodderFile = None 1995a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Peters 200cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def __init__(self, *args, **kwargs): 201cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers unittest.TestCase.__init__(self, *args, **kwargs) 202cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 2036a111027f2c1607d3e03acee6256eef38fafb206Philip Jenvey with open(inspect.getsourcefile(self.fodderFile)) as fp: 2046a111027f2c1607d3e03acee6256eef38fafb206Philip Jenvey self.source = fp.read() 205cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 206cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def sourcerange(self, top, bottom): 207cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers lines = self.source.split("\n") 208cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers return "\n".join(lines[top-1:bottom]) + "\n" 209cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 210cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def assertSourceEqual(self, obj, top, bottom): 211cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(inspect.getsource(obj), 212cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.sourcerange(top, bottom)) 2135a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Peters 214cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbersclass TestRetrievingSourceCode(GetSourceBase): 215cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers fodderFile = mod 2165a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Peters 217cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_getclasses(self): 218cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers classes = inspect.getmembers(mod, inspect.isclass) 219cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(classes, 220cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers [('FesteringGob', mod.FesteringGob), 221cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers ('MalodorousPervert', mod.MalodorousPervert), 222cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers ('ParrotDroppings', mod.ParrotDroppings), 223cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers ('StupidGit', mod.StupidGit)]) 224cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers tree = inspect.getclasstree([cls[1] for cls in classes], 1) 225cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(tree, 226cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers [(mod.ParrotDroppings, ()), 227cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers (mod.StupidGit, ()), 228cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers [(mod.MalodorousPervert, (mod.StupidGit,)), 229cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers [(mod.FesteringGob, (mod.MalodorousPervert, 230cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers mod.ParrotDroppings)) 231cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers ] 232cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers ] 233cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers ]) 2345a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Peters 235cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_getfunctions(self): 236cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers functions = inspect.getmembers(mod, inspect.isfunction) 237cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(functions, [('eggs', mod.eggs), 238cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers ('spam', mod.spam)]) 239cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 240f28fd24c36310541a1f3ec74e92e8d38629dd5d8R. David Murray @unittest.skipIf(sys.flags.optimize >= 2, 241f28fd24c36310541a1f3ec74e92e8d38629dd5d8R. David Murray "Docstrings are omitted with -O2 and above") 242cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_getdoc(self): 243cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(inspect.getdoc(mod), 'A module docstring.') 244cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(inspect.getdoc(mod.StupidGit), 245cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 'A longer,\n\nindented\n\ndocstring.') 246cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(inspect.getdoc(git.abuse), 247cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 'Another\n\ndocstring\n\ncontaining\n\ntabs') 248cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 2497be19aabe20a04d8038383bc96c3dd96f27892c0Georg Brandl def test_cleandoc(self): 2507be19aabe20a04d8038383bc96c3dd96f27892c0Georg Brandl self.assertEqual(inspect.cleandoc('An\n indented\n docstring.'), 2517be19aabe20a04d8038383bc96c3dd96f27892c0Georg Brandl 'An\nindented\ndocstring.') 2527be19aabe20a04d8038383bc96c3dd96f27892c0Georg Brandl 253cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_getcomments(self): 254cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(inspect.getcomments(mod), '# line 1\n') 255cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(inspect.getcomments(mod.StupidGit), '# line 20\n') 256cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 257cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_getmodule(self): 258c495c66ea922e3ce8d822716a7abbf28ee709b71Nick Coghlan # Check actual module 259c495c66ea922e3ce8d822716a7abbf28ee709b71Nick Coghlan self.assertEqual(inspect.getmodule(mod), mod) 260c495c66ea922e3ce8d822716a7abbf28ee709b71Nick Coghlan # Check class (uses __module__ attribute) 261cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(inspect.getmodule(mod.StupidGit), mod) 262c495c66ea922e3ce8d822716a7abbf28ee709b71Nick Coghlan # Check a method (no __module__ attribute, falls back to filename) 263c495c66ea922e3ce8d822716a7abbf28ee709b71Nick Coghlan self.assertEqual(inspect.getmodule(mod.StupidGit.abuse), mod) 264c495c66ea922e3ce8d822716a7abbf28ee709b71Nick Coghlan # Do it again (check the caching isn't broken) 265c495c66ea922e3ce8d822716a7abbf28ee709b71Nick Coghlan self.assertEqual(inspect.getmodule(mod.StupidGit.abuse), mod) 266c495c66ea922e3ce8d822716a7abbf28ee709b71Nick Coghlan # Check a builtin 267c495c66ea922e3ce8d822716a7abbf28ee709b71Nick Coghlan self.assertEqual(inspect.getmodule(str), sys.modules["__builtin__"]) 268c495c66ea922e3ce8d822716a7abbf28ee709b71Nick Coghlan # Check filename override 269c495c66ea922e3ce8d822716a7abbf28ee709b71Nick Coghlan self.assertEqual(inspect.getmodule(None, modfile), mod) 270cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 271cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_getsource(self): 272cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertSourceEqual(git.abuse, 29, 39) 273cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertSourceEqual(mod.StupidGit, 21, 46) 274cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 275cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_getsourcefile(self): 2765a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Peters self.assertEqual(inspect.getsourcefile(mod.spam), modfile) 2775a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Peters self.assertEqual(inspect.getsourcefile(git.abuse), modfile) 278df1cf301c2da740f9271b3ff164d7f0e5cb9082cR. David Murray fn = "_non_existing_filename_used_for_sourcefile_test.py" 279df1cf301c2da740f9271b3ff164d7f0e5cb9082cR. David Murray co = compile("None", fn, "exec") 280df1cf301c2da740f9271b3ff164d7f0e5cb9082cR. David Murray self.assertEqual(inspect.getsourcefile(co), None) 281df1cf301c2da740f9271b3ff164d7f0e5cb9082cR. David Murray linecache.cache[co.co_filename] = (1, None, "None", co.co_filename) 282df1cf301c2da740f9271b3ff164d7f0e5cb9082cR. David Murray self.assertEqual(inspect.getsourcefile(co), fn) 283cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 284cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_getfile(self): 285cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(inspect.getfile(mod.StupidGit), mod.__file__) 286cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 2875d86bdb3aebb14228d3c2e3f921bda34cf1c886cPhillip J. Eby def test_getmodule_recursion(self): 288c756d00cf20ba094a93f09647e80b688ded61bf5Christian Heimes from types import ModuleType 2895d86bdb3aebb14228d3c2e3f921bda34cf1c886cPhillip J. Eby name = '__inspect_dummy' 290c756d00cf20ba094a93f09647e80b688ded61bf5Christian Heimes m = sys.modules[name] = ModuleType(name) 291722b88308da16225530a8852adc0581a918d5105Tim Peters m.__file__ = "<string>" # hopefully not a real filename... 2925d86bdb3aebb14228d3c2e3f921bda34cf1c886cPhillip J. Eby m.__loader__ = "dummy" # pretend the filename is understood by a loader 2935d86bdb3aebb14228d3c2e3f921bda34cf1c886cPhillip J. Eby exec "def x(): pass" in m.__dict__ 2945d86bdb3aebb14228d3c2e3f921bda34cf1c886cPhillip J. Eby self.assertEqual(inspect.getsourcefile(m.x.func_code), '<string>') 2955d86bdb3aebb14228d3c2e3f921bda34cf1c886cPhillip J. Eby del sys.modules[name] 2961a2959cfa80f43d9a250e6b7ee39cee51b7e8a57Phillip J. Eby inspect.getmodule(compile('a=10','','single')) 2975d86bdb3aebb14228d3c2e3f921bda34cf1c886cPhillip J. Eby 2980eb4ac4c6258ecbcbcb65022f3987fe30f31f527Benjamin Peterson def test_proceed_with_fake_filename(self): 2990eb4ac4c6258ecbcbcb65022f3987fe30f31f527Benjamin Peterson '''doctest monkeypatches linecache to enable inspection''' 3000eb4ac4c6258ecbcbcb65022f3987fe30f31f527Benjamin Peterson fn, source = '<test>', 'def x(): pass\n' 3010eb4ac4c6258ecbcbcb65022f3987fe30f31f527Benjamin Peterson getlines = linecache.getlines 3020eb4ac4c6258ecbcbcb65022f3987fe30f31f527Benjamin Peterson def monkey(filename, module_globals=None): 3030eb4ac4c6258ecbcbcb65022f3987fe30f31f527Benjamin Peterson if filename == fn: 3040eb4ac4c6258ecbcbcb65022f3987fe30f31f527Benjamin Peterson return source.splitlines(True) 3050eb4ac4c6258ecbcbcb65022f3987fe30f31f527Benjamin Peterson else: 3060eb4ac4c6258ecbcbcb65022f3987fe30f31f527Benjamin Peterson return getlines(filename, module_globals) 3070eb4ac4c6258ecbcbcb65022f3987fe30f31f527Benjamin Peterson linecache.getlines = monkey 3080eb4ac4c6258ecbcbcb65022f3987fe30f31f527Benjamin Peterson try: 3090eb4ac4c6258ecbcbcb65022f3987fe30f31f527Benjamin Peterson ns = {} 3100eb4ac4c6258ecbcbcb65022f3987fe30f31f527Benjamin Peterson exec compile(source, fn, 'single') in ns 3110eb4ac4c6258ecbcbcb65022f3987fe30f31f527Benjamin Peterson inspect.getsource(ns["x"]) 3120eb4ac4c6258ecbcbcb65022f3987fe30f31f527Benjamin Peterson finally: 3130eb4ac4c6258ecbcbcb65022f3987fe30f31f527Benjamin Peterson linecache.getlines = getlines 3140eb4ac4c6258ecbcbcb65022f3987fe30f31f527Benjamin Peterson 315cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbersclass TestDecorators(GetSourceBase): 316cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers fodderFile = mod2 317cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 318cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_wrapped_decorator(self): 319cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertSourceEqual(mod2.wrapped, 14, 17) 320cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 321cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_replacing_decorator(self): 322cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertSourceEqual(mod2.gone, 9, 10) 323cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 3241542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbersclass TestOneliners(GetSourceBase): 3251542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers fodderFile = mod2 3261542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers def test_oneline_lambda(self): 3271542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers # Test inspect.getsource with a one-line lambda function. 3281542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers self.assertSourceEqual(mod2.oll, 25, 25) 3295a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Peters 3301542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers def test_threeline_lambda(self): 3311542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers # Test inspect.getsource with a three-line lambda function, 3321542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers # where the second and third lines are _not_ indented. 3335a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Peters self.assertSourceEqual(mod2.tll, 28, 30) 3345a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Peters 3351542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers def test_twoline_indented_lambda(self): 3361542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers # Test inspect.getsource with a two-line lambda function, 3371542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers # where the second line _is_ indented. 3381542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers self.assertSourceEqual(mod2.tlli, 33, 34) 3395a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Peters 3401542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers def test_onelinefunc(self): 3411542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers # Test inspect.getsource with a regular one-line function. 3421542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers self.assertSourceEqual(mod2.onelinefunc, 37, 37) 3435a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Peters 3441542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers def test_manyargs(self): 3451542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers # Test inspect.getsource with a regular function where 3461542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers # the arguments are on two lines and _not_ indented and 3471542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers # the body on the second line with the last arguments. 3481542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers self.assertSourceEqual(mod2.manyargs, 40, 41) 3495a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Peters 3501542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers def test_twolinefunc(self): 3511542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers # Test inspect.getsource with a regular function where 3521542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers # the body is on two lines, following the argument list and 3531542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers # continued on the next line by a \\. 3541542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers self.assertSourceEqual(mod2.twolinefunc, 44, 45) 3555a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Peters 3561542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers def test_lambda_in_list(self): 3571542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers # Test inspect.getsource with a one-line lambda function 3581542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers # defined in a list, indented. 3591542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers self.assertSourceEqual(mod2.a[1], 49, 49) 3605a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Peters 3611542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers def test_anonymous(self): 3621542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers # Test inspect.getsource with a lambda function defined 3631542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers # as argument to another function. 3641542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers self.assertSourceEqual(mod2.anonymous, 55, 55) 3651542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers 366a5855d5ace1c1426e1247272c688ccc11ae02f7cJohannes Gijsbersclass TestBuggyCases(GetSourceBase): 367a5855d5ace1c1426e1247272c688ccc11ae02f7cJohannes Gijsbers fodderFile = mod2 368a5855d5ace1c1426e1247272c688ccc11ae02f7cJohannes Gijsbers 369a5855d5ace1c1426e1247272c688ccc11ae02f7cJohannes Gijsbers def test_with_comment(self): 370a5855d5ace1c1426e1247272c688ccc11ae02f7cJohannes Gijsbers self.assertSourceEqual(mod2.with_comment, 58, 59) 371a5855d5ace1c1426e1247272c688ccc11ae02f7cJohannes Gijsbers 372a5855d5ace1c1426e1247272c688ccc11ae02f7cJohannes Gijsbers def test_multiline_sig(self): 373a5855d5ace1c1426e1247272c688ccc11ae02f7cJohannes Gijsbers self.assertSourceEqual(mod2.multiline_sig[0], 63, 64) 374a5855d5ace1c1426e1247272c688ccc11ae02f7cJohannes Gijsbers 375dd5c023af56b9a424a3965364521c50b73308379Armin Rigo def test_nested_class(self): 376dd5c023af56b9a424a3965364521c50b73308379Armin Rigo self.assertSourceEqual(mod2.func69().func71, 71, 72) 377dd5c023af56b9a424a3965364521c50b73308379Armin Rigo 378dd5c023af56b9a424a3965364521c50b73308379Armin Rigo def test_one_liner_followed_by_non_name(self): 379dd5c023af56b9a424a3965364521c50b73308379Armin Rigo self.assertSourceEqual(mod2.func77, 77, 77) 380dd5c023af56b9a424a3965364521c50b73308379Armin Rigo 381dd5c023af56b9a424a3965364521c50b73308379Armin Rigo def test_one_liner_dedent_non_name(self): 382dd5c023af56b9a424a3965364521c50b73308379Armin Rigo self.assertSourceEqual(mod2.cls82.func83, 83, 83) 383dd5c023af56b9a424a3965364521c50b73308379Armin Rigo 384dd5c023af56b9a424a3965364521c50b73308379Armin Rigo def test_with_comment_instead_of_docstring(self): 385dd5c023af56b9a424a3965364521c50b73308379Armin Rigo self.assertSourceEqual(mod2.func88, 88, 90) 386dd5c023af56b9a424a3965364521c50b73308379Armin Rigo 3872463f8f831bdf7ed562a26a13a6214f203f0b037Georg Brandl def test_method_in_dynamic_class(self): 3882463f8f831bdf7ed562a26a13a6214f203f0b037Georg Brandl self.assertSourceEqual(mod2.method_in_dynamic_class, 95, 97) 3892463f8f831bdf7ed562a26a13a6214f203f0b037Georg Brandl 390878555401e28a6da0ce05d2de637058a20ea7504R. David Murray @unittest.skipIf( 391878555401e28a6da0ce05d2de637058a20ea7504R. David Murray not hasattr(unicodedata, '__file__') or 392878555401e28a6da0ce05d2de637058a20ea7504R. David Murray unicodedata.__file__[-4:] in (".pyc", ".pyo"), 393878555401e28a6da0ce05d2de637058a20ea7504R. David Murray "unicodedata is not an external binary module") 394996ba0260209aaac0e1cd29516dc2ba7120c698bR. David Murray def test_findsource_binary(self): 395878555401e28a6da0ce05d2de637058a20ea7504R. David Murray self.assertRaises(IOError, inspect.getsource, unicodedata) 396878555401e28a6da0ce05d2de637058a20ea7504R. David Murray self.assertRaises(IOError, inspect.findsource, unicodedata) 397996ba0260209aaac0e1cd29516dc2ba7120c698bR. David Murray 398df1cf301c2da740f9271b3ff164d7f0e5cb9082cR. David Murray def test_findsource_code_in_linecache(self): 399df1cf301c2da740f9271b3ff164d7f0e5cb9082cR. David Murray lines = ["x=1"] 400df1cf301c2da740f9271b3ff164d7f0e5cb9082cR. David Murray co = compile(lines[0], "_dynamically_created_file", "exec") 401df1cf301c2da740f9271b3ff164d7f0e5cb9082cR. David Murray self.assertRaises(IOError, inspect.findsource, co) 402df1cf301c2da740f9271b3ff164d7f0e5cb9082cR. David Murray self.assertRaises(IOError, inspect.getsource, co) 403df1cf301c2da740f9271b3ff164d7f0e5cb9082cR. David Murray linecache.cache[co.co_filename] = (1, None, lines, co.co_filename) 4042623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(inspect.findsource(co), (lines,0)) 4052623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(inspect.getsource(co), lines[0]) 406df1cf301c2da740f9271b3ff164d7f0e5cb9082cR. David Murray 407e66e7de5d69542d9f10010a83787ef4b87a70bf8Ezio Melotti def test_findsource_without_filename(self): 408e66e7de5d69542d9f10010a83787ef4b87a70bf8Ezio Melotti for fname in ['', '<string>']: 409e66e7de5d69542d9f10010a83787ef4b87a70bf8Ezio Melotti co = compile('x=1', fname, "exec") 410e66e7de5d69542d9f10010a83787ef4b87a70bf8Ezio Melotti self.assertRaises(IOError, inspect.findsource, co) 411e66e7de5d69542d9f10010a83787ef4b87a70bf8Ezio Melotti self.assertRaises(IOError, inspect.getsource, co) 412e66e7de5d69542d9f10010a83787ef4b87a70bf8Ezio Melotti 413b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou 414b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrouclass _BrokenDataDescriptor(object): 415b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou """ 416b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou A broken data descriptor. See bug #1785. 417b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou """ 418b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou def __get__(*args): 419b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou raise AssertionError("should not __get__ data descriptors") 420b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou 421b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou def __set__(*args): 422b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou raise RuntimeError 423b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou 424b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou def __getattr__(*args): 425b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou raise AssertionError("should not __getattr__ data descriptors") 426b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou 427b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou 428b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrouclass _BrokenMethodDescriptor(object): 429b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou """ 430b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou A broken method descriptor. See bug #1785. 431b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou """ 432b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou def __get__(*args): 433b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou raise AssertionError("should not __get__ method descriptors") 434b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou 435b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou def __getattr__(*args): 436b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou raise AssertionError("should not __getattr__ method descriptors") 437b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou 438b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou 439cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers# Helper for testing classify_class_attrs. 44013b49d3374cca4eaffee5fa756192a234714c8ffTim Petersdef attrs_wo_objs(cls): 44113b49d3374cca4eaffee5fa756192a234714c8ffTim Peters return [t[:3] for t in inspect.classify_class_attrs(cls)] 44213b49d3374cca4eaffee5fa756192a234714c8ffTim Peters 443b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou 4445a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Petersclass TestClassesAndFunctions(unittest.TestCase): 445cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_classic_mro(self): 446cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers # Test classic-class method resolution order. 447cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers class A: pass 448cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers class B(A): pass 449cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers class C(A): pass 450cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers class D(B, C): pass 451cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 452cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers expected = (D, B, A, C) 453cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers got = inspect.getmro(D) 454cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(expected, got) 455cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 456cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_newstyle_mro(self): 457cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers # The same w/ new-class MRO. 458cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers class A(object): pass 459cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers class B(A): pass 460cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers class C(A): pass 461cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers class D(B, C): pass 462cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 463cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers expected = (D, B, C, A, object) 464cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers got = inspect.getmro(D) 465cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(expected, got) 466cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 467cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def assertArgSpecEquals(self, routine, args_e, varargs_e = None, 468cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers varkw_e = None, defaults_e = None, 469cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers formatted = None): 470cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers args, varargs, varkw, defaults = inspect.getargspec(routine) 471cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(args, args_e) 472cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(varargs, varargs_e) 473cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(varkw, varkw_e) 474cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(defaults, defaults_e) 475cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers if formatted is not None: 476cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(inspect.formatargspec(args, varargs, varkw, defaults), 477cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers formatted) 478cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 479cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_getargspec(self): 480cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertArgSpecEquals(mod.eggs, ['x', 'y'], formatted = '(x, y)') 481cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 482cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertArgSpecEquals(mod.spam, 483cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers ['a', 'b', 'c', 'd', ['e', ['f']]], 484cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 'g', 'h', (3, (4, (5,))), 485cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers '(a, b, c, d=3, (e, (f,))=(4, (5,)), *g, **h)') 486cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 487cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_getargspec_method(self): 488cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers class A(object): 489cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def m(self): 490cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers pass 491cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertArgSpecEquals(A.m, ['self']) 492cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 493cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_getargspec_sublistofone(self): 49407627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna with check_py3k_warnings( 49507627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna ("tuple parameter unpacking has been removed", SyntaxWarning), 49607627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna ("parenthesized argument names are invalid", SyntaxWarning)): 49707627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna exec 'def sublistOfOne((foo,)): return 1' 49807627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna self.assertArgSpecEquals(sublistOfOne, [['foo']]) 49907627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna 50007627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna exec 'def fakeSublistOfOne((foo)): return 1' 50107627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna self.assertArgSpecEquals(fakeSublistOfOne, ['foo']) 50233b730e33cb0a63f4030d1587a6196dcde36e965Neal Norwitz 503b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone 504b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone def _classify_test(self, newstyle): 505b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone """Helper for testing that classify_class_attrs finds a bunch of 506b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone different kinds of attributes on a given class. 507b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone """ 508b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone if newstyle: 509b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone base = object 510b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone else: 511b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone class base: 512b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone pass 513b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone 514b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone class A(base): 515cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def s(): pass 516cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers s = staticmethod(s) 517cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 518cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def c(cls): pass 519cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers c = classmethod(c) 520cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 521cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def getp(self): pass 522cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers p = property(getp) 523cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 524cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def m(self): pass 525cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 526cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def m1(self): pass 527cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 528cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers datablob = '1' 529cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 530b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou dd = _BrokenDataDescriptor() 531b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou md = _BrokenMethodDescriptor() 532b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou 533cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers attrs = attrs_wo_objs(A) 534aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('s', 'static method', A), attrs, 'missing static method') 535aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('c', 'class method', A), attrs, 'missing class method') 536aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('p', 'property', A), attrs, 'missing property') 537aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('m', 'method', A), attrs, 'missing plain method') 538aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('m1', 'method', A), attrs, 'missing plain method') 539aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('datablob', 'data', A), attrs, 'missing data') 540b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou self.assertIn(('md', 'method', A), attrs, 'missing method descriptor') 541b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou self.assertIn(('dd', 'data', A), attrs, 'missing data descriptor') 542cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 543cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers class B(A): 544cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def m(self): pass 545cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 546cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers attrs = attrs_wo_objs(B) 547aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('s', 'static method', A), attrs, 'missing static method') 548aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('c', 'class method', A), attrs, 'missing class method') 549aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('p', 'property', A), attrs, 'missing property') 550aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('m', 'method', B), attrs, 'missing plain method') 551aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('m1', 'method', A), attrs, 'missing plain method') 552aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('datablob', 'data', A), attrs, 'missing data') 553b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou self.assertIn(('md', 'method', A), attrs, 'missing method descriptor') 554b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou self.assertIn(('dd', 'data', A), attrs, 'missing data descriptor') 555cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 556cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 557cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers class C(A): 558cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def m(self): pass 559cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def c(self): pass 560cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 561cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers attrs = attrs_wo_objs(C) 562aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('s', 'static method', A), attrs, 'missing static method') 563aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('c', 'method', C), attrs, 'missing plain method') 564aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('p', 'property', A), attrs, 'missing property') 565aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('m', 'method', C), attrs, 'missing plain method') 566aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('m1', 'method', A), attrs, 'missing plain method') 567aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('datablob', 'data', A), attrs, 'missing data') 568b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou self.assertIn(('md', 'method', A), attrs, 'missing method descriptor') 569b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou self.assertIn(('dd', 'data', A), attrs, 'missing data descriptor') 570cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 571cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers class D(B, C): 572cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def m1(self): pass 573cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 574cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers attrs = attrs_wo_objs(D) 575aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('s', 'static method', A), attrs, 'missing static method') 576b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone if newstyle: 577b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone self.assertIn(('c', 'method', C), attrs, 'missing plain method') 578b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone else: 579b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone self.assertIn(('c', 'class method', A), attrs, 'missing class method') 580aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('p', 'property', A), attrs, 'missing property') 581aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('m', 'method', B), attrs, 'missing plain method') 582aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('m1', 'method', D), attrs, 'missing plain method') 583aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('datablob', 'data', A), attrs, 'missing data') 584b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou self.assertIn(('md', 'method', A), attrs, 'missing method descriptor') 585b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou self.assertIn(('dd', 'data', A), attrs, 'missing data descriptor') 586cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 58713b49d3374cca4eaffee5fa756192a234714c8ffTim Peters 588b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone def test_classify_oldstyle(self): 589b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone """classify_class_attrs finds static methods, class methods, 590b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone properties, normal methods, and data attributes on an old-style 591b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone class. 592b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone """ 593b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone self._classify_test(False) 59413b49d3374cca4eaffee5fa756192a234714c8ffTim Peters 59513b49d3374cca4eaffee5fa756192a234714c8ffTim Peters 596b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone def test_classify_newstyle(self): 597b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone """Just like test_classify_oldstyle, but for a new-style class. 598b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone """ 599b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone self._classify_test(True) 60013b49d3374cca4eaffee5fa756192a234714c8ffTim Peters 601b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou def test_classify_builtin_types(self): 602b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou # Simple sanity check that all built-in types can have their 603b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou # attributes classified. 604b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou for name in dir(__builtin__): 605b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou builtin = getattr(__builtin__, name) 606b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou if isinstance(builtin, type): 607b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou inspect.classify_class_attrs(builtin) 608b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou 609e09bc1e8f54620e938b7e076830b872a8daabd2cAntoine Pitrou def test_getmembers_method(self): 610b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou # Old-style classes 611e09bc1e8f54620e938b7e076830b872a8daabd2cAntoine Pitrou class B: 612e09bc1e8f54620e938b7e076830b872a8daabd2cAntoine Pitrou def f(self): 613e09bc1e8f54620e938b7e076830b872a8daabd2cAntoine Pitrou pass 614b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou 615e09bc1e8f54620e938b7e076830b872a8daabd2cAntoine Pitrou self.assertIn(('f', B.f), inspect.getmembers(B)) 616e09bc1e8f54620e938b7e076830b872a8daabd2cAntoine Pitrou # contrary to spec, ismethod() is also True for unbound methods 617e09bc1e8f54620e938b7e076830b872a8daabd2cAntoine Pitrou # (see #1785) 618e09bc1e8f54620e938b7e076830b872a8daabd2cAntoine Pitrou self.assertIn(('f', B.f), inspect.getmembers(B, inspect.ismethod)) 619e09bc1e8f54620e938b7e076830b872a8daabd2cAntoine Pitrou b = B() 620e09bc1e8f54620e938b7e076830b872a8daabd2cAntoine Pitrou self.assertIn(('f', b.f), inspect.getmembers(b)) 621e09bc1e8f54620e938b7e076830b872a8daabd2cAntoine Pitrou self.assertIn(('f', b.f), inspect.getmembers(b, inspect.ismethod)) 622b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou 623b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou # New-style classes 624e09bc1e8f54620e938b7e076830b872a8daabd2cAntoine Pitrou class B(object): 625e09bc1e8f54620e938b7e076830b872a8daabd2cAntoine Pitrou def f(self): 626b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou pass 627b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou 628e09bc1e8f54620e938b7e076830b872a8daabd2cAntoine Pitrou self.assertIn(('f', B.f), inspect.getmembers(B)) 629e09bc1e8f54620e938b7e076830b872a8daabd2cAntoine Pitrou self.assertIn(('f', B.f), inspect.getmembers(B, inspect.ismethod)) 630e09bc1e8f54620e938b7e076830b872a8daabd2cAntoine Pitrou b = B() 631e09bc1e8f54620e938b7e076830b872a8daabd2cAntoine Pitrou self.assertIn(('f', b.f), inspect.getmembers(b)) 632e09bc1e8f54620e938b7e076830b872a8daabd2cAntoine Pitrou self.assertIn(('f', b.f), inspect.getmembers(b, inspect.ismethod)) 633cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 63413b49d3374cca4eaffee5fa756192a234714c8ffTim Peters 6357e213255cee76f692dded963ec726b39319646c0Benjamin Petersonclass TestGetcallargsFunctions(unittest.TestCase): 6367e213255cee76f692dded963ec726b39319646c0Benjamin Peterson 6377e213255cee76f692dded963ec726b39319646c0Benjamin Peterson # tuple parameters are named '.1', '.2', etc. 6387e213255cee76f692dded963ec726b39319646c0Benjamin Peterson is_tuplename = re.compile(r'^\.\d+$').match 6397e213255cee76f692dded963ec726b39319646c0Benjamin Peterson 6407e213255cee76f692dded963ec726b39319646c0Benjamin Peterson def assertEqualCallArgs(self, func, call_params_string, locs=None): 6417e213255cee76f692dded963ec726b39319646c0Benjamin Peterson locs = dict(locs or {}, func=func) 6427e213255cee76f692dded963ec726b39319646c0Benjamin Peterson r1 = eval('func(%s)' % call_params_string, None, locs) 6437e213255cee76f692dded963ec726b39319646c0Benjamin Peterson r2 = eval('inspect.getcallargs(func, %s)' % call_params_string, None, 6447e213255cee76f692dded963ec726b39319646c0Benjamin Peterson locs) 6457e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqual(r1, r2) 6467e213255cee76f692dded963ec726b39319646c0Benjamin Peterson 6477e213255cee76f692dded963ec726b39319646c0Benjamin Peterson def assertEqualException(self, func, call_param_string, locs=None): 6487e213255cee76f692dded963ec726b39319646c0Benjamin Peterson locs = dict(locs or {}, func=func) 6497e213255cee76f692dded963ec726b39319646c0Benjamin Peterson try: 6507e213255cee76f692dded963ec726b39319646c0Benjamin Peterson eval('func(%s)' % call_param_string, None, locs) 6517e213255cee76f692dded963ec726b39319646c0Benjamin Peterson except Exception, ex1: 6527e213255cee76f692dded963ec726b39319646c0Benjamin Peterson pass 6537e213255cee76f692dded963ec726b39319646c0Benjamin Peterson else: 6547e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.fail('Exception not raised') 6557e213255cee76f692dded963ec726b39319646c0Benjamin Peterson try: 6567e213255cee76f692dded963ec726b39319646c0Benjamin Peterson eval('inspect.getcallargs(func, %s)' % call_param_string, None, 6577e213255cee76f692dded963ec726b39319646c0Benjamin Peterson locs) 6587e213255cee76f692dded963ec726b39319646c0Benjamin Peterson except Exception, ex2: 6597e213255cee76f692dded963ec726b39319646c0Benjamin Peterson pass 6607e213255cee76f692dded963ec726b39319646c0Benjamin Peterson else: 6617e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.fail('Exception not raised') 6627e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertIs(type(ex1), type(ex2)) 6637e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqual(str(ex1), str(ex2)) 6647e213255cee76f692dded963ec726b39319646c0Benjamin Peterson 6657e213255cee76f692dded963ec726b39319646c0Benjamin Peterson def makeCallable(self, signature): 6667e213255cee76f692dded963ec726b39319646c0Benjamin Peterson """Create a function that returns its locals(), excluding the 6677e213255cee76f692dded963ec726b39319646c0Benjamin Peterson autogenerated '.1', '.2', etc. tuple param names (if any).""" 668fcc500ebc4a6d93a2d610666aa37ece2663b8e22Ezio Melotti with check_py3k_warnings( 669fcc500ebc4a6d93a2d610666aa37ece2663b8e22Ezio Melotti ("tuple parameter unpacking has been removed", SyntaxWarning), 670fcc500ebc4a6d93a2d610666aa37ece2663b8e22Ezio Melotti quiet=True): 671fcc500ebc4a6d93a2d610666aa37ece2663b8e22Ezio Melotti code = ("lambda %s: dict(i for i in locals().items() " 672fcc500ebc4a6d93a2d610666aa37ece2663b8e22Ezio Melotti "if not is_tuplename(i[0]))") 673fcc500ebc4a6d93a2d610666aa37ece2663b8e22Ezio Melotti return eval(code % signature, {'is_tuplename' : self.is_tuplename}) 6747e213255cee76f692dded963ec726b39319646c0Benjamin Peterson 6757e213255cee76f692dded963ec726b39319646c0Benjamin Peterson def test_plain(self): 6767e213255cee76f692dded963ec726b39319646c0Benjamin Peterson f = self.makeCallable('a, b=1') 6777e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2') 6787e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2, 3') 6797e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, 'a=2') 6807e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, 'b=3, a=2') 6817e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2, b=3') 6827e213255cee76f692dded963ec726b39319646c0Benjamin Peterson # expand *iterable / **mapping 6837e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '*(2,)') 6847e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '*[2]') 6857e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '*(2, 3)') 6867e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '*[2, 3]') 6877e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '**{"a":2}') 6887e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, 'b=3, **{"a":2}') 6897e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2, **{"b":3}') 6907e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '**{"b":3, "a":2}') 6917e213255cee76f692dded963ec726b39319646c0Benjamin Peterson # expand UserList / UserDict 6927e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '*UserList([2])') 6937e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '*UserList([2, 3])') 6947e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '**UserDict(a=2)') 6957e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2, **UserDict(b=3)') 6967e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, 'b=2, **UserDict(a=3)') 6977e213255cee76f692dded963ec726b39319646c0Benjamin Peterson # unicode keyword args 6987e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '**{u"a":2}') 6997e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, 'b=3, **{u"a":2}') 7007e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2, **{u"b":3}') 7017e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '**{u"b":3, u"a":2}') 7027e213255cee76f692dded963ec726b39319646c0Benjamin Peterson 7037e213255cee76f692dded963ec726b39319646c0Benjamin Peterson def test_varargs(self): 7047e213255cee76f692dded963ec726b39319646c0Benjamin Peterson f = self.makeCallable('a, b=1, *c') 7057e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2') 7067e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2, 3') 7077e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2, 3, 4') 7087e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '*(2,3,4)') 7097e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2, *[3,4]') 7107e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2, 3, *UserList([4])') 7117e213255cee76f692dded963ec726b39319646c0Benjamin Peterson 7127e213255cee76f692dded963ec726b39319646c0Benjamin Peterson def test_varkw(self): 7137e213255cee76f692dded963ec726b39319646c0Benjamin Peterson f = self.makeCallable('a, b=1, **c') 7147e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, 'a=2') 7157e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2, b=3, c=4') 7167e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, 'b=3, a=2, c=4') 7177e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, 'c=4, **{"a":2, "b":3}') 7187e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2, c=4, **{"b":3}') 7197e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, 'b=2, **{"a":3, "c":4}') 7207e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '**UserDict(a=2, b=3, c=4)') 7217e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2, c=4, **UserDict(b=3)') 7227e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, 'b=2, **UserDict(a=3, c=4)') 7237e213255cee76f692dded963ec726b39319646c0Benjamin Peterson # unicode keyword args 7247e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, 'c=4, **{u"a":2, u"b":3}') 7257e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2, c=4, **{u"b":3}') 7267e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, 'b=2, **{u"a":3, u"c":4}') 7277e213255cee76f692dded963ec726b39319646c0Benjamin Peterson 72877d466079a53830e5358c5ee5fe1dd4cda40164cBenjamin Peterson def test_varkw_only(self): 72977d466079a53830e5358c5ee5fe1dd4cda40164cBenjamin Peterson # issue11256: 73077d466079a53830e5358c5ee5fe1dd4cda40164cBenjamin Peterson f = self.makeCallable('**c') 73177d466079a53830e5358c5ee5fe1dd4cda40164cBenjamin Peterson self.assertEqualCallArgs(f, '') 73277d466079a53830e5358c5ee5fe1dd4cda40164cBenjamin Peterson self.assertEqualCallArgs(f, 'a=1') 73377d466079a53830e5358c5ee5fe1dd4cda40164cBenjamin Peterson self.assertEqualCallArgs(f, 'a=1, b=2') 73477d466079a53830e5358c5ee5fe1dd4cda40164cBenjamin Peterson self.assertEqualCallArgs(f, 'c=3, **{"a": 1, "b": 2}') 73577d466079a53830e5358c5ee5fe1dd4cda40164cBenjamin Peterson self.assertEqualCallArgs(f, '**UserDict(a=1, b=2)') 73677d466079a53830e5358c5ee5fe1dd4cda40164cBenjamin Peterson self.assertEqualCallArgs(f, 'c=3, **UserDict(a=1, b=2)') 73777d466079a53830e5358c5ee5fe1dd4cda40164cBenjamin Peterson 7387e213255cee76f692dded963ec726b39319646c0Benjamin Peterson def test_tupleargs(self): 7397e213255cee76f692dded963ec726b39319646c0Benjamin Peterson f = self.makeCallable('(b,c), (d,(e,f))=(0,[1,2])') 7407e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '(2,3)') 7417e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '[2,3]') 7427e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, 'UserList([2,3])') 7437e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '(2,3), (4,(5,6))') 7447e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '(2,3), (4,[5,6])') 7457e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '(2,3), [4,UserList([5,6])]') 7467e213255cee76f692dded963ec726b39319646c0Benjamin Peterson 7477e213255cee76f692dded963ec726b39319646c0Benjamin Peterson def test_multiple_features(self): 7487e213255cee76f692dded963ec726b39319646c0Benjamin Peterson f = self.makeCallable('a, b=2, (c,(d,e))=(3,[4,5]), *f, **g') 7497e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2, 3, (4,[5,6]), 7') 7507e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2, 3, *[(4,[5,6]), 7], x=8') 7517e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2, 3, x=8, *[(4,[5,6]), 7]') 7527e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2, x=8, *[3, (4,[5,6]), 7], y=9') 7537e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, 'x=8, *[2, 3, (4,[5,6])], y=9') 7547e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, 'x=8, *UserList([2, 3, (4,[5,6])]), ' 7557e213255cee76f692dded963ec726b39319646c0Benjamin Peterson '**{"y":9, "z":10}') 7567e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2, x=8, *UserList([3, (4,[5,6])]), ' 7577e213255cee76f692dded963ec726b39319646c0Benjamin Peterson '**UserDict(y=9, z=10)') 7587e213255cee76f692dded963ec726b39319646c0Benjamin Peterson 7597e213255cee76f692dded963ec726b39319646c0Benjamin Peterson def test_errors(self): 7607e213255cee76f692dded963ec726b39319646c0Benjamin Peterson f0 = self.makeCallable('') 7617e213255cee76f692dded963ec726b39319646c0Benjamin Peterson f1 = self.makeCallable('a, b') 7627e213255cee76f692dded963ec726b39319646c0Benjamin Peterson f2 = self.makeCallable('a, b=1') 7637e213255cee76f692dded963ec726b39319646c0Benjamin Peterson # f0 takes no arguments 7647e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f0, '1') 7657e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f0, 'x=1') 7667e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f0, '1,x=1') 7677e213255cee76f692dded963ec726b39319646c0Benjamin Peterson # f1 takes exactly 2 arguments 7687e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f1, '') 7697e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f1, '1') 7707e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f1, 'a=2') 7717e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f1, 'b=3') 7727e213255cee76f692dded963ec726b39319646c0Benjamin Peterson # f2 takes at least 1 argument 7737e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f2, '') 7747e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f2, 'b=3') 7757e213255cee76f692dded963ec726b39319646c0Benjamin Peterson for f in f1, f2: 7767e213255cee76f692dded963ec726b39319646c0Benjamin Peterson # f1/f2 takes exactly/at most 2 arguments 7777e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f, '2, 3, 4') 7787e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f, '1, 2, 3, a=1') 7797e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f, '2, 3, 4, c=5') 7807e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f, '2, 3, 4, a=1, c=5') 7817e213255cee76f692dded963ec726b39319646c0Benjamin Peterson # f got an unexpected keyword argument 7827e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f, 'c=2') 7837e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f, '2, c=3') 7847e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f, '2, 3, c=4') 7857e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f, '2, c=4, b=3') 7867e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f, '**{u"\u03c0\u03b9": 4}') 7877e213255cee76f692dded963ec726b39319646c0Benjamin Peterson # f got multiple values for keyword argument 7887e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f, '1, a=2') 7897e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f, '1, **{"a":2}') 7907e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f, '1, 2, b=3') 7917e213255cee76f692dded963ec726b39319646c0Benjamin Peterson # XXX: Python inconsistency 7927e213255cee76f692dded963ec726b39319646c0Benjamin Peterson # - for functions and bound methods: unexpected keyword 'c' 7937e213255cee76f692dded963ec726b39319646c0Benjamin Peterson # - for unbound methods: multiple values for keyword 'a' 7947e213255cee76f692dded963ec726b39319646c0Benjamin Peterson #self.assertEqualException(f, '1, c=3, a=2') 7957e213255cee76f692dded963ec726b39319646c0Benjamin Peterson f = self.makeCallable('(a,b)=(0,1)') 7967e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f, '1') 7977e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f, '[1]') 7987e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f, '(1,2,3)') 79977d466079a53830e5358c5ee5fe1dd4cda40164cBenjamin Peterson # issue11256: 80077d466079a53830e5358c5ee5fe1dd4cda40164cBenjamin Peterson f3 = self.makeCallable('**c') 80177d466079a53830e5358c5ee5fe1dd4cda40164cBenjamin Peterson self.assertEqualException(f3, '1, 2') 80277d466079a53830e5358c5ee5fe1dd4cda40164cBenjamin Peterson self.assertEqualException(f3, '1, 2, a=1, b=2') 8037e213255cee76f692dded963ec726b39319646c0Benjamin Peterson 8047e213255cee76f692dded963ec726b39319646c0Benjamin Petersonclass TestGetcallargsMethods(TestGetcallargsFunctions): 8057e213255cee76f692dded963ec726b39319646c0Benjamin Peterson 8067e213255cee76f692dded963ec726b39319646c0Benjamin Peterson def setUp(self): 8077e213255cee76f692dded963ec726b39319646c0Benjamin Peterson class Foo(object): 8087e213255cee76f692dded963ec726b39319646c0Benjamin Peterson pass 8097e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.cls = Foo 8107e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.inst = Foo() 8117e213255cee76f692dded963ec726b39319646c0Benjamin Peterson 8127e213255cee76f692dded963ec726b39319646c0Benjamin Peterson def makeCallable(self, signature): 8137e213255cee76f692dded963ec726b39319646c0Benjamin Peterson assert 'self' not in signature 8147e213255cee76f692dded963ec726b39319646c0Benjamin Peterson mk = super(TestGetcallargsMethods, self).makeCallable 8157e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.cls.method = mk('self, ' + signature) 8167e213255cee76f692dded963ec726b39319646c0Benjamin Peterson return self.inst.method 8177e213255cee76f692dded963ec726b39319646c0Benjamin Peterson 8187e213255cee76f692dded963ec726b39319646c0Benjamin Petersonclass TestGetcallargsUnboundMethods(TestGetcallargsMethods): 8197e213255cee76f692dded963ec726b39319646c0Benjamin Peterson 8207e213255cee76f692dded963ec726b39319646c0Benjamin Peterson def makeCallable(self, signature): 8217e213255cee76f692dded963ec726b39319646c0Benjamin Peterson super(TestGetcallargsUnboundMethods, self).makeCallable(signature) 8227e213255cee76f692dded963ec726b39319646c0Benjamin Peterson return self.cls.method 8237e213255cee76f692dded963ec726b39319646c0Benjamin Peterson 8247e213255cee76f692dded963ec726b39319646c0Benjamin Peterson def assertEqualCallArgs(self, func, call_params_string, locs=None): 8257e213255cee76f692dded963ec726b39319646c0Benjamin Peterson return super(TestGetcallargsUnboundMethods, self).assertEqualCallArgs( 8267e213255cee76f692dded963ec726b39319646c0Benjamin Peterson *self._getAssertEqualParams(func, call_params_string, locs)) 8277e213255cee76f692dded963ec726b39319646c0Benjamin Peterson 8287e213255cee76f692dded963ec726b39319646c0Benjamin Peterson def assertEqualException(self, func, call_params_string, locs=None): 8297e213255cee76f692dded963ec726b39319646c0Benjamin Peterson return super(TestGetcallargsUnboundMethods, self).assertEqualException( 8307e213255cee76f692dded963ec726b39319646c0Benjamin Peterson *self._getAssertEqualParams(func, call_params_string, locs)) 8317e213255cee76f692dded963ec726b39319646c0Benjamin Peterson 8327e213255cee76f692dded963ec726b39319646c0Benjamin Peterson def _getAssertEqualParams(self, func, call_params_string, locs=None): 8337e213255cee76f692dded963ec726b39319646c0Benjamin Peterson assert 'inst' not in call_params_string 8347e213255cee76f692dded963ec726b39319646c0Benjamin Peterson locs = dict(locs or {}, inst=self.inst) 8357e213255cee76f692dded963ec726b39319646c0Benjamin Peterson return (func, 'inst,' + call_params_string, locs) 8367e213255cee76f692dded963ec726b39319646c0Benjamin Peterson 837cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbersdef test_main(): 8387e213255cee76f692dded963ec726b39319646c0Benjamin Peterson run_unittest( 8397e213255cee76f692dded963ec726b39319646c0Benjamin Peterson TestDecorators, TestRetrievingSourceCode, TestOneliners, TestBuggyCases, 8407e213255cee76f692dded963ec726b39319646c0Benjamin Peterson TestInterpreterStack, TestClassesAndFunctions, TestPredicates, 8417e213255cee76f692dded963ec726b39319646c0Benjamin Peterson TestGetcallargsFunctions, TestGetcallargsMethods, 8427e213255cee76f692dded963ec726b39319646c0Benjamin Peterson TestGetcallargsUnboundMethods) 843cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 844cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbersif __name__ == "__main__": 845cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers test_main() 846