+++ /dev/null
-import sys\r
-\r
-import unittest\r
-from test.test_support import run_unittest, have_unicode\r
-import math\r
-\r
-L = [\r
- ('0', 0),\r
- ('1', 1),\r
- ('9', 9),\r
- ('10', 10),\r
- ('99', 99),\r
- ('100', 100),\r
- ('314', 314),\r
- (' 314', 314),\r
- ('314 ', 314),\r
- (' \t\t 314 \t\t ', 314),\r
- (repr(sys.maxint), sys.maxint),\r
- (' 1x', ValueError),\r
- (' 1 ', 1),\r
- (' 1\02 ', ValueError),\r
- ('', ValueError),\r
- (' ', ValueError),\r
- (' \t\t ', ValueError)\r
-]\r
-if have_unicode:\r
- L += [\r
- (unicode('0'), 0),\r
- (unicode('1'), 1),\r
- (unicode('9'), 9),\r
- (unicode('10'), 10),\r
- (unicode('99'), 99),\r
- (unicode('100'), 100),\r
- (unicode('314'), 314),\r
- (unicode(' 314'), 314),\r
- (unicode('\u0663\u0661\u0664 ','raw-unicode-escape'), 314),\r
- (unicode(' \t\t 314 \t\t '), 314),\r
- (unicode(' 1x'), ValueError),\r
- (unicode(' 1 '), 1),\r
- (unicode(' 1\02 '), ValueError),\r
- (unicode(''), ValueError),\r
- (unicode(' '), ValueError),\r
- (unicode(' \t\t '), ValueError),\r
- (unichr(0x200), ValueError),\r
-]\r
-\r
-class IntTestCases(unittest.TestCase):\r
-\r
- def test_basic(self):\r
- self.assertEqual(int(314), 314)\r
- self.assertEqual(int(3.14), 3)\r
- self.assertEqual(int(314L), 314)\r
- # Check that conversion from float truncates towards zero\r
- self.assertEqual(int(-3.14), -3)\r
- self.assertEqual(int(3.9), 3)\r
- self.assertEqual(int(-3.9), -3)\r
- self.assertEqual(int(3.5), 3)\r
- self.assertEqual(int(-3.5), -3)\r
- # Different base:\r
- self.assertEqual(int("10",16), 16L)\r
- if have_unicode:\r
- self.assertEqual(int(unicode("10"),16), 16L)\r
- # Test conversion from strings and various anomalies\r
- for s, v in L:\r
- for sign in "", "+", "-":\r
- for prefix in "", " ", "\t", " \t\t ":\r
- ss = prefix + sign + s\r
- vv = v\r
- if sign == "-" and v is not ValueError:\r
- vv = -v\r
- try:\r
- self.assertEqual(int(ss), vv)\r
- except v:\r
- pass\r
-\r
- s = repr(-1-sys.maxint)\r
- x = int(s)\r
- self.assertEqual(x+1, -sys.maxint)\r
- self.assertIsInstance(x, int)\r
- # should return long\r
- self.assertEqual(int(s[1:]), sys.maxint+1)\r
-\r
- # should return long\r
- x = int(1e100)\r
- self.assertIsInstance(x, long)\r
- x = int(-1e100)\r
- self.assertIsInstance(x, long)\r
-\r
-\r
- # SF bug 434186: 0x80000000/2 != 0x80000000>>1.\r
- # Worked by accident in Windows release build, but failed in debug build.\r
- # Failed in all Linux builds.\r
- x = -1-sys.maxint\r
- self.assertEqual(x >> 1, x//2)\r
-\r
- self.assertRaises(ValueError, int, '123\0')\r
- self.assertRaises(ValueError, int, '53', 40)\r
-\r
- # SF bug 1545497: embedded NULs were not detected with\r
- # explicit base\r
- self.assertRaises(ValueError, int, '123\0', 10)\r
- self.assertRaises(ValueError, int, '123\x00 245', 20)\r
-\r
- x = int('1' * 600)\r
- self.assertIsInstance(x, long)\r
-\r
- if have_unicode:\r
- x = int(unichr(0x661) * 600)\r
- self.assertIsInstance(x, long)\r
-\r
- self.assertRaises(TypeError, int, 1, 12)\r
-\r
- self.assertEqual(int('0123', 0), 83)\r
- self.assertEqual(int('0x123', 16), 291)\r
-\r
- # Bug 1679: "0x" is not a valid hex literal\r
- self.assertRaises(ValueError, int, "0x", 16)\r
- self.assertRaises(ValueError, int, "0x", 0)\r
-\r
- self.assertRaises(ValueError, int, "0o", 8)\r
- self.assertRaises(ValueError, int, "0o", 0)\r
-\r
- self.assertRaises(ValueError, int, "0b", 2)\r
- self.assertRaises(ValueError, int, "0b", 0)\r
-\r
-\r
- # SF bug 1334662: int(string, base) wrong answers\r
- # Various representations of 2**32 evaluated to 0\r
- # rather than 2**32 in previous versions\r
-\r
- self.assertEqual(int('100000000000000000000000000000000', 2), 4294967296L)\r
- self.assertEqual(int('102002022201221111211', 3), 4294967296L)\r
- self.assertEqual(int('10000000000000000', 4), 4294967296L)\r
- self.assertEqual(int('32244002423141', 5), 4294967296L)\r
- self.assertEqual(int('1550104015504', 6), 4294967296L)\r
- self.assertEqual(int('211301422354', 7), 4294967296L)\r
- self.assertEqual(int('40000000000', 8), 4294967296L)\r
- self.assertEqual(int('12068657454', 9), 4294967296L)\r
- self.assertEqual(int('4294967296', 10), 4294967296L)\r
- self.assertEqual(int('1904440554', 11), 4294967296L)\r
- self.assertEqual(int('9ba461594', 12), 4294967296L)\r
- self.assertEqual(int('535a79889', 13), 4294967296L)\r
- self.assertEqual(int('2ca5b7464', 14), 4294967296L)\r
- self.assertEqual(int('1a20dcd81', 15), 4294967296L)\r
- self.assertEqual(int('100000000', 16), 4294967296L)\r
- self.assertEqual(int('a7ffda91', 17), 4294967296L)\r
- self.assertEqual(int('704he7g4', 18), 4294967296L)\r
- self.assertEqual(int('4f5aff66', 19), 4294967296L)\r
- self.assertEqual(int('3723ai4g', 20), 4294967296L)\r
- self.assertEqual(int('281d55i4', 21), 4294967296L)\r
- self.assertEqual(int('1fj8b184', 22), 4294967296L)\r
- self.assertEqual(int('1606k7ic', 23), 4294967296L)\r
- self.assertEqual(int('mb994ag', 24), 4294967296L)\r
- self.assertEqual(int('hek2mgl', 25), 4294967296L)\r
- self.assertEqual(int('dnchbnm', 26), 4294967296L)\r
- self.assertEqual(int('b28jpdm', 27), 4294967296L)\r
- self.assertEqual(int('8pfgih4', 28), 4294967296L)\r
- self.assertEqual(int('76beigg', 29), 4294967296L)\r
- self.assertEqual(int('5qmcpqg', 30), 4294967296L)\r
- self.assertEqual(int('4q0jto4', 31), 4294967296L)\r
- self.assertEqual(int('4000000', 32), 4294967296L)\r
- self.assertEqual(int('3aokq94', 33), 4294967296L)\r
- self.assertEqual(int('2qhxjli', 34), 4294967296L)\r
- self.assertEqual(int('2br45qb', 35), 4294967296L)\r
- self.assertEqual(int('1z141z4', 36), 4294967296L)\r
-\r
- # tests with base 0\r
- # this fails on 3.0, but in 2.x the old octal syntax is allowed\r
- self.assertEqual(int(' 0123 ', 0), 83)\r
- self.assertEqual(int(' 0123 ', 0), 83)\r
- self.assertEqual(int('000', 0), 0)\r
- self.assertEqual(int('0o123', 0), 83)\r
- self.assertEqual(int('0x123', 0), 291)\r
- self.assertEqual(int('0b100', 0), 4)\r
- self.assertEqual(int(' 0O123 ', 0), 83)\r
- self.assertEqual(int(' 0X123 ', 0), 291)\r
- self.assertEqual(int(' 0B100 ', 0), 4)\r
- self.assertEqual(int('0', 0), 0)\r
- self.assertEqual(int('+0', 0), 0)\r
- self.assertEqual(int('-0', 0), 0)\r
- self.assertEqual(int('00', 0), 0)\r
- self.assertRaises(ValueError, int, '08', 0)\r
- self.assertRaises(ValueError, int, '-012395', 0)\r
-\r
- # without base still base 10\r
- self.assertEqual(int('0123'), 123)\r
- self.assertEqual(int('0123', 10), 123)\r
-\r
- # tests with prefix and base != 0\r
- self.assertEqual(int('0x123', 16), 291)\r
- self.assertEqual(int('0o123', 8), 83)\r
- self.assertEqual(int('0b100', 2), 4)\r
- self.assertEqual(int('0X123', 16), 291)\r
- self.assertEqual(int('0O123', 8), 83)\r
- self.assertEqual(int('0B100', 2), 4)\r
-\r
- # the code has special checks for the first character after the\r
- # type prefix\r
- self.assertRaises(ValueError, int, '0b2', 2)\r
- self.assertRaises(ValueError, int, '0b02', 2)\r
- self.assertRaises(ValueError, int, '0B2', 2)\r
- self.assertRaises(ValueError, int, '0B02', 2)\r
- self.assertRaises(ValueError, int, '0o8', 8)\r
- self.assertRaises(ValueError, int, '0o08', 8)\r
- self.assertRaises(ValueError, int, '0O8', 8)\r
- self.assertRaises(ValueError, int, '0O08', 8)\r
- self.assertRaises(ValueError, int, '0xg', 16)\r
- self.assertRaises(ValueError, int, '0x0g', 16)\r
- self.assertRaises(ValueError, int, '0Xg', 16)\r
- self.assertRaises(ValueError, int, '0X0g', 16)\r
-\r
- # SF bug 1334662: int(string, base) wrong answers\r
- # Checks for proper evaluation of 2**32 + 1\r
- self.assertEqual(int('100000000000000000000000000000001', 2), 4294967297L)\r
- self.assertEqual(int('102002022201221111212', 3), 4294967297L)\r
- self.assertEqual(int('10000000000000001', 4), 4294967297L)\r
- self.assertEqual(int('32244002423142', 5), 4294967297L)\r
- self.assertEqual(int('1550104015505', 6), 4294967297L)\r
- self.assertEqual(int('211301422355', 7), 4294967297L)\r
- self.assertEqual(int('40000000001', 8), 4294967297L)\r
- self.assertEqual(int('12068657455', 9), 4294967297L)\r
- self.assertEqual(int('4294967297', 10), 4294967297L)\r
- self.assertEqual(int('1904440555', 11), 4294967297L)\r
- self.assertEqual(int('9ba461595', 12), 4294967297L)\r
- self.assertEqual(int('535a7988a', 13), 4294967297L)\r
- self.assertEqual(int('2ca5b7465', 14), 4294967297L)\r
- self.assertEqual(int('1a20dcd82', 15), 4294967297L)\r
- self.assertEqual(int('100000001', 16), 4294967297L)\r
- self.assertEqual(int('a7ffda92', 17), 4294967297L)\r
- self.assertEqual(int('704he7g5', 18), 4294967297L)\r
- self.assertEqual(int('4f5aff67', 19), 4294967297L)\r
- self.assertEqual(int('3723ai4h', 20), 4294967297L)\r
- self.assertEqual(int('281d55i5', 21), 4294967297L)\r
- self.assertEqual(int('1fj8b185', 22), 4294967297L)\r
- self.assertEqual(int('1606k7id', 23), 4294967297L)\r
- self.assertEqual(int('mb994ah', 24), 4294967297L)\r
- self.assertEqual(int('hek2mgm', 25), 4294967297L)\r
- self.assertEqual(int('dnchbnn', 26), 4294967297L)\r
- self.assertEqual(int('b28jpdn', 27), 4294967297L)\r
- self.assertEqual(int('8pfgih5', 28), 4294967297L)\r
- self.assertEqual(int('76beigh', 29), 4294967297L)\r
- self.assertEqual(int('5qmcpqh', 30), 4294967297L)\r
- self.assertEqual(int('4q0jto5', 31), 4294967297L)\r
- self.assertEqual(int('4000001', 32), 4294967297L)\r
- self.assertEqual(int('3aokq95', 33), 4294967297L)\r
- self.assertEqual(int('2qhxjlj', 34), 4294967297L)\r
- self.assertEqual(int('2br45qc', 35), 4294967297L)\r
- self.assertEqual(int('1z141z5', 36), 4294967297L)\r
-\r
- def test_bit_length(self):\r
- tiny = 1e-10\r
- for x in xrange(-65000, 65000):\r
- k = x.bit_length()\r
- # Check equivalence with Python version\r
- self.assertEqual(k, len(bin(x).lstrip('-0b')))\r
- # Behaviour as specified in the docs\r
- if x != 0:\r
- self.assertTrue(2**(k-1) <= abs(x) < 2**k)\r
- else:\r
- self.assertEqual(k, 0)\r
- # Alternative definition: x.bit_length() == 1 + floor(log_2(x))\r
- if x != 0:\r
- # When x is an exact power of 2, numeric errors can\r
- # cause floor(log(x)/log(2)) to be one too small; for\r
- # small x this can be fixed by adding a small quantity\r
- # to the quotient before taking the floor.\r
- self.assertEqual(k, 1 + math.floor(\r
- math.log(abs(x))/math.log(2) + tiny))\r
-\r
- self.assertEqual((0).bit_length(), 0)\r
- self.assertEqual((1).bit_length(), 1)\r
- self.assertEqual((-1).bit_length(), 1)\r
- self.assertEqual((2).bit_length(), 2)\r
- self.assertEqual((-2).bit_length(), 2)\r
- for i in [2, 3, 15, 16, 17, 31, 32, 33, 63, 64]:\r
- a = 2**i\r
- self.assertEqual((a-1).bit_length(), i)\r
- self.assertEqual((1-a).bit_length(), i)\r
- self.assertEqual((a).bit_length(), i+1)\r
- self.assertEqual((-a).bit_length(), i+1)\r
- self.assertEqual((a+1).bit_length(), i+1)\r
- self.assertEqual((-a-1).bit_length(), i+1)\r
-\r
- @unittest.skipUnless(float.__getformat__("double").startswith("IEEE"),\r
- "test requires IEEE 754 doubles")\r
- def test_float_conversion(self):\r
- # values exactly representable as floats\r
- exact_values = [-2, -1, 0, 1, 2, 2**52, 2**53-1, 2**53, 2**53+2,\r
- 2**53+4, 2**54-4, 2**54-2, 2**63, -2**63, 2**64,\r
- -2**64, 10**20, 10**21, 10**22]\r
- for value in exact_values:\r
- self.assertEqual(int(float(int(value))), value)\r
-\r
- # test round-half-to-even\r
- self.assertEqual(int(float(2**53+1)), 2**53)\r
- self.assertEqual(int(float(2**53+2)), 2**53+2)\r
- self.assertEqual(int(float(2**53+3)), 2**53+4)\r
- self.assertEqual(int(float(2**53+5)), 2**53+4)\r
- self.assertEqual(int(float(2**53+6)), 2**53+6)\r
- self.assertEqual(int(float(2**53+7)), 2**53+8)\r
-\r
- self.assertEqual(int(float(-2**53-1)), -2**53)\r
- self.assertEqual(int(float(-2**53-2)), -2**53-2)\r
- self.assertEqual(int(float(-2**53-3)), -2**53-4)\r
- self.assertEqual(int(float(-2**53-5)), -2**53-4)\r
- self.assertEqual(int(float(-2**53-6)), -2**53-6)\r
- self.assertEqual(int(float(-2**53-7)), -2**53-8)\r
-\r
- self.assertEqual(int(float(2**54-2)), 2**54-2)\r
- self.assertEqual(int(float(2**54-1)), 2**54)\r
- self.assertEqual(int(float(2**54+2)), 2**54)\r
- self.assertEqual(int(float(2**54+3)), 2**54+4)\r
- self.assertEqual(int(float(2**54+5)), 2**54+4)\r
- self.assertEqual(int(float(2**54+6)), 2**54+8)\r
- self.assertEqual(int(float(2**54+10)), 2**54+8)\r
- self.assertEqual(int(float(2**54+11)), 2**54+12)\r
-\r
- def test_intconversion(self):\r
- # Test __int__()\r
- class ClassicMissingMethods:\r
- pass\r
- self.assertRaises(AttributeError, int, ClassicMissingMethods())\r
-\r
- class MissingMethods(object):\r
- pass\r
- self.assertRaises(TypeError, int, MissingMethods())\r
-\r
- class Foo0:\r
- def __int__(self):\r
- return 42\r
-\r
- class Foo1(object):\r
- def __int__(self):\r
- return 42\r
-\r
- class Foo2(int):\r
- def __int__(self):\r
- return 42\r
-\r
- class Foo3(int):\r
- def __int__(self):\r
- return self\r
-\r
- class Foo4(int):\r
- def __int__(self):\r
- return 42L\r
-\r
- class Foo5(int):\r
- def __int__(self):\r
- return 42.\r
-\r
- self.assertEqual(int(Foo0()), 42)\r
- self.assertEqual(int(Foo1()), 42)\r
- self.assertEqual(int(Foo2()), 42)\r
- self.assertEqual(int(Foo3()), 0)\r
- self.assertEqual(int(Foo4()), 42L)\r
- self.assertRaises(TypeError, int, Foo5())\r
-\r
- class Classic:\r
- pass\r
- for base in (object, Classic):\r
- class IntOverridesTrunc(base):\r
- def __int__(self):\r
- return 42\r
- def __trunc__(self):\r
- return -12\r
- self.assertEqual(int(IntOverridesTrunc()), 42)\r
-\r
- class JustTrunc(base):\r
- def __trunc__(self):\r
- return 42\r
- self.assertEqual(int(JustTrunc()), 42)\r
-\r
- for trunc_result_base in (object, Classic):\r
- class Integral(trunc_result_base):\r
- def __int__(self):\r
- return 42\r
-\r
- class TruncReturnsNonInt(base):\r
- def __trunc__(self):\r
- return Integral()\r
- self.assertEqual(int(TruncReturnsNonInt()), 42)\r
-\r
- class NonIntegral(trunc_result_base):\r
- def __trunc__(self):\r
- # Check that we avoid infinite recursion.\r
- return NonIntegral()\r
-\r
- class TruncReturnsNonIntegral(base):\r
- def __trunc__(self):\r
- return NonIntegral()\r
- try:\r
- int(TruncReturnsNonIntegral())\r
- except TypeError as e:\r
- self.assertEqual(str(e),\r
- "__trunc__ returned non-Integral"\r
- " (type NonIntegral)")\r
- else:\r
- self.fail("Failed to raise TypeError with %s" %\r
- ((base, trunc_result_base),))\r
-\r
-def test_main():\r
- run_unittest(IntTestCases)\r
-\r
-if __name__ == "__main__":\r
- test_main()\r