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