1"""
2Tests for the proxy of Python numbers
3
4NOTE: Decimal conversion is not tested, the required proxy is part of
5the Foundation bindings :-(
6"""
7import sys, os
8from PyObjCTools.TestSupport import *
9from PyObjCTest.fnd import NSNumber, NSNumberFormatter
10from PyObjCTest.pythonnumber import OC_TestNumber
11import objc
12
13OC_PythonNumber = objc.lookUpClass("OC_PythonNumber")
14NSCFNumber = objc.lookUpClass("NSCFNumber")
15
16NSOrderedAscending = -1
17NSOrderedSame = 0
18NSOrderedDescending = 1
19
20class TestNSNumber (TestCase):
21    # These testcases check the behaviour of NSNumber, these
22    # are mostly here to verify that NSNumbers behave as
23    # we expect them to.
24
25    def testClass(self):
26        for m in ('numberWithInt_', 'numberWithFloat_', 'numberWithDouble_', 'numberWithShort_'):
27            v = getattr(NSNumber, m)(0)
28            self.assertIsInstance(v, NSNumber)
29            self.assertIsNotInstance(v, OC_PythonNumber)
30            self.assertIs(OC_TestNumber.numberClass_(v), NSCFNumber)
31
32    def testShortConversions(self):
33        v = NSNumber.numberWithShort_(42)
34
35        self.assertEquals(OC_TestNumber.numberAsBOOL_(v), 1)
36        self.assertEquals(OC_TestNumber.numberAsChar_(v), 42)
37        self.assertEquals(OC_TestNumber.numberAsShort_(v), 42)
38        self.assertEquals(OC_TestNumber.numberAsInt_(v), 42)
39        self.assertEquals(OC_TestNumber.numberAsLong_(v), 42)
40        self.assertEquals(OC_TestNumber.numberAsLongLong_(v), 42)
41        self.assertEquals(OC_TestNumber.numberAsUnsignedChar_(v), 42)
42        self.assertEquals(OC_TestNumber.numberAsUnsignedShort_(v), 42)
43        self.assertEquals(OC_TestNumber.numberAsUnsignedInt_(v), 42)
44        self.assertEquals(OC_TestNumber.numberAsUnsignedLong_(v), 42)
45        self.assertEquals(OC_TestNumber.numberAsUnsignedLongLong_(v), 42)
46        self.assertEquals(OC_TestNumber.numberAsFloat_(v), 42.0)
47        self.assertEquals(OC_TestNumber.numberAsDouble_(v), 42.0)
48
49    def testIntConversions(self):
50        v = NSNumber.numberWithInt_(42)
51
52        self.assertEquals(OC_TestNumber.numberAsBOOL_(v), 1)
53        self.assertEquals(OC_TestNumber.numberAsChar_(v), 42)
54        self.assertEquals(OC_TestNumber.numberAsShort_(v), 42)
55        self.assertEquals(OC_TestNumber.numberAsInt_(v), 42)
56        self.assertEquals(OC_TestNumber.numberAsLong_(v), 42)
57        self.assertEquals(OC_TestNumber.numberAsLongLong_(v), 42)
58        self.assertEquals(OC_TestNumber.numberAsUnsignedChar_(v), 42)
59        self.assertEquals(OC_TestNumber.numberAsUnsignedShort_(v), 42)
60        self.assertEquals(OC_TestNumber.numberAsUnsignedInt_(v), 42)
61        self.assertEquals(OC_TestNumber.numberAsUnsignedLong_(v), 42)
62        self.assertEquals(OC_TestNumber.numberAsUnsignedLongLong_(v), 42)
63        self.assertEquals(OC_TestNumber.numberAsFloat_(v), 42.0)
64        self.assertEquals(OC_TestNumber.numberAsDouble_(v), 42.0)
65
66        # Negative values
67        v = NSNumber.numberWithInt_(-42)
68
69        self.assertEquals(OC_TestNumber.numberAsBOOL_(v), 1)
70        self.assertEquals(OC_TestNumber.numberAsChar_(v), -42)
71        self.assertEquals(OC_TestNumber.numberAsShort_(v), -42)
72        self.assertEquals(OC_TestNumber.numberAsInt_(v), -42)
73        self.assertEquals(OC_TestNumber.numberAsLong_(v), -42)
74        self.assertEquals(OC_TestNumber.numberAsLongLong_(v), -42)
75        self.assertEquals(OC_TestNumber.numberAsUnsignedChar_(v), 214)
76        self.assertEquals(OC_TestNumber.numberAsUnsignedShort_(v), 65494)
77        self.assertEquals(OC_TestNumber.numberAsUnsignedInt_(v), 4294967254)
78
79        if sys.maxint == (2 ** 31) -1:
80            self.assertEquals(OC_TestNumber.numberAsUnsignedLong_(v), 4294967254)
81        else:
82            self.assertEquals(OC_TestNumber.numberAsUnsignedLong_(v), 18446744073709551574)
83
84        self.assertEquals(OC_TestNumber.numberAsUnsignedLongLong_(v), 18446744073709551574)
85        self.assertEquals(OC_TestNumber.numberAsFloat_(v), -42.0)
86        self.assertEquals(OC_TestNumber.numberAsDouble_(v), -42.0)
87
88        # Overflow
89        v = NSNumber.numberWithInt_(892455)
90
91        self.assertEquals(OC_TestNumber.numberAsBOOL_(v), 1)
92        self.assertEquals(OC_TestNumber.numberAsChar_(v), 39)
93        self.assertEquals(OC_TestNumber.numberAsShort_(v), -25049)
94        self.assertEquals(OC_TestNumber.numberAsUnsignedChar_(v), 39)
95        self.assertEquals(OC_TestNumber.numberAsUnsignedShort_(v), 40487)
96
97    def testDoubleConversions(self):
98        v = NSNumber.numberWithDouble_(75.5)
99
100        self.assertEquals(OC_TestNumber.numberAsBOOL_(v), 1)
101        self.assertEquals(OC_TestNumber.numberAsChar_(v), 75)
102        self.assertEquals(OC_TestNumber.numberAsShort_(v), 75)
103        self.assertEquals(OC_TestNumber.numberAsInt_(v), 75)
104        self.assertEquals(OC_TestNumber.numberAsLong_(v), 75)
105        self.assertEquals(OC_TestNumber.numberAsLongLong_(v), 75)
106        self.assertEquals(OC_TestNumber.numberAsUnsignedChar_(v), 75)
107        self.assertEquals(OC_TestNumber.numberAsUnsignedShort_(v), 75)
108        self.assertEquals(OC_TestNumber.numberAsUnsignedInt_(v), 75)
109        self.assertEquals(OC_TestNumber.numberAsUnsignedLong_(v), 75)
110        self.assertEquals(OC_TestNumber.numberAsUnsignedLongLong_(v), 75)
111        self.assertEquals(OC_TestNumber.numberAsFloat_(v), 75.5)
112        self.assertEquals(OC_TestNumber.numberAsDouble_(v), 75.5)
113
114        # Negative values
115        v = NSNumber.numberWithDouble_(-127.6)
116
117        self.assertEquals(OC_TestNumber.numberAsBOOL_(v), 1)
118        self.assertEquals(OC_TestNumber.numberAsChar_(v), -127)
119        self.assertEquals(OC_TestNumber.numberAsShort_(v), -127)
120        self.assertEquals(OC_TestNumber.numberAsInt_(v), -127)
121        self.assertEquals(OC_TestNumber.numberAsLong_(v), -127)
122        self.assertEquals(OC_TestNumber.numberAsLongLong_(v), -127)
123        self.assertEquals(OC_TestNumber.numberAsUnsignedChar_(v), 129)
124        self.assertEquals(OC_TestNumber.numberAsUnsignedShort_(v), 65409)
125        self.assertEquals(OC_TestNumber.numberAsUnsignedInt_(v), 4294967169)
126
127        if sys.maxint == (2 ** 31) -1:
128            self.assertEquals(OC_TestNumber.numberAsUnsignedLong_(v), 4294967169)
129        else:
130            self.assertEquals(OC_TestNumber.numberAsUnsignedLong_(v), 18446744073709551488)
131
132        # The first entry in the tuple below is incorrect, that happens to be what
133        # is returned by NSNumber on some platforms (in particular, any Python where
134        # the python framework itself is linked against the 10.4 SDK)
135        #
136        #   double v = -127.6;
137        #   unsigned long long lv = v;
138        #   printf("%llu\n", lv);
139        #
140
141        self.assertIn(
142                OC_TestNumber.numberAsUnsignedLongLong_(v),
143                    (18446744073709551489, 18446744073709551488))
144
145        self.assertEquals(OC_TestNumber.numberAsDouble_(v), -127.6)
146
147        # Overflow
148        v = NSNumber.numberWithDouble_(float(2**64 + 99))
149
150        self.assertEquals(OC_TestNumber.numberAsBOOL_(v), 1)
151
152        if sys.byteorder == 'big':
153            self.assertEquals(OC_TestNumber.numberAsChar_(v), -1)
154            self.assertEquals(OC_TestNumber.numberAsShort_(v), -1)
155            self.assertEquals(OC_TestNumber.numberAsUnsignedChar_(v), 255)
156            self.assertEquals(OC_TestNumber.numberAsUnsignedShort_(v), 65535)
157        else:
158            self.assertEquals(OC_TestNumber.numberAsChar_(v), 0)
159            self.assertEquals(OC_TestNumber.numberAsShort_(v), 0)
160            self.assertEquals(OC_TestNumber.numberAsUnsignedChar_(v), 0)
161            self.assertEquals(OC_TestNumber.numberAsUnsignedShort_(v), 0)
162
163    def testCompare(self):
164        self.assertEquals(OC_TestNumber.compareA_andB_(NSNumber.numberWithLong_(0), NSNumber.numberWithLong_(1)), NSOrderedAscending)
165        self.assertEquals(OC_TestNumber.compareA_andB_(NSNumber.numberWithLong_(0), NSNumber.numberWithUnsignedLongLong_(2**40)), NSOrderedAscending)
166        self.assertEquals(OC_TestNumber.compareA_andB_(NSNumber.numberWithLong_(0), NSNumber.numberWithDouble_(42.0)), NSOrderedAscending)
167
168        self.assertEquals(OC_TestNumber.compareA_andB_(NSNumber.numberWithLong_(0), NSNumber.numberWithLong_(-1)), NSOrderedDescending)
169        self.assertEquals(OC_TestNumber.compareA_andB_(NSNumber.numberWithLong_(0), NSNumber.numberWithLongLong_(-2**60)), NSOrderedDescending)
170        self.assertEquals(OC_TestNumber.compareA_andB_(NSNumber.numberWithLong_(0), NSNumber.numberWithDouble_(-42.0)), NSOrderedDescending)
171
172        self.assertEquals(OC_TestNumber.compareA_andB_(NSNumber.numberWithLong_(0), NSNumber.numberWithLong_(0)), NSOrderedSame)
173        self.assertEquals(OC_TestNumber.compareA_andB_(NSNumber.numberWithLong_(0), NSNumber.numberWithDouble_(0.0)), NSOrderedSame)
174        self.assertEquals(OC_TestNumber.compareA_andB_(NSNumber.numberWithLong_(0), NSNumber.numberWithLongLong_(0)), NSOrderedSame)
175
176    def testDescription(self):
177        v = OC_TestNumber.numberDescription_(NSNumber.numberWithInt_(0))
178        self.assertIsInstance(v, unicode)
179        self.assertEquals(v, u"0")
180
181        v = OC_TestNumber.numberDescription_(NSNumber.numberWithLongLong_(2**60))
182        self.assertIsInstance(v, unicode)
183        self.assertEquals(v, unicode(str(2**60)))
184
185        v = OC_TestNumber.numberDescription_(NSNumber.numberWithLongLong_(-2**60))
186        self.assertIsInstance(v, unicode)
187        self.assertEquals(v, unicode(str(-2**60)))
188
189        v = OC_TestNumber.numberDescription_(NSNumber.numberWithDouble_(264.0))
190        self.assertIsInstance(v, unicode)
191        self.assertEquals(v, u"264")
192
193
194class TestPyNumber (TestCase):
195    # Basic tests of the proxy methods
196
197    def testClasses(self):
198        # Ensure that python numbers are proxied using the right proxy type
199        for v in (0, 1, 2**32+1, 2**64+1, 42.5):
200            self.assertIs(OC_TestNumber.numberClass_(v), OC_PythonNumber)
201
202        # The booleans True and False must be proxied as the corresponding
203        # NSNumber constants, otherwise lowlevel Cocoa/CoreFoundation code
204        # get's upset.
205        boolClass = objc.lookUpClass('NSCFBoolean')
206        for v in (True, False):
207            self.assertIs(OC_TestNumber.numberClass_(v), boolClass)
208            self.assertIs(objc.repythonify(v), v)
209
210
211    def testPythonIntConversions(self):
212        # Conversions to other values. Note that values are converted
213        # using C casts, without any exceptions when converting a
214        # negative value to an unsigned one and without exceptions for
215        # overflow.
216        v = 42
217
218        self.assertEquals(OC_TestNumber.numberAsBOOL_(v), 1)
219        self.assertEquals(OC_TestNumber.numberAsChar_(v), 42)
220        self.assertEquals(OC_TestNumber.numberAsShort_(v), 42)
221        self.assertEquals(OC_TestNumber.numberAsInt_(v), 42)
222        self.assertEquals(OC_TestNumber.numberAsLong_(v), 42)
223        self.assertEquals(OC_TestNumber.numberAsLongLong_(v), 42)
224        self.assertEquals(OC_TestNumber.numberAsUnsignedChar_(v), 42)
225        self.assertEquals(OC_TestNumber.numberAsUnsignedShort_(v), 42)
226        self.assertEquals(OC_TestNumber.numberAsUnsignedInt_(v), 42)
227        self.assertEquals(OC_TestNumber.numberAsUnsignedLong_(v), 42)
228        self.assertEquals(OC_TestNumber.numberAsUnsignedLongLong_(v), 42)
229        self.assertEquals(OC_TestNumber.numberAsUnsignedLongLong_(v), 42)
230        self.assertEquals(OC_TestNumber.numberAsFloat_(v), 42.0)
231        self.assertEquals(OC_TestNumber.numberAsDouble_(v), 42.0)
232
233        # Negative values
234        v = -42
235
236        self.assertEquals(OC_TestNumber.numberAsBOOL_(v), 1)
237        self.assertEquals(OC_TestNumber.numberAsChar_(v), -42)
238        self.assertEquals(OC_TestNumber.numberAsShort_(v), -42)
239        self.assertEquals(OC_TestNumber.numberAsInt_(v), -42)
240        self.assertEquals(OC_TestNumber.numberAsLong_(v), -42)
241        self.assertEquals(OC_TestNumber.numberAsLongLong_(v), -42)
242        self.assertEquals(OC_TestNumber.numberAsUnsignedChar_(v), 214)
243        self.assertEquals(OC_TestNumber.numberAsUnsignedShort_(v), 65494)
244        self.assertEquals(OC_TestNumber.numberAsUnsignedInt_(v), 4294967254)
245
246        if sys.maxint == (2 ** 31) -1:
247            self.assertEquals(OC_TestNumber.numberAsUnsignedLong_(v), 4294967254)
248        else:
249            self.assertEquals(OC_TestNumber.numberAsUnsignedLong_(v), 18446744073709551574)
250
251        self.assertEquals(OC_TestNumber.numberAsUnsignedLongLong_(v), 18446744073709551574)
252        self.assertEquals(OC_TestNumber.numberAsFloat_(v), -42.0)
253        self.assertEquals(OC_TestNumber.numberAsDouble_(v), -42.0)
254
255        # Overflow
256        v = 892455
257
258        self.assertEquals(OC_TestNumber.numberAsBOOL_(v), 1)
259        self.assertEquals(OC_TestNumber.numberAsChar_(v), 39)
260        self.assertEquals(OC_TestNumber.numberAsShort_(v), -25049)
261        self.assertEquals(OC_TestNumber.numberAsUnsignedChar_(v), 39)
262        self.assertEquals(OC_TestNumber.numberAsUnsignedShort_(v), 40487)
263
264    def testPythonLongConversions(self):
265        v = long(42)
266        self.assertIsInstance(v, long)
267
268        self.assertEquals(OC_TestNumber.numberAsBOOL_(v), 1)
269        self.assertEquals(OC_TestNumber.numberAsChar_(v), 42)
270        self.assertEquals(OC_TestNumber.numberAsShort_(v), 42)
271        self.assertEquals(OC_TestNumber.numberAsInt_(v), 42)
272        self.assertEquals(OC_TestNumber.numberAsLong_(v), 42)
273        self.assertEquals(OC_TestNumber.numberAsLongLong_(v), 42)
274        self.assertEquals(OC_TestNumber.numberAsUnsignedChar_(v), 42)
275        self.assertEquals(OC_TestNumber.numberAsUnsignedShort_(v), 42)
276        self.assertEquals(OC_TestNumber.numberAsUnsignedInt_(v), 42)
277        self.assertEquals(OC_TestNumber.numberAsUnsignedLong_(v), 42)
278        self.assertEquals(OC_TestNumber.numberAsUnsignedLongLong_(v), 42)
279        self.assertEquals(OC_TestNumber.numberAsUnsignedLongLong_(v), 42)
280        self.assertEquals(OC_TestNumber.numberAsFloat_(v), 42.0)
281        self.assertEquals(OC_TestNumber.numberAsDouble_(v), 42.0)
282
283        # Negative values
284        v = long(-42)
285        self.assertIsInstance(v, long)
286
287        self.assertEquals(OC_TestNumber.numberAsBOOL_(v), 1)
288        self.assertEquals(OC_TestNumber.numberAsChar_(v), -42)
289        self.assertEquals(OC_TestNumber.numberAsShort_(v), -42)
290        self.assertEquals(OC_TestNumber.numberAsInt_(v), -42)
291        self.assertEquals(OC_TestNumber.numberAsLong_(v), -42)
292        self.assertEquals(OC_TestNumber.numberAsLongLong_(v), -42)
293        self.assertEquals(OC_TestNumber.numberAsUnsignedChar_(v), 214)
294        self.assertEquals(OC_TestNumber.numberAsUnsignedShort_(v), 65494)
295        self.assertEquals(OC_TestNumber.numberAsUnsignedInt_(v), 4294967254)
296
297        if sys.maxint == (2 ** 31) -1:
298            self.assertEquals(OC_TestNumber.numberAsUnsignedLong_(v), 4294967254)
299        else:
300            self.assertEquals(OC_TestNumber.numberAsUnsignedLong_(v), 18446744073709551574)
301
302        self.assertEquals(OC_TestNumber.numberAsUnsignedLongLong_(v), 18446744073709551574)
303        self.assertEquals(OC_TestNumber.numberAsFloat_(v), -42.0)
304        self.assertEquals(OC_TestNumber.numberAsDouble_(v), -42.0)
305
306        # Overflow
307        v = long(892455)
308        self.assertIsInstance(v, long)
309
310        self.assertEquals(OC_TestNumber.numberAsBOOL_(v), 1)
311        self.assertEquals(OC_TestNumber.numberAsChar_(v), 39)
312        self.assertEquals(OC_TestNumber.numberAsShort_(v), -25049)
313        self.assertEquals(OC_TestNumber.numberAsUnsignedChar_(v), 39)
314        self.assertEquals(OC_TestNumber.numberAsUnsignedShort_(v), 40487)
315
316        # Very much overflow
317        v = 2 ** 64 + 1
318        self.assertEquals(OC_TestNumber.numberAsBOOL_(v), 1)
319        self.assertEquals(OC_TestNumber.numberAsChar_(v), 1)
320        self.assertEquals(OC_TestNumber.numberAsShort_(v), 1)
321        self.assertEquals(OC_TestNumber.numberAsInt_(v), 1)
322        self.assertEquals(OC_TestNumber.numberAsLong_(v), 1)
323        self.assertEquals(OC_TestNumber.numberAsLongLong_(v), 1)
324        self.assertEquals(OC_TestNumber.numberAsUnsignedChar_(v), 1)
325        self.assertEquals(OC_TestNumber.numberAsUnsignedShort_(v), 1)
326        self.assertEquals(OC_TestNumber.numberAsUnsignedInt_(v), 1)
327        self.assertEquals(OC_TestNumber.numberAsUnsignedLong_(v), 1)
328        self.assertEquals(OC_TestNumber.numberAsUnsignedLongLong_(v), 1)
329
330    def testDoubleConversions(self):
331        v = 75.5
332
333        self.assertEquals(OC_TestNumber.numberAsBOOL_(v), 1)
334        self.assertEquals(OC_TestNumber.numberAsChar_(v), 75)
335        self.assertEquals(OC_TestNumber.numberAsShort_(v), 75)
336        self.assertEquals(OC_TestNumber.numberAsInt_(v), 75)
337        self.assertEquals(OC_TestNumber.numberAsLong_(v), 75)
338        self.assertEquals(OC_TestNumber.numberAsLongLong_(v), 75)
339        self.assertEquals(OC_TestNumber.numberAsUnsignedChar_(v), 75)
340        self.assertEquals(OC_TestNumber.numberAsUnsignedShort_(v), 75)
341        self.assertEquals(OC_TestNumber.numberAsUnsignedInt_(v), 75)
342        self.assertEquals(OC_TestNumber.numberAsUnsignedLong_(v), 75)
343        self.assertEquals(OC_TestNumber.numberAsUnsignedLongLong_(v), 75)
344        self.assertEquals(OC_TestNumber.numberAsFloat_(v), 75.5)
345        self.assertEquals(OC_TestNumber.numberAsDouble_(v), 75.5)
346
347        # Negative values
348        v = -127.6
349
350        self.assertEquals(OC_TestNumber.numberAsBOOL_(v), 1)
351        self.assertEquals(OC_TestNumber.numberAsChar_(v), -127)
352        self.assertEquals(OC_TestNumber.numberAsShort_(v), -127)
353        self.assertEquals(OC_TestNumber.numberAsInt_(v), -127)
354        self.assertEquals(OC_TestNumber.numberAsLong_(v), -127)
355        self.assertEquals(OC_TestNumber.numberAsLongLong_(v), -127)
356        self.assertEquals(OC_TestNumber.numberAsUnsignedChar_(v), 129)
357        self.assertEquals(OC_TestNumber.numberAsUnsignedShort_(v), 65409)
358        self.assertEquals(OC_TestNumber.numberAsUnsignedInt_(v), 4294967169)
359
360        if sys.maxint == (2 ** 31) -1:
361            self.assertEquals(OC_TestNumber.numberAsUnsignedLong_(v), 4294967169)
362        else:
363            self.assertEquals(OC_TestNumber.numberAsUnsignedLong_(v), 18446744073709551489)
364
365        if sys.byteorder == 'big':
366            self.assertEquals(OC_TestNumber.numberAsUnsignedLongLong_(v), 4294967169)
367        else:
368            self.assertEquals(OC_TestNumber.numberAsUnsignedLongLong_(v), 18446744073709551489)
369
370        self.assertEquals(OC_TestNumber.numberAsDouble_(v), -127.6)
371
372        # Overflow
373        v = float(2**64 + 99)
374
375        self.assertEquals(OC_TestNumber.numberAsBOOL_(v), 1)
376
377        if sys.byteorder == 'big':
378            self.assertEquals(OC_TestNumber.numberAsChar_(v), -1)
379            self.assertEquals(OC_TestNumber.numberAsShort_(v), -1)
380            self.assertEquals(OC_TestNumber.numberAsUnsignedChar_(v), 255)
381            self.assertEquals(OC_TestNumber.numberAsUnsignedShort_(v), 65535)
382        else:
383            self.assertEquals(OC_TestNumber.numberAsChar_(v), 0)
384            self.assertEquals(OC_TestNumber.numberAsShort_(v), 0)
385            self.assertEquals(OC_TestNumber.numberAsUnsignedChar_(v), 0)
386            self.assertEquals(OC_TestNumber.numberAsUnsignedShort_(v), 0)
387
388    def testCompare(self):
389        self.assertEquals(OC_TestNumber.compareA_andB_(0, 1), NSOrderedAscending)
390        self.assertEquals(OC_TestNumber.compareA_andB_(0, 2**64), NSOrderedAscending)
391        self.assertEquals(OC_TestNumber.compareA_andB_(0, 42.0), NSOrderedAscending)
392
393        self.assertEquals(OC_TestNumber.compareA_andB_(0, -1), NSOrderedDescending)
394        self.assertEquals(OC_TestNumber.compareA_andB_(0, -2**64), NSOrderedDescending)
395        self.assertEquals(OC_TestNumber.compareA_andB_(0, -42.0), NSOrderedDescending)
396
397        self.assertEquals(OC_TestNumber.compareA_andB_(0, 0), NSOrderedSame)
398        self.assertEquals(OC_TestNumber.compareA_andB_(0, 0.0), NSOrderedSame)
399        self.assertEquals(OC_TestNumber.compareA_andB_(0, long(0)), NSOrderedSame)
400
401    def testNumberEqual(self):
402        self.assertFalse(OC_TestNumber.number_isEqualTo_(0, 1))
403        self.assertFalse(OC_TestNumber.number_isEqualTo_(0, 2**64))
404        self.assertFalse(OC_TestNumber.number_isEqualTo_(0, 42.0))
405
406        self.assertFalse(OC_TestNumber.number_isEqualTo_(0, -1))
407        self.assertFalse(OC_TestNumber.number_isEqualTo_(0, -2**64))
408        self.assertFalse(OC_TestNumber.number_isEqualTo_(0, -42.0))
409
410        self.assertTrue(OC_TestNumber.number_isEqualTo_(0, 0))
411        self.assertTrue(OC_TestNumber.number_isEqualTo_(0, 0.0))
412        self.assertTrue(OC_TestNumber.number_isEqualTo_(0, long(0)))
413
414    def testDescription(self):
415        v = OC_TestNumber.numberDescription_(0)
416        self.assertIsInstance(v, unicode)
417        self.assertEquals(v, u"0")
418
419        v = OC_TestNumber.numberDescription_(2**64)
420        self.assertIsInstance(v, unicode)
421        self.assertEquals(v, unicode(repr(2**64)))
422
423        v = OC_TestNumber.numberDescription_(-2**64)
424        self.assertIsInstance(v, unicode)
425        self.assertEquals(v, unicode(repr(-2**64)))
426
427        v = OC_TestNumber.numberDescription_(264.0)
428        self.assertIsInstance(v, unicode)
429        self.assertEquals(v, u"264.0")
430
431        v = OC_TestNumber.numberDescription_(False)
432        self.assertIsInstance(v, unicode)
433        self.assertEquals(v, u"0")
434
435        v = OC_TestNumber.numberDescription_(True)
436        self.assertIsInstance(v, unicode)
437        self.assertEquals(v, u"1")
438
439class TestInteractions (TestCase):
440    # Test interactions between Python and NSNumber numbers
441
442    def testMixedCompare(self):
443        # compare for:
444        #   - python number to nsnumber
445        #   - nsnumber to python number
446        # For: (bool, int, long, float) vs (char, short, ...)
447        methods = [
448                'numberWithInt_',
449                'numberWithChar_',
450                'numberWithLong_',
451                'numberWithDouble_',
452            ]
453
454        self.assertEqual(OC_TestNumber.compareA_andB_(42, 42), NSOrderedSame)
455        for m in methods:
456            self.assertEqual(OC_TestNumber.compareA_andB_(getattr(NSNumber, m)(42), 42), NSOrderedSame)
457            self.assertEqual(OC_TestNumber.compareA_andB_(42, getattr(NSNumber, m)(42)), NSOrderedSame)
458
459        self.assertEqual(OC_TestNumber.compareA_andB_(42, 99), NSOrderedAscending)
460        for m in methods:
461            self.assertEqual(OC_TestNumber.compareA_andB_(getattr(NSNumber, m)(42), 99), NSOrderedAscending)
462            self.assertEqual(OC_TestNumber.compareA_andB_(42, getattr(NSNumber, m)(99)), NSOrderedAscending)
463
464    def testMixedEquals(self):
465        # isEqualToNumber for:
466        #   - python number to nsnumber
467        #   - nsnumber to python number
468        # For: (bool, int, long, float) vs (char, short, ...)
469        self.assertTrue(OC_TestNumber.number_isEqualTo_(0, NSNumber.numberWithInt_(0)))
470        self.assertTrue(OC_TestNumber.number_isEqualTo_(0, NSNumber.numberWithLong_(0)))
471        self.assertTrue(OC_TestNumber.number_isEqualTo_(0, NSNumber.numberWithFloat_(0)))
472        self.assertTrue(OC_TestNumber.number_isEqualTo_(NSNumber.numberWithInt_(0), 0))
473        self.assertTrue(OC_TestNumber.number_isEqualTo_(NSNumber.numberWithLong_(0), 0))
474        self.assertTrue(OC_TestNumber.number_isEqualTo_(NSNumber.numberWithFloat_(0), 0))
475
476        self.assertFalse(OC_TestNumber.number_isEqualTo_(42, NSNumber.numberWithInt_(0)))
477        self.assertFalse(OC_TestNumber.number_isEqualTo_(42, NSNumber.numberWithLong_(0)))
478        self.assertFalse(OC_TestNumber.number_isEqualTo_(42, NSNumber.numberWithFloat_(0)))
479        self.assertFalse(OC_TestNumber.number_isEqualTo_(NSNumber.numberWithInt_(0), 42))
480        self.assertFalse(OC_TestNumber.number_isEqualTo_(NSNumber.numberWithLong_(0), 42))
481        self.assertFalse(OC_TestNumber.number_isEqualTo_(NSNumber.numberWithFloat_(0), 42))
482
483
484class TestNumberFormatter (TestCase):
485    # Test behaviour of an NSNumberFormatter, both with
486    # Python numbers and NSNumbers
487    def testFormatting(self):
488        formatter = NSNumberFormatter.alloc().init()
489
490        n = NSNumber.numberWithInt_(42)
491        p = 42
492        self.assertEquals(formatter.stringForObjectValue_(n), formatter.stringForObjectValue_(p))
493
494        n = NSNumber.numberWithInt_(-42)
495        p = -42
496        self.assertEquals(formatter.stringForObjectValue_(n), formatter.stringForObjectValue_(p))
497
498
499        n = NSNumber.numberWithDouble_(10.42)
500        p = 10.42
501        self.assertEquals(formatter.stringForObjectValue_(n), formatter.stringForObjectValue_(p))
502
503if __name__ == "__main__":
504    main()
505