17db96d56Sopenharmony_ciimport sys
27db96d56Sopenharmony_cifrom test import list_tests
37db96d56Sopenharmony_cifrom test.support import cpython_only
47db96d56Sopenharmony_ciimport pickle
57db96d56Sopenharmony_ciimport unittest
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ciclass ListTest(list_tests.CommonTest):
87db96d56Sopenharmony_ci    type2test = list
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ci    def test_basic(self):
117db96d56Sopenharmony_ci        self.assertEqual(list([]), [])
127db96d56Sopenharmony_ci        l0_3 = [0, 1, 2, 3]
137db96d56Sopenharmony_ci        l0_3_bis = list(l0_3)
147db96d56Sopenharmony_ci        self.assertEqual(l0_3, l0_3_bis)
157db96d56Sopenharmony_ci        self.assertTrue(l0_3 is not l0_3_bis)
167db96d56Sopenharmony_ci        self.assertEqual(list(()), [])
177db96d56Sopenharmony_ci        self.assertEqual(list((0, 1, 2, 3)), [0, 1, 2, 3])
187db96d56Sopenharmony_ci        self.assertEqual(list(''), [])
197db96d56Sopenharmony_ci        self.assertEqual(list('spam'), ['s', 'p', 'a', 'm'])
207db96d56Sopenharmony_ci        self.assertEqual(list(x for x in range(10) if x % 2),
217db96d56Sopenharmony_ci                         [1, 3, 5, 7, 9])
227db96d56Sopenharmony_ci
237db96d56Sopenharmony_ci        if sys.maxsize == 0x7fffffff:
247db96d56Sopenharmony_ci            # This test can currently only work on 32-bit machines.
257db96d56Sopenharmony_ci            # XXX If/when PySequence_Length() returns a ssize_t, it should be
267db96d56Sopenharmony_ci            # XXX re-enabled.
277db96d56Sopenharmony_ci            # Verify clearing of bug #556025.
287db96d56Sopenharmony_ci            # This assumes that the max data size (sys.maxint) == max
297db96d56Sopenharmony_ci            # address size this also assumes that the address size is at
307db96d56Sopenharmony_ci            # least 4 bytes with 8 byte addresses, the bug is not well
317db96d56Sopenharmony_ci            # tested
327db96d56Sopenharmony_ci            #
337db96d56Sopenharmony_ci            # Note: This test is expected to SEGV under Cygwin 1.3.12 or
347db96d56Sopenharmony_ci            # earlier due to a newlib bug.  See the following mailing list
357db96d56Sopenharmony_ci            # thread for the details:
367db96d56Sopenharmony_ci
377db96d56Sopenharmony_ci            #     http://sources.redhat.com/ml/newlib/2002/msg00369.html
387db96d56Sopenharmony_ci            self.assertRaises(MemoryError, list, range(sys.maxsize // 2))
397db96d56Sopenharmony_ci
407db96d56Sopenharmony_ci        # This code used to segfault in Py2.4a3
417db96d56Sopenharmony_ci        x = []
427db96d56Sopenharmony_ci        x.extend(-y for y in x)
437db96d56Sopenharmony_ci        self.assertEqual(x, [])
447db96d56Sopenharmony_ci
457db96d56Sopenharmony_ci    def test_keyword_args(self):
467db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, 'keyword argument'):
477db96d56Sopenharmony_ci            list(sequence=[])
487db96d56Sopenharmony_ci
497db96d56Sopenharmony_ci    def test_keywords_in_subclass(self):
507db96d56Sopenharmony_ci        class subclass(list):
517db96d56Sopenharmony_ci            pass
527db96d56Sopenharmony_ci        u = subclass([1, 2])
537db96d56Sopenharmony_ci        self.assertIs(type(u), subclass)
547db96d56Sopenharmony_ci        self.assertEqual(list(u), [1, 2])
557db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
567db96d56Sopenharmony_ci            subclass(sequence=())
577db96d56Sopenharmony_ci
587db96d56Sopenharmony_ci        class subclass_with_init(list):
597db96d56Sopenharmony_ci            def __init__(self, seq, newarg=None):
607db96d56Sopenharmony_ci                super().__init__(seq)
617db96d56Sopenharmony_ci                self.newarg = newarg
627db96d56Sopenharmony_ci        u = subclass_with_init([1, 2], newarg=3)
637db96d56Sopenharmony_ci        self.assertIs(type(u), subclass_with_init)
647db96d56Sopenharmony_ci        self.assertEqual(list(u), [1, 2])
657db96d56Sopenharmony_ci        self.assertEqual(u.newarg, 3)
667db96d56Sopenharmony_ci
677db96d56Sopenharmony_ci        class subclass_with_new(list):
687db96d56Sopenharmony_ci            def __new__(cls, seq, newarg=None):
697db96d56Sopenharmony_ci                self = super().__new__(cls, seq)
707db96d56Sopenharmony_ci                self.newarg = newarg
717db96d56Sopenharmony_ci                return self
727db96d56Sopenharmony_ci        u = subclass_with_new([1, 2], newarg=3)
737db96d56Sopenharmony_ci        self.assertIs(type(u), subclass_with_new)
747db96d56Sopenharmony_ci        self.assertEqual(list(u), [1, 2])
757db96d56Sopenharmony_ci        self.assertEqual(u.newarg, 3)
767db96d56Sopenharmony_ci
777db96d56Sopenharmony_ci    def test_truth(self):
787db96d56Sopenharmony_ci        super().test_truth()
797db96d56Sopenharmony_ci        self.assertTrue(not [])
807db96d56Sopenharmony_ci        self.assertTrue([42])
817db96d56Sopenharmony_ci
827db96d56Sopenharmony_ci    def test_identity(self):
837db96d56Sopenharmony_ci        self.assertTrue([] is not [])
847db96d56Sopenharmony_ci
857db96d56Sopenharmony_ci    def test_len(self):
867db96d56Sopenharmony_ci        super().test_len()
877db96d56Sopenharmony_ci        self.assertEqual(len([]), 0)
887db96d56Sopenharmony_ci        self.assertEqual(len([0]), 1)
897db96d56Sopenharmony_ci        self.assertEqual(len([0, 1, 2]), 3)
907db96d56Sopenharmony_ci
917db96d56Sopenharmony_ci    def test_overflow(self):
927db96d56Sopenharmony_ci        lst = [4, 5, 6, 7]
937db96d56Sopenharmony_ci        n = int((sys.maxsize*2+2) // len(lst))
947db96d56Sopenharmony_ci        def mul(a, b): return a * b
957db96d56Sopenharmony_ci        def imul(a, b): a *= b
967db96d56Sopenharmony_ci        self.assertRaises((MemoryError, OverflowError), mul, lst, n)
977db96d56Sopenharmony_ci        self.assertRaises((MemoryError, OverflowError), imul, lst, n)
987db96d56Sopenharmony_ci
997db96d56Sopenharmony_ci    def test_list_resize_overflow(self):
1007db96d56Sopenharmony_ci        # gh-97616: test new_allocated * sizeof(PyObject*) overflow
1017db96d56Sopenharmony_ci        # check in list_resize()
1027db96d56Sopenharmony_ci        lst = [0] * 65
1037db96d56Sopenharmony_ci        del lst[1:]
1047db96d56Sopenharmony_ci        self.assertEqual(len(lst), 1)
1057db96d56Sopenharmony_ci
1067db96d56Sopenharmony_ci        size = ((2 ** (tuple.__itemsize__ * 8) - 1) // 2)
1077db96d56Sopenharmony_ci        with self.assertRaises((MemoryError, OverflowError)):
1087db96d56Sopenharmony_ci            lst * size
1097db96d56Sopenharmony_ci        with self.assertRaises((MemoryError, OverflowError)):
1107db96d56Sopenharmony_ci            lst *= size
1117db96d56Sopenharmony_ci
1127db96d56Sopenharmony_ci    def test_repr_large(self):
1137db96d56Sopenharmony_ci        # Check the repr of large list objects
1147db96d56Sopenharmony_ci        def check(n):
1157db96d56Sopenharmony_ci            l = [0] * n
1167db96d56Sopenharmony_ci            s = repr(l)
1177db96d56Sopenharmony_ci            self.assertEqual(s,
1187db96d56Sopenharmony_ci                '[' + ', '.join(['0'] * n) + ']')
1197db96d56Sopenharmony_ci        check(10)       # check our checking code
1207db96d56Sopenharmony_ci        check(1000000)
1217db96d56Sopenharmony_ci
1227db96d56Sopenharmony_ci    def test_iterator_pickle(self):
1237db96d56Sopenharmony_ci        orig = self.type2test([4, 5, 6, 7])
1247db96d56Sopenharmony_ci        data = [10, 11, 12, 13, 14, 15]
1257db96d56Sopenharmony_ci        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1267db96d56Sopenharmony_ci            # initial iterator
1277db96d56Sopenharmony_ci            itorig = iter(orig)
1287db96d56Sopenharmony_ci            d = pickle.dumps((itorig, orig), proto)
1297db96d56Sopenharmony_ci            it, a = pickle.loads(d)
1307db96d56Sopenharmony_ci            a[:] = data
1317db96d56Sopenharmony_ci            self.assertEqual(type(it), type(itorig))
1327db96d56Sopenharmony_ci            self.assertEqual(list(it), data)
1337db96d56Sopenharmony_ci
1347db96d56Sopenharmony_ci            # running iterator
1357db96d56Sopenharmony_ci            next(itorig)
1367db96d56Sopenharmony_ci            d = pickle.dumps((itorig, orig), proto)
1377db96d56Sopenharmony_ci            it, a = pickle.loads(d)
1387db96d56Sopenharmony_ci            a[:] = data
1397db96d56Sopenharmony_ci            self.assertEqual(type(it), type(itorig))
1407db96d56Sopenharmony_ci            self.assertEqual(list(it), data[1:])
1417db96d56Sopenharmony_ci
1427db96d56Sopenharmony_ci            # empty iterator
1437db96d56Sopenharmony_ci            for i in range(1, len(orig)):
1447db96d56Sopenharmony_ci                next(itorig)
1457db96d56Sopenharmony_ci            d = pickle.dumps((itorig, orig), proto)
1467db96d56Sopenharmony_ci            it, a = pickle.loads(d)
1477db96d56Sopenharmony_ci            a[:] = data
1487db96d56Sopenharmony_ci            self.assertEqual(type(it), type(itorig))
1497db96d56Sopenharmony_ci            self.assertEqual(list(it), data[len(orig):])
1507db96d56Sopenharmony_ci
1517db96d56Sopenharmony_ci            # exhausted iterator
1527db96d56Sopenharmony_ci            self.assertRaises(StopIteration, next, itorig)
1537db96d56Sopenharmony_ci            d = pickle.dumps((itorig, orig), proto)
1547db96d56Sopenharmony_ci            it, a = pickle.loads(d)
1557db96d56Sopenharmony_ci            a[:] = data
1567db96d56Sopenharmony_ci            self.assertEqual(list(it), [])
1577db96d56Sopenharmony_ci
1587db96d56Sopenharmony_ci    def test_reversed_pickle(self):
1597db96d56Sopenharmony_ci        orig = self.type2test([4, 5, 6, 7])
1607db96d56Sopenharmony_ci        data = [10, 11, 12, 13, 14, 15]
1617db96d56Sopenharmony_ci        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1627db96d56Sopenharmony_ci            # initial iterator
1637db96d56Sopenharmony_ci            itorig = reversed(orig)
1647db96d56Sopenharmony_ci            d = pickle.dumps((itorig, orig), proto)
1657db96d56Sopenharmony_ci            it, a = pickle.loads(d)
1667db96d56Sopenharmony_ci            a[:] = data
1677db96d56Sopenharmony_ci            self.assertEqual(type(it), type(itorig))
1687db96d56Sopenharmony_ci            self.assertEqual(list(it), data[len(orig)-1::-1])
1697db96d56Sopenharmony_ci
1707db96d56Sopenharmony_ci            # running iterator
1717db96d56Sopenharmony_ci            next(itorig)
1727db96d56Sopenharmony_ci            d = pickle.dumps((itorig, orig), proto)
1737db96d56Sopenharmony_ci            it, a = pickle.loads(d)
1747db96d56Sopenharmony_ci            a[:] = data
1757db96d56Sopenharmony_ci            self.assertEqual(type(it), type(itorig))
1767db96d56Sopenharmony_ci            self.assertEqual(list(it), data[len(orig)-2::-1])
1777db96d56Sopenharmony_ci
1787db96d56Sopenharmony_ci            # empty iterator
1797db96d56Sopenharmony_ci            for i in range(1, len(orig)):
1807db96d56Sopenharmony_ci                next(itorig)
1817db96d56Sopenharmony_ci            d = pickle.dumps((itorig, orig), proto)
1827db96d56Sopenharmony_ci            it, a = pickle.loads(d)
1837db96d56Sopenharmony_ci            a[:] = data
1847db96d56Sopenharmony_ci            self.assertEqual(type(it), type(itorig))
1857db96d56Sopenharmony_ci            self.assertEqual(list(it), [])
1867db96d56Sopenharmony_ci
1877db96d56Sopenharmony_ci            # exhausted iterator
1887db96d56Sopenharmony_ci            self.assertRaises(StopIteration, next, itorig)
1897db96d56Sopenharmony_ci            d = pickle.dumps((itorig, orig), proto)
1907db96d56Sopenharmony_ci            it, a = pickle.loads(d)
1917db96d56Sopenharmony_ci            a[:] = data
1927db96d56Sopenharmony_ci            self.assertEqual(list(it), [])
1937db96d56Sopenharmony_ci
1947db96d56Sopenharmony_ci    def test_step_overflow(self):
1957db96d56Sopenharmony_ci        a = [0, 1, 2, 3, 4]
1967db96d56Sopenharmony_ci        a[1::sys.maxsize] = [0]
1977db96d56Sopenharmony_ci        self.assertEqual(a[3::sys.maxsize], [3])
1987db96d56Sopenharmony_ci
1997db96d56Sopenharmony_ci    def test_no_comdat_folding(self):
2007db96d56Sopenharmony_ci        # Issue 8847: In the PGO build, the MSVC linker's COMDAT folding
2017db96d56Sopenharmony_ci        # optimization causes failures in code that relies on distinct
2027db96d56Sopenharmony_ci        # function addresses.
2037db96d56Sopenharmony_ci        class L(list): pass
2047db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
2057db96d56Sopenharmony_ci            (3,) + L([1,2])
2067db96d56Sopenharmony_ci
2077db96d56Sopenharmony_ci    def test_equal_operator_modifying_operand(self):
2087db96d56Sopenharmony_ci        # test fix for seg fault reported in bpo-38588 part 2.
2097db96d56Sopenharmony_ci        class X:
2107db96d56Sopenharmony_ci            def __eq__(self,other) :
2117db96d56Sopenharmony_ci                list2.clear()
2127db96d56Sopenharmony_ci                return NotImplemented
2137db96d56Sopenharmony_ci
2147db96d56Sopenharmony_ci        class Y:
2157db96d56Sopenharmony_ci            def __eq__(self, other):
2167db96d56Sopenharmony_ci                list1.clear()
2177db96d56Sopenharmony_ci                return NotImplemented
2187db96d56Sopenharmony_ci
2197db96d56Sopenharmony_ci        class Z:
2207db96d56Sopenharmony_ci            def __eq__(self, other):
2217db96d56Sopenharmony_ci                list3.clear()
2227db96d56Sopenharmony_ci                return NotImplemented
2237db96d56Sopenharmony_ci
2247db96d56Sopenharmony_ci        list1 = [X()]
2257db96d56Sopenharmony_ci        list2 = [Y()]
2267db96d56Sopenharmony_ci        self.assertTrue(list1 == list2)
2277db96d56Sopenharmony_ci
2287db96d56Sopenharmony_ci        list3 = [Z()]
2297db96d56Sopenharmony_ci        list4 = [1]
2307db96d56Sopenharmony_ci        self.assertFalse(list3 == list4)
2317db96d56Sopenharmony_ci
2327db96d56Sopenharmony_ci    @cpython_only
2337db96d56Sopenharmony_ci    def test_preallocation(self):
2347db96d56Sopenharmony_ci        iterable = [0] * 10
2357db96d56Sopenharmony_ci        iter_size = sys.getsizeof(iterable)
2367db96d56Sopenharmony_ci
2377db96d56Sopenharmony_ci        self.assertEqual(iter_size, sys.getsizeof(list([0] * 10)))
2387db96d56Sopenharmony_ci        self.assertEqual(iter_size, sys.getsizeof(list(range(10))))
2397db96d56Sopenharmony_ci
2407db96d56Sopenharmony_ci    def test_count_index_remove_crashes(self):
2417db96d56Sopenharmony_ci        # bpo-38610: The count(), index(), and remove() methods were not
2427db96d56Sopenharmony_ci        # holding strong references to list elements while calling
2437db96d56Sopenharmony_ci        # PyObject_RichCompareBool().
2447db96d56Sopenharmony_ci        class X:
2457db96d56Sopenharmony_ci            def __eq__(self, other):
2467db96d56Sopenharmony_ci                lst.clear()
2477db96d56Sopenharmony_ci                return NotImplemented
2487db96d56Sopenharmony_ci
2497db96d56Sopenharmony_ci        lst = [X()]
2507db96d56Sopenharmony_ci        with self.assertRaises(ValueError):
2517db96d56Sopenharmony_ci            lst.index(lst)
2527db96d56Sopenharmony_ci
2537db96d56Sopenharmony_ci        class L(list):
2547db96d56Sopenharmony_ci            def __eq__(self, other):
2557db96d56Sopenharmony_ci                str(other)
2567db96d56Sopenharmony_ci                return NotImplemented
2577db96d56Sopenharmony_ci
2587db96d56Sopenharmony_ci        lst = L([X()])
2597db96d56Sopenharmony_ci        lst.count(lst)
2607db96d56Sopenharmony_ci
2617db96d56Sopenharmony_ci        lst = L([X()])
2627db96d56Sopenharmony_ci        with self.assertRaises(ValueError):
2637db96d56Sopenharmony_ci            lst.remove(lst)
2647db96d56Sopenharmony_ci
2657db96d56Sopenharmony_ci        # bpo-39453: list.__contains__ was not holding strong references
2667db96d56Sopenharmony_ci        # to list elements while calling PyObject_RichCompareBool().
2677db96d56Sopenharmony_ci        lst = [X(), X()]
2687db96d56Sopenharmony_ci        3 in lst
2697db96d56Sopenharmony_ci        lst = [X(), X()]
2707db96d56Sopenharmony_ci        X() in lst
2717db96d56Sopenharmony_ci
2727db96d56Sopenharmony_ci
2737db96d56Sopenharmony_ciif __name__ == "__main__":
2747db96d56Sopenharmony_ci    unittest.main()
275