blob: 9de3980ed44ea86422ddaa741a5b93deda75ee8c [file] [log] [blame]
Thomas Hellerbabddfc2006-03-08 19:56:54 +00001from ctypes import *
2import unittest, sys
Brett Cannon7a540732011-02-22 03:04:06 +00003from test import support
Thomas Wouters477c8d52006-05-27 19:21:47 +00004from ctypes.test import is_resource_enabled
Thomas Hellerbabddfc2006-03-08 19:56:54 +00005
6################################################################
7# This section should be moved into ctypes\__init__.py, when it's ready.
8
9from _ctypes import PyObj_FromPtr
10
11################################################################
12
13from sys import getrefcount as grc
Guido van Rossum360e4b82007-05-14 22:51:27 +000014if sys.version_info > (2, 4):
15 c_py_ssize_t = c_size_t
16else:
17 c_py_ssize_t = c_int
Thomas Hellerbabddfc2006-03-08 19:56:54 +000018
19class PythonAPITestCase(unittest.TestCase):
20
Benjamin Peterson39e360b2008-05-26 14:39:04 +000021 def test_PyBytes_FromStringAndSize(self):
22 PyBytes_FromStringAndSize = pythonapi.PyBytes_FromStringAndSize
Thomas Hellerbabddfc2006-03-08 19:56:54 +000023
Benjamin Peterson39e360b2008-05-26 14:39:04 +000024 PyBytes_FromStringAndSize.restype = py_object
25 PyBytes_FromStringAndSize.argtypes = c_char_p, c_py_ssize_t
Thomas Hellerbabddfc2006-03-08 19:56:54 +000026
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000027 self.assertEqual(PyBytes_FromStringAndSize(b"abcdefghi", 3), b"abc")
Thomas Hellerbabddfc2006-03-08 19:56:54 +000028
Brett Cannon7a540732011-02-22 03:04:06 +000029 @support.refcount_test
Thomas Hellerbabddfc2006-03-08 19:56:54 +000030 def test_PyString_FromString(self):
Benjamin Peterson39e360b2008-05-26 14:39:04 +000031 pythonapi.PyBytes_FromString.restype = py_object
32 pythonapi.PyBytes_FromString.argtypes = (c_char_p,)
Thomas Hellerbabddfc2006-03-08 19:56:54 +000033
Guido van Rossum97f9d4f2007-10-24 18:41:19 +000034 s = b"abc"
Thomas Hellerbabddfc2006-03-08 19:56:54 +000035 refcnt = grc(s)
Benjamin Peterson39e360b2008-05-26 14:39:04 +000036 pyob = pythonapi.PyBytes_FromString(s)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000037 self.assertEqual(grc(s), refcnt)
38 self.assertEqual(s, pyob)
Thomas Hellerbabddfc2006-03-08 19:56:54 +000039 del pyob
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000040 self.assertEqual(grc(s), refcnt)
Thomas Hellerbabddfc2006-03-08 19:56:54 +000041
Thomas Wouters477c8d52006-05-27 19:21:47 +000042 if is_resource_enabled("refcount"):
43 # This test is unreliable, because it is possible that code in
44 # unittest changes the refcount of the '42' integer. So, it
45 # is disabled by default.
Thomas Hellerf5af4662007-07-11 14:51:58 +000046 def test_PyLong_Long(self):
Thomas Wouters477c8d52006-05-27 19:21:47 +000047 ref42 = grc(42)
Thomas Hellerf5af4662007-07-11 14:51:58 +000048 pythonapi.PyLong_FromLong.restype = py_object
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000049 self.assertEqual(pythonapi.PyLong_FromLong(42), 42)
Thomas Hellerbabddfc2006-03-08 19:56:54 +000050
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000051 self.assertEqual(grc(42), ref42)
Thomas Hellerbabddfc2006-03-08 19:56:54 +000052
Thomas Hellerf5af4662007-07-11 14:51:58 +000053 pythonapi.PyLong_AsLong.argtypes = (py_object,)
54 pythonapi.PyLong_AsLong.restype = c_long
Thomas Hellerbabddfc2006-03-08 19:56:54 +000055
Thomas Hellerf5af4662007-07-11 14:51:58 +000056 res = pythonapi.PyLong_AsLong(42)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000057 self.assertEqual(grc(res), ref42 + 1)
Thomas Wouters477c8d52006-05-27 19:21:47 +000058 del res
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000059 self.assertEqual(grc(42), ref42)
Thomas Hellerbabddfc2006-03-08 19:56:54 +000060
Brett Cannon7a540732011-02-22 03:04:06 +000061 @support.refcount_test
Thomas Hellerbabddfc2006-03-08 19:56:54 +000062 def test_PyObj_FromPtr(self):
63 s = "abc def ghi jkl"
64 ref = grc(s)
65 # id(python-object) is the address
66 pyobj = PyObj_FromPtr(id(s))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000067 self.assertTrue(s is pyobj)
Thomas Hellerbabddfc2006-03-08 19:56:54 +000068
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000069 self.assertEqual(grc(s), ref + 1)
Thomas Hellerbabddfc2006-03-08 19:56:54 +000070 del pyobj
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000071 self.assertEqual(grc(s), ref)
Thomas Hellerbabddfc2006-03-08 19:56:54 +000072
Thomas Heller745f5e22007-07-12 20:10:18 +000073 def test_PyOS_snprintf(self):
74 PyOS_snprintf = pythonapi.PyOS_snprintf
75 PyOS_snprintf.argtypes = POINTER(c_char), c_size_t, c_char_p
Thomas Hellerbabddfc2006-03-08 19:56:54 +000076
Thomas Heller745f5e22007-07-12 20:10:18 +000077 buf = c_buffer(256)
Victor Stinner42746df2010-07-27 23:36:41 +000078 PyOS_snprintf(buf, sizeof(buf), b"Hello from %s", b"ctypes")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000079 self.assertEqual(buf.value, b"Hello from ctypes")
Thomas Hellerbabddfc2006-03-08 19:56:54 +000080
Victor Stinner42746df2010-07-27 23:36:41 +000081 PyOS_snprintf(buf, sizeof(buf), b"Hello from %s (%d, %d, %d)", b"ctypes", 1, 2, 3)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000082 self.assertEqual(buf.value, b"Hello from ctypes (1, 2, 3)")
Thomas Hellerbabddfc2006-03-08 19:56:54 +000083
Thomas Heller745f5e22007-07-12 20:10:18 +000084 # not enough arguments
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000085 self.assertRaises(TypeError, PyOS_snprintf, buf)
Thomas Hellerbabddfc2006-03-08 19:56:54 +000086
Thomas Wouters00ee7ba2006-08-21 19:07:27 +000087 def test_pyobject_repr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000088 self.assertEqual(repr(py_object()), "py_object(<NULL>)")
89 self.assertEqual(repr(py_object(42)), "py_object(42)")
90 self.assertEqual(repr(py_object(object)), "py_object(%r)" % object)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +000091
Thomas Hellerbabddfc2006-03-08 19:56:54 +000092if __name__ == "__main__":
93 unittest.main()