blob: 8c9122269447473a29fef4765c6c47bfdbda5019 [file] [log] [blame]
Thomas Heller13394e92008-02-13 20:40:44 +00001import unittest
2import pickle
3from ctypes import *
4import _ctypes_test
5dll = CDLL(_ctypes_test.__file__)
6
7class X(Structure):
8 _fields_ = [("a", c_int), ("b", c_double)]
9 init_called = 0
10 def __init__(self, *args, **kw):
11 X.init_called += 1
12 self.x = 42
13
14class Y(X):
15 _fields_ = [("str", c_char_p)]
16
17class PickleTest(unittest.TestCase):
18 def dumps(self, item):
19 return pickle.dumps(item)
20
21 def loads(self, item):
22 return pickle.loads(item)
23
24 def test_simple(self):
25 for src in [
26 c_int(42),
27 c_double(3.14),
28 ]:
29 dst = self.loads(self.dumps(src))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000030 self.assertEqual(src.__dict__, dst.__dict__)
31 self.assertEqual(memoryview(src).tobytes(),
Thomas Heller13394e92008-02-13 20:40:44 +000032 memoryview(dst).tobytes())
33
34 def test_struct(self):
35 X.init_called = 0
36
37 x = X()
38 x.a = 42
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000039 self.assertEqual(X.init_called, 1)
Thomas Heller13394e92008-02-13 20:40:44 +000040
41 y = self.loads(self.dumps(x))
42
43 # loads must NOT call __init__
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000044 self.assertEqual(X.init_called, 1)
Thomas Heller13394e92008-02-13 20:40:44 +000045
46 # ctypes instances are identical when the instance __dict__
47 # and the memory buffer are identical
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000048 self.assertEqual(y.__dict__, x.__dict__)
49 self.assertEqual(memoryview(y).tobytes(),
Thomas Heller13394e92008-02-13 20:40:44 +000050 memoryview(x).tobytes())
51
52 def test_unpickable(self):
53 # ctypes objects that are pointers or contain pointers are
54 # unpickable.
55 self.assertRaises(ValueError, lambda: self.dumps(Y()))
56
57 prototype = CFUNCTYPE(c_int)
58
59 for item in [
60 c_char_p(),
61 c_wchar_p(),
62 c_void_p(),
63 pointer(c_int(42)),
64 dll._testfunc_p_p,
65 prototype(lambda: 42),
66 ]:
67 self.assertRaises(ValueError, lambda: self.dumps(item))
68
Thomas Hellerc9baac82009-04-24 20:05:20 +000069 def test_wchar(self):
70 pickle.dumps(c_char(b"x"))
71 # Issue 5049
72 pickle.dumps(c_wchar("x"))
73
Thomas Heller13394e92008-02-13 20:40:44 +000074class PickleTest_1(PickleTest):
75 def dumps(self, item):
76 return pickle.dumps(item, 1)
77
78class PickleTest_2(PickleTest):
79 def dumps(self, item):
80 return pickle.dumps(item, 2)
81
82if __name__ == "__main__":
83 unittest.main()