blob: f8dbf0695c58e43bd58688dc8844e37fbce8aad7 [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):
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000396 nb_warnings = 4
397 with warnings.catch_warnings(record=True) as r:
398 warnings.filterwarnings("always",
399 message=r"(to|from)string\(\) is deprecated",
400 category=DeprecationWarning)
401 a = array.array(self.typecode, 2*self.example)
402 b = array.array(self.typecode)
403 self.assertRaises(TypeError, a.tostring, 42)
404 self.assertRaises(TypeError, b.fromstring)
405 self.assertRaises(TypeError, b.fromstring, 42)
406 b.fromstring(a.tostring())
407 self.assertEqual(a, b)
408 if a.itemsize>1:
409 self.assertRaises(ValueError, b.fromstring, "x")
410 nb_warnings += 1
411 self.assertEqual(len(r), nb_warnings)
412
413 def test_tofrombytes(self):
Walter Dörwald7fd94242003-05-18 00:47:47 +0000414 a = array.array(self.typecode, 2*self.example)
415 b = array.array(self.typecode)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000416 self.assertRaises(TypeError, a.tobytes, 42)
417 self.assertRaises(TypeError, b.frombytes)
418 self.assertRaises(TypeError, b.frombytes, 42)
419 b.frombytes(a.tobytes())
420 c = array.array(self.typecode, bytearray(a.tobytes()))
Walter Dörwald7fd94242003-05-18 00:47:47 +0000421 self.assertEqual(a, b)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000422 self.assertEqual(a, c)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000423 if a.itemsize>1:
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000424 self.assertRaises(ValueError, b.frombytes, b"x")
Fred Drake78334472000-06-28 17:50:51 +0000425
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +0000426 def test_fromarray(self):
427 a = array.array(self.typecode, self.example)
428 b = array.array(self.typecode, a)
429 self.assertEqual(a, b)
430
Walter Dörwald7fd94242003-05-18 00:47:47 +0000431 def test_repr(self):
432 a = array.array(self.typecode, 2*self.example)
433 self.assertEqual(a, eval(repr(a), {"array": array.array}))
Fred Drake78334472000-06-28 17:50:51 +0000434
Walter Dörwald7fd94242003-05-18 00:47:47 +0000435 a = array.array(self.typecode)
436 self.assertEqual(repr(a), "array('%s')" % self.typecode)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000437
Walter Dörwald7fd94242003-05-18 00:47:47 +0000438 def test_str(self):
439 a = array.array(self.typecode, 2*self.example)
440 str(a)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000441
Walter Dörwald7fd94242003-05-18 00:47:47 +0000442 def test_cmp(self):
443 a = array.array(self.typecode, self.example)
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200444 self.assertIs(a == 42, False)
445 self.assertIs(a != 42, True)
Tim Peterscc78e472000-11-14 21:36:07 +0000446
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200447 self.assertIs(a == a, True)
448 self.assertIs(a != a, False)
449 self.assertIs(a < a, False)
450 self.assertIs(a <= a, True)
451 self.assertIs(a > a, False)
452 self.assertIs(a >= a, True)
Tim Peterscc78e472000-11-14 21:36:07 +0000453
Neal Norwitzbd2835c2006-03-17 08:54:15 +0000454 al = array.array(self.typecode, self.smallerexample)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000455 ab = array.array(self.typecode, self.biggerexample)
Guido van Rossum7f1d3aa1998-07-16 15:31:43 +0000456
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200457 self.assertIs(a == 2*a, False)
458 self.assertIs(a != 2*a, True)
459 self.assertIs(a < 2*a, True)
460 self.assertIs(a <= 2*a, True)
461 self.assertIs(a > 2*a, False)
462 self.assertIs(a >= 2*a, False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000463
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200464 self.assertIs(a == al, False)
465 self.assertIs(a != al, True)
466 self.assertIs(a < al, False)
467 self.assertIs(a <= al, False)
468 self.assertIs(a > al, True)
469 self.assertIs(a >= al, True)
Martin v. Löwis99866332002-03-01 10:27:01 +0000470
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200471 self.assertIs(a == ab, False)
472 self.assertIs(a != ab, True)
473 self.assertIs(a < ab, True)
474 self.assertIs(a <= ab, True)
475 self.assertIs(a > ab, False)
476 self.assertIs(a >= ab, False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000477
Walter Dörwald7fd94242003-05-18 00:47:47 +0000478 def test_add(self):
479 a = array.array(self.typecode, self.example) \
480 + array.array(self.typecode, self.example[::-1])
481 self.assertEqual(
482 a,
483 array.array(self.typecode, self.example + self.example[::-1])
484 )
Martin v. Löwis99866332002-03-01 10:27:01 +0000485
Walter Dörwald7fd94242003-05-18 00:47:47 +0000486 b = array.array(self.badtypecode())
487 self.assertRaises(TypeError, a.__add__, b)
488
489 self.assertRaises(TypeError, a.__add__, "bad")
490
491 def test_iadd(self):
492 a = array.array(self.typecode, self.example[::-1])
493 b = a
494 a += array.array(self.typecode, 2*self.example)
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200495 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000496 self.assertEqual(
497 a,
498 array.array(self.typecode, self.example[::-1]+2*self.example)
499 )
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000500 a = array.array(self.typecode, self.example)
501 a += a
502 self.assertEqual(
503 a,
504 array.array(self.typecode, self.example + self.example)
505 )
Walter Dörwald7fd94242003-05-18 00:47:47 +0000506
507 b = array.array(self.badtypecode())
508 self.assertRaises(TypeError, a.__add__, b)
509
510 self.assertRaises(TypeError, a.__iadd__, "bad")
511
512 def test_mul(self):
513 a = 5*array.array(self.typecode, self.example)
514 self.assertEqual(
515 a,
516 array.array(self.typecode, 5*self.example)
517 )
518
519 a = array.array(self.typecode, self.example)*5
520 self.assertEqual(
521 a,
522 array.array(self.typecode, self.example*5)
523 )
524
525 a = 0*array.array(self.typecode, self.example)
526 self.assertEqual(
527 a,
528 array.array(self.typecode)
529 )
530
531 a = (-1)*array.array(self.typecode, self.example)
532 self.assertEqual(
533 a,
534 array.array(self.typecode)
535 )
536
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000537 a = 5 * array.array(self.typecode, self.example[:1])
538 self.assertEqual(
539 a,
540 array.array(self.typecode, [a[0]] * 5)
541 )
542
Walter Dörwald7fd94242003-05-18 00:47:47 +0000543 self.assertRaises(TypeError, a.__mul__, "bad")
544
545 def test_imul(self):
546 a = array.array(self.typecode, self.example)
547 b = a
548
549 a *= 5
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200550 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000551 self.assertEqual(
552 a,
553 array.array(self.typecode, 5*self.example)
554 )
555
556 a *= 0
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200557 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000558 self.assertEqual(a, array.array(self.typecode))
559
560 a *= 1000
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200561 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000562 self.assertEqual(a, array.array(self.typecode))
563
564 a *= -1
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200565 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000566 self.assertEqual(a, array.array(self.typecode))
567
568 a = array.array(self.typecode, self.example)
569 a *= -1
570 self.assertEqual(a, array.array(self.typecode))
571
572 self.assertRaises(TypeError, a.__imul__, "bad")
573
574 def test_getitem(self):
575 a = array.array(self.typecode, self.example)
576 self.assertEntryEqual(a[0], self.example[0])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000577 self.assertEntryEqual(a[0], self.example[0])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000578 self.assertEntryEqual(a[-1], self.example[-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000579 self.assertEntryEqual(a[-1], self.example[-1])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000580 self.assertEntryEqual(a[len(self.example)-1], self.example[-1])
581 self.assertEntryEqual(a[-len(self.example)], self.example[0])
582 self.assertRaises(TypeError, a.__getitem__)
583 self.assertRaises(IndexError, a.__getitem__, len(self.example))
584 self.assertRaises(IndexError, a.__getitem__, -len(self.example)-1)
585
586 def test_setitem(self):
587 a = array.array(self.typecode, self.example)
588 a[0] = a[-1]
589 self.assertEntryEqual(a[0], a[-1])
590
591 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000592 a[0] = a[-1]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000593 self.assertEntryEqual(a[0], a[-1])
594
595 a = array.array(self.typecode, self.example)
596 a[-1] = a[0]
597 self.assertEntryEqual(a[0], a[-1])
598
599 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000600 a[-1] = a[0]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000601 self.assertEntryEqual(a[0], a[-1])
602
603 a = array.array(self.typecode, self.example)
604 a[len(self.example)-1] = a[0]
605 self.assertEntryEqual(a[0], a[-1])
606
607 a = array.array(self.typecode, self.example)
608 a[-len(self.example)] = a[-1]
609 self.assertEntryEqual(a[0], a[-1])
610
611 self.assertRaises(TypeError, a.__setitem__)
612 self.assertRaises(TypeError, a.__setitem__, None)
613 self.assertRaises(TypeError, a.__setitem__, 0, None)
614 self.assertRaises(
615 IndexError,
616 a.__setitem__,
617 len(self.example), self.example[0]
618 )
619 self.assertRaises(
620 IndexError,
621 a.__setitem__,
622 -len(self.example)-1, self.example[0]
623 )
624
625 def test_delitem(self):
626 a = array.array(self.typecode, self.example)
627 del a[0]
628 self.assertEqual(
629 a,
630 array.array(self.typecode, self.example[1:])
631 )
632
633 a = array.array(self.typecode, self.example)
634 del a[-1]
635 self.assertEqual(
636 a,
637 array.array(self.typecode, self.example[:-1])
638 )
639
640 a = array.array(self.typecode, self.example)
641 del a[len(self.example)-1]
642 self.assertEqual(
643 a,
644 array.array(self.typecode, self.example[:-1])
645 )
646
647 a = array.array(self.typecode, self.example)
648 del a[-len(self.example)]
649 self.assertEqual(
650 a,
651 array.array(self.typecode, self.example[1:])
652 )
653
654 self.assertRaises(TypeError, a.__delitem__)
655 self.assertRaises(TypeError, a.__delitem__, None)
656 self.assertRaises(IndexError, a.__delitem__, len(self.example))
657 self.assertRaises(IndexError, a.__delitem__, -len(self.example)-1)
658
659 def test_getslice(self):
660 a = array.array(self.typecode, self.example)
661 self.assertEqual(a[:], a)
662
663 self.assertEqual(
664 a[1:],
665 array.array(self.typecode, self.example[1:])
666 )
667
668 self.assertEqual(
669 a[:1],
670 array.array(self.typecode, self.example[:1])
671 )
672
673 self.assertEqual(
674 a[:-1],
675 array.array(self.typecode, self.example[:-1])
676 )
677
678 self.assertEqual(
679 a[-1:],
680 array.array(self.typecode, self.example[-1:])
681 )
682
683 self.assertEqual(
684 a[-1:-1],
685 array.array(self.typecode)
686 )
687
688 self.assertEqual(
Walter Dörwald1083c242005-01-21 21:16:51 +0000689 a[2:1],
690 array.array(self.typecode)
691 )
692
693 self.assertEqual(
Walter Dörwald7fd94242003-05-18 00:47:47 +0000694 a[1000:],
695 array.array(self.typecode)
696 )
697 self.assertEqual(a[-1000:], a)
698 self.assertEqual(a[:1000], a)
699 self.assertEqual(
700 a[:-1000],
701 array.array(self.typecode)
702 )
703 self.assertEqual(a[-1000:1000], a)
704 self.assertEqual(
705 a[2000:1000],
706 array.array(self.typecode)
707 )
708
Thomas Woutersed03b412007-08-28 21:37:11 +0000709 def test_extended_getslice(self):
710 # Test extended slicing by comparing with list slicing
711 # (Assumes list conversion works correctly, too)
712 a = array.array(self.typecode, self.example)
713 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
714 for start in indices:
715 for stop in indices:
716 # Everything except the initial 0 (invalid step)
717 for step in indices[1:]:
718 self.assertEqual(list(a[start:stop:step]),
719 list(a)[start:stop:step])
720
Walter Dörwald7fd94242003-05-18 00:47:47 +0000721 def test_setslice(self):
722 a = array.array(self.typecode, self.example)
723 a[:1] = a
724 self.assertEqual(
725 a,
726 array.array(self.typecode, self.example + self.example[1:])
727 )
728
729 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000730 a[:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000731 self.assertEqual(
732 a,
733 array.array(self.typecode, self.example + self.example[-1:])
734 )
735
736 a = array.array(self.typecode, self.example)
737 a[-1:] = a
738 self.assertEqual(
739 a,
740 array.array(self.typecode, self.example[:-1] + self.example)
741 )
742
743 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000744 a[1:] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000745 self.assertEqual(
746 a,
747 array.array(self.typecode, self.example[:1] + self.example)
748 )
749
750 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000751 a[1:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000752 self.assertEqual(
753 a,
754 array.array(
755 self.typecode,
756 self.example[:1] + self.example + self.example[-1:]
757 )
758 )
759
760 a = array.array(self.typecode, self.example)
761 a[1000:] = a
762 self.assertEqual(
763 a,
764 array.array(self.typecode, 2*self.example)
765 )
766
767 a = array.array(self.typecode, self.example)
768 a[-1000:] = a
769 self.assertEqual(
770 a,
771 array.array(self.typecode, self.example)
772 )
773
774 a = array.array(self.typecode, self.example)
775 a[:1000] = a
776 self.assertEqual(
777 a,
778 array.array(self.typecode, self.example)
779 )
780
781 a = array.array(self.typecode, self.example)
782 a[:-1000] = a
783 self.assertEqual(
784 a,
785 array.array(self.typecode, 2*self.example)
786 )
787
788 a = array.array(self.typecode, self.example)
789 a[1:0] = a
790 self.assertEqual(
791 a,
792 array.array(self.typecode, self.example[:1] + self.example + self.example[1:])
793 )
794
795 a = array.array(self.typecode, self.example)
796 a[2000:1000] = a
797 self.assertEqual(
798 a,
799 array.array(self.typecode, 2*self.example)
800 )
801
802 a = array.array(self.typecode, self.example)
Thomas Woutersed03b412007-08-28 21:37:11 +0000803 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), None)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000804 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), None)
805
806 b = array.array(self.badtypecode())
Thomas Woutersed03b412007-08-28 21:37:11 +0000807 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000808 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), b)
809
Thomas Woutersed03b412007-08-28 21:37:11 +0000810 def test_extended_set_del_slice(self):
811 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
812 for start in indices:
813 for stop in indices:
814 # Everything except the initial 0 (invalid step)
815 for step in indices[1:]:
816 a = array.array(self.typecode, self.example)
817 L = list(a)
818 # Make sure we have a slice of exactly the right length,
819 # but with (hopefully) different data.
820 data = L[start:stop:step]
821 data.reverse()
822 L[start:stop:step] = data
823 a[start:stop:step] = array.array(self.typecode, data)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000824 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000825
826 del L[start:stop:step]
827 del a[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +0000828 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000829
Walter Dörwald7fd94242003-05-18 00:47:47 +0000830 def test_index(self):
831 example = 2*self.example
832 a = array.array(self.typecode, example)
833 self.assertRaises(TypeError, a.index)
834 for x in example:
835 self.assertEqual(a.index(x), example.index(x))
836 self.assertRaises(ValueError, a.index, None)
837 self.assertRaises(ValueError, a.index, self.outside)
838
839 def test_count(self):
840 example = 2*self.example
841 a = array.array(self.typecode, example)
842 self.assertRaises(TypeError, a.count)
843 for x in example:
844 self.assertEqual(a.count(x), example.count(x))
845 self.assertEqual(a.count(self.outside), 0)
846 self.assertEqual(a.count(None), 0)
847
848 def test_remove(self):
849 for x in self.example:
850 example = 2*self.example
851 a = array.array(self.typecode, example)
852 pos = example.index(x)
853 example2 = example[:pos] + example[pos+1:]
854 a.remove(x)
855 self.assertEqual(a, array.array(self.typecode, example2))
856
857 a = array.array(self.typecode, self.example)
858 self.assertRaises(ValueError, a.remove, self.outside)
859
860 self.assertRaises(ValueError, a.remove, None)
861
862 def test_pop(self):
863 a = array.array(self.typecode)
864 self.assertRaises(IndexError, a.pop)
865
866 a = array.array(self.typecode, 2*self.example)
867 self.assertRaises(TypeError, a.pop, 42, 42)
868 self.assertRaises(TypeError, a.pop, None)
869 self.assertRaises(IndexError, a.pop, len(a))
870 self.assertRaises(IndexError, a.pop, -len(a)-1)
871
872 self.assertEntryEqual(a.pop(0), self.example[0])
873 self.assertEqual(
874 a,
875 array.array(self.typecode, self.example[1:]+self.example)
876 )
877 self.assertEntryEqual(a.pop(1), self.example[2])
878 self.assertEqual(
879 a,
880 array.array(self.typecode, self.example[1:2]+self.example[3:]+self.example)
881 )
882 self.assertEntryEqual(a.pop(0), self.example[1])
883 self.assertEntryEqual(a.pop(), self.example[-1])
884 self.assertEqual(
885 a,
886 array.array(self.typecode, self.example[3:]+self.example[:-1])
887 )
888
889 def test_reverse(self):
890 a = array.array(self.typecode, self.example)
891 self.assertRaises(TypeError, a.reverse, 42)
Fred Drake004d5e62000-10-23 17:22:08 +0000892 a.reverse()
Walter Dörwald7fd94242003-05-18 00:47:47 +0000893 self.assertEqual(
894 a,
895 array.array(self.typecode, self.example[::-1])
896 )
897
898 def test_extend(self):
899 a = array.array(self.typecode, self.example)
900 self.assertRaises(TypeError, a.extend)
901 a.extend(array.array(self.typecode, self.example[::-1]))
902 self.assertEqual(
903 a,
904 array.array(self.typecode, self.example+self.example[::-1])
905 )
906
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000907 a = array.array(self.typecode, self.example)
908 a.extend(a)
909 self.assertEqual(
910 a,
911 array.array(self.typecode, self.example+self.example)
912 )
913
Walter Dörwald7fd94242003-05-18 00:47:47 +0000914 b = array.array(self.badtypecode())
915 self.assertRaises(TypeError, a.extend, b)
916
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000917 a = array.array(self.typecode, self.example)
918 a.extend(self.example[::-1])
919 self.assertEqual(
920 a,
921 array.array(self.typecode, self.example+self.example[::-1])
922 )
923
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +0000924 def test_constructor_with_iterable_argument(self):
925 a = array.array(self.typecode, iter(self.example))
926 b = array.array(self.typecode, self.example)
927 self.assertEqual(a, b)
928
929 # non-iterable argument
930 self.assertRaises(TypeError, array.array, self.typecode, 10)
931
932 # pass through errors raised in __iter__
933 class A:
934 def __iter__(self):
935 raise UnicodeError
936 self.assertRaises(UnicodeError, array.array, self.typecode, A())
937
938 # pass through errors raised in next()
939 def B():
940 raise UnicodeError
941 yield None
942 self.assertRaises(UnicodeError, array.array, self.typecode, B())
943
Walter Dörwald7fd94242003-05-18 00:47:47 +0000944 def test_coveritertraverse(self):
945 try:
946 import gc
947 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -0600948 self.skipTest('gc module not available')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000949 a = array.array(self.typecode)
950 l = [iter(a)]
951 l.append(l)
952 gc.collect()
953
954 def test_buffer(self):
955 a = array.array(self.typecode, self.example)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000956 m = memoryview(a)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000957 expected = m.tobytes()
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000958 self.assertEqual(a.tobytes(), expected)
959 self.assertEqual(a.tobytes()[0], expected[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000960 # Resizing is forbidden when there are buffer exports.
961 # For issue 4509, we also check after each error that
962 # the array was not modified.
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000963 self.assertRaises(BufferError, a.append, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000964 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000965 self.assertRaises(BufferError, a.extend, a[0:1])
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.remove, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000968 self.assertEqual(m.tobytes(), expected)
969 self.assertRaises(BufferError, a.pop, 0)
970 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000971 self.assertRaises(BufferError, a.fromlist, a.tolist())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000972 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000973 self.assertRaises(BufferError, a.frombytes, a.tobytes())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000974 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000975 if self.typecode == 'u':
976 self.assertRaises(BufferError, a.fromunicode, a.tounicode())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000977 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +0000978 self.assertRaises(BufferError, operator.imul, a, 2)
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, 0)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000981 self.assertEqual(m.tobytes(), expected)
982 self.assertRaises(BufferError, operator.setitem, a, slice(0, 0), a)
983 self.assertEqual(m.tobytes(), expected)
984 self.assertRaises(BufferError, operator.delitem, a, 0)
985 self.assertEqual(m.tobytes(), expected)
986 self.assertRaises(BufferError, operator.delitem, a, slice(0, 1))
987 self.assertEqual(m.tobytes(), expected)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000988
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000989 def test_weakref(self):
990 s = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000991 p = weakref.proxy(s)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000992 self.assertEqual(p.tobytes(), s.tobytes())
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000993 s = None
994 self.assertRaises(ReferenceError, len, p)
995
Serhiy Storchaka43767632013-11-03 21:31:38 +0200996 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
997 'test needs sys.getrefcount()')
Skip Montanarod5cf0b82003-08-03 23:02:10 +0000998 def test_bug_782369(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200999 for i in range(10):
1000 b = array.array('B', range(64))
1001 rc = sys.getrefcount(10)
1002 for i in range(10):
1003 b = array.array('B', range(64))
1004 self.assertEqual(rc, sys.getrefcount(10))
Skip Montanarod5cf0b82003-08-03 23:02:10 +00001005
Thomas Woutersb2137042007-02-01 18:02:27 +00001006 def test_subclass_with_kwargs(self):
1007 # SF bug #1486663 -- this used to erroneously raise a TypeError
1008 ArraySubclassWithKwargs('b', newarg=1)
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001009
Guido van Rossum6b826ab2007-07-03 16:22:09 +00001010 def test_create_from_bytes(self):
Alexandre Vassalotti7e4f3212009-07-05 05:38:18 +00001011 # XXX This test probably needs to be moved in a subclass or
1012 # generalized to use self.typecode.
Guido van Rossum6b826ab2007-07-03 16:22:09 +00001013 a = array.array('H', b"1234")
1014 self.assertEqual(len(a) * a.itemsize, 4)
1015
Meador Inge03b4d502012-08-10 22:35:45 -05001016 @support.cpython_only
1017 def test_sizeof_with_buffer(self):
1018 a = array.array(self.typecode, self.example)
Meador Inge80dd1af2012-08-10 23:21:39 -05001019 basesize = support.calcvobjsize('Pn2Pi')
Meador Inge03b4d502012-08-10 22:35:45 -05001020 buffer_size = a.buffer_info()[1] * a.itemsize
1021 support.check_sizeof(self, a, basesize + buffer_size)
1022
1023 @support.cpython_only
1024 def test_sizeof_without_buffer(self):
1025 a = array.array(self.typecode)
Meador Inge80dd1af2012-08-10 23:21:39 -05001026 basesize = support.calcvobjsize('Pn2Pi')
Meador Inge03b4d502012-08-10 22:35:45 -05001027 support.check_sizeof(self, a, basesize)
1028
Alexandre Vassalotti9730e332013-11-29 20:47:15 -08001029 def test_initialize_with_unicode(self):
1030 if self.typecode != 'u':
1031 with self.assertRaises(TypeError) as cm:
1032 a = array.array(self.typecode, 'foo')
1033 self.assertIn("cannot use a str", str(cm.exception))
1034 with self.assertRaises(TypeError) as cm:
1035 a = array.array(self.typecode, array.array('u', 'foo'))
1036 self.assertIn("cannot use a unicode array", str(cm.exception))
1037 else:
1038 a = array.array(self.typecode, "foo")
1039 a = array.array(self.typecode, array.array('u', 'foo'))
1040
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001041
Walter Dörwald7fd94242003-05-18 00:47:47 +00001042class StringTest(BaseTest):
1043
1044 def test_setitem(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001045 super().test_setitem()
Walter Dörwald7fd94242003-05-18 00:47:47 +00001046 a = array.array(self.typecode, self.example)
1047 self.assertRaises(TypeError, a.__setitem__, 0, self.example[:2])
1048
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001049class UnicodeTest(StringTest, unittest.TestCase):
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001050 typecode = 'u'
1051 example = '\x01\u263a\x00\ufeff'
1052 smallerexample = '\x01\u263a\x00\ufefe'
1053 biggerexample = '\x01\u263a\x01\ufeff'
1054 outside = str('\x33')
Victor Stinner8d4734f2012-08-08 20:09:21 +02001055 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001056
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001057 def test_unicode(self):
1058 self.assertRaises(TypeError, array.array, 'b', 'foo')
Walter Dörwald7fd94242003-05-18 00:47:47 +00001059
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001060 a = array.array('u', '\xa0\xc2\u1234')
1061 a.fromunicode(' ')
1062 a.fromunicode('')
1063 a.fromunicode('')
1064 a.fromunicode('\x11abc\xff\u1234')
1065 s = a.tounicode()
1066 self.assertEqual(s, '\xa0\xc2\u1234 \x11abc\xff\u1234')
Victor Stinner9d512ab2012-08-09 00:43:56 +02001067 self.assertEqual(a.itemsize, sizeof_wchar)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001068
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001069 s = '\x00="\'a\\b\x80\xff\u0000\u0001\u1234'
1070 a = array.array('u', s)
1071 self.assertEqual(
1072 repr(a),
Georg Brandl559e5d72008-06-11 18:37:52 +00001073 "array('u', '\\x00=\"\\'a\\\\b\\x80\xff\\x00\\x01\u1234')")
Walter Dörwald7fd94242003-05-18 00:47:47 +00001074
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001075 self.assertRaises(TypeError, a.fromunicode)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001076
Victor Stinner29ec5952013-02-26 00:27:38 +01001077 def test_issue17223(self):
1078 # this used to crash
Victor Stinnerc472c5d2013-02-26 22:52:11 +01001079 if sizeof_wchar == 4:
1080 # U+FFFFFFFF is an invalid code point in Unicode 6.0
1081 invalid_str = b'\xff\xff\xff\xff'
1082 else:
Victor Stinner29c00342013-03-08 02:33:06 +01001083 # PyUnicode_FromUnicode() cannot fail with 16-bit wchar_t
1084 self.skipTest("specific to 32-bit wchar_t")
Victor Stinnerc472c5d2013-02-26 22:52:11 +01001085 a = array.array('u', invalid_str)
Victor Stinner29ec5952013-02-26 00:27:38 +01001086 self.assertRaises(ValueError, a.tounicode)
1087 self.assertRaises(ValueError, str, a)
1088
Walter Dörwald7fd94242003-05-18 00:47:47 +00001089class NumberTest(BaseTest):
1090
1091 def test_extslice(self):
1092 a = array.array(self.typecode, range(5))
1093 self.assertEqual(a[::], a)
1094 self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
1095 self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
1096 self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
1097 self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
1098 self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
1099 self.assertEqual(a[-100:100:], a)
1100 self.assertEqual(a[100:-100:-1], a[::-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +00001101 self.assertEqual(a[-100:100:2], array.array(self.typecode, [0,2,4]))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001102 self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
1103 self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
1104
1105 def test_delslice(self):
1106 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001107 del a[::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001108 self.assertEqual(a, array.array(self.typecode, [1,3]))
1109 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001110 del a[1::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001111 self.assertEqual(a, array.array(self.typecode, [0,2,4]))
1112 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001113 del a[1::-2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001114 self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
1115 a = array.array(self.typecode, range(10))
Michael W. Hudson56796f62002-07-29 14:35:04 +00001116 del a[::1000]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001117 self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
Mark Dickinsonbc099642010-01-29 17:27:24 +00001118 # test issue7788
1119 a = array.array(self.typecode, range(10))
1120 del a[9::1<<333]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001121
1122 def test_assignment(self):
1123 a = array.array(self.typecode, range(10))
1124 a[::2] = array.array(self.typecode, [42]*5)
1125 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
1126 a = array.array(self.typecode, range(10))
1127 a[::-4] = array.array(self.typecode, [10]*3)
1128 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
1129 a = array.array(self.typecode, range(4))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001130 a[::-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +00001131 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
1132 a = array.array(self.typecode, range(10))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001133 b = a[:]
1134 c = a[:]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001135 ins = array.array(self.typecode, range(2))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001136 a[2:3] = ins
1137 b[slice(2,3)] = ins
1138 c[2:3:] = ins
Fred Drake004d5e62000-10-23 17:22:08 +00001139
Walter Dörwald7fd94242003-05-18 00:47:47 +00001140 def test_iterationcontains(self):
1141 a = array.array(self.typecode, range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +00001142 self.assertEqual(list(a), list(range(10)))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001143 b = array.array(self.typecode, [20])
1144 self.assertEqual(a[-1] in a, True)
1145 self.assertEqual(b[0] not in a, True)
1146
1147 def check_overflow(self, lower, upper):
1148 # method to be used by subclasses
1149
1150 # should not overflow assigning lower limit
1151 a = array.array(self.typecode, [lower])
1152 a[0] = lower
1153 # should overflow assigning less than lower limit
1154 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
1155 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
1156 # should not overflow assigning upper limit
1157 a = array.array(self.typecode, [upper])
1158 a[0] = upper
1159 # should overflow assigning more than upper limit
1160 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
1161 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
1162
1163 def test_subclassing(self):
1164 typecode = self.typecode
1165 class ExaggeratingArray(array.array):
1166 __slots__ = ['offset']
1167
1168 def __new__(cls, typecode, data, offset):
1169 return array.array.__new__(cls, typecode, data)
1170
1171 def __init__(self, typecode, data, offset):
1172 self.offset = offset
1173
1174 def __getitem__(self, i):
1175 return array.array.__getitem__(self, i) + self.offset
1176
1177 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
1178 self.assertEntryEqual(a[0], 7)
1179
1180 self.assertRaises(AttributeError, setattr, a, "color", "blue")
1181
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00001182 def test_frombytearray(self):
1183 a = array.array('b', range(10))
1184 b = array.array(self.typecode, a)
1185 self.assertEqual(a, b)
1186
Walter Dörwald7fd94242003-05-18 00:47:47 +00001187class SignedNumberTest(NumberTest):
1188 example = [-1, 0, 1, 42, 0x7f]
1189 smallerexample = [-1, 0, 1, 42, 0x7e]
1190 biggerexample = [-1, 0, 1, 43, 0x7f]
1191 outside = 23
1192
1193 def test_overflow(self):
1194 a = array.array(self.typecode)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001195 lower = -1 * int(pow(2, a.itemsize * 8 - 1))
1196 upper = int(pow(2, a.itemsize * 8 - 1)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001197 self.check_overflow(lower, upper)
1198
1199class UnsignedNumberTest(NumberTest):
1200 example = [0, 1, 17, 23, 42, 0xff]
1201 smallerexample = [0, 1, 17, 23, 42, 0xfe]
1202 biggerexample = [0, 1, 17, 23, 43, 0xff]
1203 outside = 0xaa
1204
1205 def test_overflow(self):
1206 a = array.array(self.typecode)
1207 lower = 0
Guido van Rossume2a383d2007-01-15 16:59:06 +00001208 upper = int(pow(2, a.itemsize * 8)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001209 self.check_overflow(lower, upper)
Fred Drake004d5e62000-10-23 17:22:08 +00001210
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001211 def test_bytes_extend(self):
1212 s = bytes(self.example)
1213
1214 a = array.array(self.typecode, self.example)
1215 a.extend(s)
1216 self.assertEqual(
1217 a,
1218 array.array(self.typecode, self.example+self.example)
1219 )
1220
1221 a = array.array(self.typecode, self.example)
1222 a.extend(bytearray(reversed(s)))
1223 self.assertEqual(
1224 a,
1225 array.array(self.typecode, self.example+self.example[::-1])
1226 )
1227
Fred Drake004d5e62000-10-23 17:22:08 +00001228
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001229class ByteTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001230 typecode = 'b'
1231 minitemsize = 1
Fred Drake004d5e62000-10-23 17:22:08 +00001232
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001233class UnsignedByteTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001234 typecode = 'B'
1235 minitemsize = 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001236
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001237class ShortTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001238 typecode = 'h'
1239 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001240
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001241class UnsignedShortTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001242 typecode = 'H'
1243 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001244
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001245class IntTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001246 typecode = 'i'
1247 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001248
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001249class UnsignedIntTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001250 typecode = 'I'
1251 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001252
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001253class LongTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001254 typecode = 'l'
1255 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001256
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001257class UnsignedLongTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001258 typecode = 'L'
1259 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001260
Meador Inge1c9f0c92011-09-20 19:55:51 -05001261@unittest.skipIf(not have_long_long, 'need long long support')
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001262class LongLongTest(SignedNumberTest, unittest.TestCase):
Meador Inge1c9f0c92011-09-20 19:55:51 -05001263 typecode = 'q'
1264 minitemsize = 8
Meador Inge1c9f0c92011-09-20 19:55:51 -05001265
1266@unittest.skipIf(not have_long_long, 'need long long support')
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001267class UnsignedLongLongTest(UnsignedNumberTest, unittest.TestCase):
Meador Inge1c9f0c92011-09-20 19:55:51 -05001268 typecode = 'Q'
1269 minitemsize = 8
Meador Inge1c9f0c92011-09-20 19:55:51 -05001270
Walter Dörwald7fd94242003-05-18 00:47:47 +00001271class FPTest(NumberTest):
1272 example = [-42.0, 0, 42, 1e5, -1e10]
1273 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
1274 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
1275 outside = 23
1276
1277 def assertEntryEqual(self, entry1, entry2):
1278 self.assertAlmostEqual(entry1, entry2)
1279
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001280 def test_byteswap(self):
1281 a = array.array(self.typecode, self.example)
1282 self.assertRaises(TypeError, a.byteswap, 42)
1283 if a.itemsize in (1, 2, 4, 8):
1284 b = array.array(self.typecode, self.example)
1285 b.byteswap()
1286 if a.itemsize==1:
1287 self.assertEqual(a, b)
1288 else:
1289 # On alphas treating the byte swapped bit patters as
1290 # floats/doubles results in floating point exceptions
1291 # => compare the 8bit string values instead
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001292 self.assertNotEqual(a.tobytes(), b.tobytes())
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001293 b.byteswap()
1294 self.assertEqual(a, b)
1295
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001296class FloatTest(FPTest, unittest.TestCase):
Neal Norwitz35c6cd02003-05-22 13:29:15 +00001297 typecode = 'f'
1298 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001299
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001300class DoubleTest(FPTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001301 typecode = 'd'
1302 minitemsize = 8
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001303
1304 def test_alloc_overflow(self):
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001305 from sys import maxsize
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001306 a = array.array('d', [-1]*65536)
1307 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001308 a *= maxsize//65536 + 1
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001309 except MemoryError:
1310 pass
1311 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001312 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001313 b = array.array('d', [ 2.71828183, 3.14159265, -1])
1314 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001315 b * (maxsize//3 + 1)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001316 except MemoryError:
1317 pass
1318 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001319 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001320
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001321
1322if __name__ == "__main__":
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001323 unittest.main()