You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
2.8 KiB
90 lines
2.8 KiB
5 years ago
|
from ctypes import *
|
||
|
import unittest, sys
|
||
|
from test import support
|
||
|
|
||
|
################################################################
|
||
|
# This section should be moved into ctypes\__init__.py, when it's ready.
|
||
|
|
||
|
from _ctypes import PyObj_FromPtr
|
||
|
|
||
|
################################################################
|
||
|
|
||
|
from sys import getrefcount as grc
|
||
|
if sys.version_info > (2, 4):
|
||
|
c_py_ssize_t = c_size_t
|
||
|
else:
|
||
|
c_py_ssize_t = c_int
|
||
|
|
||
|
class PythonAPITestCase(unittest.TestCase):
|
||
|
|
||
|
def test_PyBytes_FromStringAndSize(self):
|
||
|
PyBytes_FromStringAndSize = pythonapi.PyBytes_FromStringAndSize
|
||
|
|
||
|
PyBytes_FromStringAndSize.restype = py_object
|
||
|
PyBytes_FromStringAndSize.argtypes = c_char_p, c_py_ssize_t
|
||
|
|
||
|
self.assertEqual(PyBytes_FromStringAndSize(b"abcdefghi", 3), b"abc")
|
||
|
|
||
|
@support.refcount_test
|
||
|
def test_PyString_FromString(self):
|
||
|
pythonapi.PyBytes_FromString.restype = py_object
|
||
|
pythonapi.PyBytes_FromString.argtypes = (c_char_p,)
|
||
|
|
||
|
s = b"abc"
|
||
|
refcnt = grc(s)
|
||
|
pyob = pythonapi.PyBytes_FromString(s)
|
||
|
self.assertEqual(grc(s), refcnt)
|
||
|
self.assertEqual(s, pyob)
|
||
|
del pyob
|
||
|
self.assertEqual(grc(s), refcnt)
|
||
|
|
||
|
@support.refcount_test
|
||
|
def test_PyLong_Long(self):
|
||
|
ref42 = grc(42)
|
||
|
pythonapi.PyLong_FromLong.restype = py_object
|
||
|
self.assertEqual(pythonapi.PyLong_FromLong(42), 42)
|
||
|
|
||
|
self.assertEqual(grc(42), ref42)
|
||
|
|
||
|
pythonapi.PyLong_AsLong.argtypes = (py_object,)
|
||
|
pythonapi.PyLong_AsLong.restype = c_long
|
||
|
|
||
|
res = pythonapi.PyLong_AsLong(42)
|
||
|
self.assertEqual(grc(res), ref42 + 1)
|
||
|
del res
|
||
|
self.assertEqual(grc(42), ref42)
|
||
|
|
||
|
@support.refcount_test
|
||
|
def test_PyObj_FromPtr(self):
|
||
|
s = "abc def ghi jkl"
|
||
|
ref = grc(s)
|
||
|
# id(python-object) is the address
|
||
|
pyobj = PyObj_FromPtr(id(s))
|
||
|
self.assertIs(s, pyobj)
|
||
|
|
||
|
self.assertEqual(grc(s), ref + 1)
|
||
|
del pyobj
|
||
|
self.assertEqual(grc(s), ref)
|
||
|
|
||
|
def test_PyOS_snprintf(self):
|
||
|
PyOS_snprintf = pythonapi.PyOS_snprintf
|
||
|
PyOS_snprintf.argtypes = POINTER(c_char), c_size_t, c_char_p
|
||
|
|
||
|
buf = c_buffer(256)
|
||
|
PyOS_snprintf(buf, sizeof(buf), b"Hello from %s", b"ctypes")
|
||
|
self.assertEqual(buf.value, b"Hello from ctypes")
|
||
|
|
||
|
PyOS_snprintf(buf, sizeof(buf), b"Hello from %s (%d, %d, %d)", b"ctypes", 1, 2, 3)
|
||
|
self.assertEqual(buf.value, b"Hello from ctypes (1, 2, 3)")
|
||
|
|
||
|
# not enough arguments
|
||
|
self.assertRaises(TypeError, PyOS_snprintf, buf)
|
||
|
|
||
|
def test_pyobject_repr(self):
|
||
|
self.assertEqual(repr(py_object()), "py_object(<NULL>)")
|
||
|
self.assertEqual(repr(py_object(42)), "py_object(42)")
|
||
|
self.assertEqual(repr(py_object(object)), "py_object(%r)" % object)
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
unittest.main()
|