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