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