Guido van Rossum | 8ce8a78 | 2007-11-01 19:42:39 +0000 | [diff] [blame] | 1 | import sys |
Serhiy Storchaka | e4fbb02 | 2016-04-24 23:42:49 +0300 | [diff] [blame] | 2 | from test import list_tests |
Pablo Galindo | 372d705 | 2018-10-28 20:16:26 +0000 | [diff] [blame] | 3 | from test.support import cpython_only |
Kristján Valur Jónsson | 31668b8 | 2012-04-03 10:49:41 +0000 | [diff] [blame] | 4 | import pickle |
Zachary Ware | ac28b79 | 2015-12-04 23:32:23 -0600 | [diff] [blame] | 5 | import unittest |
Walter Dörwald | 1dde95d | 2003-12-08 11:38:45 +0000 | [diff] [blame] | 6 | |
| 7 | class ListTest(list_tests.CommonTest): |
| 8 | type2test = list |
| 9 | |
Christian Heimes | 81ee3ef | 2008-05-04 22:42:01 +0000 | [diff] [blame] | 10 | 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 Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 15 | self.assertTrue(l0_3 is not l0_3_bis) |
Christian Heimes | 81ee3ef | 2008-05-04 22:42:01 +0000 | [diff] [blame] | 16 | 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 Storchaka | 58d23e6 | 2017-03-06 00:53:39 +0200 | [diff] [blame] | 20 | self.assertEqual(list(x for x in range(10) if x % 2), |
| 21 | [1, 3, 5, 7, 9]) |
Christian Heimes | 81ee3ef | 2008-05-04 22:42:01 +0000 | [diff] [blame] | 22 | |
Benjamin Peterson | a786b02 | 2008-08-25 21:05:21 +0000 | [diff] [blame] | 23 | 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 Heimes | 81ee3ef | 2008-05-04 22:42:01 +0000 | [diff] [blame] | 40 | # This code used to segfault in Py2.4a3 |
| 41 | x = [] |
| 42 | x.extend(-y for y in x) |
| 43 | self.assertEqual(x, []) |
| 44 | |
Serhiy Storchaka | 58d23e6 | 2017-03-06 00:53:39 +0200 | [diff] [blame] | 45 | def test_keyword_args(self): |
Serhiy Storchaka | 2e56424 | 2017-03-06 17:01:06 +0200 | [diff] [blame] | 46 | with self.assertRaisesRegex(TypeError, 'keyword argument'): |
| 47 | list(sequence=[]) |
Serhiy Storchaka | 58d23e6 | 2017-03-06 00:53:39 +0200 | [diff] [blame] | 48 | |
Walter Dörwald | 1dde95d | 2003-12-08 11:38:45 +0000 | [diff] [blame] | 49 | def test_truth(self): |
Guido van Rossum | cd16bf6 | 2007-06-13 18:07:49 +0000 | [diff] [blame] | 50 | super().test_truth() |
Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 51 | self.assertTrue(not []) |
| 52 | self.assertTrue([42]) |
Walter Dörwald | 1dde95d | 2003-12-08 11:38:45 +0000 | [diff] [blame] | 53 | |
| 54 | def test_identity(self): |
Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 55 | self.assertTrue([] is not []) |
Walter Dörwald | 1dde95d | 2003-12-08 11:38:45 +0000 | [diff] [blame] | 56 | |
| 57 | def test_len(self): |
Guido van Rossum | cd16bf6 | 2007-06-13 18:07:49 +0000 | [diff] [blame] | 58 | super().test_len() |
Walter Dörwald | 1dde95d | 2003-12-08 11:38:45 +0000 | [diff] [blame] | 59 | self.assertEqual(len([]), 0) |
| 60 | self.assertEqual(len([0]), 1) |
| 61 | self.assertEqual(len([0, 1, 2]), 3) |
| 62 | |
Guido van Rossum | 8ce8a78 | 2007-11-01 19:42:39 +0000 | [diff] [blame] | 63 | def test_overflow(self): |
| 64 | lst = [4, 5, 6, 7] |
Christian Heimes | a37d4c6 | 2007-12-04 23:02:19 +0000 | [diff] [blame] | 65 | n = int((sys.maxsize*2+2) // len(lst)) |
Guido van Rossum | 8ce8a78 | 2007-11-01 19:42:39 +0000 | [diff] [blame] | 66 | 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 Pitrou | eeb7eea | 2011-10-06 18:57:27 +0200 | [diff] [blame] | 71 | 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ónsson | 31668b8 | 2012-04-03 10:49:41 +0000 | [diff] [blame] | 81 | def test_iterator_pickle(self): |
Serhiy Storchaka | aabafe7 | 2016-03-06 14:10:24 +0200 | [diff] [blame] | 82 | orig = self.type2test([4, 5, 6, 7]) |
| 83 | data = [10, 11, 12, 13, 14, 15] |
Serhiy Storchaka | bad1257 | 2014-12-15 14:03:42 +0200 | [diff] [blame] | 84 | for proto in range(pickle.HIGHEST_PROTOCOL + 1): |
Serhiy Storchaka | aabafe7 | 2016-03-06 14:10:24 +0200 | [diff] [blame] | 85 | # 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ónsson | 31668b8 | 2012-04-03 10:49:41 +0000 | [diff] [blame] | 92 | |
Serhiy Storchaka | aabafe7 | 2016-03-06 14:10:24 +0200 | [diff] [blame] | 93 | # 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ónsson | 31668b8 | 2012-04-03 10:49:41 +0000 | [diff] [blame] | 116 | |
| 117 | def test_reversed_pickle(self): |
Serhiy Storchaka | aabafe7 | 2016-03-06 14:10:24 +0200 | [diff] [blame] | 118 | orig = self.type2test([4, 5, 6, 7]) |
| 119 | data = [10, 11, 12, 13, 14, 15] |
Serhiy Storchaka | bad1257 | 2014-12-15 14:03:42 +0200 | [diff] [blame] | 120 | for proto in range(pickle.HIGHEST_PROTOCOL + 1): |
Serhiy Storchaka | aabafe7 | 2016-03-06 14:10:24 +0200 | [diff] [blame] | 121 | # 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ónsson | 31668b8 | 2012-04-03 10:49:41 +0000 | [diff] [blame] | 128 | |
Serhiy Storchaka | aabafe7 | 2016-03-06 14:10:24 +0200 | [diff] [blame] | 129 | # 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 Pitrou | eeb7eea | 2011-10-06 18:57:27 +0200 | [diff] [blame] | 152 | |
Martin v. Löwis | 4c1730d | 2012-08-01 10:32:11 +0200 | [diff] [blame] | 153 | 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 Galindo | 372d705 | 2018-10-28 20:16:26 +0000 | [diff] [blame] | 161 | @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 Hettinger | bcab2b2 | 2004-09-29 08:03:17 +0000 | [diff] [blame] | 169 | if __name__ == "__main__": |
Zachary Ware | 38c707e | 2015-04-13 15:00:43 -0500 | [diff] [blame] | 170 | unittest.main() |