"""
Tests for the proxy of Python numbers

NOTE: Decimal conversion is not tested, the required proxy is part of 
the Foundation bindings :-(
"""
import sys, os
from PyObjCTools.TestSupport import *
from PyObjCTest.fnd import NSNumber, NSNumberFormatter
from PyObjCTest.pythonnumber import OC_TestNumber
import objc

OC_PythonNumber = objc.lookUpClass("OC_PythonNumber")
NSCFNumber = objc.lookUpClass("NSCFNumber")

NSOrderedAscending = -1
NSOrderedSame = 0
NSOrderedDescending = 1

class TestNSNumber (TestCase):
    # These testcases check the behaviour of NSNumber, these
    # are mostly here to verify that NSNumbers behave as
    # we expect them to.

    def testClass(self):
        for m in ('numberWithInt_', 'numberWithFloat_', 'numberWithDouble_', 'numberWithShort_'):
            v = getattr(NSNumber, m)(0)
            self.assertIsInstance(v, NSNumber)
            self.assertIsNotInstance(v, OC_PythonNumber)
            self.assertIs(OC_TestNumber.numberClass_(v), NSCFNumber)

    def testShortConversions(self):
        v = NSNumber.numberWithShort_(42)

        self.assertEquals(OC_TestNumber.numberAsBOOL_(v), 1)
        self.assertEquals(OC_TestNumber.numberAsChar_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsShort_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsInt_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsLong_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsLongLong_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsUnsignedChar_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsUnsignedShort_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsUnsignedInt_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsUnsignedLong_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsUnsignedLongLong_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsFloat_(v), 42.0)
        self.assertEquals(OC_TestNumber.numberAsDouble_(v), 42.0)

    def testIntConversions(self):
        v = NSNumber.numberWithInt_(42)

        self.assertEquals(OC_TestNumber.numberAsBOOL_(v), 1)
        self.assertEquals(OC_TestNumber.numberAsChar_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsShort_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsInt_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsLong_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsLongLong_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsUnsignedChar_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsUnsignedShort_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsUnsignedInt_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsUnsignedLong_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsUnsignedLongLong_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsFloat_(v), 42.0)
        self.assertEquals(OC_TestNumber.numberAsDouble_(v), 42.0)

        # Negative values
        v = NSNumber.numberWithInt_(-42)

        self.assertEquals(OC_TestNumber.numberAsBOOL_(v), 1)
        self.assertEquals(OC_TestNumber.numberAsChar_(v), -42)
        self.assertEquals(OC_TestNumber.numberAsShort_(v), -42)
        self.assertEquals(OC_TestNumber.numberAsInt_(v), -42)
        self.assertEquals(OC_TestNumber.numberAsLong_(v), -42)
        self.assertEquals(OC_TestNumber.numberAsLongLong_(v), -42)
        self.assertEquals(OC_TestNumber.numberAsUnsignedChar_(v), 214)
        self.assertEquals(OC_TestNumber.numberAsUnsignedShort_(v), 65494)
        self.assertEquals(OC_TestNumber.numberAsUnsignedInt_(v), 4294967254)

        if sys.maxint == (2 ** 31) -1:
            self.assertEquals(OC_TestNumber.numberAsUnsignedLong_(v), 4294967254)
        else:
            self.assertEquals(OC_TestNumber.numberAsUnsignedLong_(v), 18446744073709551574)

        self.assertEquals(OC_TestNumber.numberAsUnsignedLongLong_(v), 18446744073709551574)
        self.assertEquals(OC_TestNumber.numberAsFloat_(v), -42.0)
        self.assertEquals(OC_TestNumber.numberAsDouble_(v), -42.0)

        # Overflow
        v = NSNumber.numberWithInt_(892455)

        self.assertEquals(OC_TestNumber.numberAsBOOL_(v), 1)
        self.assertEquals(OC_TestNumber.numberAsChar_(v), 39)
        self.assertEquals(OC_TestNumber.numberAsShort_(v), -25049)
        self.assertEquals(OC_TestNumber.numberAsUnsignedChar_(v), 39)
        self.assertEquals(OC_TestNumber.numberAsUnsignedShort_(v), 40487)

    def testDoubleConversions(self):
        v = NSNumber.numberWithDouble_(75.5)

        self.assertEquals(OC_TestNumber.numberAsBOOL_(v), 1)
        self.assertEquals(OC_TestNumber.numberAsChar_(v), 75)
        self.assertEquals(OC_TestNumber.numberAsShort_(v), 75)
        self.assertEquals(OC_TestNumber.numberAsInt_(v), 75)
        self.assertEquals(OC_TestNumber.numberAsLong_(v), 75)
        self.assertEquals(OC_TestNumber.numberAsLongLong_(v), 75)
        self.assertEquals(OC_TestNumber.numberAsUnsignedChar_(v), 75)
        self.assertEquals(OC_TestNumber.numberAsUnsignedShort_(v), 75)
        self.assertEquals(OC_TestNumber.numberAsUnsignedInt_(v), 75)
        self.assertEquals(OC_TestNumber.numberAsUnsignedLong_(v), 75)
        self.assertEquals(OC_TestNumber.numberAsUnsignedLongLong_(v), 75)
        self.assertEquals(OC_TestNumber.numberAsFloat_(v), 75.5)
        self.assertEquals(OC_TestNumber.numberAsDouble_(v), 75.5)

        # Negative values
        v = NSNumber.numberWithDouble_(-127.6)

        self.assertEquals(OC_TestNumber.numberAsBOOL_(v), 1)
        self.assertEquals(OC_TestNumber.numberAsChar_(v), -127)
        self.assertEquals(OC_TestNumber.numberAsShort_(v), -127)
        self.assertEquals(OC_TestNumber.numberAsInt_(v), -127)
        self.assertEquals(OC_TestNumber.numberAsLong_(v), -127)
        self.assertEquals(OC_TestNumber.numberAsLongLong_(v), -127)
        self.assertEquals(OC_TestNumber.numberAsUnsignedChar_(v), 129)
        self.assertEquals(OC_TestNumber.numberAsUnsignedShort_(v), 65409)
        self.assertEquals(OC_TestNumber.numberAsUnsignedInt_(v), 4294967169)

        if sys.maxint == (2 ** 31) -1:
            self.assertEquals(OC_TestNumber.numberAsUnsignedLong_(v), 4294967169)
        else:
            self.assertEquals(OC_TestNumber.numberAsUnsignedLong_(v), 18446744073709551488)

        # The first entry in the tuple below is incorrect, that happens to be what
        # is returned by NSNumber on some platforms (in particular, any Python where
        # the python framework itself is linked against the 10.4 SDK)
        #
        #   double v = -127.6;
        #   unsigned long long lv = v;
        #   printf("%llu\n", lv);
        # 

        self.assertIn(
                OC_TestNumber.numberAsUnsignedLongLong_(v),
                    (18446744073709551489, 18446744073709551488))

        self.assertEquals(OC_TestNumber.numberAsDouble_(v), -127.6)

        # Overflow
        v = NSNumber.numberWithDouble_(float(2**64 + 99))

        self.assertEquals(OC_TestNumber.numberAsBOOL_(v), 1)

        if sys.byteorder == 'big':
            self.assertEquals(OC_TestNumber.numberAsChar_(v), -1)
            self.assertEquals(OC_TestNumber.numberAsShort_(v), -1)
            self.assertEquals(OC_TestNumber.numberAsUnsignedChar_(v), 255)
            self.assertEquals(OC_TestNumber.numberAsUnsignedShort_(v), 65535)
        else:
            self.assertEquals(OC_TestNumber.numberAsChar_(v), 0)
            self.assertEquals(OC_TestNumber.numberAsShort_(v), 0)
            self.assertEquals(OC_TestNumber.numberAsUnsignedChar_(v), 0)
            self.assertEquals(OC_TestNumber.numberAsUnsignedShort_(v), 0)

    def testCompare(self):
        self.assertEquals(OC_TestNumber.compareA_andB_(NSNumber.numberWithLong_(0), NSNumber.numberWithLong_(1)), NSOrderedAscending)
        self.assertEquals(OC_TestNumber.compareA_andB_(NSNumber.numberWithLong_(0), NSNumber.numberWithUnsignedLongLong_(2**40)), NSOrderedAscending)
        self.assertEquals(OC_TestNumber.compareA_andB_(NSNumber.numberWithLong_(0), NSNumber.numberWithDouble_(42.0)), NSOrderedAscending)

        self.assertEquals(OC_TestNumber.compareA_andB_(NSNumber.numberWithLong_(0), NSNumber.numberWithLong_(-1)), NSOrderedDescending)
        self.assertEquals(OC_TestNumber.compareA_andB_(NSNumber.numberWithLong_(0), NSNumber.numberWithLongLong_(-2**60)), NSOrderedDescending)
        self.assertEquals(OC_TestNumber.compareA_andB_(NSNumber.numberWithLong_(0), NSNumber.numberWithDouble_(-42.0)), NSOrderedDescending)

        self.assertEquals(OC_TestNumber.compareA_andB_(NSNumber.numberWithLong_(0), NSNumber.numberWithLong_(0)), NSOrderedSame)
        self.assertEquals(OC_TestNumber.compareA_andB_(NSNumber.numberWithLong_(0), NSNumber.numberWithDouble_(0.0)), NSOrderedSame)
        self.assertEquals(OC_TestNumber.compareA_andB_(NSNumber.numberWithLong_(0), NSNumber.numberWithLongLong_(0)), NSOrderedSame)

    def testDescription(self):
        v = OC_TestNumber.numberDescription_(NSNumber.numberWithInt_(0))
        self.assertIsInstance(v, unicode)
        self.assertEquals(v, u"0")

        v = OC_TestNumber.numberDescription_(NSNumber.numberWithLongLong_(2**60))
        self.assertIsInstance(v, unicode)
        self.assertEquals(v, unicode(str(2**60)))

        v = OC_TestNumber.numberDescription_(NSNumber.numberWithLongLong_(-2**60))
        self.assertIsInstance(v, unicode)
        self.assertEquals(v, unicode(str(-2**60)))

        v = OC_TestNumber.numberDescription_(NSNumber.numberWithDouble_(264.0))
        self.assertIsInstance(v, unicode)
        self.assertEquals(v, u"264")


