blob: 30fa129b50ecba53dbf0bef744f22554ebf960bb [file] [log] [blame]
Neal Norwitz1c0423a2004-07-08 01:59:55 +00001# Python test set -- built-in functions
2
Serhiy Storchakae4fbb022016-04-24 23:42:49 +03003import unittest
Neal Norwitz1c0423a2004-07-08 01:59:55 +00004import sys
Alexandre Vassalotti75056072008-06-10 04:03:04 +00005import pickle
Mark Dickinsond550c9a2009-11-15 09:57:26 +00006import itertools
Serhiy Storchaka7d44e7a2019-08-08 08:43:18 +03007from test.support import ALWAYS_EQ
Neal Norwitz1c0423a2004-07-08 01:59:55 +00008
Mark Dickinsond550c9a2009-11-15 09:57:26 +00009# pure Python implementations (3 args only), for comparison
10def pyrange(start, stop, step):
11 if (start - stop) // step < 0:
12 # replace stop with next element in the sequence of integers
13 # that are congruent to start modulo step.
14 stop += (start - stop) % step
15 while start != stop:
16 yield start
17 start += step
18
19def pyrange_reversed(start, stop, step):
20 stop += (start - stop) % step
21 return pyrange(stop - step, start - step, -step)
22
23
Walter Dörwald4ad94212007-05-21 18:01:17 +000024class RangeTest(unittest.TestCase):
Mark Dickinsond550c9a2009-11-15 09:57:26 +000025 def assert_iterators_equal(self, xs, ys, test_id, limit=None):
26 # check that an iterator xs matches the expected results ys,
27 # up to a given limit.
28 if limit is not None:
29 xs = itertools.islice(xs, limit)
30 ys = itertools.islice(ys, limit)
31 sentinel = object()
32 pairs = itertools.zip_longest(xs, ys, fillvalue=sentinel)
33 for i, (x, y) in enumerate(pairs):
34 if x == y:
35 continue
36 elif x == sentinel:
37 self.fail('{}: iterator ended unexpectedly '
38 'at position {}; expected {}'.format(test_id, i, y))
39 elif y == sentinel:
40 self.fail('{}: unexpected excess element {} at '
41 'position {}'.format(test_id, x, i))
42 else:
Serhiy Storchaka34fd4c22018-11-05 16:20:25 +020043 self.fail('{}: wrong element at position {}; '
Mark Dickinsond550c9a2009-11-15 09:57:26 +000044 'expected {}, got {}'.format(test_id, i, y, x))
45
Walter Dörwald4ad94212007-05-21 18:01:17 +000046 def test_range(self):
Guido van Rossum805365e2007-05-07 22:24:25 +000047 self.assertEqual(list(range(3)), [0, 1, 2])
48 self.assertEqual(list(range(1, 5)), [1, 2, 3, 4])
49 self.assertEqual(list(range(0)), [])
50 self.assertEqual(list(range(-3)), [])
51 self.assertEqual(list(range(1, 10, 3)), [1, 4, 7])
52 self.assertEqual(list(range(5, -5, -3)), [5, 2, -1, -4])
Neal Norwitz1c0423a2004-07-08 01:59:55 +000053
54 a = 10
55 b = 100
56 c = 50
57
Guido van Rossum805365e2007-05-07 22:24:25 +000058 self.assertEqual(list(range(a, a+2)), [a, a+1])
59 self.assertEqual(list(range(a+2, a, -1)), [a+2, a+1])
60 self.assertEqual(list(range(a+4, a, -2)), [a+4, a+2])
Neal Norwitz1c0423a2004-07-08 01:59:55 +000061
Guido van Rossum805365e2007-05-07 22:24:25 +000062 seq = list(range(a, b, c))
Benjamin Peterson577473f2010-01-19 00:09:57 +000063 self.assertIn(a, seq)
64 self.assertNotIn(b, seq)
Neal Norwitz1c0423a2004-07-08 01:59:55 +000065 self.assertEqual(len(seq), 2)
66
Guido van Rossum805365e2007-05-07 22:24:25 +000067 seq = list(range(b, a, -c))
Benjamin Peterson577473f2010-01-19 00:09:57 +000068 self.assertIn(b, seq)
69 self.assertNotIn(a, seq)
Neal Norwitz1c0423a2004-07-08 01:59:55 +000070 self.assertEqual(len(seq), 2)
71
Guido van Rossum805365e2007-05-07 22:24:25 +000072 seq = list(range(-a, -b, -c))
Benjamin Peterson577473f2010-01-19 00:09:57 +000073 self.assertIn(-a, seq)
74 self.assertNotIn(-b, seq)
Neal Norwitz1c0423a2004-07-08 01:59:55 +000075 self.assertEqual(len(seq), 2)
76
Guido van Rossum805365e2007-05-07 22:24:25 +000077 self.assertRaises(TypeError, range)
78 self.assertRaises(TypeError, range, 1, 2, 3, 4)
79 self.assertRaises(ValueError, range, 1, 2, 0)
Neal Norwitz1c0423a2004-07-08 01:59:55 +000080
Guido van Rossum805365e2007-05-07 22:24:25 +000081 self.assertRaises(TypeError, range, 0.0, 2, 1)
82 self.assertRaises(TypeError, range, 1, 2.0, 1)
83 self.assertRaises(TypeError, range, 1, 2, 1.0)
84 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Neal Norwitz1c0423a2004-07-08 01:59:55 +000085
Guido van Rossum805365e2007-05-07 22:24:25 +000086 self.assertRaises(TypeError, range, 0, "spam")
87 self.assertRaises(TypeError, range, 0, 42, "spam")
Neal Norwitz1c0423a2004-07-08 01:59:55 +000088
Christian Heimesa37d4c62007-12-04 23:02:19 +000089 self.assertEqual(len(range(0, sys.maxsize, sys.maxsize-1)), 2)
Tim Petersfeec4532004-08-08 07:17:39 +000090
Christian Heimesa37d4c62007-12-04 23:02:19 +000091 r = range(-sys.maxsize, sys.maxsize, 2)
92 self.assertEqual(len(r), sys.maxsize)
Tim Petersfeec4532004-08-08 07:17:39 +000093
Pablo Galindo4b66fa62020-01-05 17:30:53 +000094 def test_range_constructor_error_messages(self):
95 with self.assertRaisesRegex(
96 TypeError,
97 "range expected at least 1 argument, got 0"
98 ):
99 range()
100
101 with self.assertRaisesRegex(
102 TypeError,
103 "range expected at most 3 arguments, got 6"
104 ):
105 range(1, 2, 3, 4, 5, 6)
106
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000107 def test_large_operands(self):
108 x = range(10**20, 10**20+10, 3)
109 self.assertEqual(len(x), 4)
110 self.assertEqual(len(list(x)), 4)
111
112 x = range(10**20+10, 10**20, 3)
113 self.assertEqual(len(x), 0)
114 self.assertEqual(len(list(x)), 0)
4kir4e46fb862017-03-20 09:44:46 +0300115 self.assertFalse(x)
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000116
117 x = range(10**20, 10**20+10, -3)
118 self.assertEqual(len(x), 0)
119 self.assertEqual(len(list(x)), 0)
4kir4e46fb862017-03-20 09:44:46 +0300120 self.assertFalse(x)
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000121
122 x = range(10**20+10, 10**20, -3)
123 self.assertEqual(len(x), 4)
124 self.assertEqual(len(list(x)), 4)
4kir4e46fb862017-03-20 09:44:46 +0300125 self.assertTrue(x)
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000126
127 # Now test range() with longs
4kir4e46fb862017-03-20 09:44:46 +0300128 for x in [range(-2**100),
129 range(0, -2**100),
130 range(0, 2**100, -1)]:
131 self.assertEqual(list(x), [])
132 self.assertFalse(x)
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000133
134 a = int(10 * sys.maxsize)
135 b = int(100 * sys.maxsize)
136 c = int(50 * sys.maxsize)
137
138 self.assertEqual(list(range(a, a+2)), [a, a+1])
139 self.assertEqual(list(range(a+2, a, -1)), [a+2, a+1])
140 self.assertEqual(list(range(a+4, a, -2)), [a+4, a+2])
141
142 seq = list(range(a, b, c))
143 self.assertIn(a, seq)
144 self.assertNotIn(b, seq)
145 self.assertEqual(len(seq), 2)
Nick Coghlane993b102011-01-12 03:15:52 +0000146 self.assertEqual(seq[0], a)
147 self.assertEqual(seq[-1], a+c)
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000148
149 seq = list(range(b, a, -c))
150 self.assertIn(b, seq)
151 self.assertNotIn(a, seq)
152 self.assertEqual(len(seq), 2)
Nick Coghlane993b102011-01-12 03:15:52 +0000153 self.assertEqual(seq[0], b)
154 self.assertEqual(seq[-1], b-c)
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000155
156 seq = list(range(-a, -b, -c))
157 self.assertIn(-a, seq)
158 self.assertNotIn(-b, seq)
159 self.assertEqual(len(seq), 2)
Nick Coghlane993b102011-01-12 03:15:52 +0000160 self.assertEqual(seq[0], -a)
161 self.assertEqual(seq[-1], -a-c)
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000162
Nick Coghlane993b102011-01-12 03:15:52 +0000163 def test_large_range(self):
164 # Check long ranges (len > sys.maxsize)
165 # len() is expected to fail due to limitations of the __len__ protocol
166 def _range_len(x):
167 try:
168 length = len(x)
169 except OverflowError:
170 step = x[1] - x[0]
171 length = 1 + ((x[-1] - x[0]) // step)
172 return length
4kir4e46fb862017-03-20 09:44:46 +0300173
Nick Coghlane993b102011-01-12 03:15:52 +0000174 a = -sys.maxsize
175 b = sys.maxsize
176 expected_len = b - a
177 x = range(a, b)
178 self.assertIn(a, x)
179 self.assertNotIn(b, x)
180 self.assertRaises(OverflowError, len, x)
4kir4e46fb862017-03-20 09:44:46 +0300181 self.assertTrue(x)
Nick Coghlane993b102011-01-12 03:15:52 +0000182 self.assertEqual(_range_len(x), expected_len)
183 self.assertEqual(x[0], a)
184 idx = sys.maxsize+1
185 self.assertEqual(x[idx], a+idx)
186 self.assertEqual(x[idx:idx+1][0], a+idx)
187 with self.assertRaises(IndexError):
188 x[-expected_len-1]
189 with self.assertRaises(IndexError):
190 x[expected_len]
191
192 a = 0
193 b = 2 * sys.maxsize
194 expected_len = b - a
195 x = range(a, b)
196 self.assertIn(a, x)
197 self.assertNotIn(b, x)
198 self.assertRaises(OverflowError, len, x)
4kir4e46fb862017-03-20 09:44:46 +0300199 self.assertTrue(x)
Nick Coghlane993b102011-01-12 03:15:52 +0000200 self.assertEqual(_range_len(x), expected_len)
201 self.assertEqual(x[0], a)
202 idx = sys.maxsize+1
203 self.assertEqual(x[idx], a+idx)
204 self.assertEqual(x[idx:idx+1][0], a+idx)
205 with self.assertRaises(IndexError):
206 x[-expected_len-1]
207 with self.assertRaises(IndexError):
208 x[expected_len]
209
210 a = 0
211 b = sys.maxsize**10
212 c = 2*sys.maxsize
213 expected_len = 1 + (b - a) // c
214 x = range(a, b, c)
215 self.assertIn(a, x)
216 self.assertNotIn(b, x)
217 self.assertRaises(OverflowError, len, x)
4kir4e46fb862017-03-20 09:44:46 +0300218 self.assertTrue(x)
Nick Coghlane993b102011-01-12 03:15:52 +0000219 self.assertEqual(_range_len(x), expected_len)
220 self.assertEqual(x[0], a)
221 idx = sys.maxsize+1
222 self.assertEqual(x[idx], a+(idx*c))
223 self.assertEqual(x[idx:idx+1][0], a+(idx*c))
224 with self.assertRaises(IndexError):
225 x[-expected_len-1]
226 with self.assertRaises(IndexError):
227 x[expected_len]
228
229 a = sys.maxsize**10
230 b = 0
231 c = -2*sys.maxsize
232 expected_len = 1 + (b - a) // c
233 x = range(a, b, c)
234 self.assertIn(a, x)
235 self.assertNotIn(b, x)
236 self.assertRaises(OverflowError, len, x)
4kir4e46fb862017-03-20 09:44:46 +0300237 self.assertTrue(x)
Nick Coghlane993b102011-01-12 03:15:52 +0000238 self.assertEqual(_range_len(x), expected_len)
239 self.assertEqual(x[0], a)
240 idx = sys.maxsize+1
241 self.assertEqual(x[idx], a+(idx*c))
242 self.assertEqual(x[idx:idx+1][0], a+(idx*c))
243 with self.assertRaises(IndexError):
244 x[-expected_len-1]
245 with self.assertRaises(IndexError):
246 x[expected_len]
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000247
248 def test_invalid_invocation(self):
249 self.assertRaises(TypeError, range)
250 self.assertRaises(TypeError, range, 1, 2, 3, 4)
251 self.assertRaises(ValueError, range, 1, 2, 0)
Benjamin Petersond57bb552010-11-20 23:03:34 +0000252 a = int(10 * sys.maxsize)
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000253 self.assertRaises(ValueError, range, a, a + 1, int(0))
254 self.assertRaises(TypeError, range, 1., 1., 1.)
255 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
256 self.assertRaises(TypeError, range, 0, "spam")
257 self.assertRaises(TypeError, range, 0, 42, "spam")
258 # Exercise various combinations of bad arguments, to check
259 # refcounting logic
260 self.assertRaises(TypeError, range, 0.0)
261 self.assertRaises(TypeError, range, 0, 0.0)
262 self.assertRaises(TypeError, range, 0.0, 0)
263 self.assertRaises(TypeError, range, 0.0, 0.0)
264 self.assertRaises(TypeError, range, 0, 0, 1.0)
265 self.assertRaises(TypeError, range, 0, 0.0, 1)
266 self.assertRaises(TypeError, range, 0, 0.0, 1.0)
267 self.assertRaises(TypeError, range, 0.0, 0, 1)
268 self.assertRaises(TypeError, range, 0.0, 0, 1.0)
269 self.assertRaises(TypeError, range, 0.0, 0.0, 1)
270 self.assertRaises(TypeError, range, 0.0, 0.0, 1.0)
271
272 def test_index(self):
273 u = range(2)
274 self.assertEqual(u.index(0), 0)
275 self.assertEqual(u.index(1), 1)
276 self.assertRaises(ValueError, u.index, 2)
277
278 u = range(-2, 3)
279 self.assertEqual(u.count(0), 1)
280 self.assertEqual(u.index(0), 2)
281 self.assertRaises(TypeError, u.index)
282
283 class BadExc(Exception):
284 pass
285
286 class BadCmp:
287 def __eq__(self, other):
288 if other == 2:
289 raise BadExc()
290 return False
291
292 a = range(4)
293 self.assertRaises(BadExc, a.index, BadCmp())
294
295 a = range(-2, 3)
296 self.assertEqual(a.index(0), 2)
297 self.assertEqual(range(1, 10, 3).index(4), 1)
298 self.assertEqual(range(1, -10, -3).index(-5), 2)
299
300 self.assertEqual(range(10**20).index(1), 1)
301 self.assertEqual(range(10**20).index(10**20 - 1), 10**20 - 1)
302
303 self.assertRaises(ValueError, range(1, 2**100, 2).index, 2**87)
304 self.assertEqual(range(1, 2**100, 2).index(2**87+1), 2**86)
305
Serhiy Storchaka7d44e7a2019-08-08 08:43:18 +0300306 self.assertEqual(range(10).index(ALWAYS_EQ), 0)
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000307
308 def test_user_index_method(self):
309 bignum = 2*sys.maxsize
310 smallnum = 42
311
312 # User-defined class with an __index__ method
313 class I:
314 def __init__(self, n):
315 self.n = int(n)
316 def __index__(self):
317 return self.n
318 self.assertEqual(list(range(I(bignum), I(bignum + 1))), [bignum])
319 self.assertEqual(list(range(I(smallnum), I(smallnum + 1))), [smallnum])
320
321 # User-defined class with a failing __index__ method
322 class IX:
323 def __index__(self):
324 raise RuntimeError
325 self.assertRaises(RuntimeError, range, IX())
326
327 # User-defined class with an invalid __index__ method
328 class IN:
329 def __index__(self):
330 return "not a number"
331
332 self.assertRaises(TypeError, range, IN())
333
Mark Dickinson8cd1c762012-11-04 11:46:17 +0000334 # Test use of user-defined classes in slice indices.
Mark Dickinsonc992faf2012-11-04 11:47:47 +0000335 self.assertEqual(range(10)[:I(5)], range(5))
Mark Dickinson8cd1c762012-11-04 11:46:17 +0000336
337 with self.assertRaises(RuntimeError):
338 range(0, 10)[:IX()]
339
340 with self.assertRaises(TypeError):
341 range(0, 10)[:IN()]
342
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000343 def test_count(self):
344 self.assertEqual(range(3).count(-1), 0)
345 self.assertEqual(range(3).count(0), 1)
346 self.assertEqual(range(3).count(1), 1)
347 self.assertEqual(range(3).count(2), 1)
348 self.assertEqual(range(3).count(3), 0)
349 self.assertIs(type(range(3).count(-1)), int)
350 self.assertIs(type(range(3).count(1)), int)
351 self.assertEqual(range(10**20).count(1), 1)
352 self.assertEqual(range(10**20).count(10**20), 0)
353 self.assertEqual(range(3).index(1), 1)
354 self.assertEqual(range(1, 2**100, 2).count(2**87), 0)
355 self.assertEqual(range(1, 2**100, 2).count(2**87+1), 1)
356
Serhiy Storchaka7d44e7a2019-08-08 08:43:18 +0300357 self.assertEqual(range(10).count(ALWAYS_EQ), 10)
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000358
Nick Coghlan37ee8502010-12-03 14:26:13 +0000359 self.assertEqual(len(range(sys.maxsize, sys.maxsize+10)), 10)
360
Walter Dörwald67d99932007-05-20 08:22:37 +0000361 def test_repr(self):
Walter Dörwald03b43d82007-05-21 10:43:34 +0000362 self.assertEqual(repr(range(1)), 'range(0, 1)')
Walter Dörwald67d99932007-05-20 08:22:37 +0000363 self.assertEqual(repr(range(1, 2)), 'range(1, 2)')
364 self.assertEqual(repr(range(1, 2, 3)), 'range(1, 2, 3)')
365
Alexandre Vassalotti75056072008-06-10 04:03:04 +0000366 def test_pickling(self):
367 testcases = [(13,), (0, 11), (-22, 10), (20, 3, -1),
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000368 (13, 21, 3), (-2, 2, 2), (2**65, 2**65+2)]
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +0000369 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Alexandre Vassalotti75056072008-06-10 04:03:04 +0000370 for t in testcases:
Antoine Pitrou8f2ee6e2013-11-23 21:05:08 +0100371 with self.subTest(proto=proto, test=t):
372 r = range(*t)
373 self.assertEqual(list(pickle.loads(pickle.dumps(r, proto))),
374 list(r))
Alexandre Vassalotti75056072008-06-10 04:03:04 +0000375
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000376 def test_iterator_pickling(self):
377 testcases = [(13,), (0, 11), (-22, 10), (20, 3, -1),
378 (13, 21, 3), (-2, 2, 2), (2**65, 2**65+2)]
379 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
380 for t in testcases:
381 it = itorg = iter(range(*t))
382 data = list(range(*t))
383
Serhiy Storchakabad12572014-12-15 14:03:42 +0200384 d = pickle.dumps(it, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000385 it = pickle.loads(d)
386 self.assertEqual(type(itorg), type(it))
387 self.assertEqual(list(it), data)
388
389 it = pickle.loads(d)
390 try:
391 next(it)
392 except StopIteration:
393 continue
Serhiy Storchakabad12572014-12-15 14:03:42 +0200394 d = pickle.dumps(it, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000395 it = pickle.loads(d)
396 self.assertEqual(list(it), data[1:])
397
Kristján Valur Jónsson4ca688e2014-03-04 23:19:24 +0000398 def test_exhausted_iterator_pickling(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200399 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
400 r = range(2**65, 2**65+2)
401 i = iter(r)
402 while True:
403 r = next(i)
404 if r == 2**65+1:
405 break
406 d = pickle.dumps(i, proto)
407 i2 = pickle.loads(d)
408 self.assertEqual(list(i), [])
409 self.assertEqual(list(i2), [])
Kristján Valur Jónsson25dded02014-03-05 13:47:57 +0000410
411 def test_large_exhausted_iterator_pickling(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200412 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
413 r = range(20)
414 i = iter(r)
415 while True:
416 r = next(i)
417 if r == 19:
418 break
419 d = pickle.dumps(i, proto)
420 i2 = pickle.loads(d)
421 self.assertEqual(list(i), [])
422 self.assertEqual(list(i2), [])
Kristján Valur Jónsson4ca688e2014-03-04 23:19:24 +0000423
Raymond Hettinger94f55832009-06-12 18:40:16 +0000424 def test_odd_bug(self):
425 # This used to raise a "SystemError: NULL result without error"
426 # because the range validation step was eating the exception
427 # before NULL was returned.
428 with self.assertRaises(TypeError):
429 range([], 1, -1)
430
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000431 def test_types(self):
432 # Non-integer objects *equal* to any of the range's items are supposed
433 # to be contained in the range.
Benjamin Peterson577473f2010-01-19 00:09:57 +0000434 self.assertIn(1.0, range(3))
435 self.assertIn(True, range(3))
436 self.assertIn(1+0j, range(3))
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000437
Serhiy Storchaka7d44e7a2019-08-08 08:43:18 +0300438 self.assertIn(ALWAYS_EQ, range(3))
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000439
440 # Objects are never coerced into other types for comparison.
441 class C2:
442 def __int__(self): return 1
443 def __index__(self): return 1
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000444 self.assertNotIn(C2(), range(3))
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000445 # ..except if explicitly told so.
Benjamin Peterson577473f2010-01-19 00:09:57 +0000446 self.assertIn(int(C2()), range(3))
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000447
Mark Dickinson418f81d2009-09-24 20:04:23 +0000448 # Check that the range.__contains__ optimization is only
449 # used for ints, not for instances of subclasses of int.
450 class C3(int):
451 def __eq__(self, other): return True
Benjamin Peterson577473f2010-01-19 00:09:57 +0000452 self.assertIn(C3(11), range(10))
453 self.assertIn(C3(11), list(range(10)))
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000454
455 def test_strided_limits(self):
456 r = range(0, 101, 2)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000457 self.assertIn(0, r)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000458 self.assertNotIn(1, r)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000459 self.assertIn(2, r)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000460 self.assertNotIn(99, r)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000461 self.assertIn(100, r)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000462 self.assertNotIn(101, r)
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000463
464 r = range(0, -20, -1)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000465 self.assertIn(0, r)
466 self.assertIn(-1, r)
467 self.assertIn(-19, r)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000468 self.assertNotIn(-20, r)
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000469
470 r = range(0, -20, -2)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000471 self.assertIn(-18, r)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000472 self.assertNotIn(-19, r)
473 self.assertNotIn(-20, r)
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000474
475 def test_empty(self):
476 r = range(0)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000477 self.assertNotIn(0, r)
478 self.assertNotIn(1, r)
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000479
480 r = range(0, -10)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000481 self.assertNotIn(0, r)
482 self.assertNotIn(-1, r)
483 self.assertNotIn(1, r)
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000484
Mark Dickinsond550c9a2009-11-15 09:57:26 +0000485 def test_range_iterators(self):
486 # exercise 'fast' iterators, that use a rangeiterobject internally.
487 # see issue 7298
488 limits = [base + jiggle
489 for M in (2**32, 2**64)
490 for base in (-M, -M//2, 0, M//2, M)
491 for jiggle in (-2, -1, 0, 1, 2)]
492 test_ranges = [(start, end, step)
493 for start in limits
494 for end in limits
495 for step in (-2**63, -2**31, -2, -1, 1, 2)]
496
497 for start, end, step in test_ranges:
498 iter1 = range(start, end, step)
499 iter2 = pyrange(start, end, step)
500 test_id = "range({}, {}, {})".format(start, end, step)
501 # check first 100 entries
502 self.assert_iterators_equal(iter1, iter2, test_id, limit=100)
503
504 iter1 = reversed(range(start, end, step))
505 iter2 = pyrange_reversed(start, end, step)
506 test_id = "reversed(range({}, {}, {}))".format(start, end, step)
507 self.assert_iterators_equal(iter1, iter2, test_id, limit=100)
508
Serhiy Storchakadf533922016-10-08 22:01:18 +0300509 def test_range_iterators_invocation(self):
510 # verify range iterators instances cannot be created by
511 # calling their type
Serhiy Storchaka44759bc2016-10-08 21:43:11 +0300512 rangeiter_type = type(iter(range(0)))
Serhiy Storchakadf533922016-10-08 22:01:18 +0300513 self.assertRaises(TypeError, rangeiter_type, 1, 3, 1)
514 long_rangeiter_type = type(iter(range(1 << 1000)))
515 self.assertRaises(TypeError, long_rangeiter_type, 1, 3, 1)
Serhiy Storchaka44759bc2016-10-08 21:43:11 +0300516
Nick Coghlan37ee8502010-12-03 14:26:13 +0000517 def test_slice(self):
518 def check(start, stop, step=None):
519 i = slice(start, stop, step)
520 self.assertEqual(list(r[i]), list(r)[i])
521 self.assertEqual(len(r[i]), len(list(r)[i]))
522 for r in [range(10),
523 range(0),
524 range(1, 9, 3),
525 range(8, 0, -3),
526 range(sys.maxsize+1, sys.maxsize+10),
527 ]:
528 check(0, 2)
529 check(0, 20)
530 check(1, 2)
531 check(20, 30)
532 check(-30, -20)
533 check(-1, 100, 2)
534 check(0, -1)
535 check(-1, -3, -1)
536
537 def test_contains(self):
538 r = range(10)
539 self.assertIn(0, r)
540 self.assertIn(1, r)
541 self.assertIn(5.0, r)
542 self.assertNotIn(5.1, r)
543 self.assertNotIn(-1, r)
544 self.assertNotIn(10, r)
545 self.assertNotIn("", r)
546 r = range(9, -1, -1)
547 self.assertIn(0, r)
548 self.assertIn(1, r)
549 self.assertIn(5.0, r)
550 self.assertNotIn(5.1, r)
551 self.assertNotIn(-1, r)
552 self.assertNotIn(10, r)
553 self.assertNotIn("", r)
554 r = range(0, 10, 2)
555 self.assertIn(0, r)
556 self.assertNotIn(1, r)
557 self.assertNotIn(5.0, r)
558 self.assertNotIn(5.1, r)
559 self.assertNotIn(-1, r)
560 self.assertNotIn(10, r)
561 self.assertNotIn("", r)
562 r = range(9, -1, -2)
563 self.assertNotIn(0, r)
564 self.assertIn(1, r)
565 self.assertIn(5.0, r)
566 self.assertNotIn(5.1, r)
567 self.assertNotIn(-1, r)
568 self.assertNotIn(10, r)
569 self.assertNotIn("", r)
570
571 def test_reverse_iteration(self):
572 for r in [range(10),
573 range(0),
574 range(1, 9, 3),
575 range(8, 0, -3),
576 range(sys.maxsize+1, sys.maxsize+10),
577 ]:
578 self.assertEqual(list(reversed(r)), list(r)[::-1])
579
Ezio Melotti982ef4e2011-04-15 08:15:40 +0300580 def test_issue11845(self):
581 r = range(*slice(1, 18, 2).indices(20))
582 values = {None, 0, 1, -1, 2, -2, 5, -5, 19, -19,
583 20, -20, 21, -21, 30, -30, 99, -99}
584 for i in values:
585 for j in values:
586 for k in values - {0}:
587 r[i:j:k]
588
Mark Dickinson36645682011-10-23 19:53:01 +0100589 def test_comparison(self):
590 test_ranges = [range(0), range(0, -1), range(1, 1, 3),
591 range(1), range(5, 6), range(5, 6, 2),
592 range(5, 7, 2), range(2), range(0, 4, 2),
593 range(0, 5, 2), range(0, 6, 2)]
594 test_tuples = list(map(tuple, test_ranges))
595
596 # Check that equality of ranges matches equality of the corresponding
597 # tuples for each pair from the test lists above.
598 ranges_eq = [a == b for a in test_ranges for b in test_ranges]
599 tuples_eq = [a == b for a in test_tuples for b in test_tuples]
600 self.assertEqual(ranges_eq, tuples_eq)
601
602 # Check that != correctly gives the logical negation of ==
603 ranges_ne = [a != b for a in test_ranges for b in test_ranges]
604 self.assertEqual(ranges_ne, [not x for x in ranges_eq])
605
606 # Equal ranges should have equal hashes.
607 for a in test_ranges:
608 for b in test_ranges:
609 if a == b:
610 self.assertEqual(hash(a), hash(b))
611
612 # Ranges are unequal to other types (even sequence types)
613 self.assertIs(range(0) == (), False)
614 self.assertIs(() == range(0), False)
615 self.assertIs(range(2) == [0, 1], False)
616
617 # Huge integers aren't a problem.
618 self.assertEqual(range(0, 2**100 - 1, 2),
619 range(0, 2**100, 2))
620 self.assertEqual(hash(range(0, 2**100 - 1, 2)),
621 hash(range(0, 2**100, 2)))
622 self.assertNotEqual(range(0, 2**100, 2),
623 range(0, 2**100 + 1, 2))
624 self.assertEqual(range(2**200, 2**201 - 2**99, 2**100),
625 range(2**200, 2**201, 2**100))
626 self.assertEqual(hash(range(2**200, 2**201 - 2**99, 2**100)),
627 hash(range(2**200, 2**201, 2**100)))
628 self.assertNotEqual(range(2**200, 2**201, 2**100),
629 range(2**200, 2**201 + 1, 2**100))
630
631 # Order comparisons are not implemented for ranges.
632 with self.assertRaises(TypeError):
633 range(0) < range(0)
634 with self.assertRaises(TypeError):
635 range(0) > range(0)
636 with self.assertRaises(TypeError):
637 range(0) <= range(0)
638 with self.assertRaises(TypeError):
639 range(0) >= range(0)
640
Nick Coghlan37ee8502010-12-03 14:26:13 +0000641
Benjamin Peterson878ce382011-11-05 15:17:52 -0400642 def test_attributes(self):
643 # test the start, stop and step attributes of range objects
644 self.assert_attrs(range(0), 0, 0, 1)
645 self.assert_attrs(range(10), 0, 10, 1)
646 self.assert_attrs(range(-10), 0, -10, 1)
647 self.assert_attrs(range(0, 10, 1), 0, 10, 1)
648 self.assert_attrs(range(0, 10, 3), 0, 10, 3)
649 self.assert_attrs(range(10, 0, -1), 10, 0, -1)
650 self.assert_attrs(range(10, 0, -3), 10, 0, -3)
651
652 def assert_attrs(self, rangeobj, start, stop, step):
653 self.assertEqual(rangeobj.start, start)
654 self.assertEqual(rangeobj.stop, stop)
655 self.assertEqual(rangeobj.step, step)
656
657 with self.assertRaises(AttributeError):
658 rangeobj.start = 0
659 with self.assertRaises(AttributeError):
660 rangeobj.stop = 10
661 with self.assertRaises(AttributeError):
662 rangeobj.step = 1
663
664 with self.assertRaises(AttributeError):
665 del rangeobj.start
666 with self.assertRaises(AttributeError):
667 del rangeobj.stop
668 with self.assertRaises(AttributeError):
669 del rangeobj.step
670
Neal Norwitz1c0423a2004-07-08 01:59:55 +0000671if __name__ == "__main__":
Zachary Ware38c707e2015-04-13 15:00:43 -0500672 unittest.main()