Manual py3k backport: [svn r74155] Issue #6242: Fix deallocator of io.StringIO and...
[python.git] / Lib / ctypes / test / test_frombuffer.py
blob624fb70be76ab3fb0bcb01286686eacea6a98153
1 from ctypes import *
2 import array
3 import gc
4 import unittest
6 class X(Structure):
7 _fields_ = [("c_int", c_int)]
8 init_called = False
9 def __init__(self):
10 self._init_called = True
12 class Test(unittest.TestCase):
13 def test_fom_buffer(self):
14 a = array.array("i", range(16))
15 x = (c_int * 16).from_buffer(a)
17 y = X.from_buffer(a)
18 self.assertEqual(y.c_int, a[0])
19 self.assertFalse(y.init_called)
21 self.assertEqual(x[:], a.tolist())
23 a[0], a[-1] = 200, -200
24 self.assertEqual(x[:], a.tolist())
26 self.assertTrue(a in x._objects.values())
28 self.assertRaises(ValueError,
29 c_int.from_buffer, a, -1)
31 expected = x[:]
32 del a; gc.collect(); gc.collect(); gc.collect()
33 self.assertEqual(x[:], expected)
35 self.assertRaises(TypeError,
36 (c_char * 16).from_buffer, "a" * 16)
38 def test_fom_buffer_with_offset(self):
39 a = array.array("i", range(16))
40 x = (c_int * 15).from_buffer(a, sizeof(c_int))
42 self.assertEqual(x[:], a.tolist()[1:])
43 self.assertRaises(ValueError, lambda: (c_int * 16).from_buffer(a, sizeof(c_int)))
44 self.assertRaises(ValueError, lambda: (c_int * 1).from_buffer(a, 16 * sizeof(c_int)))
46 def test_from_buffer_copy(self):
47 a = array.array("i", range(16))
48 x = (c_int * 16).from_buffer_copy(a)
50 y = X.from_buffer_copy(a)
51 self.assertEqual(y.c_int, a[0])
52 self.assertFalse(y.init_called)
54 self.assertEqual(x[:], range(16))
56 a[0], a[-1] = 200, -200
57 self.assertEqual(x[:], range(16))
59 self.assertEqual(x._objects, None)
61 self.assertRaises(ValueError,
62 c_int.from_buffer, a, -1)
64 del a; gc.collect(); gc.collect(); gc.collect()
65 self.assertEqual(x[:], range(16))
67 x = (c_char * 16).from_buffer_copy("a" * 16)
68 self.assertEqual(x[:], "a" * 16)
70 def test_fom_buffer_copy_with_offset(self):
71 a = array.array("i", range(16))
72 x = (c_int * 15).from_buffer_copy(a, sizeof(c_int))
74 self.assertEqual(x[:], a.tolist()[1:])
75 self.assertRaises(ValueError,
76 (c_int * 16).from_buffer_copy, a, sizeof(c_int))
77 self.assertRaises(ValueError,
78 (c_int * 1).from_buffer_copy, a, 16 * sizeof(c_int))
80 if __name__ == '__main__':
81 unittest.main()