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.assertEquals(v, 42)
13
14        ok, v = CFNumberGetValue(number, kCFNumberSInt16Type, None);
15        self.assert_(ok)
16        self.assert_(isinstance(v, (int, long)))
17        self.assertEquals(v, 42)
18
19        ok, v = CFNumberGetValue(number, kCFNumberSInt32Type, None);
20        self.assert_(ok)
21        self.assert_(isinstance(v, (int, long)))
22        self.assertEquals(v, 42)
23
24        ok, v = CFNumberGetValue(number, kCFNumberSInt64Type, None);
25        self.assert_(ok)
26        self.assert_(isinstance(v, (int, long)))
27        self.assertEquals(v, 42)
28
29        ok, v = CFNumberGetValue(number, kCFNumberCharType, None);
30        self.assert_(ok)
31        self.assert_(isinstance(v, (int, long)))
32        self.assertEquals(v, 42)
33
34        ok, v = CFNumberGetValue(number, kCFNumberShortType, None);
35        self.assert_(ok)
36        self.assert_(isinstance(v, (int, long)))
37        self.assertEquals(v, 42)
38
39        ok, v = CFNumberGetValue(number, kCFNumberIntType, None);
40        self.assert_(ok)
41        self.assert_(isinstance(v, (int, long)))
42        self.assertEquals(v, 42)
43
44        ok, v = CFNumberGetValue(number, kCFNumberLongType, None);
45        self.assert_(ok)
46        self.assert_(isinstance(v, (int, long)))
47        self.assertEquals(v, 42)
48
49        ok, v = CFNumberGetValue(number, kCFNumberLongLongType, None);
50        self.assert_(ok)
51        self.assert_(isinstance(v, (int, long)))
52        self.assertEquals(v, 42)
53
54        ok, v = CFNumberGetValue(number, kCFNumberCFIndexType, None);
55        self.assert_(ok)
56        self.assert_(isinstance(v, (int, long)))
57        self.assertEquals(v, 42)
58
59        ok, v = CFNumberGetValue(number, kCFNumberFloat32Type, None)
60        self.assert_(ok)
61        self.assert_(isinstance(v, float))
62        self.assertEquals(v, 42.0)
63
64        ok, v = CFNumberGetValue(number, kCFNumberFloat64Type, None)
65        self.assert_(ok)
66        self.assert_(isinstance(v, float))
67        self.assertEquals(v, 42.0)
68
69        ok, v = CFNumberGetValue(number, kCFNumberFloatType, None)
70        self.assert_(ok)
71        self.assert_(isinstance(v, float))
72        self.assertEquals(v, 42.0)
73
74        ok, v = CFNumberGetValue(number, kCFNumberDoubleType, None)
75        self.assert_(ok)
76        self.assert_(isinstance(v, float))
77        self.assertEquals(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.failUnless(isinstance(CFBooleanGetTypeID(), (int, long)))
87
88        self.failUnless(CFBooleanGetValue(kCFBooleanTrue) is True)
89        self.failUnless(CFBooleanGetValue(kCFBooleanFalse) is False)
90        self.failUnless(CFBooleanGetValue(True))
91        self.failIf(CFBooleanGetValue(False))
92
93    def no_testNumber(self):
94        self.failUnless(isinstance(CFNumberGetTypeID(), (int, long)))
95
96        # Add cases for all number types
97        num = CFNumberCreate(None, kCFNumberSInt8Type, 1)
98        self.failUnless(isinstance(num, CFNumberRef))
99        self.failIf(CFNumberIsFloatType(num))
100        self.failUnless(num == 1)
101
102        num = CFNumberCreate(None, kCFNumberSInt8Type, 1)
103        self.failUnless(isinstance(num, CFNumberRef))
104        self.failIf(CFNumberIsFloatType(num))
105        self.failUnless(num == 1)
106
107        num = CFNumberCreate(None, kCFNumberSInt16Type, 1)
108        self.failUnless(isinstance(num, CFNumberRef))
109        self.failIf(CFNumberIsFloatType(num))
110        self.failUnless(num == 1)
111
112        num = CFNumberCreate(None, kCFNumberSInt32Type, 1)
113        self.failUnless(isinstance(num, CFNumberRef))
114        self.failIf(CFNumberIsFloatType(num))
115        self.failUnless(num == 1)
116
117        num = CFNumberCreate(None, kCFNumberSInt64Type, 1)
118        self.failUnless(isinstance(num, CFNumberRef))
119        self.failIf(CFNumberIsFloatType(num))
120        self.failUnless(num == 1)
121
122        num = CFNumberCreate(None, kCFNumberFloat32Type, 1)
123        self.failUnless(isinstance(num, CFNumberRef))
124        self.failUnless(CFNumberIsFloatType(num))
125        self.failUnless(num == 1)
126
127        num = CFNumberCreate(None, kCFNumberFloat64Type, 1)
128        self.failUnless(isinstance(num, CFNumberRef))
129        self.failUnless(CFNumberIsFloatType(num))
130        self.failUnless(num == 1)
131
132        num = CFNumberCreate(None, kCFNumberCharType, 1)
133        self.failUnless(isinstance(num, CFNumberRef))
134        self.failIf(CFNumberIsFloatType(num))
135        self.failUnless(num == 1)
136
137        num = CFNumberCreate(None, kCFNumberShortType, 1)
138        self.failUnless(isinstance(num, CFNumberRef))
139        self.failIf(CFNumberIsFloatType(num))
140        self.failUnless(num == 1)
141
142        num = CFNumberCreate(None, kCFNumberIntType, 1)
143        self.failUnless(isinstance(num, CFNumberRef))
144        self.failIf(CFNumberIsFloatType(num))
145        self.failUnless(num == 1)
146
147        num = CFNumberCreate(None, kCFNumberLongType, 1)
148        self.failUnless(isinstance(num, CFNumberRef))
149        self.failIf(CFNumberIsFloatType(num))
150        self.failUnless(num == 1)
151
152        num = CFNumberCreate(None, kCFNumberLongLongType, 1)
153        self.failUnless(isinstance(num, CFNumberRef))
154        self.failIf(CFNumberIsFloatType(num))
155        self.failUnless(num == 1)
156
157        num = CFNumberCreate(None, kCFNumberFloatType, 1)
158        self.failUnless(isinstance(num, CFNumberRef))
159        self.failUnless(CFNumberIsFloatType(num))
160        self.failUnless(num == 1)
161
162        num = CFNumberCreate(None, kCFNumberDoubleType, 1)
163        self.failUnless(isinstance(num, CFNumberRef))
164        self.failUnless(CFNumberIsFloatType(num))
165        self.failUnless(num == 1)
166
167        num = CFNumberCreate(None, kCFNumberCFIndexType, 1)
168        self.failUnless(isinstance(num, CFNumberRef))
169        self.failIf(CFNumberIsFloatType(num))
170        self.failUnless(num == 1)
171
172        num = CFNumberCreate(None, kCFNumberNSIntegerType, 1)
173        self.failUnless(isinstance(num, CFNumberRef))
174        self.failIf(CFNumberIsFloatType(num))
175        self.failUnless(num == 1)
176
177        num = CFNumberCreate(None, kCFNumberCGFloatType, 1)
178        self.failUnless(isinstance(num, CFNumberRef))
179        self.failUnless(CFNumberIsFloatType(num))
180        self.failUnless(num == 1)
181
182
183
184    def testNumberTypes(self):
185        v = CFNumberGetType(44)
186        self.failUnless(v == kCFNumberLongType)
187
188        v = CFNumberGetType(2.5)
189        self.failUnless(v == kCFNumberDoubleType)
190
191        v = CFNumberGetByteSize(44)
192        if sys.maxint > 2 ** 32:
193            self.failUnless(v == 8)
194        else:
195            self.failUnless(v == 4)
196
197        v = CFNumberGetByteSize(44.0)
198        self.failUnless(v == 8)
199
200        self.failIf(CFNumberIsFloatType(44))
201        self.failUnless(CFNumberIsFloatType(1.0))
202
203        r = CFNumberCompare(44, 45, 0)
204        self.failUnless(r < 0)
205
206
207    def testConstants(self):
208        self.failUnless(kCFBooleanTrue is True)
209        self.failUnless(kCFBooleanFalse is False)
210
211        self.failUnless(kCFNumberSInt8Type == 1)
212        self.failUnless(kCFNumberSInt16Type == 2)
213        self.failUnless(kCFNumberSInt32Type == 3)
214        self.failUnless(kCFNumberSInt64Type == 4)
215        self.failUnless(kCFNumberFloat32Type == 5)
216        self.failUnless(kCFNumberFloat64Type == 6)
217        self.failUnless(kCFNumberCharType == 7)
218        self.failUnless(kCFNumberShortType == 8)
219        self.failUnless(kCFNumberIntType == 9)
220        self.failUnless(kCFNumberLongType == 10)
221        self.failUnless(kCFNumberLongLongType == 11)
222        self.failUnless(kCFNumberFloatType == 12)
223        self.failUnless(kCFNumberDoubleType == 13)
224        self.failUnless(kCFNumberCFIndexType == 14)
225        self.failUnless(kCFNumberNSIntegerType == 15)
226        self.failUnless(kCFNumberCGFloatType == 16)
227        self.failUnless(kCFNumberMaxType == 16)
228
229        self.failUnless(isinstance(kCFNumberPositiveInfinity, float))
230        self.failUnless(isinstance(kCFNumberNegativeInfinity, float))
231        self.failUnless(isinstance(kCFNumberNaN, float))
232
233
234if __name__ == "__main__":
235    main()
236