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