3
3
import test.test_support, unittest
8
9
warnings.filterwarnings("ignore", "integer argument expected",
9
10
DeprecationWarning, "unittest")
12
# pure Python implementations (3 args only), for comparison
13
def pyrange(start, stop, step):
14
if (start - stop) // step < 0:
15
# replace stop with next element in the sequence of integers
16
# that are congruent to start modulo step.
17
stop += (start - stop) % step
22
def pyrange_reversed(start, stop, step):
23
stop += (start - stop) % step
24
return pyrange(stop - step, start - step, -step)
11
27
class XrangeTest(unittest.TestCase):
28
def assert_iterators_equal(self, xs, ys, test_id, limit=None):
29
# check that an iterator xs matches the expected results ys,
30
# up to a given limit.
32
xs = itertools.islice(xs, limit)
33
ys = itertools.islice(ys, limit)
35
pairs = itertools.izip_longest(xs, ys, fillvalue=sentinel)
36
for i, (x, y) in enumerate(pairs):
40
self.fail('{0}: iterator ended unexpectedly '
41
'at position {1}; expected {2}'.format(test_id, i, y))
43
self.fail('{0}: unexpected excess element {1} at '
44
'position {2}'.format(test_id, x, i))
46
self.fail('{0}: wrong element at position {1};'
47
'expected {2}, got {3}'.format(test_id, i, y, x))
12
49
def test_xrange(self):
13
50
self.assertEqual(list(xrange(3)), [0, 1, 2])
14
51
self.assertEqual(list(xrange(1, 5)), [1, 2, 3, 4])
67
104
self.assertEquals(list(pickle.loads(pickle.dumps(r, proto))),
107
def test_range_iterators(self):
109
limits = [base + jiggle
110
for M in (2**32, 2**64)
111
for base in (-M, -M//2, 0, M//2, M)
112
for jiggle in (-2, -1, 0, 1, 2)]
113
test_ranges = [(start, end, step)
116
for step in (-2**63, -2**31, -2, -1, 1, 2)]
118
for start, end, step in test_ranges:
120
iter1 = xrange(start, end, step)
121
except OverflowError:
124
iter2 = pyrange(start, end, step)
125
test_id = "xrange({0}, {1}, {2})".format(start, end, step)
126
# check first 100 entries
127
self.assert_iterators_equal(iter1, iter2, test_id, limit=100)
130
iter1 = reversed(xrange(start, end, step))
131
except OverflowError:
134
iter2 = pyrange_reversed(start, end, step)
135
test_id = "reversed(xrange({0}, {1}, {2}))".format(
137
self.assert_iterators_equal(iter1, iter2, test_id, limit=100)
72
141
test.test_support.run_unittest(XrangeTest)