1 import unittest 2 from test import support 3 4 import sys 5 6 import random 7 import math 8 import array 9 10 # SHIFT should match the value in longintrepr.h for best testing. 11 SHIFT = sys.int_info.bits_per_digit 12 BASE = 2 ** SHIFT 13 MASK = BASE - 1 14 KARATSUBA_CUTOFF = 70 # from longobject.c 15 16 # Max number of base BASE digits to use in test cases. Doubling 17 # this will more than double the runtime. 18 MAXDIGITS = 15 19 20 # build some special values 21 special = [0, 1, 2, BASE, BASE >> 1, 0x5555555555555555, 0xaaaaaaaaaaaaaaaa] 22 # some solid strings of one bits 23 p2 = 4 # 0 and 1 already added 24 for i in range(2*SHIFT): 25 special.append(p2 - 1) 26 p2 = p2 << 1 27 del p2 28 # add complements & negations 29 special += [~x for x in special] + [-x for x in special] 30 31 DBL_MAX = sys.float_info.max 32 DBL_MAX_EXP = sys.float_info.max_exp 33 DBL_MIN_EXP = sys.float_info.min_exp 34 DBL_MANT_DIG = sys.float_info.mant_dig 35 DBL_MIN_OVERFLOW = 2**DBL_MAX_EXP - 2**(DBL_MAX_EXP - DBL_MANT_DIG - 1) 36 37 38 # Pure Python version of correctly-rounded integer-to-float conversion. 39 def int_to_float(n): 40 """ 41 Correctly-rounded integer-to-float conversion. 42 43 """ 44 # Constants, depending only on the floating-point format in use. 45 # We use an extra 2 bits of precision for rounding purposes. 46 PRECISION = sys.float_info.mant_dig + 2 47 SHIFT_MAX = sys.float_info.max_exp - PRECISION 48 Q_MAX = 1 << PRECISION 49 ROUND_HALF_TO_EVEN_CORRECTION = [0, -1, -2, 1, 0, -1, 2, 1] 50 51 # Reduce to the case where n is positive. 52 if n == 0: 53 return 0.0 54 elif n < 0: 55 return -int_to_float(-n) 56 57 # Convert n to a 'floating-point' number q * 2**shift, where q is an 58 # integer with 'PRECISION' significant bits. When shifting n to create q, 59 # the least significant bit of q is treated as 'sticky'. That is, the 60 # least significant bit of q is set if either the corresponding bit of n 61 # was already set, or any one of the bits of n lost in the shift was set. 62 shift = n.bit_length() - PRECISION 63 q = n << -shift if shift < 0 else (n >> shift) | bool(n & ~(-1 << shift)) 64 65 # Round half to even (actually rounds to the nearest multiple of 4, 66 # rounding ties to a multiple of 8). 67 q += ROUND_HALF_TO_EVEN_CORRECTION[q & 7] 68 69 # Detect overflow. 70 if shift + (q == Q_MAX) > SHIFT_MAX: 71 raise OverflowError("integer too large to convert to float") 72 73 # Checks: q is exactly representable, and q**2**shift doesn't overflow. 74 assert q % 4 == 0 and q // 4 <= 2**(sys.float_info.mant_dig) 75 assert q * 2**shift <= sys.float_info.max 76 77 # Some circularity here, since float(q) is doing an int-to-float 78 # conversion. But here q is of bounded size, and is exactly representable 79 # as a float. In a low-level C-like language, this operation would be a 80 # simple cast (e.g., from unsigned long long to double). 81 return math.ldexp(float(q), shift) 82 83 84 # pure Python version of correctly-rounded true division 85 def truediv(a, b): 86 """Correctly-rounded true division for integers.""" 87 negative = a^b < 0 88 a, b = abs(a), abs(b) 89 90 # exceptions: division by zero, overflow 91 if not b: 92 raise ZeroDivisionError("division by zero") 93 if a >= DBL_MIN_OVERFLOW * b: 94 raise OverflowError("int/int too large to represent as a float") 95 96 # find integer d satisfying 2**(d - 1) <= a/b < 2**d 97 d = a.bit_length() - b.bit_length() 98 if d >= 0 and a >= 2**d * b or d < 0 and a * 2**-d >= b: 99 d += 1 100 101 # compute 2**-exp * a / b for suitable exp 102 exp = max(d, DBL_MIN_EXP) - DBL_MANT_DIG 103 a, b = a << max(-exp, 0), b << max(exp, 0) 104 q, r = divmod(a, b) 105 106 # round-half-to-even: fractional part is r/b, which is > 0.5 iff 107 # 2*r > b, and == 0.5 iff 2*r == b. 108 if 2*r > b or 2*r == b and q % 2 == 1: 109 q += 1 110 111 result = math.ldexp(q, exp) 112 return -result if negative else result 113 114 115 class LongTest(unittest.TestCase): 116 117 # Get quasi-random long consisting of ndigits digits (in base BASE). 118 # quasi == the most-significant digit will not be 0, and the number 119 # is constructed to contain long strings of 0 and 1 bits. These are 120 # more likely than random bits to provoke digit-boundary errors. 121 # The sign of the number is also random. 122 123 def getran(self, ndigits): 124 self.assertGreater(ndigits, 0) 125 nbits_hi = ndigits * SHIFT 126 nbits_lo = nbits_hi - SHIFT + 1 127 answer = 0 128 nbits = 0 129 r = int(random.random() * (SHIFT * 2)) | 1 # force 1 bits to start 130 while nbits < nbits_lo: 131 bits = (r >> 1) + 1 132 bits = min(bits, nbits_hi - nbits) 133 self.assertTrue(1 <= bits <= SHIFT) 134 nbits = nbits + bits 135 answer = answer << bits 136 if r & 1: 137 answer = answer | ((1 << bits) - 1) 138 r = int(random.random() * (SHIFT * 2)) 139 self.assertTrue(nbits_lo <= nbits <= nbits_hi) 140 if random.random() < 0.5: 141 answer = -answer 142 return answer 143 144 # Get random long consisting of ndigits random digits (relative to base 145 # BASE). The sign bit is also random. 146 147 def getran2(ndigits): 148 answer = 0 149 for i in range(ndigits): 150 answer = (answer << SHIFT) | random.randint(0, MASK) 151 if random.random() < 0.5: 152 answer = -answer 153 return answer 154 155 def check_division(self, x, y): 156 eq = self.assertEqual 157 with self.subTest(x=x, y=y): 158 q, r = divmod(x, y) 159 q2, r2 = x//y, x%y 160 pab, pba = x*y, y*x 161 eq(pab, pba, "multiplication does not commute") 162 eq(q, q2, "divmod returns different quotient than /") 163 eq(r, r2, "divmod returns different mod than %") 164 eq(x, q*y + r, "x != q*y + r after divmod") 165 if y > 0: 166 self.assertTrue(0 <= r < y, "bad mod from divmod") 167 else: 168 self.assertTrue(y < r <= 0, "bad mod from divmod") 169 170 def test_division(self): 171 digits = list(range(1, MAXDIGITS+1)) + list(range(KARATSUBA_CUTOFF, 172 KARATSUBA_CUTOFF + 14)) 173 digits.append(KARATSUBA_CUTOFF * 3) 174 for lenx in digits: 175 x = self.getran(lenx) 176 for leny in digits: 177 y = self.getran(leny) or 1 178 self.check_division(x, y) 179 180 # specific numbers chosen to exercise corner cases of the 181 # current long division implementation 182 183 # 30-bit cases involving a quotient digit estimate of BASE+1 184 self.check_division(1231948412290879395966702881, 185 1147341367131428698) 186 self.check_division(815427756481275430342312021515587883, 187 707270836069027745) 188 self.check_division(627976073697012820849443363563599041, 189 643588798496057020) 190 self.check_division(1115141373653752303710932756325578065, 191 1038556335171453937726882627) 192 # 30-bit cases that require the post-subtraction correction step 193 self.check_division(922498905405436751940989320930368494, 194 949985870686786135626943396) 195 self.check_division(768235853328091167204009652174031844, 196 1091555541180371554426545266) 197 198 # 15-bit cases involving a quotient digit estimate of BASE+1 199 self.check_division(20172188947443, 615611397) 200 self.check_division(1020908530270155025, 950795710) 201 self.check_division(128589565723112408, 736393718) 202 self.check_division(609919780285761575, 18613274546784) 203 # 15-bit cases that require the post-subtraction correction step 204 self.check_division(710031681576388032, 26769404391308) 205 self.check_division(1933622614268221, 30212853348836) 206 207 208 209 def test_karatsuba(self): 210 digits = list(range(1, 5)) + list(range(KARATSUBA_CUTOFF, 211 KARATSUBA_CUTOFF + 10)) 212 digits.extend([KARATSUBA_CUTOFF * 10, KARATSUBA_CUTOFF * 100]) 213 214 bits = [digit * SHIFT for digit in digits] 215 216 # Test products of long strings of 1 bits -- (2**x-1)*(2**y-1) == 217 # 2**(x+y) - 2**x - 2**y + 1, so the proper result is easy to check. 218 for abits in bits: 219 a = (1 << abits) - 1 220 for bbits in bits: 221 if bbits < abits: 222 continue 223 with self.subTest(abits=abits, bbits=bbits): 224 b = (1 << bbits) - 1 225 x = a * b 226 y = ((1 << (abits + bbits)) - 227 (1 << abits) - 228 (1 << bbits) + 229 1) 230 self.assertEqual(x, y) 231 232 def check_bitop_identities_1(self, x): 233 eq = self.assertEqual 234 with self.subTest(x=x): 235 eq(x & 0, 0) 236 eq(x | 0, x) 237 eq(x ^ 0, x) 238 eq(x & -1, x) 239 eq(x | -1, -1) 240 eq(x ^ -1, ~x) 241 eq(x, ~~x) 242 eq(x & x, x) 243 eq(x | x, x) 244 eq(x ^ x, 0) 245 eq(x & ~x, 0) 246 eq(x | ~x, -1) 247 eq(x ^ ~x, -1) 248 eq(-x, 1 + ~x) 249 eq(-x, ~(x-1)) 250 for n in range(2*SHIFT): 251 p2 = 2 ** n 252 with self.subTest(x=x, n=n, p2=p2): 253 eq(x << n >> n, x) 254 eq(x // p2, x >> n) 255 eq(x * p2, x << n) 256 eq(x & -p2, x >> n << n) 257 eq(x & -p2, x & ~(p2 - 1)) 258 259 def check_bitop_identities_2(self, x, y): 260 eq = self.assertEqual 261 with self.subTest(x=x, y=y): 262 eq(x & y, y & x) 263 eq(x | y, y | x) 264 eq(x ^ y, y ^ x) 265 eq(x ^ y ^ x, y) 266 eq(x & y, ~(~x | ~y)) 267 eq(x | y, ~(~x & ~y)) 268 eq(x ^ y, (x | y) & ~(x & y)) 269 eq(x ^ y, (x & ~y) | (~x & y)) 270 eq(x ^ y, (x | y) & (~x | ~y)) 271 272 def check_bitop_identities_3(self, x, y, z): 273 eq = self.assertEqual 274 with self.subTest(x=x, y=y, z=z): 275 eq((x & y) & z, x & (y & z)) 276 eq((x | y) | z, x | (y | z)) 277 eq((x ^ y) ^ z, x ^ (y ^ z)) 278 eq(x & (y | z), (x & y) | (x & z)) 279 eq(x | (y & z), (x | y) & (x | z)) 280 281 def test_bitop_identities(self): 282 for x in special: 283 self.check_bitop_identities_1(x) 284 digits = range(1, MAXDIGITS+1) 285 for lenx in digits: 286 x = self.getran(lenx) 287 self.check_bitop_identities_1(x) 288 for leny in digits: 289 y = self.getran(leny) 290 self.check_bitop_identities_2(x, y) 291 self.check_bitop_identities_3(x, y, self.getran((lenx + leny)//2)) 292 293 def slow_format(self, x, base): 294 digits = [] 295 sign = 0 296 if x < 0: 297 sign, x = 1, -x 298 while x: 299 x, r = divmod(x, base) 300 digits.append(int(r)) 301 digits.reverse() 302 digits = digits or [0] 303 return '-'[:sign] + \ 304 {2: '0b', 8: '0o', 10: '', 16: '0x'}[base] + \ 305 "".join("0123456789abcdef"[i] for i in digits) 306 307 def check_format_1(self, x): 308 for base, mapper in (2, bin), (8, oct), (10, str), (10, repr), (16, hex): 309 got = mapper(x) 310 with self.subTest(x=x, mapper=mapper.__name__): 311 expected = self.slow_format(x, base) 312 self.assertEqual(got, expected) 313 with self.subTest(got=got): 314 self.assertEqual(int(got, 0), x) 315 316 def test_format(self): 317 for x in special: 318 self.check_format_1(x) 319 for i in range(10): 320 for lenx in range(1, MAXDIGITS+1): 321 x = self.getran(lenx) 322 self.check_format_1(x) 323 324 def test_long(self): 325 # Check conversions from string 326 LL = [ 327 ('1' + '0'*20, 10**20), 328 ('1' + '0'*100, 10**100) 329 ] 330 for s, v in LL: 331 for sign in "", "+", "-": 332 for prefix in "", " ", "\t", " \t\t ": 333 ss = prefix + sign + s 334 vv = v 335 if sign == "-" and v is not ValueError: 336 vv = -v 337 try: 338 self.assertEqual(int(ss), vv) 339 except ValueError: 340 pass 341 342 # trailing L should no longer be accepted... 343 self.assertRaises(ValueError, int, '123L') 344 self.assertRaises(ValueError, int, '123l') 345 self.assertRaises(ValueError, int, '0L') 346 self.assertRaises(ValueError, int, '-37L') 347 self.assertRaises(ValueError, int, '0x32L', 16) 348 self.assertRaises(ValueError, int, '1L', 21) 349 # ... but it's just a normal digit if base >= 22 350 self.assertEqual(int('1L', 22), 43) 351 352 # tests with base 0 353 self.assertEqual(int('000', 0), 0) 354 self.assertEqual(int('0o123', 0), 83) 355 self.assertEqual(int('0x123', 0), 291) 356 self.assertEqual(int('0b100', 0), 4) 357 self.assertEqual(int(' 0O123 ', 0), 83) 358 self.assertEqual(int(' 0X123 ', 0), 291) 359 self.assertEqual(int(' 0B100 ', 0), 4) 360 self.assertEqual(int('0', 0), 0) 361 self.assertEqual(int('+0', 0), 0) 362 self.assertEqual(int('-0', 0), 0) 363 self.assertEqual(int('00', 0), 0) 364 self.assertRaises(ValueError, int, '08', 0) 365 self.assertRaises(ValueError, int, '-012395', 0) 366 367 # invalid bases 368 invalid_bases = [-909, 369 2**31-1, 2**31, -2**31, -2**31-1, 370 2**63-1, 2**63, -2**63, -2**63-1, 371 2**100, -2**100, 372 ] 373 for base in invalid_bases: 374 self.assertRaises(ValueError, int, '42', base) 375 376 377 def test_conversion(self): 378 379 class JustLong: 380 # test that __long__ no longer used in 3.x 381 def __long__(self): 382 return 42 383 self.assertRaises(TypeError, int, JustLong()) 384 385 class LongTrunc: 386 # __long__ should be ignored in 3.x 387 def __long__(self): 388 return 42 389 def __trunc__(self): 390 return 1729 391 self.assertEqual(int(LongTrunc()), 1729) 392 393 def check_float_conversion(self, n): 394 # Check that int -> float conversion behaviour matches 395 # that of the pure Python version above. 396 try: 397 actual = float(n) 398 except OverflowError: 399 actual = 'overflow' 400 401 try: 402 expected = int_to_float(n) 403 except OverflowError: 404 expected = 'overflow' 405 406 msg = ("Error in conversion of integer {} to float. " 407 "Got {}, expected {}.".format(n, actual, expected)) 408 self.assertEqual(actual, expected, msg) 409 410 @support.requires_IEEE_754 411 def test_float_conversion(self): 412 413 exact_values = [0, 1, 2, 414 2**53-3, 415 2**53-2, 416 2**53-1, 417 2**53, 418 2**53+2, 419 2**54-4, 420 2**54-2, 421 2**54, 422 2**54+4] 423 for x in exact_values: 424 self.assertEqual(float(x), x) 425 self.assertEqual(float(-x), -x) 426 427 # test round-half-even 428 for x, y in [(1, 0), (2, 2), (3, 4), (4, 4), (5, 4), (6, 6), (7, 8)]: 429 for p in range(15): 430 self.assertEqual(int(float(2**p*(2**53+x))), 2**p*(2**53+y)) 431 432 for x, y in [(0, 0), (1, 0), (2, 0), (3, 4), (4, 4), (5, 4), (6, 8), 433 (7, 8), (8, 8), (9, 8), (10, 8), (11, 12), (12, 12), 434 (13, 12), (14, 16), (15, 16)]: 435 for p in range(15): 436 self.assertEqual(int(float(2**p*(2**54+x))), 2**p*(2**54+y)) 437 438 # behaviour near extremes of floating-point range 439 int_dbl_max = int(DBL_MAX) 440 top_power = 2**DBL_MAX_EXP 441 halfway = (int_dbl_max + top_power)//2 442 self.assertEqual(float(int_dbl_max), DBL_MAX) 443 self.assertEqual(float(int_dbl_max+1), DBL_MAX) 444 self.assertEqual(float(halfway-1), DBL_MAX) 445 self.assertRaises(OverflowError, float, halfway) 446 self.assertEqual(float(1-halfway), -DBL_MAX) 447 self.assertRaises(OverflowError, float, -halfway) 448 self.assertRaises(OverflowError, float, top_power-1) 449 self.assertRaises(OverflowError, float, top_power) 450 self.assertRaises(OverflowError, float, top_power+1) 451 self.assertRaises(OverflowError, float, 2*top_power-1) 452 self.assertRaises(OverflowError, float, 2*top_power) 453 self.assertRaises(OverflowError, float, top_power*top_power) 454 455 for p in range(100): 456 x = 2**p * (2**53 + 1) + 1 457 y = 2**p * (2**53 + 2) 458 self.assertEqual(int(float(x)), y) 459 460 x = 2**p * (2**53 + 1) 461 y = 2**p * 2**53 462 self.assertEqual(int(float(x)), y) 463 464 # Compare builtin float conversion with pure Python int_to_float 465 # function above. 466 test_values = [ 467 int_dbl_max-1, int_dbl_max, int_dbl_max+1, 468 halfway-1, halfway, halfway + 1, 469 top_power-1, top_power, top_power+1, 470 2*top_power-1, 2*top_power, top_power*top_power, 471 ] 472 test_values.extend(exact_values) 473 for p in range(-4, 8): 474 for x in range(-128, 128): 475 test_values.append(2**(p+53) + x) 476 for value in test_values: 477 self.check_float_conversion(value) 478 self.check_float_conversion(-value) 479 480 def test_float_overflow(self): 481 for x in -2.0, -1.0, 0.0, 1.0, 2.0: 482 self.assertEqual(float(int(x)), x) 483 484 shuge = '12345' * 120 485 huge = 1 << 30000 486 mhuge = -huge 487 namespace = {'huge': huge, 'mhuge': mhuge, 'shuge': shuge, 'math': math} 488 for test in ["float(huge)", "float(mhuge)", 489 "complex(huge)", "complex(mhuge)", 490 "complex(huge, 1)", "complex(mhuge, 1)", 491 "complex(1, huge)", "complex(1, mhuge)", 492 "1. + huge", "huge + 1.", "1. + mhuge", "mhuge + 1.", 493 "1. - huge", "huge - 1.", "1. - mhuge", "mhuge - 1.", 494 "1. * huge", "huge * 1.", "1. * mhuge", "mhuge * 1.", 495 "1. // huge", "huge // 1.", "1. // mhuge", "mhuge // 1.", 496 "1. / huge", "huge / 1.", "1. / mhuge", "mhuge / 1.", 497 "1. ** huge", "huge ** 1.", "1. ** mhuge", "mhuge ** 1.", 498 "math.sin(huge)", "math.sin(mhuge)", 499 "math.sqrt(huge)", "math.sqrt(mhuge)", # should do better 500 # math.floor() of an int returns an int now 501 ##"math.floor(huge)", "math.floor(mhuge)", 502 ]: 503 504 self.assertRaises(OverflowError, eval, test, namespace) 505 506 # XXX Perhaps float(shuge) can raise OverflowError on some box? 507 # The comparison should not. 508 self.assertNotEqual(float(shuge), int(shuge), 509 "float(shuge) should not equal int(shuge)") 510 511 def test_logs(self): 512 LOG10E = math.log10(math.e) 513 514 for exp in list(range(10)) + [100, 1000, 10000]: 515 value = 10 ** exp 516 log10 = math.log10(value) 517 self.assertAlmostEqual(log10, exp) 518 519 # log10(value) == exp, so log(value) == log10(value)/log10(e) == 520 # exp/LOG10E 521 expected = exp / LOG10E 522 log = math.log(value) 523 self.assertAlmostEqual(log, expected) 524 525 for bad in -(1 << 10000), -2, 0: 526 self.assertRaises(ValueError, math.log, bad) 527 self.assertRaises(ValueError, math.log10, bad) 528 529 def test_mixed_compares(self): 530 eq = self.assertEqual 531 532 # We're mostly concerned with that mixing floats and ints does the 533 # right stuff, even when ints are too large to fit in a float. 534 # The safest way to check the results is to use an entirely different 535 # method, which we do here via a skeletal rational class (which 536 # represents all Python ints and floats exactly). 537 class Rat: 538 def __init__(self, value): 539 if isinstance(value, int): 540 self.n = value 541 self.d = 1 542 elif isinstance(value, float): 543 # Convert to exact rational equivalent. 544 f, e = math.frexp(abs(value)) 545 assert f == 0 or 0.5 <= f < 1.0 546 # |value| = f * 2**e exactly 547 548 # Suck up CHUNK bits at a time; 28 is enough so that we suck 549 # up all bits in 2 iterations for all known binary double- 550 # precision formats, and small enough to fit in an int. 551 CHUNK = 28 552 top = 0 553 # invariant: |value| = (top + f) * 2**e exactly 554 while f: 555 f = math.ldexp(f, CHUNK) 556 digit = int(f) 557 assert digit >> CHUNK == 0 558 top = (top << CHUNK) | digit 559 f -= digit 560 assert 0.0 <= f < 1.0 561 e -= CHUNK 562 563 # Now |value| = top * 2**e exactly. 564 if e >= 0: 565 n = top << e 566 d = 1 567 else: 568 n = top 569 d = 1 << -e 570 if value < 0: 571 n = -n 572 self.n = n 573 self.d = d 574 assert float(n) / float(d) == value 575 else: 576 raise TypeError("can't deal with %r" % value) 577 578 def _cmp__(self, other): 579 if not isinstance(other, Rat): 580 other = Rat(other) 581 x, y = self.n * other.d, self.d * other.n 582 return (x > y) - (x < y) 583 def __eq__(self, other): 584 return self._cmp__(other) == 0 585 def __ge__(self, other): 586 return self._cmp__(other) >= 0 587 def __gt__(self, other): 588 return self._cmp__(other) > 0 589 def __le__(self, other): 590 return self._cmp__(other) <= 0 591 def __lt__(self, other): 592 return self._cmp__(other) < 0 593 594 cases = [0, 0.001, 0.99, 1.0, 1.5, 1e20, 1e200] 595 # 2**48 is an important boundary in the internals. 2**53 is an 596 # important boundary for IEEE double precision. 597 for t in 2.0**48, 2.0**50, 2.0**53: 598 cases.extend([t - 1.0, t - 0.3, t, t + 0.3, t + 1.0, 599 int(t-1), int(t), int(t+1)]) 600 cases.extend([0, 1, 2, sys.maxsize, float(sys.maxsize)]) 601 # 1 << 20000 should exceed all double formats. int(1e200) is to 602 # check that we get equality with 1e200 above. 603 t = int(1e200) 604 cases.extend([0, 1, 2, 1 << 20000, t-1, t, t+1]) 605 cases.extend([-x for x in cases]) 606 for x in cases: 607 Rx = Rat(x) 608 for y in cases: 609 Ry = Rat(y) 610 Rcmp = (Rx > Ry) - (Rx < Ry) 611 with self.subTest(x=x, y=y, Rcmp=Rcmp): 612 xycmp = (x > y) - (x < y) 613 eq(Rcmp, xycmp) 614 eq(x == y, Rcmp == 0) 615 eq(x != y, Rcmp != 0) 616 eq(x < y, Rcmp < 0) 617 eq(x <= y, Rcmp <= 0) 618 eq(x > y, Rcmp > 0) 619 eq(x >= y, Rcmp >= 0) 620 621 def test__format__(self): 622 self.assertEqual(format(123456789, 'd'), '123456789') 623 self.assertEqual(format(123456789, 'd'), '123456789') 624 self.assertEqual(format(123456789, ','), '123,456,789') 625 self.assertEqual(format(123456789, '_'), '123_456_789') 626 627 # sign and aligning are interdependent 628 self.assertEqual(format(1, "-"), '1') 629 self.assertEqual(format(-1, "-"), '-1') 630 self.assertEqual(format(1, "-3"), ' 1') 631 self.assertEqual(format(-1, "-3"), ' -1') 632 self.assertEqual(format(1, "+3"), ' +1') 633 self.assertEqual(format(-1, "+3"), ' -1') 634 self.assertEqual(format(1, " 3"), ' 1') 635 self.assertEqual(format(-1, " 3"), ' -1') 636 self.assertEqual(format(1, " "), ' 1') 637 self.assertEqual(format(-1, " "), '-1') 638 639 # hex 640 self.assertEqual(format(3, "x"), "3") 641 self.assertEqual(format(3, "X"), "3") 642 self.assertEqual(format(1234, "x"), "4d2") 643 self.assertEqual(format(-1234, "x"), "-4d2") 644 self.assertEqual(format(1234, "8x"), " 4d2") 645 self.assertEqual(format(-1234, "8x"), " -4d2") 646 self.assertEqual(format(1234, "x"), "4d2") 647 self.assertEqual(format(-1234, "x"), "-4d2") 648 self.assertEqual(format(-3, "x"), "-3") 649 self.assertEqual(format(-3, "X"), "-3") 650 self.assertEqual(format(int('be', 16), "x"), "be") 651 self.assertEqual(format(int('be', 16), "X"), "BE") 652 self.assertEqual(format(-int('be', 16), "x"), "-be") 653 self.assertEqual(format(-int('be', 16), "X"), "-BE") 654 self.assertRaises(ValueError, format, 1234567890, ',x') 655 self.assertEqual(format(1234567890, '_x'), '4996_02d2') 656 self.assertEqual(format(1234567890, '_X'), '4996_02D2') 657 658 # octal 659 self.assertEqual(format(3, "o"), "3") 660 self.assertEqual(format(-3, "o"), "-3") 661 self.assertEqual(format(1234, "o"), "2322") 662 self.assertEqual(format(-1234, "o"), "-2322") 663 self.assertEqual(format(1234, "-o"), "2322") 664 self.assertEqual(format(-1234, "-o"), "-2322") 665 self.assertEqual(format(1234, " o"), " 2322") 666 self.assertEqual(format(-1234, " o"), "-2322") 667 self.assertEqual(format(1234, "+o"), "+2322") 668 self.assertEqual(format(-1234, "+o"), "-2322") 669 self.assertRaises(ValueError, format, 1234567890, ',o') 670 self.assertEqual(format(1234567890, '_o'), '111_4540_1322') 671 672 # binary 673 self.assertEqual(format(3, "b"), "11") 674 self.assertEqual(format(-3, "b"), "-11") 675 self.assertEqual(format(1234, "b"), "10011010010") 676 self.assertEqual(format(-1234, "b"), "-10011010010") 677 self.assertEqual(format(1234, "-b"), "10011010010") 678 self.assertEqual(format(-1234, "-b"), "-10011010010") 679 self.assertEqual(format(1234, " b"), " 10011010010") 680 self.assertEqual(format(-1234, " b"), "-10011010010") 681 self.assertEqual(format(1234, "+b"), "+10011010010") 682 self.assertEqual(format(-1234, "+b"), "-10011010010") 683 self.assertRaises(ValueError, format, 1234567890, ',b') 684 self.assertEqual(format(12345, '_b'), '11_0000_0011_1001') 685 686 # make sure these are errors 687 self.assertRaises(ValueError, format, 3, "1.3") # precision disallowed 688 self.assertRaises(ValueError, format, 3, "_c") # underscore, 689 self.assertRaises(ValueError, format, 3, ",c") # comma, and 690 self.assertRaises(ValueError, format, 3, "+c") # sign not allowed 691 # with 'c' 692 693 self.assertRaisesRegex(ValueError, 'Cannot specify both', format, 3, '_,') 694 self.assertRaisesRegex(ValueError, 'Cannot specify both', format, 3, ',_') 695 self.assertRaisesRegex(ValueError, 'Cannot specify both', format, 3, '_,d') 696 self.assertRaisesRegex(ValueError, 'Cannot specify both', format, 3, ',_d') 697 698 # ensure that only int and float type specifiers work 699 for format_spec in ([chr(x) for x in range(ord('a'), ord('z')+1)] + 700 [chr(x) for x in range(ord('A'), ord('Z')+1)]): 701 if not format_spec in 'bcdoxXeEfFgGn%': 702 self.assertRaises(ValueError, format, 0, format_spec) 703 self.assertRaises(ValueError, format, 1, format_spec) 704 self.assertRaises(ValueError, format, -1, format_spec) 705 self.assertRaises(ValueError, format, 2**100, format_spec) 706 self.assertRaises(ValueError, format, -(2**100), format_spec) 707 708 # ensure that float type specifiers work; format converts 709 # the int to a float 710 for format_spec in 'eEfFgG%': 711 for value in [0, 1, -1, 100, -100, 1234567890, -1234567890]: 712 self.assertEqual(format(value, format_spec), 713 format(float(value), format_spec)) 714 715 def test_nan_inf(self): 716 self.assertRaises(OverflowError, int, float('inf')) 717 self.assertRaises(OverflowError, int, float('-inf')) 718 self.assertRaises(ValueError, int, float('nan')) 719 720 def test_mod_division(self): 721 with self.assertRaises(ZeroDivisionError): 722 _ = 1 % 0 723 724 self.assertEqual(13 % 10, 3) 725 self.assertEqual(-13 % 10, 7) 726 self.assertEqual(13 % -10, -7) 727 self.assertEqual(-13 % -10, -3) 728 729 self.assertEqual(12 % 4, 0) 730 self.assertEqual(-12 % 4, 0) 731 self.assertEqual(12 % -4, 0) 732 self.assertEqual(-12 % -4, 0) 733 734 def test_true_division(self): 735 huge = 1 << 40000 736 mhuge = -huge 737 self.assertEqual(huge / huge, 1.0) 738 self.assertEqual(mhuge / mhuge, 1.0) 739 self.assertEqual(huge / mhuge, -1.0) 740 self.assertEqual(mhuge / huge, -1.0) 741 self.assertEqual(1 / huge, 0.0) 742 self.assertEqual(1 / huge, 0.0) 743 self.assertEqual(1 / mhuge, 0.0) 744 self.assertEqual(1 / mhuge, 0.0) 745 self.assertEqual((666 * huge + (huge >> 1)) / huge, 666.5) 746 self.assertEqual((666 * mhuge + (mhuge >> 1)) / mhuge, 666.5) 747 self.assertEqual((666 * huge + (huge >> 1)) / mhuge, -666.5) 748 self.assertEqual((666 * mhuge + (mhuge >> 1)) / huge, -666.5) 749 self.assertEqual(huge / (huge << 1), 0.5) 750 self.assertEqual((1000000 * huge) / huge, 1000000) 751 752 namespace = {'huge': huge, 'mhuge': mhuge} 753 754 for overflow in ["float(huge)", "float(mhuge)", 755 "huge / 1", "huge / 2", "huge / -1", "huge / -2", 756 "mhuge / 100", "mhuge / 200"]: 757 self.assertRaises(OverflowError, eval, overflow, namespace) 758 759 for underflow in ["1 / huge", "2 / huge", "-1 / huge", "-2 / huge", 760 "100 / mhuge", "200 / mhuge"]: 761 result = eval(underflow, namespace) 762 self.assertEqual(result, 0.0, 763 "expected underflow to 0 from %r" % underflow) 764 765 for zero in ["huge / 0", "mhuge / 0"]: 766 self.assertRaises(ZeroDivisionError, eval, zero, namespace) 767 768 def test_floordiv(self): 769 with self.assertRaises(ZeroDivisionError): 770 _ = 1 // 0 771 772 self.assertEqual(2 // 3, 0) 773 self.assertEqual(2 // -3, -1) 774 self.assertEqual(-2 // 3, -1) 775 self.assertEqual(-2 // -3, 0) 776 777 self.assertEqual(-11 // -3, 3) 778 self.assertEqual(-11 // 3, -4) 779 self.assertEqual(11 // -3, -4) 780 self.assertEqual(11 // 3, 3) 781 782 self.assertEqual(-12 // -3, 4) 783 self.assertEqual(-12 // 3, -4) 784 self.assertEqual(12 // -3, -4) 785 self.assertEqual(12 // 3, 4) 786 787 def check_truediv(self, a, b, skip_small=True): 788 """Verify that the result of a/b is correctly rounded, by 789 comparing it with a pure Python implementation of correctly 790 rounded division. b should be nonzero.""" 791 792 # skip check for small a and b: in this case, the current 793 # implementation converts the arguments to float directly and 794 # then applies a float division. This can give doubly-rounded 795 # results on x87-using machines (particularly 32-bit Linux). 796 if skip_small and max(abs(a), abs(b)) < 2**DBL_MANT_DIG: 797 return 798 799 try: 800 # use repr so that we can distinguish between -0.0 and 0.0 801 expected = repr(truediv(a, b)) 802 except OverflowError: 803 expected = 'overflow' 804 except ZeroDivisionError: 805 expected = 'zerodivision' 806 807 try: 808 got = repr(a / b) 809 except OverflowError: 810 got = 'overflow' 811 except ZeroDivisionError: 812 got = 'zerodivision' 813 814 self.assertEqual(expected, got, "Incorrectly rounded division {}/{}: " 815 "expected {}, got {}".format(a, b, expected, got)) 816 817 @support.requires_IEEE_754 818 def test_correctly_rounded_true_division(self): 819 # more stringent tests than those above, checking that the 820 # result of true division of ints is always correctly rounded. 821 # This test should probably be considered CPython-specific. 822 823 # Exercise all the code paths not involving Gb-sized ints. 824 # ... divisions involving zero 825 self.check_truediv(123, 0) 826 self.check_truediv(-456, 0) 827 self.check_truediv(0, 3) 828 self.check_truediv(0, -3) 829 self.check_truediv(0, 0) 830 # ... overflow or underflow by large margin 831 self.check_truediv(671 * 12345 * 2**DBL_MAX_EXP, 12345) 832 self.check_truediv(12345, 345678 * 2**(DBL_MANT_DIG - DBL_MIN_EXP)) 833 # ... a much larger or smaller than b 834 self.check_truediv(12345*2**100, 98765) 835 self.check_truediv(12345*2**30, 98765*7**81) 836 # ... a / b near a boundary: one of 1, 2**DBL_MANT_DIG, 2**DBL_MIN_EXP, 837 # 2**DBL_MAX_EXP, 2**(DBL_MIN_EXP-DBL_MANT_DIG) 838 bases = (0, DBL_MANT_DIG, DBL_MIN_EXP, 839 DBL_MAX_EXP, DBL_MIN_EXP - DBL_MANT_DIG) 840 for base in bases: 841 for exp in range(base - 15, base + 15): 842 self.check_truediv(75312*2**max(exp, 0), 69187*2**max(-exp, 0)) 843 self.check_truediv(69187*2**max(exp, 0), 75312*2**max(-exp, 0)) 844 845 # overflow corner case 846 for m in [1, 2, 7, 17, 12345, 7**100, 847 -1, -2, -5, -23, -67891, -41**50]: 848 for n in range(-10, 10): 849 self.check_truediv(m*DBL_MIN_OVERFLOW + n, m) 850 self.check_truediv(m*DBL_MIN_OVERFLOW + n, -m) 851 852 # check detection of inexactness in shifting stage 853 for n in range(250): 854 # (2**DBL_MANT_DIG+1)/(2**DBL_MANT_DIG) lies halfway 855 # between two representable floats, and would usually be 856 # rounded down under round-half-to-even. The tiniest of 857 # additions to the numerator should cause it to be rounded 858 # up instead. 859 self.check_truediv((2**DBL_MANT_DIG + 1)*12345*2**200 + 2**n, 860 2**DBL_MANT_DIG*12345) 861 862 # 1/2731 is one of the smallest division cases that's subject 863 # to double rounding on IEEE 754 machines working internally with 864 # 64-bit precision. On such machines, the next check would fail, 865 # were it not explicitly skipped in check_truediv. 866 self.check_truediv(1, 2731) 867 868 # a particularly bad case for the old algorithm: gives an 869 # error of close to 3.5 ulps. 870 self.check_truediv(295147931372582273023, 295147932265116303360) 871 for i in range(1000): 872 self.check_truediv(10**(i+1), 10**i) 873 self.check_truediv(10**i, 10**(i+1)) 874 875 # test round-half-to-even behaviour, normal result 876 for m in [1, 2, 4, 7, 8, 16, 17, 32, 12345, 7**100, 877 -1, -2, -5, -23, -67891, -41**50]: 878 for n in range(-10, 10): 879 self.check_truediv(2**DBL_MANT_DIG*m + n, m) 880 881 # test round-half-to-even, subnormal result 882 for n in range(-20, 20): 883 self.check_truediv(n, 2**1076) 884 885 # largeish random divisions: a/b where |a| <= |b| <= 886 # 2*|a|; |ans| is between 0.5 and 1.0, so error should 887 # always be bounded by 2**-54 with equality possible only 888 # if the least significant bit of q=ans*2**53 is zero. 889 for M in [10**10, 10**100, 10**1000]: 890 for i in range(1000): 891 a = random.randrange(1, M) 892 b = random.randrange(a, 2*a+1) 893 self.check_truediv(a, b) 894 self.check_truediv(-a, b) 895 self.check_truediv(a, -b) 896 self.check_truediv(-a, -b) 897 898 # and some (genuinely) random tests 899 for _ in range(10000): 900 a_bits = random.randrange(1000) 901 b_bits = random.randrange(1, 1000) 902 x = random.randrange(2**a_bits) 903 y = random.randrange(1, 2**b_bits) 904 self.check_truediv(x, y) 905 self.check_truediv(x, -y) 906 self.check_truediv(-x, y) 907 self.check_truediv(-x, -y) 908 909 def test_lshift_of_zero(self): 910 self.assertEqual(0 << 0, 0) 911 self.assertEqual(0 << 10, 0) 912 with self.assertRaises(ValueError): 913 0 << -1 914 915 @support.cpython_only 916 def test_huge_lshift_of_zero(self): 917 # Shouldn't try to allocate memory for a huge shift. See issue #27870. 918 # Other implementations may have a different boundary for overflow, 919 # or not raise at all. 920 self.assertEqual(0 << sys.maxsize, 0) 921 with self.assertRaises(OverflowError): 922 0 << (sys.maxsize + 1) 923 924 def test_small_ints(self): 925 for i in range(-5, 257): 926 self.assertIs(i, i + 0) 927 self.assertIs(i, i * 1) 928 self.assertIs(i, i - 0) 929 self.assertIs(i, i // 1) 930 self.assertIs(i, i & -1) 931 self.assertIs(i, i | 0) 932 self.assertIs(i, i ^ 0) 933 self.assertIs(i, ~~i) 934 self.assertIs(i, i**1) 935 self.assertIs(i, int(str(i))) 936 self.assertIs(i, i<<2>>2, str(i)) 937 # corner cases 938 i = 1 << 70 939 self.assertIs(i - i, 0) 940 self.assertIs(0 * i, 0) 941 942 def test_bit_length(self): 943 tiny = 1e-10 944 for x in range(-65000, 65000): 945 k = x.bit_length() 946 # Check equivalence with Python version 947 self.assertEqual(k, len(bin(x).lstrip('-0b'))) 948 # Behaviour as specified in the docs 949 if x != 0: 950 self.assertTrue(2**(k-1) <= abs(x) < 2**k) 951 else: 952 self.assertEqual(k, 0) 953 # Alternative definition: x.bit_length() == 1 + floor(log_2(x)) 954 if x != 0: 955 # When x is an exact power of 2, numeric errors can 956 # cause floor(log(x)/log(2)) to be one too small; for 957 # small x this can be fixed by adding a small quantity 958 # to the quotient before taking the floor. 959 self.assertEqual(k, 1 + math.floor( 960 math.log(abs(x))/math.log(2) + tiny)) 961 962 self.assertEqual((0).bit_length(), 0) 963 self.assertEqual((1).bit_length(), 1) 964 self.assertEqual((-1).bit_length(), 1) 965 self.assertEqual((2).bit_length(), 2) 966 self.assertEqual((-2).bit_length(), 2) 967 for i in [2, 3, 15, 16, 17, 31, 32, 33, 63, 64, 234]: 968 a = 2**i 969 self.assertEqual((a-1).bit_length(), i) 970 self.assertEqual((1-a).bit_length(), i) 971 self.assertEqual((a).bit_length(), i+1) 972 self.assertEqual((-a).bit_length(), i+1) 973 self.assertEqual((a+1).bit_length(), i+1) 974 self.assertEqual((-a-1).bit_length(), i+1) 975 976 def test_round(self): 977 # check round-half-even algorithm. For round to nearest ten; 978 # rounding map is invariant under adding multiples of 20 979 test_dict = {0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 980 6:10, 7:10, 8:10, 9:10, 10:10, 11:10, 12:10, 13:10, 14:10, 981 15:20, 16:20, 17:20, 18:20, 19:20} 982 for offset in range(-520, 520, 20): 983 for k, v in test_dict.items(): 984 got = round(k+offset, -1) 985 expected = v+offset 986 self.assertEqual(got, expected) 987 self.assertIs(type(got), int) 988 989 # larger second argument 990 self.assertEqual(round(-150, -2), -200) 991 self.assertEqual(round(-149, -2), -100) 992 self.assertEqual(round(-51, -2), -100) 993 self.assertEqual(round(-50, -2), 0) 994 self.assertEqual(round(-49, -2), 0) 995 self.assertEqual(round(-1, -2), 0) 996 self.assertEqual(round(0, -2), 0) 997 self.assertEqual(round(1, -2), 0) 998 self.assertEqual(round(49, -2), 0) 999 self.assertEqual(round(50, -2), 0) 1000 self.assertEqual(round(51, -2), 100) 1001 self.assertEqual(round(149, -2), 100) 1002 self.assertEqual(round(150, -2), 200) 1003 self.assertEqual(round(250, -2), 200) 1004 self.assertEqual(round(251, -2), 300) 1005 self.assertEqual(round(172500, -3), 172000) 1006 self.assertEqual(round(173500, -3), 174000) 1007 self.assertEqual(round(31415926535, -1), 31415926540) 1008 self.assertEqual(round(31415926535, -2), 31415926500) 1009 self.assertEqual(round(31415926535, -3), 31415927000) 1010 self.assertEqual(round(31415926535, -4), 31415930000) 1011 self.assertEqual(round(31415926535, -5), 31415900000) 1012 self.assertEqual(round(31415926535, -6), 31416000000) 1013 self.assertEqual(round(31415926535, -7), 31420000000) 1014 self.assertEqual(round(31415926535, -8), 31400000000) 1015 self.assertEqual(round(31415926535, -9), 31000000000) 1016 self.assertEqual(round(31415926535, -10), 30000000000) 1017 self.assertEqual(round(31415926535, -11), 0) 1018 self.assertEqual(round(31415926535, -12), 0) 1019 self.assertEqual(round(31415926535, -999), 0) 1020 1021 # should get correct results even for huge inputs 1022 for k in range(10, 100): 1023 got = round(10**k + 324678, -3) 1024 expect = 10**k + 325000 1025 self.assertEqual(got, expect) 1026 self.assertIs(type(got), int) 1027 1028 # nonnegative second argument: round(x, n) should just return x 1029 for n in range(5): 1030 for i in range(100): 1031 x = random.randrange(-10000, 10000) 1032 got = round(x, n) 1033 self.assertEqual(got, x) 1034 self.assertIs(type(got), int) 1035 for huge_n in 2**31-1, 2**31, 2**63-1, 2**63, 2**100, 10**100: 1036 self.assertEqual(round(8979323, huge_n), 8979323) 1037 1038 # omitted second argument 1039 for i in range(100): 1040 x = random.randrange(-10000, 10000) 1041 got = round(x) 1042 self.assertEqual(got, x) 1043 self.assertIs(type(got), int) 1044 1045 # bad second argument 1046 bad_exponents = ('brian', 2.0, 0j) 1047 for e in bad_exponents: 1048 self.assertRaises(TypeError, round, 3, e) 1049 1050 def test_to_bytes(self): 1051 def check(tests, byteorder, signed=False): 1052 for test, expected in tests.items(): 1053 try: 1054 self.assertEqual( 1055 test.to_bytes(len(expected), byteorder, signed=signed), 1056 expected) 1057 except Exception as err: 1058 raise AssertionError( 1059 "failed to convert {0} with byteorder={1} and signed={2}" 1060 .format(test, byteorder, signed)) from err 1061 1062 # Convert integers to signed big-endian byte arrays. 1063 tests1 = { 1064 0: b'\x00', 1065 1: b'\x01', 1066 -1: b'\xff', 1067 -127: b'\x81', 1068 -128: b'\x80', 1069 -129: b'\xff\x7f', 1070 127: b'\x7f', 1071 129: b'\x00\x81', 1072 -255: b'\xff\x01', 1073 -256: b'\xff\x00', 1074 255: b'\x00\xff', 1075 256: b'\x01\x00', 1076 32767: b'\x7f\xff', 1077 -32768: b'\xff\x80\x00', 1078 65535: b'\x00\xff\xff', 1079 -65536: b'\xff\x00\x00', 1080 -8388608: b'\x80\x00\x00' 1081 } 1082 check(tests1, 'big', signed=True) 1083 1084 # Convert integers to signed little-endian byte arrays. 1085 tests2 = { 1086 0: b'\x00', 1087 1: b'\x01', 1088 -1: b'\xff', 1089 -127: b'\x81', 1090 -128: b'\x80', 1091 -129: b'\x7f\xff', 1092 127: b'\x7f', 1093 129: b'\x81\x00', 1094 -255: b'\x01\xff', 1095 -256: b'\x00\xff', 1096 255: b'\xff\x00', 1097 256: b'\x00\x01', 1098 32767: b'\xff\x7f', 1099 -32768: b'\x00\x80', 1100 65535: b'\xff\xff\x00', 1101 -65536: b'\x00\x00\xff', 1102 -8388608: b'\x00\x00\x80' 1103 } 1104 check(tests2, 'little', signed=True) 1105 1106 # Convert integers to unsigned big-endian byte arrays. 1107 tests3 = { 1108 0: b'\x00', 1109 1: b'\x01', 1110 127: b'\x7f', 1111 128: b'\x80', 1112 255: b'\xff', 1113 256: b'\x01\x00', 1114 32767: b'\x7f\xff', 1115 32768: b'\x80\x00', 1116 65535: b'\xff\xff', 1117 65536: b'\x01\x00\x00' 1118 } 1119 check(tests3, 'big', signed=False) 1120 1121 # Convert integers to unsigned little-endian byte arrays. 1122 tests4 = { 1123 0: b'\x00', 1124 1: b'\x01', 1125 127: b'\x7f', 1126 128: b'\x80', 1127 255: b'\xff', 1128 256: b'\x00\x01', 1129 32767: b'\xff\x7f', 1130 32768: b'\x00\x80', 1131 65535: b'\xff\xff', 1132 65536: b'\x00\x00\x01' 1133 } 1134 check(tests4, 'little', signed=False) 1135 1136 self.assertRaises(OverflowError, (256).to_bytes, 1, 'big', signed=False) 1137 self.assertRaises(OverflowError, (256).to_bytes, 1, 'big', signed=True) 1138 self.assertRaises(OverflowError, (256).to_bytes, 1, 'little', signed=False) 1139 self.assertRaises(OverflowError, (256).to_bytes, 1, 'little', signed=True) 1140 self.assertRaises(OverflowError, (-1).to_bytes, 2, 'big', signed=False) 1141 self.assertRaises(OverflowError, (-1).to_bytes, 2, 'little', signed=False) 1142 self.assertEqual((0).to_bytes(0, 'big'), b'') 1143 self.assertEqual((1).to_bytes(5, 'big'), b'\x00\x00\x00\x00\x01') 1144 self.assertEqual((0).to_bytes(5, 'big'), b'\x00\x00\x00\x00\x00') 1145 self.assertEqual((-1).to_bytes(5, 'big', signed=True), 1146 b'\xff\xff\xff\xff\xff') 1147 self.assertRaises(OverflowError, (1).to_bytes, 0, 'big') 1148 1149 def test_from_bytes(self): 1150 def check(tests, byteorder, signed=False): 1151 for test, expected in tests.items(): 1152 try: 1153 self.assertEqual( 1154 int.from_bytes(test, byteorder, signed=signed), 1155 expected) 1156 except Exception as err: 1157 raise AssertionError( 1158 "failed to convert {0} with byteorder={1!r} and signed={2}" 1159 .format(test, byteorder, signed)) from err 1160 1161 # Convert signed big-endian byte arrays to integers. 1162 tests1 = { 1163 b'': 0, 1164 b'\x00': 0, 1165 b'\x00\x00': 0, 1166 b'\x01': 1, 1167 b'\x00\x01': 1, 1168 b'\xff': -1, 1169 b'\xff\xff': -1, 1170 b'\x81': -127, 1171 b'\x80': -128, 1172 b'\xff\x7f': -129, 1173 b'\x7f': 127, 1174 b'\x00\x81': 129, 1175 b'\xff\x01': -255, 1176 b'\xff\x00': -256, 1177 b'\x00\xff': 255, 1178 b'\x01\x00': 256, 1179 b'\x7f\xff': 32767, 1180 b'\x80\x00': -32768, 1181 b'\x00\xff\xff': 65535, 1182 b'\xff\x00\x00': -65536, 1183 b'\x80\x00\x00': -8388608 1184 } 1185 check(tests1, 'big', signed=True) 1186 1187 # Convert signed little-endian byte arrays to integers. 1188 tests2 = { 1189 b'': 0, 1190 b'\x00': 0, 1191 b'\x00\x00': 0, 1192 b'\x01': 1, 1193 b'\x00\x01': 256, 1194 b'\xff': -1, 1195 b'\xff\xff': -1, 1196 b'\x81': -127, 1197 b'\x80': -128, 1198 b'\x7f\xff': -129, 1199 b'\x7f': 127, 1200 b'\x81\x00': 129, 1201 b'\x01\xff': -255, 1202 b'\x00\xff': -256, 1203 b'\xff\x00': 255, 1204 b'\x00\x01': 256, 1205 b'\xff\x7f': 32767, 1206 b'\x00\x80': -32768, 1207 b'\xff\xff\x00': 65535, 1208 b'\x00\x00\xff': -65536, 1209 b'\x00\x00\x80': -8388608 1210 } 1211 check(tests2, 'little', signed=True) 1212 1213 # Convert unsigned big-endian byte arrays to integers. 1214 tests3 = { 1215 b'': 0, 1216 b'\x00': 0, 1217 b'\x01': 1, 1218 b'\x7f': 127, 1219 b'\x80': 128, 1220 b'\xff': 255, 1221 b'\x01\x00': 256, 1222 b'\x7f\xff': 32767, 1223 b'\x80\x00': 32768, 1224 b'\xff\xff': 65535, 1225 b'\x01\x00\x00': 65536, 1226 } 1227 check(tests3, 'big', signed=False) 1228 1229 # Convert integers to unsigned little-endian byte arrays. 1230 tests4 = { 1231 b'': 0, 1232 b'\x00': 0, 1233 b'\x01': 1, 1234 b'\x7f': 127, 1235 b'\x80': 128, 1236 b'\xff': 255, 1237 b'\x00\x01': 256, 1238 b'\xff\x7f': 32767, 1239 b'\x00\x80': 32768, 1240 b'\xff\xff': 65535, 1241 b'\x00\x00\x01': 65536, 1242 } 1243 check(tests4, 'little', signed=False) 1244 1245 class myint(int): 1246 pass 1247 1248 self.assertIs(type(myint.from_bytes(b'\x00', 'big')), myint) 1249 self.assertEqual(myint.from_bytes(b'\x01', 'big'), 1) 1250 self.assertIs( 1251 type(myint.from_bytes(b'\x00', 'big', signed=False)), myint) 1252 self.assertEqual(myint.from_bytes(b'\x01', 'big', signed=False), 1) 1253 self.assertIs(type(myint.from_bytes(b'\x00', 'little')), myint) 1254 self.assertEqual(myint.from_bytes(b'\x01', 'little'), 1) 1255 self.assertIs(type(myint.from_bytes( 1256 b'\x00', 'little', signed=False)), myint) 1257 self.assertEqual(myint.from_bytes(b'\x01', 'little', signed=False), 1) 1258 self.assertEqual( 1259 int.from_bytes([255, 0, 0], 'big', signed=True), -65536) 1260 self.assertEqual( 1261 int.from_bytes((255, 0, 0), 'big', signed=True), -65536) 1262 self.assertEqual(int.from_bytes( 1263 bytearray(b'\xff\x00\x00'), 'big', signed=True), -65536) 1264 self.assertEqual(int.from_bytes( 1265 bytearray(b'\xff\x00\x00'), 'big', signed=True), -65536) 1266 self.assertEqual(int.from_bytes( 1267 array.array('B', b'\xff\x00\x00'), 'big', signed=True), -65536) 1268 self.assertEqual(int.from_bytes( 1269 memoryview(b'\xff\x00\x00'), 'big', signed=True), -65536) 1270 self.assertRaises(ValueError, int.from_bytes, [256], 'big') 1271 self.assertRaises(ValueError, int.from_bytes, [0], 'big\x00') 1272 self.assertRaises(ValueError, int.from_bytes, [0], 'little\x00') 1273 self.assertRaises(TypeError, int.from_bytes, "", 'big') 1274 self.assertRaises(TypeError, int.from_bytes, "\x00", 'big') 1275 self.assertRaises(TypeError, int.from_bytes, 0, 'big') 1276 self.assertRaises(TypeError, int.from_bytes, 0, 'big', True) 1277 self.assertRaises(TypeError, myint.from_bytes, "", 'big') 1278 self.assertRaises(TypeError, myint.from_bytes, "\x00", 'big') 1279 self.assertRaises(TypeError, myint.from_bytes, 0, 'big') 1280 self.assertRaises(TypeError, int.from_bytes, 0, 'big', True) 1281 1282 class myint2(int): 1283 def __new__(cls, value): 1284 return int.__new__(cls, value + 1) 1285 1286 i = myint2.from_bytes(b'\x01', 'big') 1287 self.assertIs(type(i), myint2) 1288 self.assertEqual(i, 2) 1289 1290 class myint3(int): 1291 def __init__(self, value): 1292 self.foo = 'bar' 1293 1294 i = myint3.from_bytes(b'\x01', 'big') 1295 self.assertIs(type(i), myint3) 1296 self.assertEqual(i, 1) 1297 self.assertEqual(getattr(i, 'foo', 'none'), 'bar') 1298 1299 def test_access_to_nonexistent_digit_0(self): 1300 # http://bugs.python.org/issue14630: A bug in _PyLong_Copy meant that 1301 # ob_digit[0] was being incorrectly accessed for instances of a 1302 # subclass of int, with value 0. 1303 class Integer(int): 1304 def __new__(cls, value=0): 1305 self = int.__new__(cls, value) 1306 self.foo = 'foo' 1307 return self 1308 1309 integers = [Integer(0) for i in range(1000)] 1310 for n in map(int, integers): 1311 self.assertEqual(n, 0) 1312 1313 def test_shift_bool(self): 1314 # Issue #21422: ensure that bool << int and bool >> int return int 1315 for value in (True, False): 1316 for shift in (0, 2): 1317 self.assertEqual(type(value << shift), int) 1318 self.assertEqual(type(value >> shift), int) 1319 1320 1321 if __name__ == "__main__": 1322 unittest.main() 1323