1from PyObjCTools.TestSupport import *
2from CoreFoundation import *
3
4
5class TestNotificationCenter (TestCase):
6
7    def testTypes(self):
8        self.failUnlessIsCFType(CFNotificationCenterRef)
9
10    def testTypeID(self):
11        self.failUnless(isinstance(CFNotificationCenterGetTypeID(), (int, long)))
12
13    def testGetting(self):
14        ref = CFNotificationCenterGetLocalCenter();
15        self.failUnless(isinstance(ref,CFNotificationCenterRef))
16
17        ref = CFNotificationCenterGetDistributedCenter();
18        self.failUnless(isinstance(ref,CFNotificationCenterRef))
19
20        ref = CFNotificationCenterGetDarwinNotifyCenter();
21        self.failUnless(isinstance(ref,CFNotificationCenterRef))
22
23    def testSending(self):
24        ref = CFNotificationCenterGetLocalCenter();
25        self.failUnless(isinstance(ref,CFNotificationCenterRef))
26
27        notifications = []
28        @objc.callbackFor(CFNotificationCenterAddObserver)
29        def observe(center, observer, name, object, userInfo):
30            notifications.append(( center, observer, name, object, userInfo ))
31
32        self.failUnlessArgHasType(CFNotificationCenterAddObserver, 1, '@')
33        self.failUnlessArgIsFunction(CFNotificationCenterAddObserver, 2, 'v@@@@@', True)
34        self.failUnlessArgHasType(CFNotificationCenterAddObserver, 4, '@')
35
36        CFNotificationCenterAddObserver(ref, u"object", observe, u"pyobjc.test", ref, CFNotificationSuspensionBehaviorDeliverImmediately)
37
38        CFNotificationCenterPostNotificationWithOptions(ref, u"pyobjc.test", ref, {u"name":u"value"},  kCFNotificationPostToAllSessions)
39        self.failUnless(len(notifications) == 1)
40        info = notifications[-1]
41        self.failUnless(info[0] is ref)
42        self.failUnless(info[1] == u"object")
43        self.failUnless(info[2] == u"pyobjc.test")
44        self.failUnless(info[3] is ref)
45        self.failUnless(info[4] == {u"name":u"value"})
46
47        CFNotificationCenterPostNotification(ref, u"pyobjc.test", ref, {u"name2":u"value2"},  True)
48        self.failUnless(len(notifications) == 2)
49        info = notifications[-1]
50        self.failUnless(info[0] is ref)
51        self.failUnless(info[1] == u"object")
52        self.failUnless(info[2] == u"pyobjc.test")
53        self.failUnless(info[3] is ref)
54        self.failUnless(info[4] == {u"name2":u"value2"})
55
56        self.failUnlessArgHasType(CFNotificationCenterRemoveObserver, 1, '@')
57        self.failUnlessArgHasType(CFNotificationCenterRemoveObserver, 3, '@')
58        CFNotificationCenterRemoveObserver(ref, u"object", u"pyobjc.test", ref)
59
60        self.failUnlessArgHasType(CFNotificationCenterPostNotificationWithOptions, 2, '@')
61        CFNotificationCenterPostNotificationWithOptions(ref, u"pyobjc.test", ref, {u"name":u"value"},  kCFNotificationPostToAllSessions)
62        self.failUnless(len(notifications) == 2)
63
64        CFNotificationCenterAddObserver(ref, u"object", observe, u"pyobjc.test", ref, CFNotificationSuspensionBehaviorDeliverImmediately)
65
66        self.failUnlessArgHasType(CFNotificationCenterPostNotification, 2, '@')
67        self.failUnlessArgIsBOOL(CFNotificationCenterPostNotification, 4)
68        CFNotificationCenterPostNotification(ref, u"pyobjc.test", ref, {u"name2":u"value2"},  True)
69        self.failUnless(len(notifications) == 3)
70
71        CFNotificationCenterRemoveEveryObserver(ref, u"object")
72        CFNotificationCenterPostNotification(ref, u"pyobjc.test", ref, {u"name2":u"value2"},  True)
73        self.failUnless(len(notifications) == 3)
74
75
76    def testConstants(self):
77        self.failUnlessEqual(CFNotificationSuspensionBehaviorDrop, 1)
78        self.failUnlessEqual(CFNotificationSuspensionBehaviorCoalesce, 2)
79        self.failUnlessEqual(CFNotificationSuspensionBehaviorHold, 3)
80        self.failUnlessEqual(CFNotificationSuspensionBehaviorDeliverImmediately, 4)
81        self.failUnlessEqual(kCFNotificationDeliverImmediately, 1)
82        self.failUnlessEqual(kCFNotificationPostToAllSessions, 2)
83
84
85if __name__ == "__main__":
86    main()
87