blob: 7256b9489c4234d1e30e1bada36f9d992d80e8d2 [file] [log] [blame]
Roger E. Masse8db1b071996-12-09 20:09:16 +00001"""Test the arraymodule.
Roger E. Massefab8ab81996-12-20 22:36:52 +00002 Roger E. Masse
Roger E. Masse8db1b071996-12-09 20:09:16 +00003"""
Roger E. Massefab8ab81996-12-20 22:36:52 +00004
Walter Dörwald7fd94242003-05-18 00:47:47 +00005import unittest
Victor Stinner42dcc672011-07-05 13:14:17 +02006import warnings
Walter Dörwald7fd94242003-05-18 00:47:47 +00007from test import test_support
Raymond Hettingercb87bc82004-05-31 00:35:52 +00008from weakref import proxy
Christian Heimesc5f05e42008-02-23 17:40:11 +00009import array, cStringIO
Hirokazu Yamamoto0fc07472008-12-27 04:19:48 +000010from cPickle import loads, dumps, HIGHEST_PROTOCOL
Serhiy Storchaka32e23e72013-11-03 23:15:46 +020011import sys
Raymond Hettingerb0900e62004-12-16 16:23:40 +000012
13class ArraySubclass(array.array):
14 pass
Guido van Rossumc9f8f141997-04-09 20:51:54 +000015
Georg Brandlb84c1372007-01-21 10:28:43 +000016class ArraySubclassWithKwargs(array.array):
17 def __init__(self, typecode, newarg=None):
Georg Brandl28dadd92011-02-25 10:50:32 +000018 array.array.__init__(self, typecode)
Georg Brandlb84c1372007-01-21 10:28:43 +000019
Walter Dörwald7fd94242003-05-18 00:47:47 +000020tests = [] # list to accumulate all tests
21typecodes = "cubBhHiIlLfd"
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')
Serhiy Storchakab70091a2015-05-16 17:11:41 +030029 self.assertRaises(TypeError, array.array, '')
30 self.assertRaises(TypeError, array.array, 1)
Walter Dörwald7fd94242003-05-18 00:47:47 +000031 self.assertRaises(ValueError, array.array, 'x')
Serhiy Storchakab70091a2015-05-16 17:11:41 +030032 self.assertRaises(ValueError, array.array, '\x80')
33
34 @test_support.requires_unicode
35 def test_unicode_constructor(self):
36 self.assertRaises(TypeError, array.array, u'xx')
37 self.assertRaises(TypeError, array.array, u'')
38 self.assertRaises(ValueError, array.array, u'x')
39 self.assertRaises(ValueError, array.array, u'\x80')
Martin v. Löwis99866332002-03-01 10:27:01 +000040
Walter Dörwald7fd94242003-05-18 00:47:47 +000041tests.append(BadConstructorTest)
Martin v. Löwis99866332002-03-01 10:27:01 +000042
Walter Dörwald7fd94242003-05-18 00:47:47 +000043class BaseTest(unittest.TestCase):
44 # Required class attributes (provided by subclasses
45 # typecode: the typecode to test
46 # example: an initializer usable in the constructor for this type
47 # smallerexample: the same length as example, but smaller
48 # biggerexample: the same length as example, but bigger
49 # outside: An entry that is not in example
50 # minitemsize: the minimum guaranteed itemsize
Martin v. Löwis99866332002-03-01 10:27:01 +000051
Walter Dörwald7fd94242003-05-18 00:47:47 +000052 def assertEntryEqual(self, entry1, entry2):
53 self.assertEqual(entry1, entry2)
Martin v. Löwis99866332002-03-01 10:27:01 +000054
Walter Dörwald7fd94242003-05-18 00:47:47 +000055 def badtypecode(self):
56 # Return a typecode that is different from our own
57 return typecodes[(typecodes.index(self.typecode)+1) % len(typecodes)]
Martin v. Löwis99866332002-03-01 10:27:01 +000058
Walter Dörwald7fd94242003-05-18 00:47:47 +000059 def test_constructor(self):
60 a = array.array(self.typecode)
61 self.assertEqual(a.typecode, self.typecode)
Serhiy Storchaka843ef752013-11-17 00:44:57 +020062 self.assertGreaterEqual(a.itemsize, self.minitemsize)
Walter Dörwald7fd94242003-05-18 00:47:47 +000063 self.assertRaises(TypeError, array.array, self.typecode, None)
Martin v. Löwis99866332002-03-01 10:27:01 +000064
Walter Dörwald7fd94242003-05-18 00:47:47 +000065 def test_len(self):
66 a = array.array(self.typecode)
67 a.append(self.example[0])
68 self.assertEqual(len(a), 1)
Martin v. Löwis99866332002-03-01 10:27:01 +000069
Walter Dörwald7fd94242003-05-18 00:47:47 +000070 a = array.array(self.typecode, self.example)
71 self.assertEqual(len(a), len(self.example))
Martin v. Löwis99866332002-03-01 10:27:01 +000072
Walter Dörwald7fd94242003-05-18 00:47:47 +000073 def test_buffer_info(self):
74 a = array.array(self.typecode, self.example)
75 self.assertRaises(TypeError, a.buffer_info, 42)
76 bi = a.buffer_info()
Ezio Melottib0f5adc2010-01-24 16:58:36 +000077 self.assertIsInstance(bi, tuple)
Walter Dörwald7fd94242003-05-18 00:47:47 +000078 self.assertEqual(len(bi), 2)
Ezio Melottib0f5adc2010-01-24 16:58:36 +000079 self.assertIsInstance(bi[0], (int, long))
80 self.assertIsInstance(bi[1], int)
Walter Dörwald7fd94242003-05-18 00:47:47 +000081 self.assertEqual(bi[1], len(a))
Martin v. Löwis99866332002-03-01 10:27:01 +000082
Walter Dörwald7fd94242003-05-18 00:47:47 +000083 def test_byteswap(self):
84 a = array.array(self.typecode, self.example)
85 self.assertRaises(TypeError, a.byteswap, 42)
86 if a.itemsize in (1, 2, 4, 8):
87 b = array.array(self.typecode, self.example)
88 b.byteswap()
89 if a.itemsize==1:
90 self.assertEqual(a, b)
91 else:
92 self.assertNotEqual(a, b)
93 b.byteswap()
94 self.assertEqual(a, b)
Martin v. Löwis99866332002-03-01 10:27:01 +000095
Raymond Hettinger3aa82c02004-03-13 18:18:51 +000096 def test_copy(self):
97 import copy
98 a = array.array(self.typecode, self.example)
99 b = copy.copy(a)
100 self.assertNotEqual(id(a), id(b))
101 self.assertEqual(a, b)
102
Thomas Wouters9e398ca2006-08-24 18:40:20 +0000103 def test_deepcopy(self):
104 import copy
105 a = array.array(self.typecode, self.example)
106 b = copy.deepcopy(a)
107 self.assertNotEqual(id(a), id(b))
108 self.assertEqual(a, b)
109
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000110 def test_pickle(self):
Hirokazu Yamamoto0fc07472008-12-27 04:19:48 +0000111 for protocol in range(HIGHEST_PROTOCOL + 1):
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000112 a = array.array(self.typecode, self.example)
113 b = loads(dumps(a, protocol))
114 self.assertNotEqual(id(a), id(b))
115 self.assertEqual(a, b)
116
117 a = ArraySubclass(self.typecode, self.example)
118 a.x = 10
119 b = loads(dumps(a, protocol))
120 self.assertNotEqual(id(a), id(b))
121 self.assertEqual(a, b)
122 self.assertEqual(a.x, b.x)
123 self.assertEqual(type(a), type(b))
124
Raymond Hettingere6e660b2007-04-02 17:29:30 +0000125 def test_pickle_for_empty_array(self):
Hirokazu Yamamoto0fc07472008-12-27 04:19:48 +0000126 for protocol in range(HIGHEST_PROTOCOL + 1):
Raymond Hettingere6e660b2007-04-02 17:29:30 +0000127 a = array.array(self.typecode)
128 b = loads(dumps(a, protocol))
129 self.assertNotEqual(id(a), id(b))
130 self.assertEqual(a, b)
131
132 a = ArraySubclass(self.typecode)
133 a.x = 10
134 b = loads(dumps(a, protocol))
135 self.assertNotEqual(id(a), id(b))
136 self.assertEqual(a, b)
137 self.assertEqual(a.x, b.x)
138 self.assertEqual(type(a), type(b))
139
Walter Dörwald7fd94242003-05-18 00:47:47 +0000140 def test_insert(self):
141 a = array.array(self.typecode, self.example)
142 a.insert(0, self.example[0])
143 self.assertEqual(len(a), 1+len(self.example))
144 self.assertEqual(a[0], a[1])
145 self.assertRaises(TypeError, a.insert)
146 self.assertRaises(TypeError, a.insert, None)
Walter Dörwaldba39d9c2003-05-18 01:56:25 +0000147 self.assertRaises(TypeError, a.insert, 0, None)
Martin v. Löwis99866332002-03-01 10:27:01 +0000148
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000149 a = array.array(self.typecode, self.example)
150 a.insert(-1, self.example[0])
151 self.assertEqual(
152 a,
153 array.array(
154 self.typecode,
155 self.example[:-1] + self.example[:1] + self.example[-1:]
156 )
157 )
158
159 a = array.array(self.typecode, self.example)
160 a.insert(-1000, self.example[0])
161 self.assertEqual(
162 a,
163 array.array(self.typecode, self.example[:1] + self.example)
164 )
165
166 a = array.array(self.typecode, self.example)
167 a.insert(1000, self.example[0])
168 self.assertEqual(
169 a,
170 array.array(self.typecode, self.example + self.example[:1])
171 )
172
Walter Dörwald7fd94242003-05-18 00:47:47 +0000173 def test_tofromfile(self):
174 a = array.array(self.typecode, 2*self.example)
175 self.assertRaises(TypeError, a.tofile)
176 self.assertRaises(TypeError, a.tofile, cStringIO.StringIO())
Neal Norwitz36a59b42008-04-10 05:46:39 +0000177 test_support.unlink(test_support.TESTFN)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000178 f = open(test_support.TESTFN, 'wb')
179 try:
180 a.tofile(f)
181 f.close()
182 b = array.array(self.typecode)
183 f = open(test_support.TESTFN, 'rb')
184 self.assertRaises(TypeError, b.fromfile)
185 self.assertRaises(
186 TypeError,
187 b.fromfile,
188 cStringIO.StringIO(), len(self.example)
189 )
190 b.fromfile(f, len(self.example))
191 self.assertEqual(b, array.array(self.typecode, self.example))
192 self.assertNotEqual(a, b)
193 b.fromfile(f, len(self.example))
194 self.assertEqual(a, b)
195 self.assertRaises(EOFError, b.fromfile, f, 1)
196 f.close()
197 finally:
198 if not f.closed:
199 f.close()
200 test_support.unlink(test_support.TESTFN)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000201
Antoine Pitrou7a7013e2010-07-21 16:47:28 +0000202 def test_fromfile_ioerror(self):
203 # Issue #5395: Check if fromfile raises a proper IOError
204 # instead of EOFError.
205 a = array.array(self.typecode)
206 f = open(test_support.TESTFN, 'wb')
207 try:
208 self.assertRaises(IOError, a.fromfile, f, len(self.example))
209 finally:
210 f.close()
211 test_support.unlink(test_support.TESTFN)
212
Frank Wierzbickidf756772009-08-16 20:22:51 +0000213 def test_filewrite(self):
214 a = array.array(self.typecode, 2*self.example)
215 f = open(test_support.TESTFN, 'wb')
216 try:
217 f.write(a)
218 f.close()
219 b = array.array(self.typecode)
220 f = open(test_support.TESTFN, 'rb')
221 b.fromfile(f, len(self.example))
222 self.assertEqual(b, array.array(self.typecode, self.example))
223 self.assertNotEqual(a, b)
224 b.fromfile(f, len(self.example))
225 self.assertEqual(a, b)
226 f.close()
227 finally:
228 if not f.closed:
229 f.close()
230 test_support.unlink(test_support.TESTFN)
231
Walter Dörwald7fd94242003-05-18 00:47:47 +0000232 def test_tofromlist(self):
233 a = array.array(self.typecode, 2*self.example)
234 b = array.array(self.typecode)
235 self.assertRaises(TypeError, a.tolist, 42)
236 self.assertRaises(TypeError, b.fromlist)
237 self.assertRaises(TypeError, b.fromlist, 42)
238 self.assertRaises(TypeError, b.fromlist, [None])
239 b.fromlist(a.tolist())
240 self.assertEqual(a, b)
Fred Drake78334472000-06-28 17:50:51 +0000241
Walter Dörwald7fd94242003-05-18 00:47:47 +0000242 def test_tofromstring(self):
243 a = array.array(self.typecode, 2*self.example)
244 b = array.array(self.typecode)
245 self.assertRaises(TypeError, a.tostring, 42)
246 self.assertRaises(TypeError, b.fromstring)
247 self.assertRaises(TypeError, b.fromstring, 42)
248 b.fromstring(a.tostring())
249 self.assertEqual(a, b)
250 if a.itemsize>1:
251 self.assertRaises(ValueError, b.fromstring, "x")
Fred Drake78334472000-06-28 17:50:51 +0000252
Walter Dörwald7fd94242003-05-18 00:47:47 +0000253 def test_repr(self):
254 a = array.array(self.typecode, 2*self.example)
255 self.assertEqual(a, eval(repr(a), {"array": array.array}))
Fred Drake78334472000-06-28 17:50:51 +0000256
Walter Dörwald7fd94242003-05-18 00:47:47 +0000257 a = array.array(self.typecode)
258 self.assertEqual(repr(a), "array('%s')" % self.typecode)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000259
Walter Dörwald7fd94242003-05-18 00:47:47 +0000260 def test_str(self):
261 a = array.array(self.typecode, 2*self.example)
262 str(a)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000263
Walter Dörwald7fd94242003-05-18 00:47:47 +0000264 def test_cmp(self):
265 a = array.array(self.typecode, self.example)
Serhiy Storchaka843ef752013-11-17 00:44:57 +0200266 self.assertIs(a == 42, False)
267 self.assertIs(a != 42, True)
Tim Peterscc78e472000-11-14 21:36:07 +0000268
Serhiy Storchaka843ef752013-11-17 00:44:57 +0200269 self.assertIs(a == a, True)
270 self.assertIs(a != a, False)
271 self.assertIs(a < a, False)
272 self.assertIs(a <= a, True)
273 self.assertIs(a > a, False)
274 self.assertIs(a >= a, True)
Tim Peterscc78e472000-11-14 21:36:07 +0000275
Neal Norwitzc72f5012006-03-17 08:55:46 +0000276 al = array.array(self.typecode, self.smallerexample)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000277 ab = array.array(self.typecode, self.biggerexample)
Guido van Rossum7f1d3aa1998-07-16 15:31:43 +0000278
Serhiy Storchaka843ef752013-11-17 00:44:57 +0200279 self.assertIs(a == 2*a, False)
280 self.assertIs(a != 2*a, True)
281 self.assertIs(a < 2*a, True)
282 self.assertIs(a <= 2*a, True)
283 self.assertIs(a > 2*a, False)
284 self.assertIs(a >= 2*a, False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000285
Serhiy Storchaka843ef752013-11-17 00:44:57 +0200286 self.assertIs(a == al, False)
287 self.assertIs(a != al, True)
288 self.assertIs(a < al, False)
289 self.assertIs(a <= al, False)
290 self.assertIs(a > al, True)
291 self.assertIs(a >= al, True)
Martin v. Löwis99866332002-03-01 10:27:01 +0000292
Serhiy Storchaka843ef752013-11-17 00:44:57 +0200293 self.assertIs(a == ab, False)
294 self.assertIs(a != ab, True)
295 self.assertIs(a < ab, True)
296 self.assertIs(a <= ab, True)
297 self.assertIs(a > ab, False)
298 self.assertIs(a >= ab, False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000299
Walter Dörwald7fd94242003-05-18 00:47:47 +0000300 def test_add(self):
301 a = array.array(self.typecode, self.example) \
302 + array.array(self.typecode, self.example[::-1])
303 self.assertEqual(
304 a,
305 array.array(self.typecode, self.example + self.example[::-1])
306 )
Martin v. Löwis99866332002-03-01 10:27:01 +0000307
Walter Dörwald7fd94242003-05-18 00:47:47 +0000308 b = array.array(self.badtypecode())
309 self.assertRaises(TypeError, a.__add__, b)
310
311 self.assertRaises(TypeError, a.__add__, "bad")
312
313 def test_iadd(self):
314 a = array.array(self.typecode, self.example[::-1])
315 b = a
316 a += array.array(self.typecode, 2*self.example)
Serhiy Storchaka843ef752013-11-17 00:44:57 +0200317 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000318 self.assertEqual(
319 a,
320 array.array(self.typecode, self.example[::-1]+2*self.example)
321 )
Alexandre Vassalotti5b1abb72009-07-05 06:33:41 +0000322 a = array.array(self.typecode, self.example)
323 a += a
324 self.assertEqual(
325 a,
326 array.array(self.typecode, self.example + self.example)
327 )
Walter Dörwald7fd94242003-05-18 00:47:47 +0000328
329 b = array.array(self.badtypecode())
330 self.assertRaises(TypeError, a.__add__, b)
331
332 self.assertRaises(TypeError, a.__iadd__, "bad")
333
334 def test_mul(self):
335 a = 5*array.array(self.typecode, self.example)
336 self.assertEqual(
337 a,
338 array.array(self.typecode, 5*self.example)
339 )
340
341 a = array.array(self.typecode, self.example)*5
342 self.assertEqual(
343 a,
344 array.array(self.typecode, self.example*5)
345 )
346
347 a = 0*array.array(self.typecode, self.example)
348 self.assertEqual(
349 a,
350 array.array(self.typecode)
351 )
352
353 a = (-1)*array.array(self.typecode, self.example)
354 self.assertEqual(
355 a,
356 array.array(self.typecode)
357 )
358
359 self.assertRaises(TypeError, a.__mul__, "bad")
360
361 def test_imul(self):
362 a = array.array(self.typecode, self.example)
363 b = a
364
365 a *= 5
Serhiy Storchaka843ef752013-11-17 00:44:57 +0200366 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000367 self.assertEqual(
368 a,
369 array.array(self.typecode, 5*self.example)
370 )
371
372 a *= 0
Serhiy Storchaka843ef752013-11-17 00:44:57 +0200373 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000374 self.assertEqual(a, array.array(self.typecode))
375
376 a *= 1000
Serhiy Storchaka843ef752013-11-17 00:44:57 +0200377 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000378 self.assertEqual(a, array.array(self.typecode))
379
380 a *= -1
Serhiy Storchaka843ef752013-11-17 00:44:57 +0200381 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000382 self.assertEqual(a, array.array(self.typecode))
383
384 a = array.array(self.typecode, self.example)
385 a *= -1
386 self.assertEqual(a, array.array(self.typecode))
387
388 self.assertRaises(TypeError, a.__imul__, "bad")
389
390 def test_getitem(self):
391 a = array.array(self.typecode, self.example)
392 self.assertEntryEqual(a[0], self.example[0])
393 self.assertEntryEqual(a[0L], self.example[0])
394 self.assertEntryEqual(a[-1], self.example[-1])
395 self.assertEntryEqual(a[-1L], self.example[-1])
396 self.assertEntryEqual(a[len(self.example)-1], self.example[-1])
397 self.assertEntryEqual(a[-len(self.example)], self.example[0])
398 self.assertRaises(TypeError, a.__getitem__)
399 self.assertRaises(IndexError, a.__getitem__, len(self.example))
400 self.assertRaises(IndexError, a.__getitem__, -len(self.example)-1)
401
402 def test_setitem(self):
403 a = array.array(self.typecode, self.example)
404 a[0] = a[-1]
405 self.assertEntryEqual(a[0], a[-1])
406
407 a = array.array(self.typecode, self.example)
408 a[0L] = a[-1]
409 self.assertEntryEqual(a[0], a[-1])
410
411 a = array.array(self.typecode, self.example)
412 a[-1] = a[0]
413 self.assertEntryEqual(a[0], a[-1])
414
415 a = array.array(self.typecode, self.example)
416 a[-1L] = a[0]
417 self.assertEntryEqual(a[0], a[-1])
418
419 a = array.array(self.typecode, self.example)
420 a[len(self.example)-1] = a[0]
421 self.assertEntryEqual(a[0], a[-1])
422
423 a = array.array(self.typecode, self.example)
424 a[-len(self.example)] = a[-1]
425 self.assertEntryEqual(a[0], a[-1])
426
427 self.assertRaises(TypeError, a.__setitem__)
428 self.assertRaises(TypeError, a.__setitem__, None)
429 self.assertRaises(TypeError, a.__setitem__, 0, None)
430 self.assertRaises(
431 IndexError,
432 a.__setitem__,
433 len(self.example), self.example[0]
434 )
435 self.assertRaises(
436 IndexError,
437 a.__setitem__,
438 -len(self.example)-1, self.example[0]
439 )
440
441 def test_delitem(self):
442 a = array.array(self.typecode, self.example)
443 del a[0]
444 self.assertEqual(
445 a,
446 array.array(self.typecode, self.example[1:])
447 )
448
449 a = array.array(self.typecode, self.example)
450 del a[-1]
451 self.assertEqual(
452 a,
453 array.array(self.typecode, self.example[:-1])
454 )
455
456 a = array.array(self.typecode, self.example)
457 del a[len(self.example)-1]
458 self.assertEqual(
459 a,
460 array.array(self.typecode, self.example[:-1])
461 )
462
463 a = array.array(self.typecode, self.example)
464 del a[-len(self.example)]
465 self.assertEqual(
466 a,
467 array.array(self.typecode, self.example[1:])
468 )
469
470 self.assertRaises(TypeError, a.__delitem__)
471 self.assertRaises(TypeError, a.__delitem__, None)
472 self.assertRaises(IndexError, a.__delitem__, len(self.example))
473 self.assertRaises(IndexError, a.__delitem__, -len(self.example)-1)
474
475 def test_getslice(self):
476 a = array.array(self.typecode, self.example)
477 self.assertEqual(a[:], a)
478
479 self.assertEqual(
480 a[1:],
481 array.array(self.typecode, self.example[1:])
482 )
483
484 self.assertEqual(
485 a[:1],
486 array.array(self.typecode, self.example[:1])
487 )
488
489 self.assertEqual(
490 a[:-1],
491 array.array(self.typecode, self.example[:-1])
492 )
493
494 self.assertEqual(
495 a[-1:],
496 array.array(self.typecode, self.example[-1:])
497 )
498
499 self.assertEqual(
500 a[-1:-1],
501 array.array(self.typecode)
502 )
503
504 self.assertEqual(
Walter Dörwald1083c242005-01-21 21:16:51 +0000505 a[2:1],
506 array.array(self.typecode)
507 )
508
509 self.assertEqual(
Walter Dörwald7fd94242003-05-18 00:47:47 +0000510 a[1000:],
511 array.array(self.typecode)
512 )
513 self.assertEqual(a[-1000:], a)
514 self.assertEqual(a[:1000], a)
515 self.assertEqual(
516 a[:-1000],
517 array.array(self.typecode)
518 )
519 self.assertEqual(a[-1000:1000], a)
520 self.assertEqual(
521 a[2000:1000],
522 array.array(self.typecode)
523 )
524
Thomas Wouters3ccec682007-08-28 15:28:19 +0000525 def test_extended_getslice(self):
526 # Test extended slicing by comparing with list slicing
527 # (Assumes list conversion works correctly, too)
528 a = array.array(self.typecode, self.example)
529 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
530 for start in indices:
531 for stop in indices:
532 # Everything except the initial 0 (invalid step)
533 for step in indices[1:]:
534 self.assertEqual(list(a[start:stop:step]),
535 list(a)[start:stop:step])
536
Walter Dörwald7fd94242003-05-18 00:47:47 +0000537 def test_setslice(self):
538 a = array.array(self.typecode, self.example)
539 a[:1] = a
540 self.assertEqual(
541 a,
542 array.array(self.typecode, self.example + self.example[1:])
543 )
544
545 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000546 a[:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000547 self.assertEqual(
548 a,
549 array.array(self.typecode, self.example + self.example[-1:])
550 )
551
552 a = array.array(self.typecode, self.example)
553 a[-1:] = a
554 self.assertEqual(
555 a,
556 array.array(self.typecode, self.example[:-1] + self.example)
557 )
558
559 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000560 a[1:] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000561 self.assertEqual(
562 a,
563 array.array(self.typecode, self.example[:1] + self.example)
564 )
565
566 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000567 a[1:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000568 self.assertEqual(
569 a,
570 array.array(
571 self.typecode,
572 self.example[:1] + self.example + self.example[-1:]
573 )
574 )
575
576 a = array.array(self.typecode, self.example)
577 a[1000:] = a
578 self.assertEqual(
579 a,
580 array.array(self.typecode, 2*self.example)
581 )
582
583 a = array.array(self.typecode, self.example)
584 a[-1000:] = a
585 self.assertEqual(
586 a,
587 array.array(self.typecode, self.example)
588 )
589
590 a = array.array(self.typecode, self.example)
591 a[:1000] = a
592 self.assertEqual(
593 a,
594 array.array(self.typecode, self.example)
595 )
596
597 a = array.array(self.typecode, self.example)
598 a[:-1000] = a
599 self.assertEqual(
600 a,
601 array.array(self.typecode, 2*self.example)
602 )
603
604 a = array.array(self.typecode, self.example)
605 a[1:0] = a
606 self.assertEqual(
607 a,
608 array.array(self.typecode, self.example[:1] + self.example + self.example[1:])
609 )
610
611 a = array.array(self.typecode, self.example)
612 a[2000:1000] = a
613 self.assertEqual(
614 a,
615 array.array(self.typecode, 2*self.example)
616 )
617
618 a = array.array(self.typecode, self.example)
619 self.assertRaises(TypeError, a.__setslice__, 0, 0, None)
Thomas Wouters3ccec682007-08-28 15:28:19 +0000620 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), None)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000621 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), None)
622
623 b = array.array(self.badtypecode())
624 self.assertRaises(TypeError, a.__setslice__, 0, 0, b)
Thomas Wouters3ccec682007-08-28 15:28:19 +0000625 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000626 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), b)
627
Thomas Wouters3ccec682007-08-28 15:28:19 +0000628 def test_extended_set_del_slice(self):
629 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
630 for start in indices:
631 for stop in indices:
632 # Everything except the initial 0 (invalid step)
633 for step in indices[1:]:
634 a = array.array(self.typecode, self.example)
635 L = list(a)
636 # Make sure we have a slice of exactly the right length,
637 # but with (hopefully) different data.
638 data = L[start:stop:step]
639 data.reverse()
640 L[start:stop:step] = data
641 a[start:stop:step] = array.array(self.typecode, data)
Ezio Melotti2623a372010-11-21 13:34:58 +0000642 self.assertEqual(a, array.array(self.typecode, L))
Thomas Wouters3ccec682007-08-28 15:28:19 +0000643
644 del L[start:stop:step]
645 del a[start:stop:step]
Ezio Melotti2623a372010-11-21 13:34:58 +0000646 self.assertEqual(a, array.array(self.typecode, L))
Thomas Wouters3ccec682007-08-28 15:28:19 +0000647
Walter Dörwald7fd94242003-05-18 00:47:47 +0000648 def test_index(self):
649 example = 2*self.example
650 a = array.array(self.typecode, example)
651 self.assertRaises(TypeError, a.index)
652 for x in example:
653 self.assertEqual(a.index(x), example.index(x))
654 self.assertRaises(ValueError, a.index, None)
655 self.assertRaises(ValueError, a.index, self.outside)
656
657 def test_count(self):
658 example = 2*self.example
659 a = array.array(self.typecode, example)
660 self.assertRaises(TypeError, a.count)
661 for x in example:
662 self.assertEqual(a.count(x), example.count(x))
663 self.assertEqual(a.count(self.outside), 0)
664 self.assertEqual(a.count(None), 0)
665
666 def test_remove(self):
667 for x in self.example:
668 example = 2*self.example
669 a = array.array(self.typecode, example)
670 pos = example.index(x)
671 example2 = example[:pos] + example[pos+1:]
672 a.remove(x)
673 self.assertEqual(a, array.array(self.typecode, example2))
674
675 a = array.array(self.typecode, self.example)
676 self.assertRaises(ValueError, a.remove, self.outside)
677
678 self.assertRaises(ValueError, a.remove, None)
679
680 def test_pop(self):
681 a = array.array(self.typecode)
682 self.assertRaises(IndexError, a.pop)
683
684 a = array.array(self.typecode, 2*self.example)
685 self.assertRaises(TypeError, a.pop, 42, 42)
686 self.assertRaises(TypeError, a.pop, None)
687 self.assertRaises(IndexError, a.pop, len(a))
688 self.assertRaises(IndexError, a.pop, -len(a)-1)
689
690 self.assertEntryEqual(a.pop(0), self.example[0])
691 self.assertEqual(
692 a,
693 array.array(self.typecode, self.example[1:]+self.example)
694 )
695 self.assertEntryEqual(a.pop(1), self.example[2])
696 self.assertEqual(
697 a,
698 array.array(self.typecode, self.example[1:2]+self.example[3:]+self.example)
699 )
700 self.assertEntryEqual(a.pop(0), self.example[1])
701 self.assertEntryEqual(a.pop(), self.example[-1])
702 self.assertEqual(
703 a,
704 array.array(self.typecode, self.example[3:]+self.example[:-1])
705 )
706
707 def test_reverse(self):
708 a = array.array(self.typecode, self.example)
709 self.assertRaises(TypeError, a.reverse, 42)
Fred Drake004d5e62000-10-23 17:22:08 +0000710 a.reverse()
Walter Dörwald7fd94242003-05-18 00:47:47 +0000711 self.assertEqual(
712 a,
713 array.array(self.typecode, self.example[::-1])
714 )
715
716 def test_extend(self):
717 a = array.array(self.typecode, self.example)
718 self.assertRaises(TypeError, a.extend)
719 a.extend(array.array(self.typecode, self.example[::-1]))
720 self.assertEqual(
721 a,
722 array.array(self.typecode, self.example+self.example[::-1])
723 )
724
Alexandre Vassalotti5b1abb72009-07-05 06:33:41 +0000725 a = array.array(self.typecode, self.example)
726 a.extend(a)
727 self.assertEqual(
728 a,
729 array.array(self.typecode, self.example+self.example)
730 )
731
Walter Dörwald7fd94242003-05-18 00:47:47 +0000732 b = array.array(self.badtypecode())
733 self.assertRaises(TypeError, a.extend, b)
734
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000735 a = array.array(self.typecode, self.example)
736 a.extend(self.example[::-1])
737 self.assertEqual(
738 a,
739 array.array(self.typecode, self.example+self.example[::-1])
740 )
741
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +0000742 def test_constructor_with_iterable_argument(self):
743 a = array.array(self.typecode, iter(self.example))
744 b = array.array(self.typecode, self.example)
745 self.assertEqual(a, b)
746
747 # non-iterable argument
748 self.assertRaises(TypeError, array.array, self.typecode, 10)
749
750 # pass through errors raised in __iter__
751 class A:
752 def __iter__(self):
753 raise UnicodeError
754 self.assertRaises(UnicodeError, array.array, self.typecode, A())
755
756 # pass through errors raised in next()
757 def B():
758 raise UnicodeError
759 yield None
760 self.assertRaises(UnicodeError, array.array, self.typecode, B())
761
Walter Dörwald7fd94242003-05-18 00:47:47 +0000762 def test_coveritertraverse(self):
763 try:
764 import gc
765 except ImportError:
Zachary Ware1f702212013-12-10 14:09:20 -0600766 self.skipTest('gc module not available')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000767 a = array.array(self.typecode)
768 l = [iter(a)]
769 l.append(l)
770 gc.collect()
771
772 def test_buffer(self):
773 a = array.array(self.typecode, self.example)
Florent Xicluna07627882010-03-21 01:14:24 +0000774 with test_support.check_py3k_warnings():
775 b = buffer(a)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000776 self.assertEqual(b[0], a.tostring()[0])
777
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000778 def test_weakref(self):
779 s = array.array(self.typecode, self.example)
780 p = proxy(s)
781 self.assertEqual(p.tostring(), s.tostring())
782 s = None
783 self.assertRaises(ReferenceError, len, p)
784
Serhiy Storchaka32e23e72013-11-03 23:15:46 +0200785 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
786 'test needs sys.getrefcount()')
Skip Montanarod5cf0b82003-08-03 23:02:10 +0000787 def test_bug_782369(self):
Serhiy Storchaka32e23e72013-11-03 23:15:46 +0200788 for i in range(10):
789 b = array.array('B', range(64))
790 rc = sys.getrefcount(10)
791 for i in range(10):
792 b = array.array('B', range(64))
793 self.assertEqual(rc, sys.getrefcount(10))
Skip Montanarod5cf0b82003-08-03 23:02:10 +0000794
Georg Brandlb84c1372007-01-21 10:28:43 +0000795 def test_subclass_with_kwargs(self):
796 # SF bug #1486663 -- this used to erroneously raise a TypeError
Victor Stinner42dcc672011-07-05 13:14:17 +0200797 with warnings.catch_warnings():
798 warnings.filterwarnings("ignore", '', DeprecationWarning)
799 ArraySubclassWithKwargs('b', newarg=1)
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000800
801
Walter Dörwald7fd94242003-05-18 00:47:47 +0000802class StringTest(BaseTest):
803
804 def test_setitem(self):
805 super(StringTest, self).test_setitem()
806 a = array.array(self.typecode, self.example)
807 self.assertRaises(TypeError, a.__setitem__, 0, self.example[:2])
808
809class CharacterTest(StringTest):
810 typecode = 'c'
811 example = '\x01azAZ\x00\xfe'
812 smallerexample = '\x01azAY\x00\xfe'
813 biggerexample = '\x01azAZ\x00\xff'
814 outside = '\x33'
815 minitemsize = 1
816
817 def test_subbclassing(self):
818 class EditableString(array.array):
819 def __new__(cls, s, *args, **kwargs):
820 return array.array.__new__(cls, 'c', s)
821
822 def __init__(self, s, color='blue'):
Walter Dörwald7fd94242003-05-18 00:47:47 +0000823 self.color = color
824
825 def strip(self):
826 self[:] = array.array('c', self.tostring().strip())
827
828 def __repr__(self):
829 return 'EditableString(%r)' % self.tostring()
830
831 s = EditableString("\ttest\r\n")
832 s.strip()
833 self.assertEqual(s.tostring(), "test")
834
835 self.assertEqual(s.color, "blue")
836 s.color = "red"
837 self.assertEqual(s.color, "red")
838 self.assertEqual(s.__dict__.keys(), ["color"])
839
840 def test_nounicode(self):
841 a = array.array(self.typecode, self.example)
842 self.assertRaises(ValueError, a.fromunicode, unicode(''))
843 self.assertRaises(ValueError, a.tounicode)
844
845tests.append(CharacterTest)
846
847if test_support.have_unicode:
848 class UnicodeTest(StringTest):
849 typecode = 'u'
850 example = unicode(r'\x01\u263a\x00\ufeff', 'unicode-escape')
851 smallerexample = unicode(r'\x01\u263a\x00\ufefe', 'unicode-escape')
852 biggerexample = unicode(r'\x01\u263a\x01\ufeff', 'unicode-escape')
853 outside = unicode('\x33')
854 minitemsize = 2
855
856 def test_unicode(self):
857 self.assertRaises(TypeError, array.array, 'b', unicode('foo', 'ascii'))
858
859 a = array.array('u', unicode(r'\xa0\xc2\u1234', 'unicode-escape'))
860 a.fromunicode(unicode(' ', 'ascii'))
861 a.fromunicode(unicode('', 'ascii'))
862 a.fromunicode(unicode('', 'ascii'))
863 a.fromunicode(unicode(r'\x11abc\xff\u1234', 'unicode-escape'))
864 s = a.tounicode()
865 self.assertEqual(
866 s,
867 unicode(r'\xa0\xc2\u1234 \x11abc\xff\u1234', 'unicode-escape')
868 )
869
870 s = unicode(r'\x00="\'a\\b\x80\xff\u0000\u0001\u1234', 'unicode-escape')
871 a = array.array('u', s)
872 self.assertEqual(
873 repr(a),
874 r"""array('u', u'\x00="\'a\\b\x80\xff\x00\x01\u1234')"""
875 )
876
877 self.assertRaises(TypeError, a.fromunicode)
878
879 tests.append(UnicodeTest)
880
881class NumberTest(BaseTest):
882
883 def test_extslice(self):
884 a = array.array(self.typecode, range(5))
885 self.assertEqual(a[::], a)
886 self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
887 self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
888 self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
889 self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
890 self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
891 self.assertEqual(a[-100:100:], a)
892 self.assertEqual(a[100:-100:-1], a[::-1])
893 self.assertEqual(a[-100L:100L:2L], array.array(self.typecode, [0,2,4]))
894 self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
895 self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
896
897 def test_delslice(self):
898 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +0000899 del a[::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000900 self.assertEqual(a, array.array(self.typecode, [1,3]))
901 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +0000902 del a[1::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000903 self.assertEqual(a, array.array(self.typecode, [0,2,4]))
904 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +0000905 del a[1::-2]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000906 self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
907 a = array.array(self.typecode, range(10))
Michael W. Hudson56796f62002-07-29 14:35:04 +0000908 del a[::1000]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000909 self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
Mark Dickinson36ecd672010-01-29 17:11:39 +0000910 # test issue7788
911 a = array.array(self.typecode, range(10))
912 del a[9::1<<333]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000913
914 def test_assignment(self):
915 a = array.array(self.typecode, range(10))
916 a[::2] = array.array(self.typecode, [42]*5)
917 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
918 a = array.array(self.typecode, range(10))
919 a[::-4] = array.array(self.typecode, [10]*3)
920 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
921 a = array.array(self.typecode, range(4))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +0000922 a[::-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000923 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
924 a = array.array(self.typecode, range(10))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +0000925 b = a[:]
926 c = a[:]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000927 ins = array.array(self.typecode, range(2))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +0000928 a[2:3] = ins
929 b[slice(2,3)] = ins
930 c[2:3:] = ins
Fred Drake004d5e62000-10-23 17:22:08 +0000931
Walter Dörwald7fd94242003-05-18 00:47:47 +0000932 def test_iterationcontains(self):
933 a = array.array(self.typecode, range(10))
934 self.assertEqual(list(a), range(10))
935 b = array.array(self.typecode, [20])
936 self.assertEqual(a[-1] in a, True)
937 self.assertEqual(b[0] not in a, True)
938
939 def check_overflow(self, lower, upper):
940 # method to be used by subclasses
941
942 # should not overflow assigning lower limit
943 a = array.array(self.typecode, [lower])
944 a[0] = lower
945 # should overflow assigning less than lower limit
946 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
947 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
948 # should not overflow assigning upper limit
949 a = array.array(self.typecode, [upper])
950 a[0] = upper
951 # should overflow assigning more than upper limit
952 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
953 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
954
955 def test_subclassing(self):
956 typecode = self.typecode
957 class ExaggeratingArray(array.array):
958 __slots__ = ['offset']
959
960 def __new__(cls, typecode, data, offset):
961 return array.array.__new__(cls, typecode, data)
962
963 def __init__(self, typecode, data, offset):
964 self.offset = offset
965
966 def __getitem__(self, i):
967 return array.array.__getitem__(self, i) + self.offset
968
969 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
970 self.assertEntryEqual(a[0], 7)
971
972 self.assertRaises(AttributeError, setattr, a, "color", "blue")
973
974class SignedNumberTest(NumberTest):
975 example = [-1, 0, 1, 42, 0x7f]
976 smallerexample = [-1, 0, 1, 42, 0x7e]
977 biggerexample = [-1, 0, 1, 43, 0x7f]
978 outside = 23
979
980 def test_overflow(self):
981 a = array.array(self.typecode)
982 lower = -1 * long(pow(2, a.itemsize * 8 - 1))
983 upper = long(pow(2, a.itemsize * 8 - 1)) - 1L
984 self.check_overflow(lower, upper)
985
986class UnsignedNumberTest(NumberTest):
987 example = [0, 1, 17, 23, 42, 0xff]
988 smallerexample = [0, 1, 17, 23, 42, 0xfe]
989 biggerexample = [0, 1, 17, 23, 43, 0xff]
990 outside = 0xaa
991
992 def test_overflow(self):
993 a = array.array(self.typecode)
994 lower = 0
995 upper = long(pow(2, a.itemsize * 8)) - 1L
996 self.check_overflow(lower, upper)
Fred Drake004d5e62000-10-23 17:22:08 +0000997
Meador Inge2d639d52012-08-10 22:05:45 -0500998 @test_support.cpython_only
999 def test_sizeof_with_buffer(self):
1000 a = array.array(self.typecode, self.example)
1001 basesize = test_support.calcvobjsize('4P')
1002 buffer_size = a.buffer_info()[1] * a.itemsize
1003 test_support.check_sizeof(self, a, basesize + buffer_size)
1004
1005 @test_support.cpython_only
1006 def test_sizeof_without_buffer(self):
1007 a = array.array(self.typecode)
1008 basesize = test_support.calcvobjsize('4P')
1009 test_support.check_sizeof(self, a, basesize)
1010
Fred Drake004d5e62000-10-23 17:22:08 +00001011
Walter Dörwald7fd94242003-05-18 00:47:47 +00001012class ByteTest(SignedNumberTest):
1013 typecode = 'b'
1014 minitemsize = 1
1015tests.append(ByteTest)
Fred Drake004d5e62000-10-23 17:22:08 +00001016
Walter Dörwald7fd94242003-05-18 00:47:47 +00001017class UnsignedByteTest(UnsignedNumberTest):
1018 typecode = 'B'
1019 minitemsize = 1
1020tests.append(UnsignedByteTest)
1021
1022class ShortTest(SignedNumberTest):
1023 typecode = 'h'
1024 minitemsize = 2
1025tests.append(ShortTest)
1026
1027class UnsignedShortTest(UnsignedNumberTest):
1028 typecode = 'H'
1029 minitemsize = 2
1030tests.append(UnsignedShortTest)
1031
1032class IntTest(SignedNumberTest):
1033 typecode = 'i'
1034 minitemsize = 2
1035tests.append(IntTest)
1036
1037class UnsignedIntTest(UnsignedNumberTest):
1038 typecode = 'I'
1039 minitemsize = 2
1040tests.append(UnsignedIntTest)
1041
1042class LongTest(SignedNumberTest):
1043 typecode = 'l'
1044 minitemsize = 4
1045tests.append(LongTest)
1046
1047class UnsignedLongTest(UnsignedNumberTest):
1048 typecode = 'L'
1049 minitemsize = 4
1050tests.append(UnsignedLongTest)
1051
Serhiy Storchakab70091a2015-05-16 17:11:41 +03001052
1053@test_support.requires_unicode
1054class UnicodeTypecodeTest(unittest.TestCase):
1055 def test_unicode_typecode(self):
1056 for typecode in typecodes:
1057 a = array.array(unicode(typecode))
1058 self.assertEqual(a.typecode, typecode)
1059 self.assertIs(type(a.typecode), str)
1060tests.append(UnicodeTypecodeTest)
1061
1062
Walter Dörwald7fd94242003-05-18 00:47:47 +00001063class FPTest(NumberTest):
1064 example = [-42.0, 0, 42, 1e5, -1e10]
1065 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
1066 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
1067 outside = 23
1068
1069 def assertEntryEqual(self, entry1, entry2):
1070 self.assertAlmostEqual(entry1, entry2)
1071
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001072 def test_byteswap(self):
1073 a = array.array(self.typecode, self.example)
1074 self.assertRaises(TypeError, a.byteswap, 42)
1075 if a.itemsize in (1, 2, 4, 8):
1076 b = array.array(self.typecode, self.example)
1077 b.byteswap()
1078 if a.itemsize==1:
1079 self.assertEqual(a, b)
1080 else:
1081 # On alphas treating the byte swapped bit patters as
1082 # floats/doubles results in floating point exceptions
1083 # => compare the 8bit string values instead
1084 self.assertNotEqual(a.tostring(), b.tostring())
1085 b.byteswap()
1086 self.assertEqual(a, b)
1087
Neal Norwitz35c6cd02003-05-22 13:29:15 +00001088class FloatTest(FPTest):
1089 typecode = 'f'
1090 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001091tests.append(FloatTest)
1092
1093class DoubleTest(FPTest):
1094 typecode = 'd'
1095 minitemsize = 8
Gregory P. Smith9d534572008-06-11 07:41:16 +00001096
1097 def test_alloc_overflow(self):
Andrew MacIntyrebf244012008-10-01 03:25:25 +00001098 from sys import maxsize
Gregory P. Smith9d534572008-06-11 07:41:16 +00001099 a = array.array('d', [-1]*65536)
1100 try:
Andrew MacIntyrebf244012008-10-01 03:25:25 +00001101 a *= maxsize//65536 + 1
Gregory P. Smith9d534572008-06-11 07:41:16 +00001102 except MemoryError:
1103 pass
1104 else:
Andrew MacIntyrebf244012008-10-01 03:25:25 +00001105 self.fail("Array of size > maxsize created - MemoryError expected")
Gregory P. Smith9d534572008-06-11 07:41:16 +00001106 b = array.array('d', [ 2.71828183, 3.14159265, -1])
1107 try:
Andrew MacIntyrebf244012008-10-01 03:25:25 +00001108 b * (maxsize//3 + 1)
Gregory P. Smith9d534572008-06-11 07:41:16 +00001109 except MemoryError:
1110 pass
1111 else:
Andrew MacIntyrebf244012008-10-01 03:25:25 +00001112 self.fail("Array of size > maxsize created - MemoryError expected")
Gregory P. Smith9d534572008-06-11 07:41:16 +00001113
Walter Dörwald7fd94242003-05-18 00:47:47 +00001114tests.append(DoubleTest)
1115
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001116def test_main(verbose=None):
1117 import sys
1118
Walter Dörwald7fd94242003-05-18 00:47:47 +00001119 test_support.run_unittest(*tests)
1120
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001121 # verify reference counting
1122 if verbose and hasattr(sys, "gettotalrefcount"):
1123 import gc
1124 counts = [None] * 5
1125 for i in xrange(len(counts)):
1126 test_support.run_unittest(*tests)
1127 gc.collect()
1128 counts[i] = sys.gettotalrefcount()
1129 print counts
1130
1131if __name__ == "__main__":
1132 test_main(verbose=True)