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.assertEquals(CFBagGetCountOfValue(bag, 1), 2)
10        self.assertEquals(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.assertEquals(CFBagGetCountOfValue(bag, 9), 2)
18        self.assertEquals(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.assertEquals(items, [1,1,4,9,16])
33        self.assertEquals(contexts, [99,99,99,99,99])
34
35    def testTypeID(self):
36        v = CFBagGetTypeID()
37        self.failUnless(  isinstance(v, (int, long))  )
38
39    def testCopy(self):
40        bag = CFBagCreate(None, [1,1,2,3,4], 5)
41        self.failUnless( isinstance(bag, CFBagRef) )
42
43        bag2 = CFBagCreateCopy(None, bag)
44        self.failUnless( isinstance(bag2, CFBagRef) )
45
46        bag3 = CFBagCreateMutableCopy(None, 0, bag)
47        self.failUnless( isinstance(bag3, CFBagRef) )
48        self.failIf( bag3 is bag )
49
50    def testInspect(self):
51        bag = CFBagCreate(None, [u"Hello", 42, u"World", 42, u"a", u"a", u"a"], 7)
52        self.failUnless( isinstance(bag, CFBagRef) )
53
54        self.failUnless( CFBagGetCount(bag) == 7)
55        self.failUnless( CFBagGetCountOfValue(bag, u"Hello") == 1)
56        self.failUnless( CFBagGetCountOfValue(bag, 42) == 2)
57        self.failUnless( CFBagGetCountOfValue(bag, u"a") == 3)
58
59        self.failUnless( CFBagContainsValue(bag, u"a") )
60        self.failIf( CFBagContainsValue(bag, u"b") )
61
62        v = CFBagGetValue(bag, u"b")
63        self.failUnless( v is None)
64
65        v = CFBagGetValue(bag, u"a")
66        self.failUnless( v == u"a")
67
68        exists, value = CFBagGetValueIfPresent(bag, u"a", None)
69        self.failUnless( exists )
70        self.failUnless( value == u"a" )
71
72        exists, value = CFBagGetValueIfPresent(bag, u"b", None)
73        self.failIf( exists )
74        self.failUnless( value is None )
75
76        values = list(CFBagGetValues(bag))
77        values.sort()
78        l = [u"Hello", 42, u"World", 42, u"a", u"a", u"a"]
79        l.sort()
80        self.failUnless( values == l )
81
82
83    def testMutation(self):
84        bag = CFBagCreateMutable(None, 0)
85        self.failUnless( CFBagGetCount(bag) == 0)
86
87        CFBagAddValue(bag, u"hello")
88        self.failUnless( CFBagGetCount(bag) == 1)
89        CFBagAddValue(bag, u"hello")
90        self.failUnless( CFBagGetCount(bag) == 2)
91
92        CFBagReplaceValue(bag, u"hello")
93        self.failUnless( CFBagGetCount(bag) == 2)
94
95        CFBagReplaceValue(bag, u"world")
96        self.failUnless( CFBagGetCount(bag) == 2)
97
98        CFBagSetValue(bag, u"world")
99        self.failUnless( CFBagGetCount(bag) == 3)
100
101        CFBagSetValue(bag, u"world")
102        self.failUnless( CFBagGetCount(bag) == 3)
103
104        CFBagRemoveValue(bag, u"hello")
105        self.failUnless( CFBagGetCount(bag) == 2)
106        CFBagRemoveValue(bag, u"hello")
107        self.failUnless( CFBagGetCount(bag) == 1)
108
109        CFBagRemoveAllValues(bag)
110        self.failUnless( CFBagGetCount(bag) == 0)
111
112    def testFunctions(self):
113        self.failUnlessArgHasType(CFBagGetCountOfValue, 1, '@')
114        self.failUnlessArgHasType(CFBagContainsValue, 1, '@')
115        self.failUnlessArgHasType(CFBagGetValue, 1, '@')
116        self.failUnlessResultHasType(CFBagGetValue, '@')
117        self.failUnlessArgHasType(CFBagGetValueIfPresent, 1, '@')
118        self.failUnlessArgHasType(CFBagGetValueIfPresent, 2, 'o^@')
119        self.failUnlessResultHasType(CFBagGetValueIfPresent, objc._C_NSBOOL)
120        self.failUnlessArgIsFunction(CFBagApplyFunction, 1, 'v@@', False)
121        self.failUnlessArgHasType(CFBagApplyFunction, 2, '@')
122        self.failUnlessArgHasType(CFBagAddValue, 1, '@')
123        self.failUnlessArgHasType(CFBagReplaceValue, 1, '@')
124        self.failUnlessArgHasType(CFBagSetValue, 1, '@')
125        self.failUnlessArgHasType(CFBagRemoveValue, 1, '@')
126
127
128if __name__ == "__main__":
129    main()
130