Thomas Heller | babddfc | 2006-03-08 19:56:54 +0000 | [diff] [blame] | 1 | from ctypes import * |
| 2 | import unittest, sys |
Brett Cannon | 7a54073 | 2011-02-22 03:04:06 +0000 | [diff] [blame] | 3 | from test import support |
Thomas Wouters | 477c8d5 | 2006-05-27 19:21:47 +0000 | [diff] [blame] | 4 | from ctypes.test import is_resource_enabled |
Thomas Heller | babddfc | 2006-03-08 19:56:54 +0000 | [diff] [blame] | 5 | |
| 6 | ################################################################ |
| 7 | # This section should be moved into ctypes\__init__.py, when it's ready. |
| 8 | |
| 9 | from _ctypes import PyObj_FromPtr |
| 10 | |
| 11 | ################################################################ |
| 12 | |
| 13 | from sys import getrefcount as grc |
Guido van Rossum | 360e4b8 | 2007-05-14 22:51:27 +0000 | [diff] [blame] | 14 | if sys.version_info > (2, 4): |
| 15 | c_py_ssize_t = c_size_t |
| 16 | else: |
| 17 | c_py_ssize_t = c_int |
Thomas Heller | babddfc | 2006-03-08 19:56:54 +0000 | [diff] [blame] | 18 | |
| 19 | class PythonAPITestCase(unittest.TestCase): |
| 20 | |
Benjamin Peterson | 39e360b | 2008-05-26 14:39:04 +0000 | [diff] [blame] | 21 | def test_PyBytes_FromStringAndSize(self): |
| 22 | PyBytes_FromStringAndSize = pythonapi.PyBytes_FromStringAndSize |
Thomas Heller | babddfc | 2006-03-08 19:56:54 +0000 | [diff] [blame] | 23 | |
Benjamin Peterson | 39e360b | 2008-05-26 14:39:04 +0000 | [diff] [blame] | 24 | PyBytes_FromStringAndSize.restype = py_object |
| 25 | PyBytes_FromStringAndSize.argtypes = c_char_p, c_py_ssize_t |
Thomas Heller | babddfc | 2006-03-08 19:56:54 +0000 | [diff] [blame] | 26 | |
Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 27 | self.assertEqual(PyBytes_FromStringAndSize(b"abcdefghi", 3), b"abc") |
Thomas Heller | babddfc | 2006-03-08 19:56:54 +0000 | [diff] [blame] | 28 | |
Brett Cannon | 7a54073 | 2011-02-22 03:04:06 +0000 | [diff] [blame] | 29 | @support.refcount_test |
Thomas Heller | babddfc | 2006-03-08 19:56:54 +0000 | [diff] [blame] | 30 | def test_PyString_FromString(self): |
Benjamin Peterson | 39e360b | 2008-05-26 14:39:04 +0000 | [diff] [blame] | 31 | pythonapi.PyBytes_FromString.restype = py_object |
| 32 | pythonapi.PyBytes_FromString.argtypes = (c_char_p,) |
Thomas Heller | babddfc | 2006-03-08 19:56:54 +0000 | [diff] [blame] | 33 | |
Guido van Rossum | 97f9d4f | 2007-10-24 18:41:19 +0000 | [diff] [blame] | 34 | s = b"abc" |
Thomas Heller | babddfc | 2006-03-08 19:56:54 +0000 | [diff] [blame] | 35 | refcnt = grc(s) |
Benjamin Peterson | 39e360b | 2008-05-26 14:39:04 +0000 | [diff] [blame] | 36 | pyob = pythonapi.PyBytes_FromString(s) |
Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 37 | self.assertEqual(grc(s), refcnt) |
| 38 | self.assertEqual(s, pyob) |
Thomas Heller | babddfc | 2006-03-08 19:56:54 +0000 | [diff] [blame] | 39 | del pyob |
Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 40 | self.assertEqual(grc(s), refcnt) |
Thomas Heller | babddfc | 2006-03-08 19:56:54 +0000 | [diff] [blame] | 41 | |
Thomas Wouters | 477c8d5 | 2006-05-27 19:21:47 +0000 | [diff] [blame] | 42 | 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 Heller | f5af466 | 2007-07-11 14:51:58 +0000 | [diff] [blame] | 46 | def test_PyLong_Long(self): |
Thomas Wouters | 477c8d5 | 2006-05-27 19:21:47 +0000 | [diff] [blame] | 47 | ref42 = grc(42) |
Thomas Heller | f5af466 | 2007-07-11 14:51:58 +0000 | [diff] [blame] | 48 | pythonapi.PyLong_FromLong.restype = py_object |
Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 49 | self.assertEqual(pythonapi.PyLong_FromLong(42), 42) |
Thomas Heller | babddfc | 2006-03-08 19:56:54 +0000 | [diff] [blame] | 50 | |
Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 51 | self.assertEqual(grc(42), ref42) |
Thomas Heller | babddfc | 2006-03-08 19:56:54 +0000 | [diff] [blame] | 52 | |
Thomas Heller | f5af466 | 2007-07-11 14:51:58 +0000 | [diff] [blame] | 53 | pythonapi.PyLong_AsLong.argtypes = (py_object,) |
| 54 | pythonapi.PyLong_AsLong.restype = c_long |
Thomas Heller | babddfc | 2006-03-08 19:56:54 +0000 | [diff] [blame] | 55 | |
Thomas Heller | f5af466 | 2007-07-11 14:51:58 +0000 | [diff] [blame] | 56 | res = pythonapi.PyLong_AsLong(42) |
Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 57 | self.assertEqual(grc(res), ref42 + 1) |
Thomas Wouters | 477c8d5 | 2006-05-27 19:21:47 +0000 | [diff] [blame] | 58 | del res |
Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 59 | self.assertEqual(grc(42), ref42) |
Thomas Heller | babddfc | 2006-03-08 19:56:54 +0000 | [diff] [blame] | 60 | |
Brett Cannon | 7a54073 | 2011-02-22 03:04:06 +0000 | [diff] [blame] | 61 | @support.refcount_test |
Thomas Heller | babddfc | 2006-03-08 19:56:54 +0000 | [diff] [blame] | 62 | 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 Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 67 | self.assertTrue(s is pyobj) |
Thomas Heller | babddfc | 2006-03-08 19:56:54 +0000 | [diff] [blame] | 68 | |
Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 69 | self.assertEqual(grc(s), ref + 1) |
Thomas Heller | babddfc | 2006-03-08 19:56:54 +0000 | [diff] [blame] | 70 | del pyobj |
Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 71 | self.assertEqual(grc(s), ref) |
Thomas Heller | babddfc | 2006-03-08 19:56:54 +0000 | [diff] [blame] | 72 | |
Thomas Heller | 745f5e2 | 2007-07-12 20:10:18 +0000 | [diff] [blame] | 73 | 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 Heller | babddfc | 2006-03-08 19:56:54 +0000 | [diff] [blame] | 76 | |
Thomas Heller | 745f5e2 | 2007-07-12 20:10:18 +0000 | [diff] [blame] | 77 | buf = c_buffer(256) |
Victor Stinner | 42746df | 2010-07-27 23:36:41 +0000 | [diff] [blame] | 78 | PyOS_snprintf(buf, sizeof(buf), b"Hello from %s", b"ctypes") |
Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 79 | self.assertEqual(buf.value, b"Hello from ctypes") |
Thomas Heller | babddfc | 2006-03-08 19:56:54 +0000 | [diff] [blame] | 80 | |
Victor Stinner | 42746df | 2010-07-27 23:36:41 +0000 | [diff] [blame] | 81 | PyOS_snprintf(buf, sizeof(buf), b"Hello from %s (%d, %d, %d)", b"ctypes", 1, 2, 3) |
Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 82 | self.assertEqual(buf.value, b"Hello from ctypes (1, 2, 3)") |
Thomas Heller | babddfc | 2006-03-08 19:56:54 +0000 | [diff] [blame] | 83 | |
Thomas Heller | 745f5e2 | 2007-07-12 20:10:18 +0000 | [diff] [blame] | 84 | # not enough arguments |
Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 85 | self.assertRaises(TypeError, PyOS_snprintf, buf) |
Thomas Heller | babddfc | 2006-03-08 19:56:54 +0000 | [diff] [blame] | 86 | |
Thomas Wouters | 00ee7ba | 2006-08-21 19:07:27 +0000 | [diff] [blame] | 87 | def test_pyobject_repr(self): |
Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 88 | 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 Wouters | 00ee7ba | 2006-08-21 19:07:27 +0000 | [diff] [blame] | 91 | |
Thomas Heller | babddfc | 2006-03-08 19:56:54 +0000 | [diff] [blame] | 92 | if __name__ == "__main__": |
| 93 | unittest.main() |