summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorErlend E. Aasland <erlend@python.org>2023-08-10 07:19:05 (GMT)
committerGitHub <noreply@github.com>2023-08-10 07:19:05 (GMT)
commit39ef93edb9802dccdb6555d4209ac2e60875a011 (patch)
treee0255a6b5f48b47b9fccb7fc3ba1c651baacfb8c /Lib
parent4845b9712f2c187743344eca43fa1fb896bddfd6 (diff)
downloadcpython-39ef93edb9802dccdb6555d4209ac2e60875a011.zip
cpython-39ef93edb9802dccdb6555d4209ac2e60875a011.tar.gz
cpython-39ef93edb9802dccdb6555d4209ac2e60875a011.tar.bz2
gh-95065: Argument Clinic: Add functional tests of deprecated positionals (#107768)
Move the "deprecated positinal" tests from clinic.test.c to _testclinic.c. Mock PY_VERSION_HEX in order to prevent generated compiler warnings/errors to trigger. Put clinic code for deprecated positionals in Modules/clinic/_testclinic_depr_star.c.h for easy inspection of the generated code. Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com> Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Diffstat (limited to 'Lib')
-rw-r--r--Lib/test/clinic.test.c1161
-rw-r--r--Lib/test/test_clinic.py103
2 files changed, 103 insertions, 1161 deletions
diff --git a/Lib/test/clinic.test.c b/Lib/test/clinic.test.c
index c7063e1..019dc10 100644
--- a/Lib/test/clinic.test.c
+++ b/Lib/test/clinic.test.c
@@ -5467,1164 +5467,3 @@ exit:
static PyObject *
docstr_fallback_to_converter_default_impl(PyObject *module, str a)
/*[clinic end generated code: output=ae24a9c6f60ee8a6 input=0cbe6a4d24bc2274]*/
-
-
-/*[clinic input]
-test_deprecate_positional_pos1_len1_optional
- a: object
- * [from 3.14]
- b: object = None
-[clinic start generated code]*/
-
-PyDoc_STRVAR(test_deprecate_positional_pos1_len1_optional__doc__,
-"test_deprecate_positional_pos1_len1_optional($module, /, a, b=None)\n"
-"--\n"
-"\n"
-"Note: Passing 2 positional arguments to\n"
-"test_deprecate_positional_pos1_len1_optional() is deprecated.\n"
-"Parameter \'b\' will become a keyword-only parameter in Python 3.14.\n"
-"");
-
-#define TEST_DEPRECATE_POSITIONAL_POS1_LEN1_OPTIONAL_METHODDEF \
- {"test_deprecate_positional_pos1_len1_optional", _PyCFunction_CAST(test_deprecate_positional_pos1_len1_optional), METH_FASTCALL|METH_KEYWORDS, test_deprecate_positional_pos1_len1_optional__doc__},
-
-static PyObject *
-test_deprecate_positional_pos1_len1_optional_impl(PyObject *module,
- PyObject *a, PyObject *b);
-
-static PyObject *
-test_deprecate_positional_pos1_len1_optional(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
-{
- PyObject *return_value = NULL;
- #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
-
- #define NUM_KEYWORDS 2
- static struct {
- PyGC_Head _this_is_not_used;
- PyObject_VAR_HEAD
- PyObject *ob_item[NUM_KEYWORDS];
- } _kwtuple = {
- .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
- .ob_item = { &_Py_ID(a), &_Py_ID(b), },
- };
- #undef NUM_KEYWORDS
- #define KWTUPLE (&_kwtuple.ob_base.ob_base)
-
- #else // !Py_BUILD_CORE
- # define KWTUPLE NULL
- #endif // !Py_BUILD_CORE
-
- static const char * const _keywords[] = {"a", "b", NULL};
- static _PyArg_Parser _parser = {
- .keywords = _keywords,
- .fname = "test_deprecate_positional_pos1_len1_optional",
- .kwtuple = KWTUPLE,
- };
- #undef KWTUPLE
- PyObject *argsbuf[2];
- Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
- PyObject *a;
- PyObject *b = Py_None;
-
- // Emit compiler warnings when we get to Python 3.14.
- #if PY_VERSION_HEX >= 0x030e00C0
- # error \
- "In clinic.test.c, update parameter(s) 'b' in the clinic input of" \
- " 'test_deprecate_positional_pos1_len1_optional' to be " \
- "keyword-only."
- #elif PY_VERSION_HEX >= 0x030e00A0
- # ifdef _MSC_VER
- # pragma message ( \
- "In clinic.test.c, update parameter(s) 'b' in the clinic input of" \
- " 'test_deprecate_positional_pos1_len1_optional' to be " \
- "keyword-only.")
- # else
- # warning \
- "In clinic.test.c, update parameter(s) 'b' in the clinic input of" \
- " 'test_deprecate_positional_pos1_len1_optional' to be " \
- "keyword-only."
- # endif
- #endif
- if (nargs == 2) {
- if (PyErr_WarnEx(PyExc_DeprecationWarning,
- "Passing 2 positional arguments to "
- "test_deprecate_positional_pos1_len1_optional() is deprecated. "
- "Parameter 'b' will become a keyword-only parameter in Python "
- "3.14.", 1))
- {
- goto exit;
- }
- }
- args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf);
- if (!args) {
- goto exit;
- }
- a = args[0];
- if (!noptargs) {
- goto skip_optional_pos;
- }
- b = args[1];
-skip_optional_pos:
- return_value = test_deprecate_positional_pos1_len1_optional_impl(module, a, b);
-
-exit:
- return return_value;
-}
-
-static PyObject *
-test_deprecate_positional_pos1_len1_optional_impl(PyObject *module,
- PyObject *a, PyObject *b)
-/*[clinic end generated code: output=144cbf1adc574dd9 input=89099f3dacd757da]*/
-
-
-/*[clinic input]
-test_deprecate_positional_pos1_len1
- a: object
- * [from 3.14]
- b: object
-[clinic start generated code]*/
-
-PyDoc_STRVAR(test_deprecate_positional_pos1_len1__doc__,
-"test_deprecate_positional_pos1_len1($module, /, a, b)\n"
-"--\n"
-"\n"
-"Note: Passing 2 positional arguments to\n"
-"test_deprecate_positional_pos1_len1() is deprecated. Parameter \'b\'\n"
-"will become a keyword-only parameter in Python 3.14.\n"
-"");
-
-#define TEST_DEPRECATE_POSITIONAL_POS1_LEN1_METHODDEF \
- {"test_deprecate_positional_pos1_len1", _PyCFunction_CAST(test_deprecate_positional_pos1_len1), METH_FASTCALL|METH_KEYWORDS, test_deprecate_positional_pos1_len1__doc__},
-
-static PyObject *
-test_deprecate_positional_pos1_len1_impl(PyObject *module, PyObject *a,
- PyObject *b);
-
-static PyObject *
-test_deprecate_positional_pos1_len1(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
-{
- PyObject *return_value = NULL;
- #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
-
- #define NUM_KEYWORDS 2
- static struct {
- PyGC_Head _this_is_not_used;
- PyObject_VAR_HEAD
- PyObject *ob_item[NUM_KEYWORDS];
- } _kwtuple = {
- .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
- .ob_item = { &_Py_ID(a), &_Py_ID(b), },
- };
- #undef NUM_KEYWORDS
- #define KWTUPLE (&_kwtuple.ob_base.ob_base)
-
- #else // !Py_BUILD_CORE
- # define KWTUPLE NULL
- #endif // !Py_BUILD_CORE
-
- static const char * const _keywords[] = {"a", "b", NULL};
- static _PyArg_Parser _parser = {
- .keywords = _keywords,
- .fname = "test_deprecate_positional_pos1_len1",
- .kwtuple = KWTUPLE,
- };
- #undef KWTUPLE
- PyObject *argsbuf[2];
- PyObject *a;
- PyObject *b;
-
- // Emit compiler warnings when we get to Python 3.14.
- #if PY_VERSION_HEX >= 0x030e00C0
- # error \
- "In clinic.test.c, update parameter(s) 'b' in the clinic input of" \
- " 'test_deprecate_positional_pos1_len1' to be keyword-only."
- #elif PY_VERSION_HEX >= 0x030e00A0
- # ifdef _MSC_VER
- # pragma message ( \
- "In clinic.test.c, update parameter(s) 'b' in the clinic input of" \
- " 'test_deprecate_positional_pos1_len1' to be keyword-only.")
- # else
- # warning \
- "In clinic.test.c, update parameter(s) 'b' in the clinic input of" \
- " 'test_deprecate_positional_pos1_len1' to be keyword-only."
- # endif
- #endif
- if (nargs == 2) {
- if (PyErr_WarnEx(PyExc_DeprecationWarning,
- "Passing 2 positional arguments to "
- "test_deprecate_positional_pos1_len1() is deprecated. Parameter "
- "'b' will become a keyword-only parameter in Python 3.14.", 1))
- {
- goto exit;
- }
- }
- args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf);
- if (!args) {
- goto exit;
- }
- a = args[0];
- b = args[1];
- return_value = test_deprecate_positional_pos1_len1_impl(module, a, b);
-
-exit:
- return return_value;
-}
-
-static PyObject *
-test_deprecate_positional_pos1_len1_impl(PyObject *module, PyObject *a,
- PyObject *b)
-/*[clinic end generated code: output=994bd57c1c634709 input=1702bbab1e9b3b99]*/
-
-
-/*[clinic input]
-test_deprecate_positional_pos1_len2_with_kwd
- a: object
- * [from 3.14]
- b: object
- c: object
- *
- d: object
-[clinic start generated code]*/
-
-PyDoc_STRVAR(test_deprecate_positional_pos1_len2_with_kwd__doc__,
-"test_deprecate_positional_pos1_len2_with_kwd($module, /, a, b, c, *, d)\n"
-"--\n"
-"\n"
-"Note: Passing more than 1 positional argument to\n"
-"test_deprecate_positional_pos1_len2_with_kwd() is deprecated.\n"
-"Parameters \'b\' and \'c\' will become keyword-only parameters in Python\n"
-"3.14.\n"
-"");
-
-#define TEST_DEPRECATE_POSITIONAL_POS1_LEN2_WITH_KWD_METHODDEF \
- {"test_deprecate_positional_pos1_len2_with_kwd", _PyCFunction_CAST(test_deprecate_positional_pos1_len2_with_kwd), METH_FASTCALL|METH_KEYWORDS, test_deprecate_positional_pos1_len2_with_kwd__doc__},
-
-static PyObject *
-test_deprecate_positional_pos1_len2_with_kwd_impl(PyObject *module,
- PyObject *a, PyObject *b,
- PyObject *c, PyObject *d);
-
-static PyObject *
-test_deprecate_positional_pos1_len2_with_kwd(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
-{
- PyObject *return_value = NULL;
- #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
-
- #define NUM_KEYWORDS 4
- static struct {
- PyGC_Head _this_is_not_used;
- PyObject_VAR_HEAD
- PyObject *ob_item[NUM_KEYWORDS];
- } _kwtuple = {
- .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
- .ob_item = { &_Py_ID(a), &_Py_ID(b), &_Py_ID(c), &_Py_ID(d), },
- };
- #undef NUM_KEYWORDS
- #define KWTUPLE (&_kwtuple.ob_base.ob_base)
-
- #else // !Py_BUILD_CORE
- # define KWTUPLE NULL
- #endif // !Py_BUILD_CORE
-
- static const char * const _keywords[] = {"a", "b", "c", "d", NULL};
- static _PyArg_Parser _parser = {
- .keywords = _keywords,
- .fname = "test_deprecate_positional_pos1_len2_with_kwd",
- .kwtuple = KWTUPLE,
- };
- #undef KWTUPLE
- PyObject *argsbuf[4];
- PyObject *a;
- PyObject *b;
- PyObject *c;
- PyObject *d;
-
- // Emit compiler warnings when we get to Python 3.14.
- #if PY_VERSION_HEX >= 0x030e00C0
- # error \
- "In clinic.test.c, update parameter(s) 'b' and 'c' in the clinic " \
- "input of 'test_deprecate_positional_pos1_len2_with_kwd' to be " \
- "keyword-only."
- #elif PY_VERSION_HEX >= 0x030e00A0
- # ifdef _MSC_VER
- # pragma message ( \
- "In clinic.test.c, update parameter(s) 'b' and 'c' in the clinic " \
- "input of 'test_deprecate_positional_pos1_len2_with_kwd' to be " \
- "keyword-only.")
- # else
- # warning \
- "In clinic.test.c, update parameter(s) 'b' and 'c' in the clinic " \
- "input of 'test_deprecate_positional_pos1_len2_with_kwd' to be " \
- "keyword-only."
- # endif
- #endif
- if (nargs > 1 && nargs <= 3) {
- if (PyErr_WarnEx(PyExc_DeprecationWarning,
- "Passing more than 1 positional argument to "
- "test_deprecate_positional_pos1_len2_with_kwd() is deprecated. "
- "Parameters 'b' and 'c' will become keyword-only parameters in "
- "Python 3.14.", 1))
- {
- goto exit;
- }
- }
- args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 3, 1, argsbuf);
- if (!args) {
- goto exit;
- }
- a = args[0];
- b = args[1];
- c = args[2];
- d = args[3];
- return_value = test_deprecate_positional_pos1_len2_with_kwd_impl(module, a, b, c, d);
-
-exit:
- return return_value;
-}
-
-static PyObject *
-test_deprecate_positional_pos1_len2_with_kwd_impl(PyObject *module,
- PyObject *a, PyObject *b,
- PyObject *c, PyObject *d)
-/*[clinic end generated code: output=146c60ecbcdbf4b8 input=28cdb885f6c34eab]*/
-
-
-/*[clinic input]
-test_deprecate_positional_pos0_len1
- * [from 3.14]
- a: object
-[clinic start generated code]*/
-
-PyDoc_STRVAR(test_deprecate_positional_pos0_len1__doc__,
-"test_deprecate_positional_pos0_len1($module, /, a)\n"
-"--\n"
-"\n"
-"Note: Passing positional arguments to\n"
-"test_deprecate_positional_pos0_len1() is deprecated. Parameter \'a\'\n"
-"will become a keyword-only parameter in Python 3.14.\n"
-"");
-
-#define TEST_DEPRECATE_POSITIONAL_POS0_LEN1_METHODDEF \
- {"test_deprecate_positional_pos0_len1", _PyCFunction_CAST(test_deprecate_positional_pos0_len1), METH_FASTCALL|METH_KEYWORDS, test_deprecate_positional_pos0_len1__doc__},
-
-static PyObject *
-test_deprecate_positional_pos0_len1_impl(PyObject *module, PyObject *a);
-
-static PyObject *
-test_deprecate_positional_pos0_len1(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
-{
- PyObject *return_value = NULL;
- #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
-
- #define NUM_KEYWORDS 1
- static struct {
- PyGC_Head _this_is_not_used;
- PyObject_VAR_HEAD
- PyObject *ob_item[NUM_KEYWORDS];
- } _kwtuple = {
- .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
- .ob_item = { &_Py_ID(a), },
- };
- #undef NUM_KEYWORDS
- #define KWTUPLE (&_kwtuple.ob_base.ob_base)
-
- #else // !Py_BUILD_CORE
- # define KWTUPLE NULL
- #endif // !Py_BUILD_CORE
-
- static const char * const _keywords[] = {"a", NULL};
- static _PyArg_Parser _parser = {
- .keywords = _keywords,
- .fname = "test_deprecate_positional_pos0_len1",
- .kwtuple = KWTUPLE,
- };
- #undef KWTUPLE
- PyObject *argsbuf[1];
- PyObject *a;
-
- // Emit compiler warnings when we get to Python 3.14.
- #if PY_VERSION_HEX >= 0x030e00C0
- # error \
- "In clinic.test.c, update parameter(s) 'a' in the clinic input of" \
- " 'test_deprecate_positional_pos0_len1' to be keyword-only."
- #elif PY_VERSION_HEX >= 0x030e00A0
- # ifdef _MSC_VER
- # pragma message ( \
- "In clinic.test.c, update parameter(s) 'a' in the clinic input of" \
- " 'test_deprecate_positional_pos0_len1' to be keyword-only.")
- # else
- # warning \
- "In clinic.test.c, update parameter(s) 'a' in the clinic input of" \
- " 'test_deprecate_positional_pos0_len1' to be keyword-only."
- # endif
- #endif
- if (nargs == 1) {
- if (PyErr_WarnEx(PyExc_DeprecationWarning,
- "Passing positional arguments to "
- "test_deprecate_positional_pos0_len1() is deprecated. Parameter "
- "'a' will become a keyword-only parameter in Python 3.14.", 1))
- {
- goto exit;
- }
- }
- args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
- if (!args) {
- goto exit;
- }
- a = args[0];
- return_value = test_deprecate_positional_pos0_len1_impl(module, a);
-
-exit:
- return return_value;
-}
-
-static PyObject *
-test_deprecate_positional_pos0_len1_impl(PyObject *module, PyObject *a)
-/*[clinic end generated code: output=dce99971a2494f9f input=678206db25c0652c]*/
-
-
-/*[clinic input]
-test_deprecate_positional_pos0_len2
- * [from 3.14]
- a: object
- b: object
-[clinic start generated code]*/
-
-PyDoc_STRVAR(test_deprecate_positional_pos0_len2__doc__,
-"test_deprecate_positional_pos0_len2($module, /, a, b)\n"
-"--\n"
-"\n"
-"Note: Passing positional arguments to\n"
-"test_deprecate_positional_pos0_len2() is deprecated. Parameters \'a\'\n"
-"and \'b\' will become keyword-only parameters in Python 3.14.\n"
-"");
-
-#define TEST_DEPRECATE_POSITIONAL_POS0_LEN2_METHODDEF \
- {"test_deprecate_positional_pos0_len2", _PyCFunction_CAST(test_deprecate_positional_pos0_len2), METH_FASTCALL|METH_KEYWORDS, test_deprecate_positional_pos0_len2__doc__},
-
-static PyObject *
-test_deprecate_positional_pos0_len2_impl(PyObject *module, PyObject *a,
- PyObject *b);
-
-static PyObject *
-test_deprecate_positional_pos0_len2(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
-{
- PyObject *return_value = NULL;
- #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
-
- #define NUM_KEYWORDS 2
- static struct {
- PyGC_Head _this_is_not_used;
- PyObject_VAR_HEAD
- PyObject *ob_item[NUM_KEYWORDS];
- } _kwtuple = {
- .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
- .ob_item = { &_Py_ID(a), &_Py_ID(b), },
- };
- #undef NUM_KEYWORDS
- #define KWTUPLE (&_kwtuple.ob_base.ob_base)
-
- #else // !Py_BUILD_CORE
- # define KWTUPLE NULL
- #endif // !Py_BUILD_CORE
-
- static const char * const _keywords[] = {"a", "b", NULL};
- static _PyArg_Parser _parser = {
- .keywords = _keywords,
- .fname = "test_deprecate_positional_pos0_len2",
- .kwtuple = KWTUPLE,
- };
- #undef KWTUPLE
- PyObject *argsbuf[2];
- PyObject *a;
- PyObject *b;
-
- // Emit compiler warnings when we get to Python 3.14.
- #if PY_VERSION_HEX >= 0x030e00C0
- # error \
- "In clinic.test.c, update parameter(s) 'a' and 'b' in the clinic " \
- "input of 'test_deprecate_positional_pos0_len2' to be " \
- "keyword-only."
- #elif PY_VERSION_HEX >= 0x030e00A0
- # ifdef _MSC_VER
- # pragma message ( \
- "In clinic.test.c, update parameter(s) 'a' and 'b' in the clinic " \
- "input of 'test_deprecate_positional_pos0_len2' to be " \
- "keyword-only.")
- # else
- # warning \
- "In clinic.test.c, update parameter(s) 'a' and 'b' in the clinic " \
- "input of 'test_deprecate_positional_pos0_len2' to be " \
- "keyword-only."
- # endif
- #endif
- if (nargs > 0 && nargs <= 2) {
- if (PyErr_WarnEx(PyExc_DeprecationWarning,
- "Passing positional arguments to "
- "test_deprecate_positional_pos0_len2() is deprecated. Parameters "
- "'a' and 'b' will become keyword-only parameters in Python 3.14.", 1))
- {
- goto exit;
- }
- }
- args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf);
- if (!args) {
- goto exit;
- }
- a = args[0];
- b = args[1];
- return_value = test_deprecate_positional_pos0_len2_impl(module, a, b);
-
-exit:
- return return_value;
-}
-
-static PyObject *
-test_deprecate_positional_pos0_len2_impl(PyObject *module, PyObject *a,
- PyObject *b)
-/*[clinic end generated code: output=06999692e0c8dac4 input=fae0d0b1d480c939]*/
-
-
-/*[clinic input]
-test_deprecate_positional_pos0_len3_with_kwdonly
- * [from 3.14]
- a: object
- b: object
- c: object
- *
- e: object
-[clinic start generated code]*/
-
-PyDoc_STRVAR(test_deprecate_positional_pos0_len3_with_kwdonly__doc__,
-"test_deprecate_positional_pos0_len3_with_kwdonly($module, /, a, b, c,\n"
-" *, e)\n"
-"--\n"
-"\n"
-"Note: Passing positional arguments to\n"
-"test_deprecate_positional_pos0_len3_with_kwdonly() is deprecated.\n"
-"Parameters \'a\', \'b\' and \'c\' will become keyword-only parameters in\n"
-"Python 3.14.\n"
-"");
-
-#define TEST_DEPRECATE_POSITIONAL_POS0_LEN3_WITH_KWDONLY_METHODDEF \
- {"test_deprecate_positional_pos0_len3_with_kwdonly", _PyCFunction_CAST(test_deprecate_positional_pos0_len3_with_kwdonly), METH_FASTCALL|METH_KEYWORDS, test_deprecate_positional_pos0_len3_with_kwdonly__doc__},
-
-static PyObject *
-test_deprecate_positional_pos0_len3_with_kwdonly_impl(PyObject *module,
- PyObject *a,
- PyObject *b,
- PyObject *c,
- PyObject *e);
-
-static PyObject *
-test_deprecate_positional_pos0_len3_with_kwdonly(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
-{
- PyObject *return_value = NULL;
- #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
-
- #define NUM_KEYWORDS 4
- static struct {
- PyGC_Head _this_is_not_used;
- PyObject_VAR_HEAD
- PyObject *ob_item[NUM_KEYWORDS];
- } _kwtuple = {
- .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
- .ob_item = { &_Py_ID(a), &_Py_ID(b), &_Py_ID(c), &_Py_ID(e), },
- };
- #undef NUM_KEYWORDS
- #define KWTUPLE (&_kwtuple.ob_base.ob_base)
-
- #else // !Py_BUILD_CORE
- # define KWTUPLE NULL
- #endif // !Py_BUILD_CORE
-
- static const char * const _keywords[] = {"a", "b", "c", "e", NULL};
- static _PyArg_Parser _parser = {
- .keywords = _keywords,
- .fname = "test_deprecate_positional_pos0_len3_with_kwdonly",
- .kwtuple = KWTUPLE,
- };
- #undef KWTUPLE
- PyObject *argsbuf[4];
- PyObject *a;
- PyObject *b;
- PyObject *c;
- PyObject *e;
-
- // Emit compiler warnings when we get to Python 3.14.
- #if PY_VERSION_HEX >= 0x030e00C0
- # error \
- "In clinic.test.c, update parameter(s) 'a', 'b' and 'c' in the " \
- "clinic input of " \
- "'test_deprecate_positional_pos0_len3_with_kwdonly' to be " \
- "keyword-only."
- #elif PY_VERSION_HEX >= 0x030e00A0
- # ifdef _MSC_VER
- # pragma message ( \
- "In clinic.test.c, update parameter(s) 'a', 'b' and 'c' in the " \
- "clinic input of " \
- "'test_deprecate_positional_pos0_len3_with_kwdonly' to be " \
- "keyword-only.")
- # else
- # warning \
- "In clinic.test.c, update parameter(s) 'a', 'b' and 'c' in the " \
- "clinic input of " \
- "'test_deprecate_positional_pos0_len3_with_kwdonly' to be " \
- "keyword-only."
- # endif
- #endif
- if (nargs > 0 && nargs <= 3) {
- if (PyErr_WarnEx(PyExc_DeprecationWarning,
- "Passing positional arguments to "
- "test_deprecate_positional_pos0_len3_with_kwdonly() is "
- "deprecated. Parameters 'a', 'b' and 'c' will become keyword-only"
- " parameters in Python 3.14.", 1))
- {
- goto exit;
- }
- }
- args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 3, 1, argsbuf);
- if (!args) {
- goto exit;
- }
- a = args[0];
- b = args[1];
- c = args[2];
- e = args[3];
- return_value = test_deprecate_positional_pos0_len3_with_kwdonly_impl(module, a, b, c, e);
-
-exit:
- return return_value;
-}
-
-static PyObject *
-test_deprecate_positional_pos0_len3_with_kwdonly_impl(PyObject *module,
- PyObject *a,
- PyObject *b,
- PyObject *c,
- PyObject *e)
-/*[clinic end generated code: output=a553e33101dc42b2 input=1b0121770c0c52e0]*/
-
-
-/*[clinic input]
-test_deprecate_positional_pos2_len1
- a: object
- b: object
- * [from 3.14]
- c: object
-[clinic start generated code]*/
-
-PyDoc_STRVAR(test_deprecate_positional_pos2_len1__doc__,
-"test_deprecate_positional_pos2_len1($module, /, a, b, c)\n"
-"--\n"
-"\n"
-"Note: Passing 3 positional arguments to\n"
-"test_deprecate_positional_pos2_len1() is deprecated. Parameter \'c\'\n"
-"will become a keyword-only parameter in Python 3.14.\n"
-"");
-
-#define TEST_DEPRECATE_POSITIONAL_POS2_LEN1_METHODDEF \
- {"test_deprecate_positional_pos2_len1", _PyCFunction_CAST(test_deprecate_positional_pos2_len1), METH_FASTCALL|METH_KEYWORDS, test_deprecate_positional_pos2_len1__doc__},
-
-static PyObject *
-test_deprecate_positional_pos2_len1_impl(PyObject *module, PyObject *a,
- PyObject *b, PyObject *c);
-
-static PyObject *
-test_deprecate_positional_pos2_len1(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
-{
- PyObject *return_value = NULL;
- #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
-
- #define NUM_KEYWORDS 3
- static struct {
- PyGC_Head _this_is_not_used;
- PyObject_VAR_HEAD
- PyObject *ob_item[NUM_KEYWORDS];
- } _kwtuple = {
- .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
- .ob_item = { &_Py_ID(a), &_Py_ID(b), &_Py_ID(c), },
- };
- #undef NUM_KEYWORDS
- #define KWTUPLE (&_kwtuple.ob_base.ob_base)
-
- #else // !Py_BUILD_CORE
- # define KWTUPLE NULL
- #endif // !Py_BUILD_CORE
-
- static const char * const _keywords[] = {"a", "b", "c", NULL};
- static _PyArg_Parser _parser = {
- .keywords = _keywords,
- .fname = "test_deprecate_positional_pos2_len1",
- .kwtuple = KWTUPLE,
- };
- #undef KWTUPLE
- PyObject *argsbuf[3];
- PyObject *a;
- PyObject *b;
- PyObject *c;
-
- // Emit compiler warnings when we get to Python 3.14.
- #if PY_VERSION_HEX >= 0x030e00C0
- # error \
- "In clinic.test.c, update parameter(s) 'c' in the clinic input of" \
- " 'test_deprecate_positional_pos2_len1' to be keyword-only."
- #elif PY_VERSION_HEX >= 0x030e00A0
- # ifdef _MSC_VER
- # pragma message ( \
- "In clinic.test.c, update parameter(s) 'c' in the clinic input of" \
- " 'test_deprecate_positional_pos2_len1' to be keyword-only.")
- # else
- # warning \
- "In clinic.test.c, update parameter(s) 'c' in the clinic input of" \
- " 'test_deprecate_positional_pos2_len1' to be keyword-only."
- # endif
- #endif
- if (nargs == 3) {
- if (PyErr_WarnEx(PyExc_DeprecationWarning,
- "Passing 3 positional arguments to "
- "test_deprecate_positional_pos2_len1() is deprecated. Parameter "
- "'c' will become a keyword-only parameter in Python 3.14.", 1))
- {
- goto exit;
- }
- }
- args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 3, 0, argsbuf);
- if (!args) {
- goto exit;
- }
- a = args[0];
- b = args[1];
- c = args[2];
- return_value = test_deprecate_positional_pos2_len1_impl(module, a, b, c);
-
-exit:
- return return_value;
-}
-
-static PyObject *
-test_deprecate_positional_pos2_len1_impl(PyObject *module, PyObject *a,
- PyObject *b, PyObject *c)
-/*[clinic end generated code: output=f96454a4970b443c input=e1d129689e69ec7c]*/
-
-
-/*[clinic input]
-test_deprecate_positional_pos2_len2
- a: object
- b: object
- * [from 3.14]
- c: object
- d: object
-[clinic start generated code]*/
-
-PyDoc_STRVAR(test_deprecate_positional_pos2_len2__doc__,
-"test_deprecate_positional_pos2_len2($module, /, a, b, c, d)\n"
-"--\n"
-"\n"
-"Note: Passing more than 2 positional arguments to\n"
-"test_deprecate_positional_pos2_len2() is deprecated. Parameters \'c\'\n"
-"and \'d\' will become keyword-only parameters in Python 3.14.\n"
-"");
-
-#define TEST_DEPRECATE_POSITIONAL_POS2_LEN2_METHODDEF \
- {"test_deprecate_positional_pos2_len2", _PyCFunction_CAST(test_deprecate_positional_pos2_len2), METH_FASTCALL|METH_KEYWORDS, test_deprecate_positional_pos2_len2__doc__},
-
-static PyObject *
-test_deprecate_positional_pos2_len2_impl(PyObject *module, PyObject *a,
- PyObject *b, PyObject *c,
- PyObject *d);
-
-static PyObject *
-test_deprecate_positional_pos2_len2(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
-{
- PyObject *return_value = NULL;
- #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
-
- #define NUM_KEYWORDS 4
- static struct {
- PyGC_Head _this_is_not_used;
- PyObject_VAR_HEAD
- PyObject *ob_item[NUM_KEYWORDS];
- } _kwtuple = {
- .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
- .ob_item = { &_Py_ID(a), &_Py_ID(b), &_Py_ID(c), &_Py_ID(d), },
- };
- #undef NUM_KEYWORDS
- #define KWTUPLE (&_kwtuple.ob_base.ob_base)
-
- #else // !Py_BUILD_CORE
- # define KWTUPLE NULL
- #endif // !Py_BUILD_CORE
-
- static const char * const _keywords[] = {"a", "b", "c", "d", NULL};
- static _PyArg_Parser _parser = {
- .keywords = _keywords,
- .fname = "test_deprecate_positional_pos2_len2",
- .kwtuple = KWTUPLE,
- };
- #undef KWTUPLE
- PyObject *argsbuf[4];
- PyObject *a;
- PyObject *b;
- PyObject *c;
- PyObject *d;
-
- // Emit compiler warnings when we get to Python 3.14.
- #if PY_VERSION_HEX >= 0x030e00C0
- # error \
- "In clinic.test.c, update parameter(s) 'c' and 'd' in the clinic " \
- "input of 'test_deprecate_positional_pos2_len2' to be " \
- "keyword-only."
- #elif PY_VERSION_HEX >= 0x030e00A0
- # ifdef _MSC_VER
- # pragma message ( \
- "In clinic.test.c, update parameter(s) 'c' and 'd' in the clinic " \
- "input of 'test_deprecate_positional_pos2_len2' to be " \
- "keyword-only.")
- # else
- # warning \
- "In clinic.test.c, update parameter(s) 'c' and 'd' in the clinic " \
- "input of 'test_deprecate_positional_pos2_len2' to be " \
- "keyword-only."
- # endif
- #endif
- if (nargs > 2 && nargs <= 4) {
- if (PyErr_WarnEx(PyExc_DeprecationWarning,
- "Passing more than 2 positional arguments to "
- "test_deprecate_positional_pos2_len2() is deprecated. Parameters "
- "'c' and 'd' will become keyword-only parameters in Python 3.14.", 1))
- {
- goto exit;
- }
- }
- args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 4, 4, 0, argsbuf);
- if (!args) {
- goto exit;
- }
- a = args[0];
- b = args[1];
- c = args[2];
- d = args[3];
- return_value = test_deprecate_positional_pos2_len2_impl(module, a, b, c, d);
-
-exit:
- return return_value;
-}
-
-static PyObject *
-test_deprecate_positional_pos2_len2_impl(PyObject *module, PyObject *a,
- PyObject *b, PyObject *c,
- PyObject *d)
-/*[clinic end generated code: output=5e648e887da0a804 input=0d53533463a12792]*/
-
-
-/*[clinic input]
-test_deprecate_positional_pos2_len3_with_kwdonly
- a: object
- b: object
- * [from 3.14]
- c: object
- d: object
- *
- e: object
-[clinic start generated code]*/
-
-PyDoc_STRVAR(test_deprecate_positional_pos2_len3_with_kwdonly__doc__,
-"test_deprecate_positional_pos2_len3_with_kwdonly($module, /, a, b, c,\n"
-" d, *, e)\n"
-"--\n"
-"\n"
-"Note: Passing more than 2 positional arguments to\n"
-"test_deprecate_positional_pos2_len3_with_kwdonly() is deprecated.\n"
-"Parameters \'c\' and \'d\' will become keyword-only parameters in Python\n"
-"3.14.\n"
-"");
-
-#define TEST_DEPRECATE_POSITIONAL_POS2_LEN3_WITH_KWDONLY_METHODDEF \
- {"test_deprecate_positional_pos2_len3_with_kwdonly", _PyCFunction_CAST(test_deprecate_positional_pos2_len3_with_kwdonly), METH_FASTCALL|METH_KEYWORDS, test_deprecate_positional_pos2_len3_with_kwdonly__doc__},
-
-static PyObject *
-test_deprecate_positional_pos2_len3_with_kwdonly_impl(PyObject *module,
- PyObject *a,
- PyObject *b,
- PyObject *c,
- PyObject *d,
- PyObject *e);
-
-static PyObject *
-test_deprecate_positional_pos2_len3_with_kwdonly(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
-{
- PyObject *return_value = NULL;
- #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
-
- #define NUM_KEYWORDS 5
- static struct {
- PyGC_Head _this_is_not_used;
- PyObject_VAR_HEAD
- PyObject *ob_item[NUM_KEYWORDS];
- } _kwtuple = {
- .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
- .ob_item = { &_Py_ID(a), &_Py_ID(b), &_Py_ID(c), &_Py_ID(d), &_Py_ID(e), },
- };
- #undef NUM_KEYWORDS
- #define KWTUPLE (&_kwtuple.ob_base.ob_base)
-
- #else // !Py_BUILD_CORE
- # define KWTUPLE NULL
- #endif // !Py_BUILD_CORE
-
- static const char * const _keywords[] = {"a", "b", "c", "d", "e", NULL};
- static _PyArg_Parser _parser = {
- .keywords = _keywords,
- .fname = "test_deprecate_positional_pos2_len3_with_kwdonly",
- .kwtuple = KWTUPLE,
- };
- #undef KWTUPLE
- PyObject *argsbuf[5];
- PyObject *a;
- PyObject *b;
- PyObject *c;
- PyObject *d;
- PyObject *e;
-
- // Emit compiler warnings when we get to Python 3.14.
- #if PY_VERSION_HEX >= 0x030e00C0
- # error \
- "In clinic.test.c, update parameter(s) 'c' and 'd' in the clinic " \
- "input of 'test_deprecate_positional_pos2_len3_with_kwdonly' to " \
- "be keyword-only."
- #elif PY_VERSION_HEX >= 0x030e00A0
- # ifdef _MSC_VER
- # pragma message ( \
- "In clinic.test.c, update parameter(s) 'c' and 'd' in the clinic " \
- "input of 'test_deprecate_positional_pos2_len3_with_kwdonly' to " \
- "be keyword-only.")
- # else
- # warning \
- "In clinic.test.c, update parameter(s) 'c' and 'd' in the clinic " \
- "input of 'test_deprecate_positional_pos2_len3_with_kwdonly' to " \
- "be keyword-only."
- # endif
- #endif
- if (nargs > 2 && nargs <= 4) {
- if (PyErr_WarnEx(PyExc_DeprecationWarning,
- "Passing more than 2 positional arguments to "
- "test_deprecate_positional_pos2_len3_with_kwdonly() is "
- "deprecated. Parameters 'c' and 'd' will become keyword-only "
- "parameters in Python 3.14.", 1))
- {
- goto exit;
- }
- }
- args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 4, 4, 1, argsbuf);
- if (!args) {
- goto exit;
- }
- a = args[0];
- b = args[1];
- c = args[2];
- d = args[3];
- e = args[4];
- return_value = test_deprecate_positional_pos2_len3_with_kwdonly_impl(module, a, b, c, d, e);
-
-exit:
- return return_value;
-}
-
-static PyObject *
-test_deprecate_positional_pos2_len3_with_kwdonly_impl(PyObject *module,
- PyObject *a,
- PyObject *b,
- PyObject *c,
- PyObject *d,
- PyObject *e)
-/*[clinic end generated code: output=383d56b03f7c2dcb input=154fd450448d8935]*/
-
-
-/*[clinic input]
-@classmethod
-Test.__new__
- * [from 3.14]
- a: object
-The deprecation message should use the class name instead of __new__.
-[clinic start generated code]*/
-
-PyDoc_STRVAR(Test__doc__,
-"Test(a)\n"
-"--\n"
-"\n"
-"The deprecation message should use the class name instead of __new__.\n"
-"\n"
-"Note: Passing positional arguments to Test() is deprecated. Parameter\n"
-"\'a\' will become a keyword-only parameter in Python 3.14.\n"
-"");
-
-static PyObject *
-Test_impl(PyTypeObject *type, PyObject *a);
-
-static PyObject *
-Test(PyTypeObject *type, PyObject *args, PyObject *kwargs)
-{
- PyObject *return_value = NULL;
- #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
-
- #define NUM_KEYWORDS 1
- static struct {
- PyGC_Head _this_is_not_used;
- PyObject_VAR_HEAD
- PyObject *ob_item[NUM_KEYWORDS];
- } _kwtuple = {
- .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
- .ob_item = { &_Py_ID(a), },
- };
- #undef NUM_KEYWORDS
- #define KWTUPLE (&_kwtuple.ob_base.ob_base)
-
- #else // !Py_BUILD_CORE
- # define KWTUPLE NULL
- #endif // !Py_BUILD_CORE
-
- static const char * const _keywords[] = {"a", NULL};
- static _PyArg_Parser _parser = {
- .keywords = _keywords,
- .fname = "Test",
- .kwtuple = KWTUPLE,
- };
- #undef KWTUPLE
- PyObject *argsbuf[1];
- PyObject * const *fastargs;
- Py_ssize_t nargs = PyTuple_GET_SIZE(args);
- PyObject *a;
-
- // Emit compiler warnings when we get to Python 3.14.
- #if PY_VERSION_HEX >= 0x030e00C0
- # error \
- "In clinic.test.c, update parameter(s) 'a' in the clinic input of" \
- " 'Test.__new__' to be keyword-only."
- #elif PY_VERSION_HEX >= 0x030e00A0
- # ifdef _MSC_VER
- # pragma message ( \
- "In clinic.test.c, update parameter(s) 'a' in the clinic input of" \
- " 'Test.__new__' to be keyword-only.")
- # else
- # warning \
- "In clinic.test.c, update parameter(s) 'a' in the clinic input of" \
- " 'Test.__new__' to be keyword-only."
- # endif
- #endif
- if (nargs == 1) {
- if (PyErr_WarnEx(PyExc_DeprecationWarning,
- "Passing positional arguments to Test() is deprecated. Parameter "
- "'a' will become a keyword-only parameter in Python 3.14.", 1))
- {
- goto exit;
- }
- }
- fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 1, 1, 0, argsbuf);
- if (!fastargs) {
- goto exit;
- }
- a = fastargs[0];
- return_value = Test_impl(type, a);
-
-exit:
- return return_value;
-}
-
-static PyObject *
-Test_impl(PyTypeObject *type, PyObject *a)
-/*[clinic end generated code: output=d15a69ea37ec6502 input=f133dc077aef49ec]*/
-
-
-/*[clinic input]
-m.T.__init__
- * [from 3.14]
- a: object
-The deprecation message should use the class name instead of __init__.
-[clinic start generated code]*/
-
-PyDoc_STRVAR(m_T___init____doc__,
-"T(a)\n"
-"--\n"
-"\n"
-"The deprecation message should use the class name instead of __init__.\n"
-"\n"
-"Note: Passing positional arguments to m.T() is deprecated. Parameter\n"
-"\'a\' will become a keyword-only parameter in Python 3.14.\n"
-"");
-
-static int
-m_T___init___impl(TestObj *self, PyObject *a);
-
-static int
-m_T___init__(PyObject *self, PyObject *args, PyObject *kwargs)
-{
- int return_value = -1;
- #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
-
- #define NUM_KEYWORDS 1
- static struct {
- PyGC_Head _this_is_not_used;
- PyObject_VAR_HEAD
- PyObject *ob_item[NUM_KEYWORDS];
- } _kwtuple = {
- .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
- .ob_item = { &_Py_ID(a), },
- };
- #undef NUM_KEYWORDS
- #define KWTUPLE (&_kwtuple.ob_base.ob_base)
-
- #else // !Py_BUILD_CORE
- # define KWTUPLE NULL
- #endif // !Py_BUILD_CORE
-
- static const char * const _keywords[] = {"a", NULL};
- static _PyArg_Parser _parser = {
- .keywords = _keywords,
- .fname = "T",
- .kwtuple = KWTUPLE,
- };
- #undef KWTUPLE
- PyObject *argsbuf[1];
- PyObject * const *fastargs;
- Py_ssize_t nargs = PyTuple_GET_SIZE(args);
- PyObject *a;
-
- // Emit compiler warnings when we get to Python 3.14.
- #if PY_VERSION_HEX >= 0x030e00C0
- # error \
- "In clinic.test.c, update parameter(s) 'a' in the clinic input of" \
- " 'm.T.__init__' to be keyword-only."
- #elif PY_VERSION_HEX >= 0x030e00A0
- # ifdef _MSC_VER
- # pragma message ( \
- "In clinic.test.c, update parameter(s) 'a' in the clinic input of" \
- " 'm.T.__init__' to be keyword-only.")
- # else
- # warning \
- "In clinic.test.c, update parameter(s) 'a' in the clinic input of" \
- " 'm.T.__init__' to be keyword-only."
- # endif
- #endif
- if (nargs == 1) {
- if (PyErr_WarnEx(PyExc_DeprecationWarning,
- "Passing positional arguments to m.T() is deprecated. Parameter "
- "'a' will become a keyword-only parameter in Python 3.14.", 1))
- {
- goto exit;
- }
- }
- fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 1, 1, 0, argsbuf);
- if (!fastargs) {
- goto exit;
- }
- a = fastargs[0];
- return_value = m_T___init___impl((TestObj *)self, a);
-
-exit:
- return return_value;
-}
-
-static int
-m_T___init___impl(TestObj *self, PyObject *a)
-/*[clinic end generated code: output=ef43c425816a549f input=f71b51dbe19fa657]*/
diff --git a/Lib/test/test_clinic.py b/Lib/test/test_clinic.py
index 3921523..a649b5f 100644
--- a/Lib/test/test_clinic.py
+++ b/Lib/test/test_clinic.py
@@ -2,6 +2,7 @@
# Copyright 2012-2013 by Larry Hastings.
# Licensed to the PSF under a contributor agreement.
+from functools import partial
from test import support, test_tools
from test.support import os_helper
from test.support.os_helper import TESTFN, unlink
@@ -2431,6 +2432,19 @@ class ClinicFunctionalTest(unittest.TestCase):
locals().update((name, getattr(ac_tester, name))
for name in dir(ac_tester) if name.startswith('test_'))
+ def check_depr_star(self, pnames, fn, *args, **kwds):
+ regex = (
+ fr"Passing( more than)?( [0-9]+)? positional argument(s)? to "
+ fr"{fn.__name__}\(\) is deprecated. Parameter(s)? {pnames} will "
+ fr"become( a)? keyword-only parameter(s)? in Python 3\.14"
+ )
+ with self.assertWarnsRegex(DeprecationWarning, regex) as cm:
+ # Record the line number, so we're sure we've got the correct stack
+ # level on the deprecation warning.
+ _, lineno = fn(*args, **kwds), sys._getframe().f_lineno
+ self.assertEqual(cm.filename, __file__)
+ self.assertEqual(cm.lineno, lineno)
+
def test_objects_converter(self):
with self.assertRaises(TypeError):
ac_tester.objects_converter()
@@ -2895,6 +2909,95 @@ class ClinicFunctionalTest(unittest.TestCase):
func = getattr(ac_tester, name)
self.assertEqual(func(), name)
+ def test_depr_star_new(self):
+ regex = re.escape(
+ "Passing positional arguments to _testclinic.DeprStarNew() is "
+ "deprecated. Parameter 'a' will become a keyword-only parameter "
+ "in Python 3.14."
+ )
+ with self.assertWarnsRegex(DeprecationWarning, regex) as cm:
+ ac_tester.DeprStarNew(None)
+ self.assertEqual(cm.filename, __file__)
+
+ def test_depr_star_init(self):
+ regex = re.escape(
+ "Passing positional arguments to _testclinic.DeprStarInit() is "
+ "deprecated. Parameter 'a' will become a keyword-only parameter "
+ "in Python 3.14."
+ )
+ with self.assertWarnsRegex(DeprecationWarning, regex) as cm:
+ ac_tester.DeprStarInit(None)
+ self.assertEqual(cm.filename, __file__)
+
+ def test_depr_star_pos0_len1(self):
+ fn = ac_tester.depr_star_pos0_len1
+ fn(a=None)
+ self.check_depr_star("'a'", fn, "a")
+
+ def test_depr_star_pos0_len2(self):
+ fn = ac_tester.depr_star_pos0_len2
+ fn(a=0, b=0)
+ check = partial(self.check_depr_star, "'a' and 'b'", fn)
+ check("a", b=0)
+ check("a", "b")
+
+ def test_depr_star_pos0_len3_with_kwd(self):
+ fn = ac_tester.depr_star_pos0_len3_with_kwd
+ fn(a=0, b=0, c=0, d=0)
+ check = partial(self.check_depr_star, "'a', 'b' and 'c'", fn)
+ check("a", b=0, c=0, d=0)
+ check("a", "b", c=0, d=0)
+ check("a", "b", "c", d=0)
+
+ def test_depr_star_pos1_len1_opt(self):
+ fn = ac_tester.depr_star_pos1_len1_opt
+ fn(a=0, b=0)
+ fn("a", b=0)
+ fn(a=0) # b is optional
+ check = partial(self.check_depr_star, "'b'", fn)
+ check("a", "b")
+
+ def test_depr_star_pos1_len1(self):
+ fn = ac_tester.depr_star_pos1_len1
+ fn(a=0, b=0)
+ fn("a", b=0)
+ check = partial(self.check_depr_star, "'b'", fn)
+ check("a", "b")
+
+ def test_depr_star_pos1_len2_with_kwd(self):
+ fn = ac_tester.depr_star_pos1_len2_with_kwd
+ fn(a=0, b=0, c=0, d=0),
+ fn("a", b=0, c=0, d=0),
+ check = partial(self.check_depr_star, "'b' and 'c'", fn)
+ check("a", "b", c=0, d=0),
+ check("a", "b", "c", d=0),
+
+ def test_depr_star_pos2_len1(self):
+ fn = ac_tester.depr_star_pos2_len1
+ fn(a=0, b=0, c=0)
+ fn("a", b=0, c=0)
+ fn("a", "b", c=0)
+ check = partial(self.check_depr_star, "'c'", fn)
+ check("a", "b", "c")
+
+ def test_depr_star_pos2_len2(self):
+ fn = ac_tester.depr_star_pos2_len2
+ fn(a=0, b=0, c=0, d=0)
+ fn("a", b=0, c=0, d=0)
+ fn("a", "b", c=0, d=0)
+ check = partial(self.check_depr_star, "'c' and 'd'", fn)
+ check("a", "b", "c", d=0)
+ check("a", "b", "c", "d")
+
+ def test_depr_star_pos2_len2_with_kwd(self):
+ fn = ac_tester.depr_star_pos2_len2_with_kwd
+ fn(a=0, b=0, c=0, d=0, e=0)
+ fn("a", b=0, c=0, d=0, e=0)
+ fn("a", "b", c=0, d=0, e=0)
+ check = partial(self.check_depr_star, "'c' and 'd'", fn)
+ check("a", "b", "c", d=0, e=0)
+ check("a", "b", "c", "d", e=0)
+
class PermutationTests(unittest.TestCase):
"""Test permutation support functions."""