1from PyObjCTools.TestSupport import *
2from CoreFoundation import *
3from Foundation import NSArray, NSMutableArray
4
5class TestCFArray (TestCase):
6    def testCFArrayIsNSArray(self):
7        self.assert_(issubclass(CFArrayRef, NSArray))
8        self.assert_(issubclass(CFMutableArrayRef, NSMutableArray))
9
10    def testCFArrayCreate(self):
11        array = CFArrayCreate(None, [1,2,3,4], 4, kCFTypeArrayCallBacks)
12        self.assertEquals(array, [1,2,3,4])
13        self.assert_(isinstance(array, CFArrayRef))
14
15        array = CFArrayCreateMutable(None, 0, kCFTypeArrayCallBacks)
16        CFArrayAppendValue(array, 42)
17        CFArrayAppendValue(array, 43)
18        CFArrayAppendValue(array, 44)
19        self.assertEquals(array, [42, 43, 44])
20        self.assert_(isinstance(array, CFMutableArrayRef))
21
22    def testCFArrayApplyFunction(self):
23        array = CFArrayCreate(None, [1,2,3,4], 4, kCFTypeArrayCallBacks)
24
25        self.failUnlessArgIsFunction(CFArrayApplyFunction, 2, 'v@@', False)
26        self.failUnlessArgHasType(CFArrayApplyFunction, 3, '@')
27
28        items = []
29        infos = []
30
31        def applier(item, info):
32            items.append(item * item)
33            infos.append(info)
34
35        CFArrayApplyFunction(array, (0, 4), applier, 42)
36        self.assertEquals(items, [1,4,9,16])
37        self.assertEquals(infos, [42,42,42,42])
38
39        items = []
40        infos = []
41        CFArrayApplyFunction(array, (1, 2), applier, 42)
42        self.assertEquals(items, [4,9])
43        self.assertEquals(infos, [42,42])
44
45    def testBSearchValues(self):
46        # This method causes a hard crash, reason unclear.
47        array = CFArrayCreate(None, range(20), 20, kCFTypeArrayCallBacks)
48
49        self.failUnlessArgHasType(CFArrayBSearchValues, 2, '@')
50        self.failUnlessArgIsFunction(CFArrayBSearchValues, 3, 'l@@@', False)
51        self.failUnlessArgHasType(CFArrayBSearchValues, 4, '@')
52
53        def compare(l, r, context):
54            return cmp(l, r)
55
56        r = CFArrayBSearchValues(array, (0, 20), 10, compare, None)
57        self.assertEquals(r, 10)
58
59        r = CFArrayBSearchValues(array, (0, 20), 9.5, compare, None)
60        self.assertEquals(r, 10)
61
62        r = CFArrayBSearchValues(array, (0, 20), 99, compare, None)
63        self.assert_(r >= 20)
64
65        r = CFArrayBSearchValues(array, (0, 20), -1, compare, None)
66        self.assertEquals(r, 0)
67
68    def testSortValues(self):
69        array = NSMutableArray.arrayWithArray_([4,2,1,3,0,5])
70
71        self.failUnlessArgIsFunction(CFArraySortValues, 2, 'l@@@', False)
72        self.failUnlessArgHasType(CFArraySortValues, 3, '@')
73
74        def compare(l, r, context):
75            return cmp(l, r)
76        CFArraySortValues(array, (0, 6), compare, None)
77
78        self.assertEquals(array, [0, 1, 2, 3, 4, 5])
79
80    def testTypeID(self):
81        v = CFArrayGetTypeID()
82        self.failUnless( isinstance(v, (int, long)) )
83
84    def testCopy(self):
85        array = CFArrayCreate(None, [1,2,3,4], 4, kCFTypeArrayCallBacks)
86        self.assertEquals(array, [1,2,3,4])
87        self.assert_(isinstance(array, CFArrayRef))
88
89        cpy = CFArrayCreateCopy(None, array)
90        self.assertEquals(cpy, [1,2,3,4])
91        self.assert_(isinstance(cpy, CFArrayRef))
92
93        cpy = CFArrayCreateMutableCopy(None, 0, array)
94        self.assertEquals(cpy, [1,2,3,4])
95        self.assert_(isinstance(cpy, CFMutableArrayRef))
96        self.failIf( cpy is array )
97
98
99    def testCounts(self):
100        array = CFArrayCreate(None, [1,2,3,4,4,2], 6, kCFTypeArrayCallBacks)
101        self.assertEquals(array, [1,2,3,4,4,2])
102        self.assert_(isinstance(array, CFArrayRef))
103
104        self.failUnless(  CFArrayGetCount(array) == 6 )
105        self.failUnless(  CFArrayGetCountOfValue(array, (0,6), 4) == 2 )
106        self.failUnless(  CFArrayGetCountOfValue(array, (0,6), 2) == 2 )
107        self.failUnless(  CFArrayGetCountOfValue(array, (0,6), 3) == 1 )
108
109    def testContains(self):
110        array = CFArrayCreate(None, [u"a",2,3,4,4,2], 6, kCFTypeArrayCallBacks)
111        self.assertEquals(array, [u"a",2,3,4,4,2])
112        self.assert_(isinstance(array, CFArrayRef))
113
114        self.failIf( CFArrayContainsValue(array, (0, 6), u"hello") )
115        self.failUnless( CFArrayContainsValue(array, (0, 6), 4) )
116        self.failIf( CFArrayContainsValue(array, (0, 2), 4) )
117
118        self.failUnless( CFArrayGetFirstIndexOfValue(array, (0, 6), 3) == 2 )
119        self.failUnless( CFArrayGetFirstIndexOfValue(array, (0, 6), 2) == 1 )
120        self.failUnless( CFArrayGetFirstIndexOfValue(array, (0, 6), u"hello") == kCFNotFound )
121
122        self.failUnless( CFArrayGetLastIndexOfValue(array, (0, 6), 3) == 2 )
123        self.failUnless( CFArrayGetLastIndexOfValue(array, (0, 6), 2) == 5 )
124        self.failUnless( CFArrayGetLastIndexOfValue(array, (0, 6), u"hello") == kCFNotFound )
125
126        self.failUnlessArgHasType(CFArrayGetFirstIndexOfValue, 2, '@')
127        self.failUnlessArgHasType(CFArrayGetLastIndexOfValue, 2, '@')
128
129
130    def testGetting(self):
131        array = CFArrayCreate(None, [u"a",2,3,4,4,2], 6, kCFTypeArrayCallBacks)
132        self.assertEquals(array, [u"a",2,3,4,4,2])
133        self.assert_(isinstance(array, CFArrayRef))
134
135        self.failUnless(   CFArrayGetValueAtIndex(array, 0) == u"a"  )
136        self.failUnless(   CFArrayGetValueAtIndex(array, 1) == 2  )
137
138
139        self.failUnlessArgHasType(CFArrayGetValues, 2, 'o^@')
140        self.failUnlessArgSizeInArg(CFArrayGetValues, 2, 1)
141
142        vals = CFArrayGetValues(array, (0, 3), None)
143        self.failUnless( isinstance(vals, tuple) )
144        self.failUnless( vals == (u"a", 2, 3) )
145
146
147    def testUpdating(self):
148        array = CFArrayCreate(None, [u"a",2,3,4,4,2], 6, kCFTypeArrayCallBacks)
149        self.assertEquals(array, [u"a",2,3,4,4,2])
150        self.assert_(isinstance(array, CFArrayRef))
151        array = CFArrayCreateMutableCopy(None, 0, array)
152
153
154        self.failUnlessArgHasType(CFArrayAppendValue, 1, '@')
155        self.failUnlessArgHasType(CFArrayInsertValueAtIndex, 2, '@')
156        self.failUnlessArgHasType(CFArraySetValueAtIndex, 2, '@')
157
158        CFArrayAppendValue(array, u"foo")
159        self.assertEquals(array, [u"a",2,3,4,4,2,u"foo"])
160
161        CFArrayInsertValueAtIndex(array, 1, 4)
162        self.assertEquals(array, [u"a",4, 2,3,4,4,2,u"foo"])
163
164        CFArrayRemoveValueAtIndex(array, 2)
165        self.assertEquals(array, [u"a",4, 3,4,4,2,u"foo"])
166
167        CFArraySetValueAtIndex(array, 2, u"two")
168        self.assertEquals(array, [u"a",4, u"two",4,4,2,u"foo"])
169
170
171        CFArrayExchangeValuesAtIndices(array, 1,2)
172        self.assertEquals(array, [u"a",u"two",4,4,4,2,u"foo"])
173
174        self.failUnlessArgHasType(CFArrayReplaceValues, 2, 'n^@')
175        self.failUnlessArgSizeInArg(CFArrayReplaceValues, 2, 3)
176        CFArrayReplaceValues(array, (2,3), (u'a', u'b', u'c', u'd', u'e', u'f'), 6)
177        self.assertEquals(array, [u"a",u"two",u'a', u'b', u'c', u'd', u'e', u'f', 2, u'foo'])
178
179        array2 = CFArrayCreate(None, [u'hello', u'earth'], 2, kCFTypeArrayCallBacks)
180        CFArrayAppendArray(array, array2, (0,2))
181        self.assertEquals(array, [u"a",u"two",u'a', u'b', u'c', u'd', u'e', u'f', 2, u'foo', u'hello', u'earth'])
182
183        CFArrayRemoveAllValues(array)
184        self.assertEquals(array, [])
185
186
187if __name__ == "__main__":
188    main()
189