blob: 9e11e518f61e1f59363a30ac03e01ae170d7fdd2 [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)
102
103 x = range(10**20, 10**20+10, -3)
104 self.assertEqual(len(x), 0)
105 self.assertEqual(len(list(x)), 0)
106
107 x = range(10**20+10, 10**20, -3)
108 self.assertEqual(len(x), 4)
109 self.assertEqual(len(list(x)), 4)
110
111 # Now test range() with longs
112 self.assertEqual(list(range(-2**100)), [])
113 self.assertEqual(list(range(0, -2**100)), [])
114 self.assertEqual(list(range(0, 2**100, -1)), [])
115 self.assertEqual(list(range(0, 2**100, -1)), [])
116
117 a = int(10 * sys.maxsize)
118 b = int(100 * sys.maxsize)
119 c = int(50 * sys.maxsize)
120
121 self.assertEqual(list(range(a, a+2)), [a, a+1])
122 self.assertEqual(list(range(a+2, a, -1)), [a+2, a+1])
123 self.assertEqual(list(range(a+4, a, -2)), [a+4, a+2])
124
125 seq = list(range(a, b, c))
126 self.assertIn(a, seq)
127 self.assertNotIn(b, seq)
128 self.assertEqual(len(seq), 2)
Nick Coghlane993b102011-01-12 03:15:52 +0000129 self.assertEqual(seq[0], a)
130 self.assertEqual(seq[-1], a+c)
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000131
132 seq = list(range(b, a, -c))
133 self.assertIn(b, seq)
134 self.assertNotIn(a, seq)
135 self.assertEqual(len(seq), 2)
Nick Coghlane993b102011-01-12 03:15:52 +0000136 self.assertEqual(seq[0], b)
137 self.assertEqual(seq[-1], b-c)
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000138
139 seq = list(range(-a, -b, -c))
140 self.assertIn(-a, seq)
141 self.assertNotIn(-b, seq)
142 self.assertEqual(len(seq), 2)
Nick Coghlane993b102011-01-12 03:15:52 +0000143 self.assertEqual(seq[0], -a)
144 self.assertEqual(seq[-1], -a-c)
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000145
Nick Coghlane993b102011-01-12 03:15:52 +0000146 def test_large_range(self):
147 # Check long ranges (len > sys.maxsize)
148 # len() is expected to fail due to limitations of the __len__ protocol
149 def _range_len(x):
150 try:
151 length = len(x)
152 except OverflowError:
153 step = x[1] - x[0]
154 length = 1 + ((x[-1] - x[0]) // step)
155 return length
156 a = -sys.maxsize
157 b = sys.maxsize
158 expected_len = b - a
159 x = range(a, b)
160 self.assertIn(a, x)
161 self.assertNotIn(b, x)
162 self.assertRaises(OverflowError, len, x)
163 self.assertEqual(_range_len(x), expected_len)
164 self.assertEqual(x[0], a)
165 idx = sys.maxsize+1
166 self.assertEqual(x[idx], a+idx)
167 self.assertEqual(x[idx:idx+1][0], a+idx)
168 with self.assertRaises(IndexError):
169 x[-expected_len-1]
170 with self.assertRaises(IndexError):
171 x[expected_len]
172
173 a = 0
174 b = 2 * sys.maxsize
175 expected_len = b - a
176 x = range(a, b)
177 self.assertIn(a, x)
178 self.assertNotIn(b, x)
179 self.assertRaises(OverflowError, len, x)
180 self.assertEqual(_range_len(x), expected_len)
181 self.assertEqual(x[0], a)
182 idx = sys.maxsize+1
183 self.assertEqual(x[idx], a+idx)
184 self.assertEqual(x[idx:idx+1][0], a+idx)
185 with self.assertRaises(IndexError):
186 x[-expected_len-1]
187 with self.assertRaises(IndexError):
188 x[expected_len]
189
190 a = 0
191 b = sys.maxsize**10
192 c = 2*sys.maxsize
193 expected_len = 1 + (b - a) // c
194 x = range(a, b, c)
195 self.assertIn(a, x)
196 self.assertNotIn(b, x)
197 self.assertRaises(OverflowError, len, x)
198 self.assertEqual(_range_len(x), expected_len)
199 self.assertEqual(x[0], a)
200 idx = sys.maxsize+1
201 self.assertEqual(x[idx], a+(idx*c))
202 self.assertEqual(x[idx:idx+1][0], a+(idx*c))
203 with self.assertRaises(IndexError):
204 x[-expected_len-1]
205 with self.assertRaises(IndexError):
206 x[expected_len]
207
208 a = sys.maxsize**10
209 b = 0
210 c = -2*sys.maxsize
211 expected_len = 1 + (b - a) // c
212 x = range(a, b, c)
213 self.assertIn(a, x)
214 self.assertNotIn(b, x)
215 self.assertRaises(OverflowError, len, x)
216 self.assertEqual(_range_len(x), expected_len)
217 self.assertEqual(x[0], a)
218 idx = sys.maxsize+1
219 self.assertEqual(x[idx], a+(idx*c))
220 self.assertEqual(x[idx:idx+1][0], a+(idx*c))
221 with self.assertRaises(IndexError):
222 x[-expected_len-1]
223 with self.assertRaises(IndexError):
224 x[expected_len]
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000225
226 def test_invalid_invocation(self):
227 self.assertRaises(TypeError, range)
228 self.assertRaises(TypeError, range, 1, 2, 3, 4)
229 self.assertRaises(ValueError, range, 1, 2, 0)
Benjamin Petersond57bb552010-11-20 23:03:34 +0000230 a = int(10 * sys.maxsize)
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000231 self.assertRaises(ValueError, range, a, a + 1, int(0))
232 self.assertRaises(TypeError, range, 1., 1., 1.)
233 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
234 self.assertRaises(TypeError, range, 0, "spam")
235 self.assertRaises(TypeError, range, 0, 42, "spam")
236 # Exercise various combinations of bad arguments, to check
237 # refcounting logic
238 self.assertRaises(TypeError, range, 0.0)
239 self.assertRaises(TypeError, range, 0, 0.0)
240 self.assertRaises(TypeError, range, 0.0, 0)
241 self.assertRaises(TypeError, range, 0.0, 0.0)
242 self.assertRaises(TypeError, range, 0, 0, 1.0)
243 self.assertRaises(TypeError, range, 0, 0.0, 1)
244 self.assertRaises(TypeError, range, 0, 0.0, 1.0)
245 self.assertRaises(TypeError, range, 0.0, 0, 1)
246 self.assertRaises(TypeError, range, 0.0, 0, 1.0)
247 self.assertRaises(TypeError, range, 0.0, 0.0, 1)
248 self.assertRaises(TypeError, range, 0.0, 0.0, 1.0)
249
250 def test_index(self):
251 u = range(2)
252 self.assertEqual(u.index(0), 0)
253 self.assertEqual(u.index(1), 1)
254 self.assertRaises(ValueError, u.index, 2)
255
256 u = range(-2, 3)
257 self.assertEqual(u.count(0), 1)
258 self.assertEqual(u.index(0), 2)
259 self.assertRaises(TypeError, u.index)
260
261 class BadExc(Exception):
262 pass
263
264 class BadCmp:
265 def __eq__(self, other):
266 if other == 2:
267 raise BadExc()
268 return False
269
270 a = range(4)
271 self.assertRaises(BadExc, a.index, BadCmp())
272
273 a = range(-2, 3)
274 self.assertEqual(a.index(0), 2)
275 self.assertEqual(range(1, 10, 3).index(4), 1)
276 self.assertEqual(range(1, -10, -3).index(-5), 2)
277
278 self.assertEqual(range(10**20).index(1), 1)
279 self.assertEqual(range(10**20).index(10**20 - 1), 10**20 - 1)
280
281 self.assertRaises(ValueError, range(1, 2**100, 2).index, 2**87)
282 self.assertEqual(range(1, 2**100, 2).index(2**87+1), 2**86)
283
284 class AlwaysEqual(object):
285 def __eq__(self, other):
286 return True
287 always_equal = AlwaysEqual()
Benjamin Petersond57bb552010-11-20 23:03:34 +0000288 self.assertEqual(range(10).index(always_equal), 0)
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000289
290 def test_user_index_method(self):
291 bignum = 2*sys.maxsize
292 smallnum = 42
293
294 # User-defined class with an __index__ method
295 class I:
296 def __init__(self, n):
297 self.n = int(n)
298 def __index__(self):
299 return self.n
300 self.assertEqual(list(range(I(bignum), I(bignum + 1))), [bignum])
301 self.assertEqual(list(range(I(smallnum), I(smallnum + 1))), [smallnum])
302
303 # User-defined class with a failing __index__ method
304 class IX:
305 def __index__(self):
306 raise RuntimeError
307 self.assertRaises(RuntimeError, range, IX())
308
309 # User-defined class with an invalid __index__ method
310 class IN:
311 def __index__(self):
312 return "not a number"
313
314 self.assertRaises(TypeError, range, IN())
315
Mark Dickinson8cd1c762012-11-04 11:46:17 +0000316 # Test use of user-defined classes in slice indices.
Mark Dickinsonc992faf2012-11-04 11:47:47 +0000317 self.assertEqual(range(10)[:I(5)], range(5))
Mark Dickinson8cd1c762012-11-04 11:46:17 +0000318
319 with self.assertRaises(RuntimeError):
320 range(0, 10)[:IX()]
321
322 with self.assertRaises(TypeError):
323 range(0, 10)[:IN()]
324
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000325 def test_count(self):
326 self.assertEqual(range(3).count(-1), 0)
327 self.assertEqual(range(3).count(0), 1)
328 self.assertEqual(range(3).count(1), 1)
329 self.assertEqual(range(3).count(2), 1)
330 self.assertEqual(range(3).count(3), 0)
331 self.assertIs(type(range(3).count(-1)), int)
332 self.assertIs(type(range(3).count(1)), int)
333 self.assertEqual(range(10**20).count(1), 1)
334 self.assertEqual(range(10**20).count(10**20), 0)
335 self.assertEqual(range(3).index(1), 1)
336 self.assertEqual(range(1, 2**100, 2).count(2**87), 0)
337 self.assertEqual(range(1, 2**100, 2).count(2**87+1), 1)
338
339 class AlwaysEqual(object):
340 def __eq__(self, other):
341 return True
342 always_equal = AlwaysEqual()
343 self.assertEqual(range(10).count(always_equal), 10)
344
Nick Coghlan37ee8502010-12-03 14:26:13 +0000345 self.assertEqual(len(range(sys.maxsize, sys.maxsize+10)), 10)
346
Walter Dörwald67d99932007-05-20 08:22:37 +0000347 def test_repr(self):
Walter Dörwald03b43d82007-05-21 10:43:34 +0000348 self.assertEqual(repr(range(1)), 'range(0, 1)')
Walter Dörwald67d99932007-05-20 08:22:37 +0000349 self.assertEqual(repr(range(1, 2)), 'range(1, 2)')
350 self.assertEqual(repr(range(1, 2, 3)), 'range(1, 2, 3)')
351
Alexandre Vassalotti75056072008-06-10 04:03:04 +0000352 def test_pickling(self):
353 testcases = [(13,), (0, 11), (-22, 10), (20, 3, -1),
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000354 (13, 21, 3), (-2, 2, 2), (2**65, 2**65+2)]
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +0000355 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Alexandre Vassalotti75056072008-06-10 04:03:04 +0000356 for t in testcases:
Antoine Pitrou8f2ee6e2013-11-23 21:05:08 +0100357 with self.subTest(proto=proto, test=t):
358 r = range(*t)
359 self.assertEqual(list(pickle.loads(pickle.dumps(r, proto))),
360 list(r))
Alexandre Vassalotti75056072008-06-10 04:03:04 +0000361
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000362 def test_iterator_pickling(self):
363 testcases = [(13,), (0, 11), (-22, 10), (20, 3, -1),
364 (13, 21, 3), (-2, 2, 2), (2**65, 2**65+2)]
365 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
366 for t in testcases:
367 it = itorg = iter(range(*t))
368 data = list(range(*t))
369
Serhiy Storchakabad12572014-12-15 14:03:42 +0200370 d = pickle.dumps(it, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000371 it = pickle.loads(d)
372 self.assertEqual(type(itorg), type(it))
373 self.assertEqual(list(it), data)
374
375 it = pickle.loads(d)
376 try:
377 next(it)
378 except StopIteration:
379 continue
Serhiy Storchakabad12572014-12-15 14:03:42 +0200380 d = pickle.dumps(it, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000381 it = pickle.loads(d)
382 self.assertEqual(list(it), data[1:])
383
Kristján Valur Jónsson4ca688e2014-03-04 23:19:24 +0000384 def test_exhausted_iterator_pickling(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200385 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
386 r = range(2**65, 2**65+2)
387 i = iter(r)
388 while True:
389 r = next(i)
390 if r == 2**65+1:
391 break
392 d = pickle.dumps(i, proto)
393 i2 = pickle.loads(d)
394 self.assertEqual(list(i), [])
395 self.assertEqual(list(i2), [])
Kristján Valur Jónsson25dded02014-03-05 13:47:57 +0000396
397 def test_large_exhausted_iterator_pickling(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200398 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
399 r = range(20)
400 i = iter(r)
401 while True:
402 r = next(i)
403 if r == 19:
404 break
405 d = pickle.dumps(i, proto)
406 i2 = pickle.loads(d)
407 self.assertEqual(list(i), [])
408 self.assertEqual(list(i2), [])
Kristján Valur Jónsson4ca688e2014-03-04 23:19:24 +0000409
Raymond Hettinger94f55832009-06-12 18:40:16 +0000410 def test_odd_bug(self):
411 # This used to raise a "SystemError: NULL result without error"
412 # because the range validation step was eating the exception
413 # before NULL was returned.
414 with self.assertRaises(TypeError):
415 range([], 1, -1)
416
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000417 def test_types(self):
418 # Non-integer objects *equal* to any of the range's items are supposed
419 # to be contained in the range.
Benjamin Peterson577473f2010-01-19 00:09:57 +0000420 self.assertIn(1.0, range(3))
421 self.assertIn(True, range(3))
422 self.assertIn(1+0j, range(3))
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000423
424 class C1:
425 def __eq__(self, other): return True
Benjamin Peterson577473f2010-01-19 00:09:57 +0000426 self.assertIn(C1(), range(3))
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000427
428 # Objects are never coerced into other types for comparison.
429 class C2:
430 def __int__(self): return 1
431 def __index__(self): return 1
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000432 self.assertNotIn(C2(), range(3))
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000433 # ..except if explicitly told so.
Benjamin Peterson577473f2010-01-19 00:09:57 +0000434 self.assertIn(int(C2()), range(3))
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000435
Mark Dickinson418f81d2009-09-24 20:04:23 +0000436 # Check that the range.__contains__ optimization is only
437 # used for ints, not for instances of subclasses of int.
438 class C3(int):
439 def __eq__(self, other): return True
Benjamin Peterson577473f2010-01-19 00:09:57 +0000440 self.assertIn(C3(11), range(10))
441 self.assertIn(C3(11), list(range(10)))
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000442
443 def test_strided_limits(self):
444 r = range(0, 101, 2)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000445 self.assertIn(0, r)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000446 self.assertNotIn(1, r)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000447 self.assertIn(2, r)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000448 self.assertNotIn(99, r)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000449 self.assertIn(100, r)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000450 self.assertNotIn(101, r)
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000451
452 r = range(0, -20, -1)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000453 self.assertIn(0, r)
454 self.assertIn(-1, r)
455 self.assertIn(-19, r)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000456 self.assertNotIn(-20, r)
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000457
458 r = range(0, -20, -2)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000459 self.assertIn(-18, r)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000460 self.assertNotIn(-19, r)
461 self.assertNotIn(-20, r)
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000462
463 def test_empty(self):
464 r = range(0)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000465 self.assertNotIn(0, r)
466 self.assertNotIn(1, r)
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000467
468 r = range(0, -10)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000469 self.assertNotIn(0, r)
470 self.assertNotIn(-1, r)
471 self.assertNotIn(1, r)
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000472
Mark Dickinsond550c9a2009-11-15 09:57:26 +0000473 def test_range_iterators(self):
474 # exercise 'fast' iterators, that use a rangeiterobject internally.
475 # see issue 7298
476 limits = [base + jiggle
477 for M in (2**32, 2**64)
478 for base in (-M, -M//2, 0, M//2, M)
479 for jiggle in (-2, -1, 0, 1, 2)]
480 test_ranges = [(start, end, step)
481 for start in limits
482 for end in limits
483 for step in (-2**63, -2**31, -2, -1, 1, 2)]
484
485 for start, end, step in test_ranges:
486 iter1 = range(start, end, step)
487 iter2 = pyrange(start, end, step)
488 test_id = "range({}, {}, {})".format(start, end, step)
489 # check first 100 entries
490 self.assert_iterators_equal(iter1, iter2, test_id, limit=100)
491
492 iter1 = reversed(range(start, end, step))
493 iter2 = pyrange_reversed(start, end, step)
494 test_id = "reversed(range({}, {}, {}))".format(start, end, step)
495 self.assert_iterators_equal(iter1, iter2, test_id, limit=100)
496
Serhiy Storchaka44759bc2016-10-08 21:43:11 +0300497 @test.support.cpython_only
498 def test_range_iterator_invocation(self):
499 import _testcapi
500 rangeiter_type = type(iter(range(0)))
501
Serhiy Storchakac7f490c2016-10-08 21:50:45 +0300502 self.assertWarns(DeprecationWarning, rangeiter_type, 1, 3, 1)
Serhiy Storchaka44759bc2016-10-08 21:43:11 +0300503
Serhiy Storchakac7f490c2016-10-08 21:50:45 +0300504 with test.support.check_warnings(('', DeprecationWarning)):
505 # rangeiter_new doesn't take keyword arguments
506 with self.assertRaises(TypeError):
507 rangeiter_type(a=1)
Serhiy Storchaka44759bc2016-10-08 21:43:11 +0300508
Serhiy Storchakac7f490c2016-10-08 21:50:45 +0300509 # rangeiter_new takes exactly 3 arguments
510 self.assertRaises(TypeError, rangeiter_type)
511 self.assertRaises(TypeError, rangeiter_type, 1)
512 self.assertRaises(TypeError, rangeiter_type, 1, 1)
513 self.assertRaises(TypeError, rangeiter_type, 1, 1, 1, 1)
Serhiy Storchaka44759bc2016-10-08 21:43:11 +0300514
Serhiy Storchakac7f490c2016-10-08 21:50:45 +0300515 # start, stop and stop must fit in C long
516 for good_val in [_testcapi.LONG_MAX, _testcapi.LONG_MIN]:
517 rangeiter_type(good_val, good_val, good_val)
518 for bad_val in [_testcapi.LONG_MAX + 1, _testcapi.LONG_MIN - 1]:
519 self.assertRaises(OverflowError,
520 rangeiter_type, bad_val, 1, 1)
521 self.assertRaises(OverflowError,
522 rangeiter_type, 1, bad_val, 1)
523 self.assertRaises(OverflowError,
524 rangeiter_type, 1, 1, bad_val)
525
526 # step mustn't be zero
527 self.assertRaises(ValueError, rangeiter_type, 1, 1, 0)
Serhiy Storchaka44759bc2016-10-08 21:43:11 +0300528
Nick Coghlan37ee8502010-12-03 14:26:13 +0000529 def test_slice(self):
530 def check(start, stop, step=None):
531 i = slice(start, stop, step)
532 self.assertEqual(list(r[i]), list(r)[i])
533 self.assertEqual(len(r[i]), len(list(r)[i]))
534 for r in [range(10),
535 range(0),
536 range(1, 9, 3),
537 range(8, 0, -3),
538 range(sys.maxsize+1, sys.maxsize+10),
539 ]:
540 check(0, 2)
541 check(0, 20)
542 check(1, 2)
543 check(20, 30)
544 check(-30, -20)
545 check(-1, 100, 2)
546 check(0, -1)
547 check(-1, -3, -1)
548
549 def test_contains(self):
550 r = range(10)
551 self.assertIn(0, r)
552 self.assertIn(1, r)
553 self.assertIn(5.0, r)
554 self.assertNotIn(5.1, r)
555 self.assertNotIn(-1, r)
556 self.assertNotIn(10, r)
557 self.assertNotIn("", r)
558 r = range(9, -1, -1)
559 self.assertIn(0, r)
560 self.assertIn(1, r)
561 self.assertIn(5.0, r)
562 self.assertNotIn(5.1, r)
563 self.assertNotIn(-1, r)
564 self.assertNotIn(10, r)
565 self.assertNotIn("", r)
566 r = range(0, 10, 2)
567 self.assertIn(0, r)
568 self.assertNotIn(1, r)
569 self.assertNotIn(5.0, r)
570 self.assertNotIn(5.1, r)
571 self.assertNotIn(-1, r)
572 self.assertNotIn(10, r)
573 self.assertNotIn("", r)
574 r = range(9, -1, -2)
575 self.assertNotIn(0, r)
576 self.assertIn(1, r)
577 self.assertIn(5.0, r)
578 self.assertNotIn(5.1, r)
579 self.assertNotIn(-1, r)
580 self.assertNotIn(10, r)
581 self.assertNotIn("", r)
582
583 def test_reverse_iteration(self):
584 for r in [range(10),
585 range(0),
586 range(1, 9, 3),
587 range(8, 0, -3),
588 range(sys.maxsize+1, sys.maxsize+10),
589 ]:
590 self.assertEqual(list(reversed(r)), list(r)[::-1])
591
Ezio Melotti982ef4e2011-04-15 08:15:40 +0300592 def test_issue11845(self):
593 r = range(*slice(1, 18, 2).indices(20))
594 values = {None, 0, 1, -1, 2, -2, 5, -5, 19, -19,
595 20, -20, 21, -21, 30, -30, 99, -99}
596 for i in values:
597 for j in values:
598 for k in values - {0}:
599 r[i:j:k]
600
Mark Dickinson36645682011-10-23 19:53:01 +0100601 def test_comparison(self):
602 test_ranges = [range(0), range(0, -1), range(1, 1, 3),
603 range(1), range(5, 6), range(5, 6, 2),
604 range(5, 7, 2), range(2), range(0, 4, 2),
605 range(0, 5, 2), range(0, 6, 2)]
606 test_tuples = list(map(tuple, test_ranges))
607
608 # Check that equality of ranges matches equality of the corresponding
609 # tuples for each pair from the test lists above.
610 ranges_eq = [a == b for a in test_ranges for b in test_ranges]
611 tuples_eq = [a == b for a in test_tuples for b in test_tuples]
612 self.assertEqual(ranges_eq, tuples_eq)
613
614 # Check that != correctly gives the logical negation of ==
615 ranges_ne = [a != b for a in test_ranges for b in test_ranges]
616 self.assertEqual(ranges_ne, [not x for x in ranges_eq])
617
618 # Equal ranges should have equal hashes.
619 for a in test_ranges:
620 for b in test_ranges:
621 if a == b:
622 self.assertEqual(hash(a), hash(b))
623
624 # Ranges are unequal to other types (even sequence types)
625 self.assertIs(range(0) == (), False)
626 self.assertIs(() == range(0), False)
627 self.assertIs(range(2) == [0, 1], False)
628
629 # Huge integers aren't a problem.
630 self.assertEqual(range(0, 2**100 - 1, 2),
631 range(0, 2**100, 2))
632 self.assertEqual(hash(range(0, 2**100 - 1, 2)),
633 hash(range(0, 2**100, 2)))
634 self.assertNotEqual(range(0, 2**100, 2),
635 range(0, 2**100 + 1, 2))
636 self.assertEqual(range(2**200, 2**201 - 2**99, 2**100),
637 range(2**200, 2**201, 2**100))
638 self.assertEqual(hash(range(2**200, 2**201 - 2**99, 2**100)),
639 hash(range(2**200, 2**201, 2**100)))
640 self.assertNotEqual(range(2**200, 2**201, 2**100),
641 range(2**200, 2**201 + 1, 2**100))
642
643 # Order comparisons are not implemented for ranges.
644 with self.assertRaises(TypeError):
645 range(0) < range(0)
646 with self.assertRaises(TypeError):
647 range(0) > range(0)
648 with self.assertRaises(TypeError):
649 range(0) <= range(0)
650 with self.assertRaises(TypeError):
651 range(0) >= range(0)
652
Nick Coghlan37ee8502010-12-03 14:26:13 +0000653
Benjamin Peterson878ce382011-11-05 15:17:52 -0400654 def test_attributes(self):
655 # test the start, stop and step attributes of range objects
656 self.assert_attrs(range(0), 0, 0, 1)
657 self.assert_attrs(range(10), 0, 10, 1)
658 self.assert_attrs(range(-10), 0, -10, 1)
659 self.assert_attrs(range(0, 10, 1), 0, 10, 1)
660 self.assert_attrs(range(0, 10, 3), 0, 10, 3)
661 self.assert_attrs(range(10, 0, -1), 10, 0, -1)
662 self.assert_attrs(range(10, 0, -3), 10, 0, -3)
663
664 def assert_attrs(self, rangeobj, start, stop, step):
665 self.assertEqual(rangeobj.start, start)
666 self.assertEqual(rangeobj.stop, stop)
667 self.assertEqual(rangeobj.step, step)
668
669 with self.assertRaises(AttributeError):
670 rangeobj.start = 0
671 with self.assertRaises(AttributeError):
672 rangeobj.stop = 10
673 with self.assertRaises(AttributeError):
674 rangeobj.step = 1
675
676 with self.assertRaises(AttributeError):
677 del rangeobj.start
678 with self.assertRaises(AttributeError):
679 del rangeobj.stop
680 with self.assertRaises(AttributeError):
681 del rangeobj.step
682
Neal Norwitz1c0423a2004-07-08 01:59:55 +0000683if __name__ == "__main__":
Zachary Ware38c707e2015-04-13 15:00:43 -0500684 unittest.main()