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