1from PyObjCTools.TestSupport import *
2from CoreFoundation import *
3
4try:
5    long
6except NameError:
7    long = int
8
9
10class TestCFBag (TestCase):
11
12    def testCreation(self):
13        bag = CFBagCreate(None, [1,1,2,3,4], 5)
14        self.assert_(isinstance(bag, CFBagRef))
15        self.assertEqual(CFBagGetCountOfValue(bag, 1), 2)
16        self.assertEqual(CFBagGetCountOfValue(bag, 3), 1)
17
18        bag = CFBagCreateMutable(None, 0)
19        self.assert_(isinstance(bag, CFBagRef))
20        CFBagAddValue(bag, 9)
21        CFBagAddValue(bag, 8)
22        CFBagAddValue(bag, 9)
23        self.assertEqual(CFBagGetCountOfValue(bag, 9), 2)
24        self.assertEqual(CFBagGetCountOfValue(bag, 8), 1)
25
26    def testApplyFunction(self):
27        items = []
28        contexts = []
29
30        bag = CFBagCreate(None, [1,1,2,3,4], 5)
31
32        def func(item, context):
33            items.append(item*item)
34            contexts.append(context)
35
36        CFBagApplyFunction(bag, func, 99)
37        items.sort()
38        self.assertEqual(items, [1,1,4,9,16])
39        self.assertEqual(contexts, [99,99,99,99,99])
40
41    def testTypeID(self):
42        v = CFBagGetTypeID()
43        self.assertIsInstance(v, (int, long))
44
45    def testCopy(self):
46        bag = CFBagCreate(None, [1,1,2,3,4], 5)
47        self.assertIsInstance(bag, CFBagRef)
48        bag2 = CFBagCreateCopy(None, bag)
49        self.assertIsInstance(bag2, CFBagRef)
50        bag3 = CFBagCreateMutableCopy(None, 0, bag)
51        self.assertIsInstance(bag3, CFBagRef)
52        self.assertIsNot(bag3, bag )
53
54    def testInspect(self):
55        bag = CFBagCreate(None, [b"Hello".decode('ascii'), 42, b"World".decode('ascii'), 42, b"a".decode('ascii'), b"a".decode('ascii'), b"a".decode('ascii')], 7)
56        self.assertIsInstance(bag, CFBagRef)
57        self.assertEqual(CFBagGetCount(bag) , 7)
58        self.assertEqual(CFBagGetCountOfValue(bag, b"Hello".decode('ascii')) , 1)
59        self.assertEqual(CFBagGetCountOfValue(bag, 42) , 2)
60        self.assertEqual(CFBagGetCountOfValue(bag, b"a".decode('ascii')) , 3)
61        self.assertTrue(CFBagContainsValue(bag, b"a".decode('ascii')) )
62        self.assertFalse(CFBagContainsValue(bag, b"b".decode('ascii')) )
63
64        v = CFBagGetValue(bag, b"b".decode('ascii'))
65        self.assertIs(v, None)
66        v = CFBagGetValue(bag, b"a".decode('ascii'))
67        self.assertEqual(v , b"a".decode('ascii'))
68        exists, value = CFBagGetValueIfPresent(bag, b"a".decode('ascii'), None)
69        self.assertTrue( exists )
70        self.assertEqual(value , b"a".decode('ascii') )
71        exists, value = CFBagGetValueIfPresent(bag, b"b".decode('ascii'), None)
72        self.assertFalse( exists )
73        self.assertIs(value, None )
74        values = set(CFBagGetValues(bag))
75        l = set([b"Hello".decode('ascii'), 42, b"World".decode('ascii'), 42, b"a".decode('ascii'), b"a".decode('ascii'), b"a".decode('ascii')])
76        self.assertEqual(values , l )
77
78    def testMutation(self):
79        bag = CFBagCreateMutable(None, 0)
80        self.assertEqual(CFBagGetCount(bag) , 0)
81        CFBagAddValue(bag, b"hello".decode('ascii'))
82        self.assertEqual(CFBagGetCount(bag) , 1)
83        CFBagAddValue(bag, b"hello".decode('ascii'))
84        self.assertEqual(CFBagGetCount(bag) , 2)
85        CFBagReplaceValue(bag, b"hello".decode('ascii'))
86        self.assertEqual(CFBagGetCount(bag) , 2)
87        CFBagReplaceValue(bag, b"world".decode('ascii'))
88        self.assertEqual(CFBagGetCount(bag) , 2)
89        CFBagSetValue(bag, b"world".decode('ascii'))
90        self.assertEqual(CFBagGetCount(bag) , 3)
91        CFBagSetValue(bag, b"world".decode('ascii'))
92        self.assertEqual(CFBagGetCount(bag) , 3)
93        CFBagRemoveValue(bag, b"hello".decode('ascii'))
94        self.assertEqual(CFBagGetCount(bag) , 2)
95        CFBagRemoveValue(bag, b"hello".decode('ascii'))
96        self.assertEqual(CFBagGetCount(bag) , 1)
97        CFBagRemoveAllValues(bag)
98        self.assertEqual(CFBagGetCount(bag) , 0)
99
100    def testFunctions(self):
101        self.assertArgHasType(CFBagGetCountOfValue, 1, b'@')
102        self.assertArgHasType(CFBagContainsValue, 1, b'@')
103        self.assertArgHasType(CFBagGetValue, 1, b'@')
104        self.assertResultHasType(CFBagGetValue, b'@')
105        self.assertArgHasType(CFBagGetValueIfPresent, 1, b'@')
106        self.assertArgHasType(CFBagGetValueIfPresent, 2, b'o^@')
107        self.assertResultHasType(CFBagGetValueIfPresent, objc._C_NSBOOL)
108        self.assertArgIsFunction(CFBagApplyFunction, 1, b'v@@', False)
109        self.assertArgHasType(CFBagApplyFunction, 2, b'@')
110        self.assertArgHasType(CFBagAddValue, 1, b'@')
111        self.assertArgHasType(CFBagReplaceValue, 1, b'@')
112        self.assertArgHasType(CFBagSetValue, 1, b'@')
113        self.assertArgHasType(CFBagRemoveValue, 1, b'@')
114
115if __name__ == "__main__":
116    main()
117