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