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