blob: 28c83fd102a768fcda62bd56bf2e19de6d194c3b [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)
288 orgit = iter(data)
289 d = pickle.dumps(orgit)
290 it = pickle.loads(d)
291 self.assertEqual(type(orgit), type(it))
292 self.assertEqual(list(it), list(data))
293
294 if len(data):
295 it = pickle.loads(d)
296 next(it)
297 d = pickle.dumps(it)
298 self.assertEqual(list(it), list(data)[1:])
299
Walter Dörwald7fd94242003-05-18 00:47:47 +0000300 def test_insert(self):
301 a = array.array(self.typecode, self.example)
302 a.insert(0, self.example[0])
303 self.assertEqual(len(a), 1+len(self.example))
304 self.assertEqual(a[0], a[1])
305 self.assertRaises(TypeError, a.insert)
306 self.assertRaises(TypeError, a.insert, None)
Walter Dörwaldba39d9c2003-05-18 01:56:25 +0000307 self.assertRaises(TypeError, a.insert, 0, None)
Martin v. Löwis99866332002-03-01 10:27:01 +0000308
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000309 a = array.array(self.typecode, self.example)
310 a.insert(-1, self.example[0])
311 self.assertEqual(
312 a,
313 array.array(
314 self.typecode,
315 self.example[:-1] + self.example[:1] + self.example[-1:]
316 )
317 )
318
319 a = array.array(self.typecode, self.example)
320 a.insert(-1000, self.example[0])
321 self.assertEqual(
322 a,
323 array.array(self.typecode, self.example[:1] + self.example)
324 )
325
326 a = array.array(self.typecode, self.example)
327 a.insert(1000, self.example[0])
328 self.assertEqual(
329 a,
330 array.array(self.typecode, self.example + self.example[:1])
331 )
332
Walter Dörwald7fd94242003-05-18 00:47:47 +0000333 def test_tofromfile(self):
334 a = array.array(self.typecode, 2*self.example)
335 self.assertRaises(TypeError, a.tofile)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000336 support.unlink(support.TESTFN)
337 f = open(support.TESTFN, 'wb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000338 try:
339 a.tofile(f)
340 f.close()
341 b = array.array(self.typecode)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000342 f = open(support.TESTFN, 'rb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000343 self.assertRaises(TypeError, b.fromfile)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000344 b.fromfile(f, len(self.example))
345 self.assertEqual(b, array.array(self.typecode, self.example))
346 self.assertNotEqual(a, b)
Hirokazu Yamamoto54d0df62009-03-06 03:04:07 +0000347 self.assertRaises(EOFError, b.fromfile, f, len(self.example)+1)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000348 self.assertEqual(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000349 f.close()
350 finally:
351 if not f.closed:
352 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000353 support.unlink(support.TESTFN)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000354
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000355 def test_fromfile_ioerror(self):
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200356 # Issue #5395: Check if fromfile raises a proper OSError
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000357 # instead of EOFError.
358 a = array.array(self.typecode)
359 f = open(support.TESTFN, 'wb')
360 try:
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200361 self.assertRaises(OSError, a.fromfile, f, len(self.example))
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000362 finally:
363 f.close()
364 support.unlink(support.TESTFN)
365
Frank Wierzbicki17683432009-08-16 20:30:12 +0000366 def test_filewrite(self):
367 a = array.array(self.typecode, 2*self.example)
368 f = open(support.TESTFN, 'wb')
369 try:
370 f.write(a)
371 f.close()
372 b = array.array(self.typecode)
373 f = open(support.TESTFN, 'rb')
374 b.fromfile(f, len(self.example))
375 self.assertEqual(b, array.array(self.typecode, self.example))
376 self.assertNotEqual(a, b)
377 b.fromfile(f, len(self.example))
378 self.assertEqual(a, b)
379 f.close()
380 finally:
381 if not f.closed:
382 f.close()
383 support.unlink(support.TESTFN)
384
Walter Dörwald7fd94242003-05-18 00:47:47 +0000385 def test_tofromlist(self):
386 a = array.array(self.typecode, 2*self.example)
387 b = array.array(self.typecode)
388 self.assertRaises(TypeError, a.tolist, 42)
389 self.assertRaises(TypeError, b.fromlist)
390 self.assertRaises(TypeError, b.fromlist, 42)
391 self.assertRaises(TypeError, b.fromlist, [None])
392 b.fromlist(a.tolist())
393 self.assertEqual(a, b)
Fred Drake78334472000-06-28 17:50:51 +0000394
Walter Dörwald7fd94242003-05-18 00:47:47 +0000395 def test_tofromstring(self):
Brett Cannon1eb32c22014-10-10 16:26:45 -0400396 # Warnings not raised when arguments are incorrect as Argument Clinic
397 # handles that before the warning can be raised.
398 nb_warnings = 2
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000399 with warnings.catch_warnings(record=True) as r:
400 warnings.filterwarnings("always",
401 message=r"(to|from)string\(\) is deprecated",
402 category=DeprecationWarning)
403 a = array.array(self.typecode, 2*self.example)
404 b = array.array(self.typecode)
405 self.assertRaises(TypeError, a.tostring, 42)
406 self.assertRaises(TypeError, b.fromstring)
407 self.assertRaises(TypeError, b.fromstring, 42)
408 b.fromstring(a.tostring())
409 self.assertEqual(a, b)
410 if a.itemsize>1:
411 self.assertRaises(ValueError, b.fromstring, "x")
412 nb_warnings += 1
413 self.assertEqual(len(r), nb_warnings)
414
415 def test_tofrombytes(self):
Walter Dörwald7fd94242003-05-18 00:47:47 +0000416 a = array.array(self.typecode, 2*self.example)
417 b = array.array(self.typecode)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000418 self.assertRaises(TypeError, a.tobytes, 42)
419 self.assertRaises(TypeError, b.frombytes)
420 self.assertRaises(TypeError, b.frombytes, 42)
421 b.frombytes(a.tobytes())
422 c = array.array(self.typecode, bytearray(a.tobytes()))
Walter Dörwald7fd94242003-05-18 00:47:47 +0000423 self.assertEqual(a, b)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000424 self.assertEqual(a, c)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000425 if a.itemsize>1:
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000426 self.assertRaises(ValueError, b.frombytes, b"x")
Fred Drake78334472000-06-28 17:50:51 +0000427
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +0000428 def test_fromarray(self):
429 a = array.array(self.typecode, self.example)
430 b = array.array(self.typecode, a)
431 self.assertEqual(a, b)
432
Walter Dörwald7fd94242003-05-18 00:47:47 +0000433 def test_repr(self):
434 a = array.array(self.typecode, 2*self.example)
435 self.assertEqual(a, eval(repr(a), {"array": array.array}))
Fred Drake78334472000-06-28 17:50:51 +0000436
Walter Dörwald7fd94242003-05-18 00:47:47 +0000437 a = array.array(self.typecode)
438 self.assertEqual(repr(a), "array('%s')" % self.typecode)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000439
Walter Dörwald7fd94242003-05-18 00:47:47 +0000440 def test_str(self):
441 a = array.array(self.typecode, 2*self.example)
442 str(a)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000443
Walter Dörwald7fd94242003-05-18 00:47:47 +0000444 def test_cmp(self):
445 a = array.array(self.typecode, self.example)
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200446 self.assertIs(a == 42, False)
447 self.assertIs(a != 42, True)
Tim Peterscc78e472000-11-14 21:36:07 +0000448
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200449 self.assertIs(a == a, True)
450 self.assertIs(a != a, False)
451 self.assertIs(a < a, False)
452 self.assertIs(a <= a, True)
453 self.assertIs(a > a, False)
454 self.assertIs(a >= a, True)
Tim Peterscc78e472000-11-14 21:36:07 +0000455
Neal Norwitzbd2835c2006-03-17 08:54:15 +0000456 al = array.array(self.typecode, self.smallerexample)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000457 ab = array.array(self.typecode, self.biggerexample)
Guido van Rossum7f1d3aa1998-07-16 15:31:43 +0000458
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200459 self.assertIs(a == 2*a, False)
460 self.assertIs(a != 2*a, True)
461 self.assertIs(a < 2*a, True)
462 self.assertIs(a <= 2*a, True)
463 self.assertIs(a > 2*a, False)
464 self.assertIs(a >= 2*a, False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000465
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200466 self.assertIs(a == al, False)
467 self.assertIs(a != al, True)
468 self.assertIs(a < al, False)
469 self.assertIs(a <= al, False)
470 self.assertIs(a > al, True)
471 self.assertIs(a >= al, True)
Martin v. Löwis99866332002-03-01 10:27:01 +0000472
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200473 self.assertIs(a == ab, False)
474 self.assertIs(a != ab, True)
475 self.assertIs(a < ab, True)
476 self.assertIs(a <= ab, True)
477 self.assertIs(a > ab, False)
478 self.assertIs(a >= ab, False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000479
Walter Dörwald7fd94242003-05-18 00:47:47 +0000480 def test_add(self):
481 a = array.array(self.typecode, self.example) \
482 + array.array(self.typecode, self.example[::-1])
483 self.assertEqual(
484 a,
485 array.array(self.typecode, self.example + self.example[::-1])
486 )
Martin v. Löwis99866332002-03-01 10:27:01 +0000487
Walter Dörwald7fd94242003-05-18 00:47:47 +0000488 b = array.array(self.badtypecode())
489 self.assertRaises(TypeError, a.__add__, b)
490
491 self.assertRaises(TypeError, a.__add__, "bad")
492
493 def test_iadd(self):
494 a = array.array(self.typecode, self.example[::-1])
495 b = a
496 a += array.array(self.typecode, 2*self.example)
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200497 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000498 self.assertEqual(
499 a,
500 array.array(self.typecode, self.example[::-1]+2*self.example)
501 )
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000502 a = array.array(self.typecode, self.example)
503 a += a
504 self.assertEqual(
505 a,
506 array.array(self.typecode, self.example + self.example)
507 )
Walter Dörwald7fd94242003-05-18 00:47:47 +0000508
509 b = array.array(self.badtypecode())
510 self.assertRaises(TypeError, a.__add__, b)
511
512 self.assertRaises(TypeError, a.__iadd__, "bad")
513
514 def test_mul(self):
515 a = 5*array.array(self.typecode, self.example)
516 self.assertEqual(
517 a,
518 array.array(self.typecode, 5*self.example)
519 )
520
521 a = array.array(self.typecode, self.example)*5
522 self.assertEqual(
523 a,
524 array.array(self.typecode, self.example*5)
525 )
526
527 a = 0*array.array(self.typecode, self.example)
528 self.assertEqual(
529 a,
530 array.array(self.typecode)
531 )
532
533 a = (-1)*array.array(self.typecode, self.example)
534 self.assertEqual(
535 a,
536 array.array(self.typecode)
537 )
538
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000539 a = 5 * array.array(self.typecode, self.example[:1])
540 self.assertEqual(
541 a,
542 array.array(self.typecode, [a[0]] * 5)
543 )
544
Walter Dörwald7fd94242003-05-18 00:47:47 +0000545 self.assertRaises(TypeError, a.__mul__, "bad")
546
547 def test_imul(self):
548 a = array.array(self.typecode, self.example)
549 b = a
550
551 a *= 5
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200552 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000553 self.assertEqual(
554 a,
555 array.array(self.typecode, 5*self.example)
556 )
557
558 a *= 0
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200559 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000560 self.assertEqual(a, array.array(self.typecode))
561
562 a *= 1000
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200563 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000564 self.assertEqual(a, array.array(self.typecode))
565
566 a *= -1
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200567 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000568 self.assertEqual(a, array.array(self.typecode))
569
570 a = array.array(self.typecode, self.example)
571 a *= -1
572 self.assertEqual(a, array.array(self.typecode))
573
574 self.assertRaises(TypeError, a.__imul__, "bad")
575
576 def test_getitem(self):
577 a = array.array(self.typecode, self.example)
578 self.assertEntryEqual(a[0], self.example[0])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000579 self.assertEntryEqual(a[0], self.example[0])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000580 self.assertEntryEqual(a[-1], self.example[-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000581 self.assertEntryEqual(a[-1], self.example[-1])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000582 self.assertEntryEqual(a[len(self.example)-1], self.example[-1])
583 self.assertEntryEqual(a[-len(self.example)], self.example[0])
584 self.assertRaises(TypeError, a.__getitem__)
585 self.assertRaises(IndexError, a.__getitem__, len(self.example))
586 self.assertRaises(IndexError, a.__getitem__, -len(self.example)-1)
587
588 def test_setitem(self):
589 a = array.array(self.typecode, self.example)
590 a[0] = a[-1]
591 self.assertEntryEqual(a[0], a[-1])
592
593 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000594 a[0] = a[-1]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000595 self.assertEntryEqual(a[0], a[-1])
596
597 a = array.array(self.typecode, self.example)
598 a[-1] = a[0]
599 self.assertEntryEqual(a[0], a[-1])
600
601 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000602 a[-1] = a[0]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000603 self.assertEntryEqual(a[0], a[-1])
604
605 a = array.array(self.typecode, self.example)
606 a[len(self.example)-1] = a[0]
607 self.assertEntryEqual(a[0], a[-1])
608
609 a = array.array(self.typecode, self.example)
610 a[-len(self.example)] = a[-1]
611 self.assertEntryEqual(a[0], a[-1])
612
613 self.assertRaises(TypeError, a.__setitem__)
614 self.assertRaises(TypeError, a.__setitem__, None)
615 self.assertRaises(TypeError, a.__setitem__, 0, None)
616 self.assertRaises(
617 IndexError,
618 a.__setitem__,
619 len(self.example), self.example[0]
620 )
621 self.assertRaises(
622 IndexError,
623 a.__setitem__,
624 -len(self.example)-1, self.example[0]
625 )
626
627 def test_delitem(self):
628 a = array.array(self.typecode, self.example)
629 del a[0]
630 self.assertEqual(
631 a,
632 array.array(self.typecode, self.example[1:])
633 )
634
635 a = array.array(self.typecode, self.example)
636 del a[-1]
637 self.assertEqual(
638 a,
639 array.array(self.typecode, self.example[:-1])
640 )
641
642 a = array.array(self.typecode, self.example)
643 del a[len(self.example)-1]
644 self.assertEqual(
645 a,
646 array.array(self.typecode, self.example[:-1])
647 )
648
649 a = array.array(self.typecode, self.example)
650 del a[-len(self.example)]
651 self.assertEqual(
652 a,
653 array.array(self.typecode, self.example[1:])
654 )
655
656 self.assertRaises(TypeError, a.__delitem__)
657 self.assertRaises(TypeError, a.__delitem__, None)
658 self.assertRaises(IndexError, a.__delitem__, len(self.example))
659 self.assertRaises(IndexError, a.__delitem__, -len(self.example)-1)
660
661 def test_getslice(self):
662 a = array.array(self.typecode, self.example)
663 self.assertEqual(a[:], a)
664
665 self.assertEqual(
666 a[1:],
667 array.array(self.typecode, self.example[1:])
668 )
669
670 self.assertEqual(
671 a[:1],
672 array.array(self.typecode, self.example[:1])
673 )
674
675 self.assertEqual(
676 a[:-1],
677 array.array(self.typecode, self.example[:-1])
678 )
679
680 self.assertEqual(
681 a[-1:],
682 array.array(self.typecode, self.example[-1:])
683 )
684
685 self.assertEqual(
686 a[-1:-1],
687 array.array(self.typecode)
688 )
689
690 self.assertEqual(
Walter Dörwald1083c242005-01-21 21:16:51 +0000691 a[2:1],
692 array.array(self.typecode)
693 )
694
695 self.assertEqual(
Walter Dörwald7fd94242003-05-18 00:47:47 +0000696 a[1000:],
697 array.array(self.typecode)
698 )
699 self.assertEqual(a[-1000:], a)
700 self.assertEqual(a[:1000], a)
701 self.assertEqual(
702 a[:-1000],
703 array.array(self.typecode)
704 )
705 self.assertEqual(a[-1000:1000], a)
706 self.assertEqual(
707 a[2000:1000],
708 array.array(self.typecode)
709 )
710
Thomas Woutersed03b412007-08-28 21:37:11 +0000711 def test_extended_getslice(self):
712 # Test extended slicing by comparing with list slicing
713 # (Assumes list conversion works correctly, too)
714 a = array.array(self.typecode, self.example)
715 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
716 for start in indices:
717 for stop in indices:
718 # Everything except the initial 0 (invalid step)
719 for step in indices[1:]:
720 self.assertEqual(list(a[start:stop:step]),
721 list(a)[start:stop:step])
722
Walter Dörwald7fd94242003-05-18 00:47:47 +0000723 def test_setslice(self):
724 a = array.array(self.typecode, self.example)
725 a[:1] = a
726 self.assertEqual(
727 a,
728 array.array(self.typecode, self.example + self.example[1:])
729 )
730
731 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000732 a[:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000733 self.assertEqual(
734 a,
735 array.array(self.typecode, self.example + self.example[-1:])
736 )
737
738 a = array.array(self.typecode, self.example)
739 a[-1:] = a
740 self.assertEqual(
741 a,
742 array.array(self.typecode, self.example[:-1] + self.example)
743 )
744
745 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000746 a[1:] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000747 self.assertEqual(
748 a,
749 array.array(self.typecode, self.example[:1] + self.example)
750 )
751
752 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000753 a[1:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000754 self.assertEqual(
755 a,
756 array.array(
757 self.typecode,
758 self.example[:1] + self.example + self.example[-1:]
759 )
760 )
761
762 a = array.array(self.typecode, self.example)
763 a[1000:] = a
764 self.assertEqual(
765 a,
766 array.array(self.typecode, 2*self.example)
767 )
768
769 a = array.array(self.typecode, self.example)
770 a[-1000:] = a
771 self.assertEqual(
772 a,
773 array.array(self.typecode, self.example)
774 )
775
776 a = array.array(self.typecode, self.example)
777 a[:1000] = a
778 self.assertEqual(
779 a,
780 array.array(self.typecode, self.example)
781 )
782
783 a = array.array(self.typecode, self.example)
784 a[:-1000] = a
785 self.assertEqual(
786 a,
787 array.array(self.typecode, 2*self.example)
788 )
789
790 a = array.array(self.typecode, self.example)
791 a[1:0] = a
792 self.assertEqual(
793 a,
794 array.array(self.typecode, self.example[:1] + self.example + self.example[1:])
795 )
796
797 a = array.array(self.typecode, self.example)
798 a[2000:1000] = a
799 self.assertEqual(
800 a,
801 array.array(self.typecode, 2*self.example)
802 )
803
804 a = array.array(self.typecode, self.example)
Thomas Woutersed03b412007-08-28 21:37:11 +0000805 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), None)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000806 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), None)
807
808 b = array.array(self.badtypecode())
Thomas Woutersed03b412007-08-28 21:37:11 +0000809 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000810 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), b)
811
Thomas Woutersed03b412007-08-28 21:37:11 +0000812 def test_extended_set_del_slice(self):
813 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
814 for start in indices:
815 for stop in indices:
816 # Everything except the initial 0 (invalid step)
817 for step in indices[1:]:
818 a = array.array(self.typecode, self.example)
819 L = list(a)
820 # Make sure we have a slice of exactly the right length,
821 # but with (hopefully) different data.
822 data = L[start:stop:step]
823 data.reverse()
824 L[start:stop:step] = data
825 a[start:stop:step] = array.array(self.typecode, data)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000826 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000827
828 del L[start:stop:step]
829 del a[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +0000830 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000831
Walter Dörwald7fd94242003-05-18 00:47:47 +0000832 def test_index(self):
833 example = 2*self.example
834 a = array.array(self.typecode, example)
835 self.assertRaises(TypeError, a.index)
836 for x in example:
837 self.assertEqual(a.index(x), example.index(x))
838 self.assertRaises(ValueError, a.index, None)
839 self.assertRaises(ValueError, a.index, self.outside)
840
841 def test_count(self):
842 example = 2*self.example
843 a = array.array(self.typecode, example)
844 self.assertRaises(TypeError, a.count)
845 for x in example:
846 self.assertEqual(a.count(x), example.count(x))
847 self.assertEqual(a.count(self.outside), 0)
848 self.assertEqual(a.count(None), 0)
849
850 def test_remove(self):
851 for x in self.example:
852 example = 2*self.example
853 a = array.array(self.typecode, example)
854 pos = example.index(x)
855 example2 = example[:pos] + example[pos+1:]
856 a.remove(x)
857 self.assertEqual(a, array.array(self.typecode, example2))
858
859 a = array.array(self.typecode, self.example)
860 self.assertRaises(ValueError, a.remove, self.outside)
861
862 self.assertRaises(ValueError, a.remove, None)
863
864 def test_pop(self):
865 a = array.array(self.typecode)
866 self.assertRaises(IndexError, a.pop)
867
868 a = array.array(self.typecode, 2*self.example)
869 self.assertRaises(TypeError, a.pop, 42, 42)
870 self.assertRaises(TypeError, a.pop, None)
871 self.assertRaises(IndexError, a.pop, len(a))
872 self.assertRaises(IndexError, a.pop, -len(a)-1)
873
874 self.assertEntryEqual(a.pop(0), self.example[0])
875 self.assertEqual(
876 a,
877 array.array(self.typecode, self.example[1:]+self.example)
878 )
879 self.assertEntryEqual(a.pop(1), self.example[2])
880 self.assertEqual(
881 a,
882 array.array(self.typecode, self.example[1:2]+self.example[3:]+self.example)
883 )
884 self.assertEntryEqual(a.pop(0), self.example[1])
885 self.assertEntryEqual(a.pop(), self.example[-1])
886 self.assertEqual(
887 a,
888 array.array(self.typecode, self.example[3:]+self.example[:-1])
889 )
890
891 def test_reverse(self):
892 a = array.array(self.typecode, self.example)
893 self.assertRaises(TypeError, a.reverse, 42)
Fred Drake004d5e62000-10-23 17:22:08 +0000894 a.reverse()
Walter Dörwald7fd94242003-05-18 00:47:47 +0000895 self.assertEqual(
896 a,
897 array.array(self.typecode, self.example[::-1])
898 )
899
900 def test_extend(self):
901 a = array.array(self.typecode, self.example)
902 self.assertRaises(TypeError, a.extend)
903 a.extend(array.array(self.typecode, self.example[::-1]))
904 self.assertEqual(
905 a,
906 array.array(self.typecode, self.example+self.example[::-1])
907 )
908
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000909 a = array.array(self.typecode, self.example)
910 a.extend(a)
911 self.assertEqual(
912 a,
913 array.array(self.typecode, self.example+self.example)
914 )
915
Walter Dörwald7fd94242003-05-18 00:47:47 +0000916 b = array.array(self.badtypecode())
917 self.assertRaises(TypeError, a.extend, b)
918
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000919 a = array.array(self.typecode, self.example)
920 a.extend(self.example[::-1])
921 self.assertEqual(
922 a,
923 array.array(self.typecode, self.example+self.example[::-1])
924 )
925
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +0000926 def test_constructor_with_iterable_argument(self):
927 a = array.array(self.typecode, iter(self.example))
928 b = array.array(self.typecode, self.example)
929 self.assertEqual(a, b)
930
931 # non-iterable argument
932 self.assertRaises(TypeError, array.array, self.typecode, 10)
933
934 # pass through errors raised in __iter__
935 class A:
936 def __iter__(self):
937 raise UnicodeError
938 self.assertRaises(UnicodeError, array.array, self.typecode, A())
939
940 # pass through errors raised in next()
941 def B():
942 raise UnicodeError
943 yield None
944 self.assertRaises(UnicodeError, array.array, self.typecode, B())
945
Walter Dörwald7fd94242003-05-18 00:47:47 +0000946 def test_coveritertraverse(self):
947 try:
948 import gc
949 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -0600950 self.skipTest('gc module not available')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000951 a = array.array(self.typecode)
952 l = [iter(a)]
953 l.append(l)
954 gc.collect()
955
956 def test_buffer(self):
957 a = array.array(self.typecode, self.example)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000958 m = memoryview(a)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000959 expected = m.tobytes()
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000960 self.assertEqual(a.tobytes(), expected)
961 self.assertEqual(a.tobytes()[0], expected[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000962 # Resizing is forbidden when there are buffer exports.
963 # For issue 4509, we also check after each error that
964 # the array was not modified.
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000965 self.assertRaises(BufferError, a.append, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000966 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000967 self.assertRaises(BufferError, a.extend, a[0:1])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000968 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000969 self.assertRaises(BufferError, a.remove, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000970 self.assertEqual(m.tobytes(), expected)
971 self.assertRaises(BufferError, a.pop, 0)
972 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000973 self.assertRaises(BufferError, a.fromlist, a.tolist())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000974 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000975 self.assertRaises(BufferError, a.frombytes, a.tobytes())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000976 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000977 if self.typecode == 'u':
978 self.assertRaises(BufferError, a.fromunicode, a.tounicode())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000979 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +0000980 self.assertRaises(BufferError, operator.imul, a, 2)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000981 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +0000982 self.assertRaises(BufferError, operator.imul, a, 0)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000983 self.assertEqual(m.tobytes(), expected)
984 self.assertRaises(BufferError, operator.setitem, a, slice(0, 0), a)
985 self.assertEqual(m.tobytes(), expected)
986 self.assertRaises(BufferError, operator.delitem, a, 0)
987 self.assertEqual(m.tobytes(), expected)
988 self.assertRaises(BufferError, operator.delitem, a, slice(0, 1))
989 self.assertEqual(m.tobytes(), expected)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000990
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000991 def test_weakref(self):
992 s = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000993 p = weakref.proxy(s)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000994 self.assertEqual(p.tobytes(), s.tobytes())
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000995 s = None
996 self.assertRaises(ReferenceError, len, p)
997
Serhiy Storchaka43767632013-11-03 21:31:38 +0200998 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
999 'test needs sys.getrefcount()')
Skip Montanarod5cf0b82003-08-03 23:02:10 +00001000 def test_bug_782369(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +02001001 for i in range(10):
1002 b = array.array('B', range(64))
1003 rc = sys.getrefcount(10)
1004 for i in range(10):
1005 b = array.array('B', range(64))
1006 self.assertEqual(rc, sys.getrefcount(10))
Skip Montanarod5cf0b82003-08-03 23:02:10 +00001007
Thomas Woutersb2137042007-02-01 18:02:27 +00001008 def test_subclass_with_kwargs(self):
1009 # SF bug #1486663 -- this used to erroneously raise a TypeError
1010 ArraySubclassWithKwargs('b', newarg=1)
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001011
Guido van Rossum6b826ab2007-07-03 16:22:09 +00001012 def test_create_from_bytes(self):
Alexandre Vassalotti7e4f3212009-07-05 05:38:18 +00001013 # XXX This test probably needs to be moved in a subclass or
1014 # generalized to use self.typecode.
Guido van Rossum6b826ab2007-07-03 16:22:09 +00001015 a = array.array('H', b"1234")
1016 self.assertEqual(len(a) * a.itemsize, 4)
1017
Meador Inge03b4d502012-08-10 22:35:45 -05001018 @support.cpython_only
1019 def test_sizeof_with_buffer(self):
1020 a = array.array(self.typecode, self.example)
Meador Inge80dd1af2012-08-10 23:21:39 -05001021 basesize = support.calcvobjsize('Pn2Pi')
Meador Inge03b4d502012-08-10 22:35:45 -05001022 buffer_size = a.buffer_info()[1] * a.itemsize
1023 support.check_sizeof(self, a, basesize + buffer_size)
1024
1025 @support.cpython_only
1026 def test_sizeof_without_buffer(self):
1027 a = array.array(self.typecode)
Meador Inge80dd1af2012-08-10 23:21:39 -05001028 basesize = support.calcvobjsize('Pn2Pi')
Meador Inge03b4d502012-08-10 22:35:45 -05001029 support.check_sizeof(self, a, basesize)
1030
Alexandre Vassalotti9730e332013-11-29 20:47:15 -08001031 def test_initialize_with_unicode(self):
1032 if self.typecode != 'u':
1033 with self.assertRaises(TypeError) as cm:
1034 a = array.array(self.typecode, 'foo')
1035 self.assertIn("cannot use a str", str(cm.exception))
1036 with self.assertRaises(TypeError) as cm:
1037 a = array.array(self.typecode, array.array('u', 'foo'))
1038 self.assertIn("cannot use a unicode array", str(cm.exception))
1039 else:
1040 a = array.array(self.typecode, "foo")
1041 a = array.array(self.typecode, array.array('u', 'foo'))
1042
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001043
Walter Dörwald7fd94242003-05-18 00:47:47 +00001044class StringTest(BaseTest):
1045
1046 def test_setitem(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001047 super().test_setitem()
Walter Dörwald7fd94242003-05-18 00:47:47 +00001048 a = array.array(self.typecode, self.example)
1049 self.assertRaises(TypeError, a.__setitem__, 0, self.example[:2])
1050
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001051class UnicodeTest(StringTest, unittest.TestCase):
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001052 typecode = 'u'
1053 example = '\x01\u263a\x00\ufeff'
1054 smallerexample = '\x01\u263a\x00\ufefe'
1055 biggerexample = '\x01\u263a\x01\ufeff'
1056 outside = str('\x33')
Victor Stinner8d4734f2012-08-08 20:09:21 +02001057 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001058
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001059 def test_unicode(self):
1060 self.assertRaises(TypeError, array.array, 'b', 'foo')
Walter Dörwald7fd94242003-05-18 00:47:47 +00001061
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001062 a = array.array('u', '\xa0\xc2\u1234')
1063 a.fromunicode(' ')
1064 a.fromunicode('')
1065 a.fromunicode('')
1066 a.fromunicode('\x11abc\xff\u1234')
1067 s = a.tounicode()
1068 self.assertEqual(s, '\xa0\xc2\u1234 \x11abc\xff\u1234')
Victor Stinner9d512ab2012-08-09 00:43:56 +02001069 self.assertEqual(a.itemsize, sizeof_wchar)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001070
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001071 s = '\x00="\'a\\b\x80\xff\u0000\u0001\u1234'
1072 a = array.array('u', s)
1073 self.assertEqual(
1074 repr(a),
Georg Brandl559e5d72008-06-11 18:37:52 +00001075 "array('u', '\\x00=\"\\'a\\\\b\\x80\xff\\x00\\x01\u1234')")
Walter Dörwald7fd94242003-05-18 00:47:47 +00001076
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001077 self.assertRaises(TypeError, a.fromunicode)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001078
Victor Stinner29ec5952013-02-26 00:27:38 +01001079 def test_issue17223(self):
1080 # this used to crash
Victor Stinnerc472c5d2013-02-26 22:52:11 +01001081 if sizeof_wchar == 4:
1082 # U+FFFFFFFF is an invalid code point in Unicode 6.0
1083 invalid_str = b'\xff\xff\xff\xff'
1084 else:
Victor Stinner29c00342013-03-08 02:33:06 +01001085 # PyUnicode_FromUnicode() cannot fail with 16-bit wchar_t
1086 self.skipTest("specific to 32-bit wchar_t")
Victor Stinnerc472c5d2013-02-26 22:52:11 +01001087 a = array.array('u', invalid_str)
Victor Stinner29ec5952013-02-26 00:27:38 +01001088 self.assertRaises(ValueError, a.tounicode)
1089 self.assertRaises(ValueError, str, a)
1090
Walter Dörwald7fd94242003-05-18 00:47:47 +00001091class NumberTest(BaseTest):
1092
1093 def test_extslice(self):
1094 a = array.array(self.typecode, range(5))
1095 self.assertEqual(a[::], a)
1096 self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
1097 self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
1098 self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
1099 self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
1100 self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
1101 self.assertEqual(a[-100:100:], a)
1102 self.assertEqual(a[100:-100:-1], a[::-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +00001103 self.assertEqual(a[-100:100:2], array.array(self.typecode, [0,2,4]))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001104 self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
1105 self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
1106
1107 def test_delslice(self):
1108 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001109 del a[::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001110 self.assertEqual(a, array.array(self.typecode, [1,3]))
1111 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001112 del a[1::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001113 self.assertEqual(a, array.array(self.typecode, [0,2,4]))
1114 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001115 del a[1::-2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001116 self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
1117 a = array.array(self.typecode, range(10))
Michael W. Hudson56796f62002-07-29 14:35:04 +00001118 del a[::1000]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001119 self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
Mark Dickinsonbc099642010-01-29 17:27:24 +00001120 # test issue7788
1121 a = array.array(self.typecode, range(10))
1122 del a[9::1<<333]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001123
1124 def test_assignment(self):
1125 a = array.array(self.typecode, range(10))
1126 a[::2] = array.array(self.typecode, [42]*5)
1127 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
1128 a = array.array(self.typecode, range(10))
1129 a[::-4] = array.array(self.typecode, [10]*3)
1130 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
1131 a = array.array(self.typecode, range(4))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001132 a[::-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +00001133 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
1134 a = array.array(self.typecode, range(10))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001135 b = a[:]
1136 c = a[:]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001137 ins = array.array(self.typecode, range(2))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001138 a[2:3] = ins
1139 b[slice(2,3)] = ins
1140 c[2:3:] = ins
Fred Drake004d5e62000-10-23 17:22:08 +00001141
Walter Dörwald7fd94242003-05-18 00:47:47 +00001142 def test_iterationcontains(self):
1143 a = array.array(self.typecode, range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +00001144 self.assertEqual(list(a), list(range(10)))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001145 b = array.array(self.typecode, [20])
1146 self.assertEqual(a[-1] in a, True)
1147 self.assertEqual(b[0] not in a, True)
1148
1149 def check_overflow(self, lower, upper):
1150 # method to be used by subclasses
1151
1152 # should not overflow assigning lower limit
1153 a = array.array(self.typecode, [lower])
1154 a[0] = lower
1155 # should overflow assigning less than lower limit
1156 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
1157 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
1158 # should not overflow assigning upper limit
1159 a = array.array(self.typecode, [upper])
1160 a[0] = upper
1161 # should overflow assigning more than upper limit
1162 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
1163 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
1164
1165 def test_subclassing(self):
1166 typecode = self.typecode
1167 class ExaggeratingArray(array.array):
1168 __slots__ = ['offset']
1169
1170 def __new__(cls, typecode, data, offset):
1171 return array.array.__new__(cls, typecode, data)
1172
1173 def __init__(self, typecode, data, offset):
1174 self.offset = offset
1175
1176 def __getitem__(self, i):
1177 return array.array.__getitem__(self, i) + self.offset
1178
1179 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
1180 self.assertEntryEqual(a[0], 7)
1181
1182 self.assertRaises(AttributeError, setattr, a, "color", "blue")
1183
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00001184 def test_frombytearray(self):
1185 a = array.array('b', range(10))
1186 b = array.array(self.typecode, a)
1187 self.assertEqual(a, b)
1188
Walter Dörwald7fd94242003-05-18 00:47:47 +00001189class SignedNumberTest(NumberTest):
1190 example = [-1, 0, 1, 42, 0x7f]
1191 smallerexample = [-1, 0, 1, 42, 0x7e]
1192 biggerexample = [-1, 0, 1, 43, 0x7f]
1193 outside = 23
1194
1195 def test_overflow(self):
1196 a = array.array(self.typecode)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001197 lower = -1 * int(pow(2, a.itemsize * 8 - 1))
1198 upper = int(pow(2, a.itemsize * 8 - 1)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001199 self.check_overflow(lower, upper)
1200
1201class UnsignedNumberTest(NumberTest):
1202 example = [0, 1, 17, 23, 42, 0xff]
1203 smallerexample = [0, 1, 17, 23, 42, 0xfe]
1204 biggerexample = [0, 1, 17, 23, 43, 0xff]
1205 outside = 0xaa
1206
1207 def test_overflow(self):
1208 a = array.array(self.typecode)
1209 lower = 0
Guido van Rossume2a383d2007-01-15 16:59:06 +00001210 upper = int(pow(2, a.itemsize * 8)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001211 self.check_overflow(lower, upper)
Fred Drake004d5e62000-10-23 17:22:08 +00001212
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001213 def test_bytes_extend(self):
1214 s = bytes(self.example)
1215
1216 a = array.array(self.typecode, self.example)
1217 a.extend(s)
1218 self.assertEqual(
1219 a,
1220 array.array(self.typecode, self.example+self.example)
1221 )
1222
1223 a = array.array(self.typecode, self.example)
1224 a.extend(bytearray(reversed(s)))
1225 self.assertEqual(
1226 a,
1227 array.array(self.typecode, self.example+self.example[::-1])
1228 )
1229
Fred Drake004d5e62000-10-23 17:22:08 +00001230
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001231class ByteTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001232 typecode = 'b'
1233 minitemsize = 1
Fred Drake004d5e62000-10-23 17:22:08 +00001234
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001235class UnsignedByteTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001236 typecode = 'B'
1237 minitemsize = 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001238
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001239class ShortTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001240 typecode = 'h'
1241 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001242
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001243class UnsignedShortTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001244 typecode = 'H'
1245 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001246
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001247class IntTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001248 typecode = 'i'
1249 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001250
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001251class UnsignedIntTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001252 typecode = 'I'
1253 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001254
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001255class LongTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001256 typecode = 'l'
1257 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001258
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001259class UnsignedLongTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001260 typecode = 'L'
1261 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001262
Meador Inge1c9f0c92011-09-20 19:55:51 -05001263@unittest.skipIf(not have_long_long, 'need long long support')
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001264class LongLongTest(SignedNumberTest, unittest.TestCase):
Meador Inge1c9f0c92011-09-20 19:55:51 -05001265 typecode = 'q'
1266 minitemsize = 8
Meador Inge1c9f0c92011-09-20 19:55:51 -05001267
1268@unittest.skipIf(not have_long_long, 'need long long support')
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001269class UnsignedLongLongTest(UnsignedNumberTest, unittest.TestCase):
Meador Inge1c9f0c92011-09-20 19:55:51 -05001270 typecode = 'Q'
1271 minitemsize = 8
Meador Inge1c9f0c92011-09-20 19:55:51 -05001272
Walter Dörwald7fd94242003-05-18 00:47:47 +00001273class FPTest(NumberTest):
1274 example = [-42.0, 0, 42, 1e5, -1e10]
1275 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
1276 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
1277 outside = 23
1278
1279 def assertEntryEqual(self, entry1, entry2):
1280 self.assertAlmostEqual(entry1, entry2)
1281
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001282 def test_byteswap(self):
1283 a = array.array(self.typecode, self.example)
1284 self.assertRaises(TypeError, a.byteswap, 42)
1285 if a.itemsize in (1, 2, 4, 8):
1286 b = array.array(self.typecode, self.example)
1287 b.byteswap()
1288 if a.itemsize==1:
1289 self.assertEqual(a, b)
1290 else:
1291 # On alphas treating the byte swapped bit patters as
1292 # floats/doubles results in floating point exceptions
1293 # => compare the 8bit string values instead
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001294 self.assertNotEqual(a.tobytes(), b.tobytes())
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001295 b.byteswap()
1296 self.assertEqual(a, b)
1297
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001298class FloatTest(FPTest, unittest.TestCase):
Neal Norwitz35c6cd02003-05-22 13:29:15 +00001299 typecode = 'f'
1300 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001301
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001302class DoubleTest(FPTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001303 typecode = 'd'
1304 minitemsize = 8
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001305
1306 def test_alloc_overflow(self):
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001307 from sys import maxsize
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001308 a = array.array('d', [-1]*65536)
1309 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001310 a *= maxsize//65536 + 1
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001311 except MemoryError:
1312 pass
1313 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001314 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001315 b = array.array('d', [ 2.71828183, 3.14159265, -1])
1316 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001317 b * (maxsize//3 + 1)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001318 except MemoryError:
1319 pass
1320 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001321 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001322
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001323
1324if __name__ == "__main__":
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001325 unittest.main()