1from PyObjCTools.TestSupport import *
2import sys
3from CoreFoundation import *
4
5class TestCFNumber (TestCase):
6    def testCFNumberGetValue(self):
7        number = 42
8
9        ok, v = CFNumberGetValue(number, kCFNumberSInt8Type, None);
10        self.assert_(ok)
11        self.assert_(isinstance(v, (int, long)))
12        self.assertEqual(v, 42)
13
14        ok, v = CFNumberGetValue(number, kCFNumberSInt16Type, None);
15        self.assert_(ok)
16        self.assert_(isinstance(v, (int, long)))
17        self.assertEqual(v, 42)
18
19        ok, v = CFNumberGetValue(number, kCFNumberSInt32Type, None);
20        self.assert_(ok)
21        self.assert_(isinstance(v, (int, long)))
22        self.assertEqual(v, 42)
23
24        ok, v = CFNumberGetValue(number, kCFNumberSInt64Type, None);
25        self.assert_(ok)
26        self.assert_(isinstance(v, (int, long)))
27        self.assertEqual(v, 42)
28
29        ok, v = CFNumberGetValue(number, kCFNumberCharType, None);
30        self.assert_(ok)
31        self.assert_(isinstance(v, (int, long)))
32        self.assertEqual(v, 42)
33
34        ok, v = CFNumberGetValue(number, kCFNumberShortType, None);
35        self.assert_(ok)
36        self.assert_(isinstance(v, (int, long)))
37        self.assertEqual(v, 42)
38
39        ok, v = CFNumberGetValue(number, kCFNumberIntType, None);
40        self.assert_(ok)
41        self.assert_(isinstance(v, (int, long)))
42        self.assertEqual(v, 42)
43
44        ok, v = CFNumberGetValue(number, kCFNumberLongType, None);
45        self.assert_(ok)
46        self.assert_(isinstance(v, (int, long)))
47        self.assertEqual(v, 42)
48
49        ok, v = CFNumberGetValue(number, kCFNumberLongLongType, None);
50        self.assert_(ok)
51        self.assert_(isinstance(v, (int, long)))
52        self.assertEqual(v, 42)
53
54        ok, v = CFNumberGetValue(number, kCFNumberCFIndexType, None);
55        self.assert_(ok)
56        self.assert_(isinstance(v, (int, long)))
57        self.assertEqual(v, 42)
58
59        ok, v = CFNumberGetValue(number, kCFNumberFloat32Type, None)
60        self.assert_(ok)
61        self.assert_(isinstance(v, float))
62        self.assertEqual(v, 42.0)
63
64        ok, v = CFNumberGetValue(number, kCFNumberFloat64Type, None)
65        self.assert_(ok)
66        self.assert_(isinstance(v, float))
67        self.assertEqual(v, 42.0)
68
69        ok, v = CFNumberGetValue(number, kCFNumberFloatType, None)
70        self.assert_(ok)
71        self.assert_(isinstance(v, float))
72        self.assertEqual(v, 42.0)
73
74        ok, v = CFNumberGetValue(number, kCFNumberDoubleType, None)
75        self.assert_(ok)
76        self.assert_(isinstance(v, float))
77        self.assertEqual(v, 42.0)
78
79        ## Don't test this, the wrapper shouldn't range-check
80        ## arguments and CFNumberGetValue will crash when the
81        ## number type is invalid
82        #ok, v = CFNumberGetValue(number, kCFNumberMaxType+2)
83        #self.assert_(not ok)
84
85    def testBoolean(self):
86        self.assertIsInstance(CFBooleanGetTypeID(), (int, long))
87        self.assertIs(CFBooleanGetValue(kCFBooleanTrue), True)
88        self.assertIs(CFBooleanGetValue(kCFBooleanFalse), False)
89        self.assertTrue(CFBooleanGetValue(True))
90        self.assertFalse(CFBooleanGetValue(False))
91
92    def no_testNumber(self):
93        self.assertIsInstance(CFNumberGetTypeID(), (int, long))
94        # Add cases for all number types
95        num = CFNumberCreate(None, kCFNumberSInt8Type, 1)
96        self.assertIsInstance(num, CFNumberRef)
97        self.assertFalse(CFNumberIsFloatType(num))
98        self.assertEqual(num , 1)
99        num = CFNumberCreate(None, kCFNumberSInt8Type, 1)
100        self.assertIsInstance(num, CFNumberRef)
101        self.assertFalse(CFNumberIsFloatType(num))
102        self.assertEqual(num , 1)
103        num = CFNumberCreate(None, kCFNumberSInt16Type, 1)
104        self.assertIsInstance(num, CFNumberRef)
105        self.assertFalse(CFNumberIsFloatType(num))
106        self.assertEqual(num , 1)
107        num = CFNumberCreate(None, kCFNumberSInt32Type, 1)
108        self.assertIsInstance(num, CFNumberRef)
109        self.assertFalse(CFNumberIsFloatType(num))
110        self.assertEqual(num , 1)
111        num = CFNumberCreate(None, kCFNumberSInt64Type, 1)
112        self.assertIsInstance(num, CFNumberRef)
113        self.assertFalse(CFNumberIsFloatType(num))
114        self.assertEqual(num , 1)
115        num = CFNumberCreate(None, kCFNumberFloat32Type, 1)
116        self.assertIsInstance(num, CFNumberRef)
117        self.assertTrue(CFNumberIsFloatType(num))
118        self.assertEqual(num , 1)
119        num = CFNumberCreate(None, kCFNumberFloat64Type, 1)
120        self.assertIsInstance(num, CFNumberRef)
121        self.assertTrue(CFNumberIsFloatType(num))
122        self.assertEqual(num , 1)
123        num = CFNumberCreate(None, kCFNumberCharType, 1)
124        self.assertIsInstance(num, CFNumberRef)
125        self.assertFalse(CFNumberIsFloatType(num))
126        self.assertEqual(num , 1)
127        num = CFNumberCreate(None, kCFNumberShortType, 1)
128        self.assertIsInstance(num, CFNumberRef)
129        self.assertFalse(CFNumberIsFloatType(num))
130        self.assertEqual(num , 1)
131        num = CFNumberCreate(None, kCFNumberIntType, 1)
132        self.assertIsInstance(num, CFNumberRef)
133        self.assertFalse(CFNumberIsFloatType(num))
134        self.assertEqual(num , 1)
135        num = CFNumberCreate(None, kCFNumberLongType, 1)
136        self.assertIsInstance(num, CFNumberRef)
137        self.assertFalse(CFNumberIsFloatType(num))
138        self.assertEqual(num , 1)
139        num = CFNumberCreate(None, kCFNumberLongLongType, 1)
140        self.assertIsInstance(num, CFNumberRef)
141        self.assertFalse(CFNumberIsFloatType(num))
142        self.assertEqual(num , 1)
143        num = CFNumberCreate(None, kCFNumberFloatType, 1)
144        self.assertIsInstance(num, CFNumberRef)
145        self.assertTrue(CFNumberIsFloatType(num))
146        self.assertEqual(num , 1)
147        num = CFNumberCreate(None, kCFNumberDoubleType, 1)
148        self.assertIsInstance(num, CFNumberRef)
149        self.assertTrue(CFNumberIsFloatType(num))
150        self.assertEqual(num , 1)
151        num = CFNumberCreate(None, kCFNumberCFIndexType, 1)
152        self.assertIsInstance(num, CFNumberRef)
153        self.assertFalse(CFNumberIsFloatType(num))
154        self.assertEqual(num , 1)
155        num = CFNumberCreate(None, kCFNumberNSIntegerType, 1)
156        self.assertIsInstance(num, CFNumberRef)
157        self.assertFalse(CFNumberIsFloatType(num))
158        self.assertEqual(num , 1)
159        num = CFNumberCreate(None, kCFNumberCGFloatType, 1)
160        self.assertIsInstance(num, CFNumberRef)
161        self.assertTrue(CFNumberIsFloatType(num))
162        self.assertEqual(num , 1)
163
164    def testNumberTypes(self):
165        v = CFNumberGetType(44)
166        self.assertIsIn(v, (kCFNumberLongLongType, kCFNumberLongType))
167        v = CFNumberGetType(2.5)
168        self.assertEqual(v , kCFNumberDoubleType)
169        v = CFNumberGetByteSize(44)
170
171        if sys.maxint >= 2**32:
172            self.assertEqual(v , 8)
173        else:
174            self.assertEqual(v , 4)
175        v = CFNumberGetByteSize(44.0)
176        self.assertEqual(v , 8)
177        self.assertFalse(CFNumberIsFloatType(44))
178        self.assertTrue(CFNumberIsFloatType(1.0))
179
180        r = CFNumberCompare(44, 45, 0)
181        self.assertLessThan(r , 0)
182    def testConstants(self):
183        self.assertIs(kCFBooleanTrue, True)
184        self.assertIs(kCFBooleanFalse, False)
185        self.assertEqual(kCFNumberSInt8Type , 1)
186        self.assertEqual(kCFNumberSInt16Type , 2)
187        self.assertEqual(kCFNumberSInt32Type , 3)
188        self.assertEqual(kCFNumberSInt64Type , 4)
189        self.assertEqual(kCFNumberFloat32Type , 5)
190        self.assertEqual(kCFNumberFloat64Type , 6)
191        self.assertEqual(kCFNumberCharType , 7)
192        self.assertEqual(kCFNumberShortType , 8)
193        self.assertEqual(kCFNumberIntType , 9)
194        self.assertEqual(kCFNumberLongType , 10)
195        self.assertEqual(kCFNumberLongLongType , 11)
196        self.assertEqual(kCFNumberFloatType , 12)
197        self.assertEqual(kCFNumberDoubleType , 13)
198        self.assertEqual(kCFNumberCFIndexType , 14)
199        self.assertEqual(kCFNumberNSIntegerType , 15)
200        self.assertEqual(kCFNumberCGFloatType , 16)
201        self.assertEqual(kCFNumberMaxType , 16)
202        self.assertIsInstance(kCFNumberPositiveInfinity, float)
203        self.assertIsInstance(kCFNumberNegativeInfinity, float)
204        self.assertIsInstance(kCFNumberNaN, float)
205if __name__ == "__main__":
206    main()
207