1"""
2Test some basic features of signature strings.
3"""
4from PyObjCTools.TestSupport import *
5import objc
6
7class PyOCTestTypeStr(TestCase):
8    def testSelectorSignatures(self):
9
10        self.assertIsInstance(
11                objc.selector(lambda x,y:1, signature=b"ii"),
12                objc.selector
13        )
14        self.assertIsInstance(
15                objc.selector(lambda x,y:1, argumentTypes="ii"),
16                objc.selector
17        )
18        self.assertIsInstance(
19                objc.selector(lambda x,y:1,
20                    argumentTypes="ii", returnType="s"),
21                objc.selector
22        )
23
24        self.assertRaises(ValueError, objc.selector, lambda x,y:1,
25                signature=b"FOOBAR")
26
27        self.assertRaises(TypeError, objc.selector, lambda x,y:1,
28                signature=b"@@", returnType="i")
29        self.assertRaises(TypeError, objc.selector, lambda x,y:1,
30                signature=b"@@", argumentTypes="ii")
31
32        self.assertRaises(ValueError, objc.selector, lambda x,y:1,
33                argumentTypes="iX")
34        self.assertRaises(ValueError, objc.selector, lambda x,y:1,
35                returnType="X")
36
37    def testArgumentTypesPythonStyle(self):
38        # Check that argumentTypes + returnType is correctly converted to
39        # a signature
40
41        s = objc.selector(lambda self: None, argumentTypes='ii', returnType='i')
42        self.assertEqual(s.signature, b'i@:ii')
43
44        s = objc.selector(lambda self: None, argumentTypes='Oi', returnType='i')
45        self.assertEqual(s.signature, b'i@:@i')
46
47        s = objc.selector(lambda self: None, argumentTypes='', returnType='l')
48        self.assertEqual(s.signature, objc._C_LNG + b'@:')
49
50        s = objc.selector(lambda self: None, argumentTypes='', returnType='f')
51        self.assertEqual(s.signature, objc._C_FLT + b'@:')
52
53        s = objc.selector(lambda self: None, argumentTypes='', returnType='d')
54        self.assertEqual(s.signature, objc._C_DBL + b'@:')
55
56        s = objc.selector(lambda self: None, argumentTypes='', returnType='i')
57        self.assertEqual(s.signature, objc._C_INT + b'@:')
58
59        s = objc.selector(lambda self: None, argumentTypes='', returnType='s')
60        self.assertEqual(s.signature, b'@@:')
61
62        s = objc.selector(lambda self: None, argumentTypes='', returnType='S')
63        self.assertEqual(s.signature, b'@@:')
64
65        s = objc.selector(lambda self: None, argumentTypes='', returnType='z')
66        self.assertEqual(s.signature, b'@@:')
67
68        s = objc.selector(lambda self: None, argumentTypes='zbhilcfdO', returnType='z')
69        self.assertEqual(s.signature, b'@@:@csilcfd@')
70
71
72    def testAll(self):
73        self.assertEqual(objc._C_BOOL, b"B")
74        self.assertEqual(objc._C_ID, b"@")
75        self.assertEqual(objc._C_CLASS, b"#")
76        self.assertEqual(objc._C_SEL, b":")
77        self.assertEqual(objc._C_CHR, b"c")
78        self.assertEqual(objc._C_UCHR, b"C")
79        self.assertEqual(objc._C_SHT, b"s")
80        self.assertEqual(objc._C_USHT, b"S")
81        self.assertEqual(objc._C_INT, b"i")
82        self.assertEqual(objc._C_UINT, b"I")
83        self.assertEqual(objc._C_LNG, b"l")
84        self.assertEqual(objc._C_ULNG, b"L")
85        self.assertEqual(objc._C_LNG_LNG, b"q")
86        self.assertEqual(objc._C_ULNG_LNG, b"Q")
87        self.assertEqual(objc._C_FLT, b"f")
88        self.assertEqual(objc._C_DBL, b"d")
89        self.assertEqual(objc._C_VOID, b"v")
90        self.assertEqual(objc._C_CHARPTR, b"*")
91        self.assertEqual(objc._C_PTR, b"^")
92        self.assertEqual(objc._C_UNDEF, b"?")
93        self.assertEqual(objc._C_ARY_B, b"[")
94        self.assertEqual(objc._C_ARY_E, b"]")
95        self.assertEqual(objc._C_UNION_B, b"(")
96        self.assertEqual(objc._C_UNION_E, b")")
97        self.assertEqual(objc._C_STRUCT_B, b"{")
98        self.assertEqual(objc._C_STRUCT_E, b"}")
99        self.assertEqual(objc._C_IN, b"n")
100        self.assertEqual(objc._C_OUT, b"o")
101        self.assertEqual(objc._C_INOUT, b"N")
102
103    def testNativeSignature(self):
104        s = objc.selector(lambda x,y:1, signature=b"ii")
105        self.assertEqual(s.native_signature, b"ii")
106
107        self.assertRaises((TypeError, AttributeError), setattr, s, 'native_signature', b'v@:ii')
108
109        s = objc.lookUpClass('NSObject').description
110        self.assertRaises((TypeError, AttributeError), setattr, s, 'native_signature', b'v@:ii')
111
112        # We know that the description signature isn't changed by default
113        self.assertEqual(s.signature, s.native_signature)
114
115        # Check that changing s.signature doesn't affect s.native_signature
116        try:
117            x = s.signature
118            s.signature = b'v@:ii'
119            self.assertEqual(s.native_signature, x)
120            self.assertEqual(s.signature, b'v@:ii')
121        finally:
122            s.signature = x
123
124
125if __name__ == '__main__':
126    main()
127