blob: adb0fd37ccff7c16a6594b98ff9b4923b76a6c4d [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
Benjamin Petersonee8712c2008-05-20 21:35:26 +00006from test import support
Alexandre Vassalottiad077152009-07-15 17:49:23 +00007import weakref
8import pickle
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00009import operator
Alexandre Vassalottiad077152009-07-15 17:49:23 +000010import io
11import math
12import struct
Serhiy Storchaka43767632013-11-03 21:31:38 +020013import sys
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +000014import warnings
Alexandre Vassalottiad077152009-07-15 17:49:23 +000015
16import array
17from array import _array_reconstructor as array_reconstructor
18
Meador Inge1c9f0c92011-09-20 19:55:51 -050019try:
20 # Try to determine availability of long long independently
21 # of the array module under test
22 struct.calcsize('@q')
23 have_long_long = True
24except struct.error:
25 have_long_long = False
Raymond Hettingerb0900e62004-12-16 16:23:40 +000026
Victor Stinner29c00342013-03-08 02:33:06 +010027sizeof_wchar = array.array('u').itemsize
Victor Stinnerc472c5d2013-02-26 22:52:11 +010028
29
Raymond Hettingerb0900e62004-12-16 16:23:40 +000030class ArraySubclass(array.array):
31 pass
Guido van Rossumc9f8f141997-04-09 20:51:54 +000032
Thomas Woutersb2137042007-02-01 18:02:27 +000033class ArraySubclassWithKwargs(array.array):
34 def __init__(self, typecode, newarg=None):
Victor Stinner7a6a0092011-01-04 00:04:44 +000035 array.array.__init__(self)
Thomas Woutersb2137042007-02-01 18:02:27 +000036
Guido van Rossum31f72d72007-06-18 18:44:28 +000037typecodes = "ubBhHiIlLfd"
Meador Inge1c9f0c92011-09-20 19:55:51 -050038if have_long_long:
39 typecodes += 'qQ'
Martin v. Löwis99866332002-03-01 10:27:01 +000040
Walter Dörwald7fd94242003-05-18 00:47:47 +000041class BadConstructorTest(unittest.TestCase):
Martin v. Löwis99866332002-03-01 10:27:01 +000042
Walter Dörwald7fd94242003-05-18 00:47:47 +000043 def test_constructor(self):
44 self.assertRaises(TypeError, array.array)
45 self.assertRaises(TypeError, array.array, spam=42)
46 self.assertRaises(TypeError, array.array, 'xx')
47 self.assertRaises(ValueError, array.array, 'x')
Martin v. Löwis99866332002-03-01 10:27:01 +000048
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
Ezio Melotti1d3e96d2013-01-10 06:04:50 +0200178class BaseTest:
Walter Dörwald7fd94242003-05-18 00:47:47 +0000179 # Required class attributes (provided by subclasses
180 # typecode: the typecode to test
181 # example: an initializer usable in the constructor for this type
182 # smallerexample: the same length as example, but smaller
183 # biggerexample: the same length as example, but bigger
184 # outside: An entry that is not in example
185 # minitemsize: the minimum guaranteed itemsize
Martin v. Löwis99866332002-03-01 10:27:01 +0000186
Walter Dörwald7fd94242003-05-18 00:47:47 +0000187 def assertEntryEqual(self, entry1, entry2):
188 self.assertEqual(entry1, entry2)
Martin v. Löwis99866332002-03-01 10:27:01 +0000189
Walter Dörwald7fd94242003-05-18 00:47:47 +0000190 def badtypecode(self):
191 # Return a typecode that is different from our own
192 return typecodes[(typecodes.index(self.typecode)+1) % len(typecodes)]
Martin v. Löwis99866332002-03-01 10:27:01 +0000193
Walter Dörwald7fd94242003-05-18 00:47:47 +0000194 def test_constructor(self):
195 a = array.array(self.typecode)
196 self.assertEqual(a.typecode, self.typecode)
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200197 self.assertGreaterEqual(a.itemsize, self.minitemsize)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000198 self.assertRaises(TypeError, array.array, self.typecode, None)
Martin v. Löwis99866332002-03-01 10:27:01 +0000199
Walter Dörwald7fd94242003-05-18 00:47:47 +0000200 def test_len(self):
201 a = array.array(self.typecode)
202 a.append(self.example[0])
203 self.assertEqual(len(a), 1)
Martin v. Löwis99866332002-03-01 10:27:01 +0000204
Walter Dörwald7fd94242003-05-18 00:47:47 +0000205 a = array.array(self.typecode, self.example)
206 self.assertEqual(len(a), len(self.example))
Martin v. Löwis99866332002-03-01 10:27:01 +0000207
Walter Dörwald7fd94242003-05-18 00:47:47 +0000208 def test_buffer_info(self):
209 a = array.array(self.typecode, self.example)
210 self.assertRaises(TypeError, a.buffer_info, 42)
211 bi = a.buffer_info()
Ezio Melottie9615932010-01-24 19:26:24 +0000212 self.assertIsInstance(bi, tuple)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000213 self.assertEqual(len(bi), 2)
Ezio Melottie9615932010-01-24 19:26:24 +0000214 self.assertIsInstance(bi[0], int)
215 self.assertIsInstance(bi[1], int)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000216 self.assertEqual(bi[1], len(a))
Martin v. Löwis99866332002-03-01 10:27:01 +0000217
Walter Dörwald7fd94242003-05-18 00:47:47 +0000218 def test_byteswap(self):
Victor Stinner8dba4e02011-09-30 00:51:10 +0200219 if self.typecode == 'u':
220 example = '\U00100100'
221 else:
222 example = self.example
223 a = array.array(self.typecode, example)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000224 self.assertRaises(TypeError, a.byteswap, 42)
225 if a.itemsize in (1, 2, 4, 8):
Victor Stinner8dba4e02011-09-30 00:51:10 +0200226 b = array.array(self.typecode, example)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000227 b.byteswap()
228 if a.itemsize==1:
229 self.assertEqual(a, b)
230 else:
231 self.assertNotEqual(a, b)
232 b.byteswap()
233 self.assertEqual(a, b)
Martin v. Löwis99866332002-03-01 10:27:01 +0000234
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000235 def test_copy(self):
236 import copy
237 a = array.array(self.typecode, self.example)
238 b = copy.copy(a)
239 self.assertNotEqual(id(a), id(b))
240 self.assertEqual(a, b)
241
Thomas Wouters89f507f2006-12-13 04:49:30 +0000242 def test_deepcopy(self):
243 import copy
244 a = array.array(self.typecode, self.example)
245 b = copy.deepcopy(a)
246 self.assertNotEqual(id(a), id(b))
247 self.assertEqual(a, b)
248
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000249 def test_reduce_ex(self):
250 a = array.array(self.typecode, self.example)
251 for protocol in range(3):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000252 self.assertIs(a.__reduce_ex__(protocol)[0], array.array)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000253 for protocol in range(3, pickle.HIGHEST_PROTOCOL):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000254 self.assertIs(a.__reduce_ex__(protocol)[0], array_reconstructor)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000255
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000256 def test_pickle(self):
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000257 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000258 a = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000259 b = pickle.loads(pickle.dumps(a, protocol))
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000260 self.assertNotEqual(id(a), id(b))
261 self.assertEqual(a, b)
262
263 a = ArraySubclass(self.typecode, self.example)
264 a.x = 10
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000265 b = pickle.loads(pickle.dumps(a, protocol))
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000266 self.assertNotEqual(id(a), id(b))
267 self.assertEqual(a, b)
268 self.assertEqual(a.x, b.x)
269 self.assertEqual(type(a), type(b))
270
Guido van Rossumd8faa362007-04-27 19:54:29 +0000271 def test_pickle_for_empty_array(self):
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000272 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossumd8faa362007-04-27 19:54:29 +0000273 a = array.array(self.typecode)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000274 b = pickle.loads(pickle.dumps(a, protocol))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000275 self.assertNotEqual(id(a), id(b))
276 self.assertEqual(a, b)
277
278 a = ArraySubclass(self.typecode)
279 a.x = 10
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000280 b = pickle.loads(pickle.dumps(a, protocol))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000281 self.assertNotEqual(id(a), id(b))
282 self.assertEqual(a, b)
283 self.assertEqual(a.x, b.x)
284 self.assertEqual(type(a), type(b))
285
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000286 def test_iterator_pickle(self):
287 data = array.array(self.typecode, self.example)
Serhiy Storchakabad12572014-12-15 14:03:42 +0200288 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
289 orgit = iter(data)
290 d = pickle.dumps(orgit, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000291 it = pickle.loads(d)
Serhiy Storchakabad12572014-12-15 14:03:42 +0200292 self.assertEqual(type(orgit), type(it))
293 self.assertEqual(list(it), list(data))
294
295 if len(data):
296 it = pickle.loads(d)
297 next(it)
298 d = pickle.dumps(it, proto)
299 self.assertEqual(list(it), list(data)[1:])
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000300
Walter Dörwald7fd94242003-05-18 00:47:47 +0000301 def test_insert(self):
302 a = array.array(self.typecode, self.example)
303 a.insert(0, self.example[0])
304 self.assertEqual(len(a), 1+len(self.example))
305 self.assertEqual(a[0], a[1])
306 self.assertRaises(TypeError, a.insert)
307 self.assertRaises(TypeError, a.insert, None)
Walter Dörwaldba39d9c2003-05-18 01:56:25 +0000308 self.assertRaises(TypeError, a.insert, 0, None)
Martin v. Löwis99866332002-03-01 10:27:01 +0000309
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000310 a = array.array(self.typecode, self.example)
311 a.insert(-1, self.example[0])
312 self.assertEqual(
313 a,
314 array.array(
315 self.typecode,
316 self.example[:-1] + self.example[:1] + self.example[-1:]
317 )
318 )
319
320 a = array.array(self.typecode, self.example)
321 a.insert(-1000, self.example[0])
322 self.assertEqual(
323 a,
324 array.array(self.typecode, self.example[:1] + self.example)
325 )
326
327 a = array.array(self.typecode, self.example)
328 a.insert(1000, self.example[0])
329 self.assertEqual(
330 a,
331 array.array(self.typecode, self.example + self.example[:1])
332 )
333
Walter Dörwald7fd94242003-05-18 00:47:47 +0000334 def test_tofromfile(self):
335 a = array.array(self.typecode, 2*self.example)
336 self.assertRaises(TypeError, a.tofile)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000337 support.unlink(support.TESTFN)
338 f = open(support.TESTFN, 'wb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000339 try:
340 a.tofile(f)
341 f.close()
342 b = array.array(self.typecode)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000343 f = open(support.TESTFN, 'rb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000344 self.assertRaises(TypeError, b.fromfile)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000345 b.fromfile(f, len(self.example))
346 self.assertEqual(b, array.array(self.typecode, self.example))
347 self.assertNotEqual(a, b)
Hirokazu Yamamoto54d0df62009-03-06 03:04:07 +0000348 self.assertRaises(EOFError, b.fromfile, f, len(self.example)+1)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000349 self.assertEqual(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000350 f.close()
351 finally:
352 if not f.closed:
353 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000354 support.unlink(support.TESTFN)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000355
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000356 def test_fromfile_ioerror(self):
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200357 # Issue #5395: Check if fromfile raises a proper OSError
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000358 # instead of EOFError.
359 a = array.array(self.typecode)
360 f = open(support.TESTFN, 'wb')
361 try:
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200362 self.assertRaises(OSError, a.fromfile, f, len(self.example))
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000363 finally:
364 f.close()
365 support.unlink(support.TESTFN)
366
Frank Wierzbicki17683432009-08-16 20:30:12 +0000367 def test_filewrite(self):
368 a = array.array(self.typecode, 2*self.example)
369 f = open(support.TESTFN, 'wb')
370 try:
371 f.write(a)
372 f.close()
373 b = array.array(self.typecode)
374 f = open(support.TESTFN, 'rb')
375 b.fromfile(f, len(self.example))
376 self.assertEqual(b, array.array(self.typecode, self.example))
377 self.assertNotEqual(a, b)
378 b.fromfile(f, len(self.example))
379 self.assertEqual(a, b)
380 f.close()
381 finally:
382 if not f.closed:
383 f.close()
384 support.unlink(support.TESTFN)
385
Walter Dörwald7fd94242003-05-18 00:47:47 +0000386 def test_tofromlist(self):
387 a = array.array(self.typecode, 2*self.example)
388 b = array.array(self.typecode)
389 self.assertRaises(TypeError, a.tolist, 42)
390 self.assertRaises(TypeError, b.fromlist)
391 self.assertRaises(TypeError, b.fromlist, 42)
392 self.assertRaises(TypeError, b.fromlist, [None])
393 b.fromlist(a.tolist())
394 self.assertEqual(a, b)
Fred Drake78334472000-06-28 17:50:51 +0000395
Walter Dörwald7fd94242003-05-18 00:47:47 +0000396 def test_tofromstring(self):
Brett Cannon1eb32c22014-10-10 16:26:45 -0400397 # Warnings not raised when arguments are incorrect as Argument Clinic
398 # handles that before the warning can be raised.
399 nb_warnings = 2
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000400 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)
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200447 self.assertIs(a == 42, False)
448 self.assertIs(a != 42, True)
Tim Peterscc78e472000-11-14 21:36:07 +0000449
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200450 self.assertIs(a == a, True)
451 self.assertIs(a != a, False)
452 self.assertIs(a < a, False)
453 self.assertIs(a <= a, True)
454 self.assertIs(a > a, False)
455 self.assertIs(a >= a, 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
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200460 self.assertIs(a == 2*a, False)
461 self.assertIs(a != 2*a, True)
462 self.assertIs(a < 2*a, True)
463 self.assertIs(a <= 2*a, True)
464 self.assertIs(a > 2*a, False)
465 self.assertIs(a >= 2*a, False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000466
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200467 self.assertIs(a == al, False)
468 self.assertIs(a != al, True)
469 self.assertIs(a < al, False)
470 self.assertIs(a <= al, False)
471 self.assertIs(a > al, True)
472 self.assertIs(a >= al, True)
Martin v. Löwis99866332002-03-01 10:27:01 +0000473
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200474 self.assertIs(a == ab, False)
475 self.assertIs(a != ab, True)
476 self.assertIs(a < ab, True)
477 self.assertIs(a <= ab, True)
478 self.assertIs(a > ab, False)
479 self.assertIs(a >= ab, 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)
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200498 self.assertIs(a, 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
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200553 self.assertIs(a, 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
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200560 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000561 self.assertEqual(a, array.array(self.typecode))
562
563 a *= 1000
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200564 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000565 self.assertEqual(a, array.array(self.typecode))
566
567 a *= -1
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200568 self.assertIs(a, 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:
Zachary Ware9fe6d862013-12-08 00:20:35 -0600951 self.skipTest('gc module not available')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000952 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
Serhiy Storchaka43767632013-11-03 21:31:38 +0200999 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
1000 'test needs sys.getrefcount()')
Skip Montanarod5cf0b82003-08-03 23:02:10 +00001001 def test_bug_782369(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +02001002 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
Meador Inge03b4d502012-08-10 22:35:45 -05001019 @support.cpython_only
1020 def test_sizeof_with_buffer(self):
1021 a = array.array(self.typecode, self.example)
Meador Inge80dd1af2012-08-10 23:21:39 -05001022 basesize = support.calcvobjsize('Pn2Pi')
Meador Inge03b4d502012-08-10 22:35:45 -05001023 buffer_size = a.buffer_info()[1] * a.itemsize
1024 support.check_sizeof(self, a, basesize + buffer_size)
1025
1026 @support.cpython_only
1027 def test_sizeof_without_buffer(self):
1028 a = array.array(self.typecode)
Meador Inge80dd1af2012-08-10 23:21:39 -05001029 basesize = support.calcvobjsize('Pn2Pi')
Meador Inge03b4d502012-08-10 22:35:45 -05001030 support.check_sizeof(self, a, basesize)
1031
Alexandre Vassalotti9730e332013-11-29 20:47:15 -08001032 def test_initialize_with_unicode(self):
1033 if self.typecode != 'u':
1034 with self.assertRaises(TypeError) as cm:
1035 a = array.array(self.typecode, 'foo')
1036 self.assertIn("cannot use a str", str(cm.exception))
1037 with self.assertRaises(TypeError) as cm:
1038 a = array.array(self.typecode, array.array('u', 'foo'))
1039 self.assertIn("cannot use a unicode array", str(cm.exception))
1040 else:
1041 a = array.array(self.typecode, "foo")
1042 a = array.array(self.typecode, array.array('u', 'foo'))
1043
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001044
Walter Dörwald7fd94242003-05-18 00:47:47 +00001045class StringTest(BaseTest):
1046
1047 def test_setitem(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001048 super().test_setitem()
Walter Dörwald7fd94242003-05-18 00:47:47 +00001049 a = array.array(self.typecode, self.example)
1050 self.assertRaises(TypeError, a.__setitem__, 0, self.example[:2])
1051
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001052class UnicodeTest(StringTest, unittest.TestCase):
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001053 typecode = 'u'
1054 example = '\x01\u263a\x00\ufeff'
1055 smallerexample = '\x01\u263a\x00\ufefe'
1056 biggerexample = '\x01\u263a\x01\ufeff'
1057 outside = str('\x33')
Victor Stinner8d4734f2012-08-08 20:09:21 +02001058 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001059
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001060 def test_unicode(self):
1061 self.assertRaises(TypeError, array.array, 'b', 'foo')
Walter Dörwald7fd94242003-05-18 00:47:47 +00001062
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001063 a = array.array('u', '\xa0\xc2\u1234')
1064 a.fromunicode(' ')
1065 a.fromunicode('')
1066 a.fromunicode('')
1067 a.fromunicode('\x11abc\xff\u1234')
1068 s = a.tounicode()
1069 self.assertEqual(s, '\xa0\xc2\u1234 \x11abc\xff\u1234')
Victor Stinner9d512ab2012-08-09 00:43:56 +02001070 self.assertEqual(a.itemsize, sizeof_wchar)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001071
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001072 s = '\x00="\'a\\b\x80\xff\u0000\u0001\u1234'
1073 a = array.array('u', s)
1074 self.assertEqual(
1075 repr(a),
Georg Brandl559e5d72008-06-11 18:37:52 +00001076 "array('u', '\\x00=\"\\'a\\\\b\\x80\xff\\x00\\x01\u1234')")
Walter Dörwald7fd94242003-05-18 00:47:47 +00001077
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001078 self.assertRaises(TypeError, a.fromunicode)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001079
Victor Stinner29ec5952013-02-26 00:27:38 +01001080 def test_issue17223(self):
1081 # this used to crash
Victor Stinnerc472c5d2013-02-26 22:52:11 +01001082 if sizeof_wchar == 4:
1083 # U+FFFFFFFF is an invalid code point in Unicode 6.0
1084 invalid_str = b'\xff\xff\xff\xff'
1085 else:
Victor Stinner29c00342013-03-08 02:33:06 +01001086 # PyUnicode_FromUnicode() cannot fail with 16-bit wchar_t
1087 self.skipTest("specific to 32-bit wchar_t")
Victor Stinnerc472c5d2013-02-26 22:52:11 +01001088 a = array.array('u', invalid_str)
Victor Stinner29ec5952013-02-26 00:27:38 +01001089 self.assertRaises(ValueError, a.tounicode)
1090 self.assertRaises(ValueError, str, a)
1091
Walter Dörwald7fd94242003-05-18 00:47:47 +00001092class NumberTest(BaseTest):
1093
1094 def test_extslice(self):
1095 a = array.array(self.typecode, range(5))
1096 self.assertEqual(a[::], a)
1097 self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
1098 self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
1099 self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
1100 self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
1101 self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
1102 self.assertEqual(a[-100:100:], a)
1103 self.assertEqual(a[100:-100:-1], a[::-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +00001104 self.assertEqual(a[-100:100:2], array.array(self.typecode, [0,2,4]))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001105 self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
1106 self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
1107
1108 def test_delslice(self):
1109 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001110 del a[::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001111 self.assertEqual(a, array.array(self.typecode, [1,3]))
1112 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001113 del a[1::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001114 self.assertEqual(a, array.array(self.typecode, [0,2,4]))
1115 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001116 del a[1::-2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001117 self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
1118 a = array.array(self.typecode, range(10))
Michael W. Hudson56796f62002-07-29 14:35:04 +00001119 del a[::1000]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001120 self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
Mark Dickinsonbc099642010-01-29 17:27:24 +00001121 # test issue7788
1122 a = array.array(self.typecode, range(10))
1123 del a[9::1<<333]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001124
1125 def test_assignment(self):
1126 a = array.array(self.typecode, range(10))
1127 a[::2] = array.array(self.typecode, [42]*5)
1128 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
1129 a = array.array(self.typecode, range(10))
1130 a[::-4] = array.array(self.typecode, [10]*3)
1131 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
1132 a = array.array(self.typecode, range(4))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001133 a[::-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +00001134 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
1135 a = array.array(self.typecode, range(10))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001136 b = a[:]
1137 c = a[:]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001138 ins = array.array(self.typecode, range(2))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001139 a[2:3] = ins
1140 b[slice(2,3)] = ins
1141 c[2:3:] = ins
Fred Drake004d5e62000-10-23 17:22:08 +00001142
Walter Dörwald7fd94242003-05-18 00:47:47 +00001143 def test_iterationcontains(self):
1144 a = array.array(self.typecode, range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +00001145 self.assertEqual(list(a), list(range(10)))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001146 b = array.array(self.typecode, [20])
1147 self.assertEqual(a[-1] in a, True)
1148 self.assertEqual(b[0] not in a, True)
1149
1150 def check_overflow(self, lower, upper):
1151 # method to be used by subclasses
1152
1153 # should not overflow assigning lower limit
1154 a = array.array(self.typecode, [lower])
1155 a[0] = lower
1156 # should overflow assigning less than lower limit
1157 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
1158 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
1159 # should not overflow assigning upper limit
1160 a = array.array(self.typecode, [upper])
1161 a[0] = upper
1162 # should overflow assigning more than upper limit
1163 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
1164 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
1165
1166 def test_subclassing(self):
1167 typecode = self.typecode
1168 class ExaggeratingArray(array.array):
1169 __slots__ = ['offset']
1170
1171 def __new__(cls, typecode, data, offset):
1172 return array.array.__new__(cls, typecode, data)
1173
1174 def __init__(self, typecode, data, offset):
1175 self.offset = offset
1176
1177 def __getitem__(self, i):
1178 return array.array.__getitem__(self, i) + self.offset
1179
1180 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
1181 self.assertEntryEqual(a[0], 7)
1182
1183 self.assertRaises(AttributeError, setattr, a, "color", "blue")
1184
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00001185 def test_frombytearray(self):
1186 a = array.array('b', range(10))
1187 b = array.array(self.typecode, a)
1188 self.assertEqual(a, b)
1189
Walter Dörwald7fd94242003-05-18 00:47:47 +00001190class SignedNumberTest(NumberTest):
1191 example = [-1, 0, 1, 42, 0x7f]
1192 smallerexample = [-1, 0, 1, 42, 0x7e]
1193 biggerexample = [-1, 0, 1, 43, 0x7f]
1194 outside = 23
1195
1196 def test_overflow(self):
1197 a = array.array(self.typecode)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001198 lower = -1 * int(pow(2, a.itemsize * 8 - 1))
1199 upper = int(pow(2, a.itemsize * 8 - 1)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001200 self.check_overflow(lower, upper)
1201
1202class UnsignedNumberTest(NumberTest):
1203 example = [0, 1, 17, 23, 42, 0xff]
1204 smallerexample = [0, 1, 17, 23, 42, 0xfe]
1205 biggerexample = [0, 1, 17, 23, 43, 0xff]
1206 outside = 0xaa
1207
1208 def test_overflow(self):
1209 a = array.array(self.typecode)
1210 lower = 0
Guido van Rossume2a383d2007-01-15 16:59:06 +00001211 upper = int(pow(2, a.itemsize * 8)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001212 self.check_overflow(lower, upper)
Fred Drake004d5e62000-10-23 17:22:08 +00001213
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001214 def test_bytes_extend(self):
1215 s = bytes(self.example)
1216
1217 a = array.array(self.typecode, self.example)
1218 a.extend(s)
1219 self.assertEqual(
1220 a,
1221 array.array(self.typecode, self.example+self.example)
1222 )
1223
1224 a = array.array(self.typecode, self.example)
1225 a.extend(bytearray(reversed(s)))
1226 self.assertEqual(
1227 a,
1228 array.array(self.typecode, self.example+self.example[::-1])
1229 )
1230
Fred Drake004d5e62000-10-23 17:22:08 +00001231
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001232class ByteTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001233 typecode = 'b'
1234 minitemsize = 1
Fred Drake004d5e62000-10-23 17:22:08 +00001235
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001236class UnsignedByteTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001237 typecode = 'B'
1238 minitemsize = 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001239
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001240class ShortTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001241 typecode = 'h'
1242 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001243
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001244class UnsignedShortTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001245 typecode = 'H'
1246 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001247
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001248class IntTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001249 typecode = 'i'
1250 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001251
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001252class UnsignedIntTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001253 typecode = 'I'
1254 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001255
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001256class LongTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001257 typecode = 'l'
1258 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001259
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001260class UnsignedLongTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001261 typecode = 'L'
1262 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001263
Meador Inge1c9f0c92011-09-20 19:55:51 -05001264@unittest.skipIf(not have_long_long, 'need long long support')
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001265class LongLongTest(SignedNumberTest, unittest.TestCase):
Meador Inge1c9f0c92011-09-20 19:55:51 -05001266 typecode = 'q'
1267 minitemsize = 8
Meador Inge1c9f0c92011-09-20 19:55:51 -05001268
1269@unittest.skipIf(not have_long_long, 'need long long support')
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001270class UnsignedLongLongTest(UnsignedNumberTest, unittest.TestCase):
Meador Inge1c9f0c92011-09-20 19:55:51 -05001271 typecode = 'Q'
1272 minitemsize = 8
Meador Inge1c9f0c92011-09-20 19:55:51 -05001273
Walter Dörwald7fd94242003-05-18 00:47:47 +00001274class FPTest(NumberTest):
1275 example = [-42.0, 0, 42, 1e5, -1e10]
1276 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
1277 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
1278 outside = 23
1279
1280 def assertEntryEqual(self, entry1, entry2):
1281 self.assertAlmostEqual(entry1, entry2)
1282
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001283 def test_byteswap(self):
1284 a = array.array(self.typecode, self.example)
1285 self.assertRaises(TypeError, a.byteswap, 42)
1286 if a.itemsize in (1, 2, 4, 8):
1287 b = array.array(self.typecode, self.example)
1288 b.byteswap()
1289 if a.itemsize==1:
1290 self.assertEqual(a, b)
1291 else:
1292 # On alphas treating the byte swapped bit patters as
1293 # floats/doubles results in floating point exceptions
1294 # => compare the 8bit string values instead
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001295 self.assertNotEqual(a.tobytes(), b.tobytes())
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001296 b.byteswap()
1297 self.assertEqual(a, b)
1298
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001299class FloatTest(FPTest, unittest.TestCase):
Neal Norwitz35c6cd02003-05-22 13:29:15 +00001300 typecode = 'f'
1301 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001302
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001303class DoubleTest(FPTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001304 typecode = 'd'
1305 minitemsize = 8
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001306
1307 def test_alloc_overflow(self):
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001308 from sys import maxsize
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001309 a = array.array('d', [-1]*65536)
1310 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001311 a *= maxsize//65536 + 1
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001312 except MemoryError:
1313 pass
1314 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001315 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001316 b = array.array('d', [ 2.71828183, 3.14159265, -1])
1317 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001318 b * (maxsize//3 + 1)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001319 except MemoryError:
1320 pass
1321 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001322 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001323
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001324
1325if __name__ == "__main__":
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001326 unittest.main()