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