17db96d56Sopenharmony_ciimport unittest 27db96d56Sopenharmony_cifrom test.support import cpython_only 37db96d56Sopenharmony_citry: 47db96d56Sopenharmony_ci import _testcapi 57db96d56Sopenharmony_ciexcept ImportError: 67db96d56Sopenharmony_ci _testcapi = None 77db96d56Sopenharmony_ciimport struct 87db96d56Sopenharmony_ciimport collections 97db96d56Sopenharmony_ciimport itertools 107db96d56Sopenharmony_ciimport gc 117db96d56Sopenharmony_ciimport contextlib 127db96d56Sopenharmony_ci 137db96d56Sopenharmony_ci 147db96d56Sopenharmony_ciclass BadStr(str): 157db96d56Sopenharmony_ci def __eq__(self, other): 167db96d56Sopenharmony_ci return True 177db96d56Sopenharmony_ci def __hash__(self): 187db96d56Sopenharmony_ci # Guaranteed different hash 197db96d56Sopenharmony_ci return str.__hash__(self) ^ 3 207db96d56Sopenharmony_ci 217db96d56Sopenharmony_ci 227db96d56Sopenharmony_ciclass FunctionCalls(unittest.TestCase): 237db96d56Sopenharmony_ci 247db96d56Sopenharmony_ci def test_kwargs_order(self): 257db96d56Sopenharmony_ci # bpo-34320: **kwargs should preserve order of passed OrderedDict 267db96d56Sopenharmony_ci od = collections.OrderedDict([('a', 1), ('b', 2)]) 277db96d56Sopenharmony_ci od.move_to_end('a') 287db96d56Sopenharmony_ci expected = list(od.items()) 297db96d56Sopenharmony_ci 307db96d56Sopenharmony_ci def fn(**kw): 317db96d56Sopenharmony_ci return kw 327db96d56Sopenharmony_ci 337db96d56Sopenharmony_ci res = fn(**od) 347db96d56Sopenharmony_ci self.assertIsInstance(res, dict) 357db96d56Sopenharmony_ci self.assertEqual(list(res.items()), expected) 367db96d56Sopenharmony_ci 377db96d56Sopenharmony_ci def test_frames_are_popped_after_failed_calls(self): 387db96d56Sopenharmony_ci # GH-93252: stuff blows up if we don't pop the new frame after 397db96d56Sopenharmony_ci # recovering from failed calls: 407db96d56Sopenharmony_ci def f(): 417db96d56Sopenharmony_ci pass 427db96d56Sopenharmony_ci for _ in range(1000): 437db96d56Sopenharmony_ci try: 447db96d56Sopenharmony_ci f(None) 457db96d56Sopenharmony_ci except TypeError: 467db96d56Sopenharmony_ci pass 477db96d56Sopenharmony_ci # BOOM! 487db96d56Sopenharmony_ci 497db96d56Sopenharmony_ci 507db96d56Sopenharmony_ci@cpython_only 517db96d56Sopenharmony_ciclass CFunctionCallsErrorMessages(unittest.TestCase): 527db96d56Sopenharmony_ci 537db96d56Sopenharmony_ci def test_varargs0(self): 547db96d56Sopenharmony_ci msg = r"__contains__\(\) takes exactly one argument \(0 given\)" 557db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, msg, {}.__contains__) 567db96d56Sopenharmony_ci 577db96d56Sopenharmony_ci def test_varargs2(self): 587db96d56Sopenharmony_ci msg = r"__contains__\(\) takes exactly one argument \(2 given\)" 597db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, msg, {}.__contains__, 0, 1) 607db96d56Sopenharmony_ci 617db96d56Sopenharmony_ci def test_varargs3(self): 627db96d56Sopenharmony_ci msg = r"^from_bytes\(\) takes at most 2 positional arguments \(3 given\)" 637db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, msg, int.from_bytes, b'a', 'little', False) 647db96d56Sopenharmony_ci 657db96d56Sopenharmony_ci def test_varargs1min(self): 667db96d56Sopenharmony_ci msg = r"get expected at least 1 argument, got 0" 677db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, msg, {}.get) 687db96d56Sopenharmony_ci 697db96d56Sopenharmony_ci msg = r"expected 1 argument, got 0" 707db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, msg, {}.__delattr__) 717db96d56Sopenharmony_ci 727db96d56Sopenharmony_ci def test_varargs2min(self): 737db96d56Sopenharmony_ci msg = r"getattr expected at least 2 arguments, got 0" 747db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, msg, getattr) 757db96d56Sopenharmony_ci 767db96d56Sopenharmony_ci def test_varargs1max(self): 777db96d56Sopenharmony_ci msg = r"input expected at most 1 argument, got 2" 787db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, msg, input, 1, 2) 797db96d56Sopenharmony_ci 807db96d56Sopenharmony_ci def test_varargs2max(self): 817db96d56Sopenharmony_ci msg = r"get expected at most 2 arguments, got 3" 827db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, msg, {}.get, 1, 2, 3) 837db96d56Sopenharmony_ci 847db96d56Sopenharmony_ci def test_varargs1_kw(self): 857db96d56Sopenharmony_ci msg = r"__contains__\(\) takes no keyword arguments" 867db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, msg, {}.__contains__, x=2) 877db96d56Sopenharmony_ci 887db96d56Sopenharmony_ci def test_varargs2_kw(self): 897db96d56Sopenharmony_ci msg = r"__contains__\(\) takes no keyword arguments" 907db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, msg, {}.__contains__, x=2, y=2) 917db96d56Sopenharmony_ci 927db96d56Sopenharmony_ci def test_varargs3_kw(self): 937db96d56Sopenharmony_ci msg = r"bool\(\) takes no keyword arguments" 947db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, msg, bool, x=2) 957db96d56Sopenharmony_ci 967db96d56Sopenharmony_ci def test_varargs4_kw(self): 977db96d56Sopenharmony_ci msg = r"^list[.]index\(\) takes no keyword arguments$" 987db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, msg, [].index, x=2) 997db96d56Sopenharmony_ci 1007db96d56Sopenharmony_ci def test_varargs5_kw(self): 1017db96d56Sopenharmony_ci msg = r"^hasattr\(\) takes no keyword arguments$" 1027db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, msg, hasattr, x=2) 1037db96d56Sopenharmony_ci 1047db96d56Sopenharmony_ci def test_varargs6_kw(self): 1057db96d56Sopenharmony_ci msg = r"^getattr\(\) takes no keyword arguments$" 1067db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, msg, getattr, x=2) 1077db96d56Sopenharmony_ci 1087db96d56Sopenharmony_ci def test_varargs7_kw(self): 1097db96d56Sopenharmony_ci msg = r"^next\(\) takes no keyword arguments$" 1107db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, msg, next, x=2) 1117db96d56Sopenharmony_ci 1127db96d56Sopenharmony_ci def test_varargs8_kw(self): 1137db96d56Sopenharmony_ci msg = r"^_struct[.]pack\(\) takes no keyword arguments$" 1147db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, msg, struct.pack, x=2) 1157db96d56Sopenharmony_ci 1167db96d56Sopenharmony_ci def test_varargs9_kw(self): 1177db96d56Sopenharmony_ci msg = r"^_struct[.]pack_into\(\) takes no keyword arguments$" 1187db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, msg, struct.pack_into, x=2) 1197db96d56Sopenharmony_ci 1207db96d56Sopenharmony_ci def test_varargs10_kw(self): 1217db96d56Sopenharmony_ci msg = r"^deque[.]index\(\) takes no keyword arguments$" 1227db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, msg, collections.deque().index, x=2) 1237db96d56Sopenharmony_ci 1247db96d56Sopenharmony_ci def test_varargs11_kw(self): 1257db96d56Sopenharmony_ci msg = r"^Struct[.]pack\(\) takes no keyword arguments$" 1267db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, msg, struct.Struct.pack, struct.Struct(""), x=2) 1277db96d56Sopenharmony_ci 1287db96d56Sopenharmony_ci def test_varargs12_kw(self): 1297db96d56Sopenharmony_ci msg = r"^staticmethod\(\) takes no keyword arguments$" 1307db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, msg, staticmethod, func=id) 1317db96d56Sopenharmony_ci 1327db96d56Sopenharmony_ci def test_varargs13_kw(self): 1337db96d56Sopenharmony_ci msg = r"^classmethod\(\) takes no keyword arguments$" 1347db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, msg, classmethod, func=id) 1357db96d56Sopenharmony_ci 1367db96d56Sopenharmony_ci def test_varargs14_kw(self): 1377db96d56Sopenharmony_ci msg = r"^product\(\) takes at most 1 keyword argument \(2 given\)$" 1387db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, msg, 1397db96d56Sopenharmony_ci itertools.product, 0, repeat=1, foo=2) 1407db96d56Sopenharmony_ci 1417db96d56Sopenharmony_ci def test_varargs15_kw(self): 1427db96d56Sopenharmony_ci msg = r"^ImportError\(\) takes at most 2 keyword arguments \(3 given\)$" 1437db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, msg, 1447db96d56Sopenharmony_ci ImportError, 0, name=1, path=2, foo=3) 1457db96d56Sopenharmony_ci 1467db96d56Sopenharmony_ci def test_varargs16_kw(self): 1477db96d56Sopenharmony_ci msg = r"^min\(\) takes at most 2 keyword arguments \(3 given\)$" 1487db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, msg, 1497db96d56Sopenharmony_ci min, 0, default=1, key=2, foo=3) 1507db96d56Sopenharmony_ci 1517db96d56Sopenharmony_ci def test_varargs17_kw(self): 1527db96d56Sopenharmony_ci msg = r"'foo' is an invalid keyword argument for print\(\)$" 1537db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, msg, 1547db96d56Sopenharmony_ci print, 0, sep=1, end=2, file=3, flush=4, foo=5) 1557db96d56Sopenharmony_ci 1567db96d56Sopenharmony_ci def test_varargs18_kw(self): 1577db96d56Sopenharmony_ci # _PyArg_UnpackKeywordsWithVararg() 1587db96d56Sopenharmony_ci msg = r"invalid keyword argument for print\(\)$" 1597db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, msg): 1607db96d56Sopenharmony_ci print(0, 1, **{BadStr('foo'): ','}) 1617db96d56Sopenharmony_ci 1627db96d56Sopenharmony_ci def test_varargs19_kw(self): 1637db96d56Sopenharmony_ci # _PyArg_UnpackKeywords() 1647db96d56Sopenharmony_ci msg = r"invalid keyword argument for round\(\)$" 1657db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, msg): 1667db96d56Sopenharmony_ci round(1.75, **{BadStr('foo'): 1}) 1677db96d56Sopenharmony_ci 1687db96d56Sopenharmony_ci def test_oldargs0_1(self): 1697db96d56Sopenharmony_ci msg = r"keys\(\) takes no arguments \(1 given\)" 1707db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, msg, {}.keys, 0) 1717db96d56Sopenharmony_ci 1727db96d56Sopenharmony_ci def test_oldargs0_2(self): 1737db96d56Sopenharmony_ci msg = r"keys\(\) takes no arguments \(2 given\)" 1747db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, msg, {}.keys, 0, 1) 1757db96d56Sopenharmony_ci 1767db96d56Sopenharmony_ci def test_oldargs0_1_kw(self): 1777db96d56Sopenharmony_ci msg = r"keys\(\) takes no keyword arguments" 1787db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, msg, {}.keys, x=2) 1797db96d56Sopenharmony_ci 1807db96d56Sopenharmony_ci def test_oldargs0_2_kw(self): 1817db96d56Sopenharmony_ci msg = r"keys\(\) takes no keyword arguments" 1827db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, msg, {}.keys, x=2, y=2) 1837db96d56Sopenharmony_ci 1847db96d56Sopenharmony_ci def test_oldargs1_0(self): 1857db96d56Sopenharmony_ci msg = r"count\(\) takes exactly one argument \(0 given\)" 1867db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, msg, [].count) 1877db96d56Sopenharmony_ci 1887db96d56Sopenharmony_ci def test_oldargs1_2(self): 1897db96d56Sopenharmony_ci msg = r"count\(\) takes exactly one argument \(2 given\)" 1907db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, msg, [].count, 1, 2) 1917db96d56Sopenharmony_ci 1927db96d56Sopenharmony_ci def test_oldargs1_0_kw(self): 1937db96d56Sopenharmony_ci msg = r"count\(\) takes no keyword arguments" 1947db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, msg, [].count, x=2) 1957db96d56Sopenharmony_ci 1967db96d56Sopenharmony_ci def test_oldargs1_1_kw(self): 1977db96d56Sopenharmony_ci msg = r"count\(\) takes no keyword arguments" 1987db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, msg, [].count, {}, x=2) 1997db96d56Sopenharmony_ci 2007db96d56Sopenharmony_ci def test_oldargs1_2_kw(self): 2017db96d56Sopenharmony_ci msg = r"count\(\) takes no keyword arguments" 2027db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, msg, [].count, x=2, y=2) 2037db96d56Sopenharmony_ci 2047db96d56Sopenharmony_ci 2057db96d56Sopenharmony_ci 2067db96d56Sopenharmony_ciclass TestCallingConventions(unittest.TestCase): 2077db96d56Sopenharmony_ci """Test calling using various C calling conventions (METH_*) from Python 2087db96d56Sopenharmony_ci 2097db96d56Sopenharmony_ci Subclasses test several kinds of functions (module-level, methods, 2107db96d56Sopenharmony_ci class methods static methods) using these attributes: 2117db96d56Sopenharmony_ci obj: the object that contains tested functions (as attributes) 2127db96d56Sopenharmony_ci expected_self: expected "self" argument to the C function 2137db96d56Sopenharmony_ci 2147db96d56Sopenharmony_ci The base class tests module-level functions. 2157db96d56Sopenharmony_ci """ 2167db96d56Sopenharmony_ci 2177db96d56Sopenharmony_ci def setUp(self): 2187db96d56Sopenharmony_ci self.obj = self.expected_self = _testcapi 2197db96d56Sopenharmony_ci 2207db96d56Sopenharmony_ci def test_varargs(self): 2217db96d56Sopenharmony_ci self.assertEqual( 2227db96d56Sopenharmony_ci self.obj.meth_varargs(1, 2, 3), 2237db96d56Sopenharmony_ci (self.expected_self, (1, 2, 3)), 2247db96d56Sopenharmony_ci ) 2257db96d56Sopenharmony_ci 2267db96d56Sopenharmony_ci def test_varargs_ext(self): 2277db96d56Sopenharmony_ci self.assertEqual( 2287db96d56Sopenharmony_ci self.obj.meth_varargs(*(1, 2, 3)), 2297db96d56Sopenharmony_ci (self.expected_self, (1, 2, 3)), 2307db96d56Sopenharmony_ci ) 2317db96d56Sopenharmony_ci 2327db96d56Sopenharmony_ci def test_varargs_error_kw(self): 2337db96d56Sopenharmony_ci msg = r"meth_varargs\(\) takes no keyword arguments" 2347db96d56Sopenharmony_ci self.assertRaisesRegex( 2357db96d56Sopenharmony_ci TypeError, msg, lambda: self.obj.meth_varargs(k=1), 2367db96d56Sopenharmony_ci ) 2377db96d56Sopenharmony_ci 2387db96d56Sopenharmony_ci def test_varargs_keywords(self): 2397db96d56Sopenharmony_ci self.assertEqual( 2407db96d56Sopenharmony_ci self.obj.meth_varargs_keywords(1, 2, a=3, b=4), 2417db96d56Sopenharmony_ci (self.expected_self, (1, 2), {'a': 3, 'b': 4}) 2427db96d56Sopenharmony_ci ) 2437db96d56Sopenharmony_ci 2447db96d56Sopenharmony_ci def test_varargs_keywords_ext(self): 2457db96d56Sopenharmony_ci self.assertEqual( 2467db96d56Sopenharmony_ci self.obj.meth_varargs_keywords(*[1, 2], **{'a': 3, 'b': 4}), 2477db96d56Sopenharmony_ci (self.expected_self, (1, 2), {'a': 3, 'b': 4}) 2487db96d56Sopenharmony_ci ) 2497db96d56Sopenharmony_ci 2507db96d56Sopenharmony_ci def test_o(self): 2517db96d56Sopenharmony_ci self.assertEqual(self.obj.meth_o(1), (self.expected_self, 1)) 2527db96d56Sopenharmony_ci 2537db96d56Sopenharmony_ci def test_o_ext(self): 2547db96d56Sopenharmony_ci self.assertEqual(self.obj.meth_o(*[1]), (self.expected_self, 1)) 2557db96d56Sopenharmony_ci 2567db96d56Sopenharmony_ci def test_o_error_no_arg(self): 2577db96d56Sopenharmony_ci msg = r"meth_o\(\) takes exactly one argument \(0 given\)" 2587db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, msg, self.obj.meth_o) 2597db96d56Sopenharmony_ci 2607db96d56Sopenharmony_ci def test_o_error_two_args(self): 2617db96d56Sopenharmony_ci msg = r"meth_o\(\) takes exactly one argument \(2 given\)" 2627db96d56Sopenharmony_ci self.assertRaisesRegex( 2637db96d56Sopenharmony_ci TypeError, msg, lambda: self.obj.meth_o(1, 2), 2647db96d56Sopenharmony_ci ) 2657db96d56Sopenharmony_ci 2667db96d56Sopenharmony_ci def test_o_error_ext(self): 2677db96d56Sopenharmony_ci msg = r"meth_o\(\) takes exactly one argument \(3 given\)" 2687db96d56Sopenharmony_ci self.assertRaisesRegex( 2697db96d56Sopenharmony_ci TypeError, msg, lambda: self.obj.meth_o(*(1, 2, 3)), 2707db96d56Sopenharmony_ci ) 2717db96d56Sopenharmony_ci 2727db96d56Sopenharmony_ci def test_o_error_kw(self): 2737db96d56Sopenharmony_ci msg = r"meth_o\(\) takes no keyword arguments" 2747db96d56Sopenharmony_ci self.assertRaisesRegex( 2757db96d56Sopenharmony_ci TypeError, msg, lambda: self.obj.meth_o(k=1), 2767db96d56Sopenharmony_ci ) 2777db96d56Sopenharmony_ci 2787db96d56Sopenharmony_ci def test_o_error_arg_kw(self): 2797db96d56Sopenharmony_ci msg = r"meth_o\(\) takes no keyword arguments" 2807db96d56Sopenharmony_ci self.assertRaisesRegex( 2817db96d56Sopenharmony_ci TypeError, msg, lambda: self.obj.meth_o(k=1), 2827db96d56Sopenharmony_ci ) 2837db96d56Sopenharmony_ci 2847db96d56Sopenharmony_ci def test_noargs(self): 2857db96d56Sopenharmony_ci self.assertEqual(self.obj.meth_noargs(), self.expected_self) 2867db96d56Sopenharmony_ci 2877db96d56Sopenharmony_ci def test_noargs_ext(self): 2887db96d56Sopenharmony_ci self.assertEqual(self.obj.meth_noargs(*[]), self.expected_self) 2897db96d56Sopenharmony_ci 2907db96d56Sopenharmony_ci def test_noargs_error_arg(self): 2917db96d56Sopenharmony_ci msg = r"meth_noargs\(\) takes no arguments \(1 given\)" 2927db96d56Sopenharmony_ci self.assertRaisesRegex( 2937db96d56Sopenharmony_ci TypeError, msg, lambda: self.obj.meth_noargs(1), 2947db96d56Sopenharmony_ci ) 2957db96d56Sopenharmony_ci 2967db96d56Sopenharmony_ci def test_noargs_error_arg2(self): 2977db96d56Sopenharmony_ci msg = r"meth_noargs\(\) takes no arguments \(2 given\)" 2987db96d56Sopenharmony_ci self.assertRaisesRegex( 2997db96d56Sopenharmony_ci TypeError, msg, lambda: self.obj.meth_noargs(1, 2), 3007db96d56Sopenharmony_ci ) 3017db96d56Sopenharmony_ci 3027db96d56Sopenharmony_ci def test_noargs_error_ext(self): 3037db96d56Sopenharmony_ci msg = r"meth_noargs\(\) takes no arguments \(3 given\)" 3047db96d56Sopenharmony_ci self.assertRaisesRegex( 3057db96d56Sopenharmony_ci TypeError, msg, lambda: self.obj.meth_noargs(*(1, 2, 3)), 3067db96d56Sopenharmony_ci ) 3077db96d56Sopenharmony_ci 3087db96d56Sopenharmony_ci def test_noargs_error_kw(self): 3097db96d56Sopenharmony_ci msg = r"meth_noargs\(\) takes no keyword arguments" 3107db96d56Sopenharmony_ci self.assertRaisesRegex( 3117db96d56Sopenharmony_ci TypeError, msg, lambda: self.obj.meth_noargs(k=1), 3127db96d56Sopenharmony_ci ) 3137db96d56Sopenharmony_ci 3147db96d56Sopenharmony_ci def test_fastcall(self): 3157db96d56Sopenharmony_ci self.assertEqual( 3167db96d56Sopenharmony_ci self.obj.meth_fastcall(1, 2, 3), 3177db96d56Sopenharmony_ci (self.expected_self, (1, 2, 3)), 3187db96d56Sopenharmony_ci ) 3197db96d56Sopenharmony_ci 3207db96d56Sopenharmony_ci def test_fastcall_ext(self): 3217db96d56Sopenharmony_ci self.assertEqual( 3227db96d56Sopenharmony_ci self.obj.meth_fastcall(*(1, 2, 3)), 3237db96d56Sopenharmony_ci (self.expected_self, (1, 2, 3)), 3247db96d56Sopenharmony_ci ) 3257db96d56Sopenharmony_ci 3267db96d56Sopenharmony_ci def test_fastcall_error_kw(self): 3277db96d56Sopenharmony_ci msg = r"meth_fastcall\(\) takes no keyword arguments" 3287db96d56Sopenharmony_ci self.assertRaisesRegex( 3297db96d56Sopenharmony_ci TypeError, msg, lambda: self.obj.meth_fastcall(k=1), 3307db96d56Sopenharmony_ci ) 3317db96d56Sopenharmony_ci 3327db96d56Sopenharmony_ci def test_fastcall_keywords(self): 3337db96d56Sopenharmony_ci self.assertEqual( 3347db96d56Sopenharmony_ci self.obj.meth_fastcall_keywords(1, 2, a=3, b=4), 3357db96d56Sopenharmony_ci (self.expected_self, (1, 2), {'a': 3, 'b': 4}) 3367db96d56Sopenharmony_ci ) 3377db96d56Sopenharmony_ci 3387db96d56Sopenharmony_ci def test_fastcall_keywords_ext(self): 3397db96d56Sopenharmony_ci self.assertEqual( 3407db96d56Sopenharmony_ci self.obj.meth_fastcall_keywords(*(1, 2), **{'a': 3, 'b': 4}), 3417db96d56Sopenharmony_ci (self.expected_self, (1, 2), {'a': 3, 'b': 4}) 3427db96d56Sopenharmony_ci ) 3437db96d56Sopenharmony_ci 3447db96d56Sopenharmony_ci 3457db96d56Sopenharmony_ciclass TestCallingConventionsInstance(TestCallingConventions): 3467db96d56Sopenharmony_ci """Test calling instance methods using various calling conventions""" 3477db96d56Sopenharmony_ci 3487db96d56Sopenharmony_ci def setUp(self): 3497db96d56Sopenharmony_ci self.obj = self.expected_self = _testcapi.MethInstance() 3507db96d56Sopenharmony_ci 3517db96d56Sopenharmony_ci 3527db96d56Sopenharmony_ciclass TestCallingConventionsClass(TestCallingConventions): 3537db96d56Sopenharmony_ci """Test calling class methods using various calling conventions""" 3547db96d56Sopenharmony_ci 3557db96d56Sopenharmony_ci def setUp(self): 3567db96d56Sopenharmony_ci self.obj = self.expected_self = _testcapi.MethClass 3577db96d56Sopenharmony_ci 3587db96d56Sopenharmony_ci 3597db96d56Sopenharmony_ciclass TestCallingConventionsClassInstance(TestCallingConventions): 3607db96d56Sopenharmony_ci """Test calling class methods on instance""" 3617db96d56Sopenharmony_ci 3627db96d56Sopenharmony_ci def setUp(self): 3637db96d56Sopenharmony_ci self.obj = _testcapi.MethClass() 3647db96d56Sopenharmony_ci self.expected_self = _testcapi.MethClass 3657db96d56Sopenharmony_ci 3667db96d56Sopenharmony_ci 3677db96d56Sopenharmony_ciclass TestCallingConventionsStatic(TestCallingConventions): 3687db96d56Sopenharmony_ci """Test calling static methods using various calling conventions""" 3697db96d56Sopenharmony_ci 3707db96d56Sopenharmony_ci def setUp(self): 3717db96d56Sopenharmony_ci self.obj = _testcapi.MethStatic() 3727db96d56Sopenharmony_ci self.expected_self = None 3737db96d56Sopenharmony_ci 3747db96d56Sopenharmony_ci 3757db96d56Sopenharmony_cidef pyfunc(arg1, arg2): 3767db96d56Sopenharmony_ci return [arg1, arg2] 3777db96d56Sopenharmony_ci 3787db96d56Sopenharmony_ci 3797db96d56Sopenharmony_cidef pyfunc_noarg(): 3807db96d56Sopenharmony_ci return "noarg" 3817db96d56Sopenharmony_ci 3827db96d56Sopenharmony_ci 3837db96d56Sopenharmony_ciclass PythonClass: 3847db96d56Sopenharmony_ci def method(self, arg1, arg2): 3857db96d56Sopenharmony_ci return [arg1, arg2] 3867db96d56Sopenharmony_ci 3877db96d56Sopenharmony_ci def method_noarg(self): 3887db96d56Sopenharmony_ci return "noarg" 3897db96d56Sopenharmony_ci 3907db96d56Sopenharmony_ci @classmethod 3917db96d56Sopenharmony_ci def class_method(cls): 3927db96d56Sopenharmony_ci return "classmethod" 3937db96d56Sopenharmony_ci 3947db96d56Sopenharmony_ci @staticmethod 3957db96d56Sopenharmony_ci def static_method(): 3967db96d56Sopenharmony_ci return "staticmethod" 3977db96d56Sopenharmony_ci 3987db96d56Sopenharmony_ci 3997db96d56Sopenharmony_ciPYTHON_INSTANCE = PythonClass() 4007db96d56Sopenharmony_ci 4017db96d56Sopenharmony_ciNULL_OR_EMPTY = object() 4027db96d56Sopenharmony_ci 4037db96d56Sopenharmony_ciclass FastCallTests(unittest.TestCase): 4047db96d56Sopenharmony_ci """Test calling using various callables from C 4057db96d56Sopenharmony_ci """ 4067db96d56Sopenharmony_ci 4077db96d56Sopenharmony_ci # Test calls with positional arguments 4087db96d56Sopenharmony_ci CALLS_POSARGS = [ 4097db96d56Sopenharmony_ci # (func, args: tuple, result) 4107db96d56Sopenharmony_ci 4117db96d56Sopenharmony_ci # Python function with 2 arguments 4127db96d56Sopenharmony_ci (pyfunc, (1, 2), [1, 2]), 4137db96d56Sopenharmony_ci 4147db96d56Sopenharmony_ci # Python function without argument 4157db96d56Sopenharmony_ci (pyfunc_noarg, (), "noarg"), 4167db96d56Sopenharmony_ci 4177db96d56Sopenharmony_ci # Python class methods 4187db96d56Sopenharmony_ci (PythonClass.class_method, (), "classmethod"), 4197db96d56Sopenharmony_ci (PythonClass.static_method, (), "staticmethod"), 4207db96d56Sopenharmony_ci 4217db96d56Sopenharmony_ci # Python instance methods 4227db96d56Sopenharmony_ci (PYTHON_INSTANCE.method, (1, 2), [1, 2]), 4237db96d56Sopenharmony_ci (PYTHON_INSTANCE.method_noarg, (), "noarg"), 4247db96d56Sopenharmony_ci (PYTHON_INSTANCE.class_method, (), "classmethod"), 4257db96d56Sopenharmony_ci (PYTHON_INSTANCE.static_method, (), "staticmethod"), 4267db96d56Sopenharmony_ci 4277db96d56Sopenharmony_ci # C callables are added later 4287db96d56Sopenharmony_ci ] 4297db96d56Sopenharmony_ci 4307db96d56Sopenharmony_ci # Test calls with positional and keyword arguments 4317db96d56Sopenharmony_ci CALLS_KWARGS = [ 4327db96d56Sopenharmony_ci # (func, args: tuple, kwargs: dict, result) 4337db96d56Sopenharmony_ci 4347db96d56Sopenharmony_ci # Python function with 2 arguments 4357db96d56Sopenharmony_ci (pyfunc, (1,), {'arg2': 2}, [1, 2]), 4367db96d56Sopenharmony_ci (pyfunc, (), {'arg1': 1, 'arg2': 2}, [1, 2]), 4377db96d56Sopenharmony_ci 4387db96d56Sopenharmony_ci # Python instance methods 4397db96d56Sopenharmony_ci (PYTHON_INSTANCE.method, (1,), {'arg2': 2}, [1, 2]), 4407db96d56Sopenharmony_ci (PYTHON_INSTANCE.method, (), {'arg1': 1, 'arg2': 2}, [1, 2]), 4417db96d56Sopenharmony_ci 4427db96d56Sopenharmony_ci # C callables are added later 4437db96d56Sopenharmony_ci ] 4447db96d56Sopenharmony_ci 4457db96d56Sopenharmony_ci # Add all the calling conventions and variants of C callables 4467db96d56Sopenharmony_ci _instance = _testcapi.MethInstance() 4477db96d56Sopenharmony_ci for obj, expected_self in ( 4487db96d56Sopenharmony_ci (_testcapi, _testcapi), # module-level function 4497db96d56Sopenharmony_ci (_instance, _instance), # bound method 4507db96d56Sopenharmony_ci (_testcapi.MethClass, _testcapi.MethClass), # class method on class 4517db96d56Sopenharmony_ci (_testcapi.MethClass(), _testcapi.MethClass), # class method on inst. 4527db96d56Sopenharmony_ci (_testcapi.MethStatic, None), # static method 4537db96d56Sopenharmony_ci ): 4547db96d56Sopenharmony_ci CALLS_POSARGS.extend([ 4557db96d56Sopenharmony_ci (obj.meth_varargs, (1, 2), (expected_self, (1, 2))), 4567db96d56Sopenharmony_ci (obj.meth_varargs_keywords, 4577db96d56Sopenharmony_ci (1, 2), (expected_self, (1, 2), NULL_OR_EMPTY)), 4587db96d56Sopenharmony_ci (obj.meth_fastcall, (1, 2), (expected_self, (1, 2))), 4597db96d56Sopenharmony_ci (obj.meth_fastcall, (), (expected_self, ())), 4607db96d56Sopenharmony_ci (obj.meth_fastcall_keywords, 4617db96d56Sopenharmony_ci (1, 2), (expected_self, (1, 2), NULL_OR_EMPTY)), 4627db96d56Sopenharmony_ci (obj.meth_fastcall_keywords, 4637db96d56Sopenharmony_ci (), (expected_self, (), NULL_OR_EMPTY)), 4647db96d56Sopenharmony_ci (obj.meth_noargs, (), expected_self), 4657db96d56Sopenharmony_ci (obj.meth_o, (123, ), (expected_self, 123)), 4667db96d56Sopenharmony_ci ]) 4677db96d56Sopenharmony_ci 4687db96d56Sopenharmony_ci CALLS_KWARGS.extend([ 4697db96d56Sopenharmony_ci (obj.meth_varargs_keywords, 4707db96d56Sopenharmony_ci (1, 2), {'x': 'y'}, (expected_self, (1, 2), {'x': 'y'})), 4717db96d56Sopenharmony_ci (obj.meth_varargs_keywords, 4727db96d56Sopenharmony_ci (), {'x': 'y'}, (expected_self, (), {'x': 'y'})), 4737db96d56Sopenharmony_ci (obj.meth_varargs_keywords, 4747db96d56Sopenharmony_ci (1, 2), {}, (expected_self, (1, 2), NULL_OR_EMPTY)), 4757db96d56Sopenharmony_ci (obj.meth_fastcall_keywords, 4767db96d56Sopenharmony_ci (1, 2), {'x': 'y'}, (expected_self, (1, 2), {'x': 'y'})), 4777db96d56Sopenharmony_ci (obj.meth_fastcall_keywords, 4787db96d56Sopenharmony_ci (), {'x': 'y'}, (expected_self, (), {'x': 'y'})), 4797db96d56Sopenharmony_ci (obj.meth_fastcall_keywords, 4807db96d56Sopenharmony_ci (1, 2), {}, (expected_self, (1, 2), NULL_OR_EMPTY)), 4817db96d56Sopenharmony_ci ]) 4827db96d56Sopenharmony_ci 4837db96d56Sopenharmony_ci def check_result(self, result, expected): 4847db96d56Sopenharmony_ci if isinstance(expected, tuple) and expected[-1] is NULL_OR_EMPTY: 4857db96d56Sopenharmony_ci if result[-1] in ({}, None): 4867db96d56Sopenharmony_ci expected = (*expected[:-1], result[-1]) 4877db96d56Sopenharmony_ci self.assertEqual(result, expected) 4887db96d56Sopenharmony_ci 4897db96d56Sopenharmony_ci def test_fastcall(self): 4907db96d56Sopenharmony_ci # Test _PyObject_FastCall() 4917db96d56Sopenharmony_ci 4927db96d56Sopenharmony_ci for func, args, expected in self.CALLS_POSARGS: 4937db96d56Sopenharmony_ci with self.subTest(func=func, args=args): 4947db96d56Sopenharmony_ci result = _testcapi.pyobject_fastcall(func, args) 4957db96d56Sopenharmony_ci self.check_result(result, expected) 4967db96d56Sopenharmony_ci 4977db96d56Sopenharmony_ci if not args: 4987db96d56Sopenharmony_ci # args=NULL, nargs=0 4997db96d56Sopenharmony_ci result = _testcapi.pyobject_fastcall(func, None) 5007db96d56Sopenharmony_ci self.check_result(result, expected) 5017db96d56Sopenharmony_ci 5027db96d56Sopenharmony_ci def test_vectorcall_dict(self): 5037db96d56Sopenharmony_ci # Test PyObject_VectorcallDict() 5047db96d56Sopenharmony_ci 5057db96d56Sopenharmony_ci for func, args, expected in self.CALLS_POSARGS: 5067db96d56Sopenharmony_ci with self.subTest(func=func, args=args): 5077db96d56Sopenharmony_ci # kwargs=NULL 5087db96d56Sopenharmony_ci result = _testcapi.pyobject_fastcalldict(func, args, None) 5097db96d56Sopenharmony_ci self.check_result(result, expected) 5107db96d56Sopenharmony_ci 5117db96d56Sopenharmony_ci if not args: 5127db96d56Sopenharmony_ci # args=NULL, nargs=0, kwargs=NULL 5137db96d56Sopenharmony_ci result = _testcapi.pyobject_fastcalldict(func, None, None) 5147db96d56Sopenharmony_ci self.check_result(result, expected) 5157db96d56Sopenharmony_ci 5167db96d56Sopenharmony_ci for func, args, kwargs, expected in self.CALLS_KWARGS: 5177db96d56Sopenharmony_ci with self.subTest(func=func, args=args, kwargs=kwargs): 5187db96d56Sopenharmony_ci result = _testcapi.pyobject_fastcalldict(func, args, kwargs) 5197db96d56Sopenharmony_ci self.check_result(result, expected) 5207db96d56Sopenharmony_ci 5217db96d56Sopenharmony_ci def test_vectorcall(self): 5227db96d56Sopenharmony_ci # Test PyObject_Vectorcall() 5237db96d56Sopenharmony_ci 5247db96d56Sopenharmony_ci for func, args, expected in self.CALLS_POSARGS: 5257db96d56Sopenharmony_ci with self.subTest(func=func, args=args): 5267db96d56Sopenharmony_ci # kwnames=NULL 5277db96d56Sopenharmony_ci result = _testcapi.pyobject_vectorcall(func, args, None) 5287db96d56Sopenharmony_ci self.check_result(result, expected) 5297db96d56Sopenharmony_ci 5307db96d56Sopenharmony_ci # kwnames=() 5317db96d56Sopenharmony_ci result = _testcapi.pyobject_vectorcall(func, args, ()) 5327db96d56Sopenharmony_ci self.check_result(result, expected) 5337db96d56Sopenharmony_ci 5347db96d56Sopenharmony_ci if not args: 5357db96d56Sopenharmony_ci # kwnames=NULL 5367db96d56Sopenharmony_ci result = _testcapi.pyobject_vectorcall(func, None, None) 5377db96d56Sopenharmony_ci self.check_result(result, expected) 5387db96d56Sopenharmony_ci 5397db96d56Sopenharmony_ci # kwnames=() 5407db96d56Sopenharmony_ci result = _testcapi.pyobject_vectorcall(func, None, ()) 5417db96d56Sopenharmony_ci self.check_result(result, expected) 5427db96d56Sopenharmony_ci 5437db96d56Sopenharmony_ci for func, args, kwargs, expected in self.CALLS_KWARGS: 5447db96d56Sopenharmony_ci with self.subTest(func=func, args=args, kwargs=kwargs): 5457db96d56Sopenharmony_ci kwnames = tuple(kwargs.keys()) 5467db96d56Sopenharmony_ci args = args + tuple(kwargs.values()) 5477db96d56Sopenharmony_ci result = _testcapi.pyobject_vectorcall(func, args, kwnames) 5487db96d56Sopenharmony_ci self.check_result(result, expected) 5497db96d56Sopenharmony_ci 5507db96d56Sopenharmony_ci def test_fastcall_clearing_dict(self): 5517db96d56Sopenharmony_ci # Test bpo-36907: the point of the test is just checking that this 5527db96d56Sopenharmony_ci # does not crash. 5537db96d56Sopenharmony_ci class IntWithDict: 5547db96d56Sopenharmony_ci __slots__ = ["kwargs"] 5557db96d56Sopenharmony_ci def __init__(self, **kwargs): 5567db96d56Sopenharmony_ci self.kwargs = kwargs 5577db96d56Sopenharmony_ci def __index__(self): 5587db96d56Sopenharmony_ci self.kwargs.clear() 5597db96d56Sopenharmony_ci gc.collect() 5607db96d56Sopenharmony_ci return 0 5617db96d56Sopenharmony_ci x = IntWithDict(optimize=IntWithDict()) 5627db96d56Sopenharmony_ci # We test the argument handling of "compile" here, the compilation 5637db96d56Sopenharmony_ci # itself is not relevant. When we pass flags=x below, x.__index__() is 5647db96d56Sopenharmony_ci # called, which changes the keywords dict. 5657db96d56Sopenharmony_ci compile("pass", "", "exec", x, **x.kwargs) 5667db96d56Sopenharmony_ci 5677db96d56Sopenharmony_ci 5687db96d56Sopenharmony_ciPy_TPFLAGS_HAVE_VECTORCALL = 1 << 11 5697db96d56Sopenharmony_ciPy_TPFLAGS_METHOD_DESCRIPTOR = 1 << 17 5707db96d56Sopenharmony_ci 5717db96d56Sopenharmony_ci 5727db96d56Sopenharmony_cidef testfunction(self): 5737db96d56Sopenharmony_ci """some doc""" 5747db96d56Sopenharmony_ci return self 5757db96d56Sopenharmony_ci 5767db96d56Sopenharmony_ci 5777db96d56Sopenharmony_cidef testfunction_kw(self, *, kw): 5787db96d56Sopenharmony_ci """some doc""" 5797db96d56Sopenharmony_ci return self 5807db96d56Sopenharmony_ci 5817db96d56Sopenharmony_ci 5827db96d56Sopenharmony_ciclass TestPEP590(unittest.TestCase): 5837db96d56Sopenharmony_ci 5847db96d56Sopenharmony_ci def test_method_descriptor_flag(self): 5857db96d56Sopenharmony_ci import functools 5867db96d56Sopenharmony_ci cached = functools.lru_cache(1)(testfunction) 5877db96d56Sopenharmony_ci 5887db96d56Sopenharmony_ci self.assertFalse(type(repr).__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) 5897db96d56Sopenharmony_ci self.assertTrue(type(list.append).__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) 5907db96d56Sopenharmony_ci self.assertTrue(type(list.__add__).__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) 5917db96d56Sopenharmony_ci self.assertTrue(type(testfunction).__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) 5927db96d56Sopenharmony_ci self.assertTrue(type(cached).__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) 5937db96d56Sopenharmony_ci 5947db96d56Sopenharmony_ci self.assertTrue(_testcapi.MethodDescriptorBase.__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) 5957db96d56Sopenharmony_ci self.assertTrue(_testcapi.MethodDescriptorDerived.__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) 5967db96d56Sopenharmony_ci self.assertFalse(_testcapi.MethodDescriptorNopGet.__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) 5977db96d56Sopenharmony_ci 5987db96d56Sopenharmony_ci # Mutable heap types should not inherit Py_TPFLAGS_METHOD_DESCRIPTOR 5997db96d56Sopenharmony_ci class MethodDescriptorHeap(_testcapi.MethodDescriptorBase): 6007db96d56Sopenharmony_ci pass 6017db96d56Sopenharmony_ci self.assertFalse(MethodDescriptorHeap.__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) 6027db96d56Sopenharmony_ci 6037db96d56Sopenharmony_ci def test_vectorcall_flag(self): 6047db96d56Sopenharmony_ci self.assertTrue(_testcapi.MethodDescriptorBase.__flags__ & Py_TPFLAGS_HAVE_VECTORCALL) 6057db96d56Sopenharmony_ci self.assertTrue(_testcapi.MethodDescriptorDerived.__flags__ & Py_TPFLAGS_HAVE_VECTORCALL) 6067db96d56Sopenharmony_ci self.assertFalse(_testcapi.MethodDescriptorNopGet.__flags__ & Py_TPFLAGS_HAVE_VECTORCALL) 6077db96d56Sopenharmony_ci self.assertTrue(_testcapi.MethodDescriptor2.__flags__ & Py_TPFLAGS_HAVE_VECTORCALL) 6087db96d56Sopenharmony_ci 6097db96d56Sopenharmony_ci # Mutable heap types should not inherit Py_TPFLAGS_HAVE_VECTORCALL 6107db96d56Sopenharmony_ci class MethodDescriptorHeap(_testcapi.MethodDescriptorBase): 6117db96d56Sopenharmony_ci pass 6127db96d56Sopenharmony_ci self.assertFalse(MethodDescriptorHeap.__flags__ & Py_TPFLAGS_HAVE_VECTORCALL) 6137db96d56Sopenharmony_ci 6147db96d56Sopenharmony_ci def test_vectorcall_override(self): 6157db96d56Sopenharmony_ci # Check that tp_call can correctly override vectorcall. 6167db96d56Sopenharmony_ci # MethodDescriptorNopGet implements tp_call but it inherits from 6177db96d56Sopenharmony_ci # MethodDescriptorBase, which implements vectorcall. Since 6187db96d56Sopenharmony_ci # MethodDescriptorNopGet returns the args tuple when called, we check 6197db96d56Sopenharmony_ci # additionally that no new tuple is created for this call. 6207db96d56Sopenharmony_ci args = tuple(range(5)) 6217db96d56Sopenharmony_ci f = _testcapi.MethodDescriptorNopGet() 6227db96d56Sopenharmony_ci self.assertIs(f(*args), args) 6237db96d56Sopenharmony_ci 6247db96d56Sopenharmony_ci def test_vectorcall(self): 6257db96d56Sopenharmony_ci # Test a bunch of different ways to call objects: 6267db96d56Sopenharmony_ci # 1. vectorcall using PyVectorcall_Call() 6277db96d56Sopenharmony_ci # (only for objects that support vectorcall directly) 6287db96d56Sopenharmony_ci # 2. normal call 6297db96d56Sopenharmony_ci # 3. vectorcall using PyObject_Vectorcall() 6307db96d56Sopenharmony_ci # 4. call as bound method 6317db96d56Sopenharmony_ci # 5. call using functools.partial 6327db96d56Sopenharmony_ci 6337db96d56Sopenharmony_ci # A list of (function, args, kwargs, result) calls to test 6347db96d56Sopenharmony_ci calls = [(len, (range(42),), {}, 42), 6357db96d56Sopenharmony_ci (list.append, ([], 0), {}, None), 6367db96d56Sopenharmony_ci ([].append, (0,), {}, None), 6377db96d56Sopenharmony_ci (sum, ([36],), {"start":6}, 42), 6387db96d56Sopenharmony_ci (testfunction, (42,), {}, 42), 6397db96d56Sopenharmony_ci (testfunction_kw, (42,), {"kw":None}, 42), 6407db96d56Sopenharmony_ci (_testcapi.MethodDescriptorBase(), (0,), {}, True), 6417db96d56Sopenharmony_ci (_testcapi.MethodDescriptorDerived(), (0,), {}, True), 6427db96d56Sopenharmony_ci (_testcapi.MethodDescriptor2(), (0,), {}, False)] 6437db96d56Sopenharmony_ci 6447db96d56Sopenharmony_ci from _testcapi import pyobject_vectorcall, pyvectorcall_call 6457db96d56Sopenharmony_ci from types import MethodType 6467db96d56Sopenharmony_ci from functools import partial 6477db96d56Sopenharmony_ci 6487db96d56Sopenharmony_ci def vectorcall(func, args, kwargs): 6497db96d56Sopenharmony_ci args = *args, *kwargs.values() 6507db96d56Sopenharmony_ci kwnames = tuple(kwargs) 6517db96d56Sopenharmony_ci return pyobject_vectorcall(func, args, kwnames) 6527db96d56Sopenharmony_ci 6537db96d56Sopenharmony_ci for (func, args, kwargs, expected) in calls: 6547db96d56Sopenharmony_ci with self.subTest(str(func)): 6557db96d56Sopenharmony_ci if not kwargs: 6567db96d56Sopenharmony_ci self.assertEqual(expected, pyvectorcall_call(func, args)) 6577db96d56Sopenharmony_ci self.assertEqual(expected, pyvectorcall_call(func, args, kwargs)) 6587db96d56Sopenharmony_ci 6597db96d56Sopenharmony_ci # Add derived classes (which do not support vectorcall directly, 6607db96d56Sopenharmony_ci # but do support all other ways of calling). 6617db96d56Sopenharmony_ci 6627db96d56Sopenharmony_ci class MethodDescriptorHeap(_testcapi.MethodDescriptorBase): 6637db96d56Sopenharmony_ci pass 6647db96d56Sopenharmony_ci 6657db96d56Sopenharmony_ci class MethodDescriptorOverridden(_testcapi.MethodDescriptorBase): 6667db96d56Sopenharmony_ci def __call__(self, n): 6677db96d56Sopenharmony_ci return 'new' 6687db96d56Sopenharmony_ci 6697db96d56Sopenharmony_ci class SuperBase: 6707db96d56Sopenharmony_ci def __call__(self, *args): 6717db96d56Sopenharmony_ci return super().__call__(*args) 6727db96d56Sopenharmony_ci 6737db96d56Sopenharmony_ci class MethodDescriptorSuper(SuperBase, _testcapi.MethodDescriptorBase): 6747db96d56Sopenharmony_ci def __call__(self, *args): 6757db96d56Sopenharmony_ci return super().__call__(*args) 6767db96d56Sopenharmony_ci 6777db96d56Sopenharmony_ci calls += [ 6787db96d56Sopenharmony_ci (dict.update, ({},), {"key":True}, None), 6797db96d56Sopenharmony_ci ({}.update, ({},), {"key":True}, None), 6807db96d56Sopenharmony_ci (MethodDescriptorHeap(), (0,), {}, True), 6817db96d56Sopenharmony_ci (MethodDescriptorOverridden(), (0,), {}, 'new'), 6827db96d56Sopenharmony_ci (MethodDescriptorSuper(), (0,), {}, True), 6837db96d56Sopenharmony_ci ] 6847db96d56Sopenharmony_ci 6857db96d56Sopenharmony_ci for (func, args, kwargs, expected) in calls: 6867db96d56Sopenharmony_ci with self.subTest(str(func)): 6877db96d56Sopenharmony_ci args1 = args[1:] 6887db96d56Sopenharmony_ci meth = MethodType(func, args[0]) 6897db96d56Sopenharmony_ci wrapped = partial(func) 6907db96d56Sopenharmony_ci if not kwargs: 6917db96d56Sopenharmony_ci self.assertEqual(expected, func(*args)) 6927db96d56Sopenharmony_ci self.assertEqual(expected, pyobject_vectorcall(func, args, None)) 6937db96d56Sopenharmony_ci self.assertEqual(expected, meth(*args1)) 6947db96d56Sopenharmony_ci self.assertEqual(expected, wrapped(*args)) 6957db96d56Sopenharmony_ci self.assertEqual(expected, func(*args, **kwargs)) 6967db96d56Sopenharmony_ci self.assertEqual(expected, vectorcall(func, args, kwargs)) 6977db96d56Sopenharmony_ci self.assertEqual(expected, meth(*args1, **kwargs)) 6987db96d56Sopenharmony_ci self.assertEqual(expected, wrapped(*args, **kwargs)) 6997db96d56Sopenharmony_ci 7007db96d56Sopenharmony_ci 7017db96d56Sopenharmony_ciclass A: 7027db96d56Sopenharmony_ci def method_two_args(self, x, y): 7037db96d56Sopenharmony_ci pass 7047db96d56Sopenharmony_ci 7057db96d56Sopenharmony_ci @staticmethod 7067db96d56Sopenharmony_ci def static_no_args(): 7077db96d56Sopenharmony_ci pass 7087db96d56Sopenharmony_ci 7097db96d56Sopenharmony_ci @staticmethod 7107db96d56Sopenharmony_ci def positional_only(arg, /): 7117db96d56Sopenharmony_ci pass 7127db96d56Sopenharmony_ci 7137db96d56Sopenharmony_ci@cpython_only 7147db96d56Sopenharmony_ciclass TestErrorMessagesUseQualifiedName(unittest.TestCase): 7157db96d56Sopenharmony_ci 7167db96d56Sopenharmony_ci @contextlib.contextmanager 7177db96d56Sopenharmony_ci def check_raises_type_error(self, message): 7187db96d56Sopenharmony_ci with self.assertRaises(TypeError) as cm: 7197db96d56Sopenharmony_ci yield 7207db96d56Sopenharmony_ci self.assertEqual(str(cm.exception), message) 7217db96d56Sopenharmony_ci 7227db96d56Sopenharmony_ci def test_missing_arguments(self): 7237db96d56Sopenharmony_ci msg = "A.method_two_args() missing 1 required positional argument: 'y'" 7247db96d56Sopenharmony_ci with self.check_raises_type_error(msg): 7257db96d56Sopenharmony_ci A().method_two_args("x") 7267db96d56Sopenharmony_ci 7277db96d56Sopenharmony_ci def test_too_many_positional(self): 7287db96d56Sopenharmony_ci msg = "A.static_no_args() takes 0 positional arguments but 1 was given" 7297db96d56Sopenharmony_ci with self.check_raises_type_error(msg): 7307db96d56Sopenharmony_ci A.static_no_args("oops it's an arg") 7317db96d56Sopenharmony_ci 7327db96d56Sopenharmony_ci def test_positional_only_passed_as_keyword(self): 7337db96d56Sopenharmony_ci msg = "A.positional_only() got some positional-only arguments passed as keyword arguments: 'arg'" 7347db96d56Sopenharmony_ci with self.check_raises_type_error(msg): 7357db96d56Sopenharmony_ci A.positional_only(arg="x") 7367db96d56Sopenharmony_ci 7377db96d56Sopenharmony_ci def test_unexpected_keyword(self): 7387db96d56Sopenharmony_ci msg = "A.method_two_args() got an unexpected keyword argument 'bad'" 7397db96d56Sopenharmony_ci with self.check_raises_type_error(msg): 7407db96d56Sopenharmony_ci A().method_two_args(bad="x") 7417db96d56Sopenharmony_ci 7427db96d56Sopenharmony_ci def test_multiple_values(self): 7437db96d56Sopenharmony_ci msg = "A.method_two_args() got multiple values for argument 'x'" 7447db96d56Sopenharmony_ci with self.check_raises_type_error(msg): 7457db96d56Sopenharmony_ci A().method_two_args("x", "y", x="oops") 7467db96d56Sopenharmony_ci 7477db96d56Sopenharmony_ci 7487db96d56Sopenharmony_ciif __name__ == "__main__": 7497db96d56Sopenharmony_ci unittest.main() 750