[Python-checkins] gh-94808: cover `PyMapping_HasKeyString` and `PyMapping_HasKey` (GH-98486)
miss-islington
webhook-mailer at python.org
Wed Oct 26 00:53:41 EDT 2022
https://github.com/python/cpython/commit/fd9bdde769f371f6824d6dbe724db4b3ba9831ad
commit: fd9bdde769f371f6824d6dbe724db4b3ba9831ad
branch: 3.10
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: miss-islington <31488909+miss-islington at users.noreply.github.com>
date: 2022-10-25T21:53:36-07:00
summary:
gh-94808: cover `PyMapping_HasKeyString` and `PyMapping_HasKey` (GH-98486)
(cherry picked from commit 5d30544485dc56ab999ad7656ef6559306fd013f)
Co-authored-by: Nikita Sobolev <mail at sobolevn.me>
files:
M Lib/test/test_capi.py
M Modules/_testcapimodule.c
diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py
index 0adb689beb82..404a13a0bcc2 100644
--- a/Lib/test/test_capi.py
+++ b/Lib/test/test_capi.py
@@ -371,6 +371,18 @@ def items(self):
self.assertRaises(TypeError, _testcapi.get_mapping_values, bad_mapping)
self.assertRaises(TypeError, _testcapi.get_mapping_items, bad_mapping)
+ def test_mapping_has_key(self):
+ dct = {'a': 1}
+ self.assertTrue(_testcapi.mapping_has_key(dct, 'a'))
+ self.assertFalse(_testcapi.mapping_has_key(dct, 'b'))
+
+ class SubDict(dict):
+ pass
+
+ dct2 = SubDict({'a': 1})
+ self.assertTrue(_testcapi.mapping_has_key(dct2, 'a'))
+ self.assertFalse(_testcapi.mapping_has_key(dct2, 'b'))
+
@unittest.skipUnless(hasattr(_testcapi, 'negative_refcount'),
'need _testcapi.negative_refcount')
def test_negative_refcount(self):
diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c
index 5c582dda4fbf..20c90c441e6b 100644
--- a/Modules/_testcapimodule.c
+++ b/Modules/_testcapimodule.c
@@ -5155,6 +5155,40 @@ get_mapping_items(PyObject* self, PyObject *obj)
return PyMapping_Items(obj);
}
+static PyObject *
+test_mapping_has_key_string(PyObject *self, PyObject *Py_UNUSED(args))
+{
+ PyObject *context = PyDict_New();
+ PyObject *val = PyLong_FromLong(1);
+
+ // Since this uses `const char*` it is easier to test this in C:
+ PyDict_SetItemString(context, "a", val);
+ if (!PyMapping_HasKeyString(context, "a")) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "Existing mapping key does not exist");
+ return NULL;
+ }
+ if (PyMapping_HasKeyString(context, "b")) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "Missing mapping key exists");
+ return NULL;
+ }
+
+ Py_DECREF(val);
+ Py_DECREF(context);
+ Py_RETURN_NONE;
+}
+
+static PyObject *
+mapping_has_key(PyObject* self, PyObject *args)
+{
+ PyObject *context, *key;
+ if (!PyArg_ParseTuple(args, "OO", &context, &key)) {
+ return NULL;
+ }
+ return PyLong_FromLong(PyMapping_HasKey(context, key));
+}
+
static PyObject *
test_pythread_tss_key_state(PyObject *self, PyObject *args)
@@ -5894,6 +5928,8 @@ static PyMethodDef TestMethods[] = {
{"get_mapping_keys", get_mapping_keys, METH_O},
{"get_mapping_values", get_mapping_values, METH_O},
{"get_mapping_items", get_mapping_items, METH_O},
+ {"test_mapping_has_key_string", test_mapping_has_key_string, METH_NOARGS},
+ {"mapping_has_key", mapping_has_key, METH_VARARGS},
{"test_pythread_tss_key_state", test_pythread_tss_key_state, METH_VARARGS},
{"hamt", new_hamt, METH_NOARGS},
{"bad_get", (PyCFunction)(void(*)(void))bad_get, METH_FASTCALL},
More information about the Python-checkins
mailing list