blob: 62997d7300ac7791c70d0ae76ff09868479dbcd4 [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):
Georg Brandld98934c2011-02-25 10:03:34 +000018 array.array.__init__(self, typecode)
Thomas Woutersb2137042007-02-01 18:02:27 +000019
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)
Georg Brandlab91fde2009-08-13 08:51:18 +000052 self.assertTrue(a.itemsize>=self.minitemsize)
Walter Dörwald7fd94242003-05-18 00:47:47 +000053 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()
Georg Brandlab91fde2009-08-13 08:51:18 +000067 self.assertTrue(isinstance(bi, tuple))
Walter Dörwald7fd94242003-05-18 00:47:47 +000068 self.assertEqual(len(bi), 2)
Georg Brandlab91fde2009-08-13 08:51:18 +000069 self.assertTrue(isinstance(bi[0], int))
70 self.assertTrue(isinstance(bi[1], int))
Walter Dörwald7fd94242003-05-18 00:47:47 +000071 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)
Hirokazu Yamamoto54d0df62009-03-06 03:04:07 +0000177 self.assertRaises(EOFError, b.fromfile, f, len(self.example)+1)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000178 self.assertEqual(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000179 f.close()
180 finally:
181 if not f.closed:
182 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000183 support.unlink(support.TESTFN)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000184
Antoine Pitrou913c52e2010-07-21 16:53:04 +0000185 def test_fromfile_ioerror(self):
186 # Issue #5395: Check if fromfile raises a proper IOError
187 # instead of EOFError.
188 a = array.array(self.typecode)
189 f = open(support.TESTFN, 'wb')
190 try:
191 self.assertRaises(IOError, a.fromfile, f, len(self.example))
192 finally:
193 f.close()
194 support.unlink(support.TESTFN)
195
Walter Dörwald7fd94242003-05-18 00:47:47 +0000196 def test_tofromlist(self):
197 a = array.array(self.typecode, 2*self.example)
198 b = array.array(self.typecode)
199 self.assertRaises(TypeError, a.tolist, 42)
200 self.assertRaises(TypeError, b.fromlist)
201 self.assertRaises(TypeError, b.fromlist, 42)
202 self.assertRaises(TypeError, b.fromlist, [None])
203 b.fromlist(a.tolist())
204 self.assertEqual(a, b)
Fred Drake78334472000-06-28 17:50:51 +0000205
Walter Dörwald7fd94242003-05-18 00:47:47 +0000206 def test_tofromstring(self):
207 a = array.array(self.typecode, 2*self.example)
208 b = array.array(self.typecode)
209 self.assertRaises(TypeError, a.tostring, 42)
210 self.assertRaises(TypeError, b.fromstring)
211 self.assertRaises(TypeError, b.fromstring, 42)
212 b.fromstring(a.tostring())
213 self.assertEqual(a, b)
214 if a.itemsize>1:
215 self.assertRaises(ValueError, b.fromstring, "x")
Fred Drake78334472000-06-28 17:50:51 +0000216
Walter Dörwald7fd94242003-05-18 00:47:47 +0000217 def test_repr(self):
218 a = array.array(self.typecode, 2*self.example)
219 self.assertEqual(a, eval(repr(a), {"array": array.array}))
Fred Drake78334472000-06-28 17:50:51 +0000220
Walter Dörwald7fd94242003-05-18 00:47:47 +0000221 a = array.array(self.typecode)
222 self.assertEqual(repr(a), "array('%s')" % self.typecode)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000223
Walter Dörwald7fd94242003-05-18 00:47:47 +0000224 def test_str(self):
225 a = array.array(self.typecode, 2*self.example)
226 str(a)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000227
Walter Dörwald7fd94242003-05-18 00:47:47 +0000228 def test_cmp(self):
229 a = array.array(self.typecode, self.example)
Georg Brandlab91fde2009-08-13 08:51:18 +0000230 self.assertTrue((a == 42) is False)
231 self.assertTrue((a != 42) is True)
Tim Peterscc78e472000-11-14 21:36:07 +0000232
Georg Brandlab91fde2009-08-13 08:51:18 +0000233 self.assertTrue((a == a) is True)
234 self.assertTrue((a != a) is False)
235 self.assertTrue((a < a) is False)
236 self.assertTrue((a <= a) is True)
237 self.assertTrue((a > a) is False)
238 self.assertTrue((a >= a) is True)
Tim Peterscc78e472000-11-14 21:36:07 +0000239
Neal Norwitzbd2835c2006-03-17 08:54:15 +0000240 al = array.array(self.typecode, self.smallerexample)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000241 ab = array.array(self.typecode, self.biggerexample)
Guido van Rossum7f1d3aa1998-07-16 15:31:43 +0000242
Georg Brandlab91fde2009-08-13 08:51:18 +0000243 self.assertTrue((a == 2*a) is False)
244 self.assertTrue((a != 2*a) is True)
245 self.assertTrue((a < 2*a) is True)
246 self.assertTrue((a <= 2*a) is True)
247 self.assertTrue((a > 2*a) is False)
248 self.assertTrue((a >= 2*a) is False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000249
Georg Brandlab91fde2009-08-13 08:51:18 +0000250 self.assertTrue((a == al) is False)
251 self.assertTrue((a != al) is True)
252 self.assertTrue((a < al) is False)
253 self.assertTrue((a <= al) is False)
254 self.assertTrue((a > al) is True)
255 self.assertTrue((a >= al) is True)
Martin v. Löwis99866332002-03-01 10:27:01 +0000256
Georg Brandlab91fde2009-08-13 08:51:18 +0000257 self.assertTrue((a == ab) is False)
258 self.assertTrue((a != ab) is True)
259 self.assertTrue((a < ab) is True)
260 self.assertTrue((a <= ab) is True)
261 self.assertTrue((a > ab) is False)
262 self.assertTrue((a >= ab) is False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000263
Walter Dörwald7fd94242003-05-18 00:47:47 +0000264 def test_add(self):
265 a = array.array(self.typecode, self.example) \
266 + array.array(self.typecode, self.example[::-1])
267 self.assertEqual(
268 a,
269 array.array(self.typecode, self.example + self.example[::-1])
270 )
Martin v. Löwis99866332002-03-01 10:27:01 +0000271
Walter Dörwald7fd94242003-05-18 00:47:47 +0000272 b = array.array(self.badtypecode())
273 self.assertRaises(TypeError, a.__add__, b)
274
275 self.assertRaises(TypeError, a.__add__, "bad")
276
277 def test_iadd(self):
278 a = array.array(self.typecode, self.example[::-1])
279 b = a
280 a += array.array(self.typecode, 2*self.example)
Georg Brandlab91fde2009-08-13 08:51:18 +0000281 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000282 self.assertEqual(
283 a,
284 array.array(self.typecode, self.example[::-1]+2*self.example)
285 )
Georg Brandlae83d6e2009-08-13 09:04:31 +0000286 a = array.array(self.typecode, self.example)
287 a += a
288 self.assertEqual(
289 a,
290 array.array(self.typecode, self.example + self.example)
291 )
Walter Dörwald7fd94242003-05-18 00:47:47 +0000292
293 b = array.array(self.badtypecode())
294 self.assertRaises(TypeError, a.__add__, b)
295
296 self.assertRaises(TypeError, a.__iadd__, "bad")
297
298 def test_mul(self):
299 a = 5*array.array(self.typecode, self.example)
300 self.assertEqual(
301 a,
302 array.array(self.typecode, 5*self.example)
303 )
304
305 a = array.array(self.typecode, self.example)*5
306 self.assertEqual(
307 a,
308 array.array(self.typecode, self.example*5)
309 )
310
311 a = 0*array.array(self.typecode, self.example)
312 self.assertEqual(
313 a,
314 array.array(self.typecode)
315 )
316
317 a = (-1)*array.array(self.typecode, self.example)
318 self.assertEqual(
319 a,
320 array.array(self.typecode)
321 )
322
323 self.assertRaises(TypeError, a.__mul__, "bad")
324
325 def test_imul(self):
326 a = array.array(self.typecode, self.example)
327 b = a
328
329 a *= 5
Georg Brandlab91fde2009-08-13 08:51:18 +0000330 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000331 self.assertEqual(
332 a,
333 array.array(self.typecode, 5*self.example)
334 )
335
336 a *= 0
Georg Brandlab91fde2009-08-13 08:51:18 +0000337 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000338 self.assertEqual(a, array.array(self.typecode))
339
340 a *= 1000
Georg Brandlab91fde2009-08-13 08:51:18 +0000341 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000342 self.assertEqual(a, array.array(self.typecode))
343
344 a *= -1
Georg Brandlab91fde2009-08-13 08:51:18 +0000345 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000346 self.assertEqual(a, array.array(self.typecode))
347
348 a = array.array(self.typecode, self.example)
349 a *= -1
350 self.assertEqual(a, array.array(self.typecode))
351
352 self.assertRaises(TypeError, a.__imul__, "bad")
353
354 def test_getitem(self):
355 a = array.array(self.typecode, self.example)
356 self.assertEntryEqual(a[0], self.example[0])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000357 self.assertEntryEqual(a[0], self.example[0])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000358 self.assertEntryEqual(a[-1], self.example[-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000359 self.assertEntryEqual(a[-1], self.example[-1])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000360 self.assertEntryEqual(a[len(self.example)-1], self.example[-1])
361 self.assertEntryEqual(a[-len(self.example)], self.example[0])
362 self.assertRaises(TypeError, a.__getitem__)
363 self.assertRaises(IndexError, a.__getitem__, len(self.example))
364 self.assertRaises(IndexError, a.__getitem__, -len(self.example)-1)
365
366 def test_setitem(self):
367 a = array.array(self.typecode, self.example)
368 a[0] = a[-1]
369 self.assertEntryEqual(a[0], a[-1])
370
371 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000372 a[0] = a[-1]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000373 self.assertEntryEqual(a[0], a[-1])
374
375 a = array.array(self.typecode, self.example)
376 a[-1] = a[0]
377 self.assertEntryEqual(a[0], a[-1])
378
379 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000380 a[-1] = a[0]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000381 self.assertEntryEqual(a[0], a[-1])
382
383 a = array.array(self.typecode, self.example)
384 a[len(self.example)-1] = a[0]
385 self.assertEntryEqual(a[0], a[-1])
386
387 a = array.array(self.typecode, self.example)
388 a[-len(self.example)] = a[-1]
389 self.assertEntryEqual(a[0], a[-1])
390
391 self.assertRaises(TypeError, a.__setitem__)
392 self.assertRaises(TypeError, a.__setitem__, None)
393 self.assertRaises(TypeError, a.__setitem__, 0, None)
394 self.assertRaises(
395 IndexError,
396 a.__setitem__,
397 len(self.example), self.example[0]
398 )
399 self.assertRaises(
400 IndexError,
401 a.__setitem__,
402 -len(self.example)-1, self.example[0]
403 )
404
405 def test_delitem(self):
406 a = array.array(self.typecode, self.example)
407 del a[0]
408 self.assertEqual(
409 a,
410 array.array(self.typecode, self.example[1:])
411 )
412
413 a = array.array(self.typecode, self.example)
414 del a[-1]
415 self.assertEqual(
416 a,
417 array.array(self.typecode, self.example[:-1])
418 )
419
420 a = array.array(self.typecode, self.example)
421 del a[len(self.example)-1]
422 self.assertEqual(
423 a,
424 array.array(self.typecode, self.example[:-1])
425 )
426
427 a = array.array(self.typecode, self.example)
428 del a[-len(self.example)]
429 self.assertEqual(
430 a,
431 array.array(self.typecode, self.example[1:])
432 )
433
434 self.assertRaises(TypeError, a.__delitem__)
435 self.assertRaises(TypeError, a.__delitem__, None)
436 self.assertRaises(IndexError, a.__delitem__, len(self.example))
437 self.assertRaises(IndexError, a.__delitem__, -len(self.example)-1)
438
439 def test_getslice(self):
440 a = array.array(self.typecode, self.example)
441 self.assertEqual(a[:], a)
442
443 self.assertEqual(
444 a[1:],
445 array.array(self.typecode, self.example[1:])
446 )
447
448 self.assertEqual(
449 a[:1],
450 array.array(self.typecode, self.example[:1])
451 )
452
453 self.assertEqual(
454 a[:-1],
455 array.array(self.typecode, self.example[:-1])
456 )
457
458 self.assertEqual(
459 a[-1:],
460 array.array(self.typecode, self.example[-1:])
461 )
462
463 self.assertEqual(
464 a[-1:-1],
465 array.array(self.typecode)
466 )
467
468 self.assertEqual(
Walter Dörwald1083c242005-01-21 21:16:51 +0000469 a[2:1],
470 array.array(self.typecode)
471 )
472
473 self.assertEqual(
Walter Dörwald7fd94242003-05-18 00:47:47 +0000474 a[1000:],
475 array.array(self.typecode)
476 )
477 self.assertEqual(a[-1000:], a)
478 self.assertEqual(a[:1000], a)
479 self.assertEqual(
480 a[:-1000],
481 array.array(self.typecode)
482 )
483 self.assertEqual(a[-1000:1000], a)
484 self.assertEqual(
485 a[2000:1000],
486 array.array(self.typecode)
487 )
488
Thomas Woutersed03b412007-08-28 21:37:11 +0000489 def test_extended_getslice(self):
490 # Test extended slicing by comparing with list slicing
491 # (Assumes list conversion works correctly, too)
492 a = array.array(self.typecode, self.example)
493 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
494 for start in indices:
495 for stop in indices:
496 # Everything except the initial 0 (invalid step)
497 for step in indices[1:]:
498 self.assertEqual(list(a[start:stop:step]),
499 list(a)[start:stop:step])
500
Walter Dörwald7fd94242003-05-18 00:47:47 +0000501 def test_setslice(self):
502 a = array.array(self.typecode, self.example)
503 a[:1] = a
504 self.assertEqual(
505 a,
506 array.array(self.typecode, self.example + self.example[1:])
507 )
508
509 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000510 a[:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000511 self.assertEqual(
512 a,
513 array.array(self.typecode, self.example + self.example[-1:])
514 )
515
516 a = array.array(self.typecode, self.example)
517 a[-1:] = a
518 self.assertEqual(
519 a,
520 array.array(self.typecode, self.example[:-1] + self.example)
521 )
522
523 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000524 a[1:] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000525 self.assertEqual(
526 a,
527 array.array(self.typecode, self.example[:1] + self.example)
528 )
529
530 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000531 a[1:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000532 self.assertEqual(
533 a,
534 array.array(
535 self.typecode,
536 self.example[:1] + self.example + self.example[-1:]
537 )
538 )
539
540 a = array.array(self.typecode, self.example)
541 a[1000:] = a
542 self.assertEqual(
543 a,
544 array.array(self.typecode, 2*self.example)
545 )
546
547 a = array.array(self.typecode, self.example)
548 a[-1000:] = a
549 self.assertEqual(
550 a,
551 array.array(self.typecode, self.example)
552 )
553
554 a = array.array(self.typecode, self.example)
555 a[:1000] = a
556 self.assertEqual(
557 a,
558 array.array(self.typecode, self.example)
559 )
560
561 a = array.array(self.typecode, self.example)
562 a[:-1000] = a
563 self.assertEqual(
564 a,
565 array.array(self.typecode, 2*self.example)
566 )
567
568 a = array.array(self.typecode, self.example)
569 a[1:0] = a
570 self.assertEqual(
571 a,
572 array.array(self.typecode, self.example[:1] + self.example + self.example[1:])
573 )
574
575 a = array.array(self.typecode, self.example)
576 a[2000:1000] = a
577 self.assertEqual(
578 a,
579 array.array(self.typecode, 2*self.example)
580 )
581
582 a = array.array(self.typecode, self.example)
Thomas Woutersed03b412007-08-28 21:37:11 +0000583 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), None)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000584 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), None)
585
586 b = array.array(self.badtypecode())
Thomas Woutersed03b412007-08-28 21:37:11 +0000587 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000588 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), b)
589
Thomas Woutersed03b412007-08-28 21:37:11 +0000590 def test_extended_set_del_slice(self):
591 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
592 for start in indices:
593 for stop in indices:
594 # Everything except the initial 0 (invalid step)
595 for step in indices[1:]:
596 a = array.array(self.typecode, self.example)
597 L = list(a)
598 # Make sure we have a slice of exactly the right length,
599 # but with (hopefully) different data.
600 data = L[start:stop:step]
601 data.reverse()
602 L[start:stop:step] = data
603 a[start:stop:step] = array.array(self.typecode, data)
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000604 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000605
606 del L[start:stop:step]
607 del a[start:stop:step]
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000608 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000609
Walter Dörwald7fd94242003-05-18 00:47:47 +0000610 def test_index(self):
611 example = 2*self.example
612 a = array.array(self.typecode, example)
613 self.assertRaises(TypeError, a.index)
614 for x in example:
615 self.assertEqual(a.index(x), example.index(x))
616 self.assertRaises(ValueError, a.index, None)
617 self.assertRaises(ValueError, a.index, self.outside)
618
619 def test_count(self):
620 example = 2*self.example
621 a = array.array(self.typecode, example)
622 self.assertRaises(TypeError, a.count)
623 for x in example:
624 self.assertEqual(a.count(x), example.count(x))
625 self.assertEqual(a.count(self.outside), 0)
626 self.assertEqual(a.count(None), 0)
627
628 def test_remove(self):
629 for x in self.example:
630 example = 2*self.example
631 a = array.array(self.typecode, example)
632 pos = example.index(x)
633 example2 = example[:pos] + example[pos+1:]
634 a.remove(x)
635 self.assertEqual(a, array.array(self.typecode, example2))
636
637 a = array.array(self.typecode, self.example)
638 self.assertRaises(ValueError, a.remove, self.outside)
639
640 self.assertRaises(ValueError, a.remove, None)
641
642 def test_pop(self):
643 a = array.array(self.typecode)
644 self.assertRaises(IndexError, a.pop)
645
646 a = array.array(self.typecode, 2*self.example)
647 self.assertRaises(TypeError, a.pop, 42, 42)
648 self.assertRaises(TypeError, a.pop, None)
649 self.assertRaises(IndexError, a.pop, len(a))
650 self.assertRaises(IndexError, a.pop, -len(a)-1)
651
652 self.assertEntryEqual(a.pop(0), self.example[0])
653 self.assertEqual(
654 a,
655 array.array(self.typecode, self.example[1:]+self.example)
656 )
657 self.assertEntryEqual(a.pop(1), self.example[2])
658 self.assertEqual(
659 a,
660 array.array(self.typecode, self.example[1:2]+self.example[3:]+self.example)
661 )
662 self.assertEntryEqual(a.pop(0), self.example[1])
663 self.assertEntryEqual(a.pop(), self.example[-1])
664 self.assertEqual(
665 a,
666 array.array(self.typecode, self.example[3:]+self.example[:-1])
667 )
668
669 def test_reverse(self):
670 a = array.array(self.typecode, self.example)
671 self.assertRaises(TypeError, a.reverse, 42)
Fred Drake004d5e62000-10-23 17:22:08 +0000672 a.reverse()
Walter Dörwald7fd94242003-05-18 00:47:47 +0000673 self.assertEqual(
674 a,
675 array.array(self.typecode, self.example[::-1])
676 )
677
678 def test_extend(self):
679 a = array.array(self.typecode, self.example)
680 self.assertRaises(TypeError, a.extend)
681 a.extend(array.array(self.typecode, self.example[::-1]))
682 self.assertEqual(
683 a,
684 array.array(self.typecode, self.example+self.example[::-1])
685 )
686
Georg Brandlae83d6e2009-08-13 09:04:31 +0000687 a = array.array(self.typecode, self.example)
688 a.extend(a)
689 self.assertEqual(
690 a,
691 array.array(self.typecode, self.example+self.example)
692 )
693
Walter Dörwald7fd94242003-05-18 00:47:47 +0000694 b = array.array(self.badtypecode())
695 self.assertRaises(TypeError, a.extend, b)
696
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000697 a = array.array(self.typecode, self.example)
698 a.extend(self.example[::-1])
699 self.assertEqual(
700 a,
701 array.array(self.typecode, self.example+self.example[::-1])
702 )
703
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +0000704 def test_constructor_with_iterable_argument(self):
705 a = array.array(self.typecode, iter(self.example))
706 b = array.array(self.typecode, self.example)
707 self.assertEqual(a, b)
708
709 # non-iterable argument
710 self.assertRaises(TypeError, array.array, self.typecode, 10)
711
712 # pass through errors raised in __iter__
713 class A:
714 def __iter__(self):
715 raise UnicodeError
716 self.assertRaises(UnicodeError, array.array, self.typecode, A())
717
718 # pass through errors raised in next()
719 def B():
720 raise UnicodeError
721 yield None
722 self.assertRaises(UnicodeError, array.array, self.typecode, B())
723
Walter Dörwald7fd94242003-05-18 00:47:47 +0000724 def test_coveritertraverse(self):
725 try:
726 import gc
727 except ImportError:
728 return
729 a = array.array(self.typecode)
730 l = [iter(a)]
731 l.append(l)
732 gc.collect()
733
734 def test_buffer(self):
735 a = array.array(self.typecode, self.example)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000736 m = memoryview(a)
Georg Brandldf475152009-08-13 09:05:38 +0000737 expected = m.tobytes()
738 self.assertEqual(a.tostring(), expected)
739 self.assertEqual(a.tostring()[0], expected[0])
740 # Resizing is forbidden when there are buffer exports.
741 # For issue 4509, we also check after each error that
742 # the array was not modified.
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000743 self.assertRaises(BufferError, a.append, a[0])
Georg Brandldf475152009-08-13 09:05:38 +0000744 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000745 self.assertRaises(BufferError, a.extend, a[0:1])
Georg Brandldf475152009-08-13 09:05:38 +0000746 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000747 self.assertRaises(BufferError, a.remove, a[0])
Georg Brandldf475152009-08-13 09:05:38 +0000748 self.assertEqual(m.tobytes(), expected)
749 self.assertRaises(BufferError, a.pop, 0)
750 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000751 self.assertRaises(BufferError, a.fromlist, a.tolist())
Georg Brandldf475152009-08-13 09:05:38 +0000752 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000753 self.assertRaises(BufferError, a.fromstring, a.tostring())
Georg Brandldf475152009-08-13 09:05:38 +0000754 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000755 if self.typecode == 'u':
756 self.assertRaises(BufferError, a.fromunicode, a.tounicode())
Georg Brandldf475152009-08-13 09:05:38 +0000757 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +0000758 self.assertRaises(BufferError, operator.imul, a, 2)
Georg Brandldf475152009-08-13 09:05:38 +0000759 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +0000760 self.assertRaises(BufferError, operator.imul, a, 0)
Georg Brandldf475152009-08-13 09:05:38 +0000761 self.assertEqual(m.tobytes(), expected)
762 self.assertRaises(BufferError, operator.setitem, a, slice(0, 0), a)
763 self.assertEqual(m.tobytes(), expected)
764 self.assertRaises(BufferError, operator.delitem, a, 0)
765 self.assertEqual(m.tobytes(), expected)
766 self.assertRaises(BufferError, operator.delitem, a, slice(0, 1))
767 self.assertEqual(m.tobytes(), expected)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000768
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000769 def test_weakref(self):
770 s = array.array(self.typecode, self.example)
771 p = proxy(s)
772 self.assertEqual(p.tostring(), s.tostring())
773 s = None
774 self.assertRaises(ReferenceError, len, p)
775
Skip Montanarod5cf0b82003-08-03 23:02:10 +0000776 def test_bug_782369(self):
777 import sys
Skip Montanaroed9bf122003-08-03 23:30:40 +0000778 if hasattr(sys, "getrefcount"):
779 for i in range(10):
780 b = array.array('B', range(64))
781 rc = sys.getrefcount(10)
782 for i in range(10):
783 b = array.array('B', range(64))
784 self.assertEqual(rc, sys.getrefcount(10))
Skip Montanarod5cf0b82003-08-03 23:02:10 +0000785
Thomas Woutersb2137042007-02-01 18:02:27 +0000786 def test_subclass_with_kwargs(self):
787 # SF bug #1486663 -- this used to erroneously raise a TypeError
788 ArraySubclassWithKwargs('b', newarg=1)
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000789
Guido van Rossum6b826ab2007-07-03 16:22:09 +0000790 def test_create_from_bytes(self):
Georg Brandlae83d6e2009-08-13 09:04:31 +0000791 # XXX This test probably needs to be moved in a subclass or
792 # generalized to use self.typecode.
Guido van Rossum6b826ab2007-07-03 16:22:09 +0000793 a = array.array('H', b"1234")
794 self.assertEqual(len(a) * a.itemsize, 4)
795
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000796
Walter Dörwald7fd94242003-05-18 00:47:47 +0000797class StringTest(BaseTest):
798
799 def test_setitem(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000800 super().test_setitem()
Walter Dörwald7fd94242003-05-18 00:47:47 +0000801 a = array.array(self.typecode, self.example)
802 self.assertRaises(TypeError, a.__setitem__, 0, self.example[:2])
803
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000804class UnicodeTest(StringTest):
805 typecode = 'u'
806 example = '\x01\u263a\x00\ufeff'
807 smallerexample = '\x01\u263a\x00\ufefe'
808 biggerexample = '\x01\u263a\x01\ufeff'
809 outside = str('\x33')
810 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +0000811
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000812 def test_unicode(self):
813 self.assertRaises(TypeError, array.array, 'b', 'foo')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000814
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000815 a = array.array('u', '\xa0\xc2\u1234')
816 a.fromunicode(' ')
817 a.fromunicode('')
818 a.fromunicode('')
819 a.fromunicode('\x11abc\xff\u1234')
820 s = a.tounicode()
821 self.assertEqual(s, '\xa0\xc2\u1234 \x11abc\xff\u1234')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000822
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000823 s = '\x00="\'a\\b\x80\xff\u0000\u0001\u1234'
824 a = array.array('u', s)
825 self.assertEqual(
826 repr(a),
Georg Brandl559e5d72008-06-11 18:37:52 +0000827 "array('u', '\\x00=\"\\'a\\\\b\\x80\xff\\x00\\x01\u1234')")
Walter Dörwald7fd94242003-05-18 00:47:47 +0000828
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000829 self.assertRaises(TypeError, a.fromunicode)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000830
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000831tests.append(UnicodeTest)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000832
833class NumberTest(BaseTest):
834
835 def test_extslice(self):
836 a = array.array(self.typecode, range(5))
837 self.assertEqual(a[::], a)
838 self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
839 self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
840 self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
841 self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
842 self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
843 self.assertEqual(a[-100:100:], a)
844 self.assertEqual(a[100:-100:-1], a[::-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000845 self.assertEqual(a[-100:100:2], array.array(self.typecode, [0,2,4]))
Walter Dörwald7fd94242003-05-18 00:47:47 +0000846 self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
847 self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
848
849 def test_delslice(self):
850 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +0000851 del a[::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000852 self.assertEqual(a, array.array(self.typecode, [1,3]))
853 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +0000854 del a[1::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000855 self.assertEqual(a, array.array(self.typecode, [0,2,4]))
856 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +0000857 del a[1::-2]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000858 self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
859 a = array.array(self.typecode, range(10))
Michael W. Hudson56796f62002-07-29 14:35:04 +0000860 del a[::1000]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000861 self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
Mark Dickinsona53f2c92010-01-29 17:29:21 +0000862 # test issue7788
863 a = array.array(self.typecode, range(10))
864 del a[9::1<<333]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000865
866 def test_assignment(self):
867 a = array.array(self.typecode, range(10))
868 a[::2] = array.array(self.typecode, [42]*5)
869 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
870 a = array.array(self.typecode, range(10))
871 a[::-4] = array.array(self.typecode, [10]*3)
872 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
873 a = array.array(self.typecode, range(4))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +0000874 a[::-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000875 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
876 a = array.array(self.typecode, range(10))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +0000877 b = a[:]
878 c = a[:]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000879 ins = array.array(self.typecode, range(2))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +0000880 a[2:3] = ins
881 b[slice(2,3)] = ins
882 c[2:3:] = ins
Fred Drake004d5e62000-10-23 17:22:08 +0000883
Walter Dörwald7fd94242003-05-18 00:47:47 +0000884 def test_iterationcontains(self):
885 a = array.array(self.typecode, range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +0000886 self.assertEqual(list(a), list(range(10)))
Walter Dörwald7fd94242003-05-18 00:47:47 +0000887 b = array.array(self.typecode, [20])
888 self.assertEqual(a[-1] in a, True)
889 self.assertEqual(b[0] not in a, True)
890
891 def check_overflow(self, lower, upper):
892 # method to be used by subclasses
893
894 # should not overflow assigning lower limit
895 a = array.array(self.typecode, [lower])
896 a[0] = lower
897 # should overflow assigning less than lower limit
898 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
899 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
900 # should not overflow assigning upper limit
901 a = array.array(self.typecode, [upper])
902 a[0] = upper
903 # should overflow assigning more than upper limit
904 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
905 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
906
907 def test_subclassing(self):
908 typecode = self.typecode
909 class ExaggeratingArray(array.array):
910 __slots__ = ['offset']
911
912 def __new__(cls, typecode, data, offset):
913 return array.array.__new__(cls, typecode, data)
914
915 def __init__(self, typecode, data, offset):
916 self.offset = offset
917
918 def __getitem__(self, i):
919 return array.array.__getitem__(self, i) + self.offset
920
921 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
922 self.assertEntryEqual(a[0], 7)
923
924 self.assertRaises(AttributeError, setattr, a, "color", "blue")
925
926class SignedNumberTest(NumberTest):
927 example = [-1, 0, 1, 42, 0x7f]
928 smallerexample = [-1, 0, 1, 42, 0x7e]
929 biggerexample = [-1, 0, 1, 43, 0x7f]
930 outside = 23
931
932 def test_overflow(self):
933 a = array.array(self.typecode)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000934 lower = -1 * int(pow(2, a.itemsize * 8 - 1))
935 upper = int(pow(2, a.itemsize * 8 - 1)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +0000936 self.check_overflow(lower, upper)
937
938class UnsignedNumberTest(NumberTest):
939 example = [0, 1, 17, 23, 42, 0xff]
940 smallerexample = [0, 1, 17, 23, 42, 0xfe]
941 biggerexample = [0, 1, 17, 23, 43, 0xff]
942 outside = 0xaa
943
944 def test_overflow(self):
945 a = array.array(self.typecode)
946 lower = 0
Guido van Rossume2a383d2007-01-15 16:59:06 +0000947 upper = int(pow(2, a.itemsize * 8)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +0000948 self.check_overflow(lower, upper)
Fred Drake004d5e62000-10-23 17:22:08 +0000949
950
Walter Dörwald7fd94242003-05-18 00:47:47 +0000951class ByteTest(SignedNumberTest):
952 typecode = 'b'
953 minitemsize = 1
954tests.append(ByteTest)
Fred Drake004d5e62000-10-23 17:22:08 +0000955
Walter Dörwald7fd94242003-05-18 00:47:47 +0000956class UnsignedByteTest(UnsignedNumberTest):
957 typecode = 'B'
958 minitemsize = 1
959tests.append(UnsignedByteTest)
960
961class ShortTest(SignedNumberTest):
962 typecode = 'h'
963 minitemsize = 2
964tests.append(ShortTest)
965
966class UnsignedShortTest(UnsignedNumberTest):
967 typecode = 'H'
968 minitemsize = 2
969tests.append(UnsignedShortTest)
970
971class IntTest(SignedNumberTest):
972 typecode = 'i'
973 minitemsize = 2
974tests.append(IntTest)
975
976class UnsignedIntTest(UnsignedNumberTest):
977 typecode = 'I'
978 minitemsize = 2
979tests.append(UnsignedIntTest)
980
981class LongTest(SignedNumberTest):
982 typecode = 'l'
983 minitemsize = 4
984tests.append(LongTest)
985
986class UnsignedLongTest(UnsignedNumberTest):
987 typecode = 'L'
988 minitemsize = 4
989tests.append(UnsignedLongTest)
990
991class FPTest(NumberTest):
992 example = [-42.0, 0, 42, 1e5, -1e10]
993 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
994 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
995 outside = 23
996
997 def assertEntryEqual(self, entry1, entry2):
998 self.assertAlmostEqual(entry1, entry2)
999
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001000 def test_byteswap(self):
1001 a = array.array(self.typecode, self.example)
1002 self.assertRaises(TypeError, a.byteswap, 42)
1003 if a.itemsize in (1, 2, 4, 8):
1004 b = array.array(self.typecode, self.example)
1005 b.byteswap()
1006 if a.itemsize==1:
1007 self.assertEqual(a, b)
1008 else:
1009 # On alphas treating the byte swapped bit patters as
1010 # floats/doubles results in floating point exceptions
1011 # => compare the 8bit string values instead
1012 self.assertNotEqual(a.tostring(), b.tostring())
1013 b.byteswap()
1014 self.assertEqual(a, b)
1015
Neal Norwitz35c6cd02003-05-22 13:29:15 +00001016class FloatTest(FPTest):
1017 typecode = 'f'
1018 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001019tests.append(FloatTest)
1020
1021class DoubleTest(FPTest):
1022 typecode = 'd'
1023 minitemsize = 8
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001024
1025 def test_alloc_overflow(self):
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001026 from sys import maxsize
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001027 a = array.array('d', [-1]*65536)
1028 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001029 a *= maxsize//65536 + 1
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001030 except MemoryError:
1031 pass
1032 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001033 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001034 b = array.array('d', [ 2.71828183, 3.14159265, -1])
1035 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001036 b * (maxsize//3 + 1)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001037 except MemoryError:
1038 pass
1039 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001040 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001041
Walter Dörwald7fd94242003-05-18 00:47:47 +00001042tests.append(DoubleTest)
1043
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001044def test_main(verbose=None):
1045 import sys
1046
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001047 support.run_unittest(*tests)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001048
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001049 # verify reference counting
1050 if verbose and hasattr(sys, "gettotalrefcount"):
1051 import gc
1052 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001053 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001054 support.run_unittest(*tests)
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001055 gc.collect()
1056 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001057 print(counts)
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001058
1059if __name__ == "__main__":
1060 test_main(verbose=True)