1from __future__ import absolute_import, unicode_literals
2import objc
3from . import fnd as Foundation
4from PyObjCTools.TestSupport import *
5import os
6
7NSObject = objc.lookUpClass('NSObject')
8
9def S(*args):
10    return b''.join(args)
11
12FUNCTIONS=[
13    ( 'NSHomeDirectory', S(objc._C_ID)),
14    ( 'NSIsFreedObject', S(objc._C_NSBOOL, objc._C_ID) ),
15    ( 'NSCountFrames', S(objc._C_UINT) ),
16    ( 'NSClassFromString', S(objc._C_CLASS, objc._C_ID) ),
17]
18
19class TestBundleFunctions (TestCase):
20    def setUp(self):
21        self.bundle = Foundation.NSBundle.bundleForClass_(Foundation.NSBundle)
22
23    def testSimple(self):
24        for bundle in (None, self.bundle):
25            d = {}
26            objc.loadBundleFunctions(self.bundle, d, FUNCTIONS)
27
28            self.assertIn('NSIsFreedObject', d)
29            self.assertIn('NSCountFrames', d)
30            self.assertIn('NSHomeDirectory', d)
31
32            # Don't use this API, it is unsupported and causes warnings.
33            #fn = d[u'NSIsFreedObject']
34            #obj = NSObject.alloc().init()
35            #value = fn(obj)
36            #self.assertTrue(not value)
37
38            fn = d['NSHomeDirectory']
39            value = fn()
40            self.assertEqual(value, os.path.expanduser('~'))
41
42            fn = d['NSClassFromString']
43            value = fn('NSObject')
44            self.assertIs(value, NSObject)
45
46            # Need to look for a different example, NSCountFrames crashes
47            # (that is the actual function, not the dynamic wrapper)
48            #fn = d[u'NSCountFrames']
49            #import Foundation
50            #fn = Foundation.NSCountFrames
51            #value = fn()
52            #self.assertIsInstance(value, int)
53
54
55if __name__ == "__main__":
56    main()
57