14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport sys 24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport unittest 44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom test.test_support import run_unittest, have_unicode 54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport math 64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmL = [ 84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ('0', 0), 94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ('1', 1), 104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ('9', 9), 114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ('10', 10), 124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ('99', 99), 134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ('100', 100), 144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ('314', 314), 154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (' 314', 314), 164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ('314 ', 314), 174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (' \t\t 314 \t\t ', 314), 184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (repr(sys.maxint), sys.maxint), 194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (' 1x', ValueError), 204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (' 1 ', 1), 214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (' 1\02 ', ValueError), 224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ('', ValueError), 234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (' ', ValueError), 244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (' \t\t ', ValueError) 254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm] 264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmif have_unicode: 274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm L += [ 284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (unicode('0'), 0), 294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (unicode('1'), 1), 304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (unicode('9'), 9), 314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (unicode('10'), 10), 324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (unicode('99'), 99), 334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (unicode('100'), 100), 344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (unicode('314'), 314), 354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (unicode(' 314'), 314), 364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (unicode('\u0663\u0661\u0664 ','raw-unicode-escape'), 314), 374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (unicode(' \t\t 314 \t\t '), 314), 384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (unicode(' 1x'), ValueError), 394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (unicode(' 1 '), 1), 404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (unicode(' 1\02 '), ValueError), 414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (unicode(''), ValueError), 424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (unicode(' '), ValueError), 434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (unicode(' \t\t '), ValueError), 444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (unichr(0x200), ValueError), 454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm] 464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass IntTestCases(unittest.TestCase): 484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_basic(self): 504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(314), 314) 514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(3.14), 3) 524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(314L), 314) 534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Check that conversion from float truncates towards zero 544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(-3.14), -3) 554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(3.9), 3) 564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(-3.9), -3) 574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(3.5), 3) 584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(-3.5), -3) 594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Different base: 604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int("10",16), 16L) 614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if have_unicode: 624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(unicode("10"),16), 16L) 634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Test conversion from strings and various anomalies 644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for s, v in L: 654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for sign in "", "+", "-": 664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for prefix in "", " ", "\t", " \t\t ": 674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ss = prefix + sign + s 684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm vv = v 694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if sign == "-" and v is not ValueError: 704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm vv = -v 714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(ss), vv) 734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except v: 744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s = repr(-1-sys.maxint) 774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = int(s) 784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(x+1, -sys.maxint) 794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIsInstance(x, int) 804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # should return long 814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(s[1:]), sys.maxint+1) 824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # should return long 844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = int(1e100) 854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIsInstance(x, long) 864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = int(-1e100) 874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIsInstance(x, long) 884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # SF bug 434186: 0x80000000/2 != 0x80000000>>1. 914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Worked by accident in Windows release build, but failed in debug build. 924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Failed in all Linux builds. 934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = -1-sys.maxint 944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(x >> 1, x//2) 954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(ValueError, int, '123\0') 974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(ValueError, int, '53', 40) 984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # SF bug 1545497: embedded NULs were not detected with 1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # explicit base 1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(ValueError, int, '123\0', 10) 1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(ValueError, int, '123\x00 245', 20) 1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = int('1' * 600) 1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIsInstance(x, long) 1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if have_unicode: 1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = int(unichr(0x661) * 600) 1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIsInstance(x, long) 1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, int, 1, 12) 1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('0123', 0), 83) 1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('0x123', 16), 291) 1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Bug 1679: "0x" is not a valid hex literal 1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(ValueError, int, "0x", 16) 1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(ValueError, int, "0x", 0) 1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(ValueError, int, "0o", 8) 1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(ValueError, int, "0o", 0) 1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(ValueError, int, "0b", 2) 1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(ValueError, int, "0b", 0) 1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # SF bug 1334662: int(string, base) wrong answers 1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Various representations of 2**32 evaluated to 0 1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # rather than 2**32 in previous versions 1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('100000000000000000000000000000000', 2), 4294967296L) 1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('102002022201221111211', 3), 4294967296L) 1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('10000000000000000', 4), 4294967296L) 1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('32244002423141', 5), 4294967296L) 1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('1550104015504', 6), 4294967296L) 1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('211301422354', 7), 4294967296L) 1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('40000000000', 8), 4294967296L) 1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('12068657454', 9), 4294967296L) 1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('4294967296', 10), 4294967296L) 1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('1904440554', 11), 4294967296L) 1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('9ba461594', 12), 4294967296L) 1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('535a79889', 13), 4294967296L) 1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('2ca5b7464', 14), 4294967296L) 1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('1a20dcd81', 15), 4294967296L) 1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('100000000', 16), 4294967296L) 1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('a7ffda91', 17), 4294967296L) 1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('704he7g4', 18), 4294967296L) 1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('4f5aff66', 19), 4294967296L) 1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('3723ai4g', 20), 4294967296L) 1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('281d55i4', 21), 4294967296L) 1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('1fj8b184', 22), 4294967296L) 1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('1606k7ic', 23), 4294967296L) 1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('mb994ag', 24), 4294967296L) 1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('hek2mgl', 25), 4294967296L) 1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('dnchbnm', 26), 4294967296L) 1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('b28jpdm', 27), 4294967296L) 1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('8pfgih4', 28), 4294967296L) 1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('76beigg', 29), 4294967296L) 1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('5qmcpqg', 30), 4294967296L) 1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('4q0jto4', 31), 4294967296L) 1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('4000000', 32), 4294967296L) 1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('3aokq94', 33), 4294967296L) 1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('2qhxjli', 34), 4294967296L) 1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('2br45qb', 35), 4294967296L) 1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('1z141z4', 36), 4294967296L) 1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # tests with base 0 1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # this fails on 3.0, but in 2.x the old octal syntax is allowed 1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(' 0123 ', 0), 83) 1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(' 0123 ', 0), 83) 1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('000', 0), 0) 1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('0o123', 0), 83) 1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('0x123', 0), 291) 1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('0b100', 0), 4) 1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(' 0O123 ', 0), 83) 1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(' 0X123 ', 0), 291) 1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(' 0B100 ', 0), 4) 1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('0', 0), 0) 1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('+0', 0), 0) 1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('-0', 0), 0) 1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('00', 0), 0) 1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(ValueError, int, '08', 0) 1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(ValueError, int, '-012395', 0) 1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # without base still base 10 1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('0123'), 123) 1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('0123', 10), 123) 1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # tests with prefix and base != 0 1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('0x123', 16), 291) 1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('0o123', 8), 83) 1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('0b100', 2), 4) 1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('0X123', 16), 291) 1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('0O123', 8), 83) 1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('0B100', 2), 4) 1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # the code has special checks for the first character after the 1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # type prefix 1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(ValueError, int, '0b2', 2) 2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(ValueError, int, '0b02', 2) 2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(ValueError, int, '0B2', 2) 2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(ValueError, int, '0B02', 2) 2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(ValueError, int, '0o8', 8) 2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(ValueError, int, '0o08', 8) 2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(ValueError, int, '0O8', 8) 2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(ValueError, int, '0O08', 8) 2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(ValueError, int, '0xg', 16) 2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(ValueError, int, '0x0g', 16) 2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(ValueError, int, '0Xg', 16) 2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(ValueError, int, '0X0g', 16) 2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # SF bug 1334662: int(string, base) wrong answers 2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Checks for proper evaluation of 2**32 + 1 2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('100000000000000000000000000000001', 2), 4294967297L) 2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('102002022201221111212', 3), 4294967297L) 2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('10000000000000001', 4), 4294967297L) 2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('32244002423142', 5), 4294967297L) 2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('1550104015505', 6), 4294967297L) 2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('211301422355', 7), 4294967297L) 2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('40000000001', 8), 4294967297L) 2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('12068657455', 9), 4294967297L) 2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('4294967297', 10), 4294967297L) 2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('1904440555', 11), 4294967297L) 2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('9ba461595', 12), 4294967297L) 2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('535a7988a', 13), 4294967297L) 2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('2ca5b7465', 14), 4294967297L) 2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('1a20dcd82', 15), 4294967297L) 2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('100000001', 16), 4294967297L) 2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('a7ffda92', 17), 4294967297L) 2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('704he7g5', 18), 4294967297L) 2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('4f5aff67', 19), 4294967297L) 2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('3723ai4h', 20), 4294967297L) 2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('281d55i5', 21), 4294967297L) 2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('1fj8b185', 22), 4294967297L) 2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('1606k7id', 23), 4294967297L) 2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('mb994ah', 24), 4294967297L) 2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('hek2mgm', 25), 4294967297L) 2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('dnchbnn', 26), 4294967297L) 2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('b28jpdn', 27), 4294967297L) 2404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('8pfgih5', 28), 4294967297L) 2414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('76beigh', 29), 4294967297L) 2424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('5qmcpqh', 30), 4294967297L) 2434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('4q0jto5', 31), 4294967297L) 2444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('4000001', 32), 4294967297L) 2454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('3aokq95', 33), 4294967297L) 2464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('2qhxjlj', 34), 4294967297L) 2474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('2br45qc', 35), 4294967297L) 2484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int('1z141z5', 36), 4294967297L) 2494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_bit_length(self): 2514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tiny = 1e-10 2524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for x in xrange(-65000, 65000): 2534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm k = x.bit_length() 2544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Check equivalence with Python version 2554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(k, len(bin(x).lstrip('-0b'))) 2564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Behaviour as specified in the docs 2574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if x != 0: 2584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(2**(k-1) <= abs(x) < 2**k) 2594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 2604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(k, 0) 2614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Alternative definition: x.bit_length() == 1 + floor(log_2(x)) 2624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if x != 0: 2634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # When x is an exact power of 2, numeric errors can 2644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # cause floor(log(x)/log(2)) to be one too small; for 2654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # small x this can be fixed by adding a small quantity 2664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # to the quotient before taking the floor. 2674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(k, 1 + math.floor( 2684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm math.log(abs(x))/math.log(2) + tiny)) 2694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual((0).bit_length(), 0) 2714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual((1).bit_length(), 1) 2724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual((-1).bit_length(), 1) 2734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual((2).bit_length(), 2) 2744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual((-2).bit_length(), 2) 2754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in [2, 3, 15, 16, 17, 31, 32, 33, 63, 64]: 2764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm a = 2**i 2774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual((a-1).bit_length(), i) 2784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual((1-a).bit_length(), i) 2794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual((a).bit_length(), i+1) 2804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual((-a).bit_length(), i+1) 2814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual((a+1).bit_length(), i+1) 2824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual((-a-1).bit_length(), i+1) 2834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @unittest.skipUnless(float.__getformat__("double").startswith("IEEE"), 2854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "test requires IEEE 754 doubles") 2864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_float_conversion(self): 2874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # values exactly representable as floats 2884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm exact_values = [-2, -1, 0, 1, 2, 2**52, 2**53-1, 2**53, 2**53+2, 2894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2**53+4, 2**54-4, 2**54-2, 2**63, -2**63, 2**64, 2904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm -2**64, 10**20, 10**21, 10**22] 2914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for value in exact_values: 2924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(float(int(value))), value) 2934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # test round-half-to-even 2954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(float(2**53+1)), 2**53) 2964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(float(2**53+2)), 2**53+2) 2974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(float(2**53+3)), 2**53+4) 2984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(float(2**53+5)), 2**53+4) 2994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(float(2**53+6)), 2**53+6) 3004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(float(2**53+7)), 2**53+8) 3014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(float(-2**53-1)), -2**53) 3034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(float(-2**53-2)), -2**53-2) 3044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(float(-2**53-3)), -2**53-4) 3054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(float(-2**53-5)), -2**53-4) 3064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(float(-2**53-6)), -2**53-6) 3074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(float(-2**53-7)), -2**53-8) 3084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(float(2**54-2)), 2**54-2) 3104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(float(2**54-1)), 2**54) 3114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(float(2**54+2)), 2**54) 3124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(float(2**54+3)), 2**54+4) 3134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(float(2**54+5)), 2**54+4) 3144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(float(2**54+6)), 2**54+8) 3154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(float(2**54+10)), 2**54+8) 3164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(float(2**54+11)), 2**54+12) 3174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_intconversion(self): 3194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Test __int__() 3204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class ClassicMissingMethods: 3214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 3224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(AttributeError, int, ClassicMissingMethods()) 3234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class MissingMethods(object): 3254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 3264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, int, MissingMethods()) 3274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class Foo0: 3294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __int__(self): 3304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 42 3314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class Foo1(object): 3334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __int__(self): 3344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 42 3354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class Foo2(int): 3374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __int__(self): 3384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 42 3394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class Foo3(int): 3414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __int__(self): 3424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self 3434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class Foo4(int): 3454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __int__(self): 3464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 42L 3474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class Foo5(int): 3494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __int__(self): 3504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 42. 3514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(Foo0()), 42) 3534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(Foo1()), 42) 3544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(Foo2()), 42) 3554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(Foo3()), 0) 3564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(Foo4()), 42L) 3574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, int, Foo5()) 3584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class Classic: 3604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 3614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for base in (object, Classic): 3624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class IntOverridesTrunc(base): 3634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __int__(self): 3644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 42 3654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __trunc__(self): 3664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -12 3674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(IntOverridesTrunc()), 42) 3684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class JustTrunc(base): 3704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __trunc__(self): 3714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 42 3724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(JustTrunc()), 42) 3734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for trunc_result_base in (object, Classic): 3754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class Integral(trunc_result_base): 3764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __int__(self): 3774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 42 3784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class TruncReturnsNonInt(base): 3804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __trunc__(self): 3814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Integral() 3824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(int(TruncReturnsNonInt()), 42) 3834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class NonIntegral(trunc_result_base): 3854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __trunc__(self): 3864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Check that we avoid infinite recursion. 3874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NonIntegral() 3884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class TruncReturnsNonIntegral(base): 3904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __trunc__(self): 3914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NonIntegral() 3924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 3934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int(TruncReturnsNonIntegral()) 3944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except TypeError as e: 3954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(str(e), 3964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "__trunc__ returned non-Integral" 3974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm " (type NonIntegral)") 3984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 3994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.fail("Failed to raise TypeError with %s" % 4004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ((base, trunc_result_base),)) 4014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef test_main(): 4034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm run_unittest(IntTestCases) 4044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmif __name__ == "__main__": 4064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm test_main() 407