class TestPyNumber (TestCase):
    # Basic tests of the proxy methods

    def testClasses(self):
        # Ensure that python numbers are proxied using the right proxy type
        for v in (0, 1, 2**32+1, 2**64+1, 42.5):
            self.assertIs(OC_TestNumber.numberClass_(v), OC_PythonNumber)

        # The booleans True and False must be proxied as the corresponding
        # NSNumber constants, otherwise lowlevel Cocoa/CoreFoundation code
        # get's upset.
        boolClass = objc.lookUpClass('NSCFBoolean')
        for v in (True, False):
            self.assertIs(OC_TestNumber.numberClass_(v), boolClass)
            self.assertIs(objc.repythonify(v), v)


    def testPythonIntConversions(self):
        # Conversions to other values. Note that values are converted
        # using C casts, without any exceptions when converting a
        # negative value to an unsigned one and without exceptions for
        # overflow.
        v = 42

        self.assertEquals(OC_TestNumber.numberAsBOOL_(v), 1)
        self.assertEquals(OC_TestNumber.numberAsChar_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsShort_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsInt_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsLong_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsLongLong_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsUnsignedChar_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsUnsignedShort_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsUnsignedInt_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsUnsignedLong_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsUnsignedLongLong_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsUnsignedLongLong_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsFloat_(v), 42.0)
        self.assertEquals(OC_TestNumber.numberAsDouble_(v), 42.0)

        # Negative values
        v = -42

        self.assertEquals(OC_TestNumber.numberAsBOOL_(v), 1)
        self.assertEquals(OC_TestNumber.numberAsChar_(v), -42)
        self.assertEquals(OC_TestNumber.numberAsShort_(v), -42)
        self.assertEquals(OC_TestNumber.numberAsInt_(v), -42)
        self.assertEquals(OC_TestNumber.numberAsLong_(v), -42)
        self.assertEquals(OC_TestNumber.numberAsLongLong_(v), -42)
        self.assertEquals(OC_TestNumber.numberAsUnsignedChar_(v), 214)
        self.assertEquals(OC_TestNumber.numberAsUnsignedShort_(v), 65494)
        self.assertEquals(OC_TestNumber.numberAsUnsignedInt_(v), 4294967254)

        if sys.maxint == (2 ** 31) -1:
            self.assertEquals(OC_TestNumber.numberAsUnsignedLong_(v), 4294967254)
        else:
            self.assertEquals(OC_TestNumber.numberAsUnsignedLong_(v), 18446744073709551574)

        self.assertEquals(OC_TestNumber.numberAsUnsignedLongLong_(v), 18446744073709551574)
        self.assertEquals(OC_TestNumber.numberAsFloat_(v), -42.0)
        self.assertEquals(OC_TestNumber.numberAsDouble_(v), -42.0)

        # Overflow
        v = 892455

        self.assertEquals(OC_TestNumber.numberAsBOOL_(v), 1)
        self.assertEquals(OC_TestNumber.numberAsChar_(v), 39)
        self.assertEquals(OC_TestNumber.numberAsShort_(v), -25049)
        self.assertEquals(OC_TestNumber.numberAsUnsignedChar_(v), 39)
        self.assertEquals(OC_TestNumber.numberAsUnsignedShort_(v), 40487)

    def testPythonLongConversions(self):
        v = long(42)
        self.assertIsInstance(v, long)

        self.assertEquals(OC_TestNumber.numberAsBOOL_(v), 1)
        self.assertEquals(OC_TestNumber.numberAsChar_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsShort_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsInt_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsLong_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsLongLong_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsUnsignedChar_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsUnsignedShort_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsUnsignedInt_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsUnsignedLong_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsUnsignedLongLong_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsUnsignedLongLong_(v), 42)
        self.assertEquals(OC_TestNumber.numberAsFloat_(v), 42.0)
        self.assertEquals(OC_TestNumber.numberAsDouble_(v), 42.0)

        # Negative values
        v = long(-42)
        self.assertIsInstance(v, long)

        self.assertEquals(OC_TestNumber.numberAsBOOL_(v), 1)
        self.assertEquals(OC_TestNumber.numberAsChar_(v), -42)
        self.assertEquals(OC_TestNumber.numberAsShort_(v), -42)
        self.assertEquals(OC_TestNumber.numberAsInt_(v), -42)
        self.assertEquals(OC_TestNumber.numberAsLong_(v), -42)
        self.assertEquals(OC_TestNumber.numberAsLongLong_(v), -42)
        self.assertEquals(OC_TestNumber.numberAsUnsignedChar_(v), 214)
        self.assertEquals(OC_TestNumber.numberAsUnsignedShort_(v), 65494)
        self.assertEquals(OC_TestNumber.numberAsUnsignedInt_(v), 4294967254)

        if sys.maxint == (2 ** 31) -1:
            self.assertEquals(OC_TestNumber.numberAsUnsignedLong_(v), 4294967254)
        else:
            self.assertEquals(OC_TestNumber.numberAsUnsignedLong_(v), 18446744073709551574)

        self.assertEquals(OC_TestNumber.numberAsUnsignedLongLong_(v), 18446744073709551574)
        self.assertEquals(OC_TestNumber.numberAsFloat_(v), -42.0)
        self.assertEquals(OC_TestNumber.numberAsDouble_(v), -42.0)

        # Overflow
        v = long(892455)
        self.assertIsInstance(v, long)

        self.assertEquals(OC_TestNumber.numberAsBOOL_(v), 1)
        self.assertEquals(OC_TestNumber.numberAsChar_(v), 39)
        self.assertEquals(OC_TestNumber.numberAsShort_(v), -25049)
        self.assertEquals(OC_TestNumber.numberAsUnsignedChar_(v), 39)
        self.assertEquals(OC_TestNumber.numberAsUnsignedShort_(v), 40487)

        # Very much overflow
        v = 2 ** 64 + 1
        self.assertEquals(OC_TestNumber.numberAsBOOL_(v), 1)
        self.assertEquals(OC_TestNumber.numberAsChar_(v), 1)
        self.assertEquals(OC_TestNumber.numberAsShort_(v), 1)
        self.assertEquals(OC_TestNumber.numberAsInt_(v), 1)
        self.assertEquals(OC_TestNumber.numberAsLong_(v), 1)
        self.assertEquals(OC_TestNumber.numberAsLongLong_(v), 1)
        self.assertEquals(OC_TestNumber.numberAsUnsignedChar_(v), 1)
        self.assertEquals(OC_TestNumber.numberAsUnsignedShort_(v), 1)
        self.assertEquals(OC_TestNumber.numberAsUnsignedInt_(v), 1)
        self.assertEquals(OC_TestNumber.numberAsUnsignedLong_(v), 1)
        self.assertEquals(OC_TestNumber.numberAsUnsignedLongLong_(v), 1)

    def testDoubleConversions(self):
        v = 75.5

        self.assertEquals(OC_TestNumber.numberAsBOOL_(v), 1)
        self.assertEquals(OC_TestNumber.numberAsChar_(v), 75)
        self.assertEquals(OC_TestNumber.numberAsShort_(v), 75)
        self.assertEquals(OC_TestNumber.numberAsInt_(v), 75)
        self.assertEquals(OC_TestNumber.numberAsLong_(v), 75)
        self.assertEquals(OC_TestNumber.numberAsLongLong_(v), 75)
        self.assertEquals(OC_TestNumber.numberAsUnsignedChar_(v), 75)
        self.assertEquals(OC_TestNumber.numberAsUnsignedShort_(v), 75)
        self.assertEquals(OC_TestNumber.numberAsUnsignedInt_(v), 75)
        self.assertEquals(OC_TestNumber.numberAsUnsignedLong_(v), 75)
        self.assertEquals(OC_TestNumber.numberAsUnsignedLongLong_(v), 75)
        self.assertEquals(OC_TestNumber.numberAsFloat_(v), 75.5)
        self.assertEquals(OC_TestNumber.numberAsDouble_(v), 75.5)

        # Negative values
        v = -127.6

        self.assertEquals(OC_TestNumber.numberAsBOOL_(v), 1)
        self.assertEquals(OC_TestNumber.numberAsChar_(v), -127)
        self.assertEquals(OC_TestNumber.numberAsShort_(v), -127)
        self.assertEquals(OC_TestNumber.numberAsInt_(v), -127)
        self.assertEquals(OC_TestNumber.numberAsLong_(v), -127)
        self.assertEquals(OC_TestNumber.numberAsLongLong_(v), -127)
        self.assertEquals(OC_TestNumber.numberAsUnsignedChar_(v), 129)
        self.assertEquals(OC_TestNumber.numberAsUnsignedShort_(v), 65409)
        self.assertEquals(OC_TestNumber.numberAsUnsignedInt_(v), 4294967169)

        if sys.maxint == (2 ** 31) -1:
            self.assertEquals(OC_TestNumber.numberAsUnsignedLong_(v), 4294967169)
        else:
            self.assertEquals(OC_TestNumber.numberAsUnsignedLong_(v), 18446744073709551489)

        if sys.byteorder == 'big':
            self.assertEquals(OC_TestNumber.numberAsUnsignedLongLong_(v), 4294967169)
        else:
            self.assertEquals(OC_TestNumber.numberAsUnsignedLongLong_(v), 18446744073709551489)

        self.assertEquals(OC_TestNumber.numberAsDouble_(v), -127.6)

        # Overflow
        v = float(2**64 + 99)

        self.assertEquals(OC_TestNumber.numberAsBOOL_(v), 1)

        if sys.byteorder == 'big':
            self.assertEquals(OC_TestNumber.numberAsChar_(v), -1)
            self.assertEquals(OC_TestNumber.numberAsShort_(v), -1)
            self.assertEquals(OC_TestNumber.numberAsUnsignedChar_(v), 255)
            self.assertEquals(OC_TestNumber.numberAsUnsignedShort_(v), 65535)
        else:
            self.assertEquals(OC_TestNumber.numberAsChar_(v), 0)
            self.assertEquals(OC_TestNumber.numberAsShort_(v), 0)
            self.assertEquals(OC_TestNumber.numberAsUnsignedChar_(v), 0)
            self.assertEquals(OC_TestNumber.numberAsUnsignedShort_(v), 0)

    def testCompare(self):
        self.assertEquals(OC_TestNumber.compareA_andB_(0, 1), NSOrderedAscending)
        self.assertEquals(OC_TestNumber.compareA_andB_(0, 2**64), NSOrderedAscending)
        self.assertEquals(OC_TestNumber.compareA_andB_(0, 42.0), NSOrderedAscending)

        self.assertEquals(OC_TestNumber.compareA_andB_(0, -1), NSOrderedDescending)
        self.assertEquals(OC_TestNumber.compareA_andB_(0, -2**64), NSOrderedDescending)
        self.assertEquals(OC_TestNumber.compareA_andB_(0, -42.0), NSOrderedDescending)

        self.assertEquals(OC_TestNumber.compareA_andB_(0, 0), NSOrderedSame)
        self.assertEquals(OC_TestNumber.compareA_andB_(0, 0.0), NSOrderedSame)
        self.assertEquals(OC_TestNumber.compareA_andB_(0, long(0)), NSOrderedSame)

    def testNumberEqual(self):
        self.assertFalse(OC_TestNumber.number_isEqualTo_(0, 1))
        self.assertFalse(OC_TestNumber.number_isEqualTo_(0, 2**64))
        self.assertFalse(OC_TestNumber.number_isEqualTo_(0, 42.0))

        self.assertFalse(OC_TestNumber.number_isEqualTo_(0, -1))
        self.assertFalse(OC_TestNumber.number_isEqualTo_(0, -2**64))
        self.assertFalse(OC_TestNumber.number_isEqualTo_(0, -42.0))

        self.assertTrue(OC_TestNumber.number_isEqualTo_(0, 0))
        self.assertTrue(OC_TestNumber.number_isEqualTo_(0, 0.0))
        self.assertTrue(OC_TestNumber.number_isEqualTo_(0, long(0)))

    def testDescription(self):
        v = OC_TestNumber.numberDescription_(0)
        self.assertIsInstance(v, unicode)
        self.assertEquals(v, u"0")

        v = OC_TestNumber.numberDescription_(2**64)
        self.assertIsInstance(v, unicode)
        self.assertEquals(v, unicode(repr(2**64)))

        v = OC_TestNumber.numberDescription_(-2**64)
        self.assertIsInstance(v, unicode)
        self.assertEquals(v, unicode(repr(-2**64)))

        v = OC_TestNumber.numberDescription_(264.0)
        self.assertIsInstance(v, unicode)
        self.assertEquals(v, u"264.0")

        v = OC_TestNumber.numberDescription_(False)
        self.assertIsInstance(v, unicode)
        self.assertEquals(v, u"0")

        v = OC_TestNumber.numberDescription_(True)
        self.assertIsInstance(v, unicode)
        self.assertEquals(v, u"1")

