blob: 93c6cc0e6a637fdba523e4b5d94df19284134864 [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)
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
Walter Dörwald7fd94242003-05-18 00:47:47 +0000185 def test_tofromlist(self):
186 a = array.array(self.typecode, 2*self.example)
187 b = array.array(self.typecode)
188 self.assertRaises(TypeError, a.tolist, 42)
189 self.assertRaises(TypeError, b.fromlist)
190 self.assertRaises(TypeError, b.fromlist, 42)
191 self.assertRaises(TypeError, b.fromlist, [None])
192 b.fromlist(a.tolist())
193 self.assertEqual(a, b)
Fred Drake78334472000-06-28 17:50:51 +0000194
Walter Dörwald7fd94242003-05-18 00:47:47 +0000195 def test_tofromstring(self):
196 a = array.array(self.typecode, 2*self.example)
197 b = array.array(self.typecode)
198 self.assertRaises(TypeError, a.tostring, 42)
199 self.assertRaises(TypeError, b.fromstring)
200 self.assertRaises(TypeError, b.fromstring, 42)
201 b.fromstring(a.tostring())
202 self.assertEqual(a, b)
203 if a.itemsize>1:
204 self.assertRaises(ValueError, b.fromstring, "x")
Fred Drake78334472000-06-28 17:50:51 +0000205
Walter Dörwald7fd94242003-05-18 00:47:47 +0000206 def test_repr(self):
207 a = array.array(self.typecode, 2*self.example)
208 self.assertEqual(a, eval(repr(a), {"array": array.array}))
Fred Drake78334472000-06-28 17:50:51 +0000209
Walter Dörwald7fd94242003-05-18 00:47:47 +0000210 a = array.array(self.typecode)
211 self.assertEqual(repr(a), "array('%s')" % self.typecode)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000212
Walter Dörwald7fd94242003-05-18 00:47:47 +0000213 def test_str(self):
214 a = array.array(self.typecode, 2*self.example)
215 str(a)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000216
Walter Dörwald7fd94242003-05-18 00:47:47 +0000217 def test_cmp(self):
218 a = array.array(self.typecode, self.example)
Georg Brandlab91fde2009-08-13 08:51:18 +0000219 self.assertTrue((a == 42) is False)
220 self.assertTrue((a != 42) is True)
Tim Peterscc78e472000-11-14 21:36:07 +0000221
Georg Brandlab91fde2009-08-13 08:51:18 +0000222 self.assertTrue((a == a) is True)
223 self.assertTrue((a != a) is False)
224 self.assertTrue((a < a) is False)
225 self.assertTrue((a <= a) is True)
226 self.assertTrue((a > a) is False)
227 self.assertTrue((a >= a) is True)
Tim Peterscc78e472000-11-14 21:36:07 +0000228
Neal Norwitzbd2835c2006-03-17 08:54:15 +0000229 al = array.array(self.typecode, self.smallerexample)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000230 ab = array.array(self.typecode, self.biggerexample)
Guido van Rossum7f1d3aa1998-07-16 15:31:43 +0000231
Georg Brandlab91fde2009-08-13 08:51:18 +0000232 self.assertTrue((a == 2*a) is False)
233 self.assertTrue((a != 2*a) is True)
234 self.assertTrue((a < 2*a) is True)
235 self.assertTrue((a <= 2*a) is True)
236 self.assertTrue((a > 2*a) is False)
237 self.assertTrue((a >= 2*a) is False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000238
Georg Brandlab91fde2009-08-13 08:51:18 +0000239 self.assertTrue((a == al) is False)
240 self.assertTrue((a != al) is True)
241 self.assertTrue((a < al) is False)
242 self.assertTrue((a <= al) is False)
243 self.assertTrue((a > al) is True)
244 self.assertTrue((a >= al) is True)
Martin v. Löwis99866332002-03-01 10:27:01 +0000245
Georg Brandlab91fde2009-08-13 08:51:18 +0000246 self.assertTrue((a == ab) is False)
247 self.assertTrue((a != ab) is True)
248 self.assertTrue((a < ab) is True)
249 self.assertTrue((a <= ab) is True)
250 self.assertTrue((a > ab) is False)
251 self.assertTrue((a >= ab) is False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000252
Walter Dörwald7fd94242003-05-18 00:47:47 +0000253 def test_add(self):
254 a = array.array(self.typecode, self.example) \
255 + array.array(self.typecode, self.example[::-1])
256 self.assertEqual(
257 a,
258 array.array(self.typecode, self.example + self.example[::-1])
259 )
Martin v. Löwis99866332002-03-01 10:27:01 +0000260
Walter Dörwald7fd94242003-05-18 00:47:47 +0000261 b = array.array(self.badtypecode())
262 self.assertRaises(TypeError, a.__add__, b)
263
264 self.assertRaises(TypeError, a.__add__, "bad")
265
266 def test_iadd(self):
267 a = array.array(self.typecode, self.example[::-1])
268 b = a
269 a += array.array(self.typecode, 2*self.example)
Georg Brandlab91fde2009-08-13 08:51:18 +0000270 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000271 self.assertEqual(
272 a,
273 array.array(self.typecode, self.example[::-1]+2*self.example)
274 )
Georg Brandlae83d6e2009-08-13 09:04:31 +0000275 a = array.array(self.typecode, self.example)
276 a += a
277 self.assertEqual(
278 a,
279 array.array(self.typecode, self.example + self.example)
280 )
Walter Dörwald7fd94242003-05-18 00:47:47 +0000281
282 b = array.array(self.badtypecode())
283 self.assertRaises(TypeError, a.__add__, b)
284
285 self.assertRaises(TypeError, a.__iadd__, "bad")
286
287 def test_mul(self):
288 a = 5*array.array(self.typecode, self.example)
289 self.assertEqual(
290 a,
291 array.array(self.typecode, 5*self.example)
292 )
293
294 a = array.array(self.typecode, self.example)*5
295 self.assertEqual(
296 a,
297 array.array(self.typecode, self.example*5)
298 )
299
300 a = 0*array.array(self.typecode, self.example)
301 self.assertEqual(
302 a,
303 array.array(self.typecode)
304 )
305
306 a = (-1)*array.array(self.typecode, self.example)
307 self.assertEqual(
308 a,
309 array.array(self.typecode)
310 )
311
312 self.assertRaises(TypeError, a.__mul__, "bad")
313
314 def test_imul(self):
315 a = array.array(self.typecode, self.example)
316 b = a
317
318 a *= 5
Georg Brandlab91fde2009-08-13 08:51:18 +0000319 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000320 self.assertEqual(
321 a,
322 array.array(self.typecode, 5*self.example)
323 )
324
325 a *= 0
Georg Brandlab91fde2009-08-13 08:51:18 +0000326 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000327 self.assertEqual(a, array.array(self.typecode))
328
329 a *= 1000
Georg Brandlab91fde2009-08-13 08:51:18 +0000330 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000331 self.assertEqual(a, array.array(self.typecode))
332
333 a *= -1
Georg Brandlab91fde2009-08-13 08:51:18 +0000334 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000335 self.assertEqual(a, array.array(self.typecode))
336
337 a = array.array(self.typecode, self.example)
338 a *= -1
339 self.assertEqual(a, array.array(self.typecode))
340
341 self.assertRaises(TypeError, a.__imul__, "bad")
342
343 def test_getitem(self):
344 a = array.array(self.typecode, self.example)
345 self.assertEntryEqual(a[0], self.example[0])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000346 self.assertEntryEqual(a[0], self.example[0])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000347 self.assertEntryEqual(a[-1], self.example[-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000348 self.assertEntryEqual(a[-1], self.example[-1])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000349 self.assertEntryEqual(a[len(self.example)-1], self.example[-1])
350 self.assertEntryEqual(a[-len(self.example)], self.example[0])
351 self.assertRaises(TypeError, a.__getitem__)
352 self.assertRaises(IndexError, a.__getitem__, len(self.example))
353 self.assertRaises(IndexError, a.__getitem__, -len(self.example)-1)
354
355 def test_setitem(self):
356 a = array.array(self.typecode, self.example)
357 a[0] = a[-1]
358 self.assertEntryEqual(a[0], a[-1])
359
360 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000361 a[0] = a[-1]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000362 self.assertEntryEqual(a[0], a[-1])
363
364 a = array.array(self.typecode, self.example)
365 a[-1] = a[0]
366 self.assertEntryEqual(a[0], a[-1])
367
368 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000369 a[-1] = a[0]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000370 self.assertEntryEqual(a[0], a[-1])
371
372 a = array.array(self.typecode, self.example)
373 a[len(self.example)-1] = a[0]
374 self.assertEntryEqual(a[0], a[-1])
375
376 a = array.array(self.typecode, self.example)
377 a[-len(self.example)] = a[-1]
378 self.assertEntryEqual(a[0], a[-1])
379
380 self.assertRaises(TypeError, a.__setitem__)
381 self.assertRaises(TypeError, a.__setitem__, None)
382 self.assertRaises(TypeError, a.__setitem__, 0, None)
383 self.assertRaises(
384 IndexError,
385 a.__setitem__,
386 len(self.example), self.example[0]
387 )
388 self.assertRaises(
389 IndexError,
390 a.__setitem__,
391 -len(self.example)-1, self.example[0]
392 )
393
394 def test_delitem(self):
395 a = array.array(self.typecode, self.example)
396 del a[0]
397 self.assertEqual(
398 a,
399 array.array(self.typecode, self.example[1:])
400 )
401
402 a = array.array(self.typecode, self.example)
403 del a[-1]
404 self.assertEqual(
405 a,
406 array.array(self.typecode, self.example[:-1])
407 )
408
409 a = array.array(self.typecode, self.example)
410 del a[len(self.example)-1]
411 self.assertEqual(
412 a,
413 array.array(self.typecode, self.example[:-1])
414 )
415
416 a = array.array(self.typecode, self.example)
417 del a[-len(self.example)]
418 self.assertEqual(
419 a,
420 array.array(self.typecode, self.example[1:])
421 )
422
423 self.assertRaises(TypeError, a.__delitem__)
424 self.assertRaises(TypeError, a.__delitem__, None)
425 self.assertRaises(IndexError, a.__delitem__, len(self.example))
426 self.assertRaises(IndexError, a.__delitem__, -len(self.example)-1)
427
428 def test_getslice(self):
429 a = array.array(self.typecode, self.example)
430 self.assertEqual(a[:], a)
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:],
449 array.array(self.typecode, self.example[-1:])
450 )
451
452 self.assertEqual(
453 a[-1:-1],
454 array.array(self.typecode)
455 )
456
457 self.assertEqual(
Walter Dörwald1083c242005-01-21 21:16:51 +0000458 a[2:1],
459 array.array(self.typecode)
460 )
461
462 self.assertEqual(
Walter Dörwald7fd94242003-05-18 00:47:47 +0000463 a[1000:],
464 array.array(self.typecode)
465 )
466 self.assertEqual(a[-1000:], a)
467 self.assertEqual(a[:1000], a)
468 self.assertEqual(
469 a[:-1000],
470 array.array(self.typecode)
471 )
472 self.assertEqual(a[-1000:1000], a)
473 self.assertEqual(
474 a[2000:1000],
475 array.array(self.typecode)
476 )
477
Thomas Woutersed03b412007-08-28 21:37:11 +0000478 def test_extended_getslice(self):
479 # Test extended slicing by comparing with list slicing
480 # (Assumes list conversion works correctly, too)
481 a = array.array(self.typecode, self.example)
482 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
483 for start in indices:
484 for stop in indices:
485 # Everything except the initial 0 (invalid step)
486 for step in indices[1:]:
487 self.assertEqual(list(a[start:stop:step]),
488 list(a)[start:stop:step])
489
Walter Dörwald7fd94242003-05-18 00:47:47 +0000490 def test_setslice(self):
491 a = array.array(self.typecode, self.example)
492 a[:1] = a
493 self.assertEqual(
494 a,
495 array.array(self.typecode, self.example + self.example[1:])
496 )
497
498 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000499 a[:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000500 self.assertEqual(
501 a,
502 array.array(self.typecode, self.example + self.example[-1:])
503 )
504
505 a = array.array(self.typecode, self.example)
506 a[-1:] = a
507 self.assertEqual(
508 a,
509 array.array(self.typecode, self.example[:-1] + self.example)
510 )
511
512 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000513 a[1:] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000514 self.assertEqual(
515 a,
516 array.array(self.typecode, self.example[:1] + self.example)
517 )
518
519 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000520 a[1:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000521 self.assertEqual(
522 a,
523 array.array(
524 self.typecode,
525 self.example[:1] + self.example + self.example[-1:]
526 )
527 )
528
529 a = array.array(self.typecode, self.example)
530 a[1000:] = a
531 self.assertEqual(
532 a,
533 array.array(self.typecode, 2*self.example)
534 )
535
536 a = array.array(self.typecode, self.example)
537 a[-1000:] = a
538 self.assertEqual(
539 a,
540 array.array(self.typecode, self.example)
541 )
542
543 a = array.array(self.typecode, self.example)
544 a[:1000] = a
545 self.assertEqual(
546 a,
547 array.array(self.typecode, self.example)
548 )
549
550 a = array.array(self.typecode, self.example)
551 a[:-1000] = a
552 self.assertEqual(
553 a,
554 array.array(self.typecode, 2*self.example)
555 )
556
557 a = array.array(self.typecode, self.example)
558 a[1:0] = a
559 self.assertEqual(
560 a,
561 array.array(self.typecode, self.example[:1] + self.example + self.example[1:])
562 )
563
564 a = array.array(self.typecode, self.example)
565 a[2000:1000] = a
566 self.assertEqual(
567 a,
568 array.array(self.typecode, 2*self.example)
569 )
570
571 a = array.array(self.typecode, self.example)
Thomas Woutersed03b412007-08-28 21:37:11 +0000572 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), None)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000573 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), None)
574
575 b = array.array(self.badtypecode())
Thomas Woutersed03b412007-08-28 21:37:11 +0000576 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000577 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), b)
578
Thomas Woutersed03b412007-08-28 21:37:11 +0000579 def test_extended_set_del_slice(self):
580 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
581 for start in indices:
582 for stop in indices:
583 # Everything except the initial 0 (invalid step)
584 for step in indices[1:]:
585 a = array.array(self.typecode, self.example)
586 L = list(a)
587 # Make sure we have a slice of exactly the right length,
588 # but with (hopefully) different data.
589 data = L[start:stop:step]
590 data.reverse()
591 L[start:stop:step] = data
592 a[start:stop:step] = array.array(self.typecode, data)
593 self.assertEquals(a, array.array(self.typecode, L))
594
595 del L[start:stop:step]
596 del a[start:stop:step]
597 self.assertEquals(a, array.array(self.typecode, L))
598
Walter Dörwald7fd94242003-05-18 00:47:47 +0000599 def test_index(self):
600 example = 2*self.example
601 a = array.array(self.typecode, example)
602 self.assertRaises(TypeError, a.index)
603 for x in example:
604 self.assertEqual(a.index(x), example.index(x))
605 self.assertRaises(ValueError, a.index, None)
606 self.assertRaises(ValueError, a.index, self.outside)
607
608 def test_count(self):
609 example = 2*self.example
610 a = array.array(self.typecode, example)
611 self.assertRaises(TypeError, a.count)
612 for x in example:
613 self.assertEqual(a.count(x), example.count(x))
614 self.assertEqual(a.count(self.outside), 0)
615 self.assertEqual(a.count(None), 0)
616
617 def test_remove(self):
618 for x in self.example:
619 example = 2*self.example
620 a = array.array(self.typecode, example)
621 pos = example.index(x)
622 example2 = example[:pos] + example[pos+1:]
623 a.remove(x)
624 self.assertEqual(a, array.array(self.typecode, example2))
625
626 a = array.array(self.typecode, self.example)
627 self.assertRaises(ValueError, a.remove, self.outside)
628
629 self.assertRaises(ValueError, a.remove, None)
630
631 def test_pop(self):
632 a = array.array(self.typecode)
633 self.assertRaises(IndexError, a.pop)
634
635 a = array.array(self.typecode, 2*self.example)
636 self.assertRaises(TypeError, a.pop, 42, 42)
637 self.assertRaises(TypeError, a.pop, None)
638 self.assertRaises(IndexError, a.pop, len(a))
639 self.assertRaises(IndexError, a.pop, -len(a)-1)
640
641 self.assertEntryEqual(a.pop(0), self.example[0])
642 self.assertEqual(
643 a,
644 array.array(self.typecode, self.example[1:]+self.example)
645 )
646 self.assertEntryEqual(a.pop(1), self.example[2])
647 self.assertEqual(
648 a,
649 array.array(self.typecode, self.example[1:2]+self.example[3:]+self.example)
650 )
651 self.assertEntryEqual(a.pop(0), self.example[1])
652 self.assertEntryEqual(a.pop(), self.example[-1])
653 self.assertEqual(
654 a,
655 array.array(self.typecode, self.example[3:]+self.example[:-1])
656 )
657
658 def test_reverse(self):
659 a = array.array(self.typecode, self.example)
660 self.assertRaises(TypeError, a.reverse, 42)
Fred Drake004d5e62000-10-23 17:22:08 +0000661 a.reverse()
Walter Dörwald7fd94242003-05-18 00:47:47 +0000662 self.assertEqual(
663 a,
664 array.array(self.typecode, self.example[::-1])
665 )
666
667 def test_extend(self):
668 a = array.array(self.typecode, self.example)
669 self.assertRaises(TypeError, a.extend)
670 a.extend(array.array(self.typecode, self.example[::-1]))
671 self.assertEqual(
672 a,
673 array.array(self.typecode, self.example+self.example[::-1])
674 )
675
Georg Brandlae83d6e2009-08-13 09:04:31 +0000676 a = array.array(self.typecode, self.example)
677 a.extend(a)
678 self.assertEqual(
679 a,
680 array.array(self.typecode, self.example+self.example)
681 )
682
Walter Dörwald7fd94242003-05-18 00:47:47 +0000683 b = array.array(self.badtypecode())
684 self.assertRaises(TypeError, a.extend, b)
685
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000686 a = array.array(self.typecode, self.example)
687 a.extend(self.example[::-1])
688 self.assertEqual(
689 a,
690 array.array(self.typecode, self.example+self.example[::-1])
691 )
692
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +0000693 def test_constructor_with_iterable_argument(self):
694 a = array.array(self.typecode, iter(self.example))
695 b = array.array(self.typecode, self.example)
696 self.assertEqual(a, b)
697
698 # non-iterable argument
699 self.assertRaises(TypeError, array.array, self.typecode, 10)
700
701 # pass through errors raised in __iter__
702 class A:
703 def __iter__(self):
704 raise UnicodeError
705 self.assertRaises(UnicodeError, array.array, self.typecode, A())
706
707 # pass through errors raised in next()
708 def B():
709 raise UnicodeError
710 yield None
711 self.assertRaises(UnicodeError, array.array, self.typecode, B())
712
Walter Dörwald7fd94242003-05-18 00:47:47 +0000713 def test_coveritertraverse(self):
714 try:
715 import gc
716 except ImportError:
717 return
718 a = array.array(self.typecode)
719 l = [iter(a)]
720 l.append(l)
721 gc.collect()
722
723 def test_buffer(self):
724 a = array.array(self.typecode, self.example)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000725 m = memoryview(a)
Georg Brandldf475152009-08-13 09:05:38 +0000726 expected = m.tobytes()
727 self.assertEqual(a.tostring(), expected)
728 self.assertEqual(a.tostring()[0], expected[0])
729 # Resizing is forbidden when there are buffer exports.
730 # For issue 4509, we also check after each error that
731 # the array was not modified.
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000732 self.assertRaises(BufferError, a.append, a[0])
Georg Brandldf475152009-08-13 09:05:38 +0000733 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000734 self.assertRaises(BufferError, a.extend, a[0:1])
Georg Brandldf475152009-08-13 09:05:38 +0000735 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000736 self.assertRaises(BufferError, a.remove, a[0])
Georg Brandldf475152009-08-13 09:05:38 +0000737 self.assertEqual(m.tobytes(), expected)
738 self.assertRaises(BufferError, a.pop, 0)
739 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000740 self.assertRaises(BufferError, a.fromlist, a.tolist())
Georg Brandldf475152009-08-13 09:05:38 +0000741 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000742 self.assertRaises(BufferError, a.fromstring, a.tostring())
Georg Brandldf475152009-08-13 09:05:38 +0000743 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000744 if self.typecode == 'u':
745 self.assertRaises(BufferError, a.fromunicode, a.tounicode())
Georg Brandldf475152009-08-13 09:05:38 +0000746 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +0000747 self.assertRaises(BufferError, operator.imul, a, 2)
Georg Brandldf475152009-08-13 09:05:38 +0000748 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +0000749 self.assertRaises(BufferError, operator.imul, a, 0)
Georg Brandldf475152009-08-13 09:05:38 +0000750 self.assertEqual(m.tobytes(), expected)
751 self.assertRaises(BufferError, operator.setitem, a, slice(0, 0), a)
752 self.assertEqual(m.tobytes(), expected)
753 self.assertRaises(BufferError, operator.delitem, a, 0)
754 self.assertEqual(m.tobytes(), expected)
755 self.assertRaises(BufferError, operator.delitem, a, slice(0, 1))
756 self.assertEqual(m.tobytes(), expected)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000757
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000758 def test_weakref(self):
759 s = array.array(self.typecode, self.example)
760 p = proxy(s)
761 self.assertEqual(p.tostring(), s.tostring())
762 s = None
763 self.assertRaises(ReferenceError, len, p)
764
Skip Montanarod5cf0b82003-08-03 23:02:10 +0000765 def test_bug_782369(self):
766 import sys
Skip Montanaroed9bf122003-08-03 23:30:40 +0000767 if hasattr(sys, "getrefcount"):
768 for i in range(10):
769 b = array.array('B', range(64))
770 rc = sys.getrefcount(10)
771 for i in range(10):
772 b = array.array('B', range(64))
773 self.assertEqual(rc, sys.getrefcount(10))
Skip Montanarod5cf0b82003-08-03 23:02:10 +0000774
Thomas Woutersb2137042007-02-01 18:02:27 +0000775 def test_subclass_with_kwargs(self):
776 # SF bug #1486663 -- this used to erroneously raise a TypeError
777 ArraySubclassWithKwargs('b', newarg=1)
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000778
Guido van Rossum6b826ab2007-07-03 16:22:09 +0000779 def test_create_from_bytes(self):
Georg Brandlae83d6e2009-08-13 09:04:31 +0000780 # XXX This test probably needs to be moved in a subclass or
781 # generalized to use self.typecode.
Guido van Rossum6b826ab2007-07-03 16:22:09 +0000782 a = array.array('H', b"1234")
783 self.assertEqual(len(a) * a.itemsize, 4)
784
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000785
Walter Dörwald7fd94242003-05-18 00:47:47 +0000786class StringTest(BaseTest):
787
788 def test_setitem(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000789 super().test_setitem()
Walter Dörwald7fd94242003-05-18 00:47:47 +0000790 a = array.array(self.typecode, self.example)
791 self.assertRaises(TypeError, a.__setitem__, 0, self.example[:2])
792
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000793class UnicodeTest(StringTest):
794 typecode = 'u'
795 example = '\x01\u263a\x00\ufeff'
796 smallerexample = '\x01\u263a\x00\ufefe'
797 biggerexample = '\x01\u263a\x01\ufeff'
798 outside = str('\x33')
799 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +0000800
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000801 def test_unicode(self):
802 self.assertRaises(TypeError, array.array, 'b', 'foo')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000803
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000804 a = array.array('u', '\xa0\xc2\u1234')
805 a.fromunicode(' ')
806 a.fromunicode('')
807 a.fromunicode('')
808 a.fromunicode('\x11abc\xff\u1234')
809 s = a.tounicode()
810 self.assertEqual(s, '\xa0\xc2\u1234 \x11abc\xff\u1234')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000811
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000812 s = '\x00="\'a\\b\x80\xff\u0000\u0001\u1234'
813 a = array.array('u', s)
814 self.assertEqual(
815 repr(a),
Georg Brandl559e5d72008-06-11 18:37:52 +0000816 "array('u', '\\x00=\"\\'a\\\\b\\x80\xff\\x00\\x01\u1234')")
Walter Dörwald7fd94242003-05-18 00:47:47 +0000817
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000818 self.assertRaises(TypeError, a.fromunicode)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000819
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000820tests.append(UnicodeTest)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000821
822class NumberTest(BaseTest):
823
824 def test_extslice(self):
825 a = array.array(self.typecode, range(5))
826 self.assertEqual(a[::], a)
827 self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
828 self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
829 self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
830 self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
831 self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
832 self.assertEqual(a[-100:100:], a)
833 self.assertEqual(a[100:-100:-1], a[::-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000834 self.assertEqual(a[-100:100:2], array.array(self.typecode, [0,2,4]))
Walter Dörwald7fd94242003-05-18 00:47:47 +0000835 self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
836 self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
837
838 def test_delslice(self):
839 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +0000840 del a[::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000841 self.assertEqual(a, array.array(self.typecode, [1,3]))
842 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +0000843 del a[1::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000844 self.assertEqual(a, array.array(self.typecode, [0,2,4]))
845 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +0000846 del a[1::-2]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000847 self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
848 a = array.array(self.typecode, range(10))
Michael W. Hudson56796f62002-07-29 14:35:04 +0000849 del a[::1000]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000850 self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
851
852 def test_assignment(self):
853 a = array.array(self.typecode, range(10))
854 a[::2] = array.array(self.typecode, [42]*5)
855 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
856 a = array.array(self.typecode, range(10))
857 a[::-4] = array.array(self.typecode, [10]*3)
858 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
859 a = array.array(self.typecode, range(4))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +0000860 a[::-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000861 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
862 a = array.array(self.typecode, range(10))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +0000863 b = a[:]
864 c = a[:]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000865 ins = array.array(self.typecode, range(2))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +0000866 a[2:3] = ins
867 b[slice(2,3)] = ins
868 c[2:3:] = ins
Fred Drake004d5e62000-10-23 17:22:08 +0000869
Walter Dörwald7fd94242003-05-18 00:47:47 +0000870 def test_iterationcontains(self):
871 a = array.array(self.typecode, range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +0000872 self.assertEqual(list(a), list(range(10)))
Walter Dörwald7fd94242003-05-18 00:47:47 +0000873 b = array.array(self.typecode, [20])
874 self.assertEqual(a[-1] in a, True)
875 self.assertEqual(b[0] not in a, True)
876
877 def check_overflow(self, lower, upper):
878 # method to be used by subclasses
879
880 # should not overflow assigning lower limit
881 a = array.array(self.typecode, [lower])
882 a[0] = lower
883 # should overflow assigning less than lower limit
884 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
885 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
886 # should not overflow assigning upper limit
887 a = array.array(self.typecode, [upper])
888 a[0] = upper
889 # should overflow assigning more than upper limit
890 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
891 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
892
893 def test_subclassing(self):
894 typecode = self.typecode
895 class ExaggeratingArray(array.array):
896 __slots__ = ['offset']
897
898 def __new__(cls, typecode, data, offset):
899 return array.array.__new__(cls, typecode, data)
900
901 def __init__(self, typecode, data, offset):
902 self.offset = offset
903
904 def __getitem__(self, i):
905 return array.array.__getitem__(self, i) + self.offset
906
907 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
908 self.assertEntryEqual(a[0], 7)
909
910 self.assertRaises(AttributeError, setattr, a, "color", "blue")
911
912class SignedNumberTest(NumberTest):
913 example = [-1, 0, 1, 42, 0x7f]
914 smallerexample = [-1, 0, 1, 42, 0x7e]
915 biggerexample = [-1, 0, 1, 43, 0x7f]
916 outside = 23
917
918 def test_overflow(self):
919 a = array.array(self.typecode)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000920 lower = -1 * int(pow(2, a.itemsize * 8 - 1))
921 upper = int(pow(2, a.itemsize * 8 - 1)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +0000922 self.check_overflow(lower, upper)
923
924class UnsignedNumberTest(NumberTest):
925 example = [0, 1, 17, 23, 42, 0xff]
926 smallerexample = [0, 1, 17, 23, 42, 0xfe]
927 biggerexample = [0, 1, 17, 23, 43, 0xff]
928 outside = 0xaa
929
930 def test_overflow(self):
931 a = array.array(self.typecode)
932 lower = 0
Guido van Rossume2a383d2007-01-15 16:59:06 +0000933 upper = int(pow(2, a.itemsize * 8)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +0000934 self.check_overflow(lower, upper)
Fred Drake004d5e62000-10-23 17:22:08 +0000935
936
Walter Dörwald7fd94242003-05-18 00:47:47 +0000937class ByteTest(SignedNumberTest):
938 typecode = 'b'
939 minitemsize = 1
940tests.append(ByteTest)
Fred Drake004d5e62000-10-23 17:22:08 +0000941
Walter Dörwald7fd94242003-05-18 00:47:47 +0000942class UnsignedByteTest(UnsignedNumberTest):
943 typecode = 'B'
944 minitemsize = 1
945tests.append(UnsignedByteTest)
946
947class ShortTest(SignedNumberTest):
948 typecode = 'h'
949 minitemsize = 2
950tests.append(ShortTest)
951
952class UnsignedShortTest(UnsignedNumberTest):
953 typecode = 'H'
954 minitemsize = 2
955tests.append(UnsignedShortTest)
956
957class IntTest(SignedNumberTest):
958 typecode = 'i'
959 minitemsize = 2
960tests.append(IntTest)
961
962class UnsignedIntTest(UnsignedNumberTest):
963 typecode = 'I'
964 minitemsize = 2
965tests.append(UnsignedIntTest)
966
967class LongTest(SignedNumberTest):
968 typecode = 'l'
969 minitemsize = 4
970tests.append(LongTest)
971
972class UnsignedLongTest(UnsignedNumberTest):
973 typecode = 'L'
974 minitemsize = 4
975tests.append(UnsignedLongTest)
976
977class FPTest(NumberTest):
978 example = [-42.0, 0, 42, 1e5, -1e10]
979 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
980 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
981 outside = 23
982
983 def assertEntryEqual(self, entry1, entry2):
984 self.assertAlmostEqual(entry1, entry2)
985
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +0000986 def test_byteswap(self):
987 a = array.array(self.typecode, self.example)
988 self.assertRaises(TypeError, a.byteswap, 42)
989 if a.itemsize in (1, 2, 4, 8):
990 b = array.array(self.typecode, self.example)
991 b.byteswap()
992 if a.itemsize==1:
993 self.assertEqual(a, b)
994 else:
995 # On alphas treating the byte swapped bit patters as
996 # floats/doubles results in floating point exceptions
997 # => compare the 8bit string values instead
998 self.assertNotEqual(a.tostring(), b.tostring())
999 b.byteswap()
1000 self.assertEqual(a, b)
1001
Neal Norwitz35c6cd02003-05-22 13:29:15 +00001002class FloatTest(FPTest):
1003 typecode = 'f'
1004 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001005tests.append(FloatTest)
1006
1007class DoubleTest(FPTest):
1008 typecode = 'd'
1009 minitemsize = 8
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001010
1011 def test_alloc_overflow(self):
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001012 from sys import maxsize
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001013 a = array.array('d', [-1]*65536)
1014 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001015 a *= maxsize//65536 + 1
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001016 except MemoryError:
1017 pass
1018 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001019 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001020 b = array.array('d', [ 2.71828183, 3.14159265, -1])
1021 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001022 b * (maxsize//3 + 1)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001023 except MemoryError:
1024 pass
1025 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001026 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001027
Walter Dörwald7fd94242003-05-18 00:47:47 +00001028tests.append(DoubleTest)
1029
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001030def test_main(verbose=None):
1031 import sys
1032
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001033 support.run_unittest(*tests)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001034
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001035 # verify reference counting
1036 if verbose and hasattr(sys, "gettotalrefcount"):
1037 import gc
1038 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001039 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001040 support.run_unittest(*tests)
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001041 gc.collect()
1042 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001043 print(counts)
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001044
1045if __name__ == "__main__":
1046 test_main(verbose=True)