11c0423a2da8c98fad1e82b849fada06426db62f1Neal Norwitz# Python test set -- built-in functions
21c0423a2da8c98fad1e82b849fada06426db62f1Neal Norwitz
3e4fbb0206d0794b58d096beafd9964340ea26640Serhiy Storchakaimport unittest
41c0423a2da8c98fad1e82b849fada06426db62f1Neal Norwitzimport sys
57505607ae764d2095f15fcfb1a0f89843231ba7eAlexandre Vassalottiimport pickle
6d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinsonimport itertools
7639098c5911b88f03972e7fd44fe230a651cbc9bSerhiy Storchakaimport test.support
81c0423a2da8c98fad1e82b849fada06426db62f1Neal Norwitz
9d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson# pure Python implementations (3 args only), for comparison
10d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinsondef pyrange(start, stop, step):
11d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson    if (start - stop) // step < 0:
12d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson        # replace stop with next element in the sequence of integers
13d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson        # that are congruent to start modulo step.
14d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson        stop += (start - stop) % step
15d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson        while start != stop:
16d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson            yield start
17d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson            start += step
18d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson
19d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinsondef pyrange_reversed(start, stop, step):
20d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson    stop += (start - stop) % step
21d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson    return pyrange(stop - step, start - step, -step)
22d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson
23d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson
244ad94210d1b8477b0cb7a4bca2f39dc385ab21a2Walter Dörwaldclass RangeTest(unittest.TestCase):
25d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson    def assert_iterators_equal(self, xs, ys, test_id, limit=None):
26d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson        # check that an iterator xs matches the expected results ys,
27d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson        # up to a given limit.
28d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson        if limit is not None:
29d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson            xs = itertools.islice(xs, limit)
30d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson            ys = itertools.islice(ys, limit)
31d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson        sentinel = object()
32d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson        pairs = itertools.zip_longest(xs, ys, fillvalue=sentinel)
33d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson        for i, (x, y) in enumerate(pairs):
34d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson            if x == y:
35d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson                continue
36d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson            elif x == sentinel:
37d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson                self.fail('{}: iterator ended unexpectedly '
38d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson                          'at position {}; expected {}'.format(test_id, i, y))
39d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson            elif y == sentinel:
40d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson                self.fail('{}: unexpected excess element {} at '
41d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson                          'position {}'.format(test_id, x, i))
42d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson            else:
43d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson                self.fail('{}: wrong element at position {};'
44d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson                          'expected {}, got {}'.format(test_id, i, y, x))
45d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson
464ad94210d1b8477b0cb7a4bca2f39dc385ab21a2Walter Dörwald    def test_range(self):
47805365ee39298f93e433e19ae0dd87c6f782145bGuido van Rossum        self.assertEqual(list(range(3)), [0, 1, 2])
48805365ee39298f93e433e19ae0dd87c6f782145bGuido van Rossum        self.assertEqual(list(range(1, 5)), [1, 2, 3, 4])
49805365ee39298f93e433e19ae0dd87c6f782145bGuido van Rossum        self.assertEqual(list(range(0)), [])
50805365ee39298f93e433e19ae0dd87c6f782145bGuido van Rossum        self.assertEqual(list(range(-3)), [])
51805365ee39298f93e433e19ae0dd87c6f782145bGuido van Rossum        self.assertEqual(list(range(1, 10, 3)), [1, 4, 7])
52805365ee39298f93e433e19ae0dd87c6f782145bGuido van Rossum        self.assertEqual(list(range(5, -5, -3)), [5, 2, -1, -4])
531c0423a2da8c98fad1e82b849fada06426db62f1Neal Norwitz
541c0423a2da8c98fad1e82b849fada06426db62f1Neal Norwitz        a = 10
551c0423a2da8c98fad1e82b849fada06426db62f1Neal Norwitz        b = 100
561c0423a2da8c98fad1e82b849fada06426db62f1Neal Norwitz        c = 50
571c0423a2da8c98fad1e82b849fada06426db62f1Neal Norwitz
58805365ee39298f93e433e19ae0dd87c6f782145bGuido van Rossum        self.assertEqual(list(range(a, a+2)), [a, a+1])
59805365ee39298f93e433e19ae0dd87c6f782145bGuido van Rossum        self.assertEqual(list(range(a+2, a, -1)), [a+2, a+1])
60805365ee39298f93e433e19ae0dd87c6f782145bGuido van Rossum        self.assertEqual(list(range(a+4, a, -2)), [a+4, a+2])
611c0423a2da8c98fad1e82b849fada06426db62f1Neal Norwitz
62805365ee39298f93e433e19ae0dd87c6f782145bGuido van Rossum        seq = list(range(a, b, c))
63577473fe687b38c8f01b0c372d6d2563680045b3Benjamin Peterson        self.assertIn(a, seq)
64577473fe687b38c8f01b0c372d6d2563680045b3Benjamin Peterson        self.assertNotIn(b, seq)
651c0423a2da8c98fad1e82b849fada06426db62f1Neal Norwitz        self.assertEqual(len(seq), 2)
661c0423a2da8c98fad1e82b849fada06426db62f1Neal Norwitz
67805365ee39298f93e433e19ae0dd87c6f782145bGuido van Rossum        seq = list(range(b, a, -c))
68577473fe687b38c8f01b0c372d6d2563680045b3Benjamin Peterson        self.assertIn(b, seq)
69577473fe687b38c8f01b0c372d6d2563680045b3Benjamin Peterson        self.assertNotIn(a, seq)
701c0423a2da8c98fad1e82b849fada06426db62f1Neal Norwitz        self.assertEqual(len(seq), 2)
711c0423a2da8c98fad1e82b849fada06426db62f1Neal Norwitz
72805365ee39298f93e433e19ae0dd87c6f782145bGuido van Rossum        seq = list(range(-a, -b, -c))
73577473fe687b38c8f01b0c372d6d2563680045b3Benjamin Peterson        self.assertIn(-a, seq)
74577473fe687b38c8f01b0c372d6d2563680045b3Benjamin Peterson        self.assertNotIn(-b, seq)
751c0423a2da8c98fad1e82b849fada06426db62f1Neal Norwitz        self.assertEqual(len(seq), 2)
761c0423a2da8c98fad1e82b849fada06426db62f1Neal Norwitz
77805365ee39298f93e433e19ae0dd87c6f782145bGuido van Rossum        self.assertRaises(TypeError, range)
78805365ee39298f93e433e19ae0dd87c6f782145bGuido van Rossum        self.assertRaises(TypeError, range, 1, 2, 3, 4)
79805365ee39298f93e433e19ae0dd87c6f782145bGuido van Rossum        self.assertRaises(ValueError, range, 1, 2, 0)
801c0423a2da8c98fad1e82b849fada06426db62f1Neal Norwitz
81805365ee39298f93e433e19ae0dd87c6f782145bGuido van Rossum        self.assertRaises(TypeError, range, 0.0, 2, 1)
82805365ee39298f93e433e19ae0dd87c6f782145bGuido van Rossum        self.assertRaises(TypeError, range, 1, 2.0, 1)
83805365ee39298f93e433e19ae0dd87c6f782145bGuido van Rossum        self.assertRaises(TypeError, range, 1, 2, 1.0)
84805365ee39298f93e433e19ae0dd87c6f782145bGuido van Rossum        self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
851c0423a2da8c98fad1e82b849fada06426db62f1Neal Norwitz
86805365ee39298f93e433e19ae0dd87c6f782145bGuido van Rossum        self.assertRaises(TypeError, range, 0, "spam")
87805365ee39298f93e433e19ae0dd87c6f782145bGuido van Rossum        self.assertRaises(TypeError, range, 0, 42, "spam")
881c0423a2da8c98fad1e82b849fada06426db62f1Neal Norwitz
89a37d4c693a024154093b36a612810c3bd72d9254Christian Heimes        self.assertEqual(len(range(0, sys.maxsize, sys.maxsize-1)), 2)
90feec4533e21a612e9a5b665c27b1a3eb84e04bb3Tim Peters
91a37d4c693a024154093b36a612810c3bd72d9254Christian Heimes        r = range(-sys.maxsize, sys.maxsize, 2)
92a37d4c693a024154093b36a612810c3bd72d9254Christian Heimes        self.assertEqual(len(r), sys.maxsize)
93feec4533e21a612e9a5b665c27b1a3eb84e04bb3Tim Peters
948d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson    def test_large_operands(self):
958d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        x = range(10**20, 10**20+10, 3)
968d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(len(x), 4)
978d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(len(list(x)), 4)
988d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson
998d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        x = range(10**20+10, 10**20, 3)
1008d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(len(x), 0)
1018d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(len(list(x)), 0)
1028d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson
1038d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        x = range(10**20, 10**20+10, -3)
1048d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(len(x), 0)
1058d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(len(list(x)), 0)
1068d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson
1078d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        x = range(10**20+10, 10**20, -3)
1088d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(len(x), 4)
1098d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(len(list(x)), 4)
1108d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson
1118d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        # Now test range() with longs
1128d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(list(range(-2**100)), [])
1138d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(list(range(0, -2**100)), [])
1148d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(list(range(0, 2**100, -1)), [])
1158d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(list(range(0, 2**100, -1)), [])
1168d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson
1178d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        a = int(10 * sys.maxsize)
1188d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        b = int(100 * sys.maxsize)
1198d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        c = int(50 * sys.maxsize)
1208d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson
1218d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(list(range(a, a+2)), [a, a+1])
1228d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(list(range(a+2, a, -1)), [a+2, a+1])
1238d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(list(range(a+4, a, -2)), [a+4, a+2])
1248d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson
1258d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        seq = list(range(a, b, c))
1268d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertIn(a, seq)
1278d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertNotIn(b, seq)
1288d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(len(seq), 2)
129e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        self.assertEqual(seq[0], a)
130e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        self.assertEqual(seq[-1], a+c)
1318d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson
1328d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        seq = list(range(b, a, -c))
1338d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertIn(b, seq)
1348d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertNotIn(a, seq)
1358d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(len(seq), 2)
136e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        self.assertEqual(seq[0], b)
137e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        self.assertEqual(seq[-1], b-c)
1388d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson
1398d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        seq = list(range(-a, -b, -c))
1408d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertIn(-a, seq)
1418d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertNotIn(-b, seq)
1428d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(len(seq), 2)
143e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        self.assertEqual(seq[0], -a)
144e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        self.assertEqual(seq[-1], -a-c)
145e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan
146e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan    def test_large_range(self):
147e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        # Check long ranges (len > sys.maxsize)
148e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        # len() is expected to fail due to limitations of the __len__ protocol
149e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        def _range_len(x):
150e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan            try:
151e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan                length = len(x)
152e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan            except OverflowError:
153e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan                step = x[1] - x[0]
154e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan                length = 1 + ((x[-1] - x[0]) // step)
155e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan            return length
156e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        a = -sys.maxsize
157e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        b = sys.maxsize
158e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        expected_len = b - a
159e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        x = range(a, b)
160e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        self.assertIn(a, x)
161e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        self.assertNotIn(b, x)
162e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        self.assertRaises(OverflowError, len, x)
163e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        self.assertEqual(_range_len(x), expected_len)
164e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        self.assertEqual(x[0], a)
165e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        idx = sys.maxsize+1
166e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        self.assertEqual(x[idx], a+idx)
167e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        self.assertEqual(x[idx:idx+1][0], a+idx)
168e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        with self.assertRaises(IndexError):
169e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan            x[-expected_len-1]
170e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        with self.assertRaises(IndexError):
171e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan            x[expected_len]
172e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan
173e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        a = 0
174e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        b = 2 * sys.maxsize
175e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        expected_len = b - a
176e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        x = range(a, b)
177e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        self.assertIn(a, x)
178e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        self.assertNotIn(b, x)
179e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        self.assertRaises(OverflowError, len, x)
180e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        self.assertEqual(_range_len(x), expected_len)
181e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        self.assertEqual(x[0], a)
182e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        idx = sys.maxsize+1
183e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        self.assertEqual(x[idx], a+idx)
184e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        self.assertEqual(x[idx:idx+1][0], a+idx)
185e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        with self.assertRaises(IndexError):
186e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan            x[-expected_len-1]
187e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        with self.assertRaises(IndexError):
188e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan            x[expected_len]
189e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan
190e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        a = 0
191e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        b = sys.maxsize**10
192e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        c = 2*sys.maxsize
193e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        expected_len = 1 + (b - a) // c
194e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        x = range(a, b, c)
195e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        self.assertIn(a, x)
196e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        self.assertNotIn(b, x)
197e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        self.assertRaises(OverflowError, len, x)
198e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        self.assertEqual(_range_len(x), expected_len)
199e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        self.assertEqual(x[0], a)
200e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        idx = sys.maxsize+1
201e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        self.assertEqual(x[idx], a+(idx*c))
202e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        self.assertEqual(x[idx:idx+1][0], a+(idx*c))
203e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        with self.assertRaises(IndexError):
204e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan            x[-expected_len-1]
205e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        with self.assertRaises(IndexError):
206e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan            x[expected_len]
207e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan
208e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        a = sys.maxsize**10
209e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        b = 0
210e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        c = -2*sys.maxsize
211e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        expected_len = 1 + (b - a) // c
212e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        x = range(a, b, c)
213e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        self.assertIn(a, x)
214e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        self.assertNotIn(b, x)
215e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        self.assertRaises(OverflowError, len, x)
216e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        self.assertEqual(_range_len(x), expected_len)
217e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        self.assertEqual(x[0], a)
218e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        idx = sys.maxsize+1
219e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        self.assertEqual(x[idx], a+(idx*c))
220e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        self.assertEqual(x[idx:idx+1][0], a+(idx*c))
221e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        with self.assertRaises(IndexError):
222e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan            x[-expected_len-1]
223e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan        with self.assertRaises(IndexError):
224e993b10041cd746e570c388ba13a7f0ee260a4c2Nick Coghlan            x[expected_len]
2258d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson
2268d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson    def test_invalid_invocation(self):
2278d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertRaises(TypeError, range)
2288d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertRaises(TypeError, range, 1, 2, 3, 4)
2298d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertRaises(ValueError, range, 1, 2, 0)
230d57bb55c7d8f98aacb568ab6e32155acedb12ca2Benjamin Peterson        a = int(10 * sys.maxsize)
2318d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertRaises(ValueError, range, a, a + 1, int(0))
2328d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertRaises(TypeError, range, 1., 1., 1.)
2338d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
2348d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertRaises(TypeError, range, 0, "spam")
2358d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertRaises(TypeError, range, 0, 42, "spam")
2368d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        # Exercise various combinations of bad arguments, to check
2378d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        # refcounting logic
2388d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertRaises(TypeError, range, 0.0)
2398d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertRaises(TypeError, range, 0, 0.0)
2408d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertRaises(TypeError, range, 0.0, 0)
2418d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertRaises(TypeError, range, 0.0, 0.0)
2428d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertRaises(TypeError, range, 0, 0, 1.0)
2438d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertRaises(TypeError, range, 0, 0.0, 1)
2448d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertRaises(TypeError, range, 0, 0.0, 1.0)
2458d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertRaises(TypeError, range, 0.0, 0, 1)
2468d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertRaises(TypeError, range, 0.0, 0, 1.0)
2478d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertRaises(TypeError, range, 0.0, 0.0, 1)
2488d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertRaises(TypeError, range, 0.0, 0.0, 1.0)
2498d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson
2508d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson    def test_index(self):
2518d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        u = range(2)
2528d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(u.index(0), 0)
2538d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(u.index(1), 1)
2548d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertRaises(ValueError, u.index, 2)
2558d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson
2568d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        u = range(-2, 3)
2578d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(u.count(0), 1)
2588d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(u.index(0), 2)
2598d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertRaises(TypeError, u.index)
2608d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson
2618d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        class BadExc(Exception):
2628d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson            pass
2638d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson
2648d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        class BadCmp:
2658d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson            def __eq__(self, other):
2668d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson                if other == 2:
2678d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson                    raise BadExc()
2688d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson                return False
2698d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson
2708d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        a = range(4)
2718d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertRaises(BadExc, a.index, BadCmp())
2728d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson
2738d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        a = range(-2, 3)
2748d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(a.index(0), 2)
2758d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(range(1, 10, 3).index(4), 1)
2768d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(range(1, -10, -3).index(-5), 2)
2778d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson
2788d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(range(10**20).index(1), 1)
2798d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(range(10**20).index(10**20 - 1), 10**20 - 1)
2808d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson
2818d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertRaises(ValueError, range(1, 2**100, 2).index, 2**87)
2828d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(range(1, 2**100, 2).index(2**87+1), 2**86)
2838d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson
2848d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        class AlwaysEqual(object):
2858d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson            def __eq__(self, other):
2868d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson                return True
2878d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        always_equal = AlwaysEqual()
288d57bb55c7d8f98aacb568ab6e32155acedb12ca2Benjamin Peterson        self.assertEqual(range(10).index(always_equal), 0)
2898d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson
2908d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson    def test_user_index_method(self):
2918d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        bignum = 2*sys.maxsize
2928d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        smallnum = 42
2938d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson
2948d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        # User-defined class with an __index__ method
2958d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        class I:
2968d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson            def __init__(self, n):
2978d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson                self.n = int(n)
2988d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson            def __index__(self):
2998d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson                return self.n
3008d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(list(range(I(bignum), I(bignum + 1))), [bignum])
3018d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(list(range(I(smallnum), I(smallnum + 1))), [smallnum])
3028d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson
3038d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        # User-defined class with a failing __index__ method
3048d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        class IX:
3058d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson            def __index__(self):
3068d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson                raise RuntimeError
3078d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertRaises(RuntimeError, range, IX())
3088d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson
3098d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        # User-defined class with an invalid __index__ method
3108d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        class IN:
3118d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson            def __index__(self):
3128d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson                return "not a number"
3138d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson
3148d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertRaises(TypeError, range, IN())
3158d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson
3168cd1c7681d86fd3d32096f2d927d3f5014d58c36Mark Dickinson        # Test use of user-defined classes in slice indices.
317c992fafddc6a2920084d2bce63d50d49f11854a0Mark Dickinson        self.assertEqual(range(10)[:I(5)], range(5))
3188cd1c7681d86fd3d32096f2d927d3f5014d58c36Mark Dickinson
3198cd1c7681d86fd3d32096f2d927d3f5014d58c36Mark Dickinson        with self.assertRaises(RuntimeError):
3208cd1c7681d86fd3d32096f2d927d3f5014d58c36Mark Dickinson            range(0, 10)[:IX()]
3218cd1c7681d86fd3d32096f2d927d3f5014d58c36Mark Dickinson
3228cd1c7681d86fd3d32096f2d927d3f5014d58c36Mark Dickinson        with self.assertRaises(TypeError):
3238cd1c7681d86fd3d32096f2d927d3f5014d58c36Mark Dickinson            range(0, 10)[:IN()]
3248cd1c7681d86fd3d32096f2d927d3f5014d58c36Mark Dickinson
3258d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson    def test_count(self):
3268d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(range(3).count(-1), 0)
3278d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(range(3).count(0), 1)
3288d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(range(3).count(1), 1)
3298d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(range(3).count(2), 1)
3308d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(range(3).count(3), 0)
3318d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertIs(type(range(3).count(-1)), int)
3328d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertIs(type(range(3).count(1)), int)
3338d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(range(10**20).count(1), 1)
3348d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(range(10**20).count(10**20), 0)
3358d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(range(3).index(1), 1)
3368d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(range(1, 2**100, 2).count(2**87), 0)
3378d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(range(1, 2**100, 2).count(2**87+1), 1)
3388d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson
3398d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        class AlwaysEqual(object):
3408d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson            def __eq__(self, other):
3418d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson                return True
3428d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        always_equal = AlwaysEqual()
3438d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson        self.assertEqual(range(10).count(always_equal), 10)
3448d16ab3c5608d7e3f4cb5177d84397732b4a1587Benjamin Peterson
34537ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan        self.assertEqual(len(range(sys.maxsize, sys.maxsize+10)), 10)
34637ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan
34767d999305f221dc8c7db7bf8395fcd3aae786f4dWalter Dörwald    def test_repr(self):
34803b43d8a77f188f836262c201160a7ba9f2174bcWalter Dörwald        self.assertEqual(repr(range(1)), 'range(0, 1)')
34967d999305f221dc8c7db7bf8395fcd3aae786f4dWalter Dörwald        self.assertEqual(repr(range(1, 2)), 'range(1, 2)')
35067d999305f221dc8c7db7bf8395fcd3aae786f4dWalter Dörwald        self.assertEqual(repr(range(1, 2, 3)), 'range(1, 2, 3)')
35167d999305f221dc8c7db7bf8395fcd3aae786f4dWalter Dörwald
3527505607ae764d2095f15fcfb1a0f89843231ba7eAlexandre Vassalotti    def test_pickling(self):
3537505607ae764d2095f15fcfb1a0f89843231ba7eAlexandre Vassalotti        testcases = [(13,), (0, 11), (-22, 10), (20, 3, -1),
35431668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson                     (13, 21, 3), (-2, 2, 2), (2**65, 2**65+2)]
355d0d0b65885a25aa3d33502ee9b0e6f26d11f4531Hirokazu Yamamoto        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
3567505607ae764d2095f15fcfb1a0f89843231ba7eAlexandre Vassalotti            for t in testcases:
3578f2ee6e407fe38375095f488b18d2c8c0cbab631Antoine Pitrou                with self.subTest(proto=proto, test=t):
3588f2ee6e407fe38375095f488b18d2c8c0cbab631Antoine Pitrou                    r = range(*t)
3598f2ee6e407fe38375095f488b18d2c8c0cbab631Antoine Pitrou                    self.assertEqual(list(pickle.loads(pickle.dumps(r, proto))),
3608f2ee6e407fe38375095f488b18d2c8c0cbab631Antoine Pitrou                                     list(r))
3617505607ae764d2095f15fcfb1a0f89843231ba7eAlexandre Vassalotti
36231668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson    def test_iterator_pickling(self):
36331668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson        testcases = [(13,), (0, 11), (-22, 10), (20, 3, -1),
36431668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson                     (13, 21, 3), (-2, 2, 2), (2**65, 2**65+2)]
36531668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
36631668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson            for t in testcases:
36731668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson                it = itorg = iter(range(*t))
36831668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson                data = list(range(*t))
36931668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson
370bad1257c96943dcb39584a41e1a178542479df97Serhiy Storchaka                d = pickle.dumps(it, proto)
37131668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson                it = pickle.loads(d)
37231668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson                self.assertEqual(type(itorg), type(it))
37331668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson                self.assertEqual(list(it), data)
37431668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson
37531668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson                it = pickle.loads(d)
37631668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson                try:
37731668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson                    next(it)
37831668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson                except StopIteration:
37931668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson                    continue
380bad1257c96943dcb39584a41e1a178542479df97Serhiy Storchaka                d = pickle.dumps(it, proto)
38131668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson                it = pickle.loads(d)
38231668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson                self.assertEqual(list(it), data[1:])
38331668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson
3844ca688edeb07de955e1ef67c11f0e327f12ffa6eKristján Valur Jónsson    def test_exhausted_iterator_pickling(self):
385bad1257c96943dcb39584a41e1a178542479df97Serhiy Storchaka        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
386bad1257c96943dcb39584a41e1a178542479df97Serhiy Storchaka            r = range(2**65, 2**65+2)
387bad1257c96943dcb39584a41e1a178542479df97Serhiy Storchaka            i = iter(r)
388bad1257c96943dcb39584a41e1a178542479df97Serhiy Storchaka            while True:
389bad1257c96943dcb39584a41e1a178542479df97Serhiy Storchaka                r = next(i)
390bad1257c96943dcb39584a41e1a178542479df97Serhiy Storchaka                if r == 2**65+1:
391bad1257c96943dcb39584a41e1a178542479df97Serhiy Storchaka                    break
392bad1257c96943dcb39584a41e1a178542479df97Serhiy Storchaka            d = pickle.dumps(i, proto)
393bad1257c96943dcb39584a41e1a178542479df97Serhiy Storchaka            i2 = pickle.loads(d)
394bad1257c96943dcb39584a41e1a178542479df97Serhiy Storchaka            self.assertEqual(list(i), [])
395bad1257c96943dcb39584a41e1a178542479df97Serhiy Storchaka            self.assertEqual(list(i2), [])
39625dded041fe532fcb041b6e68582bf76b4968132Kristján Valur Jónsson
39725dded041fe532fcb041b6e68582bf76b4968132Kristján Valur Jónsson    def test_large_exhausted_iterator_pickling(self):
398bad1257c96943dcb39584a41e1a178542479df97Serhiy Storchaka        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
399bad1257c96943dcb39584a41e1a178542479df97Serhiy Storchaka            r = range(20)
400bad1257c96943dcb39584a41e1a178542479df97Serhiy Storchaka            i = iter(r)
401bad1257c96943dcb39584a41e1a178542479df97Serhiy Storchaka            while True:
402bad1257c96943dcb39584a41e1a178542479df97Serhiy Storchaka                r = next(i)
403bad1257c96943dcb39584a41e1a178542479df97Serhiy Storchaka                if r == 19:
404bad1257c96943dcb39584a41e1a178542479df97Serhiy Storchaka                    break
405bad1257c96943dcb39584a41e1a178542479df97Serhiy Storchaka            d = pickle.dumps(i, proto)
406bad1257c96943dcb39584a41e1a178542479df97Serhiy Storchaka            i2 = pickle.loads(d)
407bad1257c96943dcb39584a41e1a178542479df97Serhiy Storchaka            self.assertEqual(list(i), [])
408bad1257c96943dcb39584a41e1a178542479df97Serhiy Storchaka            self.assertEqual(list(i2), [])
4094ca688edeb07de955e1ef67c11f0e327f12ffa6eKristján Valur Jónsson
41094f55837775f00eade742fa015d818633ab68318Raymond Hettinger    def test_odd_bug(self):
41194f55837775f00eade742fa015d818633ab68318Raymond Hettinger        # This used to raise a "SystemError: NULL result without error"
41294f55837775f00eade742fa015d818633ab68318Raymond Hettinger        # because the range validation step was eating the exception
41394f55837775f00eade742fa015d818633ab68318Raymond Hettinger        # before NULL was returned.
41494f55837775f00eade742fa015d818633ab68318Raymond Hettinger        with self.assertRaises(TypeError):
41594f55837775f00eade742fa015d818633ab68318Raymond Hettinger            range([], 1, -1)
41694f55837775f00eade742fa015d818633ab68318Raymond Hettinger
4173e124ae739db8dc6ad43687d6b14466a572a6f8eMark Dickinson    def test_types(self):
4183e124ae739db8dc6ad43687d6b14466a572a6f8eMark Dickinson        # Non-integer objects *equal* to any of the range's items are supposed
4193e124ae739db8dc6ad43687d6b14466a572a6f8eMark Dickinson        # to be contained in the range.
420577473fe687b38c8f01b0c372d6d2563680045b3Benjamin Peterson        self.assertIn(1.0, range(3))
421577473fe687b38c8f01b0c372d6d2563680045b3Benjamin Peterson        self.assertIn(True, range(3))
422577473fe687b38c8f01b0c372d6d2563680045b3Benjamin Peterson        self.assertIn(1+0j, range(3))
4233e124ae739db8dc6ad43687d6b14466a572a6f8eMark Dickinson
4243e124ae739db8dc6ad43687d6b14466a572a6f8eMark Dickinson        class C1:
4253e124ae739db8dc6ad43687d6b14466a572a6f8eMark Dickinson            def __eq__(self, other): return True
426577473fe687b38c8f01b0c372d6d2563680045b3Benjamin Peterson        self.assertIn(C1(), range(3))
4273e124ae739db8dc6ad43687d6b14466a572a6f8eMark Dickinson
4283e124ae739db8dc6ad43687d6b14466a572a6f8eMark Dickinson        # Objects are never coerced into other types for comparison.
4293e124ae739db8dc6ad43687d6b14466a572a6f8eMark Dickinson        class C2:
4303e124ae739db8dc6ad43687d6b14466a572a6f8eMark Dickinson            def __int__(self): return 1
4313e124ae739db8dc6ad43687d6b14466a572a6f8eMark Dickinson            def __index__(self): return 1
432b58e0bd8bb7592dd48b30af546fc20f52ac625bdEzio Melotti        self.assertNotIn(C2(), range(3))
4333e124ae739db8dc6ad43687d6b14466a572a6f8eMark Dickinson        # ..except if explicitly told so.
434577473fe687b38c8f01b0c372d6d2563680045b3Benjamin Peterson        self.assertIn(int(C2()), range(3))
4353e124ae739db8dc6ad43687d6b14466a572a6f8eMark Dickinson
436418f81d9b65ca2c7942ff9c422ad01d5050a808fMark Dickinson        # Check that the range.__contains__ optimization is only
437418f81d9b65ca2c7942ff9c422ad01d5050a808fMark Dickinson        # used for ints, not for instances of subclasses of int.
438418f81d9b65ca2c7942ff9c422ad01d5050a808fMark Dickinson        class C3(int):
439418f81d9b65ca2c7942ff9c422ad01d5050a808fMark Dickinson            def __eq__(self, other): return True
440577473fe687b38c8f01b0c372d6d2563680045b3Benjamin Peterson        self.assertIn(C3(11), range(10))
441577473fe687b38c8f01b0c372d6d2563680045b3Benjamin Peterson        self.assertIn(C3(11), list(range(10)))
4423e124ae739db8dc6ad43687d6b14466a572a6f8eMark Dickinson
4433e124ae739db8dc6ad43687d6b14466a572a6f8eMark Dickinson    def test_strided_limits(self):
4443e124ae739db8dc6ad43687d6b14466a572a6f8eMark Dickinson        r = range(0, 101, 2)
445577473fe687b38c8f01b0c372d6d2563680045b3Benjamin Peterson        self.assertIn(0, r)
446b58e0bd8bb7592dd48b30af546fc20f52ac625bdEzio Melotti        self.assertNotIn(1, r)
447577473fe687b38c8f01b0c372d6d2563680045b3Benjamin Peterson        self.assertIn(2, r)
448b58e0bd8bb7592dd48b30af546fc20f52ac625bdEzio Melotti        self.assertNotIn(99, r)
449577473fe687b38c8f01b0c372d6d2563680045b3Benjamin Peterson        self.assertIn(100, r)
450b58e0bd8bb7592dd48b30af546fc20f52ac625bdEzio Melotti        self.assertNotIn(101, r)
4513e124ae739db8dc6ad43687d6b14466a572a6f8eMark Dickinson
4523e124ae739db8dc6ad43687d6b14466a572a6f8eMark Dickinson        r = range(0, -20, -1)
453577473fe687b38c8f01b0c372d6d2563680045b3Benjamin Peterson        self.assertIn(0, r)
454577473fe687b38c8f01b0c372d6d2563680045b3Benjamin Peterson        self.assertIn(-1, r)
455577473fe687b38c8f01b0c372d6d2563680045b3Benjamin Peterson        self.assertIn(-19, r)
456b58e0bd8bb7592dd48b30af546fc20f52ac625bdEzio Melotti        self.assertNotIn(-20, r)
4573e124ae739db8dc6ad43687d6b14466a572a6f8eMark Dickinson
4583e124ae739db8dc6ad43687d6b14466a572a6f8eMark Dickinson        r = range(0, -20, -2)
459577473fe687b38c8f01b0c372d6d2563680045b3Benjamin Peterson        self.assertIn(-18, r)
460b58e0bd8bb7592dd48b30af546fc20f52ac625bdEzio Melotti        self.assertNotIn(-19, r)
461b58e0bd8bb7592dd48b30af546fc20f52ac625bdEzio Melotti        self.assertNotIn(-20, r)
4623e124ae739db8dc6ad43687d6b14466a572a6f8eMark Dickinson
4633e124ae739db8dc6ad43687d6b14466a572a6f8eMark Dickinson    def test_empty(self):
4643e124ae739db8dc6ad43687d6b14466a572a6f8eMark Dickinson        r = range(0)
465b58e0bd8bb7592dd48b30af546fc20f52ac625bdEzio Melotti        self.assertNotIn(0, r)
466b58e0bd8bb7592dd48b30af546fc20f52ac625bdEzio Melotti        self.assertNotIn(1, r)
4673e124ae739db8dc6ad43687d6b14466a572a6f8eMark Dickinson
4683e124ae739db8dc6ad43687d6b14466a572a6f8eMark Dickinson        r = range(0, -10)
469b58e0bd8bb7592dd48b30af546fc20f52ac625bdEzio Melotti        self.assertNotIn(0, r)
470b58e0bd8bb7592dd48b30af546fc20f52ac625bdEzio Melotti        self.assertNotIn(-1, r)
471b58e0bd8bb7592dd48b30af546fc20f52ac625bdEzio Melotti        self.assertNotIn(1, r)
4723e124ae739db8dc6ad43687d6b14466a572a6f8eMark Dickinson
473d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson    def test_range_iterators(self):
474d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson        # exercise 'fast' iterators, that use a rangeiterobject internally.
475d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson        # see issue 7298
476d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson        limits = [base + jiggle
477d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson                  for M in (2**32, 2**64)
478d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson                  for base in (-M, -M//2, 0, M//2, M)
479d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson                  for jiggle in (-2, -1, 0, 1, 2)]
480d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson        test_ranges = [(start, end, step)
481d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson                       for start in limits
482d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson                       for end in limits
483d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson                       for step in (-2**63, -2**31, -2, -1, 1, 2)]
484d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson
485d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson        for start, end, step in test_ranges:
486d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson            iter1 = range(start, end, step)
487d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson            iter2 = pyrange(start, end, step)
488d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson            test_id = "range({}, {}, {})".format(start, end, step)
489d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson            # check first 100 entries
490d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson            self.assert_iterators_equal(iter1, iter2, test_id, limit=100)
491d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson
492d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson            iter1 = reversed(range(start, end, step))
493d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson            iter2 = pyrange_reversed(start, end, step)
494d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson            test_id = "reversed(range({}, {}, {}))".format(start, end, step)
495d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson            self.assert_iterators_equal(iter1, iter2, test_id, limit=100)
496d550c9a281fd9a909f84a4f29d2d9a0be9187685Mark Dickinson
49744759bcf13d6b47323fd4c6e4d62b7146ed0a5b1Serhiy Storchaka    @test.support.cpython_only
49844759bcf13d6b47323fd4c6e4d62b7146ed0a5b1Serhiy Storchaka    def test_range_iterator_invocation(self):
49944759bcf13d6b47323fd4c6e4d62b7146ed0a5b1Serhiy Storchaka        import _testcapi
50044759bcf13d6b47323fd4c6e4d62b7146ed0a5b1Serhiy Storchaka        rangeiter_type = type(iter(range(0)))
50144759bcf13d6b47323fd4c6e4d62b7146ed0a5b1Serhiy Storchaka
502c7f490c8b19d5458d692f243279f7ad898f13ec4Serhiy Storchaka        self.assertWarns(DeprecationWarning, rangeiter_type, 1, 3, 1)
503c7f490c8b19d5458d692f243279f7ad898f13ec4Serhiy Storchaka
504c7f490c8b19d5458d692f243279f7ad898f13ec4Serhiy Storchaka        with test.support.check_warnings(('', DeprecationWarning)):
505c7f490c8b19d5458d692f243279f7ad898f13ec4Serhiy Storchaka            # rangeiter_new doesn't take keyword arguments
506c7f490c8b19d5458d692f243279f7ad898f13ec4Serhiy Storchaka            with self.assertRaises(TypeError):
507c7f490c8b19d5458d692f243279f7ad898f13ec4Serhiy Storchaka                rangeiter_type(a=1)
508c7f490c8b19d5458d692f243279f7ad898f13ec4Serhiy Storchaka
509c7f490c8b19d5458d692f243279f7ad898f13ec4Serhiy Storchaka            # rangeiter_new takes exactly 3 arguments
510c7f490c8b19d5458d692f243279f7ad898f13ec4Serhiy Storchaka            self.assertRaises(TypeError, rangeiter_type)
511c7f490c8b19d5458d692f243279f7ad898f13ec4Serhiy Storchaka            self.assertRaises(TypeError, rangeiter_type, 1)
512c7f490c8b19d5458d692f243279f7ad898f13ec4Serhiy Storchaka            self.assertRaises(TypeError, rangeiter_type, 1, 1)
513c7f490c8b19d5458d692f243279f7ad898f13ec4Serhiy Storchaka            self.assertRaises(TypeError, rangeiter_type, 1, 1, 1, 1)
514c7f490c8b19d5458d692f243279f7ad898f13ec4Serhiy Storchaka
515c7f490c8b19d5458d692f243279f7ad898f13ec4Serhiy Storchaka            # start, stop and stop must fit in C long
516c7f490c8b19d5458d692f243279f7ad898f13ec4Serhiy Storchaka            for good_val in [_testcapi.LONG_MAX, _testcapi.LONG_MIN]:
517c7f490c8b19d5458d692f243279f7ad898f13ec4Serhiy Storchaka                rangeiter_type(good_val, good_val, good_val)
518c7f490c8b19d5458d692f243279f7ad898f13ec4Serhiy Storchaka            for bad_val in [_testcapi.LONG_MAX + 1, _testcapi.LONG_MIN - 1]:
519c7f490c8b19d5458d692f243279f7ad898f13ec4Serhiy Storchaka                self.assertRaises(OverflowError,
520c7f490c8b19d5458d692f243279f7ad898f13ec4Serhiy Storchaka                                  rangeiter_type, bad_val, 1, 1)
521c7f490c8b19d5458d692f243279f7ad898f13ec4Serhiy Storchaka                self.assertRaises(OverflowError,
522c7f490c8b19d5458d692f243279f7ad898f13ec4Serhiy Storchaka                                  rangeiter_type, 1, bad_val, 1)
523c7f490c8b19d5458d692f243279f7ad898f13ec4Serhiy Storchaka                self.assertRaises(OverflowError,
524c7f490c8b19d5458d692f243279f7ad898f13ec4Serhiy Storchaka                                  rangeiter_type, 1, 1, bad_val)
525c7f490c8b19d5458d692f243279f7ad898f13ec4Serhiy Storchaka
526c7f490c8b19d5458d692f243279f7ad898f13ec4Serhiy Storchaka            # step mustn't be zero
527c7f490c8b19d5458d692f243279f7ad898f13ec4Serhiy Storchaka            self.assertRaises(ValueError, rangeiter_type, 1, 1, 0)
52844759bcf13d6b47323fd4c6e4d62b7146ed0a5b1Serhiy Storchaka
52937ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan    def test_slice(self):
53037ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan        def check(start, stop, step=None):
53137ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan            i = slice(start, stop, step)
53237ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan            self.assertEqual(list(r[i]), list(r)[i])
53337ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan            self.assertEqual(len(r[i]), len(list(r)[i]))
53437ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan        for r in [range(10),
53537ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan                  range(0),
53637ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan                  range(1, 9, 3),
53737ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan                  range(8, 0, -3),
53837ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan                  range(sys.maxsize+1, sys.maxsize+10),
53937ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan                  ]:
54037ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan            check(0, 2)
54137ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan            check(0, 20)
54237ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan            check(1, 2)
54337ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan            check(20, 30)
54437ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan            check(-30, -20)
54537ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan            check(-1, 100, 2)
54637ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan            check(0, -1)
54737ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan            check(-1, -3, -1)
54837ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan
54937ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan    def test_contains(self):
55037ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan        r = range(10)
55137ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan        self.assertIn(0, r)
55237ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan        self.assertIn(1, r)
55337ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan        self.assertIn(5.0, r)
55437ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan        self.assertNotIn(5.1, r)
55537ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan        self.assertNotIn(-1, r)
55637ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan        self.assertNotIn(10, r)
55737ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan        self.assertNotIn("", r)
55837ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan        r = range(9, -1, -1)
55937ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan        self.assertIn(0, r)
56037ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan        self.assertIn(1, r)
56137ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan        self.assertIn(5.0, r)
56237ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan        self.assertNotIn(5.1, r)
56337ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan        self.assertNotIn(-1, r)
56437ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan        self.assertNotIn(10, r)
56537ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan        self.assertNotIn("", r)
56637ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan        r = range(0, 10, 2)
56737ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan        self.assertIn(0, r)
56837ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan        self.assertNotIn(1, r)
56937ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan        self.assertNotIn(5.0, r)
57037ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan        self.assertNotIn(5.1, r)
57137ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan        self.assertNotIn(-1, r)
57237ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan        self.assertNotIn(10, r)
57337ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan        self.assertNotIn("", r)
57437ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan        r = range(9, -1, -2)
57537ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan        self.assertNotIn(0, r)
57637ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan        self.assertIn(1, r)
57737ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan        self.assertIn(5.0, r)
57837ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan        self.assertNotIn(5.1, r)
57937ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan        self.assertNotIn(-1, r)
58037ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan        self.assertNotIn(10, r)
58137ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan        self.assertNotIn("", r)
58237ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan
58337ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan    def test_reverse_iteration(self):
58437ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan        for r in [range(10),
58537ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan                  range(0),
58637ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan                  range(1, 9, 3),
58737ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan                  range(8, 0, -3),
58837ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan                  range(sys.maxsize+1, sys.maxsize+10),
58937ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan                  ]:
59037ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan            self.assertEqual(list(reversed(r)), list(r)[::-1])
59137ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan
592982ef4e0bc2b1def1117238fb5292cca5dfa2891Ezio Melotti    def test_issue11845(self):
593982ef4e0bc2b1def1117238fb5292cca5dfa2891Ezio Melotti        r = range(*slice(1, 18, 2).indices(20))
594982ef4e0bc2b1def1117238fb5292cca5dfa2891Ezio Melotti        values = {None, 0, 1, -1, 2, -2, 5, -5, 19, -19,
595982ef4e0bc2b1def1117238fb5292cca5dfa2891Ezio Melotti                  20, -20, 21, -21, 30, -30, 99, -99}
596982ef4e0bc2b1def1117238fb5292cca5dfa2891Ezio Melotti        for i in values:
597982ef4e0bc2b1def1117238fb5292cca5dfa2891Ezio Melotti            for j in values:
598982ef4e0bc2b1def1117238fb5292cca5dfa2891Ezio Melotti                for k in values - {0}:
599982ef4e0bc2b1def1117238fb5292cca5dfa2891Ezio Melotti                    r[i:j:k]
600982ef4e0bc2b1def1117238fb5292cca5dfa2891Ezio Melotti
60136645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson    def test_comparison(self):
60236645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson        test_ranges = [range(0), range(0, -1), range(1, 1, 3),
60336645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson                       range(1), range(5, 6), range(5, 6, 2),
60436645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson                       range(5, 7, 2), range(2), range(0, 4, 2),
60536645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson                       range(0, 5, 2), range(0, 6, 2)]
60636645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson        test_tuples = list(map(tuple, test_ranges))
60736645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson
60836645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson        # Check that equality of ranges matches equality of the corresponding
60936645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson        # tuples for each pair from the test lists above.
61036645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson        ranges_eq = [a == b for a in test_ranges for b in test_ranges]
61136645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson        tuples_eq = [a == b for a in test_tuples for b in test_tuples]
61236645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson        self.assertEqual(ranges_eq, tuples_eq)
61336645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson
61436645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson        # Check that != correctly gives the logical negation of ==
61536645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson        ranges_ne = [a != b for a in test_ranges for b in test_ranges]
61636645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson        self.assertEqual(ranges_ne, [not x for x in ranges_eq])
61736645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson
61836645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson        # Equal ranges should have equal hashes.
61936645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson        for a in test_ranges:
62036645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson            for b in test_ranges:
62136645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson                if a == b:
62236645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson                    self.assertEqual(hash(a), hash(b))
62336645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson
62436645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson        # Ranges are unequal to other types (even sequence types)
62536645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson        self.assertIs(range(0) == (), False)
62636645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson        self.assertIs(() == range(0), False)
62736645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson        self.assertIs(range(2) == [0, 1], False)
62836645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson
62936645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson        # Huge integers aren't a problem.
63036645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson        self.assertEqual(range(0, 2**100 - 1, 2),
63136645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson                         range(0, 2**100, 2))
63236645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson        self.assertEqual(hash(range(0, 2**100 - 1, 2)),
63336645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson                         hash(range(0, 2**100, 2)))
63436645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson        self.assertNotEqual(range(0, 2**100, 2),
63536645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson                            range(0, 2**100 + 1, 2))
63636645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson        self.assertEqual(range(2**200, 2**201 - 2**99, 2**100),
63736645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson                         range(2**200, 2**201, 2**100))
63836645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson        self.assertEqual(hash(range(2**200, 2**201 - 2**99, 2**100)),
63936645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson                         hash(range(2**200, 2**201, 2**100)))
64036645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson        self.assertNotEqual(range(2**200, 2**201, 2**100),
64136645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson                            range(2**200, 2**201 + 1, 2**100))
64236645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson
64336645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson        # Order comparisons are not implemented for ranges.
64436645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson        with self.assertRaises(TypeError):
64536645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson            range(0) < range(0)
64636645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson        with self.assertRaises(TypeError):
64736645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson            range(0) > range(0)
64836645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson        with self.assertRaises(TypeError):
64936645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson            range(0) <= range(0)
65036645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson        with self.assertRaises(TypeError):
65136645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson            range(0) >= range(0)
65236645681c8ad9a30d142f1dabb44d1d6c3ed5fabMark Dickinson
65337ee850b1073f3b8e85855ed02d5dc3d11c5fe62Nick Coghlan
654878ce389a08594a805cf382a73414be02143396cBenjamin Peterson    def test_attributes(self):
655878ce389a08594a805cf382a73414be02143396cBenjamin Peterson        # test the start, stop and step attributes of range objects
656878ce389a08594a805cf382a73414be02143396cBenjamin Peterson        self.assert_attrs(range(0), 0, 0, 1)
657878ce389a08594a805cf382a73414be02143396cBenjamin Peterson        self.assert_attrs(range(10), 0, 10, 1)
658878ce389a08594a805cf382a73414be02143396cBenjamin Peterson        self.assert_attrs(range(-10), 0, -10, 1)
659878ce389a08594a805cf382a73414be02143396cBenjamin Peterson        self.assert_attrs(range(0, 10, 1), 0, 10, 1)
660878ce389a08594a805cf382a73414be02143396cBenjamin Peterson        self.assert_attrs(range(0, 10, 3), 0, 10, 3)
661878ce389a08594a805cf382a73414be02143396cBenjamin Peterson        self.assert_attrs(range(10, 0, -1), 10, 0, -1)
662878ce389a08594a805cf382a73414be02143396cBenjamin Peterson        self.assert_attrs(range(10, 0, -3), 10, 0, -3)
663878ce389a08594a805cf382a73414be02143396cBenjamin Peterson
664878ce389a08594a805cf382a73414be02143396cBenjamin Peterson    def assert_attrs(self, rangeobj, start, stop, step):
665878ce389a08594a805cf382a73414be02143396cBenjamin Peterson        self.assertEqual(rangeobj.start, start)
666878ce389a08594a805cf382a73414be02143396cBenjamin Peterson        self.assertEqual(rangeobj.stop, stop)
667878ce389a08594a805cf382a73414be02143396cBenjamin Peterson        self.assertEqual(rangeobj.step, step)
668878ce389a08594a805cf382a73414be02143396cBenjamin Peterson
669878ce389a08594a805cf382a73414be02143396cBenjamin Peterson        with self.assertRaises(AttributeError):
670878ce389a08594a805cf382a73414be02143396cBenjamin Peterson            rangeobj.start = 0
671878ce389a08594a805cf382a73414be02143396cBenjamin Peterson        with self.assertRaises(AttributeError):
672878ce389a08594a805cf382a73414be02143396cBenjamin Peterson            rangeobj.stop = 10
673878ce389a08594a805cf382a73414be02143396cBenjamin Peterson        with self.assertRaises(AttributeError):
674878ce389a08594a805cf382a73414be02143396cBenjamin Peterson            rangeobj.step = 1
675878ce389a08594a805cf382a73414be02143396cBenjamin Peterson
676878ce389a08594a805cf382a73414be02143396cBenjamin Peterson        with self.assertRaises(AttributeError):
677878ce389a08594a805cf382a73414be02143396cBenjamin Peterson            del rangeobj.start
678878ce389a08594a805cf382a73414be02143396cBenjamin Peterson        with self.assertRaises(AttributeError):
679878ce389a08594a805cf382a73414be02143396cBenjamin Peterson            del rangeobj.stop
680878ce389a08594a805cf382a73414be02143396cBenjamin Peterson        with self.assertRaises(AttributeError):
681878ce389a08594a805cf382a73414be02143396cBenjamin Peterson            del rangeobj.step
682878ce389a08594a805cf382a73414be02143396cBenjamin Peterson
6831c0423a2da8c98fad1e82b849fada06426db62f1Neal Norwitzif __name__ == "__main__":
68438c707e7e0322f9139bb51ad73ede1e3b46985efZachary Ware    unittest.main()
685