blob: 73cbcc4717d7df986f2b4e650591099bfd98e22f [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
Benjamin Peterson8d16ab32010-11-20 23:01:55 +000094 def test_large_operands(self):
95 x = range(10**20, 10**20+10, 3)
96 self.assertEqual(len(x), 4)
97 self.assertEqual(len(list(x)), 4)
98
99 x = range(10**20+10, 10**20, 3)
100 self.assertEqual(len(x), 0)
101 self.assertEqual(len(list(x)), 0)
4kir4e46fb862017-03-20 09:44:46 +0300102 self.assertFalse(x)
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000103
104 x = range(10**20, 10**20+10, -3)
105 self.assertEqual(len(x), 0)
106 self.assertEqual(len(list(x)), 0)
4kir4e46fb862017-03-20 09:44:46 +0300107 self.assertFalse(x)
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000108
109 x = range(10**20+10, 10**20, -3)
110 self.assertEqual(len(x), 4)
111 self.assertEqual(len(list(x)), 4)
4kir4e46fb862017-03-20 09:44:46 +0300112 self.assertTrue(x)
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000113
114 # Now test range() with longs
4kir4e46fb862017-03-20 09:44:46 +0300115 for x in [range(-2**100),
116 range(0, -2**100),
117 range(0, 2**100, -1)]:
118 self.assertEqual(list(x), [])
119 self.assertFalse(x)
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000120
121 a = int(10 * sys.maxsize)
122 b = int(100 * sys.maxsize)
123 c = int(50 * sys.maxsize)
124
125 self.assertEqual(list(range(a, a+2)), [a, a+1])
126 self.assertEqual(list(range(a+2, a, -1)), [a+2, a+1])
127 self.assertEqual(list(range(a+4, a, -2)), [a+4, a+2])
128
129 seq = list(range(a, b, c))
130 self.assertIn(a, seq)
131 self.assertNotIn(b, seq)
132 self.assertEqual(len(seq), 2)
Nick Coghlane993b102011-01-12 03:15:52 +0000133 self.assertEqual(seq[0], a)
134 self.assertEqual(seq[-1], a+c)
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000135
136 seq = list(range(b, a, -c))
137 self.assertIn(b, seq)
138 self.assertNotIn(a, seq)
139 self.assertEqual(len(seq), 2)
Nick Coghlane993b102011-01-12 03:15:52 +0000140 self.assertEqual(seq[0], b)
141 self.assertEqual(seq[-1], b-c)
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000142
143 seq = list(range(-a, -b, -c))
144 self.assertIn(-a, seq)
145 self.assertNotIn(-b, seq)
146 self.assertEqual(len(seq), 2)
Nick Coghlane993b102011-01-12 03:15:52 +0000147 self.assertEqual(seq[0], -a)
148 self.assertEqual(seq[-1], -a-c)
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000149
Nick Coghlane993b102011-01-12 03:15:52 +0000150 def test_large_range(self):
151 # Check long ranges (len > sys.maxsize)
152 # len() is expected to fail due to limitations of the __len__ protocol
153 def _range_len(x):
154 try:
155 length = len(x)
156 except OverflowError:
157 step = x[1] - x[0]
158 length = 1 + ((x[-1] - x[0]) // step)
159 return length
4kir4e46fb862017-03-20 09:44:46 +0300160
Nick Coghlane993b102011-01-12 03:15:52 +0000161 a = -sys.maxsize
162 b = 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)
4kir4e46fb862017-03-20 09:44:46 +0300168 self.assertTrue(x)
Nick Coghlane993b102011-01-12 03:15:52 +0000169 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
179 a = 0
180 b = 2 * sys.maxsize
181 expected_len = b - a
182 x = range(a, b)
183 self.assertIn(a, x)
184 self.assertNotIn(b, x)
185 self.assertRaises(OverflowError, len, x)
4kir4e46fb862017-03-20 09:44:46 +0300186 self.assertTrue(x)
Nick Coghlane993b102011-01-12 03:15:52 +0000187 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)
191 self.assertEqual(x[idx:idx+1][0], a+idx)
192 with self.assertRaises(IndexError):
193 x[-expected_len-1]
194 with self.assertRaises(IndexError):
195 x[expected_len]
196
197 a = 0
198 b = sys.maxsize**10
199 c = 2*sys.maxsize
200 expected_len = 1 + (b - a) // c
201 x = range(a, b, c)
202 self.assertIn(a, x)
203 self.assertNotIn(b, x)
204 self.assertRaises(OverflowError, len, x)
4kir4e46fb862017-03-20 09:44:46 +0300205 self.assertTrue(x)
Nick Coghlane993b102011-01-12 03:15:52 +0000206 self.assertEqual(_range_len(x), expected_len)
207 self.assertEqual(x[0], a)
208 idx = sys.maxsize+1
209 self.assertEqual(x[idx], a+(idx*c))
210 self.assertEqual(x[idx:idx+1][0], a+(idx*c))
211 with self.assertRaises(IndexError):
212 x[-expected_len-1]
213 with self.assertRaises(IndexError):
214 x[expected_len]
215
216 a = sys.maxsize**10
217 b = 0
218 c = -2*sys.maxsize
219 expected_len = 1 + (b - a) // c
220 x = range(a, b, c)
221 self.assertIn(a, x)
222 self.assertNotIn(b, x)
223 self.assertRaises(OverflowError, len, x)
4kir4e46fb862017-03-20 09:44:46 +0300224 self.assertTrue(x)
Nick Coghlane993b102011-01-12 03:15:52 +0000225 self.assertEqual(_range_len(x), expected_len)
226 self.assertEqual(x[0], a)
227 idx = sys.maxsize+1
228 self.assertEqual(x[idx], a+(idx*c))
229 self.assertEqual(x[idx:idx+1][0], a+(idx*c))
230 with self.assertRaises(IndexError):
231 x[-expected_len-1]
232 with self.assertRaises(IndexError):
233 x[expected_len]
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000234
235 def test_invalid_invocation(self):
236 self.assertRaises(TypeError, range)
237 self.assertRaises(TypeError, range, 1, 2, 3, 4)
238 self.assertRaises(ValueError, range, 1, 2, 0)
Benjamin Petersond57bb552010-11-20 23:03:34 +0000239 a = int(10 * sys.maxsize)
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000240 self.assertRaises(ValueError, range, a, a + 1, int(0))
241 self.assertRaises(TypeError, range, 1., 1., 1.)
242 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
243 self.assertRaises(TypeError, range, 0, "spam")
244 self.assertRaises(TypeError, range, 0, 42, "spam")
245 # Exercise various combinations of bad arguments, to check
246 # refcounting logic
247 self.assertRaises(TypeError, range, 0.0)
248 self.assertRaises(TypeError, range, 0, 0.0)
249 self.assertRaises(TypeError, range, 0.0, 0)
250 self.assertRaises(TypeError, range, 0.0, 0.0)
251 self.assertRaises(TypeError, range, 0, 0, 1.0)
252 self.assertRaises(TypeError, range, 0, 0.0, 1)
253 self.assertRaises(TypeError, range, 0, 0.0, 1.0)
254 self.assertRaises(TypeError, range, 0.0, 0, 1)
255 self.assertRaises(TypeError, range, 0.0, 0, 1.0)
256 self.assertRaises(TypeError, range, 0.0, 0.0, 1)
257 self.assertRaises(TypeError, range, 0.0, 0.0, 1.0)
258
259 def test_index(self):
260 u = range(2)
261 self.assertEqual(u.index(0), 0)
262 self.assertEqual(u.index(1), 1)
263 self.assertRaises(ValueError, u.index, 2)
264
265 u = range(-2, 3)
266 self.assertEqual(u.count(0), 1)
267 self.assertEqual(u.index(0), 2)
268 self.assertRaises(TypeError, u.index)
269
270 class BadExc(Exception):
271 pass
272
273 class BadCmp:
274 def __eq__(self, other):
275 if other == 2:
276 raise BadExc()
277 return False
278
279 a = range(4)
280 self.assertRaises(BadExc, a.index, BadCmp())
281
282 a = range(-2, 3)
283 self.assertEqual(a.index(0), 2)
284 self.assertEqual(range(1, 10, 3).index(4), 1)
285 self.assertEqual(range(1, -10, -3).index(-5), 2)
286
287 self.assertEqual(range(10**20).index(1), 1)
288 self.assertEqual(range(10**20).index(10**20 - 1), 10**20 - 1)
289
290 self.assertRaises(ValueError, range(1, 2**100, 2).index, 2**87)
291 self.assertEqual(range(1, 2**100, 2).index(2**87+1), 2**86)
292
Serhiy Storchaka7d44e7a2019-08-08 08:43:18 +0300293 self.assertEqual(range(10).index(ALWAYS_EQ), 0)
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000294
295 def test_user_index_method(self):
296 bignum = 2*sys.maxsize
297 smallnum = 42
298
299 # User-defined class with an __index__ method
300 class I:
301 def __init__(self, n):
302 self.n = int(n)
303 def __index__(self):
304 return self.n
305 self.assertEqual(list(range(I(bignum), I(bignum + 1))), [bignum])
306 self.assertEqual(list(range(I(smallnum), I(smallnum + 1))), [smallnum])
307
308 # User-defined class with a failing __index__ method
309 class IX:
310 def __index__(self):
311 raise RuntimeError
312 self.assertRaises(RuntimeError, range, IX())
313
314 # User-defined class with an invalid __index__ method
315 class IN:
316 def __index__(self):
317 return "not a number"
318
319 self.assertRaises(TypeError, range, IN())
320
Mark Dickinson8cd1c762012-11-04 11:46:17 +0000321 # Test use of user-defined classes in slice indices.
Mark Dickinsonc992faf2012-11-04 11:47:47 +0000322 self.assertEqual(range(10)[:I(5)], range(5))
Mark Dickinson8cd1c762012-11-04 11:46:17 +0000323
324 with self.assertRaises(RuntimeError):
325 range(0, 10)[:IX()]
326
327 with self.assertRaises(TypeError):
328 range(0, 10)[:IN()]
329
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000330 def test_count(self):
331 self.assertEqual(range(3).count(-1), 0)
332 self.assertEqual(range(3).count(0), 1)
333 self.assertEqual(range(3).count(1), 1)
334 self.assertEqual(range(3).count(2), 1)
335 self.assertEqual(range(3).count(3), 0)
336 self.assertIs(type(range(3).count(-1)), int)
337 self.assertIs(type(range(3).count(1)), int)
338 self.assertEqual(range(10**20).count(1), 1)
339 self.assertEqual(range(10**20).count(10**20), 0)
340 self.assertEqual(range(3).index(1), 1)
341 self.assertEqual(range(1, 2**100, 2).count(2**87), 0)
342 self.assertEqual(range(1, 2**100, 2).count(2**87+1), 1)
343
Serhiy Storchaka7d44e7a2019-08-08 08:43:18 +0300344 self.assertEqual(range(10).count(ALWAYS_EQ), 10)
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000345
Nick Coghlan37ee8502010-12-03 14:26:13 +0000346 self.assertEqual(len(range(sys.maxsize, sys.maxsize+10)), 10)
347
Walter Dörwald67d99932007-05-20 08:22:37 +0000348 def test_repr(self):
Walter Dörwald03b43d82007-05-21 10:43:34 +0000349 self.assertEqual(repr(range(1)), 'range(0, 1)')
Walter Dörwald67d99932007-05-20 08:22:37 +0000350 self.assertEqual(repr(range(1, 2)), 'range(1, 2)')
351 self.assertEqual(repr(range(1, 2, 3)), 'range(1, 2, 3)')
352
Alexandre Vassalotti75056072008-06-10 04:03:04 +0000353 def test_pickling(self):
354 testcases = [(13,), (0, 11), (-22, 10), (20, 3, -1),
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000355 (13, 21, 3), (-2, 2, 2), (2**65, 2**65+2)]
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +0000356 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Alexandre Vassalotti75056072008-06-10 04:03:04 +0000357 for t in testcases:
Antoine Pitrou8f2ee6e2013-11-23 21:05:08 +0100358 with self.subTest(proto=proto, test=t):
359 r = range(*t)
360 self.assertEqual(list(pickle.loads(pickle.dumps(r, proto))),
361 list(r))
Alexandre Vassalotti75056072008-06-10 04:03:04 +0000362
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000363 def test_iterator_pickling(self):
364 testcases = [(13,), (0, 11), (-22, 10), (20, 3, -1),
365 (13, 21, 3), (-2, 2, 2), (2**65, 2**65+2)]
366 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
367 for t in testcases:
368 it = itorg = iter(range(*t))
369 data = list(range(*t))
370
Serhiy Storchakabad12572014-12-15 14:03:42 +0200371 d = pickle.dumps(it, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000372 it = pickle.loads(d)
373 self.assertEqual(type(itorg), type(it))
374 self.assertEqual(list(it), data)
375
376 it = pickle.loads(d)
377 try:
378 next(it)
379 except StopIteration:
380 continue
Serhiy Storchakabad12572014-12-15 14:03:42 +0200381 d = pickle.dumps(it, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000382 it = pickle.loads(d)
383 self.assertEqual(list(it), data[1:])
384
Kristján Valur Jónsson4ca688e2014-03-04 23:19:24 +0000385 def test_exhausted_iterator_pickling(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200386 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
387 r = range(2**65, 2**65+2)
388 i = iter(r)
389 while True:
390 r = next(i)
391 if r == 2**65+1:
392 break
393 d = pickle.dumps(i, proto)
394 i2 = pickle.loads(d)
395 self.assertEqual(list(i), [])
396 self.assertEqual(list(i2), [])
Kristján Valur Jónsson25dded02014-03-05 13:47:57 +0000397
398 def test_large_exhausted_iterator_pickling(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200399 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
400 r = range(20)
401 i = iter(r)
402 while True:
403 r = next(i)
404 if r == 19:
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ónsson4ca688e2014-03-04 23:19:24 +0000410
Raymond Hettinger94f55832009-06-12 18:40:16 +0000411 def test_odd_bug(self):
412 # This used to raise a "SystemError: NULL result without error"
413 # because the range validation step was eating the exception
414 # before NULL was returned.
415 with self.assertRaises(TypeError):
416 range([], 1, -1)
417
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000418 def test_types(self):
419 # Non-integer objects *equal* to any of the range's items are supposed
420 # to be contained in the range.
Benjamin Peterson577473f2010-01-19 00:09:57 +0000421 self.assertIn(1.0, range(3))
422 self.assertIn(True, range(3))
423 self.assertIn(1+0j, range(3))
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000424
Serhiy Storchaka7d44e7a2019-08-08 08:43:18 +0300425 self.assertIn(ALWAYS_EQ, range(3))
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000426
427 # Objects are never coerced into other types for comparison.
428 class C2:
429 def __int__(self): return 1
430 def __index__(self): return 1
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000431 self.assertNotIn(C2(), range(3))
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000432 # ..except if explicitly told so.
Benjamin Peterson577473f2010-01-19 00:09:57 +0000433 self.assertIn(int(C2()), range(3))
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000434
Mark Dickinson418f81d2009-09-24 20:04:23 +0000435 # Check that the range.__contains__ optimization is only
436 # used for ints, not for instances of subclasses of int.
437 class C3(int):
438 def __eq__(self, other): return True
Benjamin Peterson577473f2010-01-19 00:09:57 +0000439 self.assertIn(C3(11), range(10))
440 self.assertIn(C3(11), list(range(10)))
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000441
442 def test_strided_limits(self):
443 r = range(0, 101, 2)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000444 self.assertIn(0, r)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000445 self.assertNotIn(1, r)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000446 self.assertIn(2, r)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000447 self.assertNotIn(99, r)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000448 self.assertIn(100, r)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000449 self.assertNotIn(101, r)
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000450
451 r = range(0, -20, -1)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000452 self.assertIn(0, r)
453 self.assertIn(-1, r)
454 self.assertIn(-19, r)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000455 self.assertNotIn(-20, r)
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000456
457 r = range(0, -20, -2)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000458 self.assertIn(-18, r)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000459 self.assertNotIn(-19, r)
460 self.assertNotIn(-20, r)
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000461
462 def test_empty(self):
463 r = range(0)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000464 self.assertNotIn(0, r)
465 self.assertNotIn(1, r)
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000466
467 r = range(0, -10)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000468 self.assertNotIn(0, r)
469 self.assertNotIn(-1, r)
470 self.assertNotIn(1, r)
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000471
Mark Dickinsond550c9a2009-11-15 09:57:26 +0000472 def test_range_iterators(self):
473 # exercise 'fast' iterators, that use a rangeiterobject internally.
474 # see issue 7298
475 limits = [base + jiggle
476 for M in (2**32, 2**64)
477 for base in (-M, -M//2, 0, M//2, M)
478 for jiggle in (-2, -1, 0, 1, 2)]
479 test_ranges = [(start, end, step)
480 for start in limits
481 for end in limits
482 for step in (-2**63, -2**31, -2, -1, 1, 2)]
483
484 for start, end, step in test_ranges:
485 iter1 = range(start, end, step)
486 iter2 = pyrange(start, end, step)
487 test_id = "range({}, {}, {})".format(start, end, step)
488 # check first 100 entries
489 self.assert_iterators_equal(iter1, iter2, test_id, limit=100)
490
491 iter1 = reversed(range(start, end, step))
492 iter2 = pyrange_reversed(start, end, step)
493 test_id = "reversed(range({}, {}, {}))".format(start, end, step)
494 self.assert_iterators_equal(iter1, iter2, test_id, limit=100)
495
Serhiy Storchakadf533922016-10-08 22:01:18 +0300496 def test_range_iterators_invocation(self):
497 # verify range iterators instances cannot be created by
498 # calling their type
Serhiy Storchaka44759bc2016-10-08 21:43:11 +0300499 rangeiter_type = type(iter(range(0)))
Serhiy Storchakadf533922016-10-08 22:01:18 +0300500 self.assertRaises(TypeError, rangeiter_type, 1, 3, 1)
501 long_rangeiter_type = type(iter(range(1 << 1000)))
502 self.assertRaises(TypeError, long_rangeiter_type, 1, 3, 1)
Serhiy Storchaka44759bc2016-10-08 21:43:11 +0300503
Nick Coghlan37ee8502010-12-03 14:26:13 +0000504 def test_slice(self):
505 def check(start, stop, step=None):
506 i = slice(start, stop, step)
507 self.assertEqual(list(r[i]), list(r)[i])
508 self.assertEqual(len(r[i]), len(list(r)[i]))
509 for r in [range(10),
510 range(0),
511 range(1, 9, 3),
512 range(8, 0, -3),
513 range(sys.maxsize+1, sys.maxsize+10),
514 ]:
515 check(0, 2)
516 check(0, 20)
517 check(1, 2)
518 check(20, 30)
519 check(-30, -20)
520 check(-1, 100, 2)
521 check(0, -1)
522 check(-1, -3, -1)
523
524 def test_contains(self):
525 r = range(10)
526 self.assertIn(0, r)
527 self.assertIn(1, r)
528 self.assertIn(5.0, r)
529 self.assertNotIn(5.1, r)
530 self.assertNotIn(-1, r)
531 self.assertNotIn(10, r)
532 self.assertNotIn("", r)
533 r = range(9, -1, -1)
534 self.assertIn(0, r)
535 self.assertIn(1, r)
536 self.assertIn(5.0, r)
537 self.assertNotIn(5.1, r)
538 self.assertNotIn(-1, r)
539 self.assertNotIn(10, r)
540 self.assertNotIn("", r)
541 r = range(0, 10, 2)
542 self.assertIn(0, r)
543 self.assertNotIn(1, r)
544 self.assertNotIn(5.0, r)
545 self.assertNotIn(5.1, r)
546 self.assertNotIn(-1, r)
547 self.assertNotIn(10, r)
548 self.assertNotIn("", r)
549 r = range(9, -1, -2)
550 self.assertNotIn(0, r)
551 self.assertIn(1, r)
552 self.assertIn(5.0, r)
553 self.assertNotIn(5.1, r)
554 self.assertNotIn(-1, r)
555 self.assertNotIn(10, r)
556 self.assertNotIn("", r)
557
558 def test_reverse_iteration(self):
559 for r in [range(10),
560 range(0),
561 range(1, 9, 3),
562 range(8, 0, -3),
563 range(sys.maxsize+1, sys.maxsize+10),
564 ]:
565 self.assertEqual(list(reversed(r)), list(r)[::-1])
566
Ezio Melotti982ef4e2011-04-15 08:15:40 +0300567 def test_issue11845(self):
568 r = range(*slice(1, 18, 2).indices(20))
569 values = {None, 0, 1, -1, 2, -2, 5, -5, 19, -19,
570 20, -20, 21, -21, 30, -30, 99, -99}
571 for i in values:
572 for j in values:
573 for k in values - {0}:
574 r[i:j:k]
575
Mark Dickinson36645682011-10-23 19:53:01 +0100576 def test_comparison(self):
577 test_ranges = [range(0), range(0, -1), range(1, 1, 3),
578 range(1), range(5, 6), range(5, 6, 2),
579 range(5, 7, 2), range(2), range(0, 4, 2),
580 range(0, 5, 2), range(0, 6, 2)]
581 test_tuples = list(map(tuple, test_ranges))
582
583 # Check that equality of ranges matches equality of the corresponding
584 # tuples for each pair from the test lists above.
585 ranges_eq = [a == b for a in test_ranges for b in test_ranges]
586 tuples_eq = [a == b for a in test_tuples for b in test_tuples]
587 self.assertEqual(ranges_eq, tuples_eq)
588
589 # Check that != correctly gives the logical negation of ==
590 ranges_ne = [a != b for a in test_ranges for b in test_ranges]
591 self.assertEqual(ranges_ne, [not x for x in ranges_eq])
592
593 # Equal ranges should have equal hashes.
594 for a in test_ranges:
595 for b in test_ranges:
596 if a == b:
597 self.assertEqual(hash(a), hash(b))
598
599 # Ranges are unequal to other types (even sequence types)
600 self.assertIs(range(0) == (), False)
601 self.assertIs(() == range(0), False)
602 self.assertIs(range(2) == [0, 1], False)
603
604 # Huge integers aren't a problem.
605 self.assertEqual(range(0, 2**100 - 1, 2),
606 range(0, 2**100, 2))
607 self.assertEqual(hash(range(0, 2**100 - 1, 2)),
608 hash(range(0, 2**100, 2)))
609 self.assertNotEqual(range(0, 2**100, 2),
610 range(0, 2**100 + 1, 2))
611 self.assertEqual(range(2**200, 2**201 - 2**99, 2**100),
612 range(2**200, 2**201, 2**100))
613 self.assertEqual(hash(range(2**200, 2**201 - 2**99, 2**100)),
614 hash(range(2**200, 2**201, 2**100)))
615 self.assertNotEqual(range(2**200, 2**201, 2**100),
616 range(2**200, 2**201 + 1, 2**100))
617
618 # Order comparisons are not implemented for ranges.
619 with self.assertRaises(TypeError):
620 range(0) < range(0)
621 with self.assertRaises(TypeError):
622 range(0) > range(0)
623 with self.assertRaises(TypeError):
624 range(0) <= range(0)
625 with self.assertRaises(TypeError):
626 range(0) >= range(0)
627
Nick Coghlan37ee8502010-12-03 14:26:13 +0000628
Benjamin Peterson878ce382011-11-05 15:17:52 -0400629 def test_attributes(self):
630 # test the start, stop and step attributes of range objects
631 self.assert_attrs(range(0), 0, 0, 1)
632 self.assert_attrs(range(10), 0, 10, 1)
633 self.assert_attrs(range(-10), 0, -10, 1)
634 self.assert_attrs(range(0, 10, 1), 0, 10, 1)
635 self.assert_attrs(range(0, 10, 3), 0, 10, 3)
636 self.assert_attrs(range(10, 0, -1), 10, 0, -1)
637 self.assert_attrs(range(10, 0, -3), 10, 0, -3)
638
639 def assert_attrs(self, rangeobj, start, stop, step):
640 self.assertEqual(rangeobj.start, start)
641 self.assertEqual(rangeobj.stop, stop)
642 self.assertEqual(rangeobj.step, step)
643
644 with self.assertRaises(AttributeError):
645 rangeobj.start = 0
646 with self.assertRaises(AttributeError):
647 rangeobj.stop = 10
648 with self.assertRaises(AttributeError):
649 rangeobj.step = 1
650
651 with self.assertRaises(AttributeError):
652 del rangeobj.start
653 with self.assertRaises(AttributeError):
654 del rangeobj.stop
655 with self.assertRaises(AttributeError):
656 del rangeobj.step
657
Neal Norwitz1c0423a2004-07-08 01:59:55 +0000658if __name__ == "__main__":
Zachary Ware38c707e2015-04-13 15:00:43 -0500659 unittest.main()