blob: 974e178f96db53bd165db4d1d26ccd56a80a374a [file] [log] [blame]
Benjamin Peterson90f5ba52010-03-11 22:53:45 +00001#! /usr/bin/env python3
Roger E. Masse8db1b071996-12-09 20:09:16 +00002"""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
Victor Stinnerbded28c2012-08-08 20:19:37 +02006import ctypes
Walter Dörwald7fd94242003-05-18 00:47:47 +00007import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00008from test import support
Alexandre Vassalottiad077152009-07-15 17:49:23 +00009import weakref
10import pickle
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +000011import operator
Alexandre Vassalottiad077152009-07-15 17:49:23 +000012import io
13import math
14import struct
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +000015import warnings
Alexandre Vassalottiad077152009-07-15 17:49:23 +000016
17import array
18from array import _array_reconstructor as array_reconstructor
19
Meador Inge1c9f0c92011-09-20 19:55:51 -050020try:
21 # Try to determine availability of long long independently
22 # of the array module under test
23 struct.calcsize('@q')
24 have_long_long = True
25except struct.error:
26 have_long_long = False
Raymond Hettingerb0900e62004-12-16 16:23:40 +000027
28class ArraySubclass(array.array):
29 pass
Guido van Rossumc9f8f141997-04-09 20:51:54 +000030
Thomas Woutersb2137042007-02-01 18:02:27 +000031class ArraySubclassWithKwargs(array.array):
32 def __init__(self, typecode, newarg=None):
Victor Stinner7a6a0092011-01-04 00:04:44 +000033 array.array.__init__(self)
Thomas Woutersb2137042007-02-01 18:02:27 +000034
Walter Dörwald7fd94242003-05-18 00:47:47 +000035tests = [] # list to accumulate all tests
Guido van Rossum31f72d72007-06-18 18:44:28 +000036typecodes = "ubBhHiIlLfd"
Meador Inge1c9f0c92011-09-20 19:55:51 -050037if have_long_long:
38 typecodes += 'qQ'
Martin v. Löwis99866332002-03-01 10:27:01 +000039
Walter Dörwald7fd94242003-05-18 00:47:47 +000040class BadConstructorTest(unittest.TestCase):
Martin v. Löwis99866332002-03-01 10:27:01 +000041
Walter Dörwald7fd94242003-05-18 00:47:47 +000042 def test_constructor(self):
43 self.assertRaises(TypeError, array.array)
44 self.assertRaises(TypeError, array.array, spam=42)
45 self.assertRaises(TypeError, array.array, 'xx')
46 self.assertRaises(ValueError, array.array, 'x')
Martin v. Löwis99866332002-03-01 10:27:01 +000047
Walter Dörwald7fd94242003-05-18 00:47:47 +000048tests.append(BadConstructorTest)
Martin v. Löwis99866332002-03-01 10:27:01 +000049
Alexandre Vassalottiad077152009-07-15 17:49:23 +000050# Machine format codes.
51#
52# Search for "enum machine_format_code" in Modules/arraymodule.c to get the
53# authoritative values.
54UNKNOWN_FORMAT = -1
55UNSIGNED_INT8 = 0
56SIGNED_INT8 = 1
57UNSIGNED_INT16_LE = 2
58UNSIGNED_INT16_BE = 3
59SIGNED_INT16_LE = 4
60SIGNED_INT16_BE = 5
61UNSIGNED_INT32_LE = 6
62UNSIGNED_INT32_BE = 7
63SIGNED_INT32_LE = 8
64SIGNED_INT32_BE = 9
65UNSIGNED_INT64_LE = 10
66UNSIGNED_INT64_BE = 11
67SIGNED_INT64_LE = 12
68SIGNED_INT64_BE = 13
69IEEE_754_FLOAT_LE = 14
70IEEE_754_FLOAT_BE = 15
71IEEE_754_DOUBLE_LE = 16
72IEEE_754_DOUBLE_BE = 17
73UTF16_LE = 18
74UTF16_BE = 19
75UTF32_LE = 20
76UTF32_BE = 21
77
78class ArrayReconstructorTest(unittest.TestCase):
79
80 def test_error(self):
81 self.assertRaises(TypeError, array_reconstructor,
82 "", "b", 0, b"")
83 self.assertRaises(TypeError, array_reconstructor,
84 str, "b", 0, b"")
85 self.assertRaises(TypeError, array_reconstructor,
86 array.array, "b", '', b"")
87 self.assertRaises(TypeError, array_reconstructor,
88 array.array, "b", 0, "")
89 self.assertRaises(ValueError, array_reconstructor,
90 array.array, "?", 0, b"")
91 self.assertRaises(ValueError, array_reconstructor,
92 array.array, "b", UNKNOWN_FORMAT, b"")
93 self.assertRaises(ValueError, array_reconstructor,
94 array.array, "b", 22, b"")
95 self.assertRaises(ValueError, array_reconstructor,
96 array.array, "d", 16, b"a")
97
98 def test_numbers(self):
99 testcases = (
100 (['B', 'H', 'I', 'L'], UNSIGNED_INT8, '=BBBB',
101 [0x80, 0x7f, 0, 0xff]),
102 (['b', 'h', 'i', 'l'], SIGNED_INT8, '=bbb',
103 [-0x80, 0x7f, 0]),
104 (['H', 'I', 'L'], UNSIGNED_INT16_LE, '<HHHH',
105 [0x8000, 0x7fff, 0, 0xffff]),
106 (['H', 'I', 'L'], UNSIGNED_INT16_BE, '>HHHH',
107 [0x8000, 0x7fff, 0, 0xffff]),
108 (['h', 'i', 'l'], SIGNED_INT16_LE, '<hhh',
109 [-0x8000, 0x7fff, 0]),
110 (['h', 'i', 'l'], SIGNED_INT16_BE, '>hhh',
111 [-0x8000, 0x7fff, 0]),
112 (['I', 'L'], UNSIGNED_INT32_LE, '<IIII',
113 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
114 (['I', 'L'], UNSIGNED_INT32_BE, '>IIII',
115 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
116 (['i', 'l'], SIGNED_INT32_LE, '<iii',
117 [-1<<31, (1<<31)-1, 0]),
118 (['i', 'l'], SIGNED_INT32_BE, '>iii',
119 [-1<<31, (1<<31)-1, 0]),
120 (['L'], UNSIGNED_INT64_LE, '<QQQQ',
Alexandre Vassalotti0027d4b2009-07-15 20:53:55 +0000121 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
122 (['L'], UNSIGNED_INT64_BE, '>QQQQ',
123 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
124 (['l'], SIGNED_INT64_LE, '<qqq',
125 [-1<<31, (1<<31)-1, 0]),
126 (['l'], SIGNED_INT64_BE, '>qqq',
127 [-1<<31, (1<<31)-1, 0]),
128 # The following tests for INT64 will raise an OverflowError
129 # when run on a 32-bit machine. The tests are simply skipped
130 # in that case.
131 (['L'], UNSIGNED_INT64_LE, '<QQQQ',
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000132 [1<<63, (1<<63)-1, 0, (1<<64)-1]),
133 (['L'], UNSIGNED_INT64_BE, '>QQQQ',
134 [1<<63, (1<<63)-1, 0, (1<<64)-1]),
135 (['l'], SIGNED_INT64_LE, '<qqq',
136 [-1<<63, (1<<63)-1, 0]),
137 (['l'], SIGNED_INT64_BE, '>qqq',
138 [-1<<63, (1<<63)-1, 0]),
139 (['f'], IEEE_754_FLOAT_LE, '<ffff',
140 [16711938.0, float('inf'), float('-inf'), -0.0]),
141 (['f'], IEEE_754_FLOAT_BE, '>ffff',
142 [16711938.0, float('inf'), float('-inf'), -0.0]),
143 (['d'], IEEE_754_DOUBLE_LE, '<dddd',
144 [9006104071832581.0, float('inf'), float('-inf'), -0.0]),
145 (['d'], IEEE_754_DOUBLE_BE, '>dddd',
146 [9006104071832581.0, float('inf'), float('-inf'), -0.0])
147 )
148 for testcase in testcases:
149 valid_typecodes, mformat_code, struct_fmt, values = testcase
150 arraystr = struct.pack(struct_fmt, *values)
151 for typecode in valid_typecodes:
Alexandre Vassalotti0027d4b2009-07-15 20:53:55 +0000152 try:
153 a = array.array(typecode, values)
154 except OverflowError:
155 continue # Skip this test case.
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000156 b = array_reconstructor(
157 array.array, typecode, mformat_code, arraystr)
158 self.assertEqual(a, b,
159 msg="{0!r} != {1!r}; testcase={2!r}".format(a, b, testcase))
160
161 def test_unicode(self):
162 teststr = "Bonne Journ\xe9e \U0002030a\U00020347"
163 testcases = (
164 (UTF16_LE, "UTF-16-LE"),
165 (UTF16_BE, "UTF-16-BE"),
166 (UTF32_LE, "UTF-32-LE"),
167 (UTF32_BE, "UTF-32-BE")
168 )
169 for testcase in testcases:
170 mformat_code, encoding = testcase
171 a = array.array('u', teststr)
172 b = array_reconstructor(
173 array.array, 'u', mformat_code, teststr.encode(encoding))
174 self.assertEqual(a, b,
175 msg="{0!r} != {1!r}; testcase={2!r}".format(a, b, testcase))
176
177
178tests.append(ArrayReconstructorTest)
179
180
Walter Dörwald7fd94242003-05-18 00:47:47 +0000181class BaseTest(unittest.TestCase):
182 # Required class attributes (provided by subclasses
183 # typecode: the typecode to test
184 # example: an initializer usable in the constructor for this type
185 # smallerexample: the same length as example, but smaller
186 # biggerexample: the same length as example, but bigger
187 # outside: An entry that is not in example
188 # minitemsize: the minimum guaranteed itemsize
Martin v. Löwis99866332002-03-01 10:27:01 +0000189
Walter Dörwald7fd94242003-05-18 00:47:47 +0000190 def assertEntryEqual(self, entry1, entry2):
191 self.assertEqual(entry1, entry2)
Martin v. Löwis99866332002-03-01 10:27:01 +0000192
Walter Dörwald7fd94242003-05-18 00:47:47 +0000193 def badtypecode(self):
194 # Return a typecode that is different from our own
195 return typecodes[(typecodes.index(self.typecode)+1) % len(typecodes)]
Martin v. Löwis99866332002-03-01 10:27:01 +0000196
Walter Dörwald7fd94242003-05-18 00:47:47 +0000197 def test_constructor(self):
198 a = array.array(self.typecode)
199 self.assertEqual(a.typecode, self.typecode)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000200 self.assertTrue(a.itemsize>=self.minitemsize)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000201 self.assertRaises(TypeError, array.array, self.typecode, None)
Martin v. Löwis99866332002-03-01 10:27:01 +0000202
Walter Dörwald7fd94242003-05-18 00:47:47 +0000203 def test_len(self):
204 a = array.array(self.typecode)
205 a.append(self.example[0])
206 self.assertEqual(len(a), 1)
Martin v. Löwis99866332002-03-01 10:27:01 +0000207
Walter Dörwald7fd94242003-05-18 00:47:47 +0000208 a = array.array(self.typecode, self.example)
209 self.assertEqual(len(a), len(self.example))
Martin v. Löwis99866332002-03-01 10:27:01 +0000210
Walter Dörwald7fd94242003-05-18 00:47:47 +0000211 def test_buffer_info(self):
212 a = array.array(self.typecode, self.example)
213 self.assertRaises(TypeError, a.buffer_info, 42)
214 bi = a.buffer_info()
Ezio Melottie9615932010-01-24 19:26:24 +0000215 self.assertIsInstance(bi, tuple)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000216 self.assertEqual(len(bi), 2)
Ezio Melottie9615932010-01-24 19:26:24 +0000217 self.assertIsInstance(bi[0], int)
218 self.assertIsInstance(bi[1], int)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000219 self.assertEqual(bi[1], len(a))
Martin v. Löwis99866332002-03-01 10:27:01 +0000220
Walter Dörwald7fd94242003-05-18 00:47:47 +0000221 def test_byteswap(self):
Victor Stinner8dba4e02011-09-30 00:51:10 +0200222 if self.typecode == 'u':
223 example = '\U00100100'
224 else:
225 example = self.example
226 a = array.array(self.typecode, example)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000227 self.assertRaises(TypeError, a.byteswap, 42)
228 if a.itemsize in (1, 2, 4, 8):
Victor Stinner8dba4e02011-09-30 00:51:10 +0200229 b = array.array(self.typecode, example)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000230 b.byteswap()
231 if a.itemsize==1:
232 self.assertEqual(a, b)
233 else:
234 self.assertNotEqual(a, b)
235 b.byteswap()
236 self.assertEqual(a, b)
Martin v. Löwis99866332002-03-01 10:27:01 +0000237
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000238 def test_copy(self):
239 import copy
240 a = array.array(self.typecode, self.example)
241 b = copy.copy(a)
242 self.assertNotEqual(id(a), id(b))
243 self.assertEqual(a, b)
244
Thomas Wouters89f507f2006-12-13 04:49:30 +0000245 def test_deepcopy(self):
246 import copy
247 a = array.array(self.typecode, self.example)
248 b = copy.deepcopy(a)
249 self.assertNotEqual(id(a), id(b))
250 self.assertEqual(a, b)
251
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000252 def test_reduce_ex(self):
253 a = array.array(self.typecode, self.example)
254 for protocol in range(3):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000255 self.assertIs(a.__reduce_ex__(protocol)[0], array.array)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000256 for protocol in range(3, pickle.HIGHEST_PROTOCOL):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000257 self.assertIs(a.__reduce_ex__(protocol)[0], array_reconstructor)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000258
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000259 def test_pickle(self):
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000260 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000261 a = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000262 b = pickle.loads(pickle.dumps(a, protocol))
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000263 self.assertNotEqual(id(a), id(b))
264 self.assertEqual(a, b)
265
266 a = ArraySubclass(self.typecode, self.example)
267 a.x = 10
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000268 b = pickle.loads(pickle.dumps(a, protocol))
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000269 self.assertNotEqual(id(a), id(b))
270 self.assertEqual(a, b)
271 self.assertEqual(a.x, b.x)
272 self.assertEqual(type(a), type(b))
273
Guido van Rossumd8faa362007-04-27 19:54:29 +0000274 def test_pickle_for_empty_array(self):
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000275 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossumd8faa362007-04-27 19:54:29 +0000276 a = array.array(self.typecode)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000277 b = pickle.loads(pickle.dumps(a, protocol))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000278 self.assertNotEqual(id(a), id(b))
279 self.assertEqual(a, b)
280
281 a = ArraySubclass(self.typecode)
282 a.x = 10
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000283 b = pickle.loads(pickle.dumps(a, protocol))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000284 self.assertNotEqual(id(a), id(b))
285 self.assertEqual(a, b)
286 self.assertEqual(a.x, b.x)
287 self.assertEqual(type(a), type(b))
288
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000289 def test_iterator_pickle(self):
290 data = array.array(self.typecode, self.example)
291 orgit = iter(data)
292 d = pickle.dumps(orgit)
293 it = pickle.loads(d)
294 self.assertEqual(type(orgit), type(it))
295 self.assertEqual(list(it), list(data))
296
297 if len(data):
298 it = pickle.loads(d)
299 next(it)
300 d = pickle.dumps(it)
301 self.assertEqual(list(it), list(data)[1:])
302
Walter Dörwald7fd94242003-05-18 00:47:47 +0000303 def test_insert(self):
304 a = array.array(self.typecode, self.example)
305 a.insert(0, self.example[0])
306 self.assertEqual(len(a), 1+len(self.example))
307 self.assertEqual(a[0], a[1])
308 self.assertRaises(TypeError, a.insert)
309 self.assertRaises(TypeError, a.insert, None)
Walter Dörwaldba39d9c2003-05-18 01:56:25 +0000310 self.assertRaises(TypeError, a.insert, 0, None)
Martin v. Löwis99866332002-03-01 10:27:01 +0000311
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000312 a = array.array(self.typecode, self.example)
313 a.insert(-1, self.example[0])
314 self.assertEqual(
315 a,
316 array.array(
317 self.typecode,
318 self.example[:-1] + self.example[:1] + self.example[-1:]
319 )
320 )
321
322 a = array.array(self.typecode, self.example)
323 a.insert(-1000, self.example[0])
324 self.assertEqual(
325 a,
326 array.array(self.typecode, self.example[:1] + self.example)
327 )
328
329 a = array.array(self.typecode, self.example)
330 a.insert(1000, self.example[0])
331 self.assertEqual(
332 a,
333 array.array(self.typecode, self.example + self.example[:1])
334 )
335
Walter Dörwald7fd94242003-05-18 00:47:47 +0000336 def test_tofromfile(self):
337 a = array.array(self.typecode, 2*self.example)
338 self.assertRaises(TypeError, a.tofile)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000339 support.unlink(support.TESTFN)
340 f = open(support.TESTFN, 'wb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000341 try:
342 a.tofile(f)
343 f.close()
344 b = array.array(self.typecode)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000345 f = open(support.TESTFN, 'rb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000346 self.assertRaises(TypeError, b.fromfile)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000347 b.fromfile(f, len(self.example))
348 self.assertEqual(b, array.array(self.typecode, self.example))
349 self.assertNotEqual(a, b)
Hirokazu Yamamoto54d0df62009-03-06 03:04:07 +0000350 self.assertRaises(EOFError, b.fromfile, f, len(self.example)+1)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000351 self.assertEqual(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000352 f.close()
353 finally:
354 if not f.closed:
355 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000356 support.unlink(support.TESTFN)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000357
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000358 def test_fromfile_ioerror(self):
359 # Issue #5395: Check if fromfile raises a proper IOError
360 # instead of EOFError.
361 a = array.array(self.typecode)
362 f = open(support.TESTFN, 'wb')
363 try:
364 self.assertRaises(IOError, a.fromfile, f, len(self.example))
365 finally:
366 f.close()
367 support.unlink(support.TESTFN)
368
Frank Wierzbicki17683432009-08-16 20:30:12 +0000369 def test_filewrite(self):
370 a = array.array(self.typecode, 2*self.example)
371 f = open(support.TESTFN, 'wb')
372 try:
373 f.write(a)
374 f.close()
375 b = array.array(self.typecode)
376 f = open(support.TESTFN, 'rb')
377 b.fromfile(f, len(self.example))
378 self.assertEqual(b, array.array(self.typecode, self.example))
379 self.assertNotEqual(a, b)
380 b.fromfile(f, len(self.example))
381 self.assertEqual(a, b)
382 f.close()
383 finally:
384 if not f.closed:
385 f.close()
386 support.unlink(support.TESTFN)
387
Walter Dörwald7fd94242003-05-18 00:47:47 +0000388 def test_tofromlist(self):
389 a = array.array(self.typecode, 2*self.example)
390 b = array.array(self.typecode)
391 self.assertRaises(TypeError, a.tolist, 42)
392 self.assertRaises(TypeError, b.fromlist)
393 self.assertRaises(TypeError, b.fromlist, 42)
394 self.assertRaises(TypeError, b.fromlist, [None])
395 b.fromlist(a.tolist())
396 self.assertEqual(a, b)
Fred Drake78334472000-06-28 17:50:51 +0000397
Walter Dörwald7fd94242003-05-18 00:47:47 +0000398 def test_tofromstring(self):
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000399 nb_warnings = 4
400 with warnings.catch_warnings(record=True) as r:
401 warnings.filterwarnings("always",
402 message=r"(to|from)string\(\) is deprecated",
403 category=DeprecationWarning)
404 a = array.array(self.typecode, 2*self.example)
405 b = array.array(self.typecode)
406 self.assertRaises(TypeError, a.tostring, 42)
407 self.assertRaises(TypeError, b.fromstring)
408 self.assertRaises(TypeError, b.fromstring, 42)
409 b.fromstring(a.tostring())
410 self.assertEqual(a, b)
411 if a.itemsize>1:
412 self.assertRaises(ValueError, b.fromstring, "x")
413 nb_warnings += 1
414 self.assertEqual(len(r), nb_warnings)
415
416 def test_tofrombytes(self):
Walter Dörwald7fd94242003-05-18 00:47:47 +0000417 a = array.array(self.typecode, 2*self.example)
418 b = array.array(self.typecode)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000419 self.assertRaises(TypeError, a.tobytes, 42)
420 self.assertRaises(TypeError, b.frombytes)
421 self.assertRaises(TypeError, b.frombytes, 42)
422 b.frombytes(a.tobytes())
423 c = array.array(self.typecode, bytearray(a.tobytes()))
Walter Dörwald7fd94242003-05-18 00:47:47 +0000424 self.assertEqual(a, b)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000425 self.assertEqual(a, c)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000426 if a.itemsize>1:
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000427 self.assertRaises(ValueError, b.frombytes, b"x")
Fred Drake78334472000-06-28 17:50:51 +0000428
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +0000429 def test_fromarray(self):
430 a = array.array(self.typecode, self.example)
431 b = array.array(self.typecode, a)
432 self.assertEqual(a, b)
433
Walter Dörwald7fd94242003-05-18 00:47:47 +0000434 def test_repr(self):
435 a = array.array(self.typecode, 2*self.example)
436 self.assertEqual(a, eval(repr(a), {"array": array.array}))
Fred Drake78334472000-06-28 17:50:51 +0000437
Walter Dörwald7fd94242003-05-18 00:47:47 +0000438 a = array.array(self.typecode)
439 self.assertEqual(repr(a), "array('%s')" % self.typecode)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000440
Walter Dörwald7fd94242003-05-18 00:47:47 +0000441 def test_str(self):
442 a = array.array(self.typecode, 2*self.example)
443 str(a)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000444
Walter Dörwald7fd94242003-05-18 00:47:47 +0000445 def test_cmp(self):
446 a = array.array(self.typecode, self.example)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000447 self.assertTrue((a == 42) is False)
448 self.assertTrue((a != 42) is True)
Tim Peterscc78e472000-11-14 21:36:07 +0000449
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000450 self.assertTrue((a == a) is True)
451 self.assertTrue((a != a) is False)
452 self.assertTrue((a < a) is False)
453 self.assertTrue((a <= a) is True)
454 self.assertTrue((a > a) is False)
455 self.assertTrue((a >= a) is True)
Tim Peterscc78e472000-11-14 21:36:07 +0000456
Neal Norwitzbd2835c2006-03-17 08:54:15 +0000457 al = array.array(self.typecode, self.smallerexample)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000458 ab = array.array(self.typecode, self.biggerexample)
Guido van Rossum7f1d3aa1998-07-16 15:31:43 +0000459
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000460 self.assertTrue((a == 2*a) is False)
461 self.assertTrue((a != 2*a) is True)
462 self.assertTrue((a < 2*a) is True)
463 self.assertTrue((a <= 2*a) is True)
464 self.assertTrue((a > 2*a) is False)
465 self.assertTrue((a >= 2*a) is False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000466
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000467 self.assertTrue((a == al) is False)
468 self.assertTrue((a != al) is True)
469 self.assertTrue((a < al) is False)
470 self.assertTrue((a <= al) is False)
471 self.assertTrue((a > al) is True)
472 self.assertTrue((a >= al) is True)
Martin v. Löwis99866332002-03-01 10:27:01 +0000473
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000474 self.assertTrue((a == ab) is False)
475 self.assertTrue((a != ab) is True)
476 self.assertTrue((a < ab) is True)
477 self.assertTrue((a <= ab) is True)
478 self.assertTrue((a > ab) is False)
479 self.assertTrue((a >= ab) is False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000480
Walter Dörwald7fd94242003-05-18 00:47:47 +0000481 def test_add(self):
482 a = array.array(self.typecode, self.example) \
483 + array.array(self.typecode, self.example[::-1])
484 self.assertEqual(
485 a,
486 array.array(self.typecode, self.example + self.example[::-1])
487 )
Martin v. Löwis99866332002-03-01 10:27:01 +0000488
Walter Dörwald7fd94242003-05-18 00:47:47 +0000489 b = array.array(self.badtypecode())
490 self.assertRaises(TypeError, a.__add__, b)
491
492 self.assertRaises(TypeError, a.__add__, "bad")
493
494 def test_iadd(self):
495 a = array.array(self.typecode, self.example[::-1])
496 b = a
497 a += array.array(self.typecode, 2*self.example)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000498 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000499 self.assertEqual(
500 a,
501 array.array(self.typecode, self.example[::-1]+2*self.example)
502 )
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000503 a = array.array(self.typecode, self.example)
504 a += a
505 self.assertEqual(
506 a,
507 array.array(self.typecode, self.example + self.example)
508 )
Walter Dörwald7fd94242003-05-18 00:47:47 +0000509
510 b = array.array(self.badtypecode())
511 self.assertRaises(TypeError, a.__add__, b)
512
513 self.assertRaises(TypeError, a.__iadd__, "bad")
514
515 def test_mul(self):
516 a = 5*array.array(self.typecode, self.example)
517 self.assertEqual(
518 a,
519 array.array(self.typecode, 5*self.example)
520 )
521
522 a = array.array(self.typecode, self.example)*5
523 self.assertEqual(
524 a,
525 array.array(self.typecode, self.example*5)
526 )
527
528 a = 0*array.array(self.typecode, self.example)
529 self.assertEqual(
530 a,
531 array.array(self.typecode)
532 )
533
534 a = (-1)*array.array(self.typecode, self.example)
535 self.assertEqual(
536 a,
537 array.array(self.typecode)
538 )
539
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000540 a = 5 * array.array(self.typecode, self.example[:1])
541 self.assertEqual(
542 a,
543 array.array(self.typecode, [a[0]] * 5)
544 )
545
Walter Dörwald7fd94242003-05-18 00:47:47 +0000546 self.assertRaises(TypeError, a.__mul__, "bad")
547
548 def test_imul(self):
549 a = array.array(self.typecode, self.example)
550 b = a
551
552 a *= 5
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000553 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000554 self.assertEqual(
555 a,
556 array.array(self.typecode, 5*self.example)
557 )
558
559 a *= 0
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000560 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000561 self.assertEqual(a, array.array(self.typecode))
562
563 a *= 1000
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000564 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000565 self.assertEqual(a, array.array(self.typecode))
566
567 a *= -1
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000568 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000569 self.assertEqual(a, array.array(self.typecode))
570
571 a = array.array(self.typecode, self.example)
572 a *= -1
573 self.assertEqual(a, array.array(self.typecode))
574
575 self.assertRaises(TypeError, a.__imul__, "bad")
576
577 def test_getitem(self):
578 a = array.array(self.typecode, self.example)
579 self.assertEntryEqual(a[0], self.example[0])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000580 self.assertEntryEqual(a[0], self.example[0])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000581 self.assertEntryEqual(a[-1], self.example[-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000582 self.assertEntryEqual(a[-1], self.example[-1])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000583 self.assertEntryEqual(a[len(self.example)-1], self.example[-1])
584 self.assertEntryEqual(a[-len(self.example)], self.example[0])
585 self.assertRaises(TypeError, a.__getitem__)
586 self.assertRaises(IndexError, a.__getitem__, len(self.example))
587 self.assertRaises(IndexError, a.__getitem__, -len(self.example)-1)
588
589 def test_setitem(self):
590 a = array.array(self.typecode, self.example)
591 a[0] = a[-1]
592 self.assertEntryEqual(a[0], a[-1])
593
594 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000595 a[0] = a[-1]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000596 self.assertEntryEqual(a[0], a[-1])
597
598 a = array.array(self.typecode, self.example)
599 a[-1] = a[0]
600 self.assertEntryEqual(a[0], a[-1])
601
602 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000603 a[-1] = a[0]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000604 self.assertEntryEqual(a[0], a[-1])
605
606 a = array.array(self.typecode, self.example)
607 a[len(self.example)-1] = a[0]
608 self.assertEntryEqual(a[0], a[-1])
609
610 a = array.array(self.typecode, self.example)
611 a[-len(self.example)] = a[-1]
612 self.assertEntryEqual(a[0], a[-1])
613
614 self.assertRaises(TypeError, a.__setitem__)
615 self.assertRaises(TypeError, a.__setitem__, None)
616 self.assertRaises(TypeError, a.__setitem__, 0, None)
617 self.assertRaises(
618 IndexError,
619 a.__setitem__,
620 len(self.example), self.example[0]
621 )
622 self.assertRaises(
623 IndexError,
624 a.__setitem__,
625 -len(self.example)-1, self.example[0]
626 )
627
628 def test_delitem(self):
629 a = array.array(self.typecode, self.example)
630 del a[0]
631 self.assertEqual(
632 a,
633 array.array(self.typecode, self.example[1:])
634 )
635
636 a = array.array(self.typecode, self.example)
637 del a[-1]
638 self.assertEqual(
639 a,
640 array.array(self.typecode, self.example[:-1])
641 )
642
643 a = array.array(self.typecode, self.example)
644 del a[len(self.example)-1]
645 self.assertEqual(
646 a,
647 array.array(self.typecode, self.example[:-1])
648 )
649
650 a = array.array(self.typecode, self.example)
651 del a[-len(self.example)]
652 self.assertEqual(
653 a,
654 array.array(self.typecode, self.example[1:])
655 )
656
657 self.assertRaises(TypeError, a.__delitem__)
658 self.assertRaises(TypeError, a.__delitem__, None)
659 self.assertRaises(IndexError, a.__delitem__, len(self.example))
660 self.assertRaises(IndexError, a.__delitem__, -len(self.example)-1)
661
662 def test_getslice(self):
663 a = array.array(self.typecode, self.example)
664 self.assertEqual(a[:], a)
665
666 self.assertEqual(
667 a[1:],
668 array.array(self.typecode, self.example[1:])
669 )
670
671 self.assertEqual(
672 a[:1],
673 array.array(self.typecode, self.example[:1])
674 )
675
676 self.assertEqual(
677 a[:-1],
678 array.array(self.typecode, self.example[:-1])
679 )
680
681 self.assertEqual(
682 a[-1:],
683 array.array(self.typecode, self.example[-1:])
684 )
685
686 self.assertEqual(
687 a[-1:-1],
688 array.array(self.typecode)
689 )
690
691 self.assertEqual(
Walter Dörwald1083c242005-01-21 21:16:51 +0000692 a[2:1],
693 array.array(self.typecode)
694 )
695
696 self.assertEqual(
Walter Dörwald7fd94242003-05-18 00:47:47 +0000697 a[1000:],
698 array.array(self.typecode)
699 )
700 self.assertEqual(a[-1000:], a)
701 self.assertEqual(a[:1000], a)
702 self.assertEqual(
703 a[:-1000],
704 array.array(self.typecode)
705 )
706 self.assertEqual(a[-1000:1000], a)
707 self.assertEqual(
708 a[2000:1000],
709 array.array(self.typecode)
710 )
711
Thomas Woutersed03b412007-08-28 21:37:11 +0000712 def test_extended_getslice(self):
713 # Test extended slicing by comparing with list slicing
714 # (Assumes list conversion works correctly, too)
715 a = array.array(self.typecode, self.example)
716 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
717 for start in indices:
718 for stop in indices:
719 # Everything except the initial 0 (invalid step)
720 for step in indices[1:]:
721 self.assertEqual(list(a[start:stop:step]),
722 list(a)[start:stop:step])
723
Walter Dörwald7fd94242003-05-18 00:47:47 +0000724 def test_setslice(self):
725 a = array.array(self.typecode, self.example)
726 a[:1] = a
727 self.assertEqual(
728 a,
729 array.array(self.typecode, self.example + self.example[1:])
730 )
731
732 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000733 a[:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000734 self.assertEqual(
735 a,
736 array.array(self.typecode, self.example + self.example[-1:])
737 )
738
739 a = array.array(self.typecode, self.example)
740 a[-1:] = a
741 self.assertEqual(
742 a,
743 array.array(self.typecode, self.example[:-1] + self.example)
744 )
745
746 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000747 a[1:] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000748 self.assertEqual(
749 a,
750 array.array(self.typecode, self.example[:1] + self.example)
751 )
752
753 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000754 a[1:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000755 self.assertEqual(
756 a,
757 array.array(
758 self.typecode,
759 self.example[:1] + self.example + self.example[-1:]
760 )
761 )
762
763 a = array.array(self.typecode, self.example)
764 a[1000:] = a
765 self.assertEqual(
766 a,
767 array.array(self.typecode, 2*self.example)
768 )
769
770 a = array.array(self.typecode, self.example)
771 a[-1000:] = a
772 self.assertEqual(
773 a,
774 array.array(self.typecode, self.example)
775 )
776
777 a = array.array(self.typecode, self.example)
778 a[:1000] = a
779 self.assertEqual(
780 a,
781 array.array(self.typecode, self.example)
782 )
783
784 a = array.array(self.typecode, self.example)
785 a[:-1000] = a
786 self.assertEqual(
787 a,
788 array.array(self.typecode, 2*self.example)
789 )
790
791 a = array.array(self.typecode, self.example)
792 a[1:0] = a
793 self.assertEqual(
794 a,
795 array.array(self.typecode, self.example[:1] + self.example + self.example[1:])
796 )
797
798 a = array.array(self.typecode, self.example)
799 a[2000:1000] = a
800 self.assertEqual(
801 a,
802 array.array(self.typecode, 2*self.example)
803 )
804
805 a = array.array(self.typecode, self.example)
Thomas Woutersed03b412007-08-28 21:37:11 +0000806 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), None)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000807 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), None)
808
809 b = array.array(self.badtypecode())
Thomas Woutersed03b412007-08-28 21:37:11 +0000810 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000811 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), b)
812
Thomas Woutersed03b412007-08-28 21:37:11 +0000813 def test_extended_set_del_slice(self):
814 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
815 for start in indices:
816 for stop in indices:
817 # Everything except the initial 0 (invalid step)
818 for step in indices[1:]:
819 a = array.array(self.typecode, self.example)
820 L = list(a)
821 # Make sure we have a slice of exactly the right length,
822 # but with (hopefully) different data.
823 data = L[start:stop:step]
824 data.reverse()
825 L[start:stop:step] = data
826 a[start:stop:step] = array.array(self.typecode, data)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000827 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000828
829 del L[start:stop:step]
830 del a[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +0000831 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000832
Walter Dörwald7fd94242003-05-18 00:47:47 +0000833 def test_index(self):
834 example = 2*self.example
835 a = array.array(self.typecode, example)
836 self.assertRaises(TypeError, a.index)
837 for x in example:
838 self.assertEqual(a.index(x), example.index(x))
839 self.assertRaises(ValueError, a.index, None)
840 self.assertRaises(ValueError, a.index, self.outside)
841
842 def test_count(self):
843 example = 2*self.example
844 a = array.array(self.typecode, example)
845 self.assertRaises(TypeError, a.count)
846 for x in example:
847 self.assertEqual(a.count(x), example.count(x))
848 self.assertEqual(a.count(self.outside), 0)
849 self.assertEqual(a.count(None), 0)
850
851 def test_remove(self):
852 for x in self.example:
853 example = 2*self.example
854 a = array.array(self.typecode, example)
855 pos = example.index(x)
856 example2 = example[:pos] + example[pos+1:]
857 a.remove(x)
858 self.assertEqual(a, array.array(self.typecode, example2))
859
860 a = array.array(self.typecode, self.example)
861 self.assertRaises(ValueError, a.remove, self.outside)
862
863 self.assertRaises(ValueError, a.remove, None)
864
865 def test_pop(self):
866 a = array.array(self.typecode)
867 self.assertRaises(IndexError, a.pop)
868
869 a = array.array(self.typecode, 2*self.example)
870 self.assertRaises(TypeError, a.pop, 42, 42)
871 self.assertRaises(TypeError, a.pop, None)
872 self.assertRaises(IndexError, a.pop, len(a))
873 self.assertRaises(IndexError, a.pop, -len(a)-1)
874
875 self.assertEntryEqual(a.pop(0), self.example[0])
876 self.assertEqual(
877 a,
878 array.array(self.typecode, self.example[1:]+self.example)
879 )
880 self.assertEntryEqual(a.pop(1), self.example[2])
881 self.assertEqual(
882 a,
883 array.array(self.typecode, self.example[1:2]+self.example[3:]+self.example)
884 )
885 self.assertEntryEqual(a.pop(0), self.example[1])
886 self.assertEntryEqual(a.pop(), self.example[-1])
887 self.assertEqual(
888 a,
889 array.array(self.typecode, self.example[3:]+self.example[:-1])
890 )
891
892 def test_reverse(self):
893 a = array.array(self.typecode, self.example)
894 self.assertRaises(TypeError, a.reverse, 42)
Fred Drake004d5e62000-10-23 17:22:08 +0000895 a.reverse()
Walter Dörwald7fd94242003-05-18 00:47:47 +0000896 self.assertEqual(
897 a,
898 array.array(self.typecode, self.example[::-1])
899 )
900
901 def test_extend(self):
902 a = array.array(self.typecode, self.example)
903 self.assertRaises(TypeError, a.extend)
904 a.extend(array.array(self.typecode, self.example[::-1]))
905 self.assertEqual(
906 a,
907 array.array(self.typecode, self.example+self.example[::-1])
908 )
909
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000910 a = array.array(self.typecode, self.example)
911 a.extend(a)
912 self.assertEqual(
913 a,
914 array.array(self.typecode, self.example+self.example)
915 )
916
Walter Dörwald7fd94242003-05-18 00:47:47 +0000917 b = array.array(self.badtypecode())
918 self.assertRaises(TypeError, a.extend, b)
919
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000920 a = array.array(self.typecode, self.example)
921 a.extend(self.example[::-1])
922 self.assertEqual(
923 a,
924 array.array(self.typecode, self.example+self.example[::-1])
925 )
926
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +0000927 def test_constructor_with_iterable_argument(self):
928 a = array.array(self.typecode, iter(self.example))
929 b = array.array(self.typecode, self.example)
930 self.assertEqual(a, b)
931
932 # non-iterable argument
933 self.assertRaises(TypeError, array.array, self.typecode, 10)
934
935 # pass through errors raised in __iter__
936 class A:
937 def __iter__(self):
938 raise UnicodeError
939 self.assertRaises(UnicodeError, array.array, self.typecode, A())
940
941 # pass through errors raised in next()
942 def B():
943 raise UnicodeError
944 yield None
945 self.assertRaises(UnicodeError, array.array, self.typecode, B())
946
Walter Dörwald7fd94242003-05-18 00:47:47 +0000947 def test_coveritertraverse(self):
948 try:
949 import gc
950 except ImportError:
951 return
952 a = array.array(self.typecode)
953 l = [iter(a)]
954 l.append(l)
955 gc.collect()
956
957 def test_buffer(self):
958 a = array.array(self.typecode, self.example)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000959 m = memoryview(a)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000960 expected = m.tobytes()
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000961 self.assertEqual(a.tobytes(), expected)
962 self.assertEqual(a.tobytes()[0], expected[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000963 # Resizing is forbidden when there are buffer exports.
964 # For issue 4509, we also check after each error that
965 # the array was not modified.
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000966 self.assertRaises(BufferError, a.append, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000967 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000968 self.assertRaises(BufferError, a.extend, a[0:1])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000969 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000970 self.assertRaises(BufferError, a.remove, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000971 self.assertEqual(m.tobytes(), expected)
972 self.assertRaises(BufferError, a.pop, 0)
973 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000974 self.assertRaises(BufferError, a.fromlist, a.tolist())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000975 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000976 self.assertRaises(BufferError, a.frombytes, a.tobytes())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000977 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000978 if self.typecode == 'u':
979 self.assertRaises(BufferError, a.fromunicode, a.tounicode())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000980 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +0000981 self.assertRaises(BufferError, operator.imul, a, 2)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000982 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +0000983 self.assertRaises(BufferError, operator.imul, a, 0)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000984 self.assertEqual(m.tobytes(), expected)
985 self.assertRaises(BufferError, operator.setitem, a, slice(0, 0), a)
986 self.assertEqual(m.tobytes(), expected)
987 self.assertRaises(BufferError, operator.delitem, a, 0)
988 self.assertEqual(m.tobytes(), expected)
989 self.assertRaises(BufferError, operator.delitem, a, slice(0, 1))
990 self.assertEqual(m.tobytes(), expected)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000991
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000992 def test_weakref(self):
993 s = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000994 p = weakref.proxy(s)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000995 self.assertEqual(p.tobytes(), s.tobytes())
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000996 s = None
997 self.assertRaises(ReferenceError, len, p)
998
Skip Montanarod5cf0b82003-08-03 23:02:10 +0000999 def test_bug_782369(self):
1000 import sys
Skip Montanaroed9bf122003-08-03 23:30:40 +00001001 if hasattr(sys, "getrefcount"):
1002 for i in range(10):
1003 b = array.array('B', range(64))
1004 rc = sys.getrefcount(10)
1005 for i in range(10):
1006 b = array.array('B', range(64))
1007 self.assertEqual(rc, sys.getrefcount(10))
Skip Montanarod5cf0b82003-08-03 23:02:10 +00001008
Thomas Woutersb2137042007-02-01 18:02:27 +00001009 def test_subclass_with_kwargs(self):
1010 # SF bug #1486663 -- this used to erroneously raise a TypeError
1011 ArraySubclassWithKwargs('b', newarg=1)
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001012
Guido van Rossum6b826ab2007-07-03 16:22:09 +00001013 def test_create_from_bytes(self):
Alexandre Vassalotti7e4f3212009-07-05 05:38:18 +00001014 # XXX This test probably needs to be moved in a subclass or
1015 # generalized to use self.typecode.
Guido van Rossum6b826ab2007-07-03 16:22:09 +00001016 a = array.array('H', b"1234")
1017 self.assertEqual(len(a) * a.itemsize, 4)
1018
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001019
Walter Dörwald7fd94242003-05-18 00:47:47 +00001020class StringTest(BaseTest):
1021
1022 def test_setitem(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001023 super().test_setitem()
Walter Dörwald7fd94242003-05-18 00:47:47 +00001024 a = array.array(self.typecode, self.example)
1025 self.assertRaises(TypeError, a.__setitem__, 0, self.example[:2])
1026
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001027class UnicodeTest(StringTest):
1028 typecode = 'u'
1029 example = '\x01\u263a\x00\ufeff'
1030 smallerexample = '\x01\u263a\x00\ufefe'
1031 biggerexample = '\x01\u263a\x01\ufeff'
1032 outside = str('\x33')
Victor Stinner8d4734f2012-08-08 20:09:21 +02001033 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001034
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001035 def test_unicode(self):
1036 self.assertRaises(TypeError, array.array, 'b', 'foo')
Walter Dörwald7fd94242003-05-18 00:47:47 +00001037
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001038 a = array.array('u', '\xa0\xc2\u1234')
1039 a.fromunicode(' ')
1040 a.fromunicode('')
1041 a.fromunicode('')
1042 a.fromunicode('\x11abc\xff\u1234')
1043 s = a.tounicode()
1044 self.assertEqual(s, '\xa0\xc2\u1234 \x11abc\xff\u1234')
Victor Stinnerbded28c2012-08-08 20:19:37 +02001045 self.assertEqual(a.itemsize, ctypes.sizeof(ctypes.c_wchar))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001046
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001047 s = '\x00="\'a\\b\x80\xff\u0000\u0001\u1234'
1048 a = array.array('u', s)
1049 self.assertEqual(
1050 repr(a),
Georg Brandl559e5d72008-06-11 18:37:52 +00001051 "array('u', '\\x00=\"\\'a\\\\b\\x80\xff\\x00\\x01\u1234')")
Walter Dörwald7fd94242003-05-18 00:47:47 +00001052
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001053 self.assertRaises(TypeError, a.fromunicode)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001054
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001055tests.append(UnicodeTest)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001056
1057class NumberTest(BaseTest):
1058
1059 def test_extslice(self):
1060 a = array.array(self.typecode, range(5))
1061 self.assertEqual(a[::], a)
1062 self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
1063 self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
1064 self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
1065 self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
1066 self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
1067 self.assertEqual(a[-100:100:], a)
1068 self.assertEqual(a[100:-100:-1], a[::-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +00001069 self.assertEqual(a[-100:100:2], array.array(self.typecode, [0,2,4]))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001070 self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
1071 self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
1072
1073 def test_delslice(self):
1074 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001075 del a[::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001076 self.assertEqual(a, array.array(self.typecode, [1,3]))
1077 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001078 del a[1::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001079 self.assertEqual(a, array.array(self.typecode, [0,2,4]))
1080 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001081 del a[1::-2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001082 self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
1083 a = array.array(self.typecode, range(10))
Michael W. Hudson56796f62002-07-29 14:35:04 +00001084 del a[::1000]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001085 self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
Mark Dickinsonbc099642010-01-29 17:27:24 +00001086 # test issue7788
1087 a = array.array(self.typecode, range(10))
1088 del a[9::1<<333]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001089
1090 def test_assignment(self):
1091 a = array.array(self.typecode, range(10))
1092 a[::2] = array.array(self.typecode, [42]*5)
1093 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
1094 a = array.array(self.typecode, range(10))
1095 a[::-4] = array.array(self.typecode, [10]*3)
1096 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
1097 a = array.array(self.typecode, range(4))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001098 a[::-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +00001099 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
1100 a = array.array(self.typecode, range(10))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001101 b = a[:]
1102 c = a[:]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001103 ins = array.array(self.typecode, range(2))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001104 a[2:3] = ins
1105 b[slice(2,3)] = ins
1106 c[2:3:] = ins
Fred Drake004d5e62000-10-23 17:22:08 +00001107
Walter Dörwald7fd94242003-05-18 00:47:47 +00001108 def test_iterationcontains(self):
1109 a = array.array(self.typecode, range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +00001110 self.assertEqual(list(a), list(range(10)))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001111 b = array.array(self.typecode, [20])
1112 self.assertEqual(a[-1] in a, True)
1113 self.assertEqual(b[0] not in a, True)
1114
1115 def check_overflow(self, lower, upper):
1116 # method to be used by subclasses
1117
1118 # should not overflow assigning lower limit
1119 a = array.array(self.typecode, [lower])
1120 a[0] = lower
1121 # should overflow assigning less than lower limit
1122 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
1123 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
1124 # should not overflow assigning upper limit
1125 a = array.array(self.typecode, [upper])
1126 a[0] = upper
1127 # should overflow assigning more than upper limit
1128 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
1129 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
1130
1131 def test_subclassing(self):
1132 typecode = self.typecode
1133 class ExaggeratingArray(array.array):
1134 __slots__ = ['offset']
1135
1136 def __new__(cls, typecode, data, offset):
1137 return array.array.__new__(cls, typecode, data)
1138
1139 def __init__(self, typecode, data, offset):
1140 self.offset = offset
1141
1142 def __getitem__(self, i):
1143 return array.array.__getitem__(self, i) + self.offset
1144
1145 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
1146 self.assertEntryEqual(a[0], 7)
1147
1148 self.assertRaises(AttributeError, setattr, a, "color", "blue")
1149
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00001150 def test_frombytearray(self):
1151 a = array.array('b', range(10))
1152 b = array.array(self.typecode, a)
1153 self.assertEqual(a, b)
1154
Walter Dörwald7fd94242003-05-18 00:47:47 +00001155class SignedNumberTest(NumberTest):
1156 example = [-1, 0, 1, 42, 0x7f]
1157 smallerexample = [-1, 0, 1, 42, 0x7e]
1158 biggerexample = [-1, 0, 1, 43, 0x7f]
1159 outside = 23
1160
1161 def test_overflow(self):
1162 a = array.array(self.typecode)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001163 lower = -1 * int(pow(2, a.itemsize * 8 - 1))
1164 upper = int(pow(2, a.itemsize * 8 - 1)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001165 self.check_overflow(lower, upper)
1166
1167class UnsignedNumberTest(NumberTest):
1168 example = [0, 1, 17, 23, 42, 0xff]
1169 smallerexample = [0, 1, 17, 23, 42, 0xfe]
1170 biggerexample = [0, 1, 17, 23, 43, 0xff]
1171 outside = 0xaa
1172
1173 def test_overflow(self):
1174 a = array.array(self.typecode)
1175 lower = 0
Guido van Rossume2a383d2007-01-15 16:59:06 +00001176 upper = int(pow(2, a.itemsize * 8)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001177 self.check_overflow(lower, upper)
Fred Drake004d5e62000-10-23 17:22:08 +00001178
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001179 def test_bytes_extend(self):
1180 s = bytes(self.example)
1181
1182 a = array.array(self.typecode, self.example)
1183 a.extend(s)
1184 self.assertEqual(
1185 a,
1186 array.array(self.typecode, self.example+self.example)
1187 )
1188
1189 a = array.array(self.typecode, self.example)
1190 a.extend(bytearray(reversed(s)))
1191 self.assertEqual(
1192 a,
1193 array.array(self.typecode, self.example+self.example[::-1])
1194 )
1195
Fred Drake004d5e62000-10-23 17:22:08 +00001196
Walter Dörwald7fd94242003-05-18 00:47:47 +00001197class ByteTest(SignedNumberTest):
1198 typecode = 'b'
1199 minitemsize = 1
1200tests.append(ByteTest)
Fred Drake004d5e62000-10-23 17:22:08 +00001201
Walter Dörwald7fd94242003-05-18 00:47:47 +00001202class UnsignedByteTest(UnsignedNumberTest):
1203 typecode = 'B'
1204 minitemsize = 1
1205tests.append(UnsignedByteTest)
1206
1207class ShortTest(SignedNumberTest):
1208 typecode = 'h'
1209 minitemsize = 2
1210tests.append(ShortTest)
1211
1212class UnsignedShortTest(UnsignedNumberTest):
1213 typecode = 'H'
1214 minitemsize = 2
1215tests.append(UnsignedShortTest)
1216
1217class IntTest(SignedNumberTest):
1218 typecode = 'i'
1219 minitemsize = 2
1220tests.append(IntTest)
1221
1222class UnsignedIntTest(UnsignedNumberTest):
1223 typecode = 'I'
1224 minitemsize = 2
1225tests.append(UnsignedIntTest)
1226
1227class LongTest(SignedNumberTest):
1228 typecode = 'l'
1229 minitemsize = 4
1230tests.append(LongTest)
1231
1232class UnsignedLongTest(UnsignedNumberTest):
1233 typecode = 'L'
1234 minitemsize = 4
1235tests.append(UnsignedLongTest)
1236
Meador Inge1c9f0c92011-09-20 19:55:51 -05001237@unittest.skipIf(not have_long_long, 'need long long support')
1238class LongLongTest(SignedNumberTest):
1239 typecode = 'q'
1240 minitemsize = 8
1241tests.append(LongLongTest)
1242
1243@unittest.skipIf(not have_long_long, 'need long long support')
1244class UnsignedLongLongTest(UnsignedNumberTest):
1245 typecode = 'Q'
1246 minitemsize = 8
1247tests.append(UnsignedLongLongTest)
1248
Walter Dörwald7fd94242003-05-18 00:47:47 +00001249class FPTest(NumberTest):
1250 example = [-42.0, 0, 42, 1e5, -1e10]
1251 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
1252 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
1253 outside = 23
1254
1255 def assertEntryEqual(self, entry1, entry2):
1256 self.assertAlmostEqual(entry1, entry2)
1257
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001258 def test_byteswap(self):
1259 a = array.array(self.typecode, self.example)
1260 self.assertRaises(TypeError, a.byteswap, 42)
1261 if a.itemsize in (1, 2, 4, 8):
1262 b = array.array(self.typecode, self.example)
1263 b.byteswap()
1264 if a.itemsize==1:
1265 self.assertEqual(a, b)
1266 else:
1267 # On alphas treating the byte swapped bit patters as
1268 # floats/doubles results in floating point exceptions
1269 # => compare the 8bit string values instead
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001270 self.assertNotEqual(a.tobytes(), b.tobytes())
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001271 b.byteswap()
1272 self.assertEqual(a, b)
1273
Neal Norwitz35c6cd02003-05-22 13:29:15 +00001274class FloatTest(FPTest):
1275 typecode = 'f'
1276 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001277tests.append(FloatTest)
1278
1279class DoubleTest(FPTest):
1280 typecode = 'd'
1281 minitemsize = 8
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001282
1283 def test_alloc_overflow(self):
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001284 from sys import maxsize
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001285 a = array.array('d', [-1]*65536)
1286 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001287 a *= maxsize//65536 + 1
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001288 except MemoryError:
1289 pass
1290 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001291 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001292 b = array.array('d', [ 2.71828183, 3.14159265, -1])
1293 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001294 b * (maxsize//3 + 1)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001295 except MemoryError:
1296 pass
1297 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001298 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001299
Walter Dörwald7fd94242003-05-18 00:47:47 +00001300tests.append(DoubleTest)
1301
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001302def test_main(verbose=None):
1303 import sys
1304
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001305 support.run_unittest(*tests)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001306
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001307 # verify reference counting
1308 if verbose and hasattr(sys, "gettotalrefcount"):
1309 import gc
1310 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001311 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001312 support.run_unittest(*tests)
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001313 gc.collect()
1314 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001315 print(counts)
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001316
1317if __name__ == "__main__":
1318 test_main(verbose=True)