blob: c5002b12732c9876829da8cc7a4e42271578454e [file] [log] [blame]
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001import sys
Serhiy Storchakae4fbb022016-04-24 23:42:49 +03002from test import list_tests
Pablo Galindo372d7052018-10-28 20:16:26 +00003from test.support import cpython_only
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00004import pickle
Zachary Wareac28b792015-12-04 23:32:23 -06005import unittest
Walter Dörwald1dde95d2003-12-08 11:38:45 +00006
7class ListTest(list_tests.CommonTest):
8 type2test = list
9
Christian Heimes81ee3ef2008-05-04 22:42:01 +000010 def test_basic(self):
11 self.assertEqual(list([]), [])
12 l0_3 = [0, 1, 2, 3]
13 l0_3_bis = list(l0_3)
14 self.assertEqual(l0_3, l0_3_bis)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000015 self.assertTrue(l0_3 is not l0_3_bis)
Christian Heimes81ee3ef2008-05-04 22:42:01 +000016 self.assertEqual(list(()), [])
17 self.assertEqual(list((0, 1, 2, 3)), [0, 1, 2, 3])
18 self.assertEqual(list(''), [])
19 self.assertEqual(list('spam'), ['s', 'p', 'a', 'm'])
Serhiy Storchaka58d23e62017-03-06 00:53:39 +020020 self.assertEqual(list(x for x in range(10) if x % 2),
21 [1, 3, 5, 7, 9])
Christian Heimes81ee3ef2008-05-04 22:42:01 +000022
Benjamin Petersona786b022008-08-25 21:05:21 +000023 if sys.maxsize == 0x7fffffff:
24 # This test can currently only work on 32-bit machines.
25 # XXX If/when PySequence_Length() returns a ssize_t, it should be
26 # XXX re-enabled.
27 # Verify clearing of bug #556025.
28 # This assumes that the max data size (sys.maxint) == max
29 # address size this also assumes that the address size is at
30 # least 4 bytes with 8 byte addresses, the bug is not well
31 # tested
32 #
33 # Note: This test is expected to SEGV under Cygwin 1.3.12 or
34 # earlier due to a newlib bug. See the following mailing list
35 # thread for the details:
36
37 # http://sources.redhat.com/ml/newlib/2002/msg00369.html
38 self.assertRaises(MemoryError, list, range(sys.maxsize // 2))
39
Christian Heimes81ee3ef2008-05-04 22:42:01 +000040 # This code used to segfault in Py2.4a3
41 x = []
42 x.extend(-y for y in x)
43 self.assertEqual(x, [])
44
Serhiy Storchaka58d23e62017-03-06 00:53:39 +020045 def test_keyword_args(self):
Serhiy Storchaka2e564242017-03-06 17:01:06 +020046 with self.assertRaisesRegex(TypeError, 'keyword argument'):
47 list(sequence=[])
Serhiy Storchaka58d23e62017-03-06 00:53:39 +020048
Walter Dörwald1dde95d2003-12-08 11:38:45 +000049 def test_truth(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +000050 super().test_truth()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000051 self.assertTrue(not [])
52 self.assertTrue([42])
Walter Dörwald1dde95d2003-12-08 11:38:45 +000053
54 def test_identity(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000055 self.assertTrue([] is not [])
Walter Dörwald1dde95d2003-12-08 11:38:45 +000056
57 def test_len(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +000058 super().test_len()
Walter Dörwald1dde95d2003-12-08 11:38:45 +000059 self.assertEqual(len([]), 0)
60 self.assertEqual(len([0]), 1)
61 self.assertEqual(len([0, 1, 2]), 3)
62
Guido van Rossum8ce8a782007-11-01 19:42:39 +000063 def test_overflow(self):
64 lst = [4, 5, 6, 7]
Christian Heimesa37d4c62007-12-04 23:02:19 +000065 n = int((sys.maxsize*2+2) // len(lst))
Guido van Rossum8ce8a782007-11-01 19:42:39 +000066 def mul(a, b): return a * b
67 def imul(a, b): a *= b
68 self.assertRaises((MemoryError, OverflowError), mul, lst, n)
69 self.assertRaises((MemoryError, OverflowError), imul, lst, n)
70
Antoine Pitroueeb7eea2011-10-06 18:57:27 +020071 def test_repr_large(self):
72 # Check the repr of large list objects
73 def check(n):
74 l = [0] * n
75 s = repr(l)
76 self.assertEqual(s,
77 '[' + ', '.join(['0'] * n) + ']')
78 check(10) # check our checking code
79 check(1000000)
80
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +000081 def test_iterator_pickle(self):
Serhiy Storchakaaabafe72016-03-06 14:10:24 +020082 orig = self.type2test([4, 5, 6, 7])
83 data = [10, 11, 12, 13, 14, 15]
Serhiy Storchakabad12572014-12-15 14:03:42 +020084 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Serhiy Storchakaaabafe72016-03-06 14:10:24 +020085 # initial iterator
86 itorig = iter(orig)
87 d = pickle.dumps((itorig, orig), proto)
88 it, a = pickle.loads(d)
89 a[:] = data
90 self.assertEqual(type(it), type(itorig))
91 self.assertEqual(list(it), data)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +000092
Serhiy Storchakaaabafe72016-03-06 14:10:24 +020093 # running iterator
94 next(itorig)
95 d = pickle.dumps((itorig, orig), proto)
96 it, a = pickle.loads(d)
97 a[:] = data
98 self.assertEqual(type(it), type(itorig))
99 self.assertEqual(list(it), data[1:])
100
101 # empty iterator
102 for i in range(1, len(orig)):
103 next(itorig)
104 d = pickle.dumps((itorig, orig), proto)
105 it, a = pickle.loads(d)
106 a[:] = data
107 self.assertEqual(type(it), type(itorig))
108 self.assertEqual(list(it), data[len(orig):])
109
110 # exhausted iterator
111 self.assertRaises(StopIteration, next, itorig)
112 d = pickle.dumps((itorig, orig), proto)
113 it, a = pickle.loads(d)
114 a[:] = data
115 self.assertEqual(list(it), [])
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000116
117 def test_reversed_pickle(self):
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200118 orig = self.type2test([4, 5, 6, 7])
119 data = [10, 11, 12, 13, 14, 15]
Serhiy Storchakabad12572014-12-15 14:03:42 +0200120 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200121 # initial iterator
122 itorig = reversed(orig)
123 d = pickle.dumps((itorig, orig), proto)
124 it, a = pickle.loads(d)
125 a[:] = data
126 self.assertEqual(type(it), type(itorig))
127 self.assertEqual(list(it), data[len(orig)-1::-1])
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000128
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200129 # running iterator
130 next(itorig)
131 d = pickle.dumps((itorig, orig), proto)
132 it, a = pickle.loads(d)
133 a[:] = data
134 self.assertEqual(type(it), type(itorig))
135 self.assertEqual(list(it), data[len(orig)-2::-1])
136
137 # empty iterator
138 for i in range(1, len(orig)):
139 next(itorig)
140 d = pickle.dumps((itorig, orig), proto)
141 it, a = pickle.loads(d)
142 a[:] = data
143 self.assertEqual(type(it), type(itorig))
144 self.assertEqual(list(it), [])
145
146 # exhausted iterator
147 self.assertRaises(StopIteration, next, itorig)
148 d = pickle.dumps((itorig, orig), proto)
149 it, a = pickle.loads(d)
150 a[:] = data
151 self.assertEqual(list(it), [])
Antoine Pitroueeb7eea2011-10-06 18:57:27 +0200152
Martin v. Löwis4c1730d2012-08-01 10:32:11 +0200153 def test_no_comdat_folding(self):
154 # Issue 8847: In the PGO build, the MSVC linker's COMDAT folding
155 # optimization causes failures in code that relies on distinct
156 # function addresses.
157 class L(list): pass
158 with self.assertRaises(TypeError):
159 (3,) + L([1,2])
160
Pablo Galindo372d7052018-10-28 20:16:26 +0000161 @cpython_only
162 def test_preallocation(self):
163 iterable = [0] * 10
164 iter_size = sys.getsizeof(iterable)
165
166 self.assertEqual(iter_size, sys.getsizeof(list([0] * 10)))
167 self.assertEqual(iter_size, sys.getsizeof(list(range(10))))
168
Raymond Hettingerbcab2b22004-09-29 08:03:17 +0000169if __name__ == "__main__":
Zachary Ware38c707e2015-04-13 15:00:43 -0500170 unittest.main()