1from PyObjCTools.TestSupport import *
2import os
3from CoreFoundation import *
4
5try:
6    unicode
7except NameError:
8    unicode = str
9
10
11try:
12    long
13except NameError:
14    long = int
15
16
17class TestPreferences (TestCase):
18    def testGetting(self):
19        v = CFPreferencesCopyAppValue("Default Window Settings", "com.apple.Terminal")
20        self.assertIsInstance(v, unicode)
21        self.assertResultIsBOOL(CFPreferencesGetAppBooleanValue)
22        self.assertArgHasType(CFPreferencesGetAppBooleanValue, 2, b'o^Z')
23        v, valid = CFPreferencesGetAppBooleanValue("SecureKeyboardEntry", "com.apple.Terminal", None)
24        self.assertTrue(valid)
25        self.assertIsInstance(v, bool)
26        self.assertArgHasType(CFPreferencesGetAppIntegerValue, 2, b'o^Z')
27        v, valid = CFPreferencesGetAppIntegerValue("ABMetaDataChangeCount", "com.apple.AddressBook", None)
28        self.assertTrue(valid)
29        self.assertIsInstance(v, (int, long))
30        v = CFPreferencesCopyValue("Default Window Settings", "com.apple.Terminal", kCFPreferencesCurrentUser, kCFPreferencesAnyHost)
31        self.assertIsInstance(v, unicode)
32        v = CFPreferencesCopyMultiple(None, "com.apple.Terminal", kCFPreferencesCurrentUser, kCFPreferencesAnyHost)
33        self.assertIsInstance(v, CFDictionaryRef)
34        v = CFPreferencesCopyMultiple([b"AutoFocus".decode('ascii'), b"WindowCloseAction".decode('ascii')], "com.apple.Terminal", kCFPreferencesCurrentUser, kCFPreferencesAnyHost)
35        self.assertIsInstance(v, CFDictionaryRef)
36        self.assertResultIsBOOL(CFPreferencesAppValueIsForced)
37        v = CFPreferencesAppValueIsForced("AutoFocus", "com.apple.Terminal")
38        self.assertIs(v is True or v, False)
39
40    def testSetting(self):
41        prefsFn = os.path.expanduser('~/Library/Preferences/PyObjCTest.plist')
42        if os.path.exists(prefsFn):
43            os.unlink(prefsFn)
44
45        v = CFPreferencesCopyAppValue("PyObjCTestValue", "PyObjCTest")
46        self.assertIs(v, None)
47        CFPreferencesSetAppValue("PyObjCTestValue", "value1", "PyObjCTest")
48        v = CFPreferencesCopyAppValue("PyObjCTestValue", "PyObjCTest")
49        self.assertEqual(v , "value1")
50        CFPreferencesAddSuitePreferencesToApp("PyObjCTest", kCFPreferencesCurrentApplication)
51        CFPreferencesRemoveSuitePreferencesFromApp("PyObjCTest", kCFPreferencesCurrentApplication)
52
53        ok = CFPreferencesAppSynchronize("PyObjCTest")
54        self.assertTrue(ok)
55        listing = os.listdir(os.path.dirname(prefsFn))
56        self.assertTrue([fn for fn in listing if fn.startswith(os.path.basename(prefsFn))])
57
58        CFPreferencesSetValue("PyObjCTestValue2", "value2", "PyObjCTest", kCFPreferencesCurrentUser, kCFPreferencesAnyHost)
59        v = CFPreferencesCopyValue("PyObjCTestValue2", "PyObjCTest", kCFPreferencesCurrentUser, kCFPreferencesAnyHost)
60        self.assertEqual(v , "value2")
61        CFPreferencesSetValue("PyObjCTestValue2", None, "PyObjCTest", kCFPreferencesCurrentUser, kCFPreferencesAnyHost)
62        v = CFPreferencesCopyValue("PyObjCTestValue2", "PyObjCTest", kCFPreferencesCurrentUser, kCFPreferencesAnyHost)
63        self.assertIs(v, None)
64        v = CFPreferencesCopyValue("PyObjCTestValue", "PyObjCTest", kCFPreferencesCurrentUser, kCFPreferencesAnyHost)
65        self.assertIsNot(v, None)
66        CFPreferencesSetMultiple({
67            'key1': 99,
68            'key2': 42,
69        }, ["PyObjCTestValue"], "PyObjCTest", kCFPreferencesCurrentUser, kCFPreferencesAnyHost)
70        v = CFPreferencesCopyValue("PyObjCTestValue", "PyObjCTest", kCFPreferencesCurrentUser, kCFPreferencesAnyHost)
71        self.assertIs(v, None)
72        v = CFPreferencesCopyValue("key2", "PyObjCTest", kCFPreferencesCurrentUser, kCFPreferencesAnyHost)
73        self.assertEqual(v , 42)
74        if os.path.exists(prefsFn):
75            os.unlink(prefsFn)
76        ok = CFPreferencesSynchronize("PyObjCTest", kCFPreferencesCurrentUser, kCFPreferencesAnyHost)
77
78        self.assertTrue(ok)
79        listing = os.listdir(os.path.dirname(prefsFn))
80        self.assertTrue([fn for fn in listing if fn.startswith(os.path.basename(prefsFn))])
81
82        self.assertResultIsCFRetained(CFPreferencesCopyApplicationList)
83        apps = CFPreferencesCopyApplicationList(kCFPreferencesCurrentUser, kCFPreferencesAnyHost)
84        self.assertIsInstance(apps, CFArrayRef)
85        self.assertIn(b"com.apple.AddressBook".decode('ascii'), apps)
86        self.assertResultIsCFRetained(CFPreferencesCopyKeyList)
87        keys = CFPreferencesCopyKeyList(b"com.apple.AddressBook".decode('ascii'), kCFPreferencesCurrentUser, kCFPreferencesAnyHost)
88        self.assertIsInstance(keys, CFArrayRef)
89        self.assertTrue(b"ABVersion".decode('ascii') in keys or b"ABNameDisplay".decode('ascii') in keys)
90
91    def testConstants(self):
92        self.assertIsInstance(kCFPreferencesAnyApplication, unicode)
93        self.assertIsInstance(kCFPreferencesCurrentApplication, unicode)
94        self.assertIsInstance(kCFPreferencesAnyHost, unicode)
95        self.assertIsInstance(kCFPreferencesCurrentHost, unicode)
96        self.assertIsInstance(kCFPreferencesAnyUser, unicode)
97        self.assertIsInstance(kCFPreferencesCurrentUser, unicode)
98
99if __name__ == "__main__":
100    main()
101