@@ -153,6 +153,47 @@ def noexist():
153153defPyObject_GetAttrString(op: ctypes.py_object, attr: ctypes.c_char_p):
154154pass
155155156+deftest_wrap_dll_function_non_positional(self):
157+# argtypes describes positional arguments only, so a parameter that
158+# cannot be passed positionally is rejected.
159+regex="'PyObject_GetAttr' has non-positional parameter"
160+161+withself.assertRaisesRegex(ValueError, regex):
162+@wrap_dll_function(ctypes.pythonapi)
163+defPyObject_GetAttr(op: ctypes.py_object, attr: ctypes.py_object,
164+*args: ctypes.c_int) ->ctypes.py_object:
165+pass
166+167+withself.assertRaisesRegex(ValueError, regex):
168+@wrap_dll_function(ctypes.pythonapi)
169+defPyObject_GetAttr(op: ctypes.py_object, attr: ctypes.py_object,
170+**kwargs: ctypes.c_int) ->ctypes.py_object:
171+pass
172+173+withself.assertRaisesRegex(ValueError, regex):
174+@wrap_dll_function(ctypes.pythonapi)
175+defPyObject_GetAttr(op: ctypes.py_object, attr: ctypes.py_object,
176+*, kwonly: ctypes.c_int) ->ctypes.py_object:
177+pass
178+179+withself.assertRaisesRegex(ValueError, regex):
180+@wrap_dll_function(ctypes.pythonapi)
181+defPyObject_GetAttr(op: ctypes.py_object, attr: ctypes.py_object,
182+*, kwonly) ->ctypes.py_object:
183+pass
184+185+# Positional-only parameters have a positional counterpart, so they
186+# are accepted.
187+@wrap_dll_function(ctypes.pythonapi)
188+defPyObject_GetAttr(op: ctypes.py_object, attr: ctypes.py_object,
189+/) ->ctypes.py_object:
190+pass
191+192+classFoo:
193+a="abc"
194+195+self.assertEqual(PyObject_GetAttr(Foo, "a"), "abc")
196+156197deftest_wrap_dll_function_str_ann(self):
157198fromtest.test_ctypesimportwrap_str_ann
158199version=wrap_str_ann.Py_GetVersion()