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