blob: 10d99462fd8701491065c7cc1008938f5ab45c2b [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
Stefan Krah650c1e82015-02-03 21:43:23 +01001044 @support.cpython_only
1045 def test_obsolete_write_lock(self):
1046 from _testcapi import getbuffer_with_null_view
1047 a = array.array('B', b"")
1048 self.assertRaises(BufferError, getbuffer_with_null_view, a)
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001049
Walter Dörwald7fd94242003-05-18 00:47:47 +00001050class StringTest(BaseTest):
1051
1052 def test_setitem(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001053 super().test_setitem()
Walter Dörwald7fd94242003-05-18 00:47:47 +00001054 a = array.array(self.typecode, self.example)
1055 self.assertRaises(TypeError, a.__setitem__, 0, self.example[:2])
1056
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001057class UnicodeTest(StringTest, unittest.TestCase):
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001058 typecode = 'u'
1059 example = '\x01\u263a\x00\ufeff'
1060 smallerexample = '\x01\u263a\x00\ufefe'
1061 biggerexample = '\x01\u263a\x01\ufeff'
1062 outside = str('\x33')
Victor Stinner8d4734f2012-08-08 20:09:21 +02001063 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001064
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001065 def test_unicode(self):
1066 self.assertRaises(TypeError, array.array, 'b', 'foo')
Walter Dörwald7fd94242003-05-18 00:47:47 +00001067
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001068 a = array.array('u', '\xa0\xc2\u1234')
1069 a.fromunicode(' ')
1070 a.fromunicode('')
1071 a.fromunicode('')
1072 a.fromunicode('\x11abc\xff\u1234')
1073 s = a.tounicode()
1074 self.assertEqual(s, '\xa0\xc2\u1234 \x11abc\xff\u1234')
Victor Stinner9d512ab2012-08-09 00:43:56 +02001075 self.assertEqual(a.itemsize, sizeof_wchar)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001076
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001077 s = '\x00="\'a\\b\x80\xff\u0000\u0001\u1234'
1078 a = array.array('u', s)
1079 self.assertEqual(
1080 repr(a),
Georg Brandl559e5d72008-06-11 18:37:52 +00001081 "array('u', '\\x00=\"\\'a\\\\b\\x80\xff\\x00\\x01\u1234')")
Walter Dörwald7fd94242003-05-18 00:47:47 +00001082
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001083 self.assertRaises(TypeError, a.fromunicode)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001084
Victor Stinner29ec5952013-02-26 00:27:38 +01001085 def test_issue17223(self):
1086 # this used to crash
Victor Stinnerc472c5d2013-02-26 22:52:11 +01001087 if sizeof_wchar == 4:
1088 # U+FFFFFFFF is an invalid code point in Unicode 6.0
1089 invalid_str = b'\xff\xff\xff\xff'
1090 else:
Victor Stinner29c00342013-03-08 02:33:06 +01001091 # PyUnicode_FromUnicode() cannot fail with 16-bit wchar_t
1092 self.skipTest("specific to 32-bit wchar_t")
Victor Stinnerc472c5d2013-02-26 22:52:11 +01001093 a = array.array('u', invalid_str)
Victor Stinner29ec5952013-02-26 00:27:38 +01001094 self.assertRaises(ValueError, a.tounicode)
1095 self.assertRaises(ValueError, str, a)
1096
Walter Dörwald7fd94242003-05-18 00:47:47 +00001097class NumberTest(BaseTest):
1098
1099 def test_extslice(self):
1100 a = array.array(self.typecode, range(5))
1101 self.assertEqual(a[::], a)
1102 self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
1103 self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
1104 self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
1105 self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
1106 self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
1107 self.assertEqual(a[-100:100:], a)
1108 self.assertEqual(a[100:-100:-1], a[::-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +00001109 self.assertEqual(a[-100:100:2], array.array(self.typecode, [0,2,4]))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001110 self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
1111 self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
1112
1113 def test_delslice(self):
1114 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001115 del a[::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001116 self.assertEqual(a, array.array(self.typecode, [1,3]))
1117 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001118 del a[1::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001119 self.assertEqual(a, array.array(self.typecode, [0,2,4]))
1120 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001121 del a[1::-2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001122 self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
1123 a = array.array(self.typecode, range(10))
Michael W. Hudson56796f62002-07-29 14:35:04 +00001124 del a[::1000]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001125 self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
Mark Dickinsonbc099642010-01-29 17:27:24 +00001126 # test issue7788
1127 a = array.array(self.typecode, range(10))
1128 del a[9::1<<333]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001129
1130 def test_assignment(self):
1131 a = array.array(self.typecode, range(10))
1132 a[::2] = array.array(self.typecode, [42]*5)
1133 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
1134 a = array.array(self.typecode, range(10))
1135 a[::-4] = array.array(self.typecode, [10]*3)
1136 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
1137 a = array.array(self.typecode, range(4))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001138 a[::-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +00001139 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
1140 a = array.array(self.typecode, range(10))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001141 b = a[:]
1142 c = a[:]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001143 ins = array.array(self.typecode, range(2))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001144 a[2:3] = ins
1145 b[slice(2,3)] = ins
1146 c[2:3:] = ins
Fred Drake004d5e62000-10-23 17:22:08 +00001147
Walter Dörwald7fd94242003-05-18 00:47:47 +00001148 def test_iterationcontains(self):
1149 a = array.array(self.typecode, range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +00001150 self.assertEqual(list(a), list(range(10)))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001151 b = array.array(self.typecode, [20])
1152 self.assertEqual(a[-1] in a, True)
1153 self.assertEqual(b[0] not in a, True)
1154
1155 def check_overflow(self, lower, upper):
1156 # method to be used by subclasses
1157
1158 # should not overflow assigning lower limit
1159 a = array.array(self.typecode, [lower])
1160 a[0] = lower
1161 # should overflow assigning less than lower limit
1162 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
1163 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
1164 # should not overflow assigning upper limit
1165 a = array.array(self.typecode, [upper])
1166 a[0] = upper
1167 # should overflow assigning more than upper limit
1168 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
1169 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
1170
1171 def test_subclassing(self):
1172 typecode = self.typecode
1173 class ExaggeratingArray(array.array):
1174 __slots__ = ['offset']
1175
1176 def __new__(cls, typecode, data, offset):
1177 return array.array.__new__(cls, typecode, data)
1178
1179 def __init__(self, typecode, data, offset):
1180 self.offset = offset
1181
1182 def __getitem__(self, i):
1183 return array.array.__getitem__(self, i) + self.offset
1184
1185 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
1186 self.assertEntryEqual(a[0], 7)
1187
1188 self.assertRaises(AttributeError, setattr, a, "color", "blue")
1189
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00001190 def test_frombytearray(self):
1191 a = array.array('b', range(10))
1192 b = array.array(self.typecode, a)
1193 self.assertEqual(a, b)
1194
Walter Dörwald7fd94242003-05-18 00:47:47 +00001195class SignedNumberTest(NumberTest):
1196 example = [-1, 0, 1, 42, 0x7f]
1197 smallerexample = [-1, 0, 1, 42, 0x7e]
1198 biggerexample = [-1, 0, 1, 43, 0x7f]
1199 outside = 23
1200
1201 def test_overflow(self):
1202 a = array.array(self.typecode)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001203 lower = -1 * int(pow(2, a.itemsize * 8 - 1))
1204 upper = int(pow(2, a.itemsize * 8 - 1)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001205 self.check_overflow(lower, upper)
1206
1207class UnsignedNumberTest(NumberTest):
1208 example = [0, 1, 17, 23, 42, 0xff]
1209 smallerexample = [0, 1, 17, 23, 42, 0xfe]
1210 biggerexample = [0, 1, 17, 23, 43, 0xff]
1211 outside = 0xaa
1212
1213 def test_overflow(self):
1214 a = array.array(self.typecode)
1215 lower = 0
Guido van Rossume2a383d2007-01-15 16:59:06 +00001216 upper = int(pow(2, a.itemsize * 8)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001217 self.check_overflow(lower, upper)
Fred Drake004d5e62000-10-23 17:22:08 +00001218
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001219 def test_bytes_extend(self):
1220 s = bytes(self.example)
1221
1222 a = array.array(self.typecode, self.example)
1223 a.extend(s)
1224 self.assertEqual(
1225 a,
1226 array.array(self.typecode, self.example+self.example)
1227 )
1228
1229 a = array.array(self.typecode, self.example)
1230 a.extend(bytearray(reversed(s)))
1231 self.assertEqual(
1232 a,
1233 array.array(self.typecode, self.example+self.example[::-1])
1234 )
1235
Fred Drake004d5e62000-10-23 17:22:08 +00001236
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001237class ByteTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001238 typecode = 'b'
1239 minitemsize = 1
Fred Drake004d5e62000-10-23 17:22:08 +00001240
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001241class UnsignedByteTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001242 typecode = 'B'
1243 minitemsize = 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001244
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001245class ShortTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001246 typecode = 'h'
1247 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001248
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001249class UnsignedShortTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001250 typecode = 'H'
1251 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001252
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001253class IntTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001254 typecode = 'i'
1255 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001256
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001257class UnsignedIntTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001258 typecode = 'I'
1259 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001260
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001261class LongTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001262 typecode = 'l'
1263 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001264
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001265class UnsignedLongTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001266 typecode = 'L'
1267 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001268
Meador Inge1c9f0c92011-09-20 19:55:51 -05001269@unittest.skipIf(not have_long_long, 'need long long support')
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001270class LongLongTest(SignedNumberTest, unittest.TestCase):
Meador Inge1c9f0c92011-09-20 19:55:51 -05001271 typecode = 'q'
1272 minitemsize = 8
Meador Inge1c9f0c92011-09-20 19:55:51 -05001273
1274@unittest.skipIf(not have_long_long, 'need long long support')
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001275class UnsignedLongLongTest(UnsignedNumberTest, unittest.TestCase):
Meador Inge1c9f0c92011-09-20 19:55:51 -05001276 typecode = 'Q'
1277 minitemsize = 8
Meador Inge1c9f0c92011-09-20 19:55:51 -05001278
Walter Dörwald7fd94242003-05-18 00:47:47 +00001279class FPTest(NumberTest):
1280 example = [-42.0, 0, 42, 1e5, -1e10]
1281 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
1282 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
1283 outside = 23
1284
1285 def assertEntryEqual(self, entry1, entry2):
1286 self.assertAlmostEqual(entry1, entry2)
1287
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001288 def test_byteswap(self):
1289 a = array.array(self.typecode, self.example)
1290 self.assertRaises(TypeError, a.byteswap, 42)
1291 if a.itemsize in (1, 2, 4, 8):
1292 b = array.array(self.typecode, self.example)
1293 b.byteswap()
1294 if a.itemsize==1:
1295 self.assertEqual(a, b)
1296 else:
1297 # On alphas treating the byte swapped bit patters as
1298 # floats/doubles results in floating point exceptions
1299 # => compare the 8bit string values instead
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001300 self.assertNotEqual(a.tobytes(), b.tobytes())
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001301 b.byteswap()
1302 self.assertEqual(a, b)
1303
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001304class FloatTest(FPTest, unittest.TestCase):
Neal Norwitz35c6cd02003-05-22 13:29:15 +00001305 typecode = 'f'
1306 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001307
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001308class DoubleTest(FPTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001309 typecode = 'd'
1310 minitemsize = 8
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001311
1312 def test_alloc_overflow(self):
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001313 from sys import maxsize
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001314 a = array.array('d', [-1]*65536)
1315 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001316 a *= maxsize//65536 + 1
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001317 except MemoryError:
1318 pass
1319 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001320 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001321 b = array.array('d', [ 2.71828183, 3.14159265, -1])
1322 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001323 b * (maxsize//3 + 1)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001324 except MemoryError:
1325 pass
1326 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001327 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001328
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001329
1330if __name__ == "__main__":
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001331 unittest.main()