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 11d6bfa94493b897f45ab939208a4a54a259a530e8Serhiy Storchakafrom test.test_support import run_unittest, check_py3k_warnings, have_unicode 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 20d6bfa94493b897f45ab939208a4a54a259a530e8Serhiy Storchakatry: 21d6bfa94493b897f45ab939208a4a54a259a530e8Serhiy Storchaka import unicodedata 22d6bfa94493b897f45ab939208a4a54a259a530e8Serhiy Storchakaexcept ImportError: 23d6bfa94493b897f45ab939208a4a54a259a530e8Serhiy Storchaka unicodedata = None 24996ba0260209aaac0e1cd29516dc2ba7120c698bR. David Murray 256397c7c9a96de6a253da0210239a6fdeafe42a18Ka-Ping Yee# Functions tested in this suite: 266397c7c9a96de6a253da0210239a6fdeafe42a18Ka-Ping Yee# ismodule, isclass, ismethod, isfunction, istraceback, isframe, iscode, 27759bfc6207e7979d4eaeed2a2ae611e1804aef55Facundo Batista# isbuiltin, isroutine, isgenerator, isgeneratorfunction, getmembers, 28759bfc6207e7979d4eaeed2a2ae611e1804aef55Facundo Batista# getdoc, getfile, getmodule, getsourcefile, getcomments, getsource, 29759bfc6207e7979d4eaeed2a2ae611e1804aef55Facundo Batista# getclasstree, getargspec, getargvalues, formatargspec, formatargvalues, 30759bfc6207e7979d4eaeed2a2ae611e1804aef55Facundo Batista# currentframe, stack, trace, isdatadescriptor 316397c7c9a96de6a253da0210239a6fdeafe42a18Ka-Ping Yee 32a2053475bb8a908e1cc80c765e02c98a6f354b19Nick Coghlan# NOTE: There are some additional tests relating to interaction with 33a2053475bb8a908e1cc80c765e02c98a6f354b19Nick Coghlan# zipimport in the test_zipimport_support test module. 34a2053475bb8a908e1cc80c765e02c98a6f354b19Nick Coghlan 35cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbersmodfile = mod.__file__ 36b2afe855e5d75a570707d6bf0e32206e4b7b1c4dGeorg Brandlif modfile.endswith(('c', 'o')): 37cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers modfile = modfile[:-1] 386397c7c9a96de6a253da0210239a6fdeafe42a18Ka-Ping Yee 39cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbersimport __builtin__ 406397c7c9a96de6a253da0210239a6fdeafe42a18Ka-Ping Yee 416397c7c9a96de6a253da0210239a6fdeafe42a18Ka-Ping Yeetry: 4207627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna 1 // 0 436397c7c9a96de6a253da0210239a6fdeafe42a18Ka-Ping Yeeexcept: 446397c7c9a96de6a253da0210239a6fdeafe42a18Ka-Ping Yee tb = sys.exc_traceback 456397c7c9a96de6a253da0210239a6fdeafe42a18Ka-Ping Yee 46cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbersgit = mod.StupidGit() 47cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 48cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbersclass IsTestBase(unittest.TestCase): 49cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers predicates = set([inspect.isbuiltin, inspect.isclass, inspect.iscode, 50cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers inspect.isframe, inspect.isfunction, inspect.ismethod, 51759bfc6207e7979d4eaeed2a2ae611e1804aef55Facundo Batista inspect.ismodule, inspect.istraceback, 52759bfc6207e7979d4eaeed2a2ae611e1804aef55Facundo Batista inspect.isgenerator, inspect.isgeneratorfunction]) 535a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Peters 54cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def istest(self, predicate, exp): 55cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers obj = eval(exp) 565c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(predicate(obj), '%s(%s)' % (predicate.__name__, exp)) 575a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Peters 58cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers for other in self.predicates - set([predicate]): 59759bfc6207e7979d4eaeed2a2ae611e1804aef55Facundo Batista if predicate == inspect.isgeneratorfunction and\ 60759bfc6207e7979d4eaeed2a2ae611e1804aef55Facundo Batista other == inspect.isfunction: 61759bfc6207e7979d4eaeed2a2ae611e1804aef55Facundo Batista continue 625c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertFalse(other(obj), 'not %s(%s)' % (other.__name__, exp)) 63cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 64759bfc6207e7979d4eaeed2a2ae611e1804aef55Facundo Batistadef generator_function_example(self): 65759bfc6207e7979d4eaeed2a2ae611e1804aef55Facundo Batista for i in xrange(2): 66759bfc6207e7979d4eaeed2a2ae611e1804aef55Facundo Batista yield i 67759bfc6207e7979d4eaeed2a2ae611e1804aef55Facundo Batista 68cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbersclass TestPredicates(IsTestBase): 69728bee897ff35702dd6f651b9e551761ec843c01Christian Heimes def test_sixteen(self): 70cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers count = len(filter(lambda x:x.startswith('is'), dir(inspect))) 71759bfc6207e7979d4eaeed2a2ae611e1804aef55Facundo Batista # This test is here for remember you to update Doc/library/inspect.rst 7226bc177fe6b1710cc306adee3be17145db4686caGeorg Brandl # which claims there are 16 such functions 73728bee897ff35702dd6f651b9e551761ec843c01Christian Heimes expected = 16 74df80af7659c05e45bb3500ce4cecca1f3f426280Neal Norwitz err_msg = "There are %d (not %d) is* functions" % (count, expected) 75df80af7659c05e45bb3500ce4cecca1f3f426280Neal Norwitz self.assertEqual(count, expected, err_msg) 765a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Peters 77759bfc6207e7979d4eaeed2a2ae611e1804aef55Facundo Batista 78cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_excluding_predicates(self): 79cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.istest(inspect.isbuiltin, 'sys.exit') 80cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.istest(inspect.isbuiltin, '[].append') 81cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.istest(inspect.iscode, 'mod.spam.func_code') 82cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.istest(inspect.isframe, 'tb.tb_frame') 83cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.istest(inspect.isfunction, 'mod.spam') 84cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.istest(inspect.ismethod, 'mod.StupidGit.abuse') 85cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.istest(inspect.ismethod, 'git.argue') 86cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.istest(inspect.ismodule, 'mod') 87cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.istest(inspect.istraceback, 'tb') 88cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.istest(inspect.isdatadescriptor, '__builtin__.file.closed') 89cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.istest(inspect.isdatadescriptor, '__builtin__.file.softspace') 90759bfc6207e7979d4eaeed2a2ae611e1804aef55Facundo Batista self.istest(inspect.isgenerator, '(x for x in xrange(2))') 91759bfc6207e7979d4eaeed2a2ae611e1804aef55Facundo Batista self.istest(inspect.isgeneratorfunction, 'generator_function_example') 9200decd7835f0c2488451cedc345f2fb0650378b5Barry Warsaw if hasattr(types, 'GetSetDescriptorType'): 9300decd7835f0c2488451cedc345f2fb0650378b5Barry Warsaw self.istest(inspect.isgetsetdescriptor, 9400decd7835f0c2488451cedc345f2fb0650378b5Barry Warsaw 'type(tb.tb_frame).f_locals') 9500decd7835f0c2488451cedc345f2fb0650378b5Barry Warsaw else: 965c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertFalse(inspect.isgetsetdescriptor(type(tb.tb_frame).f_locals)) 9700decd7835f0c2488451cedc345f2fb0650378b5Barry Warsaw if hasattr(types, 'MemberDescriptorType'): 9800decd7835f0c2488451cedc345f2fb0650378b5Barry Warsaw self.istest(inspect.ismemberdescriptor, 'datetime.timedelta.days') 9900decd7835f0c2488451cedc345f2fb0650378b5Barry Warsaw else: 1005c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertFalse(inspect.ismemberdescriptor(datetime.timedelta.days)) 101cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 102cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_isroutine(self): 1035c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(inspect.isroutine(mod.spam)) 1045c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(inspect.isroutine([].count)) 105cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 1065e5fbb612d8109078c2777e1759277f9144616d0Benjamin Peterson def test_isclass(self): 1075e5fbb612d8109078c2777e1759277f9144616d0Benjamin Peterson self.istest(inspect.isclass, 'mod.StupidGit') 1085e5fbb612d8109078c2777e1759277f9144616d0Benjamin Peterson self.assertTrue(inspect.isclass(list)) 1095e5fbb612d8109078c2777e1759277f9144616d0Benjamin Peterson 1105e5fbb612d8109078c2777e1759277f9144616d0Benjamin Peterson class newstyle(object): pass 1115e5fbb612d8109078c2777e1759277f9144616d0Benjamin Peterson self.assertTrue(inspect.isclass(newstyle)) 1125e5fbb612d8109078c2777e1759277f9144616d0Benjamin Peterson 1135e5fbb612d8109078c2777e1759277f9144616d0Benjamin Peterson class CustomGetattr(object): 1145e5fbb612d8109078c2777e1759277f9144616d0Benjamin Peterson def __getattr__(self, attr): 1155e5fbb612d8109078c2777e1759277f9144616d0Benjamin Peterson return None 1165e5fbb612d8109078c2777e1759277f9144616d0Benjamin Peterson self.assertFalse(inspect.isclass(CustomGetattr())) 1175e5fbb612d8109078c2777e1759277f9144616d0Benjamin Peterson 118b54447f31cf8f590ef526d2707f26041720f5784Amaury Forgeot d'Arc def test_get_slot_members(self): 119b54447f31cf8f590ef526d2707f26041720f5784Amaury Forgeot d'Arc class C(object): 120b54447f31cf8f590ef526d2707f26041720f5784Amaury Forgeot d'Arc __slots__ = ("a", "b") 121b54447f31cf8f590ef526d2707f26041720f5784Amaury Forgeot d'Arc 122b54447f31cf8f590ef526d2707f26041720f5784Amaury Forgeot d'Arc x = C() 123b54447f31cf8f590ef526d2707f26041720f5784Amaury Forgeot d'Arc x.a = 42 124b54447f31cf8f590ef526d2707f26041720f5784Amaury Forgeot d'Arc members = dict(inspect.getmembers(x)) 125aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn('a', members) 126aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertNotIn('b', members) 127b54447f31cf8f590ef526d2707f26041720f5784Amaury Forgeot d'Arc 128c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson def test_isabstract(self): 129c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson from abc import ABCMeta, abstractmethod 130c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson 131c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson class AbstractClassExample(object): 132c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson __metaclass__ = ABCMeta 133c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson 134c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson @abstractmethod 135c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson def foo(self): 136c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson pass 137c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson 138c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson class ClassExample(AbstractClassExample): 139c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson def foo(self): 140c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson pass 141c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson 142c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson a = ClassExample() 143c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson 144c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson # Test general behaviour. 145c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson self.assertTrue(inspect.isabstract(AbstractClassExample)) 146c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson self.assertFalse(inspect.isabstract(ClassExample)) 147c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson self.assertFalse(inspect.isabstract(a)) 148c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson self.assertFalse(inspect.isabstract(int)) 149c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson self.assertFalse(inspect.isabstract(5)) 150c63457b18e986ae74a13e5b6601bdbd58e909c84Benjamin Peterson 151b54447f31cf8f590ef526d2707f26041720f5784Amaury Forgeot d'Arc 152cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbersclass TestInterpreterStack(IsTestBase): 153cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def __init__(self, *args, **kwargs): 154cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers unittest.TestCase.__init__(self, *args, **kwargs) 1555a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Peters 156cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers git.abuse(7, 8, 9) 157cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 158cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_abuse_done(self): 159cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.istest(inspect.istraceback, 'git.ex[2]') 160cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.istest(inspect.isframe, 'mod.fr') 161cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 162cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_stack(self): 1635c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(len(mod.st) >= 5) 164cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(mod.st[0][1:], 1655a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Peters (modfile, 16, 'eggs', [' st = inspect.stack()\n'], 0)) 166cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(mod.st[1][1:], 167cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers (modfile, 9, 'spam', [' eggs(b + d, c + f)\n'], 0)) 168cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(mod.st[2][1:], 169cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers (modfile, 43, 'argue', [' spam(a, b, c)\n'], 0)) 170cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(mod.st[3][1:], 171cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers (modfile, 39, 'abuse', [' self.argue(a, b, c)\n'], 0)) 172cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 173cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_trace(self): 174cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(len(git.tr), 3) 175cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(git.tr[0][1:], (modfile, 43, 'argue', 176cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers [' spam(a, b, c)\n'], 0)) 177cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(git.tr[1][1:], (modfile, 9, 'spam', 178cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers [' eggs(b + d, c + f)\n'], 0)) 179cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(git.tr[2][1:], (modfile, 18, 'eggs', 180c68e9f0d200751692b9f54db337b80a465667faeMark Dickinson [' q = y // 0\n'], 0)) 181cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 182cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_frame(self): 183cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers args, varargs, varkw, locals = inspect.getargvalues(mod.fr) 184cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(args, ['x', 'y']) 185cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(varargs, None) 186cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(varkw, None) 187cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(locals, {'x': 11, 'p': 11, 'y': 14}) 188cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(inspect.formatargvalues(args, varargs, varkw, locals), 189cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers '(x=11, y=14)') 190cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 191cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_previous_frame(self): 192cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers args, varargs, varkw, locals = inspect.getargvalues(mod.fr.f_back) 193cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(args, ['a', 'b', 'c', 'd', ['e', ['f']]]) 194cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(varargs, 'g') 195cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(varkw, 'h') 196cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(inspect.formatargvalues(args, varargs, varkw, locals), 197cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers '(a=7, b=8, c=9, d=3, (e=4, (f=5,)), *g=(), **h={})') 198cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 199cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbersclass GetSourceBase(unittest.TestCase): 200cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers # Subclasses must override. 201cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers fodderFile = None 2025a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Peters 203cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def __init__(self, *args, **kwargs): 204cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers unittest.TestCase.__init__(self, *args, **kwargs) 205cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 2066a111027f2c1607d3e03acee6256eef38fafb206Philip Jenvey with open(inspect.getsourcefile(self.fodderFile)) as fp: 2076a111027f2c1607d3e03acee6256eef38fafb206Philip Jenvey self.source = fp.read() 208cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 209cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def sourcerange(self, top, bottom): 210cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers lines = self.source.split("\n") 211cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers return "\n".join(lines[top-1:bottom]) + "\n" 212cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 213cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def assertSourceEqual(self, obj, top, bottom): 214cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(inspect.getsource(obj), 215cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.sourcerange(top, bottom)) 2165a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Peters 217cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbersclass TestRetrievingSourceCode(GetSourceBase): 218cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers fodderFile = mod 2195a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Peters 220cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_getclasses(self): 221cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers classes = inspect.getmembers(mod, inspect.isclass) 222cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(classes, 223cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers [('FesteringGob', mod.FesteringGob), 224cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers ('MalodorousPervert', mod.MalodorousPervert), 225cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers ('ParrotDroppings', mod.ParrotDroppings), 2266db9e88effca95d6d48db243a05169b3ed79bc2dSerhiy Storchaka ('StupidGit', mod.StupidGit), 2276db9e88effca95d6d48db243a05169b3ed79bc2dSerhiy Storchaka ('Tit', mod.MalodorousPervert), 2286db9e88effca95d6d48db243a05169b3ed79bc2dSerhiy Storchaka ]) 2296db9e88effca95d6d48db243a05169b3ed79bc2dSerhiy Storchaka tree = inspect.getclasstree([cls[1] for cls in classes]) 2306db9e88effca95d6d48db243a05169b3ed79bc2dSerhiy Storchaka self.assertEqual(tree, 2316db9e88effca95d6d48db243a05169b3ed79bc2dSerhiy Storchaka [(mod.ParrotDroppings, ()), 2326db9e88effca95d6d48db243a05169b3ed79bc2dSerhiy Storchaka [(mod.FesteringGob, (mod.MalodorousPervert, 2336db9e88effca95d6d48db243a05169b3ed79bc2dSerhiy Storchaka mod.ParrotDroppings)) 2346db9e88effca95d6d48db243a05169b3ed79bc2dSerhiy Storchaka ], 2356db9e88effca95d6d48db243a05169b3ed79bc2dSerhiy Storchaka (mod.StupidGit, ()), 2366db9e88effca95d6d48db243a05169b3ed79bc2dSerhiy Storchaka [(mod.MalodorousPervert, (mod.StupidGit,)), 2376db9e88effca95d6d48db243a05169b3ed79bc2dSerhiy Storchaka [(mod.FesteringGob, (mod.MalodorousPervert, 2386db9e88effca95d6d48db243a05169b3ed79bc2dSerhiy Storchaka mod.ParrotDroppings)) 2396db9e88effca95d6d48db243a05169b3ed79bc2dSerhiy Storchaka ] 2406db9e88effca95d6d48db243a05169b3ed79bc2dSerhiy Storchaka ] 2416db9e88effca95d6d48db243a05169b3ed79bc2dSerhiy Storchaka ]) 2426db9e88effca95d6d48db243a05169b3ed79bc2dSerhiy Storchaka tree = inspect.getclasstree([cls[1] for cls in classes], True) 243cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(tree, 244cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers [(mod.ParrotDroppings, ()), 245cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers (mod.StupidGit, ()), 246cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers [(mod.MalodorousPervert, (mod.StupidGit,)), 247cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers [(mod.FesteringGob, (mod.MalodorousPervert, 248cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers mod.ParrotDroppings)) 249cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers ] 250cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers ] 251cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers ]) 2525a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Peters 253cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_getfunctions(self): 254cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers functions = inspect.getmembers(mod, inspect.isfunction) 255cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(functions, [('eggs', mod.eggs), 256cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers ('spam', mod.spam)]) 257cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 258f28fd24c36310541a1f3ec74e92e8d38629dd5d8R. David Murray @unittest.skipIf(sys.flags.optimize >= 2, 259f28fd24c36310541a1f3ec74e92e8d38629dd5d8R. David Murray "Docstrings are omitted with -O2 and above") 260cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_getdoc(self): 261cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(inspect.getdoc(mod), 'A module docstring.') 262cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(inspect.getdoc(mod.StupidGit), 263cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 'A longer,\n\nindented\n\ndocstring.') 264cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(inspect.getdoc(git.abuse), 265cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 'Another\n\ndocstring\n\ncontaining\n\ntabs') 266cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 2677be19aabe20a04d8038383bc96c3dd96f27892c0Georg Brandl def test_cleandoc(self): 2687be19aabe20a04d8038383bc96c3dd96f27892c0Georg Brandl self.assertEqual(inspect.cleandoc('An\n indented\n docstring.'), 2697be19aabe20a04d8038383bc96c3dd96f27892c0Georg Brandl 'An\nindented\ndocstring.') 2707be19aabe20a04d8038383bc96c3dd96f27892c0Georg Brandl 271cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_getcomments(self): 272cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(inspect.getcomments(mod), '# line 1\n') 273cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(inspect.getcomments(mod.StupidGit), '# line 20\n') 274cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 275cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_getmodule(self): 276c495c66ea922e3ce8d822716a7abbf28ee709b71Nick Coghlan # Check actual module 277c495c66ea922e3ce8d822716a7abbf28ee709b71Nick Coghlan self.assertEqual(inspect.getmodule(mod), mod) 278c495c66ea922e3ce8d822716a7abbf28ee709b71Nick Coghlan # Check class (uses __module__ attribute) 279cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(inspect.getmodule(mod.StupidGit), mod) 280c495c66ea922e3ce8d822716a7abbf28ee709b71Nick Coghlan # Check a method (no __module__ attribute, falls back to filename) 281c495c66ea922e3ce8d822716a7abbf28ee709b71Nick Coghlan self.assertEqual(inspect.getmodule(mod.StupidGit.abuse), mod) 282c495c66ea922e3ce8d822716a7abbf28ee709b71Nick Coghlan # Do it again (check the caching isn't broken) 283c495c66ea922e3ce8d822716a7abbf28ee709b71Nick Coghlan self.assertEqual(inspect.getmodule(mod.StupidGit.abuse), mod) 284c495c66ea922e3ce8d822716a7abbf28ee709b71Nick Coghlan # Check a builtin 285c495c66ea922e3ce8d822716a7abbf28ee709b71Nick Coghlan self.assertEqual(inspect.getmodule(str), sys.modules["__builtin__"]) 286c495c66ea922e3ce8d822716a7abbf28ee709b71Nick Coghlan # Check filename override 287c495c66ea922e3ce8d822716a7abbf28ee709b71Nick Coghlan self.assertEqual(inspect.getmodule(None, modfile), mod) 288cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 289cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_getsource(self): 290cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertSourceEqual(git.abuse, 29, 39) 291cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertSourceEqual(mod.StupidGit, 21, 46) 292cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 293cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_getsourcefile(self): 2945a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Peters self.assertEqual(inspect.getsourcefile(mod.spam), modfile) 2955a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Peters self.assertEqual(inspect.getsourcefile(git.abuse), modfile) 296df1cf301c2da740f9271b3ff164d7f0e5cb9082cR. David Murray fn = "_non_existing_filename_used_for_sourcefile_test.py" 297df1cf301c2da740f9271b3ff164d7f0e5cb9082cR. David Murray co = compile("None", fn, "exec") 298df1cf301c2da740f9271b3ff164d7f0e5cb9082cR. David Murray self.assertEqual(inspect.getsourcefile(co), None) 299df1cf301c2da740f9271b3ff164d7f0e5cb9082cR. David Murray linecache.cache[co.co_filename] = (1, None, "None", co.co_filename) 300df1cf301c2da740f9271b3ff164d7f0e5cb9082cR. David Murray self.assertEqual(inspect.getsourcefile(co), fn) 301cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 302cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_getfile(self): 303cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(inspect.getfile(mod.StupidGit), mod.__file__) 304cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 3055d86bdb3aebb14228d3c2e3f921bda34cf1c886cPhillip J. Eby def test_getmodule_recursion(self): 306c756d00cf20ba094a93f09647e80b688ded61bf5Christian Heimes from types import ModuleType 3075d86bdb3aebb14228d3c2e3f921bda34cf1c886cPhillip J. Eby name = '__inspect_dummy' 308c756d00cf20ba094a93f09647e80b688ded61bf5Christian Heimes m = sys.modules[name] = ModuleType(name) 309722b88308da16225530a8852adc0581a918d5105Tim Peters m.__file__ = "<string>" # hopefully not a real filename... 3105d86bdb3aebb14228d3c2e3f921bda34cf1c886cPhillip J. Eby m.__loader__ = "dummy" # pretend the filename is understood by a loader 3115d86bdb3aebb14228d3c2e3f921bda34cf1c886cPhillip J. Eby exec "def x(): pass" in m.__dict__ 3125d86bdb3aebb14228d3c2e3f921bda34cf1c886cPhillip J. Eby self.assertEqual(inspect.getsourcefile(m.x.func_code), '<string>') 3135d86bdb3aebb14228d3c2e3f921bda34cf1c886cPhillip J. Eby del sys.modules[name] 3141a2959cfa80f43d9a250e6b7ee39cee51b7e8a57Phillip J. Eby inspect.getmodule(compile('a=10','','single')) 3155d86bdb3aebb14228d3c2e3f921bda34cf1c886cPhillip J. Eby 3160eb4ac4c6258ecbcbcb65022f3987fe30f31f527Benjamin Peterson def test_proceed_with_fake_filename(self): 3170eb4ac4c6258ecbcbcb65022f3987fe30f31f527Benjamin Peterson '''doctest monkeypatches linecache to enable inspection''' 3180eb4ac4c6258ecbcbcb65022f3987fe30f31f527Benjamin Peterson fn, source = '<test>', 'def x(): pass\n' 3190eb4ac4c6258ecbcbcb65022f3987fe30f31f527Benjamin Peterson getlines = linecache.getlines 3200eb4ac4c6258ecbcbcb65022f3987fe30f31f527Benjamin Peterson def monkey(filename, module_globals=None): 3210eb4ac4c6258ecbcbcb65022f3987fe30f31f527Benjamin Peterson if filename == fn: 3220eb4ac4c6258ecbcbcb65022f3987fe30f31f527Benjamin Peterson return source.splitlines(True) 3230eb4ac4c6258ecbcbcb65022f3987fe30f31f527Benjamin Peterson else: 3240eb4ac4c6258ecbcbcb65022f3987fe30f31f527Benjamin Peterson return getlines(filename, module_globals) 3250eb4ac4c6258ecbcbcb65022f3987fe30f31f527Benjamin Peterson linecache.getlines = monkey 3260eb4ac4c6258ecbcbcb65022f3987fe30f31f527Benjamin Peterson try: 3270eb4ac4c6258ecbcbcb65022f3987fe30f31f527Benjamin Peterson ns = {} 3280eb4ac4c6258ecbcbcb65022f3987fe30f31f527Benjamin Peterson exec compile(source, fn, 'single') in ns 3290eb4ac4c6258ecbcbcb65022f3987fe30f31f527Benjamin Peterson inspect.getsource(ns["x"]) 3300eb4ac4c6258ecbcbcb65022f3987fe30f31f527Benjamin Peterson finally: 3310eb4ac4c6258ecbcbcb65022f3987fe30f31f527Benjamin Peterson linecache.getlines = getlines 3320eb4ac4c6258ecbcbcb65022f3987fe30f31f527Benjamin Peterson 333cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbersclass TestDecorators(GetSourceBase): 334cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers fodderFile = mod2 335cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 336cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_wrapped_decorator(self): 337cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertSourceEqual(mod2.wrapped, 14, 17) 338cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 339cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_replacing_decorator(self): 340cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertSourceEqual(mod2.gone, 9, 10) 341cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 3421542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbersclass TestOneliners(GetSourceBase): 3431542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers fodderFile = mod2 3441542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers def test_oneline_lambda(self): 3451542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers # Test inspect.getsource with a one-line lambda function. 3461542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers self.assertSourceEqual(mod2.oll, 25, 25) 3475a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Peters 3481542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers def test_threeline_lambda(self): 3491542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers # Test inspect.getsource with a three-line lambda function, 3501542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers # where the second and third lines are _not_ indented. 3515a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Peters self.assertSourceEqual(mod2.tll, 28, 30) 3525a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Peters 3531542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers def test_twoline_indented_lambda(self): 3541542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers # Test inspect.getsource with a two-line lambda function, 3551542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers # where the second line _is_ indented. 3561542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers self.assertSourceEqual(mod2.tlli, 33, 34) 3575a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Peters 3581542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers def test_onelinefunc(self): 3591542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers # Test inspect.getsource with a regular one-line function. 3601542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers self.assertSourceEqual(mod2.onelinefunc, 37, 37) 3615a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Peters 3621542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers def test_manyargs(self): 3631542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers # Test inspect.getsource with a regular function where 3641542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers # the arguments are on two lines and _not_ indented and 3651542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers # the body on the second line with the last arguments. 3661542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers self.assertSourceEqual(mod2.manyargs, 40, 41) 3675a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Peters 3681542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers def test_twolinefunc(self): 3691542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers # Test inspect.getsource with a regular function where 3701542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers # the body is on two lines, following the argument list and 3711542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers # continued on the next line by a \\. 3721542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers self.assertSourceEqual(mod2.twolinefunc, 44, 45) 3735a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Peters 3741542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers def test_lambda_in_list(self): 3751542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers # Test inspect.getsource with a one-line lambda function 3761542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers # defined in a list, indented. 3771542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers self.assertSourceEqual(mod2.a[1], 49, 49) 3785a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Peters 3791542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers def test_anonymous(self): 3801542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers # Test inspect.getsource with a lambda function defined 3811542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers # as argument to another function. 3821542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers self.assertSourceEqual(mod2.anonymous, 55, 55) 3831542f34c42de544cf11e400906149c6252b42ae7Johannes Gijsbers 384a5855d5ace1c1426e1247272c688ccc11ae02f7cJohannes Gijsbersclass TestBuggyCases(GetSourceBase): 385a5855d5ace1c1426e1247272c688ccc11ae02f7cJohannes Gijsbers fodderFile = mod2 386a5855d5ace1c1426e1247272c688ccc11ae02f7cJohannes Gijsbers 387a5855d5ace1c1426e1247272c688ccc11ae02f7cJohannes Gijsbers def test_with_comment(self): 388a5855d5ace1c1426e1247272c688ccc11ae02f7cJohannes Gijsbers self.assertSourceEqual(mod2.with_comment, 58, 59) 389a5855d5ace1c1426e1247272c688ccc11ae02f7cJohannes Gijsbers 390a5855d5ace1c1426e1247272c688ccc11ae02f7cJohannes Gijsbers def test_multiline_sig(self): 391a5855d5ace1c1426e1247272c688ccc11ae02f7cJohannes Gijsbers self.assertSourceEqual(mod2.multiline_sig[0], 63, 64) 392a5855d5ace1c1426e1247272c688ccc11ae02f7cJohannes Gijsbers 393dd5c023af56b9a424a3965364521c50b73308379Armin Rigo def test_nested_class(self): 394dd5c023af56b9a424a3965364521c50b73308379Armin Rigo self.assertSourceEqual(mod2.func69().func71, 71, 72) 395dd5c023af56b9a424a3965364521c50b73308379Armin Rigo 396dd5c023af56b9a424a3965364521c50b73308379Armin Rigo def test_one_liner_followed_by_non_name(self): 397dd5c023af56b9a424a3965364521c50b73308379Armin Rigo self.assertSourceEqual(mod2.func77, 77, 77) 398dd5c023af56b9a424a3965364521c50b73308379Armin Rigo 399dd5c023af56b9a424a3965364521c50b73308379Armin Rigo def test_one_liner_dedent_non_name(self): 400dd5c023af56b9a424a3965364521c50b73308379Armin Rigo self.assertSourceEqual(mod2.cls82.func83, 83, 83) 401dd5c023af56b9a424a3965364521c50b73308379Armin Rigo 402dd5c023af56b9a424a3965364521c50b73308379Armin Rigo def test_with_comment_instead_of_docstring(self): 403dd5c023af56b9a424a3965364521c50b73308379Armin Rigo self.assertSourceEqual(mod2.func88, 88, 90) 404dd5c023af56b9a424a3965364521c50b73308379Armin Rigo 4052463f8f831bdf7ed562a26a13a6214f203f0b037Georg Brandl def test_method_in_dynamic_class(self): 4062463f8f831bdf7ed562a26a13a6214f203f0b037Georg Brandl self.assertSourceEqual(mod2.method_in_dynamic_class, 95, 97) 4072463f8f831bdf7ed562a26a13a6214f203f0b037Georg Brandl 408878555401e28a6da0ce05d2de637058a20ea7504R. David Murray @unittest.skipIf( 409878555401e28a6da0ce05d2de637058a20ea7504R. David Murray not hasattr(unicodedata, '__file__') or 410878555401e28a6da0ce05d2de637058a20ea7504R. David Murray unicodedata.__file__[-4:] in (".pyc", ".pyo"), 411878555401e28a6da0ce05d2de637058a20ea7504R. David Murray "unicodedata is not an external binary module") 412996ba0260209aaac0e1cd29516dc2ba7120c698bR. David Murray def test_findsource_binary(self): 413878555401e28a6da0ce05d2de637058a20ea7504R. David Murray self.assertRaises(IOError, inspect.getsource, unicodedata) 414878555401e28a6da0ce05d2de637058a20ea7504R. David Murray self.assertRaises(IOError, inspect.findsource, unicodedata) 415996ba0260209aaac0e1cd29516dc2ba7120c698bR. David Murray 416df1cf301c2da740f9271b3ff164d7f0e5cb9082cR. David Murray def test_findsource_code_in_linecache(self): 417df1cf301c2da740f9271b3ff164d7f0e5cb9082cR. David Murray lines = ["x=1"] 418df1cf301c2da740f9271b3ff164d7f0e5cb9082cR. David Murray co = compile(lines[0], "_dynamically_created_file", "exec") 419df1cf301c2da740f9271b3ff164d7f0e5cb9082cR. David Murray self.assertRaises(IOError, inspect.findsource, co) 420df1cf301c2da740f9271b3ff164d7f0e5cb9082cR. David Murray self.assertRaises(IOError, inspect.getsource, co) 421df1cf301c2da740f9271b3ff164d7f0e5cb9082cR. David Murray linecache.cache[co.co_filename] = (1, None, lines, co.co_filename) 4222623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(inspect.findsource(co), (lines,0)) 4232623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(inspect.getsource(co), lines[0]) 424df1cf301c2da740f9271b3ff164d7f0e5cb9082cR. David Murray 425e66e7de5d69542d9f10010a83787ef4b87a70bf8Ezio Melotti def test_findsource_without_filename(self): 426e66e7de5d69542d9f10010a83787ef4b87a70bf8Ezio Melotti for fname in ['', '<string>']: 427e66e7de5d69542d9f10010a83787ef4b87a70bf8Ezio Melotti co = compile('x=1', fname, "exec") 428e66e7de5d69542d9f10010a83787ef4b87a70bf8Ezio Melotti self.assertRaises(IOError, inspect.findsource, co) 429e66e7de5d69542d9f10010a83787ef4b87a70bf8Ezio Melotti self.assertRaises(IOError, inspect.getsource, co) 430e66e7de5d69542d9f10010a83787ef4b87a70bf8Ezio Melotti 431b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou 432b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrouclass _BrokenDataDescriptor(object): 433b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou """ 434b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou A broken data descriptor. See bug #1785. 435b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou """ 436b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou def __get__(*args): 437b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou raise AssertionError("should not __get__ data descriptors") 438b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou 439b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou def __set__(*args): 440b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou raise RuntimeError 441b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou 442b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou def __getattr__(*args): 443b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou raise AssertionError("should not __getattr__ data descriptors") 444b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou 445b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou 446b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrouclass _BrokenMethodDescriptor(object): 447b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou """ 448b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou A broken method descriptor. See bug #1785. 449b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou """ 450b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou def __get__(*args): 451b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou raise AssertionError("should not __get__ method descriptors") 452b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou 453b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou def __getattr__(*args): 454b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou raise AssertionError("should not __getattr__ method descriptors") 455b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou 456b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou 457cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers# Helper for testing classify_class_attrs. 45813b49d3374cca4eaffee5fa756192a234714c8ffTim Petersdef attrs_wo_objs(cls): 45913b49d3374cca4eaffee5fa756192a234714c8ffTim Peters return [t[:3] for t in inspect.classify_class_attrs(cls)] 46013b49d3374cca4eaffee5fa756192a234714c8ffTim Peters 461b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou 4625a9fb3c415d1204c7f2c12243ba5d46f5964dcbdTim Petersclass TestClassesAndFunctions(unittest.TestCase): 463cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_classic_mro(self): 464cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers # Test classic-class method resolution order. 465cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers class A: pass 466cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers class B(A): pass 467cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers class C(A): pass 468cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers class D(B, C): pass 469cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 470cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers expected = (D, B, A, C) 471cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers got = inspect.getmro(D) 472cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(expected, got) 473cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 474cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_newstyle_mro(self): 475cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers # The same w/ new-class MRO. 476cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers class A(object): pass 477cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers class B(A): pass 478cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers class C(A): pass 479cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers class D(B, C): pass 480cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 481cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers expected = (D, B, C, A, object) 482cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers got = inspect.getmro(D) 483cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(expected, got) 484cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 485cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def assertArgSpecEquals(self, routine, args_e, varargs_e = None, 486cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers varkw_e = None, defaults_e = None, 487cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers formatted = None): 488cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers args, varargs, varkw, defaults = inspect.getargspec(routine) 489cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(args, args_e) 490cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(varargs, varargs_e) 491cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(varkw, varkw_e) 492cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(defaults, defaults_e) 493cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers if formatted is not None: 494cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertEqual(inspect.formatargspec(args, varargs, varkw, defaults), 495cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers formatted) 496cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 497cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_getargspec(self): 498cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertArgSpecEquals(mod.eggs, ['x', 'y'], formatted = '(x, y)') 499cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 500cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertArgSpecEquals(mod.spam, 501cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers ['a', 'b', 'c', 'd', ['e', ['f']]], 502cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 'g', 'h', (3, (4, (5,))), 503cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers '(a, b, c, d=3, (e, (f,))=(4, (5,)), *g, **h)') 504cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 505cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_getargspec_method(self): 506cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers class A(object): 507cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def m(self): 508cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers pass 509cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers self.assertArgSpecEquals(A.m, ['self']) 510cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 511cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def test_getargspec_sublistofone(self): 51207627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna with check_py3k_warnings( 51307627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna ("tuple parameter unpacking has been removed", SyntaxWarning), 51407627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna ("parenthesized argument names are invalid", SyntaxWarning)): 51507627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna exec 'def sublistOfOne((foo,)): return 1' 51607627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna self.assertArgSpecEquals(sublistOfOne, [['foo']]) 51707627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna 51807627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna exec 'def fakeSublistOfOne((foo)): return 1' 51907627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna self.assertArgSpecEquals(fakeSublistOfOne, ['foo']) 52033b730e33cb0a63f4030d1587a6196dcde36e965Neal Norwitz 521b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone 522b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone def _classify_test(self, newstyle): 523b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone """Helper for testing that classify_class_attrs finds a bunch of 524b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone different kinds of attributes on a given class. 525b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone """ 526b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone if newstyle: 527b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone base = object 528b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone else: 529b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone class base: 530b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone pass 531b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone 532b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone class A(base): 533cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def s(): pass 534cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers s = staticmethod(s) 535cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 536cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def c(cls): pass 537cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers c = classmethod(c) 538cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 539cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def getp(self): pass 540cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers p = property(getp) 541cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 542cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def m(self): pass 543cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 544cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def m1(self): pass 545cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 546cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers datablob = '1' 547cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 548b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou dd = _BrokenDataDescriptor() 549b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou md = _BrokenMethodDescriptor() 550b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou 551cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers attrs = attrs_wo_objs(A) 552aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('s', 'static method', A), attrs, 'missing static method') 553aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('c', 'class method', A), attrs, 'missing class method') 554aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('p', 'property', A), attrs, 'missing property') 555aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('m', 'method', A), attrs, 'missing plain method') 556aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('m1', 'method', A), attrs, 'missing plain method') 557aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('datablob', 'data', A), attrs, 'missing data') 558b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou self.assertIn(('md', 'method', A), attrs, 'missing method descriptor') 559b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou self.assertIn(('dd', 'data', A), attrs, 'missing data descriptor') 560cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 561cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers class B(A): 562cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def m(self): pass 563cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 564cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers attrs = attrs_wo_objs(B) 565aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('s', 'static method', A), attrs, 'missing static method') 566aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('c', 'class method', A), attrs, 'missing class method') 567aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('p', 'property', A), attrs, 'missing property') 568aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('m', 'method', B), attrs, 'missing plain method') 569aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('m1', 'method', A), attrs, 'missing plain method') 570aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('datablob', 'data', A), attrs, 'missing data') 571b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou self.assertIn(('md', 'method', A), attrs, 'missing method descriptor') 572b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou self.assertIn(('dd', 'data', A), attrs, 'missing data descriptor') 573cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 574cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 575cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers class C(A): 576cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def m(self): pass 577cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def c(self): pass 578cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 579cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers attrs = attrs_wo_objs(C) 580aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('s', 'static method', A), attrs, 'missing static method') 581aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('c', 'method', C), attrs, 'missing plain method') 582aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('p', 'property', A), attrs, 'missing property') 583aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('m', 'method', C), attrs, 'missing plain method') 584aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('m1', 'method', A), attrs, 'missing plain method') 585aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('datablob', 'data', A), attrs, 'missing data') 586b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou self.assertIn(('md', 'method', A), attrs, 'missing method descriptor') 587b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou self.assertIn(('dd', 'data', A), attrs, 'missing data descriptor') 588cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 589cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers class D(B, C): 590cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers def m1(self): pass 591cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 592cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers attrs = attrs_wo_objs(D) 593aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('s', 'static method', A), attrs, 'missing static method') 594b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone if newstyle: 595b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone self.assertIn(('c', 'method', C), attrs, 'missing plain method') 596b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone else: 597b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone self.assertIn(('c', 'class method', A), attrs, 'missing class method') 598aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('p', 'property', A), attrs, 'missing property') 599aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('m', 'method', B), attrs, 'missing plain method') 600aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('m1', 'method', D), attrs, 'missing plain method') 601aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(('datablob', 'data', A), attrs, 'missing data') 602b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou self.assertIn(('md', 'method', A), attrs, 'missing method descriptor') 603b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou self.assertIn(('dd', 'data', A), attrs, 'missing data descriptor') 604cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 60513b49d3374cca4eaffee5fa756192a234714c8ffTim Peters 606b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone def test_classify_oldstyle(self): 607b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone """classify_class_attrs finds static methods, class methods, 608b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone properties, normal methods, and data attributes on an old-style 609b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone class. 610b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone """ 611b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone self._classify_test(False) 61213b49d3374cca4eaffee5fa756192a234714c8ffTim Peters 61313b49d3374cca4eaffee5fa756192a234714c8ffTim Peters 614b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone def test_classify_newstyle(self): 615b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone """Just like test_classify_oldstyle, but for a new-style class. 616b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone """ 617b60ee469cd1cd9c51f319fc32fa37987581605d1Jean-Paul Calderone self._classify_test(True) 61813b49d3374cca4eaffee5fa756192a234714c8ffTim Peters 619b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou def test_classify_builtin_types(self): 620b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou # Simple sanity check that all built-in types can have their 621b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou # attributes classified. 622b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou for name in dir(__builtin__): 623b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou builtin = getattr(__builtin__, name) 624b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou if isinstance(builtin, type): 625b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou inspect.classify_class_attrs(builtin) 626b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou 627e09bc1e8f54620e938b7e076830b872a8daabd2cAntoine Pitrou def test_getmembers_method(self): 628b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou # Old-style classes 629e09bc1e8f54620e938b7e076830b872a8daabd2cAntoine Pitrou class B: 630e09bc1e8f54620e938b7e076830b872a8daabd2cAntoine Pitrou def f(self): 631e09bc1e8f54620e938b7e076830b872a8daabd2cAntoine Pitrou pass 632b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou 633e09bc1e8f54620e938b7e076830b872a8daabd2cAntoine Pitrou self.assertIn(('f', B.f), inspect.getmembers(B)) 634e09bc1e8f54620e938b7e076830b872a8daabd2cAntoine Pitrou # contrary to spec, ismethod() is also True for unbound methods 635e09bc1e8f54620e938b7e076830b872a8daabd2cAntoine Pitrou # (see #1785) 636e09bc1e8f54620e938b7e076830b872a8daabd2cAntoine Pitrou self.assertIn(('f', B.f), inspect.getmembers(B, inspect.ismethod)) 637e09bc1e8f54620e938b7e076830b872a8daabd2cAntoine Pitrou b = B() 638e09bc1e8f54620e938b7e076830b872a8daabd2cAntoine Pitrou self.assertIn(('f', b.f), inspect.getmembers(b)) 639e09bc1e8f54620e938b7e076830b872a8daabd2cAntoine Pitrou self.assertIn(('f', b.f), inspect.getmembers(b, inspect.ismethod)) 640b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou 641b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou # New-style classes 642e09bc1e8f54620e938b7e076830b872a8daabd2cAntoine Pitrou class B(object): 643e09bc1e8f54620e938b7e076830b872a8daabd2cAntoine Pitrou def f(self): 644b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou pass 645b8572a1673a8bf25adf3b054f76315bdac2ea45eAntoine Pitrou 646e09bc1e8f54620e938b7e076830b872a8daabd2cAntoine Pitrou self.assertIn(('f', B.f), inspect.getmembers(B)) 647e09bc1e8f54620e938b7e076830b872a8daabd2cAntoine Pitrou self.assertIn(('f', B.f), inspect.getmembers(B, inspect.ismethod)) 648e09bc1e8f54620e938b7e076830b872a8daabd2cAntoine Pitrou b = B() 649e09bc1e8f54620e938b7e076830b872a8daabd2cAntoine Pitrou self.assertIn(('f', b.f), inspect.getmembers(b)) 650e09bc1e8f54620e938b7e076830b872a8daabd2cAntoine Pitrou self.assertIn(('f', b.f), inspect.getmembers(b, inspect.ismethod)) 651cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 65213b49d3374cca4eaffee5fa756192a234714c8ffTim Peters 6537e213255cee76f692dded963ec726b39319646c0Benjamin Petersonclass TestGetcallargsFunctions(unittest.TestCase): 6547e213255cee76f692dded963ec726b39319646c0Benjamin Peterson 6557e213255cee76f692dded963ec726b39319646c0Benjamin Peterson # tuple parameters are named '.1', '.2', etc. 6567e213255cee76f692dded963ec726b39319646c0Benjamin Peterson is_tuplename = re.compile(r'^\.\d+$').match 6577e213255cee76f692dded963ec726b39319646c0Benjamin Peterson 6587e213255cee76f692dded963ec726b39319646c0Benjamin Peterson def assertEqualCallArgs(self, func, call_params_string, locs=None): 6597e213255cee76f692dded963ec726b39319646c0Benjamin Peterson locs = dict(locs or {}, func=func) 6607e213255cee76f692dded963ec726b39319646c0Benjamin Peterson r1 = eval('func(%s)' % call_params_string, None, locs) 6617e213255cee76f692dded963ec726b39319646c0Benjamin Peterson r2 = eval('inspect.getcallargs(func, %s)' % call_params_string, None, 6627e213255cee76f692dded963ec726b39319646c0Benjamin Peterson locs) 6637e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqual(r1, r2) 6647e213255cee76f692dded963ec726b39319646c0Benjamin Peterson 6657e213255cee76f692dded963ec726b39319646c0Benjamin Peterson def assertEqualException(self, func, call_param_string, locs=None): 6667e213255cee76f692dded963ec726b39319646c0Benjamin Peterson locs = dict(locs or {}, func=func) 6677e213255cee76f692dded963ec726b39319646c0Benjamin Peterson try: 6687e213255cee76f692dded963ec726b39319646c0Benjamin Peterson eval('func(%s)' % call_param_string, None, locs) 6697e213255cee76f692dded963ec726b39319646c0Benjamin Peterson except Exception, ex1: 6707e213255cee76f692dded963ec726b39319646c0Benjamin Peterson pass 6717e213255cee76f692dded963ec726b39319646c0Benjamin Peterson else: 6727e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.fail('Exception not raised') 6737e213255cee76f692dded963ec726b39319646c0Benjamin Peterson try: 6747e213255cee76f692dded963ec726b39319646c0Benjamin Peterson eval('inspect.getcallargs(func, %s)' % call_param_string, None, 6757e213255cee76f692dded963ec726b39319646c0Benjamin Peterson locs) 6767e213255cee76f692dded963ec726b39319646c0Benjamin Peterson except Exception, ex2: 6777e213255cee76f692dded963ec726b39319646c0Benjamin Peterson pass 6787e213255cee76f692dded963ec726b39319646c0Benjamin Peterson else: 6797e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.fail('Exception not raised') 6807e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertIs(type(ex1), type(ex2)) 6817e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqual(str(ex1), str(ex2)) 6827e213255cee76f692dded963ec726b39319646c0Benjamin Peterson 6837e213255cee76f692dded963ec726b39319646c0Benjamin Peterson def makeCallable(self, signature): 6847e213255cee76f692dded963ec726b39319646c0Benjamin Peterson """Create a function that returns its locals(), excluding the 6857e213255cee76f692dded963ec726b39319646c0Benjamin Peterson autogenerated '.1', '.2', etc. tuple param names (if any).""" 686fcc500ebc4a6d93a2d610666aa37ece2663b8e22Ezio Melotti with check_py3k_warnings( 687fcc500ebc4a6d93a2d610666aa37ece2663b8e22Ezio Melotti ("tuple parameter unpacking has been removed", SyntaxWarning), 688fcc500ebc4a6d93a2d610666aa37ece2663b8e22Ezio Melotti quiet=True): 689fcc500ebc4a6d93a2d610666aa37ece2663b8e22Ezio Melotti code = ("lambda %s: dict(i for i in locals().items() " 690fcc500ebc4a6d93a2d610666aa37ece2663b8e22Ezio Melotti "if not is_tuplename(i[0]))") 691fcc500ebc4a6d93a2d610666aa37ece2663b8e22Ezio Melotti return eval(code % signature, {'is_tuplename' : self.is_tuplename}) 6927e213255cee76f692dded963ec726b39319646c0Benjamin Peterson 6937e213255cee76f692dded963ec726b39319646c0Benjamin Peterson def test_plain(self): 6947e213255cee76f692dded963ec726b39319646c0Benjamin Peterson f = self.makeCallable('a, b=1') 6957e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2') 6967e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2, 3') 6977e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, 'a=2') 6987e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, 'b=3, a=2') 6997e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2, b=3') 7007e213255cee76f692dded963ec726b39319646c0Benjamin Peterson # expand *iterable / **mapping 7017e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '*(2,)') 7027e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '*[2]') 7037e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '*(2, 3)') 7047e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '*[2, 3]') 7057e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '**{"a":2}') 7067e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, 'b=3, **{"a":2}') 7077e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2, **{"b":3}') 7087e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '**{"b":3, "a":2}') 7097e213255cee76f692dded963ec726b39319646c0Benjamin Peterson # expand UserList / UserDict 7107e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '*UserList([2])') 7117e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '*UserList([2, 3])') 7127e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '**UserDict(a=2)') 7137e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2, **UserDict(b=3)') 7147e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, 'b=2, **UserDict(a=3)') 7157e213255cee76f692dded963ec726b39319646c0Benjamin Peterson # unicode keyword args 7167e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '**{u"a":2}') 7177e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, 'b=3, **{u"a":2}') 7187e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2, **{u"b":3}') 7197e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '**{u"b":3, u"a":2}') 7207e213255cee76f692dded963ec726b39319646c0Benjamin Peterson 7217e213255cee76f692dded963ec726b39319646c0Benjamin Peterson def test_varargs(self): 7227e213255cee76f692dded963ec726b39319646c0Benjamin Peterson f = self.makeCallable('a, b=1, *c') 7237e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2') 7247e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2, 3') 7257e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2, 3, 4') 7267e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '*(2,3,4)') 7277e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2, *[3,4]') 7287e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2, 3, *UserList([4])') 7297e213255cee76f692dded963ec726b39319646c0Benjamin Peterson 7307e213255cee76f692dded963ec726b39319646c0Benjamin Peterson def test_varkw(self): 7317e213255cee76f692dded963ec726b39319646c0Benjamin Peterson f = self.makeCallable('a, b=1, **c') 7327e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, 'a=2') 7337e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2, b=3, c=4') 7347e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, 'b=3, a=2, c=4') 7357e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, 'c=4, **{"a":2, "b":3}') 7367e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2, c=4, **{"b":3}') 7377e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, 'b=2, **{"a":3, "c":4}') 7387e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '**UserDict(a=2, b=3, c=4)') 7397e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2, c=4, **UserDict(b=3)') 7407e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, 'b=2, **UserDict(a=3, c=4)') 7417e213255cee76f692dded963ec726b39319646c0Benjamin Peterson # unicode keyword args 7427e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, 'c=4, **{u"a":2, u"b":3}') 7437e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2, c=4, **{u"b":3}') 7447e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, 'b=2, **{u"a":3, u"c":4}') 7457e213255cee76f692dded963ec726b39319646c0Benjamin Peterson 74677d466079a53830e5358c5ee5fe1dd4cda40164cBenjamin Peterson def test_varkw_only(self): 74777d466079a53830e5358c5ee5fe1dd4cda40164cBenjamin Peterson # issue11256: 74877d466079a53830e5358c5ee5fe1dd4cda40164cBenjamin Peterson f = self.makeCallable('**c') 74977d466079a53830e5358c5ee5fe1dd4cda40164cBenjamin Peterson self.assertEqualCallArgs(f, '') 75077d466079a53830e5358c5ee5fe1dd4cda40164cBenjamin Peterson self.assertEqualCallArgs(f, 'a=1') 75177d466079a53830e5358c5ee5fe1dd4cda40164cBenjamin Peterson self.assertEqualCallArgs(f, 'a=1, b=2') 75277d466079a53830e5358c5ee5fe1dd4cda40164cBenjamin Peterson self.assertEqualCallArgs(f, 'c=3, **{"a": 1, "b": 2}') 75377d466079a53830e5358c5ee5fe1dd4cda40164cBenjamin Peterson self.assertEqualCallArgs(f, '**UserDict(a=1, b=2)') 75477d466079a53830e5358c5ee5fe1dd4cda40164cBenjamin Peterson self.assertEqualCallArgs(f, 'c=3, **UserDict(a=1, b=2)') 75577d466079a53830e5358c5ee5fe1dd4cda40164cBenjamin Peterson 7567e213255cee76f692dded963ec726b39319646c0Benjamin Peterson def test_tupleargs(self): 7577e213255cee76f692dded963ec726b39319646c0Benjamin Peterson f = self.makeCallable('(b,c), (d,(e,f))=(0,[1,2])') 7587e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '(2,3)') 7597e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '[2,3]') 7607e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, 'UserList([2,3])') 7617e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '(2,3), (4,(5,6))') 7627e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '(2,3), (4,[5,6])') 7637e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '(2,3), [4,UserList([5,6])]') 7647e213255cee76f692dded963ec726b39319646c0Benjamin Peterson 7657e213255cee76f692dded963ec726b39319646c0Benjamin Peterson def test_multiple_features(self): 7667e213255cee76f692dded963ec726b39319646c0Benjamin Peterson f = self.makeCallable('a, b=2, (c,(d,e))=(3,[4,5]), *f, **g') 7677e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2, 3, (4,[5,6]), 7') 7687e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2, 3, *[(4,[5,6]), 7], x=8') 7697e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2, 3, x=8, *[(4,[5,6]), 7]') 7707e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2, x=8, *[3, (4,[5,6]), 7], y=9') 7717e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, 'x=8, *[2, 3, (4,[5,6])], y=9') 7727e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, 'x=8, *UserList([2, 3, (4,[5,6])]), ' 7737e213255cee76f692dded963ec726b39319646c0Benjamin Peterson '**{"y":9, "z":10}') 7747e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualCallArgs(f, '2, x=8, *UserList([3, (4,[5,6])]), ' 7757e213255cee76f692dded963ec726b39319646c0Benjamin Peterson '**UserDict(y=9, z=10)') 7767e213255cee76f692dded963ec726b39319646c0Benjamin Peterson 7777e213255cee76f692dded963ec726b39319646c0Benjamin Peterson def test_errors(self): 7787e213255cee76f692dded963ec726b39319646c0Benjamin Peterson f0 = self.makeCallable('') 7797e213255cee76f692dded963ec726b39319646c0Benjamin Peterson f1 = self.makeCallable('a, b') 7807e213255cee76f692dded963ec726b39319646c0Benjamin Peterson f2 = self.makeCallable('a, b=1') 7817e213255cee76f692dded963ec726b39319646c0Benjamin Peterson # f0 takes no arguments 7827e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f0, '1') 7837e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f0, 'x=1') 7847e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f0, '1,x=1') 7857e213255cee76f692dded963ec726b39319646c0Benjamin Peterson # f1 takes exactly 2 arguments 7867e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f1, '') 7877e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f1, '1') 7887e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f1, 'a=2') 7897e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f1, 'b=3') 7907e213255cee76f692dded963ec726b39319646c0Benjamin Peterson # f2 takes at least 1 argument 7917e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f2, '') 7927e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f2, 'b=3') 7937e213255cee76f692dded963ec726b39319646c0Benjamin Peterson for f in f1, f2: 7947e213255cee76f692dded963ec726b39319646c0Benjamin Peterson # f1/f2 takes exactly/at most 2 arguments 7957e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f, '2, 3, 4') 7967e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f, '1, 2, 3, a=1') 7977e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f, '2, 3, 4, c=5') 7987e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f, '2, 3, 4, a=1, c=5') 7997e213255cee76f692dded963ec726b39319646c0Benjamin Peterson # f got an unexpected keyword argument 8007e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f, 'c=2') 8017e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f, '2, c=3') 8027e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f, '2, 3, c=4') 8037e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f, '2, c=4, b=3') 804d6bfa94493b897f45ab939208a4a54a259a530e8Serhiy Storchaka if have_unicode: 805d6bfa94493b897f45ab939208a4a54a259a530e8Serhiy Storchaka self.assertEqualException(f, '**{u"\u03c0\u03b9": 4}') 8067e213255cee76f692dded963ec726b39319646c0Benjamin Peterson # f got multiple values for keyword argument 8077e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f, '1, a=2') 8087e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f, '1, **{"a":2}') 8097e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f, '1, 2, b=3') 8107e213255cee76f692dded963ec726b39319646c0Benjamin Peterson # XXX: Python inconsistency 8117e213255cee76f692dded963ec726b39319646c0Benjamin Peterson # - for functions and bound methods: unexpected keyword 'c' 8127e213255cee76f692dded963ec726b39319646c0Benjamin Peterson # - for unbound methods: multiple values for keyword 'a' 8137e213255cee76f692dded963ec726b39319646c0Benjamin Peterson #self.assertEqualException(f, '1, c=3, a=2') 8147e213255cee76f692dded963ec726b39319646c0Benjamin Peterson f = self.makeCallable('(a,b)=(0,1)') 8157e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f, '1') 8167e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f, '[1]') 8177e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.assertEqualException(f, '(1,2,3)') 81877d466079a53830e5358c5ee5fe1dd4cda40164cBenjamin Peterson # issue11256: 81977d466079a53830e5358c5ee5fe1dd4cda40164cBenjamin Peterson f3 = self.makeCallable('**c') 82077d466079a53830e5358c5ee5fe1dd4cda40164cBenjamin Peterson self.assertEqualException(f3, '1, 2') 82177d466079a53830e5358c5ee5fe1dd4cda40164cBenjamin Peterson self.assertEqualException(f3, '1, 2, a=1, b=2') 8227e213255cee76f692dded963ec726b39319646c0Benjamin Peterson 8237e213255cee76f692dded963ec726b39319646c0Benjamin Petersonclass TestGetcallargsMethods(TestGetcallargsFunctions): 8247e213255cee76f692dded963ec726b39319646c0Benjamin Peterson 8257e213255cee76f692dded963ec726b39319646c0Benjamin Peterson def setUp(self): 8267e213255cee76f692dded963ec726b39319646c0Benjamin Peterson class Foo(object): 8277e213255cee76f692dded963ec726b39319646c0Benjamin Peterson pass 8287e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.cls = Foo 8297e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.inst = Foo() 8307e213255cee76f692dded963ec726b39319646c0Benjamin Peterson 8317e213255cee76f692dded963ec726b39319646c0Benjamin Peterson def makeCallable(self, signature): 8327e213255cee76f692dded963ec726b39319646c0Benjamin Peterson assert 'self' not in signature 8337e213255cee76f692dded963ec726b39319646c0Benjamin Peterson mk = super(TestGetcallargsMethods, self).makeCallable 8347e213255cee76f692dded963ec726b39319646c0Benjamin Peterson self.cls.method = mk('self, ' + signature) 8357e213255cee76f692dded963ec726b39319646c0Benjamin Peterson return self.inst.method 8367e213255cee76f692dded963ec726b39319646c0Benjamin Peterson 8377e213255cee76f692dded963ec726b39319646c0Benjamin Petersonclass TestGetcallargsUnboundMethods(TestGetcallargsMethods): 8387e213255cee76f692dded963ec726b39319646c0Benjamin Peterson 8397e213255cee76f692dded963ec726b39319646c0Benjamin Peterson def makeCallable(self, signature): 8407e213255cee76f692dded963ec726b39319646c0Benjamin Peterson super(TestGetcallargsUnboundMethods, self).makeCallable(signature) 8417e213255cee76f692dded963ec726b39319646c0Benjamin Peterson return self.cls.method 8427e213255cee76f692dded963ec726b39319646c0Benjamin Peterson 8437e213255cee76f692dded963ec726b39319646c0Benjamin Peterson def assertEqualCallArgs(self, func, call_params_string, locs=None): 8447e213255cee76f692dded963ec726b39319646c0Benjamin Peterson return super(TestGetcallargsUnboundMethods, self).assertEqualCallArgs( 8457e213255cee76f692dded963ec726b39319646c0Benjamin Peterson *self._getAssertEqualParams(func, call_params_string, locs)) 8467e213255cee76f692dded963ec726b39319646c0Benjamin Peterson 8477e213255cee76f692dded963ec726b39319646c0Benjamin Peterson def assertEqualException(self, func, call_params_string, locs=None): 8487e213255cee76f692dded963ec726b39319646c0Benjamin Peterson return super(TestGetcallargsUnboundMethods, self).assertEqualException( 8497e213255cee76f692dded963ec726b39319646c0Benjamin Peterson *self._getAssertEqualParams(func, call_params_string, locs)) 8507e213255cee76f692dded963ec726b39319646c0Benjamin Peterson 8517e213255cee76f692dded963ec726b39319646c0Benjamin Peterson def _getAssertEqualParams(self, func, call_params_string, locs=None): 8527e213255cee76f692dded963ec726b39319646c0Benjamin Peterson assert 'inst' not in call_params_string 8537e213255cee76f692dded963ec726b39319646c0Benjamin Peterson locs = dict(locs or {}, inst=self.inst) 8547e213255cee76f692dded963ec726b39319646c0Benjamin Peterson return (func, 'inst,' + call_params_string, locs) 8557e213255cee76f692dded963ec726b39319646c0Benjamin Peterson 856cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbersdef test_main(): 8577e213255cee76f692dded963ec726b39319646c0Benjamin Peterson run_unittest( 8587e213255cee76f692dded963ec726b39319646c0Benjamin Peterson TestDecorators, TestRetrievingSourceCode, TestOneliners, TestBuggyCases, 8597e213255cee76f692dded963ec726b39319646c0Benjamin Peterson TestInterpreterStack, TestClassesAndFunctions, TestPredicates, 8607e213255cee76f692dded963ec726b39319646c0Benjamin Peterson TestGetcallargsFunctions, TestGetcallargsMethods, 8617e213255cee76f692dded963ec726b39319646c0Benjamin Peterson TestGetcallargsUnboundMethods) 862cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers 863cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbersif __name__ == "__main__": 864cb9015dc088676e7fa6434081d105068cded7743Johannes Gijsbers test_main() 865