test_int.py 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502
  1. import sys
  2. import unittest
  3. from test import test_support
  4. from test.test_support import run_unittest, have_unicode
  5. import math
  6. L = [
  7. ('0', 0),
  8. ('1', 1),
  9. ('9', 9),
  10. ('10', 10),
  11. ('99', 99),
  12. ('100', 100),
  13. ('314', 314),
  14. (' 314', 314),
  15. ('314 ', 314),
  16. (' \t\t 314 \t\t ', 314),
  17. (repr(sys.maxint), sys.maxint),
  18. (' 1x', ValueError),
  19. (' 1 ', 1),
  20. (' 1\02 ', ValueError),
  21. ('', ValueError),
  22. (' ', ValueError),
  23. (' \t\t ', ValueError)
  24. ]
  25. if have_unicode:
  26. L += [
  27. (unicode('0'), 0),
  28. (unicode('1'), 1),
  29. (unicode('9'), 9),
  30. (unicode('10'), 10),
  31. (unicode('99'), 99),
  32. (unicode('100'), 100),
  33. (unicode('314'), 314),
  34. (unicode(' 314'), 314),
  35. (unicode('\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
  36. (unicode(' \t\t 314 \t\t '), 314),
  37. (unicode(' 1x'), ValueError),
  38. (unicode(' 1 '), 1),
  39. (unicode(' 1\02 '), ValueError),
  40. (unicode(''), ValueError),
  41. (unicode(' '), ValueError),
  42. (unicode(' \t\t '), ValueError),
  43. (unichr(0x200), ValueError),
  44. ]
  45. class IntSubclass(int):
  46. pass
  47. class IntLongCommonTests(object):
  48. """Mixin of test cases to share between both test_int and test_long."""
  49. # Change to int or long in the TestCase subclass.
  50. ntype = None
  51. def test_no_args(self):
  52. self.assertEqual(self.ntype(), 0)
  53. def test_keyword_args(self):
  54. # Test invoking constructor using keyword arguments.
  55. self.assertEqual(self.ntype(x=1.2), 1)
  56. self.assertEqual(self.ntype('100', base=2), 4)
  57. self.assertEqual(self.ntype(x='100', base=2), 4)
  58. self.assertRaises(TypeError, self.ntype, base=10)
  59. self.assertRaises(TypeError, self.ntype, base=0)
  60. class IntTestCases(IntLongCommonTests, unittest.TestCase):
  61. ntype = int
  62. def test_basic(self):
  63. self.assertEqual(int(314), 314)
  64. self.assertEqual(int(3.14), 3)
  65. self.assertEqual(int(314L), 314)
  66. # Check that conversion from float truncates towards zero
  67. self.assertEqual(int(-3.14), -3)
  68. self.assertEqual(int(3.9), 3)
  69. self.assertEqual(int(-3.9), -3)
  70. self.assertEqual(int(3.5), 3)
  71. self.assertEqual(int(-3.5), -3)
  72. # Different base:
  73. self.assertEqual(int("10",16), 16L)
  74. if have_unicode:
  75. self.assertEqual(int(unicode("10"),16), 16L)
  76. # Test conversion from strings and various anomalies
  77. for s, v in L:
  78. for sign in "", "+", "-":
  79. for prefix in "", " ", "\t", " \t\t ":
  80. ss = prefix + sign + s
  81. vv = v
  82. if sign == "-" and v is not ValueError:
  83. vv = -v
  84. try:
  85. self.assertEqual(int(ss), vv)
  86. except v:
  87. pass
  88. s = repr(-1-sys.maxint)
  89. x = int(s)
  90. self.assertEqual(x+1, -sys.maxint)
  91. self.assertIsInstance(x, int)
  92. # should return long
  93. self.assertEqual(int(s[1:]), sys.maxint+1)
  94. # should return long
  95. x = int(1e100)
  96. self.assertIsInstance(x, long)
  97. x = int(-1e100)
  98. self.assertIsInstance(x, long)
  99. # SF bug 434186: 0x80000000/2 != 0x80000000>>1.
  100. # Worked by accident in Windows release build, but failed in debug build.
  101. # Failed in all Linux builds.
  102. x = -1-sys.maxint
  103. self.assertEqual(x >> 1, x//2)
  104. self.assertRaises(ValueError, int, '123\0')
  105. self.assertRaises(ValueError, int, '53', 40)
  106. # SF bug 1545497: embedded NULs were not detected with
  107. # explicit base
  108. self.assertRaises(ValueError, int, '123\0', 10)
  109. self.assertRaises(ValueError, int, '123\x00 245', 20)
  110. x = int('1' * 600)
  111. self.assertIsInstance(x, long)
  112. if have_unicode:
  113. x = int(unichr(0x661) * 600)
  114. self.assertIsInstance(x, long)
  115. self.assertRaises(TypeError, int, 1, 12)
  116. self.assertEqual(int('0123', 0), 83)
  117. self.assertEqual(int('0x123', 16), 291)
  118. # Bug 1679: "0x" is not a valid hex literal
  119. self.assertRaises(ValueError, int, "0x", 16)
  120. self.assertRaises(ValueError, int, "0x", 0)
  121. self.assertRaises(ValueError, int, "0o", 8)
  122. self.assertRaises(ValueError, int, "0o", 0)
  123. self.assertRaises(ValueError, int, "0b", 2)
  124. self.assertRaises(ValueError, int, "0b", 0)
  125. # SF bug 1334662: int(string, base) wrong answers
  126. # Various representations of 2**32 evaluated to 0
  127. # rather than 2**32 in previous versions
  128. self.assertEqual(int('100000000000000000000000000000000', 2), 4294967296L)
  129. self.assertEqual(int('102002022201221111211', 3), 4294967296L)
  130. self.assertEqual(int('10000000000000000', 4), 4294967296L)
  131. self.assertEqual(int('32244002423141', 5), 4294967296L)
  132. self.assertEqual(int('1550104015504', 6), 4294967296L)
  133. self.assertEqual(int('211301422354', 7), 4294967296L)
  134. self.assertEqual(int('40000000000', 8), 4294967296L)
  135. self.assertEqual(int('12068657454', 9), 4294967296L)
  136. self.assertEqual(int('4294967296', 10), 4294967296L)
  137. self.assertEqual(int('1904440554', 11), 4294967296L)
  138. self.assertEqual(int('9ba461594', 12), 4294967296L)
  139. self.assertEqual(int('535a79889', 13), 4294967296L)
  140. self.assertEqual(int('2ca5b7464', 14), 4294967296L)
  141. self.assertEqual(int('1a20dcd81', 15), 4294967296L)
  142. self.assertEqual(int('100000000', 16), 4294967296L)
  143. self.assertEqual(int('a7ffda91', 17), 4294967296L)
  144. self.assertEqual(int('704he7g4', 18), 4294967296L)
  145. self.assertEqual(int('4f5aff66', 19), 4294967296L)
  146. self.assertEqual(int('3723ai4g', 20), 4294967296L)
  147. self.assertEqual(int('281d55i4', 21), 4294967296L)
  148. self.assertEqual(int('1fj8b184', 22), 4294967296L)
  149. self.assertEqual(int('1606k7ic', 23), 4294967296L)
  150. self.assertEqual(int('mb994ag', 24), 4294967296L)
  151. self.assertEqual(int('hek2mgl', 25), 4294967296L)
  152. self.assertEqual(int('dnchbnm', 26), 4294967296L)
  153. self.assertEqual(int('b28jpdm', 27), 4294967296L)
  154. self.assertEqual(int('8pfgih4', 28), 4294967296L)
  155. self.assertEqual(int('76beigg', 29), 4294967296L)
  156. self.assertEqual(int('5qmcpqg', 30), 4294967296L)
  157. self.assertEqual(int('4q0jto4', 31), 4294967296L)
  158. self.assertEqual(int('4000000', 32), 4294967296L)
  159. self.assertEqual(int('3aokq94', 33), 4294967296L)
  160. self.assertEqual(int('2qhxjli', 34), 4294967296L)
  161. self.assertEqual(int('2br45qb', 35), 4294967296L)
  162. self.assertEqual(int('1z141z4', 36), 4294967296L)
  163. # tests with base 0
  164. # this fails on 3.0, but in 2.x the old octal syntax is allowed
  165. self.assertEqual(int(' 0123 ', 0), 83)
  166. self.assertEqual(int(' 0123 ', 0), 83)
  167. self.assertEqual(int('000', 0), 0)
  168. self.assertEqual(int('0o123', 0), 83)
  169. self.assertEqual(int('0x123', 0), 291)
  170. self.assertEqual(int('0b100', 0), 4)
  171. self.assertEqual(int(' 0O123 ', 0), 83)
  172. self.assertEqual(int(' 0X123 ', 0), 291)
  173. self.assertEqual(int(' 0B100 ', 0), 4)
  174. self.assertEqual(int('0', 0), 0)
  175. self.assertEqual(int('+0', 0), 0)
  176. self.assertEqual(int('-0', 0), 0)
  177. self.assertEqual(int('00', 0), 0)
  178. self.assertRaises(ValueError, int, '08', 0)
  179. self.assertRaises(ValueError, int, '-012395', 0)
  180. # without base still base 10
  181. self.assertEqual(int('0123'), 123)
  182. self.assertEqual(int('0123', 10), 123)
  183. # tests with prefix and base != 0
  184. self.assertEqual(int('0x123', 16), 291)
  185. self.assertEqual(int('0o123', 8), 83)
  186. self.assertEqual(int('0b100', 2), 4)
  187. self.assertEqual(int('0X123', 16), 291)
  188. self.assertEqual(int('0O123', 8), 83)
  189. self.assertEqual(int('0B100', 2), 4)
  190. # the code has special checks for the first character after the
  191. # type prefix
  192. self.assertRaises(ValueError, int, '0b2', 2)
  193. self.assertRaises(ValueError, int, '0b02', 2)
  194. self.assertRaises(ValueError, int, '0B2', 2)
  195. self.assertRaises(ValueError, int, '0B02', 2)
  196. self.assertRaises(ValueError, int, '0o8', 8)
  197. self.assertRaises(ValueError, int, '0o08', 8)
  198. self.assertRaises(ValueError, int, '0O8', 8)
  199. self.assertRaises(ValueError, int, '0O08', 8)
  200. self.assertRaises(ValueError, int, '0xg', 16)
  201. self.assertRaises(ValueError, int, '0x0g', 16)
  202. self.assertRaises(ValueError, int, '0Xg', 16)
  203. self.assertRaises(ValueError, int, '0X0g', 16)
  204. # SF bug 1334662: int(string, base) wrong answers
  205. # Checks for proper evaluation of 2**32 + 1
  206. self.assertEqual(int('100000000000000000000000000000001', 2), 4294967297L)
  207. self.assertEqual(int('102002022201221111212', 3), 4294967297L)
  208. self.assertEqual(int('10000000000000001', 4), 4294967297L)
  209. self.assertEqual(int('32244002423142', 5), 4294967297L)
  210. self.assertEqual(int('1550104015505', 6), 4294967297L)
  211. self.assertEqual(int('211301422355', 7), 4294967297L)
  212. self.assertEqual(int('40000000001', 8), 4294967297L)
  213. self.assertEqual(int('12068657455', 9), 4294967297L)
  214. self.assertEqual(int('4294967297', 10), 4294967297L)
  215. self.assertEqual(int('1904440555', 11), 4294967297L)
  216. self.assertEqual(int('9ba461595', 12), 4294967297L)
  217. self.assertEqual(int('535a7988a', 13), 4294967297L)
  218. self.assertEqual(int('2ca5b7465', 14), 4294967297L)
  219. self.assertEqual(int('1a20dcd82', 15), 4294967297L)
  220. self.assertEqual(int('100000001', 16), 4294967297L)
  221. self.assertEqual(int('a7ffda92', 17), 4294967297L)
  222. self.assertEqual(int('704he7g5', 18), 4294967297L)
  223. self.assertEqual(int('4f5aff67', 19), 4294967297L)
  224. self.assertEqual(int('3723ai4h', 20), 4294967297L)
  225. self.assertEqual(int('281d55i5', 21), 4294967297L)
  226. self.assertEqual(int('1fj8b185', 22), 4294967297L)
  227. self.assertEqual(int('1606k7id', 23), 4294967297L)
  228. self.assertEqual(int('mb994ah', 24), 4294967297L)
  229. self.assertEqual(int('hek2mgm', 25), 4294967297L)
  230. self.assertEqual(int('dnchbnn', 26), 4294967297L)
  231. self.assertEqual(int('b28jpdn', 27), 4294967297L)
  232. self.assertEqual(int('8pfgih5', 28), 4294967297L)
  233. self.assertEqual(int('76beigh', 29), 4294967297L)
  234. self.assertEqual(int('5qmcpqh', 30), 4294967297L)
  235. self.assertEqual(int('4q0jto5', 31), 4294967297L)
  236. self.assertEqual(int('4000001', 32), 4294967297L)
  237. self.assertEqual(int('3aokq95', 33), 4294967297L)
  238. self.assertEqual(int('2qhxjlj', 34), 4294967297L)
  239. self.assertEqual(int('2br45qc', 35), 4294967297L)
  240. self.assertEqual(int('1z141z5', 36), 4294967297L)
  241. def test_bit_length(self):
  242. tiny = 1e-10
  243. for x in xrange(-65000, 65000):
  244. k = x.bit_length()
  245. # Check equivalence with Python version
  246. self.assertEqual(k, len(bin(x).lstrip('-0b')))
  247. # Behaviour as specified in the docs
  248. if x != 0:
  249. self.assertTrue(2**(k-1) <= abs(x) < 2**k)
  250. else:
  251. self.assertEqual(k, 0)
  252. # Alternative definition: x.bit_length() == 1 + floor(log_2(x))
  253. if x != 0:
  254. # When x is an exact power of 2, numeric errors can
  255. # cause floor(log(x)/log(2)) to be one too small; for
  256. # small x this can be fixed by adding a small quantity
  257. # to the quotient before taking the floor.
  258. self.assertEqual(k, 1 + math.floor(
  259. math.log(abs(x))/math.log(2) + tiny))
  260. self.assertEqual((0).bit_length(), 0)
  261. self.assertEqual((1).bit_length(), 1)
  262. self.assertEqual((-1).bit_length(), 1)
  263. self.assertEqual((2).bit_length(), 2)
  264. self.assertEqual((-2).bit_length(), 2)
  265. for i in [2, 3, 15, 16, 17, 31, 32, 33, 63, 64]:
  266. a = 2**i
  267. self.assertEqual((a-1).bit_length(), i)
  268. self.assertEqual((1-a).bit_length(), i)
  269. self.assertEqual((a).bit_length(), i+1)
  270. self.assertEqual((-a).bit_length(), i+1)
  271. self.assertEqual((a+1).bit_length(), i+1)
  272. self.assertEqual((-a-1).bit_length(), i+1)
  273. @unittest.skipUnless(float.__getformat__("double").startswith("IEEE"),
  274. "test requires IEEE 754 doubles")
  275. def test_float_conversion(self):
  276. # values exactly representable as floats
  277. exact_values = [-2, -1, 0, 1, 2, 2**52, 2**53-1, 2**53, 2**53+2,
  278. 2**53+4, 2**54-4, 2**54-2, 2**63, -2**63, 2**64,
  279. -2**64, 10**20, 10**21, 10**22]
  280. for value in exact_values:
  281. self.assertEqual(int(float(int(value))), value)
  282. # test round-half-to-even
  283. self.assertEqual(int(float(2**53+1)), 2**53)
  284. self.assertEqual(int(float(2**53+2)), 2**53+2)
  285. self.assertEqual(int(float(2**53+3)), 2**53+4)
  286. self.assertEqual(int(float(2**53+5)), 2**53+4)
  287. self.assertEqual(int(float(2**53+6)), 2**53+6)
  288. self.assertEqual(int(float(2**53+7)), 2**53+8)
  289. self.assertEqual(int(float(-2**53-1)), -2**53)
  290. self.assertEqual(int(float(-2**53-2)), -2**53-2)
  291. self.assertEqual(int(float(-2**53-3)), -2**53-4)
  292. self.assertEqual(int(float(-2**53-5)), -2**53-4)
  293. self.assertEqual(int(float(-2**53-6)), -2**53-6)
  294. self.assertEqual(int(float(-2**53-7)), -2**53-8)
  295. self.assertEqual(int(float(2**54-2)), 2**54-2)
  296. self.assertEqual(int(float(2**54-1)), 2**54)
  297. self.assertEqual(int(float(2**54+2)), 2**54)
  298. self.assertEqual(int(float(2**54+3)), 2**54+4)
  299. self.assertEqual(int(float(2**54+5)), 2**54+4)
  300. self.assertEqual(int(float(2**54+6)), 2**54+8)
  301. self.assertEqual(int(float(2**54+10)), 2**54+8)
  302. self.assertEqual(int(float(2**54+11)), 2**54+12)
  303. def test_valid_non_numeric_input_types_for_x(self):
  304. # Test possible valid non-numeric types for x, including subclasses
  305. # of the allowed built-in types.
  306. class CustomStr(str): pass
  307. class CustomByteArray(bytearray): pass
  308. factories = [str, bytearray, CustomStr, CustomByteArray, buffer]
  309. if have_unicode:
  310. class CustomUnicode(unicode): pass
  311. factories += [unicode, CustomUnicode]
  312. for f in factories:
  313. with test_support.check_py3k_warnings(quiet=True):
  314. x = f('100')
  315. msg = 'x has value %s and type %s' % (x, type(x).__name__)
  316. try:
  317. self.assertEqual(int(x), 100, msg=msg)
  318. if isinstance(x, basestring):
  319. self.assertEqual(int(x, 2), 4, msg=msg)
  320. except TypeError, err:
  321. raise AssertionError('For %s got TypeError: %s' %
  322. (type(x).__name__, err))
  323. if not isinstance(x, basestring):
  324. errmsg = "can't convert non-string"
  325. with self.assertRaisesRegexp(TypeError, errmsg, msg=msg):
  326. int(x, 2)
  327. errmsg = 'invalid literal'
  328. with self.assertRaisesRegexp(ValueError, errmsg, msg=msg), \
  329. test_support.check_py3k_warnings(quiet=True):
  330. int(f('A' * 0x10))
  331. def test_int_buffer(self):
  332. with test_support.check_py3k_warnings():
  333. self.assertEqual(int(buffer('123', 1, 2)), 23)
  334. self.assertEqual(int(buffer('123\x00', 1, 2)), 23)
  335. self.assertEqual(int(buffer('123 ', 1, 2)), 23)
  336. self.assertEqual(int(buffer('123A', 1, 2)), 23)
  337. self.assertEqual(int(buffer('1234', 1, 2)), 23)
  338. def test_error_on_string_float_for_x(self):
  339. self.assertRaises(ValueError, int, '1.2')
  340. def test_error_on_bytearray_for_x(self):
  341. self.assertRaises(TypeError, int, bytearray('100'), 2)
  342. def test_error_on_invalid_int_bases(self):
  343. for base in [-1, 1, 1000]:
  344. self.assertRaises(ValueError, int, '100', base)
  345. def test_error_on_string_base(self):
  346. self.assertRaises(TypeError, int, 100, base='foo')
  347. @test_support.cpython_only
  348. def test_small_ints(self):
  349. self.assertIs(int('10'), 10)
  350. self.assertIs(int('-1'), -1)
  351. if have_unicode:
  352. self.assertIs(int(u'10'), 10)
  353. self.assertIs(int(u'-1'), -1)
  354. def test_intconversion(self):
  355. # Test __int__()
  356. class ClassicMissingMethods:
  357. pass
  358. self.assertRaises(AttributeError, int, ClassicMissingMethods())
  359. class MissingMethods(object):
  360. pass
  361. self.assertRaises(TypeError, int, MissingMethods())
  362. class Foo0:
  363. def __int__(self):
  364. return 42
  365. class Foo1(object):
  366. def __int__(self):
  367. return 42
  368. class Foo2(int):
  369. def __int__(self):
  370. return 42
  371. class Foo3(int):
  372. def __int__(self):
  373. return self
  374. class Foo4(int):
  375. def __int__(self):
  376. return 42L
  377. class Foo5(int):
  378. def __int__(self):
  379. return 42.
  380. self.assertEqual(int(Foo0()), 42)
  381. self.assertEqual(int(Foo1()), 42)
  382. self.assertEqual(int(Foo2()), 42)
  383. self.assertEqual(int(Foo3()), 0)
  384. self.assertEqual(int(Foo4()), 42L)
  385. self.assertRaises(TypeError, int, Foo5())
  386. class Classic:
  387. pass
  388. for base in (object, Classic):
  389. class IntOverridesTrunc(base):
  390. def __int__(self):
  391. return 42
  392. def __trunc__(self):
  393. return -12
  394. self.assertEqual(int(IntOverridesTrunc()), 42)
  395. class JustTrunc(base):
  396. def __trunc__(self):
  397. return 42
  398. self.assertEqual(int(JustTrunc()), 42)
  399. for trunc_result_base in (object, Classic):
  400. class Integral(trunc_result_base):
  401. def __int__(self):
  402. return 42
  403. class TruncReturnsNonInt(base):
  404. def __trunc__(self):
  405. return Integral()
  406. self.assertEqual(int(TruncReturnsNonInt()), 42)
  407. class NonIntegral(trunc_result_base):
  408. def __trunc__(self):
  409. # Check that we avoid infinite recursion.
  410. return NonIntegral()
  411. class TruncReturnsNonIntegral(base):
  412. def __trunc__(self):
  413. return NonIntegral()
  414. try:
  415. int(TruncReturnsNonIntegral())
  416. except TypeError as e:
  417. self.assertEqual(str(e),
  418. "__trunc__ returned non-Integral"
  419. " (type NonIntegral)")
  420. else:
  421. self.fail("Failed to raise TypeError with %s" %
  422. ((base, trunc_result_base),))
  423. class TruncReturnsIntSubclass(base):
  424. def __trunc__(self):
  425. return True
  426. good_int = TruncReturnsIntSubclass()
  427. n = int(good_int)
  428. self.assertEqual(n, 1)
  429. self.assertIs(type(n), bool)
  430. n = IntSubclass(good_int)
  431. self.assertEqual(n, 1)
  432. self.assertIs(type(n), IntSubclass)
  433. def test_main():
  434. run_unittest(IntTestCases)
  435. if __name__ == "__main__":
  436. test_main()