17db96d56Sopenharmony_ci""" 27db96d56Sopenharmony_ciTests common to list and UserList.UserList 37db96d56Sopenharmony_ci""" 47db96d56Sopenharmony_ci 57db96d56Sopenharmony_ciimport sys 67db96d56Sopenharmony_ciimport os 77db96d56Sopenharmony_cifrom functools import cmp_to_key 87db96d56Sopenharmony_ci 97db96d56Sopenharmony_cifrom test import support, seq_tests 107db96d56Sopenharmony_cifrom test.support import ALWAYS_EQ, NEVER_EQ 117db96d56Sopenharmony_ci 127db96d56Sopenharmony_ci 137db96d56Sopenharmony_ciclass CommonTest(seq_tests.CommonTest): 147db96d56Sopenharmony_ci 157db96d56Sopenharmony_ci def test_init(self): 167db96d56Sopenharmony_ci # Iterable arg is optional 177db96d56Sopenharmony_ci self.assertEqual(self.type2test([]), self.type2test()) 187db96d56Sopenharmony_ci 197db96d56Sopenharmony_ci # Init clears previous values 207db96d56Sopenharmony_ci a = self.type2test([1, 2, 3]) 217db96d56Sopenharmony_ci a.__init__() 227db96d56Sopenharmony_ci self.assertEqual(a, self.type2test([])) 237db96d56Sopenharmony_ci 247db96d56Sopenharmony_ci # Init overwrites previous values 257db96d56Sopenharmony_ci a = self.type2test([1, 2, 3]) 267db96d56Sopenharmony_ci a.__init__([4, 5, 6]) 277db96d56Sopenharmony_ci self.assertEqual(a, self.type2test([4, 5, 6])) 287db96d56Sopenharmony_ci 297db96d56Sopenharmony_ci # Mutables always return a new object 307db96d56Sopenharmony_ci b = self.type2test(a) 317db96d56Sopenharmony_ci self.assertNotEqual(id(a), id(b)) 327db96d56Sopenharmony_ci self.assertEqual(a, b) 337db96d56Sopenharmony_ci 347db96d56Sopenharmony_ci def test_getitem_error(self): 357db96d56Sopenharmony_ci a = [] 367db96d56Sopenharmony_ci msg = "list indices must be integers or slices" 377db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, msg): 387db96d56Sopenharmony_ci a['a'] 397db96d56Sopenharmony_ci 407db96d56Sopenharmony_ci def test_setitem_error(self): 417db96d56Sopenharmony_ci a = [] 427db96d56Sopenharmony_ci msg = "list indices must be integers or slices" 437db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, msg): 447db96d56Sopenharmony_ci a['a'] = "python" 457db96d56Sopenharmony_ci 467db96d56Sopenharmony_ci def test_repr(self): 477db96d56Sopenharmony_ci l0 = [] 487db96d56Sopenharmony_ci l2 = [0, 1, 2] 497db96d56Sopenharmony_ci a0 = self.type2test(l0) 507db96d56Sopenharmony_ci a2 = self.type2test(l2) 517db96d56Sopenharmony_ci 527db96d56Sopenharmony_ci self.assertEqual(str(a0), str(l0)) 537db96d56Sopenharmony_ci self.assertEqual(repr(a0), repr(l0)) 547db96d56Sopenharmony_ci self.assertEqual(repr(a2), repr(l2)) 557db96d56Sopenharmony_ci self.assertEqual(str(a2), "[0, 1, 2]") 567db96d56Sopenharmony_ci self.assertEqual(repr(a2), "[0, 1, 2]") 577db96d56Sopenharmony_ci 587db96d56Sopenharmony_ci a2.append(a2) 597db96d56Sopenharmony_ci a2.append(3) 607db96d56Sopenharmony_ci self.assertEqual(str(a2), "[0, 1, 2, [...], 3]") 617db96d56Sopenharmony_ci self.assertEqual(repr(a2), "[0, 1, 2, [...], 3]") 627db96d56Sopenharmony_ci 637db96d56Sopenharmony_ci def test_repr_deep(self): 647db96d56Sopenharmony_ci a = self.type2test([]) 657db96d56Sopenharmony_ci for i in range(sys.getrecursionlimit() + 100): 667db96d56Sopenharmony_ci a = self.type2test([a]) 677db96d56Sopenharmony_ci self.assertRaises(RecursionError, repr, a) 687db96d56Sopenharmony_ci 697db96d56Sopenharmony_ci def test_set_subscript(self): 707db96d56Sopenharmony_ci a = self.type2test(range(20)) 717db96d56Sopenharmony_ci self.assertRaises(ValueError, a.__setitem__, slice(0, 10, 0), [1,2,3]) 727db96d56Sopenharmony_ci self.assertRaises(TypeError, a.__setitem__, slice(0, 10), 1) 737db96d56Sopenharmony_ci self.assertRaises(ValueError, a.__setitem__, slice(0, 10, 2), [1,2]) 747db96d56Sopenharmony_ci self.assertRaises(TypeError, a.__getitem__, 'x', 1) 757db96d56Sopenharmony_ci a[slice(2,10,3)] = [1,2,3] 767db96d56Sopenharmony_ci self.assertEqual(a, self.type2test([0, 1, 1, 3, 4, 2, 6, 7, 3, 777db96d56Sopenharmony_ci 9, 10, 11, 12, 13, 14, 15, 787db96d56Sopenharmony_ci 16, 17, 18, 19])) 797db96d56Sopenharmony_ci 807db96d56Sopenharmony_ci def test_reversed(self): 817db96d56Sopenharmony_ci a = self.type2test(range(20)) 827db96d56Sopenharmony_ci r = reversed(a) 837db96d56Sopenharmony_ci self.assertEqual(list(r), self.type2test(range(19, -1, -1))) 847db96d56Sopenharmony_ci self.assertRaises(StopIteration, next, r) 857db96d56Sopenharmony_ci self.assertEqual(list(reversed(self.type2test())), 867db96d56Sopenharmony_ci self.type2test()) 877db96d56Sopenharmony_ci # Bug 3689: make sure list-reversed-iterator doesn't have __len__ 887db96d56Sopenharmony_ci self.assertRaises(TypeError, len, reversed([1,2,3])) 897db96d56Sopenharmony_ci 907db96d56Sopenharmony_ci def test_setitem(self): 917db96d56Sopenharmony_ci a = self.type2test([0, 1]) 927db96d56Sopenharmony_ci a[0] = 0 937db96d56Sopenharmony_ci a[1] = 100 947db96d56Sopenharmony_ci self.assertEqual(a, self.type2test([0, 100])) 957db96d56Sopenharmony_ci a[-1] = 200 967db96d56Sopenharmony_ci self.assertEqual(a, self.type2test([0, 200])) 977db96d56Sopenharmony_ci a[-2] = 100 987db96d56Sopenharmony_ci self.assertEqual(a, self.type2test([100, 200])) 997db96d56Sopenharmony_ci self.assertRaises(IndexError, a.__setitem__, -3, 200) 1007db96d56Sopenharmony_ci self.assertRaises(IndexError, a.__setitem__, 2, 200) 1017db96d56Sopenharmony_ci 1027db96d56Sopenharmony_ci a = self.type2test([]) 1037db96d56Sopenharmony_ci self.assertRaises(IndexError, a.__setitem__, 0, 200) 1047db96d56Sopenharmony_ci self.assertRaises(IndexError, a.__setitem__, -1, 200) 1057db96d56Sopenharmony_ci self.assertRaises(TypeError, a.__setitem__) 1067db96d56Sopenharmony_ci 1077db96d56Sopenharmony_ci a = self.type2test([0,1,2,3,4]) 1087db96d56Sopenharmony_ci a[0] = 1 1097db96d56Sopenharmony_ci a[1] = 2 1107db96d56Sopenharmony_ci a[2] = 3 1117db96d56Sopenharmony_ci self.assertEqual(a, self.type2test([1,2,3,3,4])) 1127db96d56Sopenharmony_ci a[0] = 5 1137db96d56Sopenharmony_ci a[1] = 6 1147db96d56Sopenharmony_ci a[2] = 7 1157db96d56Sopenharmony_ci self.assertEqual(a, self.type2test([5,6,7,3,4])) 1167db96d56Sopenharmony_ci a[-2] = 88 1177db96d56Sopenharmony_ci a[-1] = 99 1187db96d56Sopenharmony_ci self.assertEqual(a, self.type2test([5,6,7,88,99])) 1197db96d56Sopenharmony_ci a[-2] = 8 1207db96d56Sopenharmony_ci a[-1] = 9 1217db96d56Sopenharmony_ci self.assertEqual(a, self.type2test([5,6,7,8,9])) 1227db96d56Sopenharmony_ci 1237db96d56Sopenharmony_ci msg = "list indices must be integers or slices" 1247db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, msg): 1257db96d56Sopenharmony_ci a['a'] = "python" 1267db96d56Sopenharmony_ci 1277db96d56Sopenharmony_ci def test_delitem(self): 1287db96d56Sopenharmony_ci a = self.type2test([0, 1]) 1297db96d56Sopenharmony_ci del a[1] 1307db96d56Sopenharmony_ci self.assertEqual(a, [0]) 1317db96d56Sopenharmony_ci del a[0] 1327db96d56Sopenharmony_ci self.assertEqual(a, []) 1337db96d56Sopenharmony_ci 1347db96d56Sopenharmony_ci a = self.type2test([0, 1]) 1357db96d56Sopenharmony_ci del a[-2] 1367db96d56Sopenharmony_ci self.assertEqual(a, [1]) 1377db96d56Sopenharmony_ci del a[-1] 1387db96d56Sopenharmony_ci self.assertEqual(a, []) 1397db96d56Sopenharmony_ci 1407db96d56Sopenharmony_ci a = self.type2test([0, 1]) 1417db96d56Sopenharmony_ci self.assertRaises(IndexError, a.__delitem__, -3) 1427db96d56Sopenharmony_ci self.assertRaises(IndexError, a.__delitem__, 2) 1437db96d56Sopenharmony_ci 1447db96d56Sopenharmony_ci a = self.type2test([]) 1457db96d56Sopenharmony_ci self.assertRaises(IndexError, a.__delitem__, 0) 1467db96d56Sopenharmony_ci 1477db96d56Sopenharmony_ci self.assertRaises(TypeError, a.__delitem__) 1487db96d56Sopenharmony_ci 1497db96d56Sopenharmony_ci def test_setslice(self): 1507db96d56Sopenharmony_ci l = [0, 1] 1517db96d56Sopenharmony_ci a = self.type2test(l) 1527db96d56Sopenharmony_ci 1537db96d56Sopenharmony_ci for i in range(-3, 4): 1547db96d56Sopenharmony_ci a[:i] = l[:i] 1557db96d56Sopenharmony_ci self.assertEqual(a, l) 1567db96d56Sopenharmony_ci a2 = a[:] 1577db96d56Sopenharmony_ci a2[:i] = a[:i] 1587db96d56Sopenharmony_ci self.assertEqual(a2, a) 1597db96d56Sopenharmony_ci a[i:] = l[i:] 1607db96d56Sopenharmony_ci self.assertEqual(a, l) 1617db96d56Sopenharmony_ci a2 = a[:] 1627db96d56Sopenharmony_ci a2[i:] = a[i:] 1637db96d56Sopenharmony_ci self.assertEqual(a2, a) 1647db96d56Sopenharmony_ci for j in range(-3, 4): 1657db96d56Sopenharmony_ci a[i:j] = l[i:j] 1667db96d56Sopenharmony_ci self.assertEqual(a, l) 1677db96d56Sopenharmony_ci a2 = a[:] 1687db96d56Sopenharmony_ci a2[i:j] = a[i:j] 1697db96d56Sopenharmony_ci self.assertEqual(a2, a) 1707db96d56Sopenharmony_ci 1717db96d56Sopenharmony_ci aa2 = a2[:] 1727db96d56Sopenharmony_ci aa2[:0] = [-2, -1] 1737db96d56Sopenharmony_ci self.assertEqual(aa2, [-2, -1, 0, 1]) 1747db96d56Sopenharmony_ci aa2[0:] = [] 1757db96d56Sopenharmony_ci self.assertEqual(aa2, []) 1767db96d56Sopenharmony_ci 1777db96d56Sopenharmony_ci a = self.type2test([1, 2, 3, 4, 5]) 1787db96d56Sopenharmony_ci a[:-1] = a 1797db96d56Sopenharmony_ci self.assertEqual(a, self.type2test([1, 2, 3, 4, 5, 5])) 1807db96d56Sopenharmony_ci a = self.type2test([1, 2, 3, 4, 5]) 1817db96d56Sopenharmony_ci a[1:] = a 1827db96d56Sopenharmony_ci self.assertEqual(a, self.type2test([1, 1, 2, 3, 4, 5])) 1837db96d56Sopenharmony_ci a = self.type2test([1, 2, 3, 4, 5]) 1847db96d56Sopenharmony_ci a[1:-1] = a 1857db96d56Sopenharmony_ci self.assertEqual(a, self.type2test([1, 1, 2, 3, 4, 5, 5])) 1867db96d56Sopenharmony_ci 1877db96d56Sopenharmony_ci a = self.type2test([]) 1887db96d56Sopenharmony_ci a[:] = tuple(range(10)) 1897db96d56Sopenharmony_ci self.assertEqual(a, self.type2test(range(10))) 1907db96d56Sopenharmony_ci 1917db96d56Sopenharmony_ci self.assertRaises(TypeError, a.__setitem__, slice(0, 1, 5)) 1927db96d56Sopenharmony_ci 1937db96d56Sopenharmony_ci self.assertRaises(TypeError, a.__setitem__) 1947db96d56Sopenharmony_ci 1957db96d56Sopenharmony_ci def test_delslice(self): 1967db96d56Sopenharmony_ci a = self.type2test([0, 1]) 1977db96d56Sopenharmony_ci del a[1:2] 1987db96d56Sopenharmony_ci del a[0:1] 1997db96d56Sopenharmony_ci self.assertEqual(a, self.type2test([])) 2007db96d56Sopenharmony_ci 2017db96d56Sopenharmony_ci a = self.type2test([0, 1]) 2027db96d56Sopenharmony_ci del a[1:2] 2037db96d56Sopenharmony_ci del a[0:1] 2047db96d56Sopenharmony_ci self.assertEqual(a, self.type2test([])) 2057db96d56Sopenharmony_ci 2067db96d56Sopenharmony_ci a = self.type2test([0, 1]) 2077db96d56Sopenharmony_ci del a[-2:-1] 2087db96d56Sopenharmony_ci self.assertEqual(a, self.type2test([1])) 2097db96d56Sopenharmony_ci 2107db96d56Sopenharmony_ci a = self.type2test([0, 1]) 2117db96d56Sopenharmony_ci del a[-2:-1] 2127db96d56Sopenharmony_ci self.assertEqual(a, self.type2test([1])) 2137db96d56Sopenharmony_ci 2147db96d56Sopenharmony_ci a = self.type2test([0, 1]) 2157db96d56Sopenharmony_ci del a[1:] 2167db96d56Sopenharmony_ci del a[:1] 2177db96d56Sopenharmony_ci self.assertEqual(a, self.type2test([])) 2187db96d56Sopenharmony_ci 2197db96d56Sopenharmony_ci a = self.type2test([0, 1]) 2207db96d56Sopenharmony_ci del a[1:] 2217db96d56Sopenharmony_ci del a[:1] 2227db96d56Sopenharmony_ci self.assertEqual(a, self.type2test([])) 2237db96d56Sopenharmony_ci 2247db96d56Sopenharmony_ci a = self.type2test([0, 1]) 2257db96d56Sopenharmony_ci del a[-1:] 2267db96d56Sopenharmony_ci self.assertEqual(a, self.type2test([0])) 2277db96d56Sopenharmony_ci 2287db96d56Sopenharmony_ci a = self.type2test([0, 1]) 2297db96d56Sopenharmony_ci del a[-1:] 2307db96d56Sopenharmony_ci self.assertEqual(a, self.type2test([0])) 2317db96d56Sopenharmony_ci 2327db96d56Sopenharmony_ci a = self.type2test([0, 1]) 2337db96d56Sopenharmony_ci del a[:] 2347db96d56Sopenharmony_ci self.assertEqual(a, self.type2test([])) 2357db96d56Sopenharmony_ci 2367db96d56Sopenharmony_ci def test_append(self): 2377db96d56Sopenharmony_ci a = self.type2test([]) 2387db96d56Sopenharmony_ci a.append(0) 2397db96d56Sopenharmony_ci a.append(1) 2407db96d56Sopenharmony_ci a.append(2) 2417db96d56Sopenharmony_ci self.assertEqual(a, self.type2test([0, 1, 2])) 2427db96d56Sopenharmony_ci 2437db96d56Sopenharmony_ci self.assertRaises(TypeError, a.append) 2447db96d56Sopenharmony_ci 2457db96d56Sopenharmony_ci def test_extend(self): 2467db96d56Sopenharmony_ci a1 = self.type2test([0]) 2477db96d56Sopenharmony_ci a2 = self.type2test((0, 1)) 2487db96d56Sopenharmony_ci a = a1[:] 2497db96d56Sopenharmony_ci a.extend(a2) 2507db96d56Sopenharmony_ci self.assertEqual(a, a1 + a2) 2517db96d56Sopenharmony_ci 2527db96d56Sopenharmony_ci a.extend(self.type2test([])) 2537db96d56Sopenharmony_ci self.assertEqual(a, a1 + a2) 2547db96d56Sopenharmony_ci 2557db96d56Sopenharmony_ci a.extend(a) 2567db96d56Sopenharmony_ci self.assertEqual(a, self.type2test([0, 0, 1, 0, 0, 1])) 2577db96d56Sopenharmony_ci 2587db96d56Sopenharmony_ci a = self.type2test("spam") 2597db96d56Sopenharmony_ci a.extend("eggs") 2607db96d56Sopenharmony_ci self.assertEqual(a, list("spameggs")) 2617db96d56Sopenharmony_ci 2627db96d56Sopenharmony_ci self.assertRaises(TypeError, a.extend, None) 2637db96d56Sopenharmony_ci self.assertRaises(TypeError, a.extend) 2647db96d56Sopenharmony_ci 2657db96d56Sopenharmony_ci # overflow test. issue1621 2667db96d56Sopenharmony_ci class CustomIter: 2677db96d56Sopenharmony_ci def __iter__(self): 2687db96d56Sopenharmony_ci return self 2697db96d56Sopenharmony_ci def __next__(self): 2707db96d56Sopenharmony_ci raise StopIteration 2717db96d56Sopenharmony_ci def __length_hint__(self): 2727db96d56Sopenharmony_ci return sys.maxsize 2737db96d56Sopenharmony_ci a = self.type2test([1,2,3,4]) 2747db96d56Sopenharmony_ci a.extend(CustomIter()) 2757db96d56Sopenharmony_ci self.assertEqual(a, [1,2,3,4]) 2767db96d56Sopenharmony_ci 2777db96d56Sopenharmony_ci 2787db96d56Sopenharmony_ci def test_insert(self): 2797db96d56Sopenharmony_ci a = self.type2test([0, 1, 2]) 2807db96d56Sopenharmony_ci a.insert(0, -2) 2817db96d56Sopenharmony_ci a.insert(1, -1) 2827db96d56Sopenharmony_ci a.insert(2, 0) 2837db96d56Sopenharmony_ci self.assertEqual(a, [-2, -1, 0, 0, 1, 2]) 2847db96d56Sopenharmony_ci 2857db96d56Sopenharmony_ci b = a[:] 2867db96d56Sopenharmony_ci b.insert(-2, "foo") 2877db96d56Sopenharmony_ci b.insert(-200, "left") 2887db96d56Sopenharmony_ci b.insert(200, "right") 2897db96d56Sopenharmony_ci self.assertEqual(b, self.type2test(["left",-2,-1,0,0,"foo",1,2,"right"])) 2907db96d56Sopenharmony_ci 2917db96d56Sopenharmony_ci self.assertRaises(TypeError, a.insert) 2927db96d56Sopenharmony_ci 2937db96d56Sopenharmony_ci def test_pop(self): 2947db96d56Sopenharmony_ci a = self.type2test([-1, 0, 1]) 2957db96d56Sopenharmony_ci a.pop() 2967db96d56Sopenharmony_ci self.assertEqual(a, [-1, 0]) 2977db96d56Sopenharmony_ci a.pop(0) 2987db96d56Sopenharmony_ci self.assertEqual(a, [0]) 2997db96d56Sopenharmony_ci self.assertRaises(IndexError, a.pop, 5) 3007db96d56Sopenharmony_ci a.pop(0) 3017db96d56Sopenharmony_ci self.assertEqual(a, []) 3027db96d56Sopenharmony_ci self.assertRaises(IndexError, a.pop) 3037db96d56Sopenharmony_ci self.assertRaises(TypeError, a.pop, 42, 42) 3047db96d56Sopenharmony_ci a = self.type2test([0, 10, 20, 30, 40]) 3057db96d56Sopenharmony_ci 3067db96d56Sopenharmony_ci def test_remove(self): 3077db96d56Sopenharmony_ci a = self.type2test([0, 0, 1]) 3087db96d56Sopenharmony_ci a.remove(1) 3097db96d56Sopenharmony_ci self.assertEqual(a, [0, 0]) 3107db96d56Sopenharmony_ci a.remove(0) 3117db96d56Sopenharmony_ci self.assertEqual(a, [0]) 3127db96d56Sopenharmony_ci a.remove(0) 3137db96d56Sopenharmony_ci self.assertEqual(a, []) 3147db96d56Sopenharmony_ci 3157db96d56Sopenharmony_ci self.assertRaises(ValueError, a.remove, 0) 3167db96d56Sopenharmony_ci 3177db96d56Sopenharmony_ci self.assertRaises(TypeError, a.remove) 3187db96d56Sopenharmony_ci 3197db96d56Sopenharmony_ci a = self.type2test([1, 2]) 3207db96d56Sopenharmony_ci self.assertRaises(ValueError, a.remove, NEVER_EQ) 3217db96d56Sopenharmony_ci self.assertEqual(a, [1, 2]) 3227db96d56Sopenharmony_ci a.remove(ALWAYS_EQ) 3237db96d56Sopenharmony_ci self.assertEqual(a, [2]) 3247db96d56Sopenharmony_ci a = self.type2test([ALWAYS_EQ]) 3257db96d56Sopenharmony_ci a.remove(1) 3267db96d56Sopenharmony_ci self.assertEqual(a, []) 3277db96d56Sopenharmony_ci a = self.type2test([ALWAYS_EQ]) 3287db96d56Sopenharmony_ci a.remove(NEVER_EQ) 3297db96d56Sopenharmony_ci self.assertEqual(a, []) 3307db96d56Sopenharmony_ci a = self.type2test([NEVER_EQ]) 3317db96d56Sopenharmony_ci self.assertRaises(ValueError, a.remove, ALWAYS_EQ) 3327db96d56Sopenharmony_ci 3337db96d56Sopenharmony_ci class BadExc(Exception): 3347db96d56Sopenharmony_ci pass 3357db96d56Sopenharmony_ci 3367db96d56Sopenharmony_ci class BadCmp: 3377db96d56Sopenharmony_ci def __eq__(self, other): 3387db96d56Sopenharmony_ci if other == 2: 3397db96d56Sopenharmony_ci raise BadExc() 3407db96d56Sopenharmony_ci return False 3417db96d56Sopenharmony_ci 3427db96d56Sopenharmony_ci a = self.type2test([0, 1, 2, 3]) 3437db96d56Sopenharmony_ci self.assertRaises(BadExc, a.remove, BadCmp()) 3447db96d56Sopenharmony_ci 3457db96d56Sopenharmony_ci class BadCmp2: 3467db96d56Sopenharmony_ci def __eq__(self, other): 3477db96d56Sopenharmony_ci raise BadExc() 3487db96d56Sopenharmony_ci 3497db96d56Sopenharmony_ci d = self.type2test('abcdefghcij') 3507db96d56Sopenharmony_ci d.remove('c') 3517db96d56Sopenharmony_ci self.assertEqual(d, self.type2test('abdefghcij')) 3527db96d56Sopenharmony_ci d.remove('c') 3537db96d56Sopenharmony_ci self.assertEqual(d, self.type2test('abdefghij')) 3547db96d56Sopenharmony_ci self.assertRaises(ValueError, d.remove, 'c') 3557db96d56Sopenharmony_ci self.assertEqual(d, self.type2test('abdefghij')) 3567db96d56Sopenharmony_ci 3577db96d56Sopenharmony_ci # Handle comparison errors 3587db96d56Sopenharmony_ci d = self.type2test(['a', 'b', BadCmp2(), 'c']) 3597db96d56Sopenharmony_ci e = self.type2test(d) 3607db96d56Sopenharmony_ci self.assertRaises(BadExc, d.remove, 'c') 3617db96d56Sopenharmony_ci for x, y in zip(d, e): 3627db96d56Sopenharmony_ci # verify that original order and values are retained. 3637db96d56Sopenharmony_ci self.assertIs(x, y) 3647db96d56Sopenharmony_ci 3657db96d56Sopenharmony_ci def test_index(self): 3667db96d56Sopenharmony_ci super().test_index() 3677db96d56Sopenharmony_ci a = self.type2test([-2, -1, 0, 0, 1, 2]) 3687db96d56Sopenharmony_ci a.remove(0) 3697db96d56Sopenharmony_ci self.assertRaises(ValueError, a.index, 2, 0, 4) 3707db96d56Sopenharmony_ci self.assertEqual(a, self.type2test([-2, -1, 0, 1, 2])) 3717db96d56Sopenharmony_ci 3727db96d56Sopenharmony_ci # Test modifying the list during index's iteration 3737db96d56Sopenharmony_ci class EvilCmp: 3747db96d56Sopenharmony_ci def __init__(self, victim): 3757db96d56Sopenharmony_ci self.victim = victim 3767db96d56Sopenharmony_ci def __eq__(self, other): 3777db96d56Sopenharmony_ci del self.victim[:] 3787db96d56Sopenharmony_ci return False 3797db96d56Sopenharmony_ci a = self.type2test() 3807db96d56Sopenharmony_ci a[:] = [EvilCmp(a) for _ in range(100)] 3817db96d56Sopenharmony_ci # This used to seg fault before patch #1005778 3827db96d56Sopenharmony_ci self.assertRaises(ValueError, a.index, None) 3837db96d56Sopenharmony_ci 3847db96d56Sopenharmony_ci def test_reverse(self): 3857db96d56Sopenharmony_ci u = self.type2test([-2, -1, 0, 1, 2]) 3867db96d56Sopenharmony_ci u2 = u[:] 3877db96d56Sopenharmony_ci u.reverse() 3887db96d56Sopenharmony_ci self.assertEqual(u, [2, 1, 0, -1, -2]) 3897db96d56Sopenharmony_ci u.reverse() 3907db96d56Sopenharmony_ci self.assertEqual(u, u2) 3917db96d56Sopenharmony_ci 3927db96d56Sopenharmony_ci self.assertRaises(TypeError, u.reverse, 42) 3937db96d56Sopenharmony_ci 3947db96d56Sopenharmony_ci def test_clear(self): 3957db96d56Sopenharmony_ci u = self.type2test([2, 3, 4]) 3967db96d56Sopenharmony_ci u.clear() 3977db96d56Sopenharmony_ci self.assertEqual(u, []) 3987db96d56Sopenharmony_ci 3997db96d56Sopenharmony_ci u = self.type2test([]) 4007db96d56Sopenharmony_ci u.clear() 4017db96d56Sopenharmony_ci self.assertEqual(u, []) 4027db96d56Sopenharmony_ci 4037db96d56Sopenharmony_ci u = self.type2test([]) 4047db96d56Sopenharmony_ci u.append(1) 4057db96d56Sopenharmony_ci u.clear() 4067db96d56Sopenharmony_ci u.append(2) 4077db96d56Sopenharmony_ci self.assertEqual(u, [2]) 4087db96d56Sopenharmony_ci 4097db96d56Sopenharmony_ci self.assertRaises(TypeError, u.clear, None) 4107db96d56Sopenharmony_ci 4117db96d56Sopenharmony_ci def test_copy(self): 4127db96d56Sopenharmony_ci u = self.type2test([1, 2, 3]) 4137db96d56Sopenharmony_ci v = u.copy() 4147db96d56Sopenharmony_ci self.assertEqual(v, [1, 2, 3]) 4157db96d56Sopenharmony_ci 4167db96d56Sopenharmony_ci u = self.type2test([]) 4177db96d56Sopenharmony_ci v = u.copy() 4187db96d56Sopenharmony_ci self.assertEqual(v, []) 4197db96d56Sopenharmony_ci 4207db96d56Sopenharmony_ci # test that it's indeed a copy and not a reference 4217db96d56Sopenharmony_ci u = self.type2test(['a', 'b']) 4227db96d56Sopenharmony_ci v = u.copy() 4237db96d56Sopenharmony_ci v.append('i') 4247db96d56Sopenharmony_ci self.assertEqual(u, ['a', 'b']) 4257db96d56Sopenharmony_ci self.assertEqual(v, u + ['i']) 4267db96d56Sopenharmony_ci 4277db96d56Sopenharmony_ci # test that it's a shallow, not a deep copy 4287db96d56Sopenharmony_ci u = self.type2test([1, 2, [3, 4], 5]) 4297db96d56Sopenharmony_ci v = u.copy() 4307db96d56Sopenharmony_ci self.assertEqual(u, v) 4317db96d56Sopenharmony_ci self.assertIs(v[3], u[3]) 4327db96d56Sopenharmony_ci 4337db96d56Sopenharmony_ci self.assertRaises(TypeError, u.copy, None) 4347db96d56Sopenharmony_ci 4357db96d56Sopenharmony_ci def test_sort(self): 4367db96d56Sopenharmony_ci u = self.type2test([1, 0]) 4377db96d56Sopenharmony_ci u.sort() 4387db96d56Sopenharmony_ci self.assertEqual(u, [0, 1]) 4397db96d56Sopenharmony_ci 4407db96d56Sopenharmony_ci u = self.type2test([2,1,0,-1,-2]) 4417db96d56Sopenharmony_ci u.sort() 4427db96d56Sopenharmony_ci self.assertEqual(u, self.type2test([-2,-1,0,1,2])) 4437db96d56Sopenharmony_ci 4447db96d56Sopenharmony_ci self.assertRaises(TypeError, u.sort, 42, 42) 4457db96d56Sopenharmony_ci 4467db96d56Sopenharmony_ci def revcmp(a, b): 4477db96d56Sopenharmony_ci if a == b: 4487db96d56Sopenharmony_ci return 0 4497db96d56Sopenharmony_ci elif a < b: 4507db96d56Sopenharmony_ci return 1 4517db96d56Sopenharmony_ci else: # a > b 4527db96d56Sopenharmony_ci return -1 4537db96d56Sopenharmony_ci u.sort(key=cmp_to_key(revcmp)) 4547db96d56Sopenharmony_ci self.assertEqual(u, self.type2test([2,1,0,-1,-2])) 4557db96d56Sopenharmony_ci 4567db96d56Sopenharmony_ci # The following dumps core in unpatched Python 1.5: 4577db96d56Sopenharmony_ci def myComparison(x,y): 4587db96d56Sopenharmony_ci xmod, ymod = x%3, y%7 4597db96d56Sopenharmony_ci if xmod == ymod: 4607db96d56Sopenharmony_ci return 0 4617db96d56Sopenharmony_ci elif xmod < ymod: 4627db96d56Sopenharmony_ci return -1 4637db96d56Sopenharmony_ci else: # xmod > ymod 4647db96d56Sopenharmony_ci return 1 4657db96d56Sopenharmony_ci z = self.type2test(range(12)) 4667db96d56Sopenharmony_ci z.sort(key=cmp_to_key(myComparison)) 4677db96d56Sopenharmony_ci 4687db96d56Sopenharmony_ci self.assertRaises(TypeError, z.sort, 2) 4697db96d56Sopenharmony_ci 4707db96d56Sopenharmony_ci def selfmodifyingComparison(x,y): 4717db96d56Sopenharmony_ci z.append(1) 4727db96d56Sopenharmony_ci if x == y: 4737db96d56Sopenharmony_ci return 0 4747db96d56Sopenharmony_ci elif x < y: 4757db96d56Sopenharmony_ci return -1 4767db96d56Sopenharmony_ci else: # x > y 4777db96d56Sopenharmony_ci return 1 4787db96d56Sopenharmony_ci self.assertRaises(ValueError, z.sort, 4797db96d56Sopenharmony_ci key=cmp_to_key(selfmodifyingComparison)) 4807db96d56Sopenharmony_ci 4817db96d56Sopenharmony_ci self.assertRaises(TypeError, z.sort, 42, 42, 42, 42) 4827db96d56Sopenharmony_ci 4837db96d56Sopenharmony_ci def test_slice(self): 4847db96d56Sopenharmony_ci u = self.type2test("spam") 4857db96d56Sopenharmony_ci u[:2] = "h" 4867db96d56Sopenharmony_ci self.assertEqual(u, list("ham")) 4877db96d56Sopenharmony_ci 4887db96d56Sopenharmony_ci def test_iadd(self): 4897db96d56Sopenharmony_ci super().test_iadd() 4907db96d56Sopenharmony_ci u = self.type2test([0, 1]) 4917db96d56Sopenharmony_ci u2 = u 4927db96d56Sopenharmony_ci u += [2, 3] 4937db96d56Sopenharmony_ci self.assertIs(u, u2) 4947db96d56Sopenharmony_ci 4957db96d56Sopenharmony_ci u = self.type2test("spam") 4967db96d56Sopenharmony_ci u += "eggs" 4977db96d56Sopenharmony_ci self.assertEqual(u, self.type2test("spameggs")) 4987db96d56Sopenharmony_ci 4997db96d56Sopenharmony_ci self.assertRaises(TypeError, u.__iadd__, None) 5007db96d56Sopenharmony_ci 5017db96d56Sopenharmony_ci def test_imul(self): 5027db96d56Sopenharmony_ci super().test_imul() 5037db96d56Sopenharmony_ci s = self.type2test([]) 5047db96d56Sopenharmony_ci oldid = id(s) 5057db96d56Sopenharmony_ci s *= 10 5067db96d56Sopenharmony_ci self.assertEqual(id(s), oldid) 5077db96d56Sopenharmony_ci 5087db96d56Sopenharmony_ci def test_extendedslicing(self): 5097db96d56Sopenharmony_ci # subscript 5107db96d56Sopenharmony_ci a = self.type2test([0,1,2,3,4]) 5117db96d56Sopenharmony_ci 5127db96d56Sopenharmony_ci # deletion 5137db96d56Sopenharmony_ci del a[::2] 5147db96d56Sopenharmony_ci self.assertEqual(a, self.type2test([1,3])) 5157db96d56Sopenharmony_ci a = self.type2test(range(5)) 5167db96d56Sopenharmony_ci del a[1::2] 5177db96d56Sopenharmony_ci self.assertEqual(a, self.type2test([0,2,4])) 5187db96d56Sopenharmony_ci a = self.type2test(range(5)) 5197db96d56Sopenharmony_ci del a[1::-2] 5207db96d56Sopenharmony_ci self.assertEqual(a, self.type2test([0,2,3,4])) 5217db96d56Sopenharmony_ci a = self.type2test(range(10)) 5227db96d56Sopenharmony_ci del a[::1000] 5237db96d56Sopenharmony_ci self.assertEqual(a, self.type2test([1, 2, 3, 4, 5, 6, 7, 8, 9])) 5247db96d56Sopenharmony_ci # assignment 5257db96d56Sopenharmony_ci a = self.type2test(range(10)) 5267db96d56Sopenharmony_ci a[::2] = [-1]*5 5277db96d56Sopenharmony_ci self.assertEqual(a, self.type2test([-1, 1, -1, 3, -1, 5, -1, 7, -1, 9])) 5287db96d56Sopenharmony_ci a = self.type2test(range(10)) 5297db96d56Sopenharmony_ci a[::-4] = [10]*3 5307db96d56Sopenharmony_ci self.assertEqual(a, self.type2test([0, 10, 2, 3, 4, 10, 6, 7, 8 ,10])) 5317db96d56Sopenharmony_ci a = self.type2test(range(4)) 5327db96d56Sopenharmony_ci a[::-1] = a 5337db96d56Sopenharmony_ci self.assertEqual(a, self.type2test([3, 2, 1, 0])) 5347db96d56Sopenharmony_ci a = self.type2test(range(10)) 5357db96d56Sopenharmony_ci b = a[:] 5367db96d56Sopenharmony_ci c = a[:] 5377db96d56Sopenharmony_ci a[2:3] = self.type2test(["two", "elements"]) 5387db96d56Sopenharmony_ci b[slice(2,3)] = self.type2test(["two", "elements"]) 5397db96d56Sopenharmony_ci c[2:3:] = self.type2test(["two", "elements"]) 5407db96d56Sopenharmony_ci self.assertEqual(a, b) 5417db96d56Sopenharmony_ci self.assertEqual(a, c) 5427db96d56Sopenharmony_ci a = self.type2test(range(10)) 5437db96d56Sopenharmony_ci a[::2] = tuple(range(5)) 5447db96d56Sopenharmony_ci self.assertEqual(a, self.type2test([0, 1, 1, 3, 2, 5, 3, 7, 4, 9])) 5457db96d56Sopenharmony_ci # test issue7788 5467db96d56Sopenharmony_ci a = self.type2test(range(10)) 5477db96d56Sopenharmony_ci del a[9::1<<333] 5487db96d56Sopenharmony_ci 5497db96d56Sopenharmony_ci def test_constructor_exception_handling(self): 5507db96d56Sopenharmony_ci # Bug #1242657 5517db96d56Sopenharmony_ci class F(object): 5527db96d56Sopenharmony_ci def __iter__(self): 5537db96d56Sopenharmony_ci raise KeyboardInterrupt 5547db96d56Sopenharmony_ci self.assertRaises(KeyboardInterrupt, list, F()) 5557db96d56Sopenharmony_ci 5567db96d56Sopenharmony_ci def test_exhausted_iterator(self): 5577db96d56Sopenharmony_ci a = self.type2test([1, 2, 3]) 5587db96d56Sopenharmony_ci exhit = iter(a) 5597db96d56Sopenharmony_ci empit = iter(a) 5607db96d56Sopenharmony_ci for x in exhit: # exhaust the iterator 5617db96d56Sopenharmony_ci next(empit) # not exhausted 5627db96d56Sopenharmony_ci a.append(9) 5637db96d56Sopenharmony_ci self.assertEqual(list(exhit), []) 5647db96d56Sopenharmony_ci self.assertEqual(list(empit), [9]) 5657db96d56Sopenharmony_ci self.assertEqual(a, self.type2test([1, 2, 3, 9])) 566