1from CoreFoundation import *
2from PyObjCTools.TestSupport import *
3
4try:
5    long
6except NameError:
7    long = int
8
9
10import sys
11if sys.version_info[0] == 3:
12    def cmp(a, b):
13        try:
14            if a < b:
15                return -1
16            elif b < a:
17                return 1
18            return 0
19
20        except TypeError:
21            return cmp(type(a).__name__, type(b).__name__)
22
23class TestCFTree (TestCase):
24    def testTypes(self):
25        self.assertIsCFType(CFTreeRef)
26
27    def testCreation(self):
28        context = object()
29        tree = CFTreeCreate(None, context)
30
31        self.assertIsInstance(tree, CFTreeRef)
32
33        self.assertTrue(CFTreeGetContext(tree, None) is context)
34        CFTreeSetContext(tree, 42)
35        self.assertEqual(CFTreeGetContext(tree, None), 42)
36
37    def testCreateTree(self):
38        root = CFTreeCreate(None, "root")
39
40        for child in range(10):
41            CFTreeAppendChild(root, CFTreeCreate(None, child))
42
43        self.assertEqual(CFTreeGetContext(CFTreeGetFirstChild(root), None), 0)
44
45        def compare(l, r, context):
46            return -cmp(CFTreeGetContext(l, None), CFTreeGetContext(r, None))
47
48        CFTreeSortChildren(root, compare, None)
49        self.assertEqual(CFTreeGetContext(CFTreeGetFirstChild(root), None), 9)
50
51    def testTypeID(self):
52        v = CFTreeGetTypeID()
53        self.assertIsInstance(v, (int, long))
54
55    def testQuerying(self):
56        root = CFTreeCreate(None, "root")
57
58        for child in range(2):
59            CFTreeAppendChild(root, CFTreeCreate(None, child))
60
61        p = CFTreeGetParent(root)
62        self.assertIs(p, None)
63        c = CFTreeGetFirstChild(root)
64        self.assertIsInstance(c, CFTreeRef)
65        c2 = CFTreeGetChildAtIndex(root, 0)
66        self.assertIs(c, c2)
67        p = CFTreeGetParent(c)
68        self.assertIs(p, root)
69        s = CFTreeGetNextSibling(c)
70        self.assertIsInstance(s, CFTreeRef)
71        p = CFTreeGetParent(s)
72        self.assertIs(p, root)
73        s2 = CFTreeGetChildAtIndex(root, 1)
74        self.assertIs(s, s2)
75        s = CFTreeGetNextSibling(s)
76        self.assertIs(s, None)
77        cnt = CFTreeGetChildCount(root)
78        self.assertEqual(cnt, 2)
79
80        cnt = CFTreeGetChildCount(c)
81        self.assertEqual(cnt, 0)
82
83        children = CFTreeGetChildren(root, None)
84        self.assertIsInstance(children, (list, tuple))
85        self.assertEqual(len(children), 2)
86
87        r = CFTreeFindRoot(s2)
88        self.assertIs(r, root)
89
90    def testModification(self):
91        root = CFTreeCreate(None, "root")
92
93        for child in range(2):
94            CFTreeAppendChild(root, CFTreeCreate(None, child))
95
96        def applyFunc(node, context):
97            context.append(CFTreeGetContext(node, None))
98
99        l = []
100        CFTreeApplyFunctionToChildren(root, applyFunc, l)
101        self.assertEqual(len(l), 2)
102
103        preChild = CFTreeCreate(None, "before")
104        postChild = CFTreeCreate(None, "after")
105        CFTreePrependChild(root, preChild)
106        CFTreeAppendChild(root, postChild)
107
108        self.assertEqual(CFTreeGetChildCount(root), 4)
109        n = CFTreeGetChildAtIndex(root, 0)
110        self.assertIs(n, preChild)
111        n = CFTreeGetChildAtIndex(root, 3)
112        self.assertIs(n, postChild)
113        s = CFTreeCreate(None, "sibling")
114        CFTreeInsertSibling(preChild, s)
115        n = CFTreeGetChildAtIndex(root, 1)
116        self.assertIs(n, s)
117        self.assertEqual(CFTreeGetChildCount(root), 5)
118
119        CFTreeRemove(s)
120        self.assertEqual(CFTreeGetChildCount(root), 4)
121
122        def compare(left, right, context):
123            left = CFTreeGetContext(left, None)
124            right = CFTreeGetContext(right, None)
125            return -cmp(left, right)
126
127        before = []
128        after = []
129        CFTreeApplyFunctionToChildren(root, applyFunc, before)
130        CFTreeSortChildren(root, compare, None)
131        CFTreeApplyFunctionToChildren(root, applyFunc, after)
132
133        self.assertItemsEqual(before, after)
134
135        CFTreeRemoveAllChildren(root)
136        self.assertEqual(CFTreeGetChildCount(root), 0)
137
138
139
140
141
142
143
144
145if __name__ == "__main__":
146    main()
147