blob: 2b80a7d041056035be80d286b9e01622474380a0 [file] [log] [blame]
Roger E. Masse8db1b071996-12-09 20:09:16 +00001#! /usr/bin/env python
2"""Test the arraymodule.
Roger E. Massefab8ab81996-12-20 22:36:52 +00003 Roger E. Masse
Roger E. Masse8db1b071996-12-09 20:09:16 +00004"""
Roger E. Massefab8ab81996-12-20 22:36:52 +00005
Walter Dörwald7fd94242003-05-18 00:47:47 +00006import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00007from test import support
Raymond Hettingercb87bc82004-05-31 00:35:52 +00008from weakref import proxy
Guido van Rossum2c94aa52007-05-24 19:02:32 +00009import array, io, math
Hirokazu Yamamoto801f9d32008-12-27 04:21:44 +000010from pickle import loads, dumps, HIGHEST_PROTOCOL
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +000011import operator
Raymond Hettingerb0900e62004-12-16 16:23:40 +000012
13class ArraySubclass(array.array):
14 pass
Guido van Rossumc9f8f141997-04-09 20:51:54 +000015
Thomas Woutersb2137042007-02-01 18:02:27 +000016class ArraySubclassWithKwargs(array.array):
17 def __init__(self, typecode, newarg=None):
18 array.array.__init__(typecode)
19
Walter Dörwald7fd94242003-05-18 00:47:47 +000020tests = [] # list to accumulate all tests
Guido van Rossum31f72d72007-06-18 18:44:28 +000021typecodes = "ubBhHiIlLfd"
Martin v. Löwis99866332002-03-01 10:27:01 +000022
Walter Dörwald7fd94242003-05-18 00:47:47 +000023class BadConstructorTest(unittest.TestCase):
Martin v. Löwis99866332002-03-01 10:27:01 +000024
Walter Dörwald7fd94242003-05-18 00:47:47 +000025 def test_constructor(self):
26 self.assertRaises(TypeError, array.array)
27 self.assertRaises(TypeError, array.array, spam=42)
28 self.assertRaises(TypeError, array.array, 'xx')
29 self.assertRaises(ValueError, array.array, 'x')
Martin v. Löwis99866332002-03-01 10:27:01 +000030
Walter Dörwald7fd94242003-05-18 00:47:47 +000031tests.append(BadConstructorTest)
Martin v. Löwis99866332002-03-01 10:27:01 +000032
Walter Dörwald7fd94242003-05-18 00:47:47 +000033class BaseTest(unittest.TestCase):
34 # Required class attributes (provided by subclasses
35 # typecode: the typecode to test
36 # example: an initializer usable in the constructor for this type
37 # smallerexample: the same length as example, but smaller
38 # biggerexample: the same length as example, but bigger
39 # outside: An entry that is not in example
40 # minitemsize: the minimum guaranteed itemsize
Martin v. Löwis99866332002-03-01 10:27:01 +000041
Walter Dörwald7fd94242003-05-18 00:47:47 +000042 def assertEntryEqual(self, entry1, entry2):
43 self.assertEqual(entry1, entry2)
Martin v. Löwis99866332002-03-01 10:27:01 +000044
Walter Dörwald7fd94242003-05-18 00:47:47 +000045 def badtypecode(self):
46 # Return a typecode that is different from our own
47 return typecodes[(typecodes.index(self.typecode)+1) % len(typecodes)]
Martin v. Löwis99866332002-03-01 10:27:01 +000048
Walter Dörwald7fd94242003-05-18 00:47:47 +000049 def test_constructor(self):
50 a = array.array(self.typecode)
51 self.assertEqual(a.typecode, self.typecode)
52 self.assert_(a.itemsize>=self.minitemsize)
53 self.assertRaises(TypeError, array.array, self.typecode, None)
Martin v. Löwis99866332002-03-01 10:27:01 +000054
Walter Dörwald7fd94242003-05-18 00:47:47 +000055 def test_len(self):
56 a = array.array(self.typecode)
57 a.append(self.example[0])
58 self.assertEqual(len(a), 1)
Martin v. Löwis99866332002-03-01 10:27:01 +000059
Walter Dörwald7fd94242003-05-18 00:47:47 +000060 a = array.array(self.typecode, self.example)
61 self.assertEqual(len(a), len(self.example))
Martin v. Löwis99866332002-03-01 10:27:01 +000062
Walter Dörwald7fd94242003-05-18 00:47:47 +000063 def test_buffer_info(self):
64 a = array.array(self.typecode, self.example)
65 self.assertRaises(TypeError, a.buffer_info, 42)
66 bi = a.buffer_info()
67 self.assert_(isinstance(bi, tuple))
68 self.assertEqual(len(bi), 2)
Walter Dörwaldaa97f042007-05-03 21:05:51 +000069 self.assert_(isinstance(bi[0], int))
Walter Dörwald7fd94242003-05-18 00:47:47 +000070 self.assert_(isinstance(bi[1], int))
71 self.assertEqual(bi[1], len(a))
Martin v. Löwis99866332002-03-01 10:27:01 +000072
Walter Dörwald7fd94242003-05-18 00:47:47 +000073 def test_byteswap(self):
74 a = array.array(self.typecode, self.example)
75 self.assertRaises(TypeError, a.byteswap, 42)
76 if a.itemsize in (1, 2, 4, 8):
77 b = array.array(self.typecode, self.example)
78 b.byteswap()
79 if a.itemsize==1:
80 self.assertEqual(a, b)
81 else:
82 self.assertNotEqual(a, b)
83 b.byteswap()
84 self.assertEqual(a, b)
Martin v. Löwis99866332002-03-01 10:27:01 +000085
Raymond Hettinger3aa82c02004-03-13 18:18:51 +000086 def test_copy(self):
87 import copy
88 a = array.array(self.typecode, self.example)
89 b = copy.copy(a)
90 self.assertNotEqual(id(a), id(b))
91 self.assertEqual(a, b)
92
Thomas Wouters89f507f2006-12-13 04:49:30 +000093 def test_deepcopy(self):
94 import copy
95 a = array.array(self.typecode, self.example)
96 b = copy.deepcopy(a)
97 self.assertNotEqual(id(a), id(b))
98 self.assertEqual(a, b)
99
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000100 def test_pickle(self):
Hirokazu Yamamoto801f9d32008-12-27 04:21:44 +0000101 for protocol in range(HIGHEST_PROTOCOL + 1):
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000102 a = array.array(self.typecode, self.example)
103 b = loads(dumps(a, protocol))
104 self.assertNotEqual(id(a), id(b))
105 self.assertEqual(a, b)
106
107 a = ArraySubclass(self.typecode, self.example)
108 a.x = 10
109 b = loads(dumps(a, protocol))
110 self.assertNotEqual(id(a), id(b))
111 self.assertEqual(a, b)
112 self.assertEqual(a.x, b.x)
113 self.assertEqual(type(a), type(b))
114
Guido van Rossumd8faa362007-04-27 19:54:29 +0000115 def test_pickle_for_empty_array(self):
Hirokazu Yamamoto801f9d32008-12-27 04:21:44 +0000116 for protocol in range(HIGHEST_PROTOCOL + 1):
Guido van Rossumd8faa362007-04-27 19:54:29 +0000117 a = array.array(self.typecode)
118 b = loads(dumps(a, protocol))
119 self.assertNotEqual(id(a), id(b))
120 self.assertEqual(a, b)
121
122 a = ArraySubclass(self.typecode)
123 a.x = 10
124 b = loads(dumps(a, protocol))
125 self.assertNotEqual(id(a), id(b))
126 self.assertEqual(a, b)
127 self.assertEqual(a.x, b.x)
128 self.assertEqual(type(a), type(b))
129
Walter Dörwald7fd94242003-05-18 00:47:47 +0000130 def test_insert(self):
131 a = array.array(self.typecode, self.example)
132 a.insert(0, self.example[0])
133 self.assertEqual(len(a), 1+len(self.example))
134 self.assertEqual(a[0], a[1])
135 self.assertRaises(TypeError, a.insert)
136 self.assertRaises(TypeError, a.insert, None)
Walter Dörwaldba39d9c2003-05-18 01:56:25 +0000137 self.assertRaises(TypeError, a.insert, 0, None)
Martin v. Löwis99866332002-03-01 10:27:01 +0000138
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000139 a = array.array(self.typecode, self.example)
140 a.insert(-1, self.example[0])
141 self.assertEqual(
142 a,
143 array.array(
144 self.typecode,
145 self.example[:-1] + self.example[:1] + self.example[-1:]
146 )
147 )
148
149 a = array.array(self.typecode, self.example)
150 a.insert(-1000, self.example[0])
151 self.assertEqual(
152 a,
153 array.array(self.typecode, self.example[:1] + self.example)
154 )
155
156 a = array.array(self.typecode, self.example)
157 a.insert(1000, self.example[0])
158 self.assertEqual(
159 a,
160 array.array(self.typecode, self.example + self.example[:1])
161 )
162
Walter Dörwald7fd94242003-05-18 00:47:47 +0000163 def test_tofromfile(self):
164 a = array.array(self.typecode, 2*self.example)
165 self.assertRaises(TypeError, a.tofile)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000166 support.unlink(support.TESTFN)
167 f = open(support.TESTFN, 'wb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000168 try:
169 a.tofile(f)
170 f.close()
171 b = array.array(self.typecode)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000172 f = open(support.TESTFN, 'rb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000173 self.assertRaises(TypeError, b.fromfile)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000174 b.fromfile(f, len(self.example))
175 self.assertEqual(b, array.array(self.typecode, self.example))
176 self.assertNotEqual(a, b)
177 b.fromfile(f, len(self.example))
178 self.assertEqual(a, b)
179 self.assertRaises(EOFError, b.fromfile, f, 1)
180 f.close()
181 finally:
182 if not f.closed:
183 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000184 support.unlink(support.TESTFN)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000185
Walter Dörwald7fd94242003-05-18 00:47:47 +0000186 def test_tofromlist(self):
187 a = array.array(self.typecode, 2*self.example)
188 b = array.array(self.typecode)
189 self.assertRaises(TypeError, a.tolist, 42)
190 self.assertRaises(TypeError, b.fromlist)
191 self.assertRaises(TypeError, b.fromlist, 42)
192 self.assertRaises(TypeError, b.fromlist, [None])
193 b.fromlist(a.tolist())
194 self.assertEqual(a, b)
Fred Drake78334472000-06-28 17:50:51 +0000195
Walter Dörwald7fd94242003-05-18 00:47:47 +0000196 def test_tofromstring(self):
197 a = array.array(self.typecode, 2*self.example)
198 b = array.array(self.typecode)
199 self.assertRaises(TypeError, a.tostring, 42)
200 self.assertRaises(TypeError, b.fromstring)
201 self.assertRaises(TypeError, b.fromstring, 42)
202 b.fromstring(a.tostring())
203 self.assertEqual(a, b)
204 if a.itemsize>1:
205 self.assertRaises(ValueError, b.fromstring, "x")
Fred Drake78334472000-06-28 17:50:51 +0000206
Walter Dörwald7fd94242003-05-18 00:47:47 +0000207 def test_repr(self):
208 a = array.array(self.typecode, 2*self.example)
209 self.assertEqual(a, eval(repr(a), {"array": array.array}))
Fred Drake78334472000-06-28 17:50:51 +0000210
Walter Dörwald7fd94242003-05-18 00:47:47 +0000211 a = array.array(self.typecode)
212 self.assertEqual(repr(a), "array('%s')" % self.typecode)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000213
Walter Dörwald7fd94242003-05-18 00:47:47 +0000214 def test_str(self):
215 a = array.array(self.typecode, 2*self.example)
216 str(a)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000217
Walter Dörwald7fd94242003-05-18 00:47:47 +0000218 def test_cmp(self):
219 a = array.array(self.typecode, self.example)
220 self.assert_((a == 42) is False)
221 self.assert_((a != 42) is True)
Tim Peterscc78e472000-11-14 21:36:07 +0000222
Walter Dörwald7fd94242003-05-18 00:47:47 +0000223 self.assert_((a == a) is True)
224 self.assert_((a != a) is False)
225 self.assert_((a < a) is False)
226 self.assert_((a <= a) is True)
227 self.assert_((a > a) is False)
228 self.assert_((a >= a) is True)
Tim Peterscc78e472000-11-14 21:36:07 +0000229
Neal Norwitzbd2835c2006-03-17 08:54:15 +0000230 al = array.array(self.typecode, self.smallerexample)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000231 ab = array.array(self.typecode, self.biggerexample)
Guido van Rossum7f1d3aa1998-07-16 15:31:43 +0000232
Walter Dörwald7fd94242003-05-18 00:47:47 +0000233 self.assert_((a == 2*a) is False)
234 self.assert_((a != 2*a) is True)
235 self.assert_((a < 2*a) is True)
236 self.assert_((a <= 2*a) is True)
237 self.assert_((a > 2*a) is False)
238 self.assert_((a >= 2*a) is False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000239
Neal Norwitzbd2835c2006-03-17 08:54:15 +0000240 self.assert_((a == al) is False)
241 self.assert_((a != al) is True)
242 self.assert_((a < al) is False)
243 self.assert_((a <= al) is False)
244 self.assert_((a > al) is True)
245 self.assert_((a >= al) is True)
Martin v. Löwis99866332002-03-01 10:27:01 +0000246
Walter Dörwald7fd94242003-05-18 00:47:47 +0000247 self.assert_((a == ab) is False)
248 self.assert_((a != ab) is True)
249 self.assert_((a < ab) is True)
250 self.assert_((a <= ab) is True)
251 self.assert_((a > ab) is False)
252 self.assert_((a >= ab) is False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000253
Walter Dörwald7fd94242003-05-18 00:47:47 +0000254 def test_add(self):
255 a = array.array(self.typecode, self.example) \
256 + array.array(self.typecode, self.example[::-1])
257 self.assertEqual(
258 a,
259 array.array(self.typecode, self.example + self.example[::-1])
260 )
Martin v. Löwis99866332002-03-01 10:27:01 +0000261
Walter Dörwald7fd94242003-05-18 00:47:47 +0000262 b = array.array(self.badtypecode())
263 self.assertRaises(TypeError, a.__add__, b)
264
265 self.assertRaises(TypeError, a.__add__, "bad")
266
267 def test_iadd(self):
268 a = array.array(self.typecode, self.example[::-1])
269 b = a
270 a += array.array(self.typecode, 2*self.example)
271 self.assert_(a is b)
272 self.assertEqual(
273 a,
274 array.array(self.typecode, self.example[::-1]+2*self.example)
275 )
276
277 b = array.array(self.badtypecode())
278 self.assertRaises(TypeError, a.__add__, b)
279
280 self.assertRaises(TypeError, a.__iadd__, "bad")
281
282 def test_mul(self):
283 a = 5*array.array(self.typecode, self.example)
284 self.assertEqual(
285 a,
286 array.array(self.typecode, 5*self.example)
287 )
288
289 a = array.array(self.typecode, self.example)*5
290 self.assertEqual(
291 a,
292 array.array(self.typecode, self.example*5)
293 )
294
295 a = 0*array.array(self.typecode, self.example)
296 self.assertEqual(
297 a,
298 array.array(self.typecode)
299 )
300
301 a = (-1)*array.array(self.typecode, self.example)
302 self.assertEqual(
303 a,
304 array.array(self.typecode)
305 )
306
307 self.assertRaises(TypeError, a.__mul__, "bad")
308
309 def test_imul(self):
310 a = array.array(self.typecode, self.example)
311 b = a
312
313 a *= 5
314 self.assert_(a is b)
315 self.assertEqual(
316 a,
317 array.array(self.typecode, 5*self.example)
318 )
319
320 a *= 0
321 self.assert_(a is b)
322 self.assertEqual(a, array.array(self.typecode))
323
324 a *= 1000
325 self.assert_(a is b)
326 self.assertEqual(a, array.array(self.typecode))
327
328 a *= -1
329 self.assert_(a is b)
330 self.assertEqual(a, array.array(self.typecode))
331
332 a = array.array(self.typecode, self.example)
333 a *= -1
334 self.assertEqual(a, array.array(self.typecode))
335
336 self.assertRaises(TypeError, a.__imul__, "bad")
337
338 def test_getitem(self):
339 a = array.array(self.typecode, self.example)
340 self.assertEntryEqual(a[0], self.example[0])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000341 self.assertEntryEqual(a[0], self.example[0])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000342 self.assertEntryEqual(a[-1], self.example[-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000343 self.assertEntryEqual(a[-1], self.example[-1])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000344 self.assertEntryEqual(a[len(self.example)-1], self.example[-1])
345 self.assertEntryEqual(a[-len(self.example)], self.example[0])
346 self.assertRaises(TypeError, a.__getitem__)
347 self.assertRaises(IndexError, a.__getitem__, len(self.example))
348 self.assertRaises(IndexError, a.__getitem__, -len(self.example)-1)
349
350 def test_setitem(self):
351 a = array.array(self.typecode, self.example)
352 a[0] = a[-1]
353 self.assertEntryEqual(a[0], a[-1])
354
355 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000356 a[0] = a[-1]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000357 self.assertEntryEqual(a[0], a[-1])
358
359 a = array.array(self.typecode, self.example)
360 a[-1] = a[0]
361 self.assertEntryEqual(a[0], a[-1])
362
363 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000364 a[-1] = a[0]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000365 self.assertEntryEqual(a[0], a[-1])
366
367 a = array.array(self.typecode, self.example)
368 a[len(self.example)-1] = a[0]
369 self.assertEntryEqual(a[0], a[-1])
370
371 a = array.array(self.typecode, self.example)
372 a[-len(self.example)] = a[-1]
373 self.assertEntryEqual(a[0], a[-1])
374
375 self.assertRaises(TypeError, a.__setitem__)
376 self.assertRaises(TypeError, a.__setitem__, None)
377 self.assertRaises(TypeError, a.__setitem__, 0, None)
378 self.assertRaises(
379 IndexError,
380 a.__setitem__,
381 len(self.example), self.example[0]
382 )
383 self.assertRaises(
384 IndexError,
385 a.__setitem__,
386 -len(self.example)-1, self.example[0]
387 )
388
389 def test_delitem(self):
390 a = array.array(self.typecode, self.example)
391 del a[0]
392 self.assertEqual(
393 a,
394 array.array(self.typecode, self.example[1:])
395 )
396
397 a = array.array(self.typecode, self.example)
398 del a[-1]
399 self.assertEqual(
400 a,
401 array.array(self.typecode, self.example[:-1])
402 )
403
404 a = array.array(self.typecode, self.example)
405 del a[len(self.example)-1]
406 self.assertEqual(
407 a,
408 array.array(self.typecode, self.example[:-1])
409 )
410
411 a = array.array(self.typecode, self.example)
412 del a[-len(self.example)]
413 self.assertEqual(
414 a,
415 array.array(self.typecode, self.example[1:])
416 )
417
418 self.assertRaises(TypeError, a.__delitem__)
419 self.assertRaises(TypeError, a.__delitem__, None)
420 self.assertRaises(IndexError, a.__delitem__, len(self.example))
421 self.assertRaises(IndexError, a.__delitem__, -len(self.example)-1)
422
423 def test_getslice(self):
424 a = array.array(self.typecode, self.example)
425 self.assertEqual(a[:], a)
426
427 self.assertEqual(
428 a[1:],
429 array.array(self.typecode, self.example[1:])
430 )
431
432 self.assertEqual(
433 a[:1],
434 array.array(self.typecode, self.example[:1])
435 )
436
437 self.assertEqual(
438 a[:-1],
439 array.array(self.typecode, self.example[:-1])
440 )
441
442 self.assertEqual(
443 a[-1:],
444 array.array(self.typecode, self.example[-1:])
445 )
446
447 self.assertEqual(
448 a[-1:-1],
449 array.array(self.typecode)
450 )
451
452 self.assertEqual(
Walter Dörwald1083c242005-01-21 21:16:51 +0000453 a[2:1],
454 array.array(self.typecode)
455 )
456
457 self.assertEqual(
Walter Dörwald7fd94242003-05-18 00:47:47 +0000458 a[1000:],
459 array.array(self.typecode)
460 )
461 self.assertEqual(a[-1000:], a)
462 self.assertEqual(a[:1000], a)
463 self.assertEqual(
464 a[:-1000],
465 array.array(self.typecode)
466 )
467 self.assertEqual(a[-1000:1000], a)
468 self.assertEqual(
469 a[2000:1000],
470 array.array(self.typecode)
471 )
472
Thomas Woutersed03b412007-08-28 21:37:11 +0000473 def test_extended_getslice(self):
474 # Test extended slicing by comparing with list slicing
475 # (Assumes list conversion works correctly, too)
476 a = array.array(self.typecode, self.example)
477 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
478 for start in indices:
479 for stop in indices:
480 # Everything except the initial 0 (invalid step)
481 for step in indices[1:]:
482 self.assertEqual(list(a[start:stop:step]),
483 list(a)[start:stop:step])
484
Walter Dörwald7fd94242003-05-18 00:47:47 +0000485 def test_setslice(self):
486 a = array.array(self.typecode, self.example)
487 a[:1] = a
488 self.assertEqual(
489 a,
490 array.array(self.typecode, self.example + self.example[1:])
491 )
492
493 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000494 a[:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000495 self.assertEqual(
496 a,
497 array.array(self.typecode, self.example + self.example[-1:])
498 )
499
500 a = array.array(self.typecode, self.example)
501 a[-1:] = a
502 self.assertEqual(
503 a,
504 array.array(self.typecode, self.example[:-1] + self.example)
505 )
506
507 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000508 a[1:] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000509 self.assertEqual(
510 a,
511 array.array(self.typecode, self.example[:1] + self.example)
512 )
513
514 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000515 a[1:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000516 self.assertEqual(
517 a,
518 array.array(
519 self.typecode,
520 self.example[:1] + self.example + self.example[-1:]
521 )
522 )
523
524 a = array.array(self.typecode, self.example)
525 a[1000:] = a
526 self.assertEqual(
527 a,
528 array.array(self.typecode, 2*self.example)
529 )
530
531 a = array.array(self.typecode, self.example)
532 a[-1000:] = a
533 self.assertEqual(
534 a,
535 array.array(self.typecode, self.example)
536 )
537
538 a = array.array(self.typecode, self.example)
539 a[:1000] = a
540 self.assertEqual(
541 a,
542 array.array(self.typecode, self.example)
543 )
544
545 a = array.array(self.typecode, self.example)
546 a[:-1000] = a
547 self.assertEqual(
548 a,
549 array.array(self.typecode, 2*self.example)
550 )
551
552 a = array.array(self.typecode, self.example)
553 a[1:0] = a
554 self.assertEqual(
555 a,
556 array.array(self.typecode, self.example[:1] + self.example + self.example[1:])
557 )
558
559 a = array.array(self.typecode, self.example)
560 a[2000:1000] = a
561 self.assertEqual(
562 a,
563 array.array(self.typecode, 2*self.example)
564 )
565
566 a = array.array(self.typecode, self.example)
Thomas Woutersed03b412007-08-28 21:37:11 +0000567 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), None)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000568 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), None)
569
570 b = array.array(self.badtypecode())
Thomas Woutersed03b412007-08-28 21:37:11 +0000571 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000572 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), b)
573
Thomas Woutersed03b412007-08-28 21:37:11 +0000574 def test_extended_set_del_slice(self):
575 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
576 for start in indices:
577 for stop in indices:
578 # Everything except the initial 0 (invalid step)
579 for step in indices[1:]:
580 a = array.array(self.typecode, self.example)
581 L = list(a)
582 # Make sure we have a slice of exactly the right length,
583 # but with (hopefully) different data.
584 data = L[start:stop:step]
585 data.reverse()
586 L[start:stop:step] = data
587 a[start:stop:step] = array.array(self.typecode, data)
588 self.assertEquals(a, array.array(self.typecode, L))
589
590 del L[start:stop:step]
591 del a[start:stop:step]
592 self.assertEquals(a, array.array(self.typecode, L))
593
Walter Dörwald7fd94242003-05-18 00:47:47 +0000594 def test_index(self):
595 example = 2*self.example
596 a = array.array(self.typecode, example)
597 self.assertRaises(TypeError, a.index)
598 for x in example:
599 self.assertEqual(a.index(x), example.index(x))
600 self.assertRaises(ValueError, a.index, None)
601 self.assertRaises(ValueError, a.index, self.outside)
602
603 def test_count(self):
604 example = 2*self.example
605 a = array.array(self.typecode, example)
606 self.assertRaises(TypeError, a.count)
607 for x in example:
608 self.assertEqual(a.count(x), example.count(x))
609 self.assertEqual(a.count(self.outside), 0)
610 self.assertEqual(a.count(None), 0)
611
612 def test_remove(self):
613 for x in self.example:
614 example = 2*self.example
615 a = array.array(self.typecode, example)
616 pos = example.index(x)
617 example2 = example[:pos] + example[pos+1:]
618 a.remove(x)
619 self.assertEqual(a, array.array(self.typecode, example2))
620
621 a = array.array(self.typecode, self.example)
622 self.assertRaises(ValueError, a.remove, self.outside)
623
624 self.assertRaises(ValueError, a.remove, None)
625
626 def test_pop(self):
627 a = array.array(self.typecode)
628 self.assertRaises(IndexError, a.pop)
629
630 a = array.array(self.typecode, 2*self.example)
631 self.assertRaises(TypeError, a.pop, 42, 42)
632 self.assertRaises(TypeError, a.pop, None)
633 self.assertRaises(IndexError, a.pop, len(a))
634 self.assertRaises(IndexError, a.pop, -len(a)-1)
635
636 self.assertEntryEqual(a.pop(0), self.example[0])
637 self.assertEqual(
638 a,
639 array.array(self.typecode, self.example[1:]+self.example)
640 )
641 self.assertEntryEqual(a.pop(1), self.example[2])
642 self.assertEqual(
643 a,
644 array.array(self.typecode, self.example[1:2]+self.example[3:]+self.example)
645 )
646 self.assertEntryEqual(a.pop(0), self.example[1])
647 self.assertEntryEqual(a.pop(), self.example[-1])
648 self.assertEqual(
649 a,
650 array.array(self.typecode, self.example[3:]+self.example[:-1])
651 )
652
653 def test_reverse(self):
654 a = array.array(self.typecode, self.example)
655 self.assertRaises(TypeError, a.reverse, 42)
Fred Drake004d5e62000-10-23 17:22:08 +0000656 a.reverse()
Walter Dörwald7fd94242003-05-18 00:47:47 +0000657 self.assertEqual(
658 a,
659 array.array(self.typecode, self.example[::-1])
660 )
661
662 def test_extend(self):
663 a = array.array(self.typecode, self.example)
664 self.assertRaises(TypeError, a.extend)
665 a.extend(array.array(self.typecode, self.example[::-1]))
666 self.assertEqual(
667 a,
668 array.array(self.typecode, self.example+self.example[::-1])
669 )
670
671 b = array.array(self.badtypecode())
672 self.assertRaises(TypeError, a.extend, b)
673
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000674 a = array.array(self.typecode, self.example)
675 a.extend(self.example[::-1])
676 self.assertEqual(
677 a,
678 array.array(self.typecode, self.example+self.example[::-1])
679 )
680
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +0000681 def test_constructor_with_iterable_argument(self):
682 a = array.array(self.typecode, iter(self.example))
683 b = array.array(self.typecode, self.example)
684 self.assertEqual(a, b)
685
686 # non-iterable argument
687 self.assertRaises(TypeError, array.array, self.typecode, 10)
688
689 # pass through errors raised in __iter__
690 class A:
691 def __iter__(self):
692 raise UnicodeError
693 self.assertRaises(UnicodeError, array.array, self.typecode, A())
694
695 # pass through errors raised in next()
696 def B():
697 raise UnicodeError
698 yield None
699 self.assertRaises(UnicodeError, array.array, self.typecode, B())
700
Walter Dörwald7fd94242003-05-18 00:47:47 +0000701 def test_coveritertraverse(self):
702 try:
703 import gc
704 except ImportError:
705 return
706 a = array.array(self.typecode)
707 l = [iter(a)]
708 l.append(l)
709 gc.collect()
710
711 def test_buffer(self):
712 a = array.array(self.typecode, self.example)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000713 m = memoryview(a)
714 b = bytes(m)
715 self.assertEqual(b, a.tostring())
Walter Dörwald7fd94242003-05-18 00:47:47 +0000716 self.assertEqual(b[0], a.tostring()[0])
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000717 # Resizing is forbidden when there are buffer exports
718 self.assertRaises(BufferError, a.append, a[0])
719 self.assertRaises(BufferError, a.extend, a[0:1])
720 self.assertRaises(BufferError, a.remove, a[0])
721 self.assertRaises(BufferError, a.fromlist, a.tolist())
722 self.assertRaises(BufferError, a.fromstring, a.tostring())
723 if self.typecode == 'u':
724 self.assertRaises(BufferError, a.fromunicode, a.tounicode())
725 self.assertRaises(BufferError, operator.setitem, a, slice(0, 0), a)
726 self.assertRaises(BufferError, operator.delitem, a, 0)
727 self.assertRaises(BufferError, operator.delitem, a, slice(0, 1))
728 self.assertRaises(BufferError, operator.irepeat, a, 2)
729 self.assertRaises(BufferError, operator.irepeat, a, 0)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000730
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000731 def test_weakref(self):
732 s = array.array(self.typecode, self.example)
733 p = proxy(s)
734 self.assertEqual(p.tostring(), s.tostring())
735 s = None
736 self.assertRaises(ReferenceError, len, p)
737
Skip Montanarod5cf0b82003-08-03 23:02:10 +0000738 def test_bug_782369(self):
739 import sys
Skip Montanaroed9bf122003-08-03 23:30:40 +0000740 if hasattr(sys, "getrefcount"):
741 for i in range(10):
742 b = array.array('B', range(64))
743 rc = sys.getrefcount(10)
744 for i in range(10):
745 b = array.array('B', range(64))
746 self.assertEqual(rc, sys.getrefcount(10))
Skip Montanarod5cf0b82003-08-03 23:02:10 +0000747
Thomas Woutersb2137042007-02-01 18:02:27 +0000748 def test_subclass_with_kwargs(self):
749 # SF bug #1486663 -- this used to erroneously raise a TypeError
750 ArraySubclassWithKwargs('b', newarg=1)
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000751
Guido van Rossum6b826ab2007-07-03 16:22:09 +0000752 def test_create_from_bytes(self):
753 a = array.array('H', b"1234")
754 self.assertEqual(len(a) * a.itemsize, 4)
755
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000756
Walter Dörwald7fd94242003-05-18 00:47:47 +0000757class StringTest(BaseTest):
758
759 def test_setitem(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000760 super().test_setitem()
Walter Dörwald7fd94242003-05-18 00:47:47 +0000761 a = array.array(self.typecode, self.example)
762 self.assertRaises(TypeError, a.__setitem__, 0, self.example[:2])
763
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000764class UnicodeTest(StringTest):
765 typecode = 'u'
766 example = '\x01\u263a\x00\ufeff'
767 smallerexample = '\x01\u263a\x00\ufefe'
768 biggerexample = '\x01\u263a\x01\ufeff'
769 outside = str('\x33')
770 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +0000771
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000772 def test_unicode(self):
773 self.assertRaises(TypeError, array.array, 'b', 'foo')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000774
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000775 a = array.array('u', '\xa0\xc2\u1234')
776 a.fromunicode(' ')
777 a.fromunicode('')
778 a.fromunicode('')
779 a.fromunicode('\x11abc\xff\u1234')
780 s = a.tounicode()
781 self.assertEqual(s, '\xa0\xc2\u1234 \x11abc\xff\u1234')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000782
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000783 s = '\x00="\'a\\b\x80\xff\u0000\u0001\u1234'
784 a = array.array('u', s)
785 self.assertEqual(
786 repr(a),
Georg Brandl559e5d72008-06-11 18:37:52 +0000787 "array('u', '\\x00=\"\\'a\\\\b\\x80\xff\\x00\\x01\u1234')")
Walter Dörwald7fd94242003-05-18 00:47:47 +0000788
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000789 self.assertRaises(TypeError, a.fromunicode)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000790
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000791tests.append(UnicodeTest)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000792
793class NumberTest(BaseTest):
794
795 def test_extslice(self):
796 a = array.array(self.typecode, range(5))
797 self.assertEqual(a[::], a)
798 self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
799 self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
800 self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
801 self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
802 self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
803 self.assertEqual(a[-100:100:], a)
804 self.assertEqual(a[100:-100:-1], a[::-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000805 self.assertEqual(a[-100:100:2], array.array(self.typecode, [0,2,4]))
Walter Dörwald7fd94242003-05-18 00:47:47 +0000806 self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
807 self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
808
809 def test_delslice(self):
810 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +0000811 del a[::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000812 self.assertEqual(a, array.array(self.typecode, [1,3]))
813 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +0000814 del a[1::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000815 self.assertEqual(a, array.array(self.typecode, [0,2,4]))
816 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +0000817 del a[1::-2]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000818 self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
819 a = array.array(self.typecode, range(10))
Michael W. Hudson56796f62002-07-29 14:35:04 +0000820 del a[::1000]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000821 self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
822
823 def test_assignment(self):
824 a = array.array(self.typecode, range(10))
825 a[::2] = array.array(self.typecode, [42]*5)
826 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
827 a = array.array(self.typecode, range(10))
828 a[::-4] = array.array(self.typecode, [10]*3)
829 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
830 a = array.array(self.typecode, range(4))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +0000831 a[::-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000832 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
833 a = array.array(self.typecode, range(10))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +0000834 b = a[:]
835 c = a[:]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000836 ins = array.array(self.typecode, range(2))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +0000837 a[2:3] = ins
838 b[slice(2,3)] = ins
839 c[2:3:] = ins
Fred Drake004d5e62000-10-23 17:22:08 +0000840
Walter Dörwald7fd94242003-05-18 00:47:47 +0000841 def test_iterationcontains(self):
842 a = array.array(self.typecode, range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +0000843 self.assertEqual(list(a), list(range(10)))
Walter Dörwald7fd94242003-05-18 00:47:47 +0000844 b = array.array(self.typecode, [20])
845 self.assertEqual(a[-1] in a, True)
846 self.assertEqual(b[0] not in a, True)
847
848 def check_overflow(self, lower, upper):
849 # method to be used by subclasses
850
851 # should not overflow assigning lower limit
852 a = array.array(self.typecode, [lower])
853 a[0] = lower
854 # should overflow assigning less than lower limit
855 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
856 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
857 # should not overflow assigning upper limit
858 a = array.array(self.typecode, [upper])
859 a[0] = upper
860 # should overflow assigning more than upper limit
861 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
862 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
863
864 def test_subclassing(self):
865 typecode = self.typecode
866 class ExaggeratingArray(array.array):
867 __slots__ = ['offset']
868
869 def __new__(cls, typecode, data, offset):
870 return array.array.__new__(cls, typecode, data)
871
872 def __init__(self, typecode, data, offset):
873 self.offset = offset
874
875 def __getitem__(self, i):
876 return array.array.__getitem__(self, i) + self.offset
877
878 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
879 self.assertEntryEqual(a[0], 7)
880
881 self.assertRaises(AttributeError, setattr, a, "color", "blue")
882
883class SignedNumberTest(NumberTest):
884 example = [-1, 0, 1, 42, 0x7f]
885 smallerexample = [-1, 0, 1, 42, 0x7e]
886 biggerexample = [-1, 0, 1, 43, 0x7f]
887 outside = 23
888
889 def test_overflow(self):
890 a = array.array(self.typecode)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000891 lower = -1 * int(pow(2, a.itemsize * 8 - 1))
892 upper = int(pow(2, a.itemsize * 8 - 1)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +0000893 self.check_overflow(lower, upper)
894
895class UnsignedNumberTest(NumberTest):
896 example = [0, 1, 17, 23, 42, 0xff]
897 smallerexample = [0, 1, 17, 23, 42, 0xfe]
898 biggerexample = [0, 1, 17, 23, 43, 0xff]
899 outside = 0xaa
900
901 def test_overflow(self):
902 a = array.array(self.typecode)
903 lower = 0
Guido van Rossume2a383d2007-01-15 16:59:06 +0000904 upper = int(pow(2, a.itemsize * 8)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +0000905 self.check_overflow(lower, upper)
Fred Drake004d5e62000-10-23 17:22:08 +0000906
907
Walter Dörwald7fd94242003-05-18 00:47:47 +0000908class ByteTest(SignedNumberTest):
909 typecode = 'b'
910 minitemsize = 1
911tests.append(ByteTest)
Fred Drake004d5e62000-10-23 17:22:08 +0000912
Walter Dörwald7fd94242003-05-18 00:47:47 +0000913class UnsignedByteTest(UnsignedNumberTest):
914 typecode = 'B'
915 minitemsize = 1
916tests.append(UnsignedByteTest)
917
918class ShortTest(SignedNumberTest):
919 typecode = 'h'
920 minitemsize = 2
921tests.append(ShortTest)
922
923class UnsignedShortTest(UnsignedNumberTest):
924 typecode = 'H'
925 minitemsize = 2
926tests.append(UnsignedShortTest)
927
928class IntTest(SignedNumberTest):
929 typecode = 'i'
930 minitemsize = 2
931tests.append(IntTest)
932
933class UnsignedIntTest(UnsignedNumberTest):
934 typecode = 'I'
935 minitemsize = 2
936tests.append(UnsignedIntTest)
937
938class LongTest(SignedNumberTest):
939 typecode = 'l'
940 minitemsize = 4
941tests.append(LongTest)
942
943class UnsignedLongTest(UnsignedNumberTest):
944 typecode = 'L'
945 minitemsize = 4
946tests.append(UnsignedLongTest)
947
948class FPTest(NumberTest):
949 example = [-42.0, 0, 42, 1e5, -1e10]
950 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
951 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
952 outside = 23
953
954 def assertEntryEqual(self, entry1, entry2):
955 self.assertAlmostEqual(entry1, entry2)
956
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +0000957 def test_byteswap(self):
958 a = array.array(self.typecode, self.example)
959 self.assertRaises(TypeError, a.byteswap, 42)
960 if a.itemsize in (1, 2, 4, 8):
961 b = array.array(self.typecode, self.example)
962 b.byteswap()
963 if a.itemsize==1:
964 self.assertEqual(a, b)
965 else:
966 # On alphas treating the byte swapped bit patters as
967 # floats/doubles results in floating point exceptions
968 # => compare the 8bit string values instead
969 self.assertNotEqual(a.tostring(), b.tostring())
970 b.byteswap()
971 self.assertEqual(a, b)
972
Neal Norwitz35c6cd02003-05-22 13:29:15 +0000973class FloatTest(FPTest):
974 typecode = 'f'
975 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +0000976tests.append(FloatTest)
977
978class DoubleTest(FPTest):
979 typecode = 'd'
980 minitemsize = 8
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000981
982 def test_alloc_overflow(self):
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +0000983 from sys import maxsize
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000984 a = array.array('d', [-1]*65536)
985 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +0000986 a *= maxsize//65536 + 1
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000987 except MemoryError:
988 pass
989 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +0000990 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000991 b = array.array('d', [ 2.71828183, 3.14159265, -1])
992 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +0000993 b * (maxsize//3 + 1)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000994 except MemoryError:
995 pass
996 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +0000997 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000998
Walter Dörwald7fd94242003-05-18 00:47:47 +0000999tests.append(DoubleTest)
1000
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001001def test_main(verbose=None):
1002 import sys
1003
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001004 support.run_unittest(*tests)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001005
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001006 # verify reference counting
1007 if verbose and hasattr(sys, "gettotalrefcount"):
1008 import gc
1009 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001010 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001011 support.run_unittest(*tests)
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001012 gc.collect()
1013 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001014 print(counts)
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001015
1016if __name__ == "__main__":
1017 test_main(verbose=True)