blob: f18046dde87b0533fc1588ff476ee19dda5fd327 [file] [log] [blame]
Neal Norwitz1c0423a2004-07-08 01:59:55 +00001# Python test set -- built-in functions
2
Benjamin Petersonee8712c2008-05-20 21:35:26 +00003import test.support, 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
Neal Norwitz1c0423a2004-07-08 01:59:55 +00007
Mark Dickinsond550c9a2009-11-15 09:57:26 +00008# pure Python implementations (3 args only), for comparison
9def pyrange(start, stop, step):
10 if (start - stop) // step < 0:
11 # replace stop with next element in the sequence of integers
12 # that are congruent to start modulo step.
13 stop += (start - stop) % step
14 while start != stop:
15 yield start
16 start += step
17
18def pyrange_reversed(start, stop, step):
19 stop += (start - stop) % step
20 return pyrange(stop - step, start - step, -step)
21
22
Walter Dörwald4ad94212007-05-21 18:01:17 +000023class RangeTest(unittest.TestCase):
Mark Dickinsond550c9a2009-11-15 09:57:26 +000024 def assert_iterators_equal(self, xs, ys, test_id, limit=None):
25 # check that an iterator xs matches the expected results ys,
26 # up to a given limit.
27 if limit is not None:
28 xs = itertools.islice(xs, limit)
29 ys = itertools.islice(ys, limit)
30 sentinel = object()
31 pairs = itertools.zip_longest(xs, ys, fillvalue=sentinel)
32 for i, (x, y) in enumerate(pairs):
33 if x == y:
34 continue
35 elif x == sentinel:
36 self.fail('{}: iterator ended unexpectedly '
37 'at position {}; expected {}'.format(test_id, i, y))
38 elif y == sentinel:
39 self.fail('{}: unexpected excess element {} at '
40 'position {}'.format(test_id, x, i))
41 else:
42 self.fail('{}: wrong element at position {};'
43 'expected {}, got {}'.format(test_id, i, y, x))
44
Walter Dörwald4ad94212007-05-21 18:01:17 +000045 def test_range(self):
Guido van Rossum805365e2007-05-07 22:24:25 +000046 self.assertEqual(list(range(3)), [0, 1, 2])
47 self.assertEqual(list(range(1, 5)), [1, 2, 3, 4])
48 self.assertEqual(list(range(0)), [])
49 self.assertEqual(list(range(-3)), [])
50 self.assertEqual(list(range(1, 10, 3)), [1, 4, 7])
51 self.assertEqual(list(range(5, -5, -3)), [5, 2, -1, -4])
Neal Norwitz1c0423a2004-07-08 01:59:55 +000052
53 a = 10
54 b = 100
55 c = 50
56
Guido van Rossum805365e2007-05-07 22:24:25 +000057 self.assertEqual(list(range(a, a+2)), [a, a+1])
58 self.assertEqual(list(range(a+2, a, -1)), [a+2, a+1])
59 self.assertEqual(list(range(a+4, a, -2)), [a+4, a+2])
Neal Norwitz1c0423a2004-07-08 01:59:55 +000060
Guido van Rossum805365e2007-05-07 22:24:25 +000061 seq = list(range(a, b, c))
Benjamin Peterson577473f2010-01-19 00:09:57 +000062 self.assertIn(a, seq)
63 self.assertNotIn(b, seq)
Neal Norwitz1c0423a2004-07-08 01:59:55 +000064 self.assertEqual(len(seq), 2)
65
Guido van Rossum805365e2007-05-07 22:24:25 +000066 seq = list(range(b, a, -c))
Benjamin Peterson577473f2010-01-19 00:09:57 +000067 self.assertIn(b, seq)
68 self.assertNotIn(a, seq)
Neal Norwitz1c0423a2004-07-08 01:59:55 +000069 self.assertEqual(len(seq), 2)
70
Guido van Rossum805365e2007-05-07 22:24:25 +000071 seq = list(range(-a, -b, -c))
Benjamin Peterson577473f2010-01-19 00:09:57 +000072 self.assertIn(-a, seq)
73 self.assertNotIn(-b, seq)
Neal Norwitz1c0423a2004-07-08 01:59:55 +000074 self.assertEqual(len(seq), 2)
75
Guido van Rossum805365e2007-05-07 22:24:25 +000076 self.assertRaises(TypeError, range)
77 self.assertRaises(TypeError, range, 1, 2, 3, 4)
78 self.assertRaises(ValueError, range, 1, 2, 0)
Neal Norwitz1c0423a2004-07-08 01:59:55 +000079
Guido van Rossum805365e2007-05-07 22:24:25 +000080 self.assertRaises(TypeError, range, 0.0, 2, 1)
81 self.assertRaises(TypeError, range, 1, 2.0, 1)
82 self.assertRaises(TypeError, range, 1, 2, 1.0)
83 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Neal Norwitz1c0423a2004-07-08 01:59:55 +000084
Guido van Rossum805365e2007-05-07 22:24:25 +000085 self.assertRaises(TypeError, range, 0, "spam")
86 self.assertRaises(TypeError, range, 0, 42, "spam")
Neal Norwitz1c0423a2004-07-08 01:59:55 +000087
Christian Heimesa37d4c62007-12-04 23:02:19 +000088 self.assertEqual(len(range(0, sys.maxsize, sys.maxsize-1)), 2)
Tim Petersfeec4532004-08-08 07:17:39 +000089
Christian Heimesa37d4c62007-12-04 23:02:19 +000090 r = range(-sys.maxsize, sys.maxsize, 2)
91 self.assertEqual(len(r), sys.maxsize)
Tim Petersfeec4532004-08-08 07:17:39 +000092
Benjamin Peterson8d16ab32010-11-20 23:01:55 +000093 def test_large_operands(self):
94 x = range(10**20, 10**20+10, 3)
95 self.assertEqual(len(x), 4)
96 self.assertEqual(len(list(x)), 4)
97
98 x = range(10**20+10, 10**20, 3)
99 self.assertEqual(len(x), 0)
100 self.assertEqual(len(list(x)), 0)
101
102 x = range(10**20, 10**20+10, -3)
103 self.assertEqual(len(x), 0)
104 self.assertEqual(len(list(x)), 0)
105
106 x = range(10**20+10, 10**20, -3)
107 self.assertEqual(len(x), 4)
108 self.assertEqual(len(list(x)), 4)
109
110 # Now test range() with longs
111 self.assertEqual(list(range(-2**100)), [])
112 self.assertEqual(list(range(0, -2**100)), [])
113 self.assertEqual(list(range(0, 2**100, -1)), [])
114 self.assertEqual(list(range(0, 2**100, -1)), [])
115
116 a = int(10 * sys.maxsize)
117 b = int(100 * sys.maxsize)
118 c = int(50 * sys.maxsize)
119
120 self.assertEqual(list(range(a, a+2)), [a, a+1])
121 self.assertEqual(list(range(a+2, a, -1)), [a+2, a+1])
122 self.assertEqual(list(range(a+4, a, -2)), [a+4, a+2])
123
124 seq = list(range(a, b, c))
125 self.assertIn(a, seq)
126 self.assertNotIn(b, seq)
127 self.assertEqual(len(seq), 2)
Nick Coghlane993b102011-01-12 03:15:52 +0000128 self.assertEqual(seq[0], a)
129 self.assertEqual(seq[-1], a+c)
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000130
131 seq = list(range(b, a, -c))
132 self.assertIn(b, seq)
133 self.assertNotIn(a, seq)
134 self.assertEqual(len(seq), 2)
Nick Coghlane993b102011-01-12 03:15:52 +0000135 self.assertEqual(seq[0], b)
136 self.assertEqual(seq[-1], b-c)
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000137
138 seq = list(range(-a, -b, -c))
139 self.assertIn(-a, seq)
140 self.assertNotIn(-b, seq)
141 self.assertEqual(len(seq), 2)
Nick Coghlane993b102011-01-12 03:15:52 +0000142 self.assertEqual(seq[0], -a)
143 self.assertEqual(seq[-1], -a-c)
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000144
Nick Coghlane993b102011-01-12 03:15:52 +0000145 def test_large_range(self):
146 # Check long ranges (len > sys.maxsize)
147 # len() is expected to fail due to limitations of the __len__ protocol
148 def _range_len(x):
149 try:
150 length = len(x)
151 except OverflowError:
152 step = x[1] - x[0]
153 length = 1 + ((x[-1] - x[0]) // step)
154 return length
155 a = -sys.maxsize
156 b = sys.maxsize
157 expected_len = b - a
158 x = range(a, b)
159 self.assertIn(a, x)
160 self.assertNotIn(b, x)
161 self.assertRaises(OverflowError, len, x)
162 self.assertEqual(_range_len(x), expected_len)
163 self.assertEqual(x[0], a)
164 idx = sys.maxsize+1
165 self.assertEqual(x[idx], a+idx)
166 self.assertEqual(x[idx:idx+1][0], a+idx)
167 with self.assertRaises(IndexError):
168 x[-expected_len-1]
169 with self.assertRaises(IndexError):
170 x[expected_len]
171
172 a = 0
173 b = 2 * sys.maxsize
174 expected_len = b - a
175 x = range(a, b)
176 self.assertIn(a, x)
177 self.assertNotIn(b, x)
178 self.assertRaises(OverflowError, len, x)
179 self.assertEqual(_range_len(x), expected_len)
180 self.assertEqual(x[0], a)
181 idx = sys.maxsize+1
182 self.assertEqual(x[idx], a+idx)
183 self.assertEqual(x[idx:idx+1][0], a+idx)
184 with self.assertRaises(IndexError):
185 x[-expected_len-1]
186 with self.assertRaises(IndexError):
187 x[expected_len]
188
189 a = 0
190 b = sys.maxsize**10
191 c = 2*sys.maxsize
192 expected_len = 1 + (b - a) // c
193 x = range(a, b, c)
194 self.assertIn(a, x)
195 self.assertNotIn(b, x)
196 self.assertRaises(OverflowError, len, x)
197 self.assertEqual(_range_len(x), expected_len)
198 self.assertEqual(x[0], a)
199 idx = sys.maxsize+1
200 self.assertEqual(x[idx], a+(idx*c))
201 self.assertEqual(x[idx:idx+1][0], a+(idx*c))
202 with self.assertRaises(IndexError):
203 x[-expected_len-1]
204 with self.assertRaises(IndexError):
205 x[expected_len]
206
207 a = sys.maxsize**10
208 b = 0
209 c = -2*sys.maxsize
210 expected_len = 1 + (b - a) // c
211 x = range(a, b, c)
212 self.assertIn(a, x)
213 self.assertNotIn(b, x)
214 self.assertRaises(OverflowError, len, x)
215 self.assertEqual(_range_len(x), expected_len)
216 self.assertEqual(x[0], a)
217 idx = sys.maxsize+1
218 self.assertEqual(x[idx], a+(idx*c))
219 self.assertEqual(x[idx:idx+1][0], a+(idx*c))
220 with self.assertRaises(IndexError):
221 x[-expected_len-1]
222 with self.assertRaises(IndexError):
223 x[expected_len]
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000224
225 def test_invalid_invocation(self):
226 self.assertRaises(TypeError, range)
227 self.assertRaises(TypeError, range, 1, 2, 3, 4)
228 self.assertRaises(ValueError, range, 1, 2, 0)
Benjamin Petersond57bb552010-11-20 23:03:34 +0000229 a = int(10 * sys.maxsize)
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000230 self.assertRaises(ValueError, range, a, a + 1, int(0))
231 self.assertRaises(TypeError, range, 1., 1., 1.)
232 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
233 self.assertRaises(TypeError, range, 0, "spam")
234 self.assertRaises(TypeError, range, 0, 42, "spam")
235 # Exercise various combinations of bad arguments, to check
236 # refcounting logic
237 self.assertRaises(TypeError, range, 0.0)
238 self.assertRaises(TypeError, range, 0, 0.0)
239 self.assertRaises(TypeError, range, 0.0, 0)
240 self.assertRaises(TypeError, range, 0.0, 0.0)
241 self.assertRaises(TypeError, range, 0, 0, 1.0)
242 self.assertRaises(TypeError, range, 0, 0.0, 1)
243 self.assertRaises(TypeError, range, 0, 0.0, 1.0)
244 self.assertRaises(TypeError, range, 0.0, 0, 1)
245 self.assertRaises(TypeError, range, 0.0, 0, 1.0)
246 self.assertRaises(TypeError, range, 0.0, 0.0, 1)
247 self.assertRaises(TypeError, range, 0.0, 0.0, 1.0)
248
249 def test_index(self):
250 u = range(2)
251 self.assertEqual(u.index(0), 0)
252 self.assertEqual(u.index(1), 1)
253 self.assertRaises(ValueError, u.index, 2)
254
255 u = range(-2, 3)
256 self.assertEqual(u.count(0), 1)
257 self.assertEqual(u.index(0), 2)
258 self.assertRaises(TypeError, u.index)
259
260 class BadExc(Exception):
261 pass
262
263 class BadCmp:
264 def __eq__(self, other):
265 if other == 2:
266 raise BadExc()
267 return False
268
269 a = range(4)
270 self.assertRaises(BadExc, a.index, BadCmp())
271
272 a = range(-2, 3)
273 self.assertEqual(a.index(0), 2)
274 self.assertEqual(range(1, 10, 3).index(4), 1)
275 self.assertEqual(range(1, -10, -3).index(-5), 2)
276
277 self.assertEqual(range(10**20).index(1), 1)
278 self.assertEqual(range(10**20).index(10**20 - 1), 10**20 - 1)
279
280 self.assertRaises(ValueError, range(1, 2**100, 2).index, 2**87)
281 self.assertEqual(range(1, 2**100, 2).index(2**87+1), 2**86)
282
283 class AlwaysEqual(object):
284 def __eq__(self, other):
285 return True
286 always_equal = AlwaysEqual()
Benjamin Petersond57bb552010-11-20 23:03:34 +0000287 self.assertEqual(range(10).index(always_equal), 0)
Benjamin Peterson8d16ab32010-11-20 23:01:55 +0000288
289 def test_user_index_method(self):
290 bignum = 2*sys.maxsize
291 smallnum = 42
292
293 # User-defined class with an __index__ method
294 class I:
295 def __init__(self, n):
296 self.n = int(n)
297 def __index__(self):
298 return self.n
299 self.assertEqual(list(range(I(bignum), I(bignum + 1))), [bignum])
300 self.assertEqual(list(range(I(smallnum), I(smallnum + 1))), [smallnum])
301
302 # User-defined class with a failing __index__ method
303 class IX:
304 def __index__(self):
305 raise RuntimeError
306 self.assertRaises(RuntimeError, range, IX())
307
308 # User-defined class with an invalid __index__ method
309 class IN:
310 def __index__(self):
311 return "not a number"
312
313 self.assertRaises(TypeError, range, IN())
314
315 def test_count(self):
316 self.assertEqual(range(3).count(-1), 0)
317 self.assertEqual(range(3).count(0), 1)
318 self.assertEqual(range(3).count(1), 1)
319 self.assertEqual(range(3).count(2), 1)
320 self.assertEqual(range(3).count(3), 0)
321 self.assertIs(type(range(3).count(-1)), int)
322 self.assertIs(type(range(3).count(1)), int)
323 self.assertEqual(range(10**20).count(1), 1)
324 self.assertEqual(range(10**20).count(10**20), 0)
325 self.assertEqual(range(3).index(1), 1)
326 self.assertEqual(range(1, 2**100, 2).count(2**87), 0)
327 self.assertEqual(range(1, 2**100, 2).count(2**87+1), 1)
328
329 class AlwaysEqual(object):
330 def __eq__(self, other):
331 return True
332 always_equal = AlwaysEqual()
333 self.assertEqual(range(10).count(always_equal), 10)
334
Nick Coghlan37ee8502010-12-03 14:26:13 +0000335 self.assertEqual(len(range(sys.maxsize, sys.maxsize+10)), 10)
336
Walter Dörwald67d99932007-05-20 08:22:37 +0000337 def test_repr(self):
Walter Dörwald03b43d82007-05-21 10:43:34 +0000338 self.assertEqual(repr(range(1)), 'range(0, 1)')
Walter Dörwald67d99932007-05-20 08:22:37 +0000339 self.assertEqual(repr(range(1, 2)), 'range(1, 2)')
340 self.assertEqual(repr(range(1, 2, 3)), 'range(1, 2, 3)')
341
Alexandre Vassalotti75056072008-06-10 04:03:04 +0000342 def test_pickling(self):
343 testcases = [(13,), (0, 11), (-22, 10), (20, 3, -1),
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000344 (13, 21, 3), (-2, 2, 2), (2**65, 2**65+2)]
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +0000345 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Alexandre Vassalotti75056072008-06-10 04:03:04 +0000346 for t in testcases:
347 r = range(*t)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000348 self.assertEqual(list(pickle.loads(pickle.dumps(r, proto))),
349 list(r))
Alexandre Vassalotti75056072008-06-10 04:03:04 +0000350
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000351 def test_iterator_pickling(self):
352 testcases = [(13,), (0, 11), (-22, 10), (20, 3, -1),
353 (13, 21, 3), (-2, 2, 2), (2**65, 2**65+2)]
354 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
355 for t in testcases:
356 it = itorg = iter(range(*t))
357 data = list(range(*t))
358
359 d = pickle.dumps(it)
360 it = pickle.loads(d)
361 self.assertEqual(type(itorg), type(it))
362 self.assertEqual(list(it), data)
363
364 it = pickle.loads(d)
365 try:
366 next(it)
367 except StopIteration:
368 continue
369 d = pickle.dumps(it)
370 it = pickle.loads(d)
371 self.assertEqual(list(it), data[1:])
372
Raymond Hettinger94f55832009-06-12 18:40:16 +0000373 def test_odd_bug(self):
374 # This used to raise a "SystemError: NULL result without error"
375 # because the range validation step was eating the exception
376 # before NULL was returned.
377 with self.assertRaises(TypeError):
378 range([], 1, -1)
379
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000380 def test_types(self):
381 # Non-integer objects *equal* to any of the range's items are supposed
382 # to be contained in the range.
Benjamin Peterson577473f2010-01-19 00:09:57 +0000383 self.assertIn(1.0, range(3))
384 self.assertIn(True, range(3))
385 self.assertIn(1+0j, range(3))
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000386
387 class C1:
388 def __eq__(self, other): return True
Benjamin Peterson577473f2010-01-19 00:09:57 +0000389 self.assertIn(C1(), range(3))
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000390
391 # Objects are never coerced into other types for comparison.
392 class C2:
393 def __int__(self): return 1
394 def __index__(self): return 1
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000395 self.assertNotIn(C2(), range(3))
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000396 # ..except if explicitly told so.
Benjamin Peterson577473f2010-01-19 00:09:57 +0000397 self.assertIn(int(C2()), range(3))
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000398
Mark Dickinson418f81d2009-09-24 20:04:23 +0000399 # Check that the range.__contains__ optimization is only
400 # used for ints, not for instances of subclasses of int.
401 class C3(int):
402 def __eq__(self, other): return True
Benjamin Peterson577473f2010-01-19 00:09:57 +0000403 self.assertIn(C3(11), range(10))
404 self.assertIn(C3(11), list(range(10)))
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000405
406 def test_strided_limits(self):
407 r = range(0, 101, 2)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000408 self.assertIn(0, r)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000409 self.assertNotIn(1, r)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000410 self.assertIn(2, r)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000411 self.assertNotIn(99, r)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000412 self.assertIn(100, r)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000413 self.assertNotIn(101, r)
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000414
415 r = range(0, -20, -1)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000416 self.assertIn(0, r)
417 self.assertIn(-1, r)
418 self.assertIn(-19, r)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000419 self.assertNotIn(-20, r)
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000420
421 r = range(0, -20, -2)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000422 self.assertIn(-18, r)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000423 self.assertNotIn(-19, r)
424 self.assertNotIn(-20, r)
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000425
426 def test_empty(self):
427 r = range(0)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000428 self.assertNotIn(0, r)
429 self.assertNotIn(1, r)
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000430
431 r = range(0, -10)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000432 self.assertNotIn(0, r)
433 self.assertNotIn(-1, r)
434 self.assertNotIn(1, r)
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000435
Mark Dickinsond550c9a2009-11-15 09:57:26 +0000436 def test_range_iterators(self):
437 # exercise 'fast' iterators, that use a rangeiterobject internally.
438 # see issue 7298
439 limits = [base + jiggle
440 for M in (2**32, 2**64)
441 for base in (-M, -M//2, 0, M//2, M)
442 for jiggle in (-2, -1, 0, 1, 2)]
443 test_ranges = [(start, end, step)
444 for start in limits
445 for end in limits
446 for step in (-2**63, -2**31, -2, -1, 1, 2)]
447
448 for start, end, step in test_ranges:
449 iter1 = range(start, end, step)
450 iter2 = pyrange(start, end, step)
451 test_id = "range({}, {}, {})".format(start, end, step)
452 # check first 100 entries
453 self.assert_iterators_equal(iter1, iter2, test_id, limit=100)
454
455 iter1 = reversed(range(start, end, step))
456 iter2 = pyrange_reversed(start, end, step)
457 test_id = "reversed(range({}, {}, {}))".format(start, end, step)
458 self.assert_iterators_equal(iter1, iter2, test_id, limit=100)
459
Nick Coghlan37ee8502010-12-03 14:26:13 +0000460 def test_slice(self):
461 def check(start, stop, step=None):
462 i = slice(start, stop, step)
463 self.assertEqual(list(r[i]), list(r)[i])
464 self.assertEqual(len(r[i]), len(list(r)[i]))
465 for r in [range(10),
466 range(0),
467 range(1, 9, 3),
468 range(8, 0, -3),
469 range(sys.maxsize+1, sys.maxsize+10),
470 ]:
471 check(0, 2)
472 check(0, 20)
473 check(1, 2)
474 check(20, 30)
475 check(-30, -20)
476 check(-1, 100, 2)
477 check(0, -1)
478 check(-1, -3, -1)
479
480 def test_contains(self):
481 r = range(10)
482 self.assertIn(0, r)
483 self.assertIn(1, r)
484 self.assertIn(5.0, r)
485 self.assertNotIn(5.1, r)
486 self.assertNotIn(-1, r)
487 self.assertNotIn(10, r)
488 self.assertNotIn("", r)
489 r = range(9, -1, -1)
490 self.assertIn(0, r)
491 self.assertIn(1, r)
492 self.assertIn(5.0, r)
493 self.assertNotIn(5.1, r)
494 self.assertNotIn(-1, r)
495 self.assertNotIn(10, r)
496 self.assertNotIn("", r)
497 r = range(0, 10, 2)
498 self.assertIn(0, r)
499 self.assertNotIn(1, r)
500 self.assertNotIn(5.0, r)
501 self.assertNotIn(5.1, r)
502 self.assertNotIn(-1, r)
503 self.assertNotIn(10, r)
504 self.assertNotIn("", r)
505 r = range(9, -1, -2)
506 self.assertNotIn(0, r)
507 self.assertIn(1, r)
508 self.assertIn(5.0, r)
509 self.assertNotIn(5.1, r)
510 self.assertNotIn(-1, r)
511 self.assertNotIn(10, r)
512 self.assertNotIn("", r)
513
514 def test_reverse_iteration(self):
515 for r in [range(10),
516 range(0),
517 range(1, 9, 3),
518 range(8, 0, -3),
519 range(sys.maxsize+1, sys.maxsize+10),
520 ]:
521 self.assertEqual(list(reversed(r)), list(r)[::-1])
522
Ezio Melotti982ef4e2011-04-15 08:15:40 +0300523 def test_issue11845(self):
524 r = range(*slice(1, 18, 2).indices(20))
525 values = {None, 0, 1, -1, 2, -2, 5, -5, 19, -19,
526 20, -20, 21, -21, 30, -30, 99, -99}
527 for i in values:
528 for j in values:
529 for k in values - {0}:
530 r[i:j:k]
531
Mark Dickinson36645682011-10-23 19:53:01 +0100532 def test_comparison(self):
533 test_ranges = [range(0), range(0, -1), range(1, 1, 3),
534 range(1), range(5, 6), range(5, 6, 2),
535 range(5, 7, 2), range(2), range(0, 4, 2),
536 range(0, 5, 2), range(0, 6, 2)]
537 test_tuples = list(map(tuple, test_ranges))
538
539 # Check that equality of ranges matches equality of the corresponding
540 # tuples for each pair from the test lists above.
541 ranges_eq = [a == b for a in test_ranges for b in test_ranges]
542 tuples_eq = [a == b for a in test_tuples for b in test_tuples]
543 self.assertEqual(ranges_eq, tuples_eq)
544
545 # Check that != correctly gives the logical negation of ==
546 ranges_ne = [a != b for a in test_ranges for b in test_ranges]
547 self.assertEqual(ranges_ne, [not x for x in ranges_eq])
548
549 # Equal ranges should have equal hashes.
550 for a in test_ranges:
551 for b in test_ranges:
552 if a == b:
553 self.assertEqual(hash(a), hash(b))
554
555 # Ranges are unequal to other types (even sequence types)
556 self.assertIs(range(0) == (), False)
557 self.assertIs(() == range(0), False)
558 self.assertIs(range(2) == [0, 1], False)
559
560 # Huge integers aren't a problem.
561 self.assertEqual(range(0, 2**100 - 1, 2),
562 range(0, 2**100, 2))
563 self.assertEqual(hash(range(0, 2**100 - 1, 2)),
564 hash(range(0, 2**100, 2)))
565 self.assertNotEqual(range(0, 2**100, 2),
566 range(0, 2**100 + 1, 2))
567 self.assertEqual(range(2**200, 2**201 - 2**99, 2**100),
568 range(2**200, 2**201, 2**100))
569 self.assertEqual(hash(range(2**200, 2**201 - 2**99, 2**100)),
570 hash(range(2**200, 2**201, 2**100)))
571 self.assertNotEqual(range(2**200, 2**201, 2**100),
572 range(2**200, 2**201 + 1, 2**100))
573
574 # Order comparisons are not implemented for ranges.
575 with self.assertRaises(TypeError):
576 range(0) < range(0)
577 with self.assertRaises(TypeError):
578 range(0) > range(0)
579 with self.assertRaises(TypeError):
580 range(0) <= range(0)
581 with self.assertRaises(TypeError):
582 range(0) >= range(0)
583
Nick Coghlan37ee8502010-12-03 14:26:13 +0000584
Benjamin Peterson878ce382011-11-05 15:17:52 -0400585 def test_attributes(self):
586 # test the start, stop and step attributes of range objects
587 self.assert_attrs(range(0), 0, 0, 1)
588 self.assert_attrs(range(10), 0, 10, 1)
589 self.assert_attrs(range(-10), 0, -10, 1)
590 self.assert_attrs(range(0, 10, 1), 0, 10, 1)
591 self.assert_attrs(range(0, 10, 3), 0, 10, 3)
592 self.assert_attrs(range(10, 0, -1), 10, 0, -1)
593 self.assert_attrs(range(10, 0, -3), 10, 0, -3)
594
595 def assert_attrs(self, rangeobj, start, stop, step):
596 self.assertEqual(rangeobj.start, start)
597 self.assertEqual(rangeobj.stop, stop)
598 self.assertEqual(rangeobj.step, step)
599
600 with self.assertRaises(AttributeError):
601 rangeobj.start = 0
602 with self.assertRaises(AttributeError):
603 rangeobj.stop = 10
604 with self.assertRaises(AttributeError):
605 rangeobj.step = 1
606
607 with self.assertRaises(AttributeError):
608 del rangeobj.start
609 with self.assertRaises(AttributeError):
610 del rangeobj.stop
611 with self.assertRaises(AttributeError):
612 del rangeobj.step
613
Neal Norwitz1c0423a2004-07-08 01:59:55 +0000614def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000615 test.support.run_unittest(RangeTest)
Neal Norwitz1c0423a2004-07-08 01:59:55 +0000616
617if __name__ == "__main__":
618 test_main()