1from CoreFoundation import *
2from Foundation import NSDictionary, NSMutableDictionary, NSCFDictionary
3from PyObjCTools.TestSupport import *
4
5class TestCFDictionary (TestCase):
6
7    def testTypes(self):
8        self.failUnless(CFDictionaryRef is NSCFDictionary)
9
10    def testCreation(self):
11        dictionary = CFDictionaryCreate(None,
12                ('aap', 'noot', 'mies', 'wim'),
13                ('monkey', 'nut', 'missy', 'john'),
14                4, kCFTypeDictionaryKeyCallBacks, kCFTypeDictionaryValueCallBacks)
15        self.assert_(isinstance(dictionary, CFDictionaryRef))
16        self.assertEquals(dictionary, {
17                'aap': 'monkey',
18                'noot': 'nut',
19                'mies': 'missy',
20                'wim': 'john'
21            })
22
23        dictionary = CFDictionaryCreateMutable(None, 0, kCFTypeDictionaryKeyCallBacks, kCFTypeDictionaryValueCallBacks)
24        self.assert_(isinstance(dictionary, CFMutableDictionaryRef))
25        CFDictionarySetValue(dictionary, 'hello', 'world')
26        self.assertEquals(dictionary, {'hello': 'world'})
27
28    def testApplyFunction(self):
29        dictionary = CFDictionaryCreate(None,
30                ('aap', 'noot', 'mies', 'wim'),
31                ('monkey', 'nut', 'missy', 'john'), 4, kCFTypeDictionaryKeyCallBacks, kCFTypeDictionaryValueCallBacks)
32
33        context = []
34
35        def function(key, value, context):
36            context.append((key, value))
37
38        self.failUnlessArgIsFunction(CFDictionaryApplyFunction, 1, 'v@@@', False)
39        self.failUnlessArgHasType(CFDictionaryApplyFunction, 2, '@')
40        CFDictionaryApplyFunction(dictionary, function, context)
41
42        context.sort()
43        self.failUnless(len(context) == 4)
44        self.assertEquals(context,
45                [
46                    (u'aap', u'monkey'),
47                    (u'mies', u'missy'),
48                    (u'noot', u'nut'),
49                    (u'wim', u'john')
50                ])
51
52    def testTypeID(self):
53        self.failUnless(isinstance(CFDictionaryGetTypeID(), (int, long)))
54
55    def testCreation(self):
56        dct = CFDictionaryCreate(None, [u"key1", u"key2"], [42, 43], 2, kCFTypeDictionaryKeyCallBacks, kCFTypeDictionaryValueCallBacks)
57        self.failUnless(isinstance(dct, CFDictionaryRef))
58
59        dct = CFDictionaryCreateCopy(None, dct)
60        self.failUnless(isinstance(dct, CFDictionaryRef))
61
62        dct = CFDictionaryCreateMutable(None, 0, kCFTypeDictionaryKeyCallBacks, kCFTypeDictionaryValueCallBacks)
63        self.failUnless(isinstance(dct, CFDictionaryRef))
64
65        dct = CFDictionaryCreateMutableCopy(None, 0, dct)
66        self.failUnless(isinstance(dct, CFDictionaryRef))
67
68    def testInspection(self):
69        dct = CFDictionaryCreate(None, [u"key1", u"key2"], [42, 42], 2, kCFTypeDictionaryKeyCallBacks, kCFTypeDictionaryValueCallBacks)
70        self.failUnless(isinstance(dct, CFDictionaryRef))
71
72        self.failUnless(CFDictionaryGetCount(dct) == 2)
73        self.failUnless(CFDictionaryGetCountOfKey(dct, u"key1") == 1)
74        self.failUnless(CFDictionaryGetCountOfKey(dct, u"key3") == 0)
75
76        self.failUnless(CFDictionaryGetCountOfValue(dct, 42) == 2)
77        self.failUnless(CFDictionaryGetCountOfValue(dct, 44) == 0)
78
79        self.failUnlessResultHasType(CFDictionaryContainsKey, objc._C_NSBOOL)
80        self.failUnless(CFDictionaryContainsKey(dct, u"key1"))
81        self.failIf(CFDictionaryContainsKey(dct, u"key3"))
82
83        self.failUnlessResultHasType(CFDictionaryContainsValue, objc._C_NSBOOL)
84        self.failUnless(CFDictionaryContainsValue(dct, 42))
85        self.failIf(CFDictionaryContainsValue(dct, u"key3"))
86
87        self.failUnless(CFDictionaryGetValue(dct, "key2") == 42)
88        self.failUnless(CFDictionaryGetValue(dct, "key3") is None)
89
90        self.failUnlessResultHasType(CFDictionaryGetValueIfPresent, objc._C_NSBOOL)
91        self.failUnlessArgIsOut(CFDictionaryGetValueIfPresent, 2)
92        ok, value = CFDictionaryGetValueIfPresent(dct, "key2", None)
93        self.failUnless(ok)
94        self.failUnless(value == 42)
95
96        ok, value = CFDictionaryGetValueIfPresent(dct, "key3", None)
97        self.failIf(ok)
98        self.failUnless(value is None)
99
100
101        keys, values = CFDictionaryGetKeysAndValues(dct, None, None)
102        self.failUnless(values == (42, 42))
103        keys = list(keys)
104        keys.sort()
105        self.failUnless(keys == ['key1', 'key2'])
106
107    def testMutation(self):
108        dct = CFDictionaryCreateMutable(None, 0, kCFTypeDictionaryKeyCallBacks, kCFTypeDictionaryValueCallBacks)
109        self.failUnless(CFDictionaryGetCount(dct) == 0)
110
111        CFDictionaryAddValue(dct, u"key1", u"value1")
112        self.failUnless(CFDictionaryGetCount(dct) == 1)
113        self.failUnless(CFDictionaryContainsKey(dct, u"key1"))
114
115        CFDictionarySetValue(dct, u"key2", u"value2")
116        self.failUnless(CFDictionaryGetCount(dct) == 2)
117        self.failUnless(CFDictionaryContainsKey(dct, u"key2"))
118
119        CFDictionaryReplaceValue(dct, u"key2", u"value2b")
120        self.failUnless(CFDictionaryGetCount(dct) == 2)
121        self.failUnless(CFDictionaryContainsKey(dct, u"key2"))
122        self.failUnless(CFDictionaryGetValue(dct, "key2") == u"value2b")
123
124        CFDictionaryReplaceValue(dct, u"key3", u"value2b")
125        self.failUnless(CFDictionaryGetCount(dct) == 2)
126        self.failIf(CFDictionaryContainsKey(dct, u"key3"))
127
128        CFDictionaryRemoveValue(dct, u"key1")
129        self.failIf(CFDictionaryContainsKey(dct, u"key1"))
130
131        CFDictionaryRemoveAllValues(dct)
132        self.failIf(CFDictionaryContainsKey(dct, u"key2"))
133        self.failUnless(CFDictionaryGetCount(dct) == 0)
134
135if __name__ == "__main__":
136    main()
137