blob: 482526eec1e08017c973120fe464f995adabf8c6 [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):
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200287 orig = array.array(self.typecode, self.example)
288 data = list(orig)
289 data2 = data[::-1]
Serhiy Storchakabad12572014-12-15 14:03:42 +0200290 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200291 # initial iterator
292 itorig = iter(orig)
293 d = pickle.dumps((itorig, orig), proto)
294 it, a = pickle.loads(d)
295 a.fromlist(data2)
296 self.assertEqual(type(it), type(itorig))
297 self.assertEqual(list(it), data + data2)
Serhiy Storchakabad12572014-12-15 14:03:42 +0200298
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200299 # running iterator
300 next(itorig)
301 d = pickle.dumps((itorig, orig), proto)
302 it, a = pickle.loads(d)
303 a.fromlist(data2)
304 self.assertEqual(type(it), type(itorig))
305 self.assertEqual(list(it), data[1:] + data2)
306
307 # empty iterator
308 for i in range(1, len(data)):
309 next(itorig)
310 d = pickle.dumps((itorig, orig), proto)
311 it, a = pickle.loads(d)
312 a.fromlist(data2)
313 self.assertEqual(type(it), type(itorig))
314 self.assertEqual(list(it), data2)
315
316 # exhausted iterator
317 self.assertRaises(StopIteration, next, itorig)
318 d = pickle.dumps((itorig, orig), proto)
319 it, a = pickle.loads(d)
320 a.fromlist(data2)
321 self.assertEqual(type(it), type(itorig))
322 self.assertEqual(list(it), data2)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000323
Walter Dörwald7fd94242003-05-18 00:47:47 +0000324 def test_insert(self):
325 a = array.array(self.typecode, self.example)
326 a.insert(0, self.example[0])
327 self.assertEqual(len(a), 1+len(self.example))
328 self.assertEqual(a[0], a[1])
329 self.assertRaises(TypeError, a.insert)
330 self.assertRaises(TypeError, a.insert, None)
Walter Dörwaldba39d9c2003-05-18 01:56:25 +0000331 self.assertRaises(TypeError, a.insert, 0, None)
Martin v. Löwis99866332002-03-01 10:27:01 +0000332
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000333 a = array.array(self.typecode, self.example)
334 a.insert(-1, self.example[0])
335 self.assertEqual(
336 a,
337 array.array(
338 self.typecode,
339 self.example[:-1] + self.example[:1] + self.example[-1:]
340 )
341 )
342
343 a = array.array(self.typecode, self.example)
344 a.insert(-1000, self.example[0])
345 self.assertEqual(
346 a,
347 array.array(self.typecode, self.example[:1] + self.example)
348 )
349
350 a = array.array(self.typecode, self.example)
351 a.insert(1000, self.example[0])
352 self.assertEqual(
353 a,
354 array.array(self.typecode, self.example + self.example[:1])
355 )
356
Walter Dörwald7fd94242003-05-18 00:47:47 +0000357 def test_tofromfile(self):
358 a = array.array(self.typecode, 2*self.example)
359 self.assertRaises(TypeError, a.tofile)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000360 support.unlink(support.TESTFN)
361 f = open(support.TESTFN, 'wb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000362 try:
363 a.tofile(f)
364 f.close()
365 b = array.array(self.typecode)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000366 f = open(support.TESTFN, 'rb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000367 self.assertRaises(TypeError, b.fromfile)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000368 b.fromfile(f, len(self.example))
369 self.assertEqual(b, array.array(self.typecode, self.example))
370 self.assertNotEqual(a, b)
Hirokazu Yamamoto54d0df62009-03-06 03:04:07 +0000371 self.assertRaises(EOFError, b.fromfile, f, len(self.example)+1)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000372 self.assertEqual(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000373 f.close()
374 finally:
375 if not f.closed:
376 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000377 support.unlink(support.TESTFN)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000378
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000379 def test_fromfile_ioerror(self):
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200380 # Issue #5395: Check if fromfile raises a proper OSError
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000381 # instead of EOFError.
382 a = array.array(self.typecode)
383 f = open(support.TESTFN, 'wb')
384 try:
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200385 self.assertRaises(OSError, a.fromfile, f, len(self.example))
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000386 finally:
387 f.close()
388 support.unlink(support.TESTFN)
389
Frank Wierzbicki17683432009-08-16 20:30:12 +0000390 def test_filewrite(self):
391 a = array.array(self.typecode, 2*self.example)
392 f = open(support.TESTFN, 'wb')
393 try:
394 f.write(a)
395 f.close()
396 b = array.array(self.typecode)
397 f = open(support.TESTFN, 'rb')
398 b.fromfile(f, len(self.example))
399 self.assertEqual(b, array.array(self.typecode, self.example))
400 self.assertNotEqual(a, b)
401 b.fromfile(f, len(self.example))
402 self.assertEqual(a, b)
403 f.close()
404 finally:
405 if not f.closed:
406 f.close()
407 support.unlink(support.TESTFN)
408
Walter Dörwald7fd94242003-05-18 00:47:47 +0000409 def test_tofromlist(self):
410 a = array.array(self.typecode, 2*self.example)
411 b = array.array(self.typecode)
412 self.assertRaises(TypeError, a.tolist, 42)
413 self.assertRaises(TypeError, b.fromlist)
414 self.assertRaises(TypeError, b.fromlist, 42)
415 self.assertRaises(TypeError, b.fromlist, [None])
416 b.fromlist(a.tolist())
417 self.assertEqual(a, b)
Fred Drake78334472000-06-28 17:50:51 +0000418
Walter Dörwald7fd94242003-05-18 00:47:47 +0000419 def test_tofromstring(self):
Brett Cannon1eb32c22014-10-10 16:26:45 -0400420 # Warnings not raised when arguments are incorrect as Argument Clinic
421 # handles that before the warning can be raised.
422 nb_warnings = 2
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000423 with warnings.catch_warnings(record=True) as r:
424 warnings.filterwarnings("always",
425 message=r"(to|from)string\(\) is deprecated",
426 category=DeprecationWarning)
427 a = array.array(self.typecode, 2*self.example)
428 b = array.array(self.typecode)
429 self.assertRaises(TypeError, a.tostring, 42)
430 self.assertRaises(TypeError, b.fromstring)
431 self.assertRaises(TypeError, b.fromstring, 42)
432 b.fromstring(a.tostring())
433 self.assertEqual(a, b)
434 if a.itemsize>1:
435 self.assertRaises(ValueError, b.fromstring, "x")
436 nb_warnings += 1
437 self.assertEqual(len(r), nb_warnings)
438
439 def test_tofrombytes(self):
Walter Dörwald7fd94242003-05-18 00:47:47 +0000440 a = array.array(self.typecode, 2*self.example)
441 b = array.array(self.typecode)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000442 self.assertRaises(TypeError, a.tobytes, 42)
443 self.assertRaises(TypeError, b.frombytes)
444 self.assertRaises(TypeError, b.frombytes, 42)
445 b.frombytes(a.tobytes())
446 c = array.array(self.typecode, bytearray(a.tobytes()))
Walter Dörwald7fd94242003-05-18 00:47:47 +0000447 self.assertEqual(a, b)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000448 self.assertEqual(a, c)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000449 if a.itemsize>1:
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000450 self.assertRaises(ValueError, b.frombytes, b"x")
Fred Drake78334472000-06-28 17:50:51 +0000451
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +0000452 def test_fromarray(self):
453 a = array.array(self.typecode, self.example)
454 b = array.array(self.typecode, a)
455 self.assertEqual(a, b)
456
Walter Dörwald7fd94242003-05-18 00:47:47 +0000457 def test_repr(self):
458 a = array.array(self.typecode, 2*self.example)
459 self.assertEqual(a, eval(repr(a), {"array": array.array}))
Fred Drake78334472000-06-28 17:50:51 +0000460
Walter Dörwald7fd94242003-05-18 00:47:47 +0000461 a = array.array(self.typecode)
462 self.assertEqual(repr(a), "array('%s')" % self.typecode)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000463
Walter Dörwald7fd94242003-05-18 00:47:47 +0000464 def test_str(self):
465 a = array.array(self.typecode, 2*self.example)
466 str(a)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000467
Walter Dörwald7fd94242003-05-18 00:47:47 +0000468 def test_cmp(self):
469 a = array.array(self.typecode, self.example)
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200470 self.assertIs(a == 42, False)
471 self.assertIs(a != 42, True)
Tim Peterscc78e472000-11-14 21:36:07 +0000472
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200473 self.assertIs(a == a, True)
474 self.assertIs(a != a, False)
475 self.assertIs(a < a, False)
476 self.assertIs(a <= a, True)
477 self.assertIs(a > a, False)
478 self.assertIs(a >= a, True)
Tim Peterscc78e472000-11-14 21:36:07 +0000479
Neal Norwitzbd2835c2006-03-17 08:54:15 +0000480 al = array.array(self.typecode, self.smallerexample)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000481 ab = array.array(self.typecode, self.biggerexample)
Guido van Rossum7f1d3aa1998-07-16 15:31:43 +0000482
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200483 self.assertIs(a == 2*a, False)
484 self.assertIs(a != 2*a, True)
485 self.assertIs(a < 2*a, True)
486 self.assertIs(a <= 2*a, True)
487 self.assertIs(a > 2*a, False)
488 self.assertIs(a >= 2*a, False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000489
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200490 self.assertIs(a == al, False)
491 self.assertIs(a != al, True)
492 self.assertIs(a < al, False)
493 self.assertIs(a <= al, False)
494 self.assertIs(a > al, True)
495 self.assertIs(a >= al, True)
Martin v. Löwis99866332002-03-01 10:27:01 +0000496
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200497 self.assertIs(a == ab, False)
498 self.assertIs(a != ab, True)
499 self.assertIs(a < ab, True)
500 self.assertIs(a <= ab, True)
501 self.assertIs(a > ab, False)
502 self.assertIs(a >= ab, False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000503
Walter Dörwald7fd94242003-05-18 00:47:47 +0000504 def test_add(self):
505 a = array.array(self.typecode, self.example) \
506 + array.array(self.typecode, self.example[::-1])
507 self.assertEqual(
508 a,
509 array.array(self.typecode, self.example + self.example[::-1])
510 )
Martin v. Löwis99866332002-03-01 10:27:01 +0000511
Walter Dörwald7fd94242003-05-18 00:47:47 +0000512 b = array.array(self.badtypecode())
513 self.assertRaises(TypeError, a.__add__, b)
514
515 self.assertRaises(TypeError, a.__add__, "bad")
516
517 def test_iadd(self):
518 a = array.array(self.typecode, self.example[::-1])
519 b = a
520 a += array.array(self.typecode, 2*self.example)
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200521 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000522 self.assertEqual(
523 a,
524 array.array(self.typecode, self.example[::-1]+2*self.example)
525 )
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000526 a = array.array(self.typecode, self.example)
527 a += a
528 self.assertEqual(
529 a,
530 array.array(self.typecode, self.example + self.example)
531 )
Walter Dörwald7fd94242003-05-18 00:47:47 +0000532
533 b = array.array(self.badtypecode())
534 self.assertRaises(TypeError, a.__add__, b)
535
536 self.assertRaises(TypeError, a.__iadd__, "bad")
537
538 def test_mul(self):
539 a = 5*array.array(self.typecode, self.example)
540 self.assertEqual(
541 a,
542 array.array(self.typecode, 5*self.example)
543 )
544
545 a = array.array(self.typecode, self.example)*5
546 self.assertEqual(
547 a,
548 array.array(self.typecode, self.example*5)
549 )
550
551 a = 0*array.array(self.typecode, self.example)
552 self.assertEqual(
553 a,
554 array.array(self.typecode)
555 )
556
557 a = (-1)*array.array(self.typecode, self.example)
558 self.assertEqual(
559 a,
560 array.array(self.typecode)
561 )
562
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000563 a = 5 * array.array(self.typecode, self.example[:1])
564 self.assertEqual(
565 a,
566 array.array(self.typecode, [a[0]] * 5)
567 )
568
Walter Dörwald7fd94242003-05-18 00:47:47 +0000569 self.assertRaises(TypeError, a.__mul__, "bad")
570
571 def test_imul(self):
572 a = array.array(self.typecode, self.example)
573 b = a
574
575 a *= 5
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200576 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000577 self.assertEqual(
578 a,
579 array.array(self.typecode, 5*self.example)
580 )
581
582 a *= 0
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200583 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000584 self.assertEqual(a, array.array(self.typecode))
585
586 a *= 1000
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200587 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000588 self.assertEqual(a, array.array(self.typecode))
589
590 a *= -1
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200591 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000592 self.assertEqual(a, array.array(self.typecode))
593
594 a = array.array(self.typecode, self.example)
595 a *= -1
596 self.assertEqual(a, array.array(self.typecode))
597
598 self.assertRaises(TypeError, a.__imul__, "bad")
599
600 def test_getitem(self):
601 a = array.array(self.typecode, self.example)
602 self.assertEntryEqual(a[0], self.example[0])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000603 self.assertEntryEqual(a[0], self.example[0])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000604 self.assertEntryEqual(a[-1], self.example[-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000605 self.assertEntryEqual(a[-1], self.example[-1])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000606 self.assertEntryEqual(a[len(self.example)-1], self.example[-1])
607 self.assertEntryEqual(a[-len(self.example)], self.example[0])
608 self.assertRaises(TypeError, a.__getitem__)
609 self.assertRaises(IndexError, a.__getitem__, len(self.example))
610 self.assertRaises(IndexError, a.__getitem__, -len(self.example)-1)
611
612 def test_setitem(self):
613 a = array.array(self.typecode, self.example)
614 a[0] = a[-1]
615 self.assertEntryEqual(a[0], a[-1])
616
617 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000618 a[0] = a[-1]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000619 self.assertEntryEqual(a[0], a[-1])
620
621 a = array.array(self.typecode, self.example)
622 a[-1] = a[0]
623 self.assertEntryEqual(a[0], a[-1])
624
625 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000626 a[-1] = a[0]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000627 self.assertEntryEqual(a[0], a[-1])
628
629 a = array.array(self.typecode, self.example)
630 a[len(self.example)-1] = a[0]
631 self.assertEntryEqual(a[0], a[-1])
632
633 a = array.array(self.typecode, self.example)
634 a[-len(self.example)] = a[-1]
635 self.assertEntryEqual(a[0], a[-1])
636
637 self.assertRaises(TypeError, a.__setitem__)
638 self.assertRaises(TypeError, a.__setitem__, None)
639 self.assertRaises(TypeError, a.__setitem__, 0, None)
640 self.assertRaises(
641 IndexError,
642 a.__setitem__,
643 len(self.example), self.example[0]
644 )
645 self.assertRaises(
646 IndexError,
647 a.__setitem__,
648 -len(self.example)-1, self.example[0]
649 )
650
651 def test_delitem(self):
652 a = array.array(self.typecode, self.example)
653 del a[0]
654 self.assertEqual(
655 a,
656 array.array(self.typecode, self.example[1:])
657 )
658
659 a = array.array(self.typecode, self.example)
660 del a[-1]
661 self.assertEqual(
662 a,
663 array.array(self.typecode, self.example[:-1])
664 )
665
666 a = array.array(self.typecode, self.example)
667 del a[len(self.example)-1]
668 self.assertEqual(
669 a,
670 array.array(self.typecode, self.example[:-1])
671 )
672
673 a = array.array(self.typecode, self.example)
674 del a[-len(self.example)]
675 self.assertEqual(
676 a,
677 array.array(self.typecode, self.example[1:])
678 )
679
680 self.assertRaises(TypeError, a.__delitem__)
681 self.assertRaises(TypeError, a.__delitem__, None)
682 self.assertRaises(IndexError, a.__delitem__, len(self.example))
683 self.assertRaises(IndexError, a.__delitem__, -len(self.example)-1)
684
685 def test_getslice(self):
686 a = array.array(self.typecode, self.example)
687 self.assertEqual(a[:], a)
688
689 self.assertEqual(
690 a[1:],
691 array.array(self.typecode, self.example[1:])
692 )
693
694 self.assertEqual(
695 a[:1],
696 array.array(self.typecode, self.example[:1])
697 )
698
699 self.assertEqual(
700 a[:-1],
701 array.array(self.typecode, self.example[:-1])
702 )
703
704 self.assertEqual(
705 a[-1:],
706 array.array(self.typecode, self.example[-1:])
707 )
708
709 self.assertEqual(
710 a[-1:-1],
711 array.array(self.typecode)
712 )
713
714 self.assertEqual(
Walter Dörwald1083c242005-01-21 21:16:51 +0000715 a[2:1],
716 array.array(self.typecode)
717 )
718
719 self.assertEqual(
Walter Dörwald7fd94242003-05-18 00:47:47 +0000720 a[1000:],
721 array.array(self.typecode)
722 )
723 self.assertEqual(a[-1000:], a)
724 self.assertEqual(a[:1000], a)
725 self.assertEqual(
726 a[:-1000],
727 array.array(self.typecode)
728 )
729 self.assertEqual(a[-1000:1000], a)
730 self.assertEqual(
731 a[2000:1000],
732 array.array(self.typecode)
733 )
734
Thomas Woutersed03b412007-08-28 21:37:11 +0000735 def test_extended_getslice(self):
736 # Test extended slicing by comparing with list slicing
737 # (Assumes list conversion works correctly, too)
738 a = array.array(self.typecode, self.example)
739 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
740 for start in indices:
741 for stop in indices:
742 # Everything except the initial 0 (invalid step)
743 for step in indices[1:]:
744 self.assertEqual(list(a[start:stop:step]),
745 list(a)[start:stop:step])
746
Walter Dörwald7fd94242003-05-18 00:47:47 +0000747 def test_setslice(self):
748 a = array.array(self.typecode, self.example)
749 a[:1] = a
750 self.assertEqual(
751 a,
752 array.array(self.typecode, self.example + self.example[1:])
753 )
754
755 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000756 a[:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000757 self.assertEqual(
758 a,
759 array.array(self.typecode, self.example + self.example[-1:])
760 )
761
762 a = array.array(self.typecode, self.example)
763 a[-1:] = a
764 self.assertEqual(
765 a,
766 array.array(self.typecode, self.example[:-1] + self.example)
767 )
768
769 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000770 a[1:] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000771 self.assertEqual(
772 a,
773 array.array(self.typecode, self.example[:1] + self.example)
774 )
775
776 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000777 a[1:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000778 self.assertEqual(
779 a,
780 array.array(
781 self.typecode,
782 self.example[:1] + self.example + self.example[-1:]
783 )
784 )
785
786 a = array.array(self.typecode, self.example)
787 a[1000:] = a
788 self.assertEqual(
789 a,
790 array.array(self.typecode, 2*self.example)
791 )
792
793 a = array.array(self.typecode, self.example)
794 a[-1000:] = a
795 self.assertEqual(
796 a,
797 array.array(self.typecode, self.example)
798 )
799
800 a = array.array(self.typecode, self.example)
801 a[:1000] = a
802 self.assertEqual(
803 a,
804 array.array(self.typecode, self.example)
805 )
806
807 a = array.array(self.typecode, self.example)
808 a[:-1000] = a
809 self.assertEqual(
810 a,
811 array.array(self.typecode, 2*self.example)
812 )
813
814 a = array.array(self.typecode, self.example)
815 a[1:0] = a
816 self.assertEqual(
817 a,
818 array.array(self.typecode, self.example[:1] + self.example + self.example[1:])
819 )
820
821 a = array.array(self.typecode, self.example)
822 a[2000:1000] = a
823 self.assertEqual(
824 a,
825 array.array(self.typecode, 2*self.example)
826 )
827
828 a = array.array(self.typecode, self.example)
Thomas Woutersed03b412007-08-28 21:37:11 +0000829 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), None)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000830 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), None)
831
832 b = array.array(self.badtypecode())
Thomas Woutersed03b412007-08-28 21:37:11 +0000833 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000834 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), b)
835
Thomas Woutersed03b412007-08-28 21:37:11 +0000836 def test_extended_set_del_slice(self):
837 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
838 for start in indices:
839 for stop in indices:
840 # Everything except the initial 0 (invalid step)
841 for step in indices[1:]:
842 a = array.array(self.typecode, self.example)
843 L = list(a)
844 # Make sure we have a slice of exactly the right length,
845 # but with (hopefully) different data.
846 data = L[start:stop:step]
847 data.reverse()
848 L[start:stop:step] = data
849 a[start:stop:step] = array.array(self.typecode, data)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000850 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000851
852 del L[start:stop:step]
853 del a[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +0000854 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000855
Walter Dörwald7fd94242003-05-18 00:47:47 +0000856 def test_index(self):
857 example = 2*self.example
858 a = array.array(self.typecode, example)
859 self.assertRaises(TypeError, a.index)
860 for x in example:
861 self.assertEqual(a.index(x), example.index(x))
862 self.assertRaises(ValueError, a.index, None)
863 self.assertRaises(ValueError, a.index, self.outside)
864
865 def test_count(self):
866 example = 2*self.example
867 a = array.array(self.typecode, example)
868 self.assertRaises(TypeError, a.count)
869 for x in example:
870 self.assertEqual(a.count(x), example.count(x))
871 self.assertEqual(a.count(self.outside), 0)
872 self.assertEqual(a.count(None), 0)
873
874 def test_remove(self):
875 for x in self.example:
876 example = 2*self.example
877 a = array.array(self.typecode, example)
878 pos = example.index(x)
879 example2 = example[:pos] + example[pos+1:]
880 a.remove(x)
881 self.assertEqual(a, array.array(self.typecode, example2))
882
883 a = array.array(self.typecode, self.example)
884 self.assertRaises(ValueError, a.remove, self.outside)
885
886 self.assertRaises(ValueError, a.remove, None)
887
888 def test_pop(self):
889 a = array.array(self.typecode)
890 self.assertRaises(IndexError, a.pop)
891
892 a = array.array(self.typecode, 2*self.example)
893 self.assertRaises(TypeError, a.pop, 42, 42)
894 self.assertRaises(TypeError, a.pop, None)
895 self.assertRaises(IndexError, a.pop, len(a))
896 self.assertRaises(IndexError, a.pop, -len(a)-1)
897
898 self.assertEntryEqual(a.pop(0), self.example[0])
899 self.assertEqual(
900 a,
901 array.array(self.typecode, self.example[1:]+self.example)
902 )
903 self.assertEntryEqual(a.pop(1), self.example[2])
904 self.assertEqual(
905 a,
906 array.array(self.typecode, self.example[1:2]+self.example[3:]+self.example)
907 )
908 self.assertEntryEqual(a.pop(0), self.example[1])
909 self.assertEntryEqual(a.pop(), self.example[-1])
910 self.assertEqual(
911 a,
912 array.array(self.typecode, self.example[3:]+self.example[:-1])
913 )
914
915 def test_reverse(self):
916 a = array.array(self.typecode, self.example)
917 self.assertRaises(TypeError, a.reverse, 42)
Fred Drake004d5e62000-10-23 17:22:08 +0000918 a.reverse()
Walter Dörwald7fd94242003-05-18 00:47:47 +0000919 self.assertEqual(
920 a,
921 array.array(self.typecode, self.example[::-1])
922 )
923
924 def test_extend(self):
925 a = array.array(self.typecode, self.example)
926 self.assertRaises(TypeError, a.extend)
927 a.extend(array.array(self.typecode, self.example[::-1]))
928 self.assertEqual(
929 a,
930 array.array(self.typecode, self.example+self.example[::-1])
931 )
932
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000933 a = array.array(self.typecode, self.example)
934 a.extend(a)
935 self.assertEqual(
936 a,
937 array.array(self.typecode, self.example+self.example)
938 )
939
Walter Dörwald7fd94242003-05-18 00:47:47 +0000940 b = array.array(self.badtypecode())
941 self.assertRaises(TypeError, a.extend, b)
942
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000943 a = array.array(self.typecode, self.example)
944 a.extend(self.example[::-1])
945 self.assertEqual(
946 a,
947 array.array(self.typecode, self.example+self.example[::-1])
948 )
949
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +0000950 def test_constructor_with_iterable_argument(self):
951 a = array.array(self.typecode, iter(self.example))
952 b = array.array(self.typecode, self.example)
953 self.assertEqual(a, b)
954
955 # non-iterable argument
956 self.assertRaises(TypeError, array.array, self.typecode, 10)
957
958 # pass through errors raised in __iter__
959 class A:
960 def __iter__(self):
961 raise UnicodeError
962 self.assertRaises(UnicodeError, array.array, self.typecode, A())
963
964 # pass through errors raised in next()
965 def B():
966 raise UnicodeError
967 yield None
968 self.assertRaises(UnicodeError, array.array, self.typecode, B())
969
Walter Dörwald7fd94242003-05-18 00:47:47 +0000970 def test_coveritertraverse(self):
971 try:
972 import gc
973 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -0600974 self.skipTest('gc module not available')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000975 a = array.array(self.typecode)
976 l = [iter(a)]
977 l.append(l)
978 gc.collect()
979
980 def test_buffer(self):
981 a = array.array(self.typecode, self.example)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000982 m = memoryview(a)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000983 expected = m.tobytes()
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000984 self.assertEqual(a.tobytes(), expected)
985 self.assertEqual(a.tobytes()[0], expected[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000986 # Resizing is forbidden when there are buffer exports.
987 # For issue 4509, we also check after each error that
988 # the array was not modified.
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000989 self.assertRaises(BufferError, a.append, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000990 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000991 self.assertRaises(BufferError, a.extend, a[0:1])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000992 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000993 self.assertRaises(BufferError, a.remove, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000994 self.assertEqual(m.tobytes(), expected)
995 self.assertRaises(BufferError, a.pop, 0)
996 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000997 self.assertRaises(BufferError, a.fromlist, a.tolist())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000998 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000999 self.assertRaises(BufferError, a.frombytes, a.tobytes())
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001000 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001001 if self.typecode == 'u':
1002 self.assertRaises(BufferError, a.fromunicode, a.tounicode())
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001003 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +00001004 self.assertRaises(BufferError, operator.imul, a, 2)
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001005 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +00001006 self.assertRaises(BufferError, operator.imul, a, 0)
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001007 self.assertEqual(m.tobytes(), expected)
1008 self.assertRaises(BufferError, operator.setitem, a, slice(0, 0), a)
1009 self.assertEqual(m.tobytes(), expected)
1010 self.assertRaises(BufferError, operator.delitem, a, 0)
1011 self.assertEqual(m.tobytes(), expected)
1012 self.assertRaises(BufferError, operator.delitem, a, slice(0, 1))
1013 self.assertEqual(m.tobytes(), expected)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001014
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001015 def test_weakref(self):
1016 s = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001017 p = weakref.proxy(s)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001018 self.assertEqual(p.tobytes(), s.tobytes())
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001019 s = None
1020 self.assertRaises(ReferenceError, len, p)
1021
Serhiy Storchaka43767632013-11-03 21:31:38 +02001022 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
1023 'test needs sys.getrefcount()')
Skip Montanarod5cf0b82003-08-03 23:02:10 +00001024 def test_bug_782369(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +02001025 for i in range(10):
1026 b = array.array('B', range(64))
1027 rc = sys.getrefcount(10)
1028 for i in range(10):
1029 b = array.array('B', range(64))
1030 self.assertEqual(rc, sys.getrefcount(10))
Skip Montanarod5cf0b82003-08-03 23:02:10 +00001031
Thomas Woutersb2137042007-02-01 18:02:27 +00001032 def test_subclass_with_kwargs(self):
1033 # SF bug #1486663 -- this used to erroneously raise a TypeError
1034 ArraySubclassWithKwargs('b', newarg=1)
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001035
Guido van Rossum6b826ab2007-07-03 16:22:09 +00001036 def test_create_from_bytes(self):
Alexandre Vassalotti7e4f3212009-07-05 05:38:18 +00001037 # XXX This test probably needs to be moved in a subclass or
1038 # generalized to use self.typecode.
Guido van Rossum6b826ab2007-07-03 16:22:09 +00001039 a = array.array('H', b"1234")
1040 self.assertEqual(len(a) * a.itemsize, 4)
1041
Meador Inge03b4d502012-08-10 22:35:45 -05001042 @support.cpython_only
1043 def test_sizeof_with_buffer(self):
1044 a = array.array(self.typecode, self.example)
Meador Inge80dd1af2012-08-10 23:21:39 -05001045 basesize = support.calcvobjsize('Pn2Pi')
Meador Inge03b4d502012-08-10 22:35:45 -05001046 buffer_size = a.buffer_info()[1] * a.itemsize
1047 support.check_sizeof(self, a, basesize + buffer_size)
1048
1049 @support.cpython_only
1050 def test_sizeof_without_buffer(self):
1051 a = array.array(self.typecode)
Meador Inge80dd1af2012-08-10 23:21:39 -05001052 basesize = support.calcvobjsize('Pn2Pi')
Meador Inge03b4d502012-08-10 22:35:45 -05001053 support.check_sizeof(self, a, basesize)
1054
Alexandre Vassalotti9730e332013-11-29 20:47:15 -08001055 def test_initialize_with_unicode(self):
1056 if self.typecode != 'u':
1057 with self.assertRaises(TypeError) as cm:
1058 a = array.array(self.typecode, 'foo')
1059 self.assertIn("cannot use a str", str(cm.exception))
1060 with self.assertRaises(TypeError) as cm:
1061 a = array.array(self.typecode, array.array('u', 'foo'))
1062 self.assertIn("cannot use a unicode array", str(cm.exception))
1063 else:
1064 a = array.array(self.typecode, "foo")
1065 a = array.array(self.typecode, array.array('u', 'foo'))
1066
Stefan Krah650c1e82015-02-03 21:43:23 +01001067 @support.cpython_only
1068 def test_obsolete_write_lock(self):
1069 from _testcapi import getbuffer_with_null_view
1070 a = array.array('B', b"")
1071 self.assertRaises(BufferError, getbuffer_with_null_view, a)
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001072
Walter Dörwald7fd94242003-05-18 00:47:47 +00001073class StringTest(BaseTest):
1074
1075 def test_setitem(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001076 super().test_setitem()
Walter Dörwald7fd94242003-05-18 00:47:47 +00001077 a = array.array(self.typecode, self.example)
1078 self.assertRaises(TypeError, a.__setitem__, 0, self.example[:2])
1079
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001080class UnicodeTest(StringTest, unittest.TestCase):
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001081 typecode = 'u'
1082 example = '\x01\u263a\x00\ufeff'
1083 smallerexample = '\x01\u263a\x00\ufefe'
1084 biggerexample = '\x01\u263a\x01\ufeff'
1085 outside = str('\x33')
Victor Stinner8d4734f2012-08-08 20:09:21 +02001086 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001087
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001088 def test_unicode(self):
1089 self.assertRaises(TypeError, array.array, 'b', 'foo')
Walter Dörwald7fd94242003-05-18 00:47:47 +00001090
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001091 a = array.array('u', '\xa0\xc2\u1234')
1092 a.fromunicode(' ')
1093 a.fromunicode('')
1094 a.fromunicode('')
1095 a.fromunicode('\x11abc\xff\u1234')
1096 s = a.tounicode()
1097 self.assertEqual(s, '\xa0\xc2\u1234 \x11abc\xff\u1234')
Victor Stinner9d512ab2012-08-09 00:43:56 +02001098 self.assertEqual(a.itemsize, sizeof_wchar)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001099
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001100 s = '\x00="\'a\\b\x80\xff\u0000\u0001\u1234'
1101 a = array.array('u', s)
1102 self.assertEqual(
1103 repr(a),
Georg Brandl559e5d72008-06-11 18:37:52 +00001104 "array('u', '\\x00=\"\\'a\\\\b\\x80\xff\\x00\\x01\u1234')")
Walter Dörwald7fd94242003-05-18 00:47:47 +00001105
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001106 self.assertRaises(TypeError, a.fromunicode)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001107
Victor Stinner29ec5952013-02-26 00:27:38 +01001108 def test_issue17223(self):
1109 # this used to crash
Victor Stinnerc472c5d2013-02-26 22:52:11 +01001110 if sizeof_wchar == 4:
1111 # U+FFFFFFFF is an invalid code point in Unicode 6.0
1112 invalid_str = b'\xff\xff\xff\xff'
1113 else:
Victor Stinner29c00342013-03-08 02:33:06 +01001114 # PyUnicode_FromUnicode() cannot fail with 16-bit wchar_t
1115 self.skipTest("specific to 32-bit wchar_t")
Victor Stinnerc472c5d2013-02-26 22:52:11 +01001116 a = array.array('u', invalid_str)
Victor Stinner29ec5952013-02-26 00:27:38 +01001117 self.assertRaises(ValueError, a.tounicode)
1118 self.assertRaises(ValueError, str, a)
1119
Walter Dörwald7fd94242003-05-18 00:47:47 +00001120class NumberTest(BaseTest):
1121
1122 def test_extslice(self):
1123 a = array.array(self.typecode, range(5))
1124 self.assertEqual(a[::], a)
1125 self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
1126 self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
1127 self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
1128 self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
1129 self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
1130 self.assertEqual(a[-100:100:], a)
1131 self.assertEqual(a[100:-100:-1], a[::-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +00001132 self.assertEqual(a[-100:100:2], array.array(self.typecode, [0,2,4]))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001133 self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
1134 self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
1135
1136 def test_delslice(self):
1137 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001138 del a[::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001139 self.assertEqual(a, array.array(self.typecode, [1,3]))
1140 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001141 del a[1::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001142 self.assertEqual(a, array.array(self.typecode, [0,2,4]))
1143 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001144 del a[1::-2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001145 self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
1146 a = array.array(self.typecode, range(10))
Michael W. Hudson56796f62002-07-29 14:35:04 +00001147 del a[::1000]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001148 self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
Mark Dickinsonbc099642010-01-29 17:27:24 +00001149 # test issue7788
1150 a = array.array(self.typecode, range(10))
1151 del a[9::1<<333]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001152
1153 def test_assignment(self):
1154 a = array.array(self.typecode, range(10))
1155 a[::2] = array.array(self.typecode, [42]*5)
1156 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
1157 a = array.array(self.typecode, range(10))
1158 a[::-4] = array.array(self.typecode, [10]*3)
1159 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
1160 a = array.array(self.typecode, range(4))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001161 a[::-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +00001162 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
1163 a = array.array(self.typecode, range(10))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001164 b = a[:]
1165 c = a[:]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001166 ins = array.array(self.typecode, range(2))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001167 a[2:3] = ins
1168 b[slice(2,3)] = ins
1169 c[2:3:] = ins
Fred Drake004d5e62000-10-23 17:22:08 +00001170
Walter Dörwald7fd94242003-05-18 00:47:47 +00001171 def test_iterationcontains(self):
1172 a = array.array(self.typecode, range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +00001173 self.assertEqual(list(a), list(range(10)))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001174 b = array.array(self.typecode, [20])
1175 self.assertEqual(a[-1] in a, True)
1176 self.assertEqual(b[0] not in a, True)
1177
1178 def check_overflow(self, lower, upper):
1179 # method to be used by subclasses
1180
1181 # should not overflow assigning lower limit
1182 a = array.array(self.typecode, [lower])
1183 a[0] = lower
1184 # should overflow assigning less than lower limit
1185 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
1186 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
1187 # should not overflow assigning upper limit
1188 a = array.array(self.typecode, [upper])
1189 a[0] = upper
1190 # should overflow assigning more than upper limit
1191 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
1192 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
1193
1194 def test_subclassing(self):
1195 typecode = self.typecode
1196 class ExaggeratingArray(array.array):
1197 __slots__ = ['offset']
1198
1199 def __new__(cls, typecode, data, offset):
1200 return array.array.__new__(cls, typecode, data)
1201
1202 def __init__(self, typecode, data, offset):
1203 self.offset = offset
1204
1205 def __getitem__(self, i):
1206 return array.array.__getitem__(self, i) + self.offset
1207
1208 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
1209 self.assertEntryEqual(a[0], 7)
1210
1211 self.assertRaises(AttributeError, setattr, a, "color", "blue")
1212
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00001213 def test_frombytearray(self):
1214 a = array.array('b', range(10))
1215 b = array.array(self.typecode, a)
1216 self.assertEqual(a, b)
1217
Walter Dörwald7fd94242003-05-18 00:47:47 +00001218class SignedNumberTest(NumberTest):
1219 example = [-1, 0, 1, 42, 0x7f]
1220 smallerexample = [-1, 0, 1, 42, 0x7e]
1221 biggerexample = [-1, 0, 1, 43, 0x7f]
1222 outside = 23
1223
1224 def test_overflow(self):
1225 a = array.array(self.typecode)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001226 lower = -1 * int(pow(2, a.itemsize * 8 - 1))
1227 upper = int(pow(2, a.itemsize * 8 - 1)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001228 self.check_overflow(lower, upper)
1229
1230class UnsignedNumberTest(NumberTest):
1231 example = [0, 1, 17, 23, 42, 0xff]
1232 smallerexample = [0, 1, 17, 23, 42, 0xfe]
1233 biggerexample = [0, 1, 17, 23, 43, 0xff]
1234 outside = 0xaa
1235
1236 def test_overflow(self):
1237 a = array.array(self.typecode)
1238 lower = 0
Guido van Rossume2a383d2007-01-15 16:59:06 +00001239 upper = int(pow(2, a.itemsize * 8)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001240 self.check_overflow(lower, upper)
Fred Drake004d5e62000-10-23 17:22:08 +00001241
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001242 def test_bytes_extend(self):
1243 s = bytes(self.example)
1244
1245 a = array.array(self.typecode, self.example)
1246 a.extend(s)
1247 self.assertEqual(
1248 a,
1249 array.array(self.typecode, self.example+self.example)
1250 )
1251
1252 a = array.array(self.typecode, self.example)
1253 a.extend(bytearray(reversed(s)))
1254 self.assertEqual(
1255 a,
1256 array.array(self.typecode, self.example+self.example[::-1])
1257 )
1258
Fred Drake004d5e62000-10-23 17:22:08 +00001259
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001260class ByteTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001261 typecode = 'b'
1262 minitemsize = 1
Fred Drake004d5e62000-10-23 17:22:08 +00001263
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001264class UnsignedByteTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001265 typecode = 'B'
1266 minitemsize = 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001267
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001268class ShortTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001269 typecode = 'h'
1270 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001271
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001272class UnsignedShortTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001273 typecode = 'H'
1274 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001275
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001276class IntTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001277 typecode = 'i'
1278 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001279
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001280class UnsignedIntTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001281 typecode = 'I'
1282 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001283
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001284class LongTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001285 typecode = 'l'
1286 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001287
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001288class UnsignedLongTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001289 typecode = 'L'
1290 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001291
Meador Inge1c9f0c92011-09-20 19:55:51 -05001292@unittest.skipIf(not have_long_long, 'need long long support')
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001293class LongLongTest(SignedNumberTest, unittest.TestCase):
Meador Inge1c9f0c92011-09-20 19:55:51 -05001294 typecode = 'q'
1295 minitemsize = 8
Meador Inge1c9f0c92011-09-20 19:55:51 -05001296
1297@unittest.skipIf(not have_long_long, 'need long long support')
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001298class UnsignedLongLongTest(UnsignedNumberTest, unittest.TestCase):
Meador Inge1c9f0c92011-09-20 19:55:51 -05001299 typecode = 'Q'
1300 minitemsize = 8
Meador Inge1c9f0c92011-09-20 19:55:51 -05001301
Walter Dörwald7fd94242003-05-18 00:47:47 +00001302class FPTest(NumberTest):
1303 example = [-42.0, 0, 42, 1e5, -1e10]
1304 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
1305 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
1306 outside = 23
1307
1308 def assertEntryEqual(self, entry1, entry2):
1309 self.assertAlmostEqual(entry1, entry2)
1310
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001311 def test_byteswap(self):
1312 a = array.array(self.typecode, self.example)
1313 self.assertRaises(TypeError, a.byteswap, 42)
1314 if a.itemsize in (1, 2, 4, 8):
1315 b = array.array(self.typecode, self.example)
1316 b.byteswap()
1317 if a.itemsize==1:
1318 self.assertEqual(a, b)
1319 else:
1320 # On alphas treating the byte swapped bit patters as
1321 # floats/doubles results in floating point exceptions
1322 # => compare the 8bit string values instead
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001323 self.assertNotEqual(a.tobytes(), b.tobytes())
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001324 b.byteswap()
1325 self.assertEqual(a, b)
1326
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001327class FloatTest(FPTest, unittest.TestCase):
Neal Norwitz35c6cd02003-05-22 13:29:15 +00001328 typecode = 'f'
1329 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001330
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001331class DoubleTest(FPTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001332 typecode = 'd'
1333 minitemsize = 8
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001334
1335 def test_alloc_overflow(self):
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001336 from sys import maxsize
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001337 a = array.array('d', [-1]*65536)
1338 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001339 a *= maxsize//65536 + 1
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001340 except MemoryError:
1341 pass
1342 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001343 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001344 b = array.array('d', [ 2.71828183, 3.14159265, -1])
1345 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001346 b * (maxsize//3 + 1)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001347 except MemoryError:
1348 pass
1349 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001350 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001351
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001352
1353if __name__ == "__main__":
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001354 unittest.main()