1from CoreFoundation import *
2from PyObjCTools.TestSupport import *
3import Foundation
4
5
6try:
7    long
8except NameError:
9    long = int
10
11
12try:
13    unicode
14except NameError:
15    unicode = str
16
17class TestCFBundle (TestCase):
18
19    def testTypes(self):
20        self.assertIsCFType(CFBundleRef)
21
22    def testMainBundle(self):
23        bundle = CFBundleGetMainBundle()
24        self.assertIsInstance(bundle, CFBundleRef)
25
26    def testBundleLoader(self):
27        bundle = CFBundleGetBundleWithIdentifier(b"com.apple.CoreFoundation".decode('ascii'))
28        self.assertIsInstance(bundle, CFBundleRef)
29        array = list(CFBundleGetAllBundles())
30        self.assertNotEqual(len(array) , 0)
31        for b in array:
32            self.assertIsInstance(b, CFBundleRef)
33        url = CFURLCreateWithFileSystemPath(None,
34                b"/System/Library/Frameworks/Foundation.framework".decode('ascii'), kCFURLPOSIXPathStyle, True)
35        bundle = CFBundleCreate(None, url)
36        self.assertIsInstance(bundle, CFBundleRef)
37        url = CFURLCreateWithFileSystemPath(None, b"/System/Library/Frameworks".decode('ascii'), kCFURLPOSIXPathStyle, True)
38        array = CFBundleCreateBundlesFromDirectory(None, url, b"frameworkX".decode('ascii'))
39        self.assertEqual(len(array), 0)
40
41        array = CFBundleCreateBundlesFromDirectory(None, url, b"framework".decode('ascii'))
42        self.assertNotEquals(len(array), 0)
43
44        array = CFBundleCreateBundlesFromDirectory(None, url, None)
45        self.assertNotEquals(len(array), 0)
46
47    def testTypeID(self):
48        v = CFBundleGetTypeID()
49        self.assertIsInstance(v, (int, long))
50
51    def testInspection(self):
52        bundle = CFBundleGetBundleWithIdentifier(b"com.apple.CoreFoundation".decode('ascii'))
53        self.assertIsInstance(bundle, CFBundleRef)
54        url = CFBundleCopyBundleURL(bundle)
55        self.assertIsInstance(url, CFURLRef)
56        v = CFBundleGetValueForInfoDictionaryKey(bundle, b"CFBundleIdentifier".decode('ascii'))
57        self.assertEqual(v , b"com.apple.CoreFoundation".decode('ascii'))
58        v = CFBundleGetInfoDictionary(bundle)
59        self.assertIsInstance(v, CFDictionaryRef)
60        self.assertTrue( v['CFBundleIdentifier'], 'com.apple.CoreFoundation')
61
62        v = CFBundleGetLocalInfoDictionary(bundle)
63        if v is not None:
64            self.assertIsInstance(v, CFDictionaryRef)
65        type, creator = CFBundleGetPackageInfo(bundle, None, None)
66        self.assertIsInstance(type, (int, long))
67        self.assertIsInstance(creator, (int, long))
68        identifier = CFBundleGetIdentifier(bundle)
69        self.assertEqual(identifier , b"com.apple.CoreFoundation".decode('ascii'))
70        v = CFBundleGetVersionNumber(bundle)
71        self.assertIsInstance(v, (int, long))
72        v = CFBundleGetDevelopmentRegion(bundle)
73        self.assertIsInstance(v, unicode)
74        v = CFBundleCopySupportFilesDirectoryURL(bundle)
75        if v is not None:
76            self.assertIsInstance(v, CFURLRef)
77        v = CFBundleCopyResourcesDirectoryURL(bundle)
78        if v is not None:
79            self.assertIsInstance(v, CFURLRef)
80        v = CFBundleCopyPrivateFrameworksURL(bundle)
81        if v is not None:
82            self.assertIsInstance(v, CFURLRef)
83        v = CFBundleCopySharedFrameworksURL(bundle)
84        if v is not None:
85            self.assertIsInstance(v, CFURLRef)
86        v = CFBundleCopySharedSupportURL(bundle)
87        if v is not None:
88            self.assertIsInstance(v, CFURLRef)
89        v = CFBundleCopyBuiltInPlugInsURL(bundle)
90        if v is not None:
91            self.assertIsInstance(v, CFURLRef)
92
93    def testDirectAccess(self):
94        url = CFURLCreateWithFileSystemPath(None,
95                b"/System/Library/Frameworks/Foundation.framework".decode('ascii'), kCFURLPOSIXPathStyle, True)
96
97        v = CFBundleCopyInfoDictionaryInDirectory(url)
98        self.assertIsInstance(v, CFDictionaryRef)
99        self.assertEqual(v[b"CFBundleIdentifier".decode('ascii')] , b"com.apple.Foundation".decode('ascii'))
100        ok, type, creator = CFBundleGetPackageInfoInDirectory(url, None, None)
101        self.assertIs(ok, True)
102        self.assertIsInstance(type, (int, long))
103        self.assertIsInstance(creator, (int, long))
104
105    def testResources(self):
106        url = CFURLCreateWithFileSystemPath(None,
107                b"/System/Library/Frameworks/Foundation.framework".decode('ascii'), kCFURLPOSIXPathStyle, True)
108        bundle = CFBundleCreate(None, url)
109        self.assertIsInstance(bundle, CFBundleRef)
110        url = CFURLCreateWithFileSystemPath(None,
111                b"/System/Library/Frameworks/Tcl.framework".decode('ascii'), kCFURLPOSIXPathStyle, True)
112        bundle2 = CFBundleCreate(None, url)
113        self.assertIsInstance(bundle2, CFBundleRef)
114        url = CFBundleCopyResourceURL(bundle, "Formatter", "strings", None)
115        self.assertIsInstance(url, CFURLRef)
116        url = CFBundleCopyResourceURL(bundle, "Formatter", "strings", "helloworld.lproj")
117        self.assertIs(url, None)
118        array = CFBundleCopyResourceURLsOfType(bundle, "strings", None)
119        self.assertIsNot(array, None)
120        self.assertIsInstance(array, CFArrayRef)
121        val = CFBundleCopyLocalizedString(bundle, "Err640.f", "value", "FoundationErrors")
122        self.assertIsInstance(val, unicode)
123        self.assertNotEqual(val , "value")
124        CFCopyLocalizedString("python", "error")
125        CFCopyLocalizedStringFromTable("pyobjc", "python", "error")
126        CFCopyLocalizedStringFromTableInBundle("pyobjc", "python", bundle, "comment")
127        CFCopyLocalizedStringWithDefaultValue("pyobjc", "python", bundle, "default", "comment")
128
129        array = CFBundleCopyBundleLocalizations(bundle)
130        self.assertIsNot(array, None)
131        self.assertIsInstance(array, CFArrayRef)
132        arr2 = CFBundleCopyPreferredLocalizationsFromArray(array)
133        self.assertIsNot(arr2, None)
134        self.assertIsInstance(arr2, CFArrayRef)
135        arr2 = CFBundleCopyLocalizationsForPreferences(array, None)
136        self.assertIsNot(arr2, None)
137        self.assertIsInstance(arr2, CFArrayRef)
138        url = CFBundleCopyResourceURLForLocalization(bundle, "Formatter", "strings", None, "Dutch");
139        if url is None:
140            url = CFBundleCopyResourceURLForLocalization(bundle, "Formatter", "strings", None, "nl");
141        if url is None:
142            url = CFBundleCopyResourceURLForLocalization(bundle, "Formatter", "strings", None, "en");
143        self.assertIsInstance(url, CFURLRef)
144
145        array = CFBundleCopyResourceURLsOfTypeForLocalization(bundle, "strings", None, "Dutch")
146        self.assertIsNot(array, None)
147        self.assertIsInstance(array, CFArrayRef)
148        url = CFBundleCopyExecutableURL(bundle)
149        self.assertIsInstance(url, CFURLRef)
150        array = CFBundleCopyExecutableArchitectures(bundle)
151        self.assertIsNot(array, None)
152        self.assertIsInstance(array, CFArrayRef)
153        self.assertArgIsOut(CFBundlePreflightExecutable, 1)
154        ok, error = CFBundlePreflightExecutable(bundle, None)
155        self.assertTrue((ok is True) or (ok is False))
156        if ok:
157            self.assertIs(error, None)
158        else:
159            self.assertIsInstance(error, CFErrorRef)
160        self.assertArgIsOut(CFBundleLoadExecutableAndReturnError, 1)
161        ok, error = CFBundleLoadExecutableAndReturnError(bundle2, None)
162        self.assertTrue((ok is True) or (ok is False))
163        if ok:
164            self.assertIs(error, None)
165        else:
166            self.assertIsInstance(error, CFErrorRef)
167        ok = CFBundleLoadExecutable(bundle2)
168        self.assertTrue(ok)
169
170        ok = CFBundleIsExecutableLoaded(bundle2)
171        self.assertTrue(ok)
172
173        CFBundleUnloadExecutable(bundle2)
174        ok = CFBundleIsExecutableLoaded(bundle2)
175        #self.assertFalse(ok)
176        ok = CFBundleLoadExecutable(bundle2)
177        self.assertTrue(ok)
178
179        try:
180            CFBundleGetFunctionPointerForName
181        except NameError:
182            pass
183        else:
184            self.fail("CFBundleGetFunctionPointerForName")
185
186        try:
187            CFBundleGetFunctionPointersForNames
188        except NameError:
189            pass
190        else:
191            self.fail("CFBundleGetFunctionPointersForNames")
192
193        try:
194            CFBundleGetDataPointerForName
195        except NameError:
196            pass
197        else:
198            self.fail("CFBundleGetDataPointerForName")
199
200        try:
201            CFBundleGetDataPointersForNames
202        except NameError:
203            pass
204        else:
205            self.fail("CFBundleGetDataPointersForNames")
206
207        url =  CFBundleCopyAuxiliaryExecutableURL(bundle, "Foundation")
208        self.assertIsInstance(url, CFURLRef)
209        id = CFBundleOpenBundleResourceMap(bundle)
210        self.assertIsInstance(id, (int, long))
211        CFBundleCloseBundleResourceMap(bundle, id)
212
213        err,  id1, id2 = CFBundleOpenBundleResourceFiles(bundle, None, None)
214        self.assertIsInstance(err, (int, long))
215        self.assertIsInstance(id1, (int, long))
216        self.assertIsInstance(id2, (int, long))
217        if id1 != -1:
218            CFBundleCloseBundleResourceMap(bundle, id1)
219        if id2 != -1:
220            CFBundleCloseBundleResourceMap(bundle, id2)
221
222    def testResourcesDirect(self):
223        bundle = CFURLCreateWithFileSystemPath(None,
224                b"/System/Library/Frameworks/Foundation.framework".decode('ascii'), kCFURLPOSIXPathStyle, True)
225        url = CFBundleCopyResourceURLInDirectory(bundle, "Formatter", "strings", None)
226        self.assertIsInstance(url, CFURLRef)
227        array = CFBundleCopyResourceURLsOfTypeInDirectory(bundle, "strings", None)
228        self.assertIsNot(array, None)
229        self.assertIsInstance(array, CFArrayRef)
230        infoDict = CFBundleCopyInfoDictionaryForURL(bundle)
231        self.assertIsInstance(infoDict, CFDictionaryRef)
232        array = CFBundleCopyLocalizationsForURL(bundle)
233        self.assertIsInstance(array, CFArrayRef)
234        array = CFBundleCopyExecutableArchitecturesForURL(bundle)
235        self.assertIsInstance(array, CFArrayRef)
236        for a in array:
237            self.assertIsInstance(a, (int, long))
238
239    def testPlugin(self):
240        url = CFURLCreateWithFileSystemPath(None,
241                b"/System/Library/Components/AppleScript.component".decode('ascii'), kCFURLPOSIXPathStyle, True)
242        bundle = CFBundleCreate(None, url)
243        self.assertIsInstance(bundle, CFBundleRef)
244        ref = CFBundleGetPlugIn(bundle)
245        self.assertIs(ref, None)
246
247    def testConstants(self):
248        self.assertIsInstance(kCFBundleInfoDictionaryVersionKey, unicode)
249        self.assertIsInstance(kCFBundleExecutableKey, unicode)
250        self.assertIsInstance(kCFBundleIdentifierKey, unicode)
251        self.assertIsInstance(kCFBundleVersionKey, unicode)
252        self.assertIsInstance(kCFBundleDevelopmentRegionKey, unicode)
253        self.assertIsInstance(kCFBundleNameKey, unicode)
254        self.assertIsInstance(kCFBundleLocalizationsKey, unicode)
255        self.assertEqual(kCFBundleExecutableArchitectureI386     , 0x00000007)
256        self.assertEqual(kCFBundleExecutableArchitecturePPC      , 0x00000012)
257        self.assertEqual(kCFBundleExecutableArchitectureX86_64   , 0x01000007)
258        self.assertEqual(kCFBundleExecutableArchitecturePPC64    , 0x01000012)
259
260if __name__ == "__main__":
261    main()
262