class TestInteractions (TestCase):
    # Test interactions between Python and NSNumber numbers

    def testMixedCompare(self):
        # compare for:
        #   - python number to nsnumber
        #   - nsnumber to python number
        # For: (bool, int, long, float) vs (char, short, ...)
        methods = [
                'numberWithInt_',
                'numberWithChar_',
                'numberWithLong_',
                'numberWithDouble_',
            ]

        self.assertEqual(OC_TestNumber.compareA_andB_(42, 42), NSOrderedSame)
        for m in methods:
            self.assertEqual(OC_TestNumber.compareA_andB_(getattr(NSNumber, m)(42), 42), NSOrderedSame)
            self.assertEqual(OC_TestNumber.compareA_andB_(42, getattr(NSNumber, m)(42)), NSOrderedSame)

        self.assertEqual(OC_TestNumber.compareA_andB_(42, 99), NSOrderedAscending)
        for m in methods:
            self.assertEqual(OC_TestNumber.compareA_andB_(getattr(NSNumber, m)(42), 99), NSOrderedAscending)
            self.assertEqual(OC_TestNumber.compareA_andB_(42, getattr(NSNumber, m)(99)), NSOrderedAscending)

    def testMixedEquals(self):
        # isEqualToNumber for:
        #   - python number to nsnumber
        #   - nsnumber to python number
        # For: (bool, int, long, float) vs (char, short, ...)
        self.assertTrue(OC_TestNumber.number_isEqualTo_(0, NSNumber.numberWithInt_(0)))
        self.assertTrue(OC_TestNumber.number_isEqualTo_(0, NSNumber.numberWithLong_(0)))
        self.assertTrue(OC_TestNumber.number_isEqualTo_(0, NSNumber.numberWithFloat_(0)))
        self.assertTrue(OC_TestNumber.number_isEqualTo_(NSNumber.numberWithInt_(0), 0))
        self.assertTrue(OC_TestNumber.number_isEqualTo_(NSNumber.numberWithLong_(0), 0))
        self.assertTrue(OC_TestNumber.number_isEqualTo_(NSNumber.numberWithFloat_(0), 0))

        self.assertFalse(OC_TestNumber.number_isEqualTo_(42, NSNumber.numberWithInt_(0)))
        self.assertFalse(OC_TestNumber.number_isEqualTo_(42, NSNumber.numberWithLong_(0)))
        self.assertFalse(OC_TestNumber.number_isEqualTo_(42, NSNumber.numberWithFloat_(0)))
        self.assertFalse(OC_TestNumber.number_isEqualTo_(NSNumber.numberWithInt_(0), 42))
        self.assertFalse(OC_TestNumber.number_isEqualTo_(NSNumber.numberWithLong_(0), 42))
        self.assertFalse(OC_TestNumber.number_isEqualTo_(NSNumber.numberWithFloat_(0), 42))


class TestNumberFormatter (TestCase):
    # Test behaviour of an NSNumberFormatter, both with 
    # Python numbers and NSNumbers
    def testFormatting(self):
        formatter = NSNumberFormatter.alloc().init()

        n = NSNumber.numberWithInt_(42)
        p = 42
        self.assertEquals(formatter.stringForObjectValue_(n), formatter.stringForObjectValue_(p))

        n = NSNumber.numberWithInt_(-42)
        p = -42
        self.assertEquals(formatter.stringForObjectValue_(n), formatter.stringForObjectValue_(p))


        n = NSNumber.numberWithDouble_(10.42)
        p = 10.42
        self.assertEquals(formatter.stringForObjectValue_(n), formatter.stringForObjectValue_(p))

if __name__ == "__main__":
    main()
