test_range.py 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699
  1. # Python test set -- built-in functions
  2. import unittest
  3. import sys
  4. import pickle
  5. import itertools
  6. from test.support import ALWAYS_EQ
  7. # pure Python implementations (3 args only), for comparison
  8. def pyrange(start, stop, step):
  9. if (start - stop) // step < 0:
  10. # replace stop with next element in the sequence of integers
  11. # that are congruent to start modulo step.
  12. stop += (start - stop) % step
  13. while start != stop:
  14. yield start
  15. start += step
  16. def pyrange_reversed(start, stop, step):
  17. stop += (start - stop) % step
  18. return pyrange(stop - step, start - step, -step)
  19. class RangeTest(unittest.TestCase):
  20. def assert_iterators_equal(self, xs, ys, test_id, limit=None):
  21. # check that an iterator xs matches the expected results ys,
  22. # up to a given limit.
  23. if limit is not None:
  24. xs = itertools.islice(xs, limit)
  25. ys = itertools.islice(ys, limit)
  26. sentinel = object()
  27. pairs = itertools.zip_longest(xs, ys, fillvalue=sentinel)
  28. for i, (x, y) in enumerate(pairs):
  29. if x == y:
  30. continue
  31. elif x == sentinel:
  32. self.fail('{}: iterator ended unexpectedly '
  33. 'at position {}; expected {}'.format(test_id, i, y))
  34. elif y == sentinel:
  35. self.fail('{}: unexpected excess element {} at '
  36. 'position {}'.format(test_id, x, i))
  37. else:
  38. self.fail('{}: wrong element at position {}; '
  39. 'expected {}, got {}'.format(test_id, i, y, x))
  40. def test_range(self):
  41. self.assertEqual(list(range(3)), [0, 1, 2])
  42. self.assertEqual(list(range(1, 5)), [1, 2, 3, 4])
  43. self.assertEqual(list(range(0)), [])
  44. self.assertEqual(list(range(-3)), [])
  45. self.assertEqual(list(range(1, 10, 3)), [1, 4, 7])
  46. self.assertEqual(list(range(5, -5, -3)), [5, 2, -1, -4])
  47. a = 10
  48. b = 100
  49. c = 50
  50. self.assertEqual(list(range(a, a+2)), [a, a+1])
  51. self.assertEqual(list(range(a+2, a, -1)), [a+2, a+1])
  52. self.assertEqual(list(range(a+4, a, -2)), [a+4, a+2])
  53. seq = list(range(a, b, c))
  54. self.assertIn(a, seq)
  55. self.assertNotIn(b, seq)
  56. self.assertEqual(len(seq), 2)
  57. seq = list(range(b, a, -c))
  58. self.assertIn(b, seq)
  59. self.assertNotIn(a, seq)
  60. self.assertEqual(len(seq), 2)
  61. seq = list(range(-a, -b, -c))
  62. self.assertIn(-a, seq)
  63. self.assertNotIn(-b, seq)
  64. self.assertEqual(len(seq), 2)
  65. self.assertRaises(TypeError, range)
  66. self.assertRaises(TypeError, range, 1, 2, 3, 4)
  67. self.assertRaises(ValueError, range, 1, 2, 0)
  68. self.assertRaises(TypeError, range, 0.0, 2, 1)
  69. self.assertRaises(TypeError, range, 1, 2.0, 1)
  70. self.assertRaises(TypeError, range, 1, 2, 1.0)
  71. self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
  72. self.assertRaises(TypeError, range, 0, "spam")
  73. self.assertRaises(TypeError, range, 0, 42, "spam")
  74. self.assertEqual(len(range(0, sys.maxsize, sys.maxsize-1)), 2)
  75. r = range(-sys.maxsize, sys.maxsize, 2)
  76. self.assertEqual(len(r), sys.maxsize)
  77. def test_range_constructor_error_messages(self):
  78. with self.assertRaisesRegex(
  79. TypeError,
  80. "range expected at least 1 argument, got 0"
  81. ):
  82. range()
  83. with self.assertRaisesRegex(
  84. TypeError,
  85. "range expected at most 3 arguments, got 6"
  86. ):
  87. range(1, 2, 3, 4, 5, 6)
  88. def test_large_operands(self):
  89. x = range(10**20, 10**20+10, 3)
  90. self.assertEqual(len(x), 4)
  91. self.assertEqual(len(list(x)), 4)
  92. x = range(10**20+10, 10**20, 3)
  93. self.assertEqual(len(x), 0)
  94. self.assertEqual(len(list(x)), 0)
  95. self.assertFalse(x)
  96. x = range(10**20, 10**20+10, -3)
  97. self.assertEqual(len(x), 0)
  98. self.assertEqual(len(list(x)), 0)
  99. self.assertFalse(x)
  100. x = range(10**20+10, 10**20, -3)
  101. self.assertEqual(len(x), 4)
  102. self.assertEqual(len(list(x)), 4)
  103. self.assertTrue(x)
  104. # Now test range() with longs
  105. for x in [range(-2**100),
  106. range(0, -2**100),
  107. range(0, 2**100, -1)]:
  108. self.assertEqual(list(x), [])
  109. self.assertFalse(x)
  110. a = int(10 * sys.maxsize)
  111. b = int(100 * sys.maxsize)
  112. c = int(50 * sys.maxsize)
  113. self.assertEqual(list(range(a, a+2)), [a, a+1])
  114. self.assertEqual(list(range(a+2, a, -1)), [a+2, a+1])
  115. self.assertEqual(list(range(a+4, a, -2)), [a+4, a+2])
  116. seq = list(range(a, b, c))
  117. self.assertIn(a, seq)
  118. self.assertNotIn(b, seq)
  119. self.assertEqual(len(seq), 2)
  120. self.assertEqual(seq[0], a)
  121. self.assertEqual(seq[-1], a+c)
  122. seq = list(range(b, a, -c))
  123. self.assertIn(b, seq)
  124. self.assertNotIn(a, seq)
  125. self.assertEqual(len(seq), 2)
  126. self.assertEqual(seq[0], b)
  127. self.assertEqual(seq[-1], b-c)
  128. seq = list(range(-a, -b, -c))
  129. self.assertIn(-a, seq)
  130. self.assertNotIn(-b, seq)
  131. self.assertEqual(len(seq), 2)
  132. self.assertEqual(seq[0], -a)
  133. self.assertEqual(seq[-1], -a-c)
  134. def test_large_range(self):
  135. # Check long ranges (len > sys.maxsize)
  136. # len() is expected to fail due to limitations of the __len__ protocol
  137. def _range_len(x):
  138. try:
  139. length = len(x)
  140. except OverflowError:
  141. step = x[1] - x[0]
  142. length = 1 + ((x[-1] - x[0]) // step)
  143. return length
  144. a = -sys.maxsize
  145. b = sys.maxsize
  146. expected_len = b - a
  147. x = range(a, b)
  148. self.assertIn(a, x)
  149. self.assertNotIn(b, x)
  150. self.assertRaises(OverflowError, len, x)
  151. self.assertTrue(x)
  152. self.assertEqual(_range_len(x), expected_len)
  153. self.assertEqual(x[0], a)
  154. idx = sys.maxsize+1
  155. self.assertEqual(x[idx], a+idx)
  156. self.assertEqual(x[idx:idx+1][0], a+idx)
  157. with self.assertRaises(IndexError):
  158. x[-expected_len-1]
  159. with self.assertRaises(IndexError):
  160. x[expected_len]
  161. a = 0
  162. b = 2 * sys.maxsize
  163. expected_len = b - a
  164. x = range(a, b)
  165. self.assertIn(a, x)
  166. self.assertNotIn(b, x)
  167. self.assertRaises(OverflowError, len, x)
  168. self.assertTrue(x)
  169. self.assertEqual(_range_len(x), expected_len)
  170. self.assertEqual(x[0], a)
  171. idx = sys.maxsize+1
  172. self.assertEqual(x[idx], a+idx)
  173. self.assertEqual(x[idx:idx+1][0], a+idx)
  174. with self.assertRaises(IndexError):
  175. x[-expected_len-1]
  176. with self.assertRaises(IndexError):
  177. x[expected_len]
  178. a = 0
  179. b = sys.maxsize**10
  180. c = 2*sys.maxsize
  181. expected_len = 1 + (b - a) // c
  182. x = range(a, b, c)
  183. self.assertIn(a, x)
  184. self.assertNotIn(b, x)
  185. self.assertRaises(OverflowError, len, x)
  186. self.assertTrue(x)
  187. self.assertEqual(_range_len(x), expected_len)
  188. self.assertEqual(x[0], a)
  189. idx = sys.maxsize+1
  190. self.assertEqual(x[idx], a+(idx*c))
  191. self.assertEqual(x[idx:idx+1][0], a+(idx*c))
  192. with self.assertRaises(IndexError):
  193. x[-expected_len-1]
  194. with self.assertRaises(IndexError):
  195. x[expected_len]
  196. a = sys.maxsize**10
  197. b = 0
  198. c = -2*sys.maxsize
  199. expected_len = 1 + (b - a) // c
  200. x = range(a, b, c)
  201. self.assertIn(a, x)
  202. self.assertNotIn(b, x)
  203. self.assertRaises(OverflowError, len, x)
  204. self.assertTrue(x)
  205. self.assertEqual(_range_len(x), expected_len)
  206. self.assertEqual(x[0], a)
  207. idx = sys.maxsize+1
  208. self.assertEqual(x[idx], a+(idx*c))
  209. self.assertEqual(x[idx:idx+1][0], a+(idx*c))
  210. with self.assertRaises(IndexError):
  211. x[-expected_len-1]
  212. with self.assertRaises(IndexError):
  213. x[expected_len]
  214. def test_invalid_invocation(self):
  215. self.assertRaises(TypeError, range)
  216. self.assertRaises(TypeError, range, 1, 2, 3, 4)
  217. self.assertRaises(ValueError, range, 1, 2, 0)
  218. a = int(10 * sys.maxsize)
  219. self.assertRaises(ValueError, range, a, a + 1, int(0))
  220. self.assertRaises(TypeError, range, 1., 1., 1.)
  221. self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
  222. self.assertRaises(TypeError, range, 0, "spam")
  223. self.assertRaises(TypeError, range, 0, 42, "spam")
  224. # Exercise various combinations of bad arguments, to check
  225. # refcounting logic
  226. self.assertRaises(TypeError, range, 0.0)
  227. self.assertRaises(TypeError, range, 0, 0.0)
  228. self.assertRaises(TypeError, range, 0.0, 0)
  229. self.assertRaises(TypeError, range, 0.0, 0.0)
  230. self.assertRaises(TypeError, range, 0, 0, 1.0)
  231. self.assertRaises(TypeError, range, 0, 0.0, 1)
  232. self.assertRaises(TypeError, range, 0, 0.0, 1.0)
  233. self.assertRaises(TypeError, range, 0.0, 0, 1)
  234. self.assertRaises(TypeError, range, 0.0, 0, 1.0)
  235. self.assertRaises(TypeError, range, 0.0, 0.0, 1)
  236. self.assertRaises(TypeError, range, 0.0, 0.0, 1.0)
  237. def test_index(self):
  238. u = range(2)
  239. self.assertEqual(u.index(0), 0)
  240. self.assertEqual(u.index(1), 1)
  241. self.assertRaises(ValueError, u.index, 2)
  242. u = range(-2, 3)
  243. self.assertEqual(u.count(0), 1)
  244. self.assertEqual(u.index(0), 2)
  245. self.assertRaises(TypeError, u.index)
  246. class BadExc(Exception):
  247. pass
  248. class BadCmp:
  249. def __eq__(self, other):
  250. if other == 2:
  251. raise BadExc()
  252. return False
  253. a = range(4)
  254. self.assertRaises(BadExc, a.index, BadCmp())
  255. a = range(-2, 3)
  256. self.assertEqual(a.index(0), 2)
  257. self.assertEqual(range(1, 10, 3).index(4), 1)
  258. self.assertEqual(range(1, -10, -3).index(-5), 2)
  259. self.assertEqual(range(10**20).index(1), 1)
  260. self.assertEqual(range(10**20).index(10**20 - 1), 10**20 - 1)
  261. self.assertRaises(ValueError, range(1, 2**100, 2).index, 2**87)
  262. self.assertEqual(range(1, 2**100, 2).index(2**87+1), 2**86)
  263. self.assertEqual(range(10).index(ALWAYS_EQ), 0)
  264. def test_user_index_method(self):
  265. bignum = 2*sys.maxsize
  266. smallnum = 42
  267. # User-defined class with an __index__ method
  268. class I:
  269. def __init__(self, n):
  270. self.n = int(n)
  271. def __index__(self):
  272. return self.n
  273. self.assertEqual(list(range(I(bignum), I(bignum + 1))), [bignum])
  274. self.assertEqual(list(range(I(smallnum), I(smallnum + 1))), [smallnum])
  275. # User-defined class with a failing __index__ method
  276. class IX:
  277. def __index__(self):
  278. raise RuntimeError
  279. self.assertRaises(RuntimeError, range, IX())
  280. # User-defined class with an invalid __index__ method
  281. class IN:
  282. def __index__(self):
  283. return "not a number"
  284. self.assertRaises(TypeError, range, IN())
  285. # Test use of user-defined classes in slice indices.
  286. self.assertEqual(range(10)[:I(5)], range(5))
  287. with self.assertRaises(RuntimeError):
  288. range(0, 10)[:IX()]
  289. with self.assertRaises(TypeError):
  290. range(0, 10)[:IN()]
  291. def test_count(self):
  292. self.assertEqual(range(3).count(-1), 0)
  293. self.assertEqual(range(3).count(0), 1)
  294. self.assertEqual(range(3).count(1), 1)
  295. self.assertEqual(range(3).count(2), 1)
  296. self.assertEqual(range(3).count(3), 0)
  297. self.assertIs(type(range(3).count(-1)), int)
  298. self.assertIs(type(range(3).count(1)), int)
  299. self.assertEqual(range(10**20).count(1), 1)
  300. self.assertEqual(range(10**20).count(10**20), 0)
  301. self.assertEqual(range(3).index(1), 1)
  302. self.assertEqual(range(1, 2**100, 2).count(2**87), 0)
  303. self.assertEqual(range(1, 2**100, 2).count(2**87+1), 1)
  304. self.assertEqual(range(10).count(ALWAYS_EQ), 10)
  305. self.assertEqual(len(range(sys.maxsize, sys.maxsize+10)), 10)
  306. def test_repr(self):
  307. self.assertEqual(repr(range(1)), 'range(0, 1)')
  308. self.assertEqual(repr(range(1, 2)), 'range(1, 2)')
  309. self.assertEqual(repr(range(1, 2, 3)), 'range(1, 2, 3)')
  310. def test_pickling(self):
  311. testcases = [(13,), (0, 11), (-22, 10), (20, 3, -1),
  312. (13, 21, 3), (-2, 2, 2), (2**65, 2**65+2)]
  313. for proto in range(pickle.HIGHEST_PROTOCOL + 1):
  314. for t in testcases:
  315. with self.subTest(proto=proto, test=t):
  316. r = range(*t)
  317. self.assertEqual(list(pickle.loads(pickle.dumps(r, proto))),
  318. list(r))
  319. def test_iterator_pickling(self):
  320. testcases = [(13,), (0, 11), (-22, 10), (20, 3, -1), (13, 21, 3),
  321. (-2, 2, 2)]
  322. for M in 2**31, 2**63:
  323. testcases += [
  324. (M-3, M-1), (4*M, 4*M+2),
  325. (M-2, M-1, 2), (-M+1, -M, -2),
  326. (1, 2, M-1), (-1, -2, -M),
  327. (1, M-1, M-1), (-1, -M, -M),
  328. ]
  329. for proto in range(pickle.HIGHEST_PROTOCOL + 1):
  330. for t in testcases:
  331. with self.subTest(proto=proto, t=t):
  332. it = itorg = iter(range(*t))
  333. data = list(range(*t))
  334. d = pickle.dumps(it, proto)
  335. it = pickle.loads(d)
  336. self.assertEqual(type(itorg), type(it))
  337. self.assertEqual(list(it), data)
  338. it = pickle.loads(d)
  339. try:
  340. next(it)
  341. except StopIteration:
  342. continue
  343. d = pickle.dumps(it, proto)
  344. it = pickle.loads(d)
  345. self.assertEqual(list(it), data[1:])
  346. def test_iterator_pickling_overflowing_index(self):
  347. for proto in range(pickle.HIGHEST_PROTOCOL + 1):
  348. with self.subTest(proto=proto):
  349. it = iter(range(2**32 + 2))
  350. _, _, idx = it.__reduce__()
  351. self.assertEqual(idx, 0)
  352. it.__setstate__(2**32 + 1) # undocumented way to set r->index
  353. _, _, idx = it.__reduce__()
  354. self.assertEqual(idx, 2**32 + 1)
  355. d = pickle.dumps(it, proto)
  356. it = pickle.loads(d)
  357. self.assertEqual(next(it), 2**32 + 1)
  358. def test_exhausted_iterator_pickling(self):
  359. for proto in range(pickle.HIGHEST_PROTOCOL + 1):
  360. r = range(2**65, 2**65+2)
  361. i = iter(r)
  362. while True:
  363. r = next(i)
  364. if r == 2**65+1:
  365. break
  366. d = pickle.dumps(i, proto)
  367. i2 = pickle.loads(d)
  368. self.assertEqual(list(i), [])
  369. self.assertEqual(list(i2), [])
  370. def test_large_exhausted_iterator_pickling(self):
  371. for proto in range(pickle.HIGHEST_PROTOCOL + 1):
  372. r = range(20)
  373. i = iter(r)
  374. while True:
  375. r = next(i)
  376. if r == 19:
  377. break
  378. d = pickle.dumps(i, proto)
  379. i2 = pickle.loads(d)
  380. self.assertEqual(list(i), [])
  381. self.assertEqual(list(i2), [])
  382. def test_odd_bug(self):
  383. # This used to raise a "SystemError: NULL result without error"
  384. # because the range validation step was eating the exception
  385. # before NULL was returned.
  386. with self.assertRaises(TypeError):
  387. range([], 1, -1)
  388. def test_types(self):
  389. # Non-integer objects *equal* to any of the range's items are supposed
  390. # to be contained in the range.
  391. self.assertIn(1.0, range(3))
  392. self.assertIn(True, range(3))
  393. self.assertIn(1+0j, range(3))
  394. self.assertIn(ALWAYS_EQ, range(3))
  395. # Objects are never coerced into other types for comparison.
  396. class C2:
  397. def __int__(self): return 1
  398. def __index__(self): return 1
  399. self.assertNotIn(C2(), range(3))
  400. # ..except if explicitly told so.
  401. self.assertIn(int(C2()), range(3))
  402. # Check that the range.__contains__ optimization is only
  403. # used for ints, not for instances of subclasses of int.
  404. class C3(int):
  405. def __eq__(self, other): return True
  406. self.assertIn(C3(11), range(10))
  407. self.assertIn(C3(11), list(range(10)))
  408. def test_strided_limits(self):
  409. r = range(0, 101, 2)
  410. self.assertIn(0, r)
  411. self.assertNotIn(1, r)
  412. self.assertIn(2, r)
  413. self.assertNotIn(99, r)
  414. self.assertIn(100, r)
  415. self.assertNotIn(101, r)
  416. r = range(0, -20, -1)
  417. self.assertIn(0, r)
  418. self.assertIn(-1, r)
  419. self.assertIn(-19, r)
  420. self.assertNotIn(-20, r)
  421. r = range(0, -20, -2)
  422. self.assertIn(-18, r)
  423. self.assertNotIn(-19, r)
  424. self.assertNotIn(-20, r)
  425. def test_empty(self):
  426. r = range(0)
  427. self.assertNotIn(0, r)
  428. self.assertNotIn(1, r)
  429. r = range(0, -10)
  430. self.assertNotIn(0, r)
  431. self.assertNotIn(-1, r)
  432. self.assertNotIn(1, r)
  433. def test_range_iterators(self):
  434. # exercise 'fast' iterators, that use a rangeiterobject internally.
  435. # see issue 7298
  436. limits = [base + jiggle
  437. for M in (2**32, 2**64)
  438. for base in (-M, -M//2, 0, M//2, M)
  439. for jiggle in (-2, -1, 0, 1, 2)]
  440. test_ranges = [(start, end, step)
  441. for start in limits
  442. for end in limits
  443. for step in (-2**63, -2**31, -2, -1, 1, 2)]
  444. for start, end, step in test_ranges:
  445. iter1 = range(start, end, step)
  446. iter2 = pyrange(start, end, step)
  447. test_id = "range({}, {}, {})".format(start, end, step)
  448. # check first 100 entries
  449. self.assert_iterators_equal(iter1, iter2, test_id, limit=100)
  450. iter1 = reversed(range(start, end, step))
  451. iter2 = pyrange_reversed(start, end, step)
  452. test_id = "reversed(range({}, {}, {}))".format(start, end, step)
  453. self.assert_iterators_equal(iter1, iter2, test_id, limit=100)
  454. def test_range_iterators_invocation(self):
  455. # verify range iterators instances cannot be created by
  456. # calling their type
  457. rangeiter_type = type(iter(range(0)))
  458. self.assertRaises(TypeError, rangeiter_type, 1, 3, 1)
  459. long_rangeiter_type = type(iter(range(1 << 1000)))
  460. self.assertRaises(TypeError, long_rangeiter_type, 1, 3, 1)
  461. def test_slice(self):
  462. def check(start, stop, step=None):
  463. i = slice(start, stop, step)
  464. self.assertEqual(list(r[i]), list(r)[i])
  465. self.assertEqual(len(r[i]), len(list(r)[i]))
  466. for r in [range(10),
  467. range(0),
  468. range(1, 9, 3),
  469. range(8, 0, -3),
  470. range(sys.maxsize+1, sys.maxsize+10),
  471. ]:
  472. check(0, 2)
  473. check(0, 20)
  474. check(1, 2)
  475. check(20, 30)
  476. check(-30, -20)
  477. check(-1, 100, 2)
  478. check(0, -1)
  479. check(-1, -3, -1)
  480. def test_contains(self):
  481. r = range(10)
  482. self.assertIn(0, r)
  483. self.assertIn(1, r)
  484. self.assertIn(5.0, r)
  485. self.assertNotIn(5.1, r)
  486. self.assertNotIn(-1, r)
  487. self.assertNotIn(10, r)
  488. self.assertNotIn("", r)
  489. r = range(9, -1, -1)
  490. self.assertIn(0, r)
  491. self.assertIn(1, r)
  492. self.assertIn(5.0, r)
  493. self.assertNotIn(5.1, r)
  494. self.assertNotIn(-1, r)
  495. self.assertNotIn(10, r)
  496. self.assertNotIn("", r)
  497. r = range(0, 10, 2)
  498. self.assertIn(0, r)
  499. self.assertNotIn(1, r)
  500. self.assertNotIn(5.0, r)
  501. self.assertNotIn(5.1, r)
  502. self.assertNotIn(-1, r)
  503. self.assertNotIn(10, r)
  504. self.assertNotIn("", r)
  505. r = range(9, -1, -2)
  506. self.assertNotIn(0, r)
  507. self.assertIn(1, r)
  508. self.assertIn(5.0, r)
  509. self.assertNotIn(5.1, r)
  510. self.assertNotIn(-1, r)
  511. self.assertNotIn(10, r)
  512. self.assertNotIn("", r)
  513. def test_reverse_iteration(self):
  514. for r in [range(10),
  515. range(0),
  516. range(1, 9, 3),
  517. range(8, 0, -3),
  518. range(sys.maxsize+1, sys.maxsize+10),
  519. ]:
  520. self.assertEqual(list(reversed(r)), list(r)[::-1])
  521. def test_issue11845(self):
  522. r = range(*slice(1, 18, 2).indices(20))
  523. values = {None, 0, 1, -1, 2, -2, 5, -5, 19, -19,
  524. 20, -20, 21, -21, 30, -30, 99, -99}
  525. for i in values:
  526. for j in values:
  527. for k in values - {0}:
  528. r[i:j:k]
  529. def test_comparison(self):
  530. test_ranges = [range(0), range(0, -1), range(1, 1, 3),
  531. range(1), range(5, 6), range(5, 6, 2),
  532. range(5, 7, 2), range(2), range(0, 4, 2),
  533. range(0, 5, 2), range(0, 6, 2)]
  534. test_tuples = list(map(tuple, test_ranges))
  535. # Check that equality of ranges matches equality of the corresponding
  536. # tuples for each pair from the test lists above.
  537. ranges_eq = [a == b for a in test_ranges for b in test_ranges]
  538. tuples_eq = [a == b for a in test_tuples for b in test_tuples]
  539. self.assertEqual(ranges_eq, tuples_eq)
  540. # Check that != correctly gives the logical negation of ==
  541. ranges_ne = [a != b for a in test_ranges for b in test_ranges]
  542. self.assertEqual(ranges_ne, [not x for x in ranges_eq])
  543. # Equal ranges should have equal hashes.
  544. for a in test_ranges:
  545. for b in test_ranges:
  546. if a == b:
  547. self.assertEqual(hash(a), hash(b))
  548. # Ranges are unequal to other types (even sequence types)
  549. self.assertIs(range(0) == (), False)
  550. self.assertIs(() == range(0), False)
  551. self.assertIs(range(2) == [0, 1], False)
  552. # Huge integers aren't a problem.
  553. self.assertEqual(range(0, 2**100 - 1, 2),
  554. range(0, 2**100, 2))
  555. self.assertEqual(hash(range(0, 2**100 - 1, 2)),
  556. hash(range(0, 2**100, 2)))
  557. self.assertNotEqual(range(0, 2**100, 2),
  558. range(0, 2**100 + 1, 2))
  559. self.assertEqual(range(2**200, 2**201 - 2**99, 2**100),
  560. range(2**200, 2**201, 2**100))
  561. self.assertEqual(hash(range(2**200, 2**201 - 2**99, 2**100)),
  562. hash(range(2**200, 2**201, 2**100)))
  563. self.assertNotEqual(range(2**200, 2**201, 2**100),
  564. range(2**200, 2**201 + 1, 2**100))
  565. # Order comparisons are not implemented for ranges.
  566. with self.assertRaises(TypeError):
  567. range(0) < range(0)
  568. with self.assertRaises(TypeError):
  569. range(0) > range(0)
  570. with self.assertRaises(TypeError):
  571. range(0) <= range(0)
  572. with self.assertRaises(TypeError):
  573. range(0) >= range(0)
  574. def test_attributes(self):
  575. # test the start, stop and step attributes of range objects
  576. self.assert_attrs(range(0), 0, 0, 1)
  577. self.assert_attrs(range(10), 0, 10, 1)
  578. self.assert_attrs(range(-10), 0, -10, 1)
  579. self.assert_attrs(range(0, 10, 1), 0, 10, 1)
  580. self.assert_attrs(range(0, 10, 3), 0, 10, 3)
  581. self.assert_attrs(range(10, 0, -1), 10, 0, -1)
  582. self.assert_attrs(range(10, 0, -3), 10, 0, -3)
  583. self.assert_attrs(range(True), 0, 1, 1)
  584. self.assert_attrs(range(False, True), 0, 1, 1)
  585. self.assert_attrs(range(False, True, True), 0, 1, 1)
  586. def assert_attrs(self, rangeobj, start, stop, step):
  587. self.assertEqual(rangeobj.start, start)
  588. self.assertEqual(rangeobj.stop, stop)
  589. self.assertEqual(rangeobj.step, step)
  590. self.assertIs(type(rangeobj.start), int)
  591. self.assertIs(type(rangeobj.stop), int)
  592. self.assertIs(type(rangeobj.step), int)
  593. with self.assertRaises(AttributeError):
  594. rangeobj.start = 0
  595. with self.assertRaises(AttributeError):
  596. rangeobj.stop = 10
  597. with self.assertRaises(AttributeError):
  598. rangeobj.step = 1
  599. with self.assertRaises(AttributeError):
  600. del rangeobj.start
  601. with self.assertRaises(AttributeError):
  602. del rangeobj.stop
  603. with self.assertRaises(AttributeError):
  604. del rangeobj.step
  605. if __name__ == "__main__":
  606. unittest.main()