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