Commit | Line | Data |
---|---|---|
920dae64 AT |
1 | """ |
2 | Tests common to tuple, list and UserList.UserList | |
3 | """ | |
4 | ||
5 | import unittest | |
6 | from test import test_support | |
7 | ||
8 | class CommonTest(unittest.TestCase): | |
9 | # The type to be tested | |
10 | type2test = None | |
11 | ||
12 | def test_constructors(self): | |
13 | l0 = [] | |
14 | l1 = [0] | |
15 | l2 = [0, 1] | |
16 | ||
17 | u = self.type2test() | |
18 | u0 = self.type2test(l0) | |
19 | u1 = self.type2test(l1) | |
20 | u2 = self.type2test(l2) | |
21 | ||
22 | uu = self.type2test(u) | |
23 | uu0 = self.type2test(u0) | |
24 | uu1 = self.type2test(u1) | |
25 | uu2 = self.type2test(u2) | |
26 | ||
27 | v = self.type2test(tuple(u)) | |
28 | class OtherSeq: | |
29 | def __init__(self, initseq): | |
30 | self.__data = initseq | |
31 | def __len__(self): | |
32 | return len(self.__data) | |
33 | def __getitem__(self, i): | |
34 | return self.__data[i] | |
35 | s = OtherSeq(u0) | |
36 | v0 = self.type2test(s) | |
37 | self.assertEqual(len(v0), len(s)) | |
38 | ||
39 | s = "this is also a sequence" | |
40 | vv = self.type2test(s) | |
41 | self.assertEqual(len(vv), len(s)) | |
42 | ||
43 | def test_truth(self): | |
44 | self.assert_(not self.type2test()) | |
45 | self.assert_(self.type2test([42])) | |
46 | ||
47 | def test_getitem(self): | |
48 | u = self.type2test([0, 1, 2, 3, 4]) | |
49 | for i in xrange(len(u)): | |
50 | self.assertEqual(u[i], i) | |
51 | self.assertEqual(u[long(i)], i) | |
52 | for i in xrange(-len(u), -1): | |
53 | self.assertEqual(u[i], len(u)+i) | |
54 | self.assertEqual(u[long(i)], len(u)+i) | |
55 | self.assertRaises(IndexError, u.__getitem__, -len(u)-1) | |
56 | self.assertRaises(IndexError, u.__getitem__, len(u)) | |
57 | self.assertRaises(ValueError, u.__getitem__, slice(0,10,0)) | |
58 | ||
59 | u = self.type2test() | |
60 | self.assertRaises(IndexError, u.__getitem__, 0) | |
61 | self.assertRaises(IndexError, u.__getitem__, -1) | |
62 | ||
63 | self.assertRaises(TypeError, u.__getitem__) | |
64 | ||
65 | a = self.type2test([10, 11]) | |
66 | self.assertEqual(a[0], 10) | |
67 | self.assertEqual(a[1], 11) | |
68 | self.assertEqual(a[-2], 10) | |
69 | self.assertEqual(a[-1], 11) | |
70 | self.assertRaises(IndexError, a.__getitem__, -3) | |
71 | self.assertRaises(IndexError, a.__getitem__, 3) | |
72 | ||
73 | def test_getslice(self): | |
74 | l = [0, 1, 2, 3, 4] | |
75 | u = self.type2test(l) | |
76 | ||
77 | self.assertEqual(u[0:0], self.type2test()) | |
78 | self.assertEqual(u[1:2], self.type2test([1])) | |
79 | self.assertEqual(u[-2:-1], self.type2test([3])) | |
80 | self.assertEqual(u[-1000:1000], u) | |
81 | self.assertEqual(u[1000:-1000], self.type2test([])) | |
82 | self.assertEqual(u[:], u) | |
83 | self.assertEqual(u[1:None], self.type2test([1, 2, 3, 4])) | |
84 | self.assertEqual(u[None:3], self.type2test([0, 1, 2])) | |
85 | ||
86 | # Extended slices | |
87 | self.assertEqual(u[::], u) | |
88 | self.assertEqual(u[::2], self.type2test([0, 2, 4])) | |
89 | self.assertEqual(u[1::2], self.type2test([1, 3])) | |
90 | self.assertEqual(u[::-1], self.type2test([4, 3, 2, 1, 0])) | |
91 | self.assertEqual(u[::-2], self.type2test([4, 2, 0])) | |
92 | self.assertEqual(u[3::-2], self.type2test([3, 1])) | |
93 | self.assertEqual(u[3:3:-2], self.type2test([])) | |
94 | self.assertEqual(u[3:2:-2], self.type2test([3])) | |
95 | self.assertEqual(u[3:1:-2], self.type2test([3])) | |
96 | self.assertEqual(u[3:0:-2], self.type2test([3, 1])) | |
97 | self.assertEqual(u[::-100], self.type2test([4])) | |
98 | self.assertEqual(u[100:-100:], self.type2test([])) | |
99 | self.assertEqual(u[-100:100:], u) | |
100 | self.assertEqual(u[100:-100:-1], u[::-1]) | |
101 | self.assertEqual(u[-100:100:-1], self.type2test([])) | |
102 | self.assertEqual(u[-100L:100L:2L], self.type2test([0, 2, 4])) | |
103 | ||
104 | # Test extreme cases with long ints | |
105 | a = self.type2test([0,1,2,3,4]) | |
106 | self.assertEqual(a[ -pow(2,128L): 3 ], self.type2test([0,1,2])) | |
107 | self.assertEqual(a[ 3: pow(2,145L) ], self.type2test([3,4])) | |
108 | ||
109 | self.assertRaises(TypeError, u.__getslice__) | |
110 | ||
111 | def test_contains(self): | |
112 | u = self.type2test([0, 1, 2]) | |
113 | for i in u: | |
114 | self.assert_(i in u) | |
115 | for i in min(u)-1, max(u)+1: | |
116 | self.assert_(i not in u) | |
117 | ||
118 | self.assertRaises(TypeError, u.__contains__) | |
119 | ||
120 | def test_len(self): | |
121 | self.assertEqual(len(self.type2test()), 0) | |
122 | self.assertEqual(len(self.type2test([])), 0) | |
123 | self.assertEqual(len(self.type2test([0])), 1) | |
124 | self.assertEqual(len(self.type2test([0, 1, 2])), 3) | |
125 | ||
126 | def test_minmax(self): | |
127 | u = self.type2test([0, 1, 2]) | |
128 | self.assertEqual(min(u), 0) | |
129 | self.assertEqual(max(u), 2) | |
130 | ||
131 | def test_addmul(self): | |
132 | u1 = self.type2test([0]) | |
133 | u2 = self.type2test([0, 1]) | |
134 | self.assertEqual(u1, u1 + self.type2test()) | |
135 | self.assertEqual(u1, self.type2test() + u1) | |
136 | self.assertEqual(u1 + self.type2test([1]), u2) | |
137 | self.assertEqual(self.type2test([-1]) + u1, self.type2test([-1, 0])) | |
138 | self.assertEqual(self.type2test(), u2*0) | |
139 | self.assertEqual(self.type2test(), 0*u2) | |
140 | self.assertEqual(self.type2test(), u2*0L) | |
141 | self.assertEqual(self.type2test(), 0L*u2) | |
142 | self.assertEqual(u2, u2*1) | |
143 | self.assertEqual(u2, 1*u2) | |
144 | self.assertEqual(u2, u2*1L) | |
145 | self.assertEqual(u2, 1L*u2) | |
146 | self.assertEqual(u2+u2, u2*2) | |
147 | self.assertEqual(u2+u2, 2*u2) | |
148 | self.assertEqual(u2+u2, u2*2L) | |
149 | self.assertEqual(u2+u2, 2L*u2) | |
150 | self.assertEqual(u2+u2+u2, u2*3) | |
151 | self.assertEqual(u2+u2+u2, 3*u2) | |
152 | ||
153 | class subclass(self.type2test): | |
154 | pass | |
155 | u3 = subclass([0, 1]) | |
156 | self.assertEqual(u3, u3*1) | |
157 | self.assert_(u3 is not u3*1) | |
158 | ||
159 | def test_iadd(self): | |
160 | u = self.type2test([0, 1]) | |
161 | u += self.type2test() | |
162 | self.assertEqual(u, self.type2test([0, 1])) | |
163 | u += self.type2test([2, 3]) | |
164 | self.assertEqual(u, self.type2test([0, 1, 2, 3])) | |
165 | u += self.type2test([4, 5]) | |
166 | self.assertEqual(u, self.type2test([0, 1, 2, 3, 4, 5])) | |
167 | ||
168 | u = self.type2test("spam") | |
169 | u += self.type2test("eggs") | |
170 | self.assertEqual(u, self.type2test("spameggs")) | |
171 | ||
172 | def test_imul(self): | |
173 | u = self.type2test([0, 1]) | |
174 | u *= 3 | |
175 | self.assertEqual(u, self.type2test([0, 1, 0, 1, 0, 1])) | |
176 | ||
177 | def test_getitemoverwriteiter(self): | |
178 | # Verify that __getitem__ overrides are not recognized by __iter__ | |
179 | class T(self.type2test): | |
180 | def __getitem__(self, key): | |
181 | return str(key) + '!!!' | |
182 | self.assertEqual(iter(T((1,2))).next(), 1) | |
183 | ||
184 | def test_repeat(self): | |
185 | for m in xrange(4): | |
186 | s = tuple(range(m)) | |
187 | for n in xrange(-3, 5): | |
188 | self.assertEqual(self.type2test(s*n), self.type2test(s)*n) | |
189 | self.assertEqual(self.type2test(s)*(-4), self.type2test([])) | |
190 | self.assertEqual(id(s), id(s*1)) | |
191 | ||
192 | def test_subscript(self): | |
193 | a = self.type2test([10, 11]) | |
194 | self.assertEqual(a.__getitem__(0L), 10) | |
195 | self.assertEqual(a.__getitem__(1L), 11) | |
196 | self.assertEqual(a.__getitem__(-2L), 10) | |
197 | self.assertEqual(a.__getitem__(-1L), 11) | |
198 | self.assertRaises(IndexError, a.__getitem__, -3) | |
199 | self.assertRaises(IndexError, a.__getitem__, 3) | |
200 | self.assertEqual(a.__getitem__(slice(0,1)), self.type2test([10])) | |
201 | self.assertEqual(a.__getitem__(slice(1,2)), self.type2test([11])) | |
202 | self.assertEqual(a.__getitem__(slice(0,2)), self.type2test([10, 11])) | |
203 | self.assertEqual(a.__getitem__(slice(0,3)), self.type2test([10, 11])) | |
204 | self.assertEqual(a.__getitem__(slice(3,5)), self.type2test([])) | |
205 | self.assertRaises(ValueError, a.__getitem__, slice(0, 10, 0)) | |
206 | self.assertRaises(TypeError, a.__getitem__, 'x') |