blob: 302c1d82607c81c90591a7edc34092f2389ebf0e [file] [log] [blame]
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001import sys
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002from test import support, list_tests
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003import pickle
Walter Dörwald1dde95d2003-12-08 11:38:45 +00004
5class ListTest(list_tests.CommonTest):
6 type2test = list
7
Christian Heimes81ee3ef2008-05-04 22:42:01 +00008 def test_basic(self):
9 self.assertEqual(list([]), [])
10 l0_3 = [0, 1, 2, 3]
11 l0_3_bis = list(l0_3)
12 self.assertEqual(l0_3, l0_3_bis)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000013 self.assertTrue(l0_3 is not l0_3_bis)
Christian Heimes81ee3ef2008-05-04 22:42:01 +000014 self.assertEqual(list(()), [])
15 self.assertEqual(list((0, 1, 2, 3)), [0, 1, 2, 3])
16 self.assertEqual(list(''), [])
17 self.assertEqual(list('spam'), ['s', 'p', 'a', 'm'])
18
Benjamin Petersona786b022008-08-25 21:05:21 +000019 if sys.maxsize == 0x7fffffff:
20 # This test can currently only work on 32-bit machines.
21 # XXX If/when PySequence_Length() returns a ssize_t, it should be
22 # XXX re-enabled.
23 # Verify clearing of bug #556025.
24 # This assumes that the max data size (sys.maxint) == max
25 # address size this also assumes that the address size is at
26 # least 4 bytes with 8 byte addresses, the bug is not well
27 # tested
28 #
29 # Note: This test is expected to SEGV under Cygwin 1.3.12 or
30 # earlier due to a newlib bug. See the following mailing list
31 # thread for the details:
32
33 # http://sources.redhat.com/ml/newlib/2002/msg00369.html
34 self.assertRaises(MemoryError, list, range(sys.maxsize // 2))
35
Christian Heimes81ee3ef2008-05-04 22:42:01 +000036 # This code used to segfault in Py2.4a3
37 x = []
38 x.extend(-y for y in x)
39 self.assertEqual(x, [])
40
Walter Dörwald1dde95d2003-12-08 11:38:45 +000041 def test_truth(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +000042 super().test_truth()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000043 self.assertTrue(not [])
44 self.assertTrue([42])
Walter Dörwald1dde95d2003-12-08 11:38:45 +000045
46 def test_identity(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000047 self.assertTrue([] is not [])
Walter Dörwald1dde95d2003-12-08 11:38:45 +000048
49 def test_len(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +000050 super().test_len()
Walter Dörwald1dde95d2003-12-08 11:38:45 +000051 self.assertEqual(len([]), 0)
52 self.assertEqual(len([0]), 1)
53 self.assertEqual(len([0, 1, 2]), 3)
54
Guido van Rossum8ce8a782007-11-01 19:42:39 +000055 def test_overflow(self):
56 lst = [4, 5, 6, 7]
Christian Heimesa37d4c62007-12-04 23:02:19 +000057 n = int((sys.maxsize*2+2) // len(lst))
Guido van Rossum8ce8a782007-11-01 19:42:39 +000058 def mul(a, b): return a * b
59 def imul(a, b): a *= b
60 self.assertRaises((MemoryError, OverflowError), mul, lst, n)
61 self.assertRaises((MemoryError, OverflowError), imul, lst, n)
62
Antoine Pitroueeb7eea2011-10-06 18:57:27 +020063 def test_repr_large(self):
64 # Check the repr of large list objects
65 def check(n):
66 l = [0] * n
67 s = repr(l)
68 self.assertEqual(s,
69 '[' + ', '.join(['0'] * n) + ']')
70 check(10) # check our checking code
71 check(1000000)
72
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +000073 def test_iterator_pickle(self):
74 # Userlist iterators don't support pickling yet since
75 # they are based on generators.
76 data = self.type2test([4, 5, 6, 7])
77 it = itorg = iter(data)
78 d = pickle.dumps(it)
79 it = pickle.loads(d)
80 self.assertEqual(type(itorg), type(it))
81 self.assertEqual(self.type2test(it), self.type2test(data))
82
83 it = pickle.loads(d)
84 next(it)
85 d = pickle.dumps(it)
86 self.assertEqual(self.type2test(it), self.type2test(data)[1:])
87
88 def test_reversed_pickle(self):
89 data = self.type2test([4, 5, 6, 7])
90 it = itorg = reversed(data)
91 d = pickle.dumps(it)
92 it = pickle.loads(d)
93 self.assertEqual(type(itorg), type(it))
94 self.assertEqual(self.type2test(it), self.type2test(reversed(data)))
95
96 it = pickle.loads(d)
97 next(it)
98 d = pickle.dumps(it)
99 self.assertEqual(self.type2test(it), self.type2test(reversed(data))[1:])
Antoine Pitroueeb7eea2011-10-06 18:57:27 +0200100
Raymond Hettingerbcab2b22004-09-29 08:03:17 +0000101def test_main(verbose=None):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000102 support.run_unittest(ListTest)
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000103
Raymond Hettingerbcab2b22004-09-29 08:03:17 +0000104 # verify reference counting
105 import sys
106 if verbose and hasattr(sys, "gettotalrefcount"):
107 import gc
108 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +0000109 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000110 support.run_unittest(ListTest)
Raymond Hettingerbcab2b22004-09-29 08:03:17 +0000111 gc.collect()
112 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000113 print(counts)
Raymond Hettingerbcab2b22004-09-29 08:03:17 +0000114
115
116if __name__ == "__main__":
117 test_main(verbose=True)