1import unittest
2from ctypes import *
3
4################################################################
5#
6# The incomplete pointer example from the tutorial
7#
8
9class MyTestCase(unittest.TestCase):
10
11    def test_incomplete_example(self):
12        lpcell = POINTER("cell")
13        class cell(Structure):
14            _fields_ = [("name", c_char_p),
15                        ("next", lpcell)]
16
17        SetPointerType(lpcell, cell)
18
19        c1 = cell()
20        c1.name = "foo"
21        c2 = cell()
22        c2.name = "bar"
23
24        c1.next = pointer(c2)
25        c2.next = pointer(c1)
26
27        p = c1
28
29        result = []
30        for i in range(8):
31            result.append(p.name)
32            p = p.next[0]
33        self.assertEqual(result, ["foo", "bar"] * 4)
34
35        # to not leak references, we must clean _pointer_type_cache
36        from ctypes import _pointer_type_cache
37        del _pointer_type_cache[cell]
38
39################################################################
40
41if __name__ == '__main__':
42    unittest.main()
43