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