blob: ec9697a444f0d9293d90124668bbe6cccbfd69c3 [file] [log] [blame]
Victor Stinner3b5cf852017-06-09 16:48:45 +02001import datetime
Jeremy Hyltonbea39472001-05-29 16:26:20 +00002import unittest
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +03003from test.support import cpython_only
Victor Stinner3b5cf852017-06-09 16:48:45 +02004try:
5 import _testcapi
6except ImportError:
7 _testcapi = None
Sylvain96c7c062017-06-15 17:05:23 +02008import struct
9import collections
Oren Milmanbf9075a2017-08-23 21:16:48 +030010import itertools
Jeremy Hyltonbea39472001-05-29 16:26:20 +000011
12# The test cases here cover several paths through the function calling
13# code. They depend on the METH_XXX flag that is used to define a C
14# function, which can't be verified from Python. If the METH_XXX decl
15# for a C function changes, these tests may not cover the right paths.
16
17class CFunctionCalls(unittest.TestCase):
18
19 def test_varargs0(self):
Guido van Rossume2b70bc2006-08-18 22:13:04 +000020 self.assertRaises(TypeError, {}.__contains__)
Jeremy Hyltonbea39472001-05-29 16:26:20 +000021
22 def test_varargs1(self):
Guido van Rossume2b70bc2006-08-18 22:13:04 +000023 {}.__contains__(0)
Jeremy Hyltonbea39472001-05-29 16:26:20 +000024
25 def test_varargs2(self):
Guido van Rossume2b70bc2006-08-18 22:13:04 +000026 self.assertRaises(TypeError, {}.__contains__, 0, 1)
Jeremy Hyltonbea39472001-05-29 16:26:20 +000027
28 def test_varargs0_ext(self):
29 try:
Guido van Rossume2b70bc2006-08-18 22:13:04 +000030 {}.__contains__(*())
Jeremy Hyltonbea39472001-05-29 16:26:20 +000031 except TypeError:
32 pass
33
34 def test_varargs1_ext(self):
Guido van Rossume2b70bc2006-08-18 22:13:04 +000035 {}.__contains__(*(0,))
Jeremy Hyltonbea39472001-05-29 16:26:20 +000036
37 def test_varargs2_ext(self):
38 try:
Guido van Rossume2b70bc2006-08-18 22:13:04 +000039 {}.__contains__(*(1, 2))
Jeremy Hyltonbea39472001-05-29 16:26:20 +000040 except TypeError:
41 pass
42 else:
43 raise RuntimeError
44
Jeremy Hyltonbea39472001-05-29 16:26:20 +000045 def test_varargs1_kw(self):
Guido van Rossume2b70bc2006-08-18 22:13:04 +000046 self.assertRaises(TypeError, {}.__contains__, x=2)
Jeremy Hyltonbea39472001-05-29 16:26:20 +000047
48 def test_varargs2_kw(self):
Guido van Rossume2b70bc2006-08-18 22:13:04 +000049 self.assertRaises(TypeError, {}.__contains__, x=2, y=2)
Jeremy Hyltonbea39472001-05-29 16:26:20 +000050
51 def test_oldargs0_0(self):
52 {}.keys()
53
54 def test_oldargs0_1(self):
55 self.assertRaises(TypeError, {}.keys, 0)
56
57 def test_oldargs0_2(self):
58 self.assertRaises(TypeError, {}.keys, 0, 1)
59
60 def test_oldargs0_0_ext(self):
61 {}.keys(*())
62
63 def test_oldargs0_1_ext(self):
64 try:
65 {}.keys(*(0,))
66 except TypeError:
67 pass
68 else:
69 raise RuntimeError
70
71 def test_oldargs0_2_ext(self):
72 try:
73 {}.keys(*(1, 2))
74 except TypeError:
75 pass
76 else:
77 raise RuntimeError
78
79 def test_oldargs0_0_kw(self):
80 try:
81 {}.keys(x=2)
82 except TypeError:
83 pass
84 else:
85 raise RuntimeError
86
87 def test_oldargs0_1_kw(self):
88 self.assertRaises(TypeError, {}.keys, x=2)
89
90 def test_oldargs0_2_kw(self):
91 self.assertRaises(TypeError, {}.keys, x=2, y=2)
92
93 def test_oldargs1_0(self):
Raymond Hettinger31017ae2004-03-04 08:25:44 +000094 self.assertRaises(TypeError, [].count)
Jeremy Hyltonbea39472001-05-29 16:26:20 +000095
96 def test_oldargs1_1(self):
Raymond Hettinger31017ae2004-03-04 08:25:44 +000097 [].count(1)
Jeremy Hyltonbea39472001-05-29 16:26:20 +000098
99 def test_oldargs1_2(self):
Raymond Hettinger31017ae2004-03-04 08:25:44 +0000100 self.assertRaises(TypeError, [].count, 1, 2)
Jeremy Hyltonbea39472001-05-29 16:26:20 +0000101
102 def test_oldargs1_0_ext(self):
103 try:
Raymond Hettinger31017ae2004-03-04 08:25:44 +0000104 [].count(*())
Jeremy Hyltonbea39472001-05-29 16:26:20 +0000105 except TypeError:
106 pass
107 else:
108 raise RuntimeError
109
110 def test_oldargs1_1_ext(self):
Raymond Hettinger31017ae2004-03-04 08:25:44 +0000111 [].count(*(1,))
Jeremy Hyltonbea39472001-05-29 16:26:20 +0000112
113 def test_oldargs1_2_ext(self):
114 try:
Raymond Hettinger31017ae2004-03-04 08:25:44 +0000115 [].count(*(1, 2))
Jeremy Hyltonbea39472001-05-29 16:26:20 +0000116 except TypeError:
117 pass
118 else:
119 raise RuntimeError
120
121 def test_oldargs1_0_kw(self):
Raymond Hettinger31017ae2004-03-04 08:25:44 +0000122 self.assertRaises(TypeError, [].count, x=2)
Jeremy Hyltonbea39472001-05-29 16:26:20 +0000123
124 def test_oldargs1_1_kw(self):
Raymond Hettinger31017ae2004-03-04 08:25:44 +0000125 self.assertRaises(TypeError, [].count, {}, x=2)
Jeremy Hyltonbea39472001-05-29 16:26:20 +0000126
127 def test_oldargs1_2_kw(self):
Raymond Hettinger31017ae2004-03-04 08:25:44 +0000128 self.assertRaises(TypeError, [].count, x=2, y=2)
Jeremy Hyltonbea39472001-05-29 16:26:20 +0000129
Fred Drake2e2be372001-09-20 21:33:42 +0000130
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300131@cpython_only
132class CFunctionCallsErrorMessages(unittest.TestCase):
133
134 def test_varargs0(self):
135 msg = r"__contains__\(\) takes exactly one argument \(0 given\)"
136 self.assertRaisesRegex(TypeError, msg, {}.__contains__)
137
138 def test_varargs2(self):
139 msg = r"__contains__\(\) takes exactly one argument \(2 given\)"
140 self.assertRaisesRegex(TypeError, msg, {}.__contains__, 0, 1)
141
Serhiy Storchakaf9f1cca2017-06-09 19:27:06 +0300142 def test_varargs3(self):
143 msg = r"^from_bytes\(\) takes at most 2 positional arguments \(3 given\)"
144 self.assertRaisesRegex(TypeError, msg, int.from_bytes, b'a', 'little', False)
145
Xtreak1426daa2018-07-23 01:43:26 +0530146 def test_varargs4(self):
147 msg = r"get expected at least 1 argument, got 0"
148 self.assertRaisesRegex(TypeError, msg, {}.get)
149
150 def test_varargs5(self):
151 msg = r"getattr expected at least 2 arguments, got 0"
152 self.assertRaisesRegex(TypeError, msg, getattr)
153
154 def test_varargs6(self):
155 msg = r"input expected at most 1 argument, got 2"
156 self.assertRaisesRegex(TypeError, msg, input, 1, 2)
157
158 def test_varargs7(self):
159 msg = r"get expected at most 2 arguments, got 3"
160 self.assertRaisesRegex(TypeError, msg, {}.get, 1, 2, 3)
161
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300162 def test_varargs1_kw(self):
163 msg = r"__contains__\(\) takes no keyword arguments"
164 self.assertRaisesRegex(TypeError, msg, {}.__contains__, x=2)
165
166 def test_varargs2_kw(self):
167 msg = r"__contains__\(\) takes no keyword arguments"
168 self.assertRaisesRegex(TypeError, msg, {}.__contains__, x=2, y=2)
169
Sylvain74453812017-06-10 06:51:48 +0200170 def test_varargs3_kw(self):
171 msg = r"bool\(\) takes no keyword arguments"
172 self.assertRaisesRegex(TypeError, msg, bool, x=2)
173
174 def test_varargs4_kw(self):
175 msg = r"^index\(\) takes no keyword arguments$"
176 self.assertRaisesRegex(TypeError, msg, [].index, x=2)
177
178 def test_varargs5_kw(self):
179 msg = r"^hasattr\(\) takes no keyword arguments$"
180 self.assertRaisesRegex(TypeError, msg, hasattr, x=2)
181
Sylvain96c7c062017-06-15 17:05:23 +0200182 def test_varargs6_kw(self):
183 msg = r"^getattr\(\) takes no keyword arguments$"
184 self.assertRaisesRegex(TypeError, msg, getattr, x=2)
185
186 def test_varargs7_kw(self):
187 msg = r"^next\(\) takes no keyword arguments$"
188 self.assertRaisesRegex(TypeError, msg, next, x=2)
189
190 def test_varargs8_kw(self):
191 msg = r"^pack\(\) takes no keyword arguments$"
192 self.assertRaisesRegex(TypeError, msg, struct.pack, x=2)
193
194 def test_varargs9_kw(self):
195 msg = r"^pack_into\(\) takes no keyword arguments$"
196 self.assertRaisesRegex(TypeError, msg, struct.pack_into, x=2)
197
198 def test_varargs10_kw(self):
199 msg = r"^index\(\) takes no keyword arguments$"
200 self.assertRaisesRegex(TypeError, msg, collections.deque().index, x=2)
201
202 def test_varargs11_kw(self):
203 msg = r"^pack\(\) takes no keyword arguments$"
204 self.assertRaisesRegex(TypeError, msg, struct.Struct.pack, struct.Struct(""), x=2)
205
Sylvain96480882017-07-09 05:45:06 +0200206 def test_varargs12_kw(self):
207 msg = r"^staticmethod\(\) takes no keyword arguments$"
208 self.assertRaisesRegex(TypeError, msg, staticmethod, func=id)
209
210 def test_varargs13_kw(self):
211 msg = r"^classmethod\(\) takes no keyword arguments$"
212 self.assertRaisesRegex(TypeError, msg, classmethod, func=id)
213
Oren Milmanbf9075a2017-08-23 21:16:48 +0300214 def test_varargs14_kw(self):
215 msg = r"^product\(\) takes at most 1 keyword argument \(2 given\)$"
216 self.assertRaisesRegex(TypeError, msg,
217 itertools.product, 0, repeat=1, foo=2)
218
219 def test_varargs15_kw(self):
220 msg = r"^ImportError\(\) takes at most 2 keyword arguments \(3 given\)$"
221 self.assertRaisesRegex(TypeError, msg,
222 ImportError, 0, name=1, path=2, foo=3)
223
224 def test_varargs16_kw(self):
225 msg = r"^min\(\) takes at most 2 keyword arguments \(3 given\)$"
226 self.assertRaisesRegex(TypeError, msg,
227 min, 0, default=1, key=2, foo=3)
228
229 def test_varargs17_kw(self):
230 msg = r"^print\(\) takes at most 4 keyword arguments \(5 given\)$"
231 self.assertRaisesRegex(TypeError, msg,
232 print, 0, sep=1, end=2, file=3, flush=4, foo=5)
233
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300234 def test_oldargs0_1(self):
235 msg = r"keys\(\) takes no arguments \(1 given\)"
236 self.assertRaisesRegex(TypeError, msg, {}.keys, 0)
237
238 def test_oldargs0_2(self):
239 msg = r"keys\(\) takes no arguments \(2 given\)"
240 self.assertRaisesRegex(TypeError, msg, {}.keys, 0, 1)
241
242 def test_oldargs0_1_kw(self):
243 msg = r"keys\(\) takes no keyword arguments"
244 self.assertRaisesRegex(TypeError, msg, {}.keys, x=2)
245
246 def test_oldargs0_2_kw(self):
247 msg = r"keys\(\) takes no keyword arguments"
248 self.assertRaisesRegex(TypeError, msg, {}.keys, x=2, y=2)
249
250 def test_oldargs1_0(self):
251 msg = r"count\(\) takes exactly one argument \(0 given\)"
252 self.assertRaisesRegex(TypeError, msg, [].count)
253
254 def test_oldargs1_2(self):
255 msg = r"count\(\) takes exactly one argument \(2 given\)"
256 self.assertRaisesRegex(TypeError, msg, [].count, 1, 2)
257
258 def test_oldargs1_0_kw(self):
259 msg = r"count\(\) takes no keyword arguments"
260 self.assertRaisesRegex(TypeError, msg, [].count, x=2)
261
262 def test_oldargs1_1_kw(self):
263 msg = r"count\(\) takes no keyword arguments"
264 self.assertRaisesRegex(TypeError, msg, [].count, {}, x=2)
265
266 def test_oldargs1_2_kw(self):
267 msg = r"count\(\) takes no keyword arguments"
268 self.assertRaisesRegex(TypeError, msg, [].count, x=2, y=2)
269
270
Victor Stinner3b5cf852017-06-09 16:48:45 +0200271def pyfunc(arg1, arg2):
272 return [arg1, arg2]
273
274
275def pyfunc_noarg():
276 return "noarg"
277
278
279class PythonClass:
280 def method(self, arg1, arg2):
281 return [arg1, arg2]
282
283 def method_noarg(self):
284 return "noarg"
285
286 @classmethod
287 def class_method(cls):
288 return "classmethod"
289
290 @staticmethod
291 def static_method():
292 return "staticmethod"
293
294
295PYTHON_INSTANCE = PythonClass()
296
297
298IGNORE_RESULT = object()
299
300
301@cpython_only
302class FastCallTests(unittest.TestCase):
303 # Test calls with positional arguments
304 CALLS_POSARGS = (
305 # (func, args: tuple, result)
306
307 # Python function with 2 arguments
308 (pyfunc, (1, 2), [1, 2]),
309
310 # Python function without argument
311 (pyfunc_noarg, (), "noarg"),
312
313 # Python class methods
314 (PythonClass.class_method, (), "classmethod"),
315 (PythonClass.static_method, (), "staticmethod"),
316
317 # Python instance methods
318 (PYTHON_INSTANCE.method, (1, 2), [1, 2]),
319 (PYTHON_INSTANCE.method_noarg, (), "noarg"),
320 (PYTHON_INSTANCE.class_method, (), "classmethod"),
321 (PYTHON_INSTANCE.static_method, (), "staticmethod"),
322
323 # C function: METH_NOARGS
324 (globals, (), IGNORE_RESULT),
325
326 # C function: METH_O
327 (id, ("hello",), IGNORE_RESULT),
328
329 # C function: METH_VARARGS
330 (dir, (1,), IGNORE_RESULT),
331
332 # C function: METH_VARARGS | METH_KEYWORDS
333 (min, (5, 9), 5),
334
335 # C function: METH_FASTCALL
336 (divmod, (1000, 33), (30, 10)),
337
338 # C type static method: METH_FASTCALL | METH_CLASS
339 (int.from_bytes, (b'\x01\x00', 'little'), 1),
340
341 # bpo-30524: Test that calling a C type static method with no argument
342 # doesn't crash (ignore the result): METH_FASTCALL | METH_CLASS
343 (datetime.datetime.now, (), IGNORE_RESULT),
344 )
345
346 # Test calls with positional and keyword arguments
347 CALLS_KWARGS = (
348 # (func, args: tuple, kwargs: dict, result)
349
350 # Python function with 2 arguments
351 (pyfunc, (1,), {'arg2': 2}, [1, 2]),
352 (pyfunc, (), {'arg1': 1, 'arg2': 2}, [1, 2]),
353
354 # Python instance methods
355 (PYTHON_INSTANCE.method, (1,), {'arg2': 2}, [1, 2]),
356 (PYTHON_INSTANCE.method, (), {'arg1': 1, 'arg2': 2}, [1, 2]),
357
358 # C function: METH_VARARGS | METH_KEYWORDS
359 (max, ([],), {'default': 9}, 9),
360
361 # C type static method: METH_FASTCALL | METH_CLASS
362 (int.from_bytes, (b'\x01\x00',), {'byteorder': 'little'}, 1),
363 (int.from_bytes, (), {'bytes': b'\x01\x00', 'byteorder': 'little'}, 1),
364 )
365
366 def check_result(self, result, expected):
367 if expected is IGNORE_RESULT:
368 return
369 self.assertEqual(result, expected)
370
371 def test_fastcall(self):
372 # Test _PyObject_FastCall()
373
374 for func, args, expected in self.CALLS_POSARGS:
375 with self.subTest(func=func, args=args):
376 result = _testcapi.pyobject_fastcall(func, args)
377 self.check_result(result, expected)
378
379 if not args:
380 # args=NULL, nargs=0
381 result = _testcapi.pyobject_fastcall(func, None)
382 self.check_result(result, expected)
383
384 def test_fastcall_dict(self):
385 # Test _PyObject_FastCallDict()
386
387 for func, args, expected in self.CALLS_POSARGS:
388 with self.subTest(func=func, args=args):
389 # kwargs=NULL
390 result = _testcapi.pyobject_fastcalldict(func, args, None)
391 self.check_result(result, expected)
392
393 # kwargs={}
394 result = _testcapi.pyobject_fastcalldict(func, args, {})
395 self.check_result(result, expected)
396
397 if not args:
398 # args=NULL, nargs=0, kwargs=NULL
399 result = _testcapi.pyobject_fastcalldict(func, None, None)
400 self.check_result(result, expected)
401
402 # args=NULL, nargs=0, kwargs={}
403 result = _testcapi.pyobject_fastcalldict(func, None, {})
404 self.check_result(result, expected)
405
406 for func, args, kwargs, expected in self.CALLS_KWARGS:
407 with self.subTest(func=func, args=args, kwargs=kwargs):
408 result = _testcapi.pyobject_fastcalldict(func, args, kwargs)
409 self.check_result(result, expected)
410
411 def test_fastcall_keywords(self):
412 # Test _PyObject_FastCallKeywords()
413
414 for func, args, expected in self.CALLS_POSARGS:
415 with self.subTest(func=func, args=args):
416 # kwnames=NULL
417 result = _testcapi.pyobject_fastcallkeywords(func, args, None)
418 self.check_result(result, expected)
419
420 # kwnames=()
421 result = _testcapi.pyobject_fastcallkeywords(func, args, ())
422 self.check_result(result, expected)
423
424 if not args:
425 # kwnames=NULL
426 result = _testcapi.pyobject_fastcallkeywords(func, None, None)
427 self.check_result(result, expected)
428
429 # kwnames=()
430 result = _testcapi.pyobject_fastcallkeywords(func, None, ())
431 self.check_result(result, expected)
432
433 for func, args, kwargs, expected in self.CALLS_KWARGS:
434 with self.subTest(func=func, args=args, kwargs=kwargs):
435 kwnames = tuple(kwargs.keys())
436 args = args + tuple(kwargs.values())
437 result = _testcapi.pyobject_fastcallkeywords(func, args, kwnames)
438 self.check_result(result, expected)
439
440
Fred Drake2e2be372001-09-20 21:33:42 +0000441if __name__ == "__main__":
Zachary Ware38c707e2015-04-13 15:00:43 -0500442 unittest.main()