blob: 4c2999306e16b1d2bdc1ece22d88cace66d85330 [file] [log] [blame]
Armin Rigo5eca19b2006-03-30 11:28:43 +00001import unittest
2from test import test_support
3import operator
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00004from sys import maxint
Kristján Valur Jónsson170eee92007-05-03 20:09:56 +00005maxsize = test_support.MAX_Py_ssize_t
6minsize = -maxsize-1
Armin Rigo5eca19b2006-03-30 11:28:43 +00007
8class oldstyle:
9 def __index__(self):
10 return self.ind
11
12class newstyle(object):
13 def __index__(self):
14 return self.ind
15
Neal Norwitz8a87f5d2006-08-12 17:03:09 +000016class TrapInt(int):
17 def __index__(self):
18 return self
19
20class TrapLong(long):
21 def __index__(self):
22 return self
23
Armin Rigo314861c2006-03-30 14:04:02 +000024class BaseTestCase(unittest.TestCase):
Armin Rigo5eca19b2006-03-30 11:28:43 +000025 def setUp(self):
Armin Rigo5eca19b2006-03-30 11:28:43 +000026 self.o = oldstyle()
27 self.n = newstyle()
Neal Norwitz8a87f5d2006-08-12 17:03:09 +000028
29 def test_basic(self):
30 self.o.ind = -2
31 self.n.ind = 2
32 self.assertEqual(operator.index(self.o), -2)
33 self.assertEqual(operator.index(self.n), 2)
Tim Petersc02c1c82006-08-15 00:25:04 +000034
Neal Norwitz8a87f5d2006-08-12 17:03:09 +000035 def test_slice(self):
36 self.o.ind = 1
37 self.n.ind = 2
38 slc = slice(self.o, self.o, self.o)
39 check_slc = slice(1, 1, 1)
40 self.assertEqual(slc.indices(self.o), check_slc.indices(1))
41 slc = slice(self.n, self.n, self.n)
42 check_slc = slice(2, 2, 2)
43 self.assertEqual(slc.indices(self.n), check_slc.indices(2))
44
45 def test_wrappers(self):
46 self.o.ind = 4
47 self.n.ind = 5
48 self.assertEqual(6 .__index__(), 6)
49 self.assertEqual(-7L.__index__(), -7)
50 self.assertEqual(self.o.__index__(), 4)
51 self.assertEqual(self.n.__index__(), 5)
Antoine Pitrou6032c252010-03-30 18:49:45 +000052 self.assertEqual(True.__index__(), 1)
53 self.assertEqual(False.__index__(), 0)
Neal Norwitz8a87f5d2006-08-12 17:03:09 +000054
Neal Norwitz271a8682006-08-15 06:29:03 +000055 def test_subclasses(self):
56 r = range(10)
57 self.assertEqual(r[TrapInt(5):TrapInt(10)], r[5:10])
58 self.assertEqual(r[TrapLong(5):TrapLong(10)], r[5:10])
59 self.assertEqual(slice(TrapInt()).indices(0), (0,0,1))
60 self.assertEqual(slice(TrapLong(0)).indices(0), (0,0,1))
Tim Petersc02c1c82006-08-15 00:25:04 +000061
Neal Norwitz8a87f5d2006-08-12 17:03:09 +000062 def test_error(self):
63 self.o.ind = 'dumb'
64 self.n.ind = 'bad'
Benjamin Peterson5c8da862009-06-30 22:57:08 +000065 self.assertRaises(TypeError, operator.index, self.o)
66 self.assertRaises(TypeError, operator.index, self.n)
67 self.assertRaises(TypeError, slice(self.o).indices, 0)
68 self.assertRaises(TypeError, slice(self.n).indices, 0)
Neal Norwitz8a87f5d2006-08-12 17:03:09 +000069
70
71class SeqTestCase(unittest.TestCase):
72 # This test case isn't run directly. It just defines common tests
73 # to the different sequence types below
74 def setUp(self):
75 self.o = oldstyle()
76 self.n = newstyle()
Armin Rigo5eca19b2006-03-30 11:28:43 +000077 self.o2 = oldstyle()
78 self.n2 = newstyle()
Anthony Baxter4ef3a232006-03-30 12:59:11 +000079
Neal Norwitz8a87f5d2006-08-12 17:03:09 +000080 def test_index(self):
Armin Rigo5eca19b2006-03-30 11:28:43 +000081 self.o.ind = -2
82 self.n.ind = 2
Neal Norwitz8a87f5d2006-08-12 17:03:09 +000083 self.assertEqual(self.seq[self.n], self.seq[2])
84 self.assertEqual(self.seq[self.o], self.seq[-2])
Armin Rigo5eca19b2006-03-30 11:28:43 +000085
86 def test_slice(self):
87 self.o.ind = 1
88 self.o2.ind = 3
89 self.n.ind = 2
90 self.n2.ind = 4
Neal Norwitz8a87f5d2006-08-12 17:03:09 +000091 self.assertEqual(self.seq[self.o:self.o2], self.seq[1:3])
92 self.assertEqual(self.seq[self.n:self.n2], self.seq[2:4])
Armin Rigo5eca19b2006-03-30 11:28:43 +000093
Zachary Ware1f702212013-12-10 14:09:20 -060094 def test_slice_bug7532a(self):
Mark Dickinsone3656132010-01-09 18:50:50 +000095 seqlen = len(self.seq)
96 self.o.ind = int(seqlen * 1.5)
97 self.n.ind = seqlen + 2
98 self.assertEqual(self.seq[self.o:], self.seq[0:0])
99 self.assertEqual(self.seq[:self.o], self.seq)
100 self.assertEqual(self.seq[self.n:], self.seq[0:0])
101 self.assertEqual(self.seq[:self.n], self.seq)
Zachary Ware1f702212013-12-10 14:09:20 -0600102
103 def test_slice_bug7532b(self):
Mark Dickinsone3656132010-01-09 18:50:50 +0000104 if isinstance(self.seq, ClassicSeq):
Zachary Ware1f702212013-12-10 14:09:20 -0600105 self.skipTest('test fails for ClassicSeq')
Mark Dickinsone3656132010-01-09 18:50:50 +0000106 # These tests fail for ClassicSeq (see bug #7532)
Zachary Ware1f702212013-12-10 14:09:20 -0600107 seqlen = len(self.seq)
Mark Dickinsone3656132010-01-09 18:50:50 +0000108 self.o2.ind = -seqlen - 2
109 self.n2.ind = -int(seqlen * 1.5)
110 self.assertEqual(self.seq[self.o2:], self.seq)
111 self.assertEqual(self.seq[:self.o2], self.seq[0:0])
112 self.assertEqual(self.seq[self.n2:], self.seq)
113 self.assertEqual(self.seq[:self.n2], self.seq[0:0])
114
Armin Rigo314861c2006-03-30 14:04:02 +0000115 def test_repeat(self):
116 self.o.ind = 3
117 self.n.ind = 2
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000118 self.assertEqual(self.seq * self.o, self.seq * 3)
119 self.assertEqual(self.seq * self.n, self.seq * 2)
120 self.assertEqual(self.o * self.seq, self.seq * 3)
121 self.assertEqual(self.n * self.seq, self.seq * 2)
Armin Rigo5eca19b2006-03-30 11:28:43 +0000122
Armin Rigo314861c2006-03-30 14:04:02 +0000123 def test_wrappers(self):
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000124 self.o.ind = 4
125 self.n.ind = 5
126 self.assertEqual(self.seq.__getitem__(self.o), self.seq[4])
127 self.assertEqual(self.seq.__mul__(self.o), self.seq * 4)
128 self.assertEqual(self.seq.__rmul__(self.o), self.seq * 4)
129 self.assertEqual(self.seq.__getitem__(self.n), self.seq[5])
130 self.assertEqual(self.seq.__mul__(self.n), self.seq * 5)
131 self.assertEqual(self.seq.__rmul__(self.n), self.seq * 5)
Armin Rigo314861c2006-03-30 14:04:02 +0000132
Neal Norwitz271a8682006-08-15 06:29:03 +0000133 def test_subclasses(self):
134 self.assertEqual(self.seq[TrapInt()], self.seq[0])
135 self.assertEqual(self.seq[TrapLong()], self.seq[0])
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000136
137 def test_error(self):
138 self.o.ind = 'dumb'
139 self.n.ind = 'bad'
140 indexobj = lambda x, obj: obj.seq[x]
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000141 self.assertRaises(TypeError, indexobj, self.o, self)
142 self.assertRaises(TypeError, indexobj, self.n, self)
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000143 sliceobj = lambda x, obj: obj.seq[x:]
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000144 self.assertRaises(TypeError, sliceobj, self.o, self)
145 self.assertRaises(TypeError, sliceobj, self.n, self)
Anthony Baxter4ef3a232006-03-30 12:59:11 +0000146
147
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000148class ListTestCase(SeqTestCase):
Armin Rigo314861c2006-03-30 14:04:02 +0000149 seq = [0,10,20,30,40,50]
150
151 def test_setdelitem(self):
Armin Rigo5eca19b2006-03-30 11:28:43 +0000152 self.o.ind = -2
153 self.n.ind = 2
Armin Rigo314861c2006-03-30 14:04:02 +0000154 lst = list('ab!cdefghi!j')
155 del lst[self.o]
156 del lst[self.n]
157 lst[self.o] = 'X'
158 lst[self.n] = 'Y'
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000159 self.assertEqual(lst, list('abYdefghXj'))
Anthony Baxter4ef3a232006-03-30 12:59:11 +0000160
Armin Rigo314861c2006-03-30 14:04:02 +0000161 lst = [5, 6, 7, 8, 9, 10, 11]
162 lst.__setitem__(self.n, "here")
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000163 self.assertEqual(lst, [5, 6, "here", 8, 9, 10, 11])
Armin Rigo314861c2006-03-30 14:04:02 +0000164 lst.__delitem__(self.n)
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000165 self.assertEqual(lst, [5, 6, 8, 9, 10, 11])
Armin Rigo5eca19b2006-03-30 11:28:43 +0000166
Armin Rigo314861c2006-03-30 14:04:02 +0000167 def test_inplace_repeat(self):
168 self.o.ind = 2
169 self.n.ind = 3
170 lst = [6, 4]
171 lst *= self.o
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000172 self.assertEqual(lst, [6, 4, 6, 4])
Armin Rigo314861c2006-03-30 14:04:02 +0000173 lst *= self.n
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000174 self.assertEqual(lst, [6, 4, 6, 4] * 3)
Armin Rigo314861c2006-03-30 14:04:02 +0000175
176 lst = [5, 6, 7, 8, 9, 11]
177 l2 = lst.__imul__(self.n)
Florent Xiclunabc27c6a2010-03-19 18:34:55 +0000178 self.assertIs(l2, lst)
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000179 self.assertEqual(lst, [5, 6, 7, 8, 9, 11] * 3)
Armin Rigo314861c2006-03-30 14:04:02 +0000180
181
Mark Dickinsone3656132010-01-09 18:50:50 +0000182class _BaseSeq:
183
184 def __init__(self, iterable):
185 self._list = list(iterable)
186
187 def __repr__(self):
188 return repr(self._list)
189
190 def __eq__(self, other):
191 return self._list == other
192
193 def __len__(self):
194 return len(self._list)
195
196 def __mul__(self, n):
197 return self.__class__(self._list*n)
198 __rmul__ = __mul__
199
200 def __getitem__(self, index):
201 return self._list[index]
202
203
204class _GetSliceMixin:
205
206 def __getslice__(self, i, j):
207 return self._list.__getslice__(i, j)
208
209
210class ClassicSeq(_BaseSeq): pass
211class NewSeq(_BaseSeq, object): pass
212class ClassicSeqDeprecated(_GetSliceMixin, ClassicSeq): pass
213class NewSeqDeprecated(_GetSliceMixin, NewSeq): pass
214
215
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000216class TupleTestCase(SeqTestCase):
Armin Rigo314861c2006-03-30 14:04:02 +0000217 seq = (0,10,20,30,40,50)
218
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000219class StringTestCase(SeqTestCase):
Armin Rigo314861c2006-03-30 14:04:02 +0000220 seq = "this is a test"
221
Florent Xiclunabc27c6a2010-03-19 18:34:55 +0000222class ByteArrayTestCase(SeqTestCase):
223 seq = bytearray("this is a test")
224
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000225class UnicodeTestCase(SeqTestCase):
Armin Rigo314861c2006-03-30 14:04:02 +0000226 seq = u"this is a test"
227
Mark Dickinsone3656132010-01-09 18:50:50 +0000228class ClassicSeqTestCase(SeqTestCase):
229 seq = ClassicSeq((0,10,20,30,40,50))
230
231class NewSeqTestCase(SeqTestCase):
232 seq = NewSeq((0,10,20,30,40,50))
233
234class ClassicSeqDeprecatedTestCase(SeqTestCase):
235 seq = ClassicSeqDeprecated((0,10,20,30,40,50))
236
237class NewSeqDeprecatedTestCase(SeqTestCase):
238 seq = NewSeqDeprecated((0,10,20,30,40,50))
239
Armin Rigo314861c2006-03-30 14:04:02 +0000240
241class XRangeTestCase(unittest.TestCase):
242
243 def test_xrange(self):
244 n = newstyle()
245 n.ind = 5
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000246 self.assertEqual(xrange(1, 20)[n], 6)
247 self.assertEqual(xrange(1, 20).__getitem__(n), 6)
248
249class OverflowTestCase(unittest.TestCase):
250
251 def setUp(self):
252 self.pos = 2**100
253 self.neg = -self.pos
254
255 def test_large_longs(self):
256 self.assertEqual(self.pos.__index__(), self.pos)
257 self.assertEqual(self.neg.__index__(), self.neg)
258
Neal Norwitz1872b1c2006-08-12 18:44:06 +0000259 def _getitem_helper(self, base):
260 class GetItem(base):
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000261 def __len__(self):
Mark Dickinsone3656132010-01-09 18:50:50 +0000262 return maxint # cannot return long here
263 def __getitem__(self, key):
264 return key
265 x = GetItem()
266 self.assertEqual(x[self.pos], self.pos)
267 self.assertEqual(x[self.neg], self.neg)
268 self.assertEqual(x[self.neg:self.pos].indices(maxsize),
269 (0, maxsize, 1))
270 self.assertEqual(x[self.neg:self.pos:1].indices(maxsize),
271 (0, maxsize, 1))
272
273 def _getslice_helper_deprecated(self, base):
274 class GetItem(base):
275 def __len__(self):
Florent Xiclunabc27c6a2010-03-19 18:34:55 +0000276 return maxint # cannot return long here
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000277 def __getitem__(self, key):
278 return key
279 def __getslice__(self, i, j):
280 return i, j
281 x = GetItem()
282 self.assertEqual(x[self.pos], self.pos)
283 self.assertEqual(x[self.neg], self.neg)
Kristján Valur Jónsson170eee92007-05-03 20:09:56 +0000284 self.assertEqual(x[self.neg:self.pos], (maxint+minsize, maxsize))
Mark Dickinsone3656132010-01-09 18:50:50 +0000285 self.assertEqual(x[self.neg:self.pos:1].indices(maxsize),
286 (0, maxsize, 1))
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000287
Neal Norwitz1872b1c2006-08-12 18:44:06 +0000288 def test_getitem(self):
289 self._getitem_helper(object)
Florent Xicluna6de9e932010-03-07 12:18:33 +0000290 with test_support.check_py3k_warnings():
Mark Dickinsone3656132010-01-09 18:50:50 +0000291 self._getslice_helper_deprecated(object)
Neal Norwitz1872b1c2006-08-12 18:44:06 +0000292
293 def test_getitem_classic(self):
294 class Empty: pass
Mark Dickinsone3656132010-01-09 18:50:50 +0000295 # XXX This test fails (see bug #7532)
296 #self._getitem_helper(Empty)
Florent Xicluna6de9e932010-03-07 12:18:33 +0000297 with test_support.check_py3k_warnings():
Mark Dickinsone3656132010-01-09 18:50:50 +0000298 self._getslice_helper_deprecated(Empty)
Neal Norwitz1872b1c2006-08-12 18:44:06 +0000299
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000300 def test_sequence_repeat(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000301 self.assertRaises(OverflowError, lambda: "a" * self.pos)
302 self.assertRaises(OverflowError, lambda: "a" * self.neg)
Armin Rigo5eca19b2006-03-30 11:28:43 +0000303
304
305def test_main():
306 test_support.run_unittest(
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000307 BaseTestCase,
Armin Rigo5eca19b2006-03-30 11:28:43 +0000308 ListTestCase,
309 TupleTestCase,
Florent Xiclunabc27c6a2010-03-19 18:34:55 +0000310 ByteArrayTestCase,
Armin Rigo5eca19b2006-03-30 11:28:43 +0000311 StringTestCase,
Armin Rigo314861c2006-03-30 14:04:02 +0000312 UnicodeTestCase,
Mark Dickinsone3656132010-01-09 18:50:50 +0000313 ClassicSeqTestCase,
314 NewSeqTestCase,
Armin Rigo314861c2006-03-30 14:04:02 +0000315 XRangeTestCase,
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000316 OverflowTestCase,
Armin Rigo5eca19b2006-03-30 11:28:43 +0000317 )
Florent Xicluna6de9e932010-03-07 12:18:33 +0000318 with test_support.check_py3k_warnings():
Mark Dickinsone3656132010-01-09 18:50:50 +0000319 test_support.run_unittest(
320 ClassicSeqDeprecatedTestCase,
321 NewSeqDeprecatedTestCase,
322 )
323
Armin Rigo5eca19b2006-03-30 11:28:43 +0000324
325if __name__ == "__main__":
326 test_main()