blob: 897162b2b17457d4e7fd7b6892ef0b7467e315e1 [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):
Miss Islington (bot)cd986e92021-08-28 11:09:29 -0700377 testcases = [(13,), (0, 11), (-22, 10), (20, 3, -1), (13, 21, 3),
378 (-2, 2, 2), (2**31-3, 2**31-1), (2**33, 2**33+2),
379 (2**63-3, 2**63-1), (2**65, 2**65+2)]
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000380 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
381 for t in testcases:
Miss Islington (bot)cd986e92021-08-28 11:09:29 -0700382 with self.subTest(proto=proto, t=t):
383 it = itorg = iter(range(*t))
384 data = list(range(*t))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000385
Miss Islington (bot)cd986e92021-08-28 11:09:29 -0700386 d = pickle.dumps(it, proto)
387 it = pickle.loads(d)
388 self.assertEqual(type(itorg), type(it))
389 self.assertEqual(list(it), data)
390
391 it = pickle.loads(d)
392 try:
393 next(it)
394 except StopIteration:
395 continue
396 d = pickle.dumps(it, proto)
397 it = pickle.loads(d)
398 self.assertEqual(list(it), data[1:])
399
400 def test_iterator_pickling_overflowing_index(self):
401 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
402 with self.subTest(proto=proto):
403 it = iter(range(2**32 + 2))
404 _, _, idx = it.__reduce__()
405 self.assertEqual(idx, 0)
406 it.__setstate__(2**32 + 1) # undocumented way to set r->index
407 _, _, idx = it.__reduce__()
408 self.assertEqual(idx, 2**32 + 1)
Serhiy Storchakabad12572014-12-15 14:03:42 +0200409 d = pickle.dumps(it, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000410 it = pickle.loads(d)
Miss Islington (bot)cd986e92021-08-28 11:09:29 -0700411 self.assertEqual(next(it), 2**32 + 1)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000412
Kristján Valur Jónsson4ca688e2014-03-04 23:19:24 +0000413 def test_exhausted_iterator_pickling(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200414 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
415 r = range(2**65, 2**65+2)
416 i = iter(r)
417 while True:
418 r = next(i)
419 if r == 2**65+1:
420 break
421 d = pickle.dumps(i, proto)
422 i2 = pickle.loads(d)
423 self.assertEqual(list(i), [])
424 self.assertEqual(list(i2), [])
Kristján Valur Jónsson25dded02014-03-05 13:47:57 +0000425
426 def test_large_exhausted_iterator_pickling(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200427 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
428 r = range(20)
429 i = iter(r)
430 while True:
431 r = next(i)
432 if r == 19:
433 break
434 d = pickle.dumps(i, proto)
435 i2 = pickle.loads(d)
436 self.assertEqual(list(i), [])
437 self.assertEqual(list(i2), [])
Kristján Valur Jónsson4ca688e2014-03-04 23:19:24 +0000438
Raymond Hettinger94f55832009-06-12 18:40:16 +0000439 def test_odd_bug(self):
440 # This used to raise a "SystemError: NULL result without error"
441 # because the range validation step was eating the exception
442 # before NULL was returned.
443 with self.assertRaises(TypeError):
444 range([], 1, -1)
445
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000446 def test_types(self):
447 # Non-integer objects *equal* to any of the range's items are supposed
448 # to be contained in the range.
Benjamin Peterson577473f2010-01-19 00:09:57 +0000449 self.assertIn(1.0, range(3))
450 self.assertIn(True, range(3))
451 self.assertIn(1+0j, range(3))
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000452
Serhiy Storchaka7d44e7a2019-08-08 08:43:18 +0300453 self.assertIn(ALWAYS_EQ, range(3))
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000454
455 # Objects are never coerced into other types for comparison.
456 class C2:
457 def __int__(self): return 1
458 def __index__(self): return 1
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000459 self.assertNotIn(C2(), range(3))
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000460 # ..except if explicitly told so.
Benjamin Peterson577473f2010-01-19 00:09:57 +0000461 self.assertIn(int(C2()), range(3))
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000462
Mark Dickinson418f81d2009-09-24 20:04:23 +0000463 # Check that the range.__contains__ optimization is only
464 # used for ints, not for instances of subclasses of int.
465 class C3(int):
466 def __eq__(self, other): return True
Benjamin Peterson577473f2010-01-19 00:09:57 +0000467 self.assertIn(C3(11), range(10))
468 self.assertIn(C3(11), list(range(10)))
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000469
470 def test_strided_limits(self):
471 r = range(0, 101, 2)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000472 self.assertIn(0, r)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000473 self.assertNotIn(1, r)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000474 self.assertIn(2, r)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000475 self.assertNotIn(99, r)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000476 self.assertIn(100, r)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000477 self.assertNotIn(101, r)
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000478
479 r = range(0, -20, -1)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000480 self.assertIn(0, r)
481 self.assertIn(-1, r)
482 self.assertIn(-19, r)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000483 self.assertNotIn(-20, r)
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000484
485 r = range(0, -20, -2)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000486 self.assertIn(-18, r)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000487 self.assertNotIn(-19, r)
488 self.assertNotIn(-20, r)
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000489
490 def test_empty(self):
491 r = range(0)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000492 self.assertNotIn(0, r)
493 self.assertNotIn(1, r)
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000494
495 r = range(0, -10)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000496 self.assertNotIn(0, r)
497 self.assertNotIn(-1, r)
498 self.assertNotIn(1, r)
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000499
Mark Dickinsond550c9a2009-11-15 09:57:26 +0000500 def test_range_iterators(self):
501 # exercise 'fast' iterators, that use a rangeiterobject internally.
502 # see issue 7298
503 limits = [base + jiggle
504 for M in (2**32, 2**64)
505 for base in (-M, -M//2, 0, M//2, M)
506 for jiggle in (-2, -1, 0, 1, 2)]
507 test_ranges = [(start, end, step)
508 for start in limits
509 for end in limits
510 for step in (-2**63, -2**31, -2, -1, 1, 2)]
511
512 for start, end, step in test_ranges:
513 iter1 = range(start, end, step)
514 iter2 = pyrange(start, end, step)
515 test_id = "range({}, {}, {})".format(start, end, step)
516 # check first 100 entries
517 self.assert_iterators_equal(iter1, iter2, test_id, limit=100)
518
519 iter1 = reversed(range(start, end, step))
520 iter2 = pyrange_reversed(start, end, step)
521 test_id = "reversed(range({}, {}, {}))".format(start, end, step)
522 self.assert_iterators_equal(iter1, iter2, test_id, limit=100)
523
Serhiy Storchakadf533922016-10-08 22:01:18 +0300524 def test_range_iterators_invocation(self):
525 # verify range iterators instances cannot be created by
526 # calling their type
Serhiy Storchaka44759bc2016-10-08 21:43:11 +0300527 rangeiter_type = type(iter(range(0)))
Serhiy Storchakadf533922016-10-08 22:01:18 +0300528 self.assertRaises(TypeError, rangeiter_type, 1, 3, 1)
529 long_rangeiter_type = type(iter(range(1 << 1000)))
530 self.assertRaises(TypeError, long_rangeiter_type, 1, 3, 1)
Serhiy Storchaka44759bc2016-10-08 21:43:11 +0300531
Nick Coghlan37ee8502010-12-03 14:26:13 +0000532 def test_slice(self):
533 def check(start, stop, step=None):
534 i = slice(start, stop, step)
535 self.assertEqual(list(r[i]), list(r)[i])
536 self.assertEqual(len(r[i]), len(list(r)[i]))
537 for r in [range(10),
538 range(0),
539 range(1, 9, 3),
540 range(8, 0, -3),
541 range(sys.maxsize+1, sys.maxsize+10),
542 ]:
543 check(0, 2)
544 check(0, 20)
545 check(1, 2)
546 check(20, 30)
547 check(-30, -20)
548 check(-1, 100, 2)
549 check(0, -1)
550 check(-1, -3, -1)
551
552 def test_contains(self):
553 r = range(10)
554 self.assertIn(0, r)
555 self.assertIn(1, r)
556 self.assertIn(5.0, r)
557 self.assertNotIn(5.1, r)
558 self.assertNotIn(-1, r)
559 self.assertNotIn(10, r)
560 self.assertNotIn("", r)
561 r = range(9, -1, -1)
562 self.assertIn(0, r)
563 self.assertIn(1, r)
564 self.assertIn(5.0, r)
565 self.assertNotIn(5.1, r)
566 self.assertNotIn(-1, r)
567 self.assertNotIn(10, r)
568 self.assertNotIn("", r)
569 r = range(0, 10, 2)
570 self.assertIn(0, r)
571 self.assertNotIn(1, r)
572 self.assertNotIn(5.0, r)
573 self.assertNotIn(5.1, r)
574 self.assertNotIn(-1, r)
575 self.assertNotIn(10, r)
576 self.assertNotIn("", r)
577 r = range(9, -1, -2)
578 self.assertNotIn(0, r)
579 self.assertIn(1, r)
580 self.assertIn(5.0, r)
581 self.assertNotIn(5.1, r)
582 self.assertNotIn(-1, r)
583 self.assertNotIn(10, r)
584 self.assertNotIn("", r)
585
586 def test_reverse_iteration(self):
587 for r in [range(10),
588 range(0),
589 range(1, 9, 3),
590 range(8, 0, -3),
591 range(sys.maxsize+1, sys.maxsize+10),
592 ]:
593 self.assertEqual(list(reversed(r)), list(r)[::-1])
594
Ezio Melotti982ef4e2011-04-15 08:15:40 +0300595 def test_issue11845(self):
596 r = range(*slice(1, 18, 2).indices(20))
597 values = {None, 0, 1, -1, 2, -2, 5, -5, 19, -19,
598 20, -20, 21, -21, 30, -30, 99, -99}
599 for i in values:
600 for j in values:
601 for k in values - {0}:
602 r[i:j:k]
603
Mark Dickinson36645682011-10-23 19:53:01 +0100604 def test_comparison(self):
605 test_ranges = [range(0), range(0, -1), range(1, 1, 3),
606 range(1), range(5, 6), range(5, 6, 2),
607 range(5, 7, 2), range(2), range(0, 4, 2),
608 range(0, 5, 2), range(0, 6, 2)]
609 test_tuples = list(map(tuple, test_ranges))
610
611 # Check that equality of ranges matches equality of the corresponding
612 # tuples for each pair from the test lists above.
613 ranges_eq = [a == b for a in test_ranges for b in test_ranges]
614 tuples_eq = [a == b for a in test_tuples for b in test_tuples]
615 self.assertEqual(ranges_eq, tuples_eq)
616
617 # Check that != correctly gives the logical negation of ==
618 ranges_ne = [a != b for a in test_ranges for b in test_ranges]
619 self.assertEqual(ranges_ne, [not x for x in ranges_eq])
620
621 # Equal ranges should have equal hashes.
622 for a in test_ranges:
623 for b in test_ranges:
624 if a == b:
625 self.assertEqual(hash(a), hash(b))
626
627 # Ranges are unequal to other types (even sequence types)
628 self.assertIs(range(0) == (), False)
629 self.assertIs(() == range(0), False)
630 self.assertIs(range(2) == [0, 1], False)
631
632 # Huge integers aren't a problem.
633 self.assertEqual(range(0, 2**100 - 1, 2),
634 range(0, 2**100, 2))
635 self.assertEqual(hash(range(0, 2**100 - 1, 2)),
636 hash(range(0, 2**100, 2)))
637 self.assertNotEqual(range(0, 2**100, 2),
638 range(0, 2**100 + 1, 2))
639 self.assertEqual(range(2**200, 2**201 - 2**99, 2**100),
640 range(2**200, 2**201, 2**100))
641 self.assertEqual(hash(range(2**200, 2**201 - 2**99, 2**100)),
642 hash(range(2**200, 2**201, 2**100)))
643 self.assertNotEqual(range(2**200, 2**201, 2**100),
644 range(2**200, 2**201 + 1, 2**100))
645
646 # Order comparisons are not implemented for ranges.
647 with self.assertRaises(TypeError):
648 range(0) < range(0)
649 with self.assertRaises(TypeError):
650 range(0) > range(0)
651 with self.assertRaises(TypeError):
652 range(0) <= range(0)
653 with self.assertRaises(TypeError):
654 range(0) >= range(0)
655
Nick Coghlan37ee8502010-12-03 14:26:13 +0000656
Benjamin Peterson878ce382011-11-05 15:17:52 -0400657 def test_attributes(self):
658 # test the start, stop and step attributes of range objects
659 self.assert_attrs(range(0), 0, 0, 1)
660 self.assert_attrs(range(10), 0, 10, 1)
661 self.assert_attrs(range(-10), 0, -10, 1)
662 self.assert_attrs(range(0, 10, 1), 0, 10, 1)
663 self.assert_attrs(range(0, 10, 3), 0, 10, 3)
664 self.assert_attrs(range(10, 0, -1), 10, 0, -1)
665 self.assert_attrs(range(10, 0, -3), 10, 0, -3)
Serhiy Storchaka5f4b229d2020-05-28 10:33:45 +0300666 self.assert_attrs(range(True), 0, 1, 1)
667 self.assert_attrs(range(False, True), 0, 1, 1)
668 self.assert_attrs(range(False, True, True), 0, 1, 1)
Benjamin Peterson878ce382011-11-05 15:17:52 -0400669
670 def assert_attrs(self, rangeobj, start, stop, step):
671 self.assertEqual(rangeobj.start, start)
672 self.assertEqual(rangeobj.stop, stop)
673 self.assertEqual(rangeobj.step, step)
Serhiy Storchaka5f4b229d2020-05-28 10:33:45 +0300674 self.assertIs(type(rangeobj.start), int)
675 self.assertIs(type(rangeobj.stop), int)
676 self.assertIs(type(rangeobj.step), int)
Benjamin Peterson878ce382011-11-05 15:17:52 -0400677
678 with self.assertRaises(AttributeError):
679 rangeobj.start = 0
680 with self.assertRaises(AttributeError):
681 rangeobj.stop = 10
682 with self.assertRaises(AttributeError):
683 rangeobj.step = 1
684
685 with self.assertRaises(AttributeError):
686 del rangeobj.start
687 with self.assertRaises(AttributeError):
688 del rangeobj.stop
689 with self.assertRaises(AttributeError):
690 del rangeobj.step
691
Neal Norwitz1c0423a2004-07-08 01:59:55 +0000692if __name__ == "__main__":
Zachary Ware38c707e2015-04-13 15:00:43 -0500693 unittest.main()