1from PyObjCTools.TestSupport import *
2from CoreFoundation import *
3
4
5class TestSet (TestCase):
6    def testTypes(self):
7        self.failUnlessIsCFType(CFSetRef)
8
9    def testTypeID(self):
10        self.failUnless(isinstance(CFSetGetTypeID(), (int, long)))
11
12    def testCreation(self):
13        st = CFSetCreate(None, [u"a", u"b", u"c"], 3, kCFTypeSetCallBacks)
14        self.failUnless(isinstance(st, CFSetRef))
15        self.failUnless(isinstance(st, objc.lookUpClass('NSSet')))
16
17        st = CFSetCreate(None, [u"a", u"b", u"c"], 3, kCFTypeSetCallBacks)
18        self.failUnless(isinstance(st, CFSetRef))
19
20        st = CFSetCreateMutable(None, 0, kCFTypeSetCallBacks)
21        self.failUnless(isinstance(st, CFSetRef))
22
23        cp = CFSetCreateMutableCopy(None, 0, st)
24        self.failUnless(isinstance(st, CFSetRef))
25
26        cp = CFSetCreateCopy(None, st)
27        self.failUnless(isinstance(st, CFSetRef))
28
29    def testInspection(self):
30        st = CFSetCreate(None, [u"a", u"b", u"c"], 3, kCFTypeSetCallBacks)
31        self.failUnless(isinstance(st, CFSetRef))
32        self.failUnless(isinstance(st, objc.lookUpClass('NSSet')))
33
34        v = CFSetGetCount(st)
35        self.failUnless(v == 3)
36
37        self.failUnlessArgHasType(CFSetGetCountOfValue, 1, '@')
38        v = CFSetGetCountOfValue(st, u'd')
39        self.failUnless(v == 0)
40        v = CFSetGetCountOfValue(st, u'b')
41        self.failUnless(v == 1)
42
43        self.failUnlessArgHasType(CFSetContainsValue, 1, '@')
44        v = CFSetContainsValue(st, u'd')
45        self.failUnless(v is False)
46        v = CFSetContainsValue(st, u'b')
47        self.failUnless(v is True)
48
49        self.failUnlessResultHasType(CFSetGetValue, '@')
50        self.failUnlessArgHasType(CFSetGetValue, 1, '@')
51        v = CFSetGetValue(st, u'd')
52        self.failUnless(v is None)
53
54        v = CFSetGetValue(st, u'b')
55        self.failUnless(v == u'b')
56
57        self.failUnlessResultIsBOOL(CFSetGetValueIfPresent)
58        self.failUnlessArgHasType(CFSetGetValueIfPresent, 1, '@')
59        self.failUnlessArgHasType(CFSetGetValueIfPresent, 2, 'o^@')
60        present, value = CFSetGetValueIfPresent(st, u'c', None)
61        self.failUnless(present is True)
62        self.failUnless(value == u'c')
63
64        values = CFSetGetValues(st, None)
65        values = list(values)
66        values.sort()
67        self.failUnless(values == [u'a', u'b', u'c'])
68
69    def testApplying(self):
70        st = CFSetCreate(None, [u"a", u"b", u"c"], 3, kCFTypeSetCallBacks)
71        self.failUnless(isinstance(st, CFSetRef))
72        self.failUnless(isinstance(st, objc.lookUpClass('NSSet')))
73
74        context = []
75        def callback(value, context):
76            context.append(value)
77
78        self.failUnlessArgIsFunction(CFSetApplyFunction, 1, 'v@@', False)
79        self.failUnlessArgHasType(CFSetApplyFunction, 2, '@')
80        CFSetApplyFunction(st, callback, context)
81        self.failUnless(len(context) == 3)
82        context.sort()
83        self.failUnless(context == [u'a', u'b', u'c'])
84
85    def testMutation(self):
86        st = CFSetCreate(None, [u"a", u"b", u"c"], 3, kCFTypeSetCallBacks)
87        self.failUnless(isinstance(st, CFSetRef))
88        self.failUnless(isinstance(st, objc.lookUpClass('NSSet')))
89        st = CFSetCreateMutableCopy(None, 0, st)
90        self.failUnless(isinstance(st, CFSetRef))
91
92        self.failUnless(CFSetGetCount(st) == 3)
93        self.failUnlessArgHasType(CFSetSetValue, 1, '@')
94        CFSetSetValue(st, 'c')
95        self.failUnless(CFSetGetCount(st) == 3)
96        CFSetSetValue(st, 'd')
97        self.failUnless(CFSetGetCount(st) == 4)
98
99        self.failUnlessArgHasType(CFSetRemoveValue, 1, '@')
100        CFSetRemoveValue(st, 'c')
101        self.failUnless(CFSetGetCount(st) == 3)
102
103        CFSetRemoveAllValues(st)
104        self.failUnless(CFSetGetCount(st) == 0)
105
106        self.failUnlessArgHasType(CFSetAddValue, 1, '@')
107        CFSetAddValue(st, 'd')
108
109        self.failUnlessArgHasType(CFSetReplaceValue, 1, '@')
110        CFSetReplaceValue(st, 'd')
111
112
113if __name__ == "__main__":
114    main()
115