1from PyObjCTools.TestSupport import *
2from CoreFoundation import *
3from Foundation import *
4
5try:
6    unicode
7except NameError:
8    unicode = str
9
10
11try:
12    long
13except NameError:
14    long = int
15
16try:
17    unichr
18except NameError:
19    unichr = chr
20
21
22class TestError (TestCase):
23
24    @min_os_level('10.5')
25    def testTypes(self):
26        try:
27            NSCFError = objc.lookUpClass('__NSCFError')
28        except objc.error:
29            NSCFError = objc.lookUpClass('NSCFError')
30
31        self.assertIs(CFErrorRef, NSCFError)
32
33    @min_os_level('10.5')
34    def testTypeID(self):
35        self.assertIsInstance(CFErrorGetTypeID(), (int, long))
36
37    @min_os_level('10.5')
38    def testCreation(self):
39        userInfo = {
40                b'foo'.decode('ascii'): b'bar'.decode('ascii'),
41        }
42        err = CFErrorCreate(None, kCFErrorDomainPOSIX, 42,  userInfo)
43        self.assertIsInstance(err, CFErrorRef)
44        self.assertResultIsCFRetained(CFErrorCopyUserInfo)
45        dct = CFErrorCopyUserInfo(err)
46        self.assertEqual(dct, userInfo)
47
48        keys = [ b"key1".decode('ascii'), b"key2".decode('ascii')]
49        values = [ b"value1".decode('ascii'), b"value2".decode('ascii')]
50
51        keys = [ NSString.stringWithString_(v) for v in keys ]
52        values = [ NSString.stringWithString_(v) for v in values ]
53
54        self.assertArgHasType(CFErrorCreateWithUserInfoKeysAndValues, 3, b'n^@')
55        self.assertArgSizeInArg(CFErrorCreateWithUserInfoKeysAndValues, 3, 5)
56        self.assertArgHasType(CFErrorCreateWithUserInfoKeysAndValues, 4, b'n^@')
57        self.assertArgSizeInArg(CFErrorCreateWithUserInfoKeysAndValues, 4, 5)
58        err = CFErrorCreateWithUserInfoKeysAndValues(None, kCFErrorDomainPOSIX, 42, keys, values, 2)
59        self.assertIsInstance(err, CFErrorRef)
60        dct = CFErrorCopyUserInfo(err)
61        self.assertEqual(dct, {b'key1'.decode('ascii'): b'value1'.decode('ascii'), b'key2'.decode('ascii'):b'value2'.decode('ascii')})
62
63    @min_os_level('10.5')
64    def testInspection(self):
65        userInfo = {
66                b'foo'.decode('ascii'): b'bar'.decode('ascii'),
67                kCFErrorLocalizedFailureReasonKey: "failure reason",
68                kCFErrorLocalizedRecoverySuggestionKey: 'recovery suggestion',
69        }
70        self.assertResultIsCFRetained(CFErrorCreate)
71        err = CFErrorCreate(None, kCFErrorDomainPOSIX, 42,  userInfo)
72        self.assertIsInstance(err, CFErrorRef)
73        dom = CFErrorGetDomain(err)
74        self.assertEqual(dom, kCFErrorDomainPOSIX)
75
76        code = CFErrorGetCode(err)
77        self.assertEqual(code, 42)
78
79        self.assertResultIsCFRetained(CFErrorCopyDescription)
80        v = CFErrorCopyDescription(err)
81        self.assertIn(v, (
82            b'Operation could not be completed. failure reason'.decode('ascii'),
83            b'The operation couldn%st be completed. failure reason'.decode('ascii')%(unichr(0x2019),)))
84
85        self.assertResultIsCFRetained(CFErrorCopyFailureReason)
86        v = CFErrorCopyFailureReason(err)
87        self.assertEqual(v, b'failure reason'.decode('ascii'))
88
89        self.assertResultIsCFRetained(CFErrorCopyRecoverySuggestion)
90        v = CFErrorCopyRecoverySuggestion(err)
91        self.assertEqual(v, b'recovery suggestion'.decode('ascii'))
92
93    @min_os_level('10.5')
94    def testConstants(self):
95        self.assertIsInstance(kCFErrorDomainPOSIX, unicode)
96        self.assertIsInstance(kCFErrorDomainOSStatus, unicode)
97        self.assertIsInstance(kCFErrorDomainMach, unicode)
98        self.assertIsInstance(kCFErrorDomainCocoa, unicode)
99        self.assertIsInstance(kCFErrorLocalizedDescriptionKey, unicode)
100        self.assertIsInstance(kCFErrorLocalizedFailureReasonKey, unicode)
101        self.assertIsInstance(kCFErrorLocalizedRecoverySuggestionKey, unicode)
102        self.assertIsInstance(kCFErrorDescriptionKey, unicode)
103        self.assertIsInstance(kCFErrorUnderlyingErrorKey, unicode)
104
105    @min_os_level('10.7')
106    def testConstants10_7(self):
107        self.assertIsInstance(kCFErrorURLKey, unicode)
108        self.assertIsInstance(kCFErrorFilePathKey, unicode)
109
110if __name__ == "__main__":
111    main()
112