blob: 679759ec6d676a5083cd7950fd120ce295be16ff [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 Storchaka639098c2016-10-08 21:45:07 +03007import test.support
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:
43 self.fail('{}: wrong element at position {};'
44 '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)
Serhiy Storchaka6fad4092017-03-20 09:13:47 +0200102 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)
Serhiy Storchaka6fad4092017-03-20 09:13:47 +0200107 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)
Serhiy Storchaka6fad4092017-03-20 09:13:47 +0200112 self.assertTrue(x)
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000113
114 # Now test range() with longs
Serhiy Storchaka6fad4092017-03-20 09:13:47 +0200115 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
Serhiy Storchaka6fad4092017-03-20 09:13:47 +0200160
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)
Serhiy Storchaka6fad4092017-03-20 09:13:47 +0200168 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)
Serhiy Storchaka6fad4092017-03-20 09:13:47 +0200186 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)
Serhiy Storchaka6fad4092017-03-20 09:13:47 +0200205 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)
Serhiy Storchaka6fad4092017-03-20 09:13:47 +0200224 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
293 class AlwaysEqual(object):
294 def __eq__(self, other):
295 return True
296 always_equal = AlwaysEqual()
Benjamin Petersond57bb552010-11-20 23:03:34 +0000297 self.assertEqual(range(10).index(always_equal), 0)
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000298
299 def test_user_index_method(self):
300 bignum = 2*sys.maxsize
301 smallnum = 42
302
303 # User-defined class with an __index__ method
304 class I:
305 def __init__(self, n):
306 self.n = int(n)
307 def __index__(self):
308 return self.n
309 self.assertEqual(list(range(I(bignum), I(bignum + 1))), [bignum])
310 self.assertEqual(list(range(I(smallnum), I(smallnum + 1))), [smallnum])
311
312 # User-defined class with a failing __index__ method
313 class IX:
314 def __index__(self):
315 raise RuntimeError
316 self.assertRaises(RuntimeError, range, IX())
317
318 # User-defined class with an invalid __index__ method
319 class IN:
320 def __index__(self):
321 return "not a number"
322
323 self.assertRaises(TypeError, range, IN())
324
Mark Dickinson8cd1c762012-11-04 11:46:17 +0000325 # Test use of user-defined classes in slice indices.
Mark Dickinsonc992faf2012-11-04 11:47:47 +0000326 self.assertEqual(range(10)[:I(5)], range(5))
Mark Dickinson8cd1c762012-11-04 11:46:17 +0000327
328 with self.assertRaises(RuntimeError):
329 range(0, 10)[:IX()]
330
331 with self.assertRaises(TypeError):
332 range(0, 10)[:IN()]
333
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000334 def test_count(self):
335 self.assertEqual(range(3).count(-1), 0)
336 self.assertEqual(range(3).count(0), 1)
337 self.assertEqual(range(3).count(1), 1)
338 self.assertEqual(range(3).count(2), 1)
339 self.assertEqual(range(3).count(3), 0)
340 self.assertIs(type(range(3).count(-1)), int)
341 self.assertIs(type(range(3).count(1)), int)
342 self.assertEqual(range(10**20).count(1), 1)
343 self.assertEqual(range(10**20).count(10**20), 0)
344 self.assertEqual(range(3).index(1), 1)
345 self.assertEqual(range(1, 2**100, 2).count(2**87), 0)
346 self.assertEqual(range(1, 2**100, 2).count(2**87+1), 1)
347
348 class AlwaysEqual(object):
349 def __eq__(self, other):
350 return True
351 always_equal = AlwaysEqual()
352 self.assertEqual(range(10).count(always_equal), 10)
353
Nick Coghlan37ee8502010-12-03 14:26:13 +0000354 self.assertEqual(len(range(sys.maxsize, sys.maxsize+10)), 10)
355
Walter Dörwald67d99932007-05-20 08:22:37 +0000356 def test_repr(self):
Walter Dörwald03b43d82007-05-21 10:43:34 +0000357 self.assertEqual(repr(range(1)), 'range(0, 1)')
Walter Dörwald67d99932007-05-20 08:22:37 +0000358 self.assertEqual(repr(range(1, 2)), 'range(1, 2)')
359 self.assertEqual(repr(range(1, 2, 3)), 'range(1, 2, 3)')
360
Alexandre Vassalotti75056072008-06-10 04:03:04 +0000361 def test_pickling(self):
362 testcases = [(13,), (0, 11), (-22, 10), (20, 3, -1),
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000363 (13, 21, 3), (-2, 2, 2), (2**65, 2**65+2)]
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +0000364 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Alexandre Vassalotti75056072008-06-10 04:03:04 +0000365 for t in testcases:
Antoine Pitrou8f2ee6e2013-11-23 21:05:08 +0100366 with self.subTest(proto=proto, test=t):
367 r = range(*t)
368 self.assertEqual(list(pickle.loads(pickle.dumps(r, proto))),
369 list(r))
Alexandre Vassalotti75056072008-06-10 04:03:04 +0000370
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000371 def test_iterator_pickling(self):
372 testcases = [(13,), (0, 11), (-22, 10), (20, 3, -1),
373 (13, 21, 3), (-2, 2, 2), (2**65, 2**65+2)]
374 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
375 for t in testcases:
376 it = itorg = iter(range(*t))
377 data = list(range(*t))
378
Serhiy Storchakabad12572014-12-15 14:03:42 +0200379 d = pickle.dumps(it, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000380 it = pickle.loads(d)
381 self.assertEqual(type(itorg), type(it))
382 self.assertEqual(list(it), data)
383
384 it = pickle.loads(d)
385 try:
386 next(it)
387 except StopIteration:
388 continue
Serhiy Storchakabad12572014-12-15 14:03:42 +0200389 d = pickle.dumps(it, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000390 it = pickle.loads(d)
391 self.assertEqual(list(it), data[1:])
392
Kristján Valur Jónsson4ca688e2014-03-04 23:19:24 +0000393 def test_exhausted_iterator_pickling(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200394 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
395 r = range(2**65, 2**65+2)
396 i = iter(r)
397 while True:
398 r = next(i)
399 if r == 2**65+1:
400 break
401 d = pickle.dumps(i, proto)
402 i2 = pickle.loads(d)
403 self.assertEqual(list(i), [])
404 self.assertEqual(list(i2), [])
Kristján Valur Jónsson25dded02014-03-05 13:47:57 +0000405
406 def test_large_exhausted_iterator_pickling(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200407 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
408 r = range(20)
409 i = iter(r)
410 while True:
411 r = next(i)
412 if r == 19:
413 break
414 d = pickle.dumps(i, proto)
415 i2 = pickle.loads(d)
416 self.assertEqual(list(i), [])
417 self.assertEqual(list(i2), [])
Kristján Valur Jónsson4ca688e2014-03-04 23:19:24 +0000418
Raymond Hettinger94f55832009-06-12 18:40:16 +0000419 def test_odd_bug(self):
420 # This used to raise a "SystemError: NULL result without error"
421 # because the range validation step was eating the exception
422 # before NULL was returned.
423 with self.assertRaises(TypeError):
424 range([], 1, -1)
425
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000426 def test_types(self):
427 # Non-integer objects *equal* to any of the range's items are supposed
428 # to be contained in the range.
Benjamin Peterson577473f2010-01-19 00:09:57 +0000429 self.assertIn(1.0, range(3))
430 self.assertIn(True, range(3))
431 self.assertIn(1+0j, range(3))
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000432
433 class C1:
434 def __eq__(self, other): return True
Benjamin Peterson577473f2010-01-19 00:09:57 +0000435 self.assertIn(C1(), range(3))
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000436
437 # Objects are never coerced into other types for comparison.
438 class C2:
439 def __int__(self): return 1
440 def __index__(self): return 1
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000441 self.assertNotIn(C2(), range(3))
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000442 # ..except if explicitly told so.
Benjamin Peterson577473f2010-01-19 00:09:57 +0000443 self.assertIn(int(C2()), range(3))
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000444
Mark Dickinson418f81d2009-09-24 20:04:23 +0000445 # Check that the range.__contains__ optimization is only
446 # used for ints, not for instances of subclasses of int.
447 class C3(int):
448 def __eq__(self, other): return True
Benjamin Peterson577473f2010-01-19 00:09:57 +0000449 self.assertIn(C3(11), range(10))
450 self.assertIn(C3(11), list(range(10)))
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000451
452 def test_strided_limits(self):
453 r = range(0, 101, 2)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000454 self.assertIn(0, r)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000455 self.assertNotIn(1, r)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000456 self.assertIn(2, r)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000457 self.assertNotIn(99, r)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000458 self.assertIn(100, r)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000459 self.assertNotIn(101, r)
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000460
461 r = range(0, -20, -1)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000462 self.assertIn(0, r)
463 self.assertIn(-1, r)
464 self.assertIn(-19, r)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000465 self.assertNotIn(-20, r)
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000466
467 r = range(0, -20, -2)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000468 self.assertIn(-18, r)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000469 self.assertNotIn(-19, r)
470 self.assertNotIn(-20, r)
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000471
472 def test_empty(self):
473 r = range(0)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000474 self.assertNotIn(0, r)
475 self.assertNotIn(1, r)
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000476
477 r = range(0, -10)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000478 self.assertNotIn(0, r)
479 self.assertNotIn(-1, r)
480 self.assertNotIn(1, r)
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000481
Mark Dickinsond550c9a2009-11-15 09:57:26 +0000482 def test_range_iterators(self):
483 # exercise 'fast' iterators, that use a rangeiterobject internally.
484 # see issue 7298
485 limits = [base + jiggle
486 for M in (2**32, 2**64)
487 for base in (-M, -M//2, 0, M//2, M)
488 for jiggle in (-2, -1, 0, 1, 2)]
489 test_ranges = [(start, end, step)
490 for start in limits
491 for end in limits
492 for step in (-2**63, -2**31, -2, -1, 1, 2)]
493
494 for start, end, step in test_ranges:
495 iter1 = range(start, end, step)
496 iter2 = pyrange(start, end, step)
497 test_id = "range({}, {}, {})".format(start, end, step)
498 # check first 100 entries
499 self.assert_iterators_equal(iter1, iter2, test_id, limit=100)
500
501 iter1 = reversed(range(start, end, step))
502 iter2 = pyrange_reversed(start, end, step)
503 test_id = "reversed(range({}, {}, {}))".format(start, end, step)
504 self.assert_iterators_equal(iter1, iter2, test_id, limit=100)
505
Serhiy Storchaka44759bc2016-10-08 21:43:11 +0300506 @test.support.cpython_only
507 def test_range_iterator_invocation(self):
508 import _testcapi
509 rangeiter_type = type(iter(range(0)))
510
Serhiy Storchakac7f490c2016-10-08 21:50:45 +0300511 self.assertWarns(DeprecationWarning, rangeiter_type, 1, 3, 1)
Serhiy Storchaka44759bc2016-10-08 21:43:11 +0300512
Serhiy Storchakac7f490c2016-10-08 21:50:45 +0300513 with test.support.check_warnings(('', DeprecationWarning)):
514 # rangeiter_new doesn't take keyword arguments
515 with self.assertRaises(TypeError):
516 rangeiter_type(a=1)
Serhiy Storchaka44759bc2016-10-08 21:43:11 +0300517
Serhiy Storchakac7f490c2016-10-08 21:50:45 +0300518 # rangeiter_new takes exactly 3 arguments
519 self.assertRaises(TypeError, rangeiter_type)
520 self.assertRaises(TypeError, rangeiter_type, 1)
521 self.assertRaises(TypeError, rangeiter_type, 1, 1)
522 self.assertRaises(TypeError, rangeiter_type, 1, 1, 1, 1)
Serhiy Storchaka44759bc2016-10-08 21:43:11 +0300523
Serhiy Storchakac7f490c2016-10-08 21:50:45 +0300524 # start, stop and stop must fit in C long
525 for good_val in [_testcapi.LONG_MAX, _testcapi.LONG_MIN]:
526 rangeiter_type(good_val, good_val, good_val)
527 for bad_val in [_testcapi.LONG_MAX + 1, _testcapi.LONG_MIN - 1]:
528 self.assertRaises(OverflowError,
529 rangeiter_type, bad_val, 1, 1)
530 self.assertRaises(OverflowError,
531 rangeiter_type, 1, bad_val, 1)
532 self.assertRaises(OverflowError,
533 rangeiter_type, 1, 1, bad_val)
534
535 # step mustn't be zero
536 self.assertRaises(ValueError, rangeiter_type, 1, 1, 0)
Serhiy Storchaka44759bc2016-10-08 21:43:11 +0300537
Nick Coghlan37ee8502010-12-03 14:26:13 +0000538 def test_slice(self):
539 def check(start, stop, step=None):
540 i = slice(start, stop, step)
541 self.assertEqual(list(r[i]), list(r)[i])
542 self.assertEqual(len(r[i]), len(list(r)[i]))
543 for r in [range(10),
544 range(0),
545 range(1, 9, 3),
546 range(8, 0, -3),
547 range(sys.maxsize+1, sys.maxsize+10),
548 ]:
549 check(0, 2)
550 check(0, 20)
551 check(1, 2)
552 check(20, 30)
553 check(-30, -20)
554 check(-1, 100, 2)
555 check(0, -1)
556 check(-1, -3, -1)
557
558 def test_contains(self):
559 r = range(10)
560 self.assertIn(0, r)
561 self.assertIn(1, r)
562 self.assertIn(5.0, r)
563 self.assertNotIn(5.1, r)
564 self.assertNotIn(-1, r)
565 self.assertNotIn(10, r)
566 self.assertNotIn("", r)
567 r = range(9, -1, -1)
568 self.assertIn(0, r)
569 self.assertIn(1, r)
570 self.assertIn(5.0, r)
571 self.assertNotIn(5.1, r)
572 self.assertNotIn(-1, r)
573 self.assertNotIn(10, r)
574 self.assertNotIn("", r)
575 r = range(0, 10, 2)
576 self.assertIn(0, r)
577 self.assertNotIn(1, r)
578 self.assertNotIn(5.0, r)
579 self.assertNotIn(5.1, r)
580 self.assertNotIn(-1, r)
581 self.assertNotIn(10, r)
582 self.assertNotIn("", r)
583 r = range(9, -1, -2)
584 self.assertNotIn(0, r)
585 self.assertIn(1, r)
586 self.assertIn(5.0, r)
587 self.assertNotIn(5.1, r)
588 self.assertNotIn(-1, r)
589 self.assertNotIn(10, r)
590 self.assertNotIn("", r)
591
592 def test_reverse_iteration(self):
593 for r in [range(10),
594 range(0),
595 range(1, 9, 3),
596 range(8, 0, -3),
597 range(sys.maxsize+1, sys.maxsize+10),
598 ]:
599 self.assertEqual(list(reversed(r)), list(r)[::-1])
600
Ezio Melotti982ef4e2011-04-15 08:15:40 +0300601 def test_issue11845(self):
602 r = range(*slice(1, 18, 2).indices(20))
603 values = {None, 0, 1, -1, 2, -2, 5, -5, 19, -19,
604 20, -20, 21, -21, 30, -30, 99, -99}
605 for i in values:
606 for j in values:
607 for k in values - {0}:
608 r[i:j:k]
609
Mark Dickinson36645682011-10-23 19:53:01 +0100610 def test_comparison(self):
611 test_ranges = [range(0), range(0, -1), range(1, 1, 3),
612 range(1), range(5, 6), range(5, 6, 2),
613 range(5, 7, 2), range(2), range(0, 4, 2),
614 range(0, 5, 2), range(0, 6, 2)]
615 test_tuples = list(map(tuple, test_ranges))
616
617 # Check that equality of ranges matches equality of the corresponding
618 # tuples for each pair from the test lists above.
619 ranges_eq = [a == b for a in test_ranges for b in test_ranges]
620 tuples_eq = [a == b for a in test_tuples for b in test_tuples]
621 self.assertEqual(ranges_eq, tuples_eq)
622
623 # Check that != correctly gives the logical negation of ==
624 ranges_ne = [a != b for a in test_ranges for b in test_ranges]
625 self.assertEqual(ranges_ne, [not x for x in ranges_eq])
626
627 # Equal ranges should have equal hashes.
628 for a in test_ranges:
629 for b in test_ranges:
630 if a == b:
631 self.assertEqual(hash(a), hash(b))
632
633 # Ranges are unequal to other types (even sequence types)
634 self.assertIs(range(0) == (), False)
635 self.assertIs(() == range(0), False)
636 self.assertIs(range(2) == [0, 1], False)
637
638 # Huge integers aren't a problem.
639 self.assertEqual(range(0, 2**100 - 1, 2),
640 range(0, 2**100, 2))
641 self.assertEqual(hash(range(0, 2**100 - 1, 2)),
642 hash(range(0, 2**100, 2)))
643 self.assertNotEqual(range(0, 2**100, 2),
644 range(0, 2**100 + 1, 2))
645 self.assertEqual(range(2**200, 2**201 - 2**99, 2**100),
646 range(2**200, 2**201, 2**100))
647 self.assertEqual(hash(range(2**200, 2**201 - 2**99, 2**100)),
648 hash(range(2**200, 2**201, 2**100)))
649 self.assertNotEqual(range(2**200, 2**201, 2**100),
650 range(2**200, 2**201 + 1, 2**100))
651
652 # Order comparisons are not implemented for ranges.
653 with self.assertRaises(TypeError):
654 range(0) < range(0)
655 with self.assertRaises(TypeError):
656 range(0) > range(0)
657 with self.assertRaises(TypeError):
658 range(0) <= range(0)
659 with self.assertRaises(TypeError):
660 range(0) >= range(0)
661
Nick Coghlan37ee8502010-12-03 14:26:13 +0000662
Benjamin Peterson878ce382011-11-05 15:17:52 -0400663 def test_attributes(self):
664 # test the start, stop and step attributes of range objects
665 self.assert_attrs(range(0), 0, 0, 1)
666 self.assert_attrs(range(10), 0, 10, 1)
667 self.assert_attrs(range(-10), 0, -10, 1)
668 self.assert_attrs(range(0, 10, 1), 0, 10, 1)
669 self.assert_attrs(range(0, 10, 3), 0, 10, 3)
670 self.assert_attrs(range(10, 0, -1), 10, 0, -1)
671 self.assert_attrs(range(10, 0, -3), 10, 0, -3)
672
673 def assert_attrs(self, rangeobj, start, stop, step):
674 self.assertEqual(rangeobj.start, start)
675 self.assertEqual(rangeobj.stop, stop)
676 self.assertEqual(rangeobj.step, step)
677
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()