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