ยปCore Development>Code coverage>Lib/ctypes/test/test_returnfuncptrs.py

Python code coverage for Lib/ctypes/test/test_returnfuncptrs.py

#countcontent
1n/aimport unittest
2n/afrom ctypes import *
3n/a
4n/aimport _ctypes_test
5n/a
6n/aclass ReturnFuncPtrTestCase(unittest.TestCase):
7n/a
8n/a def test_with_prototype(self):
9n/a # The _ctypes_test shared lib/dll exports quite some functions for testing.
10n/a # The get_strchr function returns a *pointer* to the C strchr function.
11n/a dll = CDLL(_ctypes_test.__file__)
12n/a get_strchr = dll.get_strchr
13n/a get_strchr.restype = CFUNCTYPE(c_char_p, c_char_p, c_char)
14n/a strchr = get_strchr()
15n/a self.assertEqual(strchr(b"abcdef", b"b"), b"bcdef")
16n/a self.assertEqual(strchr(b"abcdef", b"x"), None)
17n/a self.assertEqual(strchr(b"abcdef", 98), b"bcdef")
18n/a self.assertEqual(strchr(b"abcdef", 107), None)
19n/a self.assertRaises(ArgumentError, strchr, b"abcdef", 3.0)
20n/a self.assertRaises(TypeError, strchr, b"abcdef")
21n/a
22n/a def test_without_prototype(self):
23n/a dll = CDLL(_ctypes_test.__file__)
24n/a get_strchr = dll.get_strchr
25n/a # the default 'c_int' would not work on systems where sizeof(int) != sizeof(void *)
26n/a get_strchr.restype = c_void_p
27n/a addr = get_strchr()
28n/a # _CFuncPtr instances are now callable with an integer argument
29n/a # which denotes a function address:
30n/a strchr = CFUNCTYPE(c_char_p, c_char_p, c_char)(addr)
31n/a self.assertTrue(strchr(b"abcdef", b"b"), "bcdef")
32n/a self.assertEqual(strchr(b"abcdef", b"x"), None)
33n/a self.assertRaises(ArgumentError, strchr, b"abcdef", 3.0)
34n/a self.assertRaises(TypeError, strchr, b"abcdef")
35n/a
36n/a def test_from_dll(self):
37n/a dll = CDLL(_ctypes_test.__file__)
38n/a # _CFuncPtr instances are now callable with a tuple argument
39n/a # which denotes a function name and a dll:
40n/a strchr = CFUNCTYPE(c_char_p, c_char_p, c_char)(("my_strchr", dll))
41n/a self.assertTrue(strchr(b"abcdef", b"b"), "bcdef")
42n/a self.assertEqual(strchr(b"abcdef", b"x"), None)
43n/a self.assertRaises(ArgumentError, strchr, b"abcdef", 3.0)
44n/a self.assertRaises(TypeError, strchr, b"abcdef")
45n/a
46n/a # Issue 6083: Reference counting bug
47n/a def test_from_dll_refcount(self):
48n/a class BadSequence(tuple):
49n/a def __getitem__(self, key):
50n/a if key == 0:
51n/a return "my_strchr"
52n/a if key == 1:
53n/a return CDLL(_ctypes_test.__file__)
54n/a raise IndexError
55n/a
56n/a # _CFuncPtr instances are now callable with a tuple argument
57n/a # which denotes a function name and a dll:
58n/a strchr = CFUNCTYPE(c_char_p, c_char_p, c_char)(
59n/a BadSequence(("my_strchr", CDLL(_ctypes_test.__file__))))
60n/a self.assertTrue(strchr(b"abcdef", b"b"), "bcdef")
61n/a self.assertEqual(strchr(b"abcdef", b"x"), None)
62n/a self.assertRaises(ArgumentError, strchr, b"abcdef", 3.0)
63n/a self.assertRaises(TypeError, strchr, b"abcdef")
64n/a
65n/aif __name__ == "__main__":
66n/a unittest.main()