mirror of https://github.com/python/cpython
gh-94808: cover `PyMapping_HasKeyString` and `PyMapping_HasKey` (#98486)
This commit is contained in:
parent
216f45e4fe
commit
5d30544485
|
@ -404,6 +404,18 @@ class CAPITest(unittest.TestCase):
|
|||
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):
|
||||
|
|
|
@ -4690,6 +4690,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)
|
||||
|
@ -6054,6 +6088,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_CAST(bad_get), METH_FASTCALL},
|
||||
|
|
Loading…
Reference in New Issue