]> git.proxmox.com Git - mirror_edk2.git/blame - AppPkg/Applications/Python/Python-2.7.2/Lib/test/test_index.py
EmbeddedPkg: Extend NvVarStoreFormattedLib LIBRARY_CLASS
[mirror_edk2.git] / AppPkg / Applications / Python / Python-2.7.2 / Lib / test / test_index.py
CommitLineData
4710c53d 1import unittest\r
2from test import test_support\r
3import operator\r
4from sys import maxint\r
5maxsize = test_support.MAX_Py_ssize_t\r
6minsize = -maxsize-1\r
7\r
8class oldstyle:\r
9 def __index__(self):\r
10 return self.ind\r
11\r
12class newstyle(object):\r
13 def __index__(self):\r
14 return self.ind\r
15\r
16class TrapInt(int):\r
17 def __index__(self):\r
18 return self\r
19\r
20class TrapLong(long):\r
21 def __index__(self):\r
22 return self\r
23\r
24class 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
71class 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
145class 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
179class _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
201class _GetSliceMixin:\r
202\r
203 def __getslice__(self, i, j):\r
204 return self._list.__getslice__(i, j)\r
205\r
206\r
207class ClassicSeq(_BaseSeq): pass\r
208class NewSeq(_BaseSeq, object): pass\r
209class ClassicSeqDeprecated(_GetSliceMixin, ClassicSeq): pass\r
210class NewSeqDeprecated(_GetSliceMixin, NewSeq): pass\r
211\r
212\r
213class TupleTestCase(SeqTestCase):\r
214 seq = (0,10,20,30,40,50)\r
215\r
216class StringTestCase(SeqTestCase):\r
217 seq = "this is a test"\r
218\r
219class ByteArrayTestCase(SeqTestCase):\r
220 seq = bytearray("this is a test")\r
221\r
222class UnicodeTestCase(SeqTestCase):\r
223 seq = u"this is a test"\r
224\r
225class ClassicSeqTestCase(SeqTestCase):\r
226 seq = ClassicSeq((0,10,20,30,40,50))\r
227\r
228class NewSeqTestCase(SeqTestCase):\r
229 seq = NewSeq((0,10,20,30,40,50))\r
230\r
231class ClassicSeqDeprecatedTestCase(SeqTestCase):\r
232 seq = ClassicSeqDeprecated((0,10,20,30,40,50))\r
233\r
234class NewSeqDeprecatedTestCase(SeqTestCase):\r
235 seq = NewSeqDeprecated((0,10,20,30,40,50))\r
236\r
237\r
238class 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
246class 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
302def 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
322if __name__ == "__main__":\r
323 test_main()\r