]>
Commit | Line | Data |
---|---|---|
4710c53d | 1 | import unittest\r |
2 | from test import test_support\r | |
3 | import operator\r | |
4 | from sys import maxint\r | |
5 | maxsize = test_support.MAX_Py_ssize_t\r | |
6 | minsize = -maxsize-1\r | |
7 | \r | |
8 | class oldstyle:\r | |
9 | def __index__(self):\r | |
10 | return self.ind\r | |
11 | \r | |
12 | class newstyle(object):\r | |
13 | def __index__(self):\r | |
14 | return self.ind\r | |
15 | \r | |
16 | class TrapInt(int):\r | |
17 | def __index__(self):\r | |
18 | return self\r | |
19 | \r | |
20 | class TrapLong(long):\r | |
21 | def __index__(self):\r | |
22 | return self\r | |
23 | \r | |
24 | class BaseTestCase(unittest.TestCase):\r | |
25 | def setUp(self):\r | |
26 | self.o = oldstyle()\r | |
27 | self.n = newstyle()\r | |
28 | \r | |
29 | def test_basic(self):\r | |
30 | self.o.ind = -2\r | |
31 | self.n.ind = 2\r | |
32 | self.assertEqual(operator.index(self.o), -2)\r | |
33 | self.assertEqual(operator.index(self.n), 2)\r | |
34 | \r | |
35 | def test_slice(self):\r | |
36 | self.o.ind = 1\r | |
37 | self.n.ind = 2\r | |
38 | slc = slice(self.o, self.o, self.o)\r | |
39 | check_slc = slice(1, 1, 1)\r | |
40 | self.assertEqual(slc.indices(self.o), check_slc.indices(1))\r | |
41 | slc = slice(self.n, self.n, self.n)\r | |
42 | check_slc = slice(2, 2, 2)\r | |
43 | self.assertEqual(slc.indices(self.n), check_slc.indices(2))\r | |
44 | \r | |
45 | def test_wrappers(self):\r | |
46 | self.o.ind = 4\r | |
47 | self.n.ind = 5\r | |
48 | self.assertEqual(6 .__index__(), 6)\r | |
49 | self.assertEqual(-7L.__index__(), -7)\r | |
50 | self.assertEqual(self.o.__index__(), 4)\r | |
51 | self.assertEqual(self.n.__index__(), 5)\r | |
52 | self.assertEqual(True.__index__(), 1)\r | |
53 | self.assertEqual(False.__index__(), 0)\r | |
54 | \r | |
55 | def test_subclasses(self):\r | |
56 | r = range(10)\r | |
57 | self.assertEqual(r[TrapInt(5):TrapInt(10)], r[5:10])\r | |
58 | self.assertEqual(r[TrapLong(5):TrapLong(10)], r[5:10])\r | |
59 | self.assertEqual(slice(TrapInt()).indices(0), (0,0,1))\r | |
60 | self.assertEqual(slice(TrapLong(0)).indices(0), (0,0,1))\r | |
61 | \r | |
62 | def test_error(self):\r | |
63 | self.o.ind = 'dumb'\r | |
64 | self.n.ind = 'bad'\r | |
65 | self.assertRaises(TypeError, operator.index, self.o)\r | |
66 | self.assertRaises(TypeError, operator.index, self.n)\r | |
67 | self.assertRaises(TypeError, slice(self.o).indices, 0)\r | |
68 | self.assertRaises(TypeError, slice(self.n).indices, 0)\r | |
69 | \r | |
70 | \r | |
71 | class SeqTestCase(unittest.TestCase):\r | |
72 | # This test case isn't run directly. It just defines common tests\r | |
73 | # to the different sequence types below\r | |
74 | def setUp(self):\r | |
75 | self.o = oldstyle()\r | |
76 | self.n = newstyle()\r | |
77 | self.o2 = oldstyle()\r | |
78 | self.n2 = newstyle()\r | |
79 | \r | |
80 | def test_index(self):\r | |
81 | self.o.ind = -2\r | |
82 | self.n.ind = 2\r | |
83 | self.assertEqual(self.seq[self.n], self.seq[2])\r | |
84 | self.assertEqual(self.seq[self.o], self.seq[-2])\r | |
85 | \r | |
86 | def test_slice(self):\r | |
87 | self.o.ind = 1\r | |
88 | self.o2.ind = 3\r | |
89 | self.n.ind = 2\r | |
90 | self.n2.ind = 4\r | |
91 | self.assertEqual(self.seq[self.o:self.o2], self.seq[1:3])\r | |
92 | self.assertEqual(self.seq[self.n:self.n2], self.seq[2:4])\r | |
93 | \r | |
94 | def test_slice_bug7532(self):\r | |
95 | seqlen = len(self.seq)\r | |
96 | self.o.ind = int(seqlen * 1.5)\r | |
97 | self.n.ind = seqlen + 2\r | |
98 | self.assertEqual(self.seq[self.o:], self.seq[0:0])\r | |
99 | self.assertEqual(self.seq[:self.o], self.seq)\r | |
100 | self.assertEqual(self.seq[self.n:], self.seq[0:0])\r | |
101 | self.assertEqual(self.seq[:self.n], self.seq)\r | |
102 | if isinstance(self.seq, ClassicSeq):\r | |
103 | return\r | |
104 | # These tests fail for ClassicSeq (see bug #7532)\r | |
105 | self.o2.ind = -seqlen - 2\r | |
106 | self.n2.ind = -int(seqlen * 1.5)\r | |
107 | self.assertEqual(self.seq[self.o2:], self.seq)\r | |
108 | self.assertEqual(self.seq[:self.o2], self.seq[0:0])\r | |
109 | self.assertEqual(self.seq[self.n2:], self.seq)\r | |
110 | self.assertEqual(self.seq[:self.n2], self.seq[0:0])\r | |
111 | \r | |
112 | def test_repeat(self):\r | |
113 | self.o.ind = 3\r | |
114 | self.n.ind = 2\r | |
115 | self.assertEqual(self.seq * self.o, self.seq * 3)\r | |
116 | self.assertEqual(self.seq * self.n, self.seq * 2)\r | |
117 | self.assertEqual(self.o * self.seq, self.seq * 3)\r | |
118 | self.assertEqual(self.n * self.seq, self.seq * 2)\r | |
119 | \r | |
120 | def test_wrappers(self):\r | |
121 | self.o.ind = 4\r | |
122 | self.n.ind = 5\r | |
123 | self.assertEqual(self.seq.__getitem__(self.o), self.seq[4])\r | |
124 | self.assertEqual(self.seq.__mul__(self.o), self.seq * 4)\r | |
125 | self.assertEqual(self.seq.__rmul__(self.o), self.seq * 4)\r | |
126 | self.assertEqual(self.seq.__getitem__(self.n), self.seq[5])\r | |
127 | self.assertEqual(self.seq.__mul__(self.n), self.seq * 5)\r | |
128 | self.assertEqual(self.seq.__rmul__(self.n), self.seq * 5)\r | |
129 | \r | |
130 | def test_subclasses(self):\r | |
131 | self.assertEqual(self.seq[TrapInt()], self.seq[0])\r | |
132 | self.assertEqual(self.seq[TrapLong()], self.seq[0])\r | |
133 | \r | |
134 | def test_error(self):\r | |
135 | self.o.ind = 'dumb'\r | |
136 | self.n.ind = 'bad'\r | |
137 | indexobj = lambda x, obj: obj.seq[x]\r | |
138 | self.assertRaises(TypeError, indexobj, self.o, self)\r | |
139 | self.assertRaises(TypeError, indexobj, self.n, self)\r | |
140 | sliceobj = lambda x, obj: obj.seq[x:]\r | |
141 | self.assertRaises(TypeError, sliceobj, self.o, self)\r | |
142 | self.assertRaises(TypeError, sliceobj, self.n, self)\r | |
143 | \r | |
144 | \r | |
145 | class ListTestCase(SeqTestCase):\r | |
146 | seq = [0,10,20,30,40,50]\r | |
147 | \r | |
148 | def test_setdelitem(self):\r | |
149 | self.o.ind = -2\r | |
150 | self.n.ind = 2\r | |
151 | lst = list('ab!cdefghi!j')\r | |
152 | del lst[self.o]\r | |
153 | del lst[self.n]\r | |
154 | lst[self.o] = 'X'\r | |
155 | lst[self.n] = 'Y'\r | |
156 | self.assertEqual(lst, list('abYdefghXj'))\r | |
157 | \r | |
158 | lst = [5, 6, 7, 8, 9, 10, 11]\r | |
159 | lst.__setitem__(self.n, "here")\r | |
160 | self.assertEqual(lst, [5, 6, "here", 8, 9, 10, 11])\r | |
161 | lst.__delitem__(self.n)\r | |
162 | self.assertEqual(lst, [5, 6, 8, 9, 10, 11])\r | |
163 | \r | |
164 | def test_inplace_repeat(self):\r | |
165 | self.o.ind = 2\r | |
166 | self.n.ind = 3\r | |
167 | lst = [6, 4]\r | |
168 | lst *= self.o\r | |
169 | self.assertEqual(lst, [6, 4, 6, 4])\r | |
170 | lst *= self.n\r | |
171 | self.assertEqual(lst, [6, 4, 6, 4] * 3)\r | |
172 | \r | |
173 | lst = [5, 6, 7, 8, 9, 11]\r | |
174 | l2 = lst.__imul__(self.n)\r | |
175 | self.assertIs(l2, lst)\r | |
176 | self.assertEqual(lst, [5, 6, 7, 8, 9, 11] * 3)\r | |
177 | \r | |
178 | \r | |
179 | class _BaseSeq:\r | |
180 | \r | |
181 | def __init__(self, iterable):\r | |
182 | self._list = list(iterable)\r | |
183 | \r | |
184 | def __repr__(self):\r | |
185 | return repr(self._list)\r | |
186 | \r | |
187 | def __eq__(self, other):\r | |
188 | return self._list == other\r | |
189 | \r | |
190 | def __len__(self):\r | |
191 | return len(self._list)\r | |
192 | \r | |
193 | def __mul__(self, n):\r | |
194 | return self.__class__(self._list*n)\r | |
195 | __rmul__ = __mul__\r | |
196 | \r | |
197 | def __getitem__(self, index):\r | |
198 | return self._list[index]\r | |
199 | \r | |
200 | \r | |
201 | class _GetSliceMixin:\r | |
202 | \r | |
203 | def __getslice__(self, i, j):\r | |
204 | return self._list.__getslice__(i, j)\r | |
205 | \r | |
206 | \r | |
207 | class ClassicSeq(_BaseSeq): pass\r | |
208 | class NewSeq(_BaseSeq, object): pass\r | |
209 | class ClassicSeqDeprecated(_GetSliceMixin, ClassicSeq): pass\r | |
210 | class NewSeqDeprecated(_GetSliceMixin, NewSeq): pass\r | |
211 | \r | |
212 | \r | |
213 | class TupleTestCase(SeqTestCase):\r | |
214 | seq = (0,10,20,30,40,50)\r | |
215 | \r | |
216 | class StringTestCase(SeqTestCase):\r | |
217 | seq = "this is a test"\r | |
218 | \r | |
219 | class ByteArrayTestCase(SeqTestCase):\r | |
220 | seq = bytearray("this is a test")\r | |
221 | \r | |
222 | class UnicodeTestCase(SeqTestCase):\r | |
223 | seq = u"this is a test"\r | |
224 | \r | |
225 | class ClassicSeqTestCase(SeqTestCase):\r | |
226 | seq = ClassicSeq((0,10,20,30,40,50))\r | |
227 | \r | |
228 | class NewSeqTestCase(SeqTestCase):\r | |
229 | seq = NewSeq((0,10,20,30,40,50))\r | |
230 | \r | |
231 | class ClassicSeqDeprecatedTestCase(SeqTestCase):\r | |
232 | seq = ClassicSeqDeprecated((0,10,20,30,40,50))\r | |
233 | \r | |
234 | class NewSeqDeprecatedTestCase(SeqTestCase):\r | |
235 | seq = NewSeqDeprecated((0,10,20,30,40,50))\r | |
236 | \r | |
237 | \r | |
238 | class XRangeTestCase(unittest.TestCase):\r | |
239 | \r | |
240 | def test_xrange(self):\r | |
241 | n = newstyle()\r | |
242 | n.ind = 5\r | |
243 | self.assertEqual(xrange(1, 20)[n], 6)\r | |
244 | self.assertEqual(xrange(1, 20).__getitem__(n), 6)\r | |
245 | \r | |
246 | class OverflowTestCase(unittest.TestCase):\r | |
247 | \r | |
248 | def setUp(self):\r | |
249 | self.pos = 2**100\r | |
250 | self.neg = -self.pos\r | |
251 | \r | |
252 | def test_large_longs(self):\r | |
253 | self.assertEqual(self.pos.__index__(), self.pos)\r | |
254 | self.assertEqual(self.neg.__index__(), self.neg)\r | |
255 | \r | |
256 | def _getitem_helper(self, base):\r | |
257 | class GetItem(base):\r | |
258 | def __len__(self):\r | |
259 | return maxint # cannot return long here\r | |
260 | def __getitem__(self, key):\r | |
261 | return key\r | |
262 | x = GetItem()\r | |
263 | self.assertEqual(x[self.pos], self.pos)\r | |
264 | self.assertEqual(x[self.neg], self.neg)\r | |
265 | self.assertEqual(x[self.neg:self.pos].indices(maxsize),\r | |
266 | (0, maxsize, 1))\r | |
267 | self.assertEqual(x[self.neg:self.pos:1].indices(maxsize),\r | |
268 | (0, maxsize, 1))\r | |
269 | \r | |
270 | def _getslice_helper_deprecated(self, base):\r | |
271 | class GetItem(base):\r | |
272 | def __len__(self):\r | |
273 | return maxint # cannot return long here\r | |
274 | def __getitem__(self, key):\r | |
275 | return key\r | |
276 | def __getslice__(self, i, j):\r | |
277 | return i, j\r | |
278 | x = GetItem()\r | |
279 | self.assertEqual(x[self.pos], self.pos)\r | |
280 | self.assertEqual(x[self.neg], self.neg)\r | |
281 | self.assertEqual(x[self.neg:self.pos], (maxint+minsize, maxsize))\r | |
282 | self.assertEqual(x[self.neg:self.pos:1].indices(maxsize),\r | |
283 | (0, maxsize, 1))\r | |
284 | \r | |
285 | def test_getitem(self):\r | |
286 | self._getitem_helper(object)\r | |
287 | with test_support.check_py3k_warnings():\r | |
288 | self._getslice_helper_deprecated(object)\r | |
289 | \r | |
290 | def test_getitem_classic(self):\r | |
291 | class Empty: pass\r | |
292 | # XXX This test fails (see bug #7532)\r | |
293 | #self._getitem_helper(Empty)\r | |
294 | with test_support.check_py3k_warnings():\r | |
295 | self._getslice_helper_deprecated(Empty)\r | |
296 | \r | |
297 | def test_sequence_repeat(self):\r | |
298 | self.assertRaises(OverflowError, lambda: "a" * self.pos)\r | |
299 | self.assertRaises(OverflowError, lambda: "a" * self.neg)\r | |
300 | \r | |
301 | \r | |
302 | def test_main():\r | |
303 | test_support.run_unittest(\r | |
304 | BaseTestCase,\r | |
305 | ListTestCase,\r | |
306 | TupleTestCase,\r | |
307 | ByteArrayTestCase,\r | |
308 | StringTestCase,\r | |
309 | UnicodeTestCase,\r | |
310 | ClassicSeqTestCase,\r | |
311 | NewSeqTestCase,\r | |
312 | XRangeTestCase,\r | |
313 | OverflowTestCase,\r | |
314 | )\r | |
315 | with test_support.check_py3k_warnings():\r | |
316 | test_support.run_unittest(\r | |
317 | ClassicSeqDeprecatedTestCase,\r | |
318 | NewSeqDeprecatedTestCase,\r | |
319 | )\r | |
320 | \r | |
321 | \r | |
322 | if __name__ == "__main__":\r | |
323 | test_main()\r |