blob: e57ff247744885e6d4ffaac746646b504b7bd059 [file] [log] [blame]
Benjamin Peterson90f5ba52010-03-11 22:53:45 +00001#! /usr/bin/env python3
Roger E. Masse8db1b071996-12-09 20:09:16 +00002"""Test the arraymodule.
Roger E. Massefab8ab81996-12-20 22:36:52 +00003 Roger E. Masse
Roger E. Masse8db1b071996-12-09 20:09:16 +00004"""
Roger E. Massefab8ab81996-12-20 22:36:52 +00005
Walter Dörwald7fd94242003-05-18 00:47:47 +00006import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00007from test import support
Alexandre Vassalottiad077152009-07-15 17:49:23 +00008import weakref
9import pickle
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +000010import operator
Alexandre Vassalottiad077152009-07-15 17:49:23 +000011import io
12import math
13import struct
Serhiy Storchaka79080682013-11-03 21:31:18 +020014import sys
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +000015import warnings
Alexandre Vassalottiad077152009-07-15 17:49:23 +000016
17import array
18from array import _array_reconstructor as array_reconstructor
19
Meador Inge1c9f0c92011-09-20 19:55:51 -050020try:
21 # Try to determine availability of long long independently
22 # of the array module under test
23 struct.calcsize('@q')
24 have_long_long = True
25except struct.error:
26 have_long_long = False
Raymond Hettingerb0900e62004-12-16 16:23:40 +000027
Victor Stinner29c00342013-03-08 02:33:06 +010028sizeof_wchar = array.array('u').itemsize
Victor Stinnerc472c5d2013-02-26 22:52:11 +010029
30
Raymond Hettingerb0900e62004-12-16 16:23:40 +000031class ArraySubclass(array.array):
32 pass
Guido van Rossumc9f8f141997-04-09 20:51:54 +000033
Thomas Woutersb2137042007-02-01 18:02:27 +000034class ArraySubclassWithKwargs(array.array):
35 def __init__(self, typecode, newarg=None):
Victor Stinner7a6a0092011-01-04 00:04:44 +000036 array.array.__init__(self)
Thomas Woutersb2137042007-02-01 18:02:27 +000037
Guido van Rossum31f72d72007-06-18 18:44:28 +000038typecodes = "ubBhHiIlLfd"
Meador Inge1c9f0c92011-09-20 19:55:51 -050039if have_long_long:
40 typecodes += 'qQ'
Martin v. Löwis99866332002-03-01 10:27:01 +000041
Walter Dörwald7fd94242003-05-18 00:47:47 +000042class BadConstructorTest(unittest.TestCase):
Martin v. Löwis99866332002-03-01 10:27:01 +000043
Walter Dörwald7fd94242003-05-18 00:47:47 +000044 def test_constructor(self):
45 self.assertRaises(TypeError, array.array)
46 self.assertRaises(TypeError, array.array, spam=42)
47 self.assertRaises(TypeError, array.array, 'xx')
48 self.assertRaises(ValueError, array.array, 'x')
Martin v. Löwis99866332002-03-01 10:27:01 +000049
Martin v. Löwis99866332002-03-01 10:27:01 +000050
Alexandre Vassalottiad077152009-07-15 17:49:23 +000051# Machine format codes.
52#
53# Search for "enum machine_format_code" in Modules/arraymodule.c to get the
54# authoritative values.
55UNKNOWN_FORMAT = -1
56UNSIGNED_INT8 = 0
57SIGNED_INT8 = 1
58UNSIGNED_INT16_LE = 2
59UNSIGNED_INT16_BE = 3
60SIGNED_INT16_LE = 4
61SIGNED_INT16_BE = 5
62UNSIGNED_INT32_LE = 6
63UNSIGNED_INT32_BE = 7
64SIGNED_INT32_LE = 8
65SIGNED_INT32_BE = 9
66UNSIGNED_INT64_LE = 10
67UNSIGNED_INT64_BE = 11
68SIGNED_INT64_LE = 12
69SIGNED_INT64_BE = 13
70IEEE_754_FLOAT_LE = 14
71IEEE_754_FLOAT_BE = 15
72IEEE_754_DOUBLE_LE = 16
73IEEE_754_DOUBLE_BE = 17
74UTF16_LE = 18
75UTF16_BE = 19
76UTF32_LE = 20
77UTF32_BE = 21
78
79class ArrayReconstructorTest(unittest.TestCase):
80
81 def test_error(self):
82 self.assertRaises(TypeError, array_reconstructor,
83 "", "b", 0, b"")
84 self.assertRaises(TypeError, array_reconstructor,
85 str, "b", 0, b"")
86 self.assertRaises(TypeError, array_reconstructor,
87 array.array, "b", '', b"")
88 self.assertRaises(TypeError, array_reconstructor,
89 array.array, "b", 0, "")
90 self.assertRaises(ValueError, array_reconstructor,
91 array.array, "?", 0, b"")
92 self.assertRaises(ValueError, array_reconstructor,
93 array.array, "b", UNKNOWN_FORMAT, b"")
94 self.assertRaises(ValueError, array_reconstructor,
95 array.array, "b", 22, b"")
96 self.assertRaises(ValueError, array_reconstructor,
97 array.array, "d", 16, b"a")
98
99 def test_numbers(self):
100 testcases = (
101 (['B', 'H', 'I', 'L'], UNSIGNED_INT8, '=BBBB',
102 [0x80, 0x7f, 0, 0xff]),
103 (['b', 'h', 'i', 'l'], SIGNED_INT8, '=bbb',
104 [-0x80, 0x7f, 0]),
105 (['H', 'I', 'L'], UNSIGNED_INT16_LE, '<HHHH',
106 [0x8000, 0x7fff, 0, 0xffff]),
107 (['H', 'I', 'L'], UNSIGNED_INT16_BE, '>HHHH',
108 [0x8000, 0x7fff, 0, 0xffff]),
109 (['h', 'i', 'l'], SIGNED_INT16_LE, '<hhh',
110 [-0x8000, 0x7fff, 0]),
111 (['h', 'i', 'l'], SIGNED_INT16_BE, '>hhh',
112 [-0x8000, 0x7fff, 0]),
113 (['I', 'L'], UNSIGNED_INT32_LE, '<IIII',
114 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
115 (['I', 'L'], UNSIGNED_INT32_BE, '>IIII',
116 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
117 (['i', 'l'], SIGNED_INT32_LE, '<iii',
118 [-1<<31, (1<<31)-1, 0]),
119 (['i', 'l'], SIGNED_INT32_BE, '>iii',
120 [-1<<31, (1<<31)-1, 0]),
121 (['L'], UNSIGNED_INT64_LE, '<QQQQ',
Alexandre Vassalotti0027d4b2009-07-15 20:53:55 +0000122 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
123 (['L'], UNSIGNED_INT64_BE, '>QQQQ',
124 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
125 (['l'], SIGNED_INT64_LE, '<qqq',
126 [-1<<31, (1<<31)-1, 0]),
127 (['l'], SIGNED_INT64_BE, '>qqq',
128 [-1<<31, (1<<31)-1, 0]),
129 # The following tests for INT64 will raise an OverflowError
130 # when run on a 32-bit machine. The tests are simply skipped
131 # in that case.
132 (['L'], UNSIGNED_INT64_LE, '<QQQQ',
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000133 [1<<63, (1<<63)-1, 0, (1<<64)-1]),
134 (['L'], UNSIGNED_INT64_BE, '>QQQQ',
135 [1<<63, (1<<63)-1, 0, (1<<64)-1]),
136 (['l'], SIGNED_INT64_LE, '<qqq',
137 [-1<<63, (1<<63)-1, 0]),
138 (['l'], SIGNED_INT64_BE, '>qqq',
139 [-1<<63, (1<<63)-1, 0]),
140 (['f'], IEEE_754_FLOAT_LE, '<ffff',
141 [16711938.0, float('inf'), float('-inf'), -0.0]),
142 (['f'], IEEE_754_FLOAT_BE, '>ffff',
143 [16711938.0, float('inf'), float('-inf'), -0.0]),
144 (['d'], IEEE_754_DOUBLE_LE, '<dddd',
145 [9006104071832581.0, float('inf'), float('-inf'), -0.0]),
146 (['d'], IEEE_754_DOUBLE_BE, '>dddd',
147 [9006104071832581.0, float('inf'), float('-inf'), -0.0])
148 )
149 for testcase in testcases:
150 valid_typecodes, mformat_code, struct_fmt, values = testcase
151 arraystr = struct.pack(struct_fmt, *values)
152 for typecode in valid_typecodes:
Alexandre Vassalotti0027d4b2009-07-15 20:53:55 +0000153 try:
154 a = array.array(typecode, values)
155 except OverflowError:
156 continue # Skip this test case.
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000157 b = array_reconstructor(
158 array.array, typecode, mformat_code, arraystr)
159 self.assertEqual(a, b,
160 msg="{0!r} != {1!r}; testcase={2!r}".format(a, b, testcase))
161
162 def test_unicode(self):
163 teststr = "Bonne Journ\xe9e \U0002030a\U00020347"
164 testcases = (
165 (UTF16_LE, "UTF-16-LE"),
166 (UTF16_BE, "UTF-16-BE"),
167 (UTF32_LE, "UTF-32-LE"),
168 (UTF32_BE, "UTF-32-BE")
169 )
170 for testcase in testcases:
171 mformat_code, encoding = testcase
172 a = array.array('u', teststr)
173 b = array_reconstructor(
174 array.array, 'u', mformat_code, teststr.encode(encoding))
175 self.assertEqual(a, b,
176 msg="{0!r} != {1!r}; testcase={2!r}".format(a, b, testcase))
177
178
Ezio Melotti1d3e96d2013-01-10 06:04:50 +0200179class BaseTest:
Walter Dörwald7fd94242003-05-18 00:47:47 +0000180 # Required class attributes (provided by subclasses
181 # typecode: the typecode to test
182 # example: an initializer usable in the constructor for this type
183 # smallerexample: the same length as example, but smaller
184 # biggerexample: the same length as example, but bigger
185 # outside: An entry that is not in example
186 # minitemsize: the minimum guaranteed itemsize
Martin v. Löwis99866332002-03-01 10:27:01 +0000187
Walter Dörwald7fd94242003-05-18 00:47:47 +0000188 def assertEntryEqual(self, entry1, entry2):
189 self.assertEqual(entry1, entry2)
Martin v. Löwis99866332002-03-01 10:27:01 +0000190
Walter Dörwald7fd94242003-05-18 00:47:47 +0000191 def badtypecode(self):
192 # Return a typecode that is different from our own
193 return typecodes[(typecodes.index(self.typecode)+1) % len(typecodes)]
Martin v. Löwis99866332002-03-01 10:27:01 +0000194
Walter Dörwald7fd94242003-05-18 00:47:47 +0000195 def test_constructor(self):
196 a = array.array(self.typecode)
197 self.assertEqual(a.typecode, self.typecode)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000198 self.assertTrue(a.itemsize>=self.minitemsize)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000199 self.assertRaises(TypeError, array.array, self.typecode, None)
Martin v. Löwis99866332002-03-01 10:27:01 +0000200
Walter Dörwald7fd94242003-05-18 00:47:47 +0000201 def test_len(self):
202 a = array.array(self.typecode)
203 a.append(self.example[0])
204 self.assertEqual(len(a), 1)
Martin v. Löwis99866332002-03-01 10:27:01 +0000205
Walter Dörwald7fd94242003-05-18 00:47:47 +0000206 a = array.array(self.typecode, self.example)
207 self.assertEqual(len(a), len(self.example))
Martin v. Löwis99866332002-03-01 10:27:01 +0000208
Walter Dörwald7fd94242003-05-18 00:47:47 +0000209 def test_buffer_info(self):
210 a = array.array(self.typecode, self.example)
211 self.assertRaises(TypeError, a.buffer_info, 42)
212 bi = a.buffer_info()
Ezio Melottie9615932010-01-24 19:26:24 +0000213 self.assertIsInstance(bi, tuple)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000214 self.assertEqual(len(bi), 2)
Ezio Melottie9615932010-01-24 19:26:24 +0000215 self.assertIsInstance(bi[0], int)
216 self.assertIsInstance(bi[1], int)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000217 self.assertEqual(bi[1], len(a))
Martin v. Löwis99866332002-03-01 10:27:01 +0000218
Walter Dörwald7fd94242003-05-18 00:47:47 +0000219 def test_byteswap(self):
Victor Stinner8dba4e02011-09-30 00:51:10 +0200220 if self.typecode == 'u':
221 example = '\U00100100'
222 else:
223 example = self.example
224 a = array.array(self.typecode, example)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000225 self.assertRaises(TypeError, a.byteswap, 42)
226 if a.itemsize in (1, 2, 4, 8):
Victor Stinner8dba4e02011-09-30 00:51:10 +0200227 b = array.array(self.typecode, example)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000228 b.byteswap()
229 if a.itemsize==1:
230 self.assertEqual(a, b)
231 else:
232 self.assertNotEqual(a, b)
233 b.byteswap()
234 self.assertEqual(a, b)
Martin v. Löwis99866332002-03-01 10:27:01 +0000235
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000236 def test_copy(self):
237 import copy
238 a = array.array(self.typecode, self.example)
239 b = copy.copy(a)
240 self.assertNotEqual(id(a), id(b))
241 self.assertEqual(a, b)
242
Thomas Wouters89f507f2006-12-13 04:49:30 +0000243 def test_deepcopy(self):
244 import copy
245 a = array.array(self.typecode, self.example)
246 b = copy.deepcopy(a)
247 self.assertNotEqual(id(a), id(b))
248 self.assertEqual(a, b)
249
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000250 def test_reduce_ex(self):
251 a = array.array(self.typecode, self.example)
252 for protocol in range(3):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000253 self.assertIs(a.__reduce_ex__(protocol)[0], array.array)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000254 for protocol in range(3, pickle.HIGHEST_PROTOCOL):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000255 self.assertIs(a.__reduce_ex__(protocol)[0], array_reconstructor)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000256
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000257 def test_pickle(self):
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000258 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000259 a = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000260 b = pickle.loads(pickle.dumps(a, protocol))
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000261 self.assertNotEqual(id(a), id(b))
262 self.assertEqual(a, b)
263
264 a = ArraySubclass(self.typecode, self.example)
265 a.x = 10
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000266 b = pickle.loads(pickle.dumps(a, protocol))
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000267 self.assertNotEqual(id(a), id(b))
268 self.assertEqual(a, b)
269 self.assertEqual(a.x, b.x)
270 self.assertEqual(type(a), type(b))
271
Guido van Rossumd8faa362007-04-27 19:54:29 +0000272 def test_pickle_for_empty_array(self):
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000273 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossumd8faa362007-04-27 19:54:29 +0000274 a = array.array(self.typecode)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000275 b = pickle.loads(pickle.dumps(a, protocol))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000276 self.assertNotEqual(id(a), id(b))
277 self.assertEqual(a, b)
278
279 a = ArraySubclass(self.typecode)
280 a.x = 10
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000281 b = pickle.loads(pickle.dumps(a, protocol))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000282 self.assertNotEqual(id(a), id(b))
283 self.assertEqual(a, b)
284 self.assertEqual(a.x, b.x)
285 self.assertEqual(type(a), type(b))
286
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000287 def test_iterator_pickle(self):
288 data = array.array(self.typecode, self.example)
289 orgit = iter(data)
290 d = pickle.dumps(orgit)
291 it = pickle.loads(d)
292 self.assertEqual(type(orgit), type(it))
293 self.assertEqual(list(it), list(data))
294
295 if len(data):
296 it = pickle.loads(d)
297 next(it)
298 d = pickle.dumps(it)
299 self.assertEqual(list(it), list(data)[1:])
300
Walter Dörwald7fd94242003-05-18 00:47:47 +0000301 def test_insert(self):
302 a = array.array(self.typecode, self.example)
303 a.insert(0, self.example[0])
304 self.assertEqual(len(a), 1+len(self.example))
305 self.assertEqual(a[0], a[1])
306 self.assertRaises(TypeError, a.insert)
307 self.assertRaises(TypeError, a.insert, None)
Walter Dörwaldba39d9c2003-05-18 01:56:25 +0000308 self.assertRaises(TypeError, a.insert, 0, None)
Martin v. Löwis99866332002-03-01 10:27:01 +0000309
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000310 a = array.array(self.typecode, self.example)
311 a.insert(-1, self.example[0])
312 self.assertEqual(
313 a,
314 array.array(
315 self.typecode,
316 self.example[:-1] + self.example[:1] + self.example[-1:]
317 )
318 )
319
320 a = array.array(self.typecode, self.example)
321 a.insert(-1000, self.example[0])
322 self.assertEqual(
323 a,
324 array.array(self.typecode, self.example[:1] + self.example)
325 )
326
327 a = array.array(self.typecode, self.example)
328 a.insert(1000, self.example[0])
329 self.assertEqual(
330 a,
331 array.array(self.typecode, self.example + self.example[:1])
332 )
333
Walter Dörwald7fd94242003-05-18 00:47:47 +0000334 def test_tofromfile(self):
335 a = array.array(self.typecode, 2*self.example)
336 self.assertRaises(TypeError, a.tofile)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000337 support.unlink(support.TESTFN)
338 f = open(support.TESTFN, 'wb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000339 try:
340 a.tofile(f)
341 f.close()
342 b = array.array(self.typecode)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000343 f = open(support.TESTFN, 'rb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000344 self.assertRaises(TypeError, b.fromfile)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000345 b.fromfile(f, len(self.example))
346 self.assertEqual(b, array.array(self.typecode, self.example))
347 self.assertNotEqual(a, b)
Hirokazu Yamamoto54d0df62009-03-06 03:04:07 +0000348 self.assertRaises(EOFError, b.fromfile, f, len(self.example)+1)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000349 self.assertEqual(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000350 f.close()
351 finally:
352 if not f.closed:
353 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000354 support.unlink(support.TESTFN)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000355
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000356 def test_fromfile_ioerror(self):
357 # Issue #5395: Check if fromfile raises a proper IOError
358 # instead of EOFError.
359 a = array.array(self.typecode)
360 f = open(support.TESTFN, 'wb')
361 try:
362 self.assertRaises(IOError, a.fromfile, f, len(self.example))
363 finally:
364 f.close()
365 support.unlink(support.TESTFN)
366
Frank Wierzbicki17683432009-08-16 20:30:12 +0000367 def test_filewrite(self):
368 a = array.array(self.typecode, 2*self.example)
369 f = open(support.TESTFN, 'wb')
370 try:
371 f.write(a)
372 f.close()
373 b = array.array(self.typecode)
374 f = open(support.TESTFN, 'rb')
375 b.fromfile(f, len(self.example))
376 self.assertEqual(b, array.array(self.typecode, self.example))
377 self.assertNotEqual(a, b)
378 b.fromfile(f, len(self.example))
379 self.assertEqual(a, b)
380 f.close()
381 finally:
382 if not f.closed:
383 f.close()
384 support.unlink(support.TESTFN)
385
Walter Dörwald7fd94242003-05-18 00:47:47 +0000386 def test_tofromlist(self):
387 a = array.array(self.typecode, 2*self.example)
388 b = array.array(self.typecode)
389 self.assertRaises(TypeError, a.tolist, 42)
390 self.assertRaises(TypeError, b.fromlist)
391 self.assertRaises(TypeError, b.fromlist, 42)
392 self.assertRaises(TypeError, b.fromlist, [None])
393 b.fromlist(a.tolist())
394 self.assertEqual(a, b)
Fred Drake78334472000-06-28 17:50:51 +0000395
Walter Dörwald7fd94242003-05-18 00:47:47 +0000396 def test_tofromstring(self):
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000397 nb_warnings = 4
398 with warnings.catch_warnings(record=True) as r:
399 warnings.filterwarnings("always",
400 message=r"(to|from)string\(\) is deprecated",
401 category=DeprecationWarning)
402 a = array.array(self.typecode, 2*self.example)
403 b = array.array(self.typecode)
404 self.assertRaises(TypeError, a.tostring, 42)
405 self.assertRaises(TypeError, b.fromstring)
406 self.assertRaises(TypeError, b.fromstring, 42)
407 b.fromstring(a.tostring())
408 self.assertEqual(a, b)
409 if a.itemsize>1:
410 self.assertRaises(ValueError, b.fromstring, "x")
411 nb_warnings += 1
412 self.assertEqual(len(r), nb_warnings)
413
414 def test_tofrombytes(self):
Walter Dörwald7fd94242003-05-18 00:47:47 +0000415 a = array.array(self.typecode, 2*self.example)
416 b = array.array(self.typecode)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000417 self.assertRaises(TypeError, a.tobytes, 42)
418 self.assertRaises(TypeError, b.frombytes)
419 self.assertRaises(TypeError, b.frombytes, 42)
420 b.frombytes(a.tobytes())
421 c = array.array(self.typecode, bytearray(a.tobytes()))
Walter Dörwald7fd94242003-05-18 00:47:47 +0000422 self.assertEqual(a, b)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000423 self.assertEqual(a, c)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000424 if a.itemsize>1:
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000425 self.assertRaises(ValueError, b.frombytes, b"x")
Fred Drake78334472000-06-28 17:50:51 +0000426
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +0000427 def test_fromarray(self):
428 a = array.array(self.typecode, self.example)
429 b = array.array(self.typecode, a)
430 self.assertEqual(a, b)
431
Walter Dörwald7fd94242003-05-18 00:47:47 +0000432 def test_repr(self):
433 a = array.array(self.typecode, 2*self.example)
434 self.assertEqual(a, eval(repr(a), {"array": array.array}))
Fred Drake78334472000-06-28 17:50:51 +0000435
Walter Dörwald7fd94242003-05-18 00:47:47 +0000436 a = array.array(self.typecode)
437 self.assertEqual(repr(a), "array('%s')" % self.typecode)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000438
Walter Dörwald7fd94242003-05-18 00:47:47 +0000439 def test_str(self):
440 a = array.array(self.typecode, 2*self.example)
441 str(a)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000442
Walter Dörwald7fd94242003-05-18 00:47:47 +0000443 def test_cmp(self):
444 a = array.array(self.typecode, self.example)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000445 self.assertTrue((a == 42) is False)
446 self.assertTrue((a != 42) is True)
Tim Peterscc78e472000-11-14 21:36:07 +0000447
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000448 self.assertTrue((a == a) is True)
449 self.assertTrue((a != a) is False)
450 self.assertTrue((a < a) is False)
451 self.assertTrue((a <= a) is True)
452 self.assertTrue((a > a) is False)
453 self.assertTrue((a >= a) is True)
Tim Peterscc78e472000-11-14 21:36:07 +0000454
Neal Norwitzbd2835c2006-03-17 08:54:15 +0000455 al = array.array(self.typecode, self.smallerexample)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000456 ab = array.array(self.typecode, self.biggerexample)
Guido van Rossum7f1d3aa1998-07-16 15:31:43 +0000457
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000458 self.assertTrue((a == 2*a) is False)
459 self.assertTrue((a != 2*a) is True)
460 self.assertTrue((a < 2*a) is True)
461 self.assertTrue((a <= 2*a) is True)
462 self.assertTrue((a > 2*a) is False)
463 self.assertTrue((a >= 2*a) is False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000464
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000465 self.assertTrue((a == al) is False)
466 self.assertTrue((a != al) is True)
467 self.assertTrue((a < al) is False)
468 self.assertTrue((a <= al) is False)
469 self.assertTrue((a > al) is True)
470 self.assertTrue((a >= al) is True)
Martin v. Löwis99866332002-03-01 10:27:01 +0000471
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000472 self.assertTrue((a == ab) is False)
473 self.assertTrue((a != ab) is True)
474 self.assertTrue((a < ab) is True)
475 self.assertTrue((a <= ab) is True)
476 self.assertTrue((a > ab) is False)
477 self.assertTrue((a >= ab) is False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000478
Walter Dörwald7fd94242003-05-18 00:47:47 +0000479 def test_add(self):
480 a = array.array(self.typecode, self.example) \
481 + array.array(self.typecode, self.example[::-1])
482 self.assertEqual(
483 a,
484 array.array(self.typecode, self.example + self.example[::-1])
485 )
Martin v. Löwis99866332002-03-01 10:27:01 +0000486
Walter Dörwald7fd94242003-05-18 00:47:47 +0000487 b = array.array(self.badtypecode())
488 self.assertRaises(TypeError, a.__add__, b)
489
490 self.assertRaises(TypeError, a.__add__, "bad")
491
492 def test_iadd(self):
493 a = array.array(self.typecode, self.example[::-1])
494 b = a
495 a += array.array(self.typecode, 2*self.example)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000496 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000497 self.assertEqual(
498 a,
499 array.array(self.typecode, self.example[::-1]+2*self.example)
500 )
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000501 a = array.array(self.typecode, self.example)
502 a += a
503 self.assertEqual(
504 a,
505 array.array(self.typecode, self.example + self.example)
506 )
Walter Dörwald7fd94242003-05-18 00:47:47 +0000507
508 b = array.array(self.badtypecode())
509 self.assertRaises(TypeError, a.__add__, b)
510
511 self.assertRaises(TypeError, a.__iadd__, "bad")
512
513 def test_mul(self):
514 a = 5*array.array(self.typecode, self.example)
515 self.assertEqual(
516 a,
517 array.array(self.typecode, 5*self.example)
518 )
519
520 a = array.array(self.typecode, self.example)*5
521 self.assertEqual(
522 a,
523 array.array(self.typecode, self.example*5)
524 )
525
526 a = 0*array.array(self.typecode, self.example)
527 self.assertEqual(
528 a,
529 array.array(self.typecode)
530 )
531
532 a = (-1)*array.array(self.typecode, self.example)
533 self.assertEqual(
534 a,
535 array.array(self.typecode)
536 )
537
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000538 a = 5 * array.array(self.typecode, self.example[:1])
539 self.assertEqual(
540 a,
541 array.array(self.typecode, [a[0]] * 5)
542 )
543
Walter Dörwald7fd94242003-05-18 00:47:47 +0000544 self.assertRaises(TypeError, a.__mul__, "bad")
545
546 def test_imul(self):
547 a = array.array(self.typecode, self.example)
548 b = a
549
550 a *= 5
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000551 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000552 self.assertEqual(
553 a,
554 array.array(self.typecode, 5*self.example)
555 )
556
557 a *= 0
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000558 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000559 self.assertEqual(a, array.array(self.typecode))
560
561 a *= 1000
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000562 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000563 self.assertEqual(a, array.array(self.typecode))
564
565 a *= -1
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000566 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000567 self.assertEqual(a, array.array(self.typecode))
568
569 a = array.array(self.typecode, self.example)
570 a *= -1
571 self.assertEqual(a, array.array(self.typecode))
572
573 self.assertRaises(TypeError, a.__imul__, "bad")
574
575 def test_getitem(self):
576 a = array.array(self.typecode, self.example)
577 self.assertEntryEqual(a[0], self.example[0])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000578 self.assertEntryEqual(a[0], self.example[0])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000579 self.assertEntryEqual(a[-1], self.example[-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000580 self.assertEntryEqual(a[-1], self.example[-1])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000581 self.assertEntryEqual(a[len(self.example)-1], self.example[-1])
582 self.assertEntryEqual(a[-len(self.example)], self.example[0])
583 self.assertRaises(TypeError, a.__getitem__)
584 self.assertRaises(IndexError, a.__getitem__, len(self.example))
585 self.assertRaises(IndexError, a.__getitem__, -len(self.example)-1)
586
587 def test_setitem(self):
588 a = array.array(self.typecode, self.example)
589 a[0] = a[-1]
590 self.assertEntryEqual(a[0], a[-1])
591
592 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000593 a[0] = a[-1]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000594 self.assertEntryEqual(a[0], a[-1])
595
596 a = array.array(self.typecode, self.example)
597 a[-1] = a[0]
598 self.assertEntryEqual(a[0], a[-1])
599
600 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000601 a[-1] = a[0]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000602 self.assertEntryEqual(a[0], a[-1])
603
604 a = array.array(self.typecode, self.example)
605 a[len(self.example)-1] = a[0]
606 self.assertEntryEqual(a[0], a[-1])
607
608 a = array.array(self.typecode, self.example)
609 a[-len(self.example)] = a[-1]
610 self.assertEntryEqual(a[0], a[-1])
611
612 self.assertRaises(TypeError, a.__setitem__)
613 self.assertRaises(TypeError, a.__setitem__, None)
614 self.assertRaises(TypeError, a.__setitem__, 0, None)
615 self.assertRaises(
616 IndexError,
617 a.__setitem__,
618 len(self.example), self.example[0]
619 )
620 self.assertRaises(
621 IndexError,
622 a.__setitem__,
623 -len(self.example)-1, self.example[0]
624 )
625
626 def test_delitem(self):
627 a = array.array(self.typecode, self.example)
628 del a[0]
629 self.assertEqual(
630 a,
631 array.array(self.typecode, self.example[1:])
632 )
633
634 a = array.array(self.typecode, self.example)
635 del a[-1]
636 self.assertEqual(
637 a,
638 array.array(self.typecode, self.example[:-1])
639 )
640
641 a = array.array(self.typecode, self.example)
642 del a[len(self.example)-1]
643 self.assertEqual(
644 a,
645 array.array(self.typecode, self.example[:-1])
646 )
647
648 a = array.array(self.typecode, self.example)
649 del a[-len(self.example)]
650 self.assertEqual(
651 a,
652 array.array(self.typecode, self.example[1:])
653 )
654
655 self.assertRaises(TypeError, a.__delitem__)
656 self.assertRaises(TypeError, a.__delitem__, None)
657 self.assertRaises(IndexError, a.__delitem__, len(self.example))
658 self.assertRaises(IndexError, a.__delitem__, -len(self.example)-1)
659
660 def test_getslice(self):
661 a = array.array(self.typecode, self.example)
662 self.assertEqual(a[:], a)
663
664 self.assertEqual(
665 a[1:],
666 array.array(self.typecode, self.example[1:])
667 )
668
669 self.assertEqual(
670 a[:1],
671 array.array(self.typecode, self.example[:1])
672 )
673
674 self.assertEqual(
675 a[:-1],
676 array.array(self.typecode, self.example[:-1])
677 )
678
679 self.assertEqual(
680 a[-1:],
681 array.array(self.typecode, self.example[-1:])
682 )
683
684 self.assertEqual(
685 a[-1:-1],
686 array.array(self.typecode)
687 )
688
689 self.assertEqual(
Walter Dörwald1083c242005-01-21 21:16:51 +0000690 a[2:1],
691 array.array(self.typecode)
692 )
693
694 self.assertEqual(
Walter Dörwald7fd94242003-05-18 00:47:47 +0000695 a[1000:],
696 array.array(self.typecode)
697 )
698 self.assertEqual(a[-1000:], a)
699 self.assertEqual(a[:1000], a)
700 self.assertEqual(
701 a[:-1000],
702 array.array(self.typecode)
703 )
704 self.assertEqual(a[-1000:1000], a)
705 self.assertEqual(
706 a[2000:1000],
707 array.array(self.typecode)
708 )
709
Thomas Woutersed03b412007-08-28 21:37:11 +0000710 def test_extended_getslice(self):
711 # Test extended slicing by comparing with list slicing
712 # (Assumes list conversion works correctly, too)
713 a = array.array(self.typecode, self.example)
714 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
715 for start in indices:
716 for stop in indices:
717 # Everything except the initial 0 (invalid step)
718 for step in indices[1:]:
719 self.assertEqual(list(a[start:stop:step]),
720 list(a)[start:stop:step])
721
Walter Dörwald7fd94242003-05-18 00:47:47 +0000722 def test_setslice(self):
723 a = array.array(self.typecode, self.example)
724 a[:1] = a
725 self.assertEqual(
726 a,
727 array.array(self.typecode, self.example + self.example[1:])
728 )
729
730 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000731 a[:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000732 self.assertEqual(
733 a,
734 array.array(self.typecode, self.example + self.example[-1:])
735 )
736
737 a = array.array(self.typecode, self.example)
738 a[-1:] = a
739 self.assertEqual(
740 a,
741 array.array(self.typecode, self.example[:-1] + self.example)
742 )
743
744 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000745 a[1:] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000746 self.assertEqual(
747 a,
748 array.array(self.typecode, self.example[:1] + self.example)
749 )
750
751 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000752 a[1:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000753 self.assertEqual(
754 a,
755 array.array(
756 self.typecode,
757 self.example[:1] + self.example + self.example[-1:]
758 )
759 )
760
761 a = array.array(self.typecode, self.example)
762 a[1000:] = a
763 self.assertEqual(
764 a,
765 array.array(self.typecode, 2*self.example)
766 )
767
768 a = array.array(self.typecode, self.example)
769 a[-1000:] = a
770 self.assertEqual(
771 a,
772 array.array(self.typecode, self.example)
773 )
774
775 a = array.array(self.typecode, self.example)
776 a[:1000] = a
777 self.assertEqual(
778 a,
779 array.array(self.typecode, self.example)
780 )
781
782 a = array.array(self.typecode, self.example)
783 a[:-1000] = a
784 self.assertEqual(
785 a,
786 array.array(self.typecode, 2*self.example)
787 )
788
789 a = array.array(self.typecode, self.example)
790 a[1:0] = a
791 self.assertEqual(
792 a,
793 array.array(self.typecode, self.example[:1] + self.example + self.example[1:])
794 )
795
796 a = array.array(self.typecode, self.example)
797 a[2000:1000] = a
798 self.assertEqual(
799 a,
800 array.array(self.typecode, 2*self.example)
801 )
802
803 a = array.array(self.typecode, self.example)
Thomas Woutersed03b412007-08-28 21:37:11 +0000804 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), None)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000805 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), None)
806
807 b = array.array(self.badtypecode())
Thomas Woutersed03b412007-08-28 21:37:11 +0000808 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000809 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), b)
810
Thomas Woutersed03b412007-08-28 21:37:11 +0000811 def test_extended_set_del_slice(self):
812 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
813 for start in indices:
814 for stop in indices:
815 # Everything except the initial 0 (invalid step)
816 for step in indices[1:]:
817 a = array.array(self.typecode, self.example)
818 L = list(a)
819 # Make sure we have a slice of exactly the right length,
820 # but with (hopefully) different data.
821 data = L[start:stop:step]
822 data.reverse()
823 L[start:stop:step] = data
824 a[start:stop:step] = array.array(self.typecode, data)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000825 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000826
827 del L[start:stop:step]
828 del a[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +0000829 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000830
Walter Dörwald7fd94242003-05-18 00:47:47 +0000831 def test_index(self):
832 example = 2*self.example
833 a = array.array(self.typecode, example)
834 self.assertRaises(TypeError, a.index)
835 for x in example:
836 self.assertEqual(a.index(x), example.index(x))
837 self.assertRaises(ValueError, a.index, None)
838 self.assertRaises(ValueError, a.index, self.outside)
839
840 def test_count(self):
841 example = 2*self.example
842 a = array.array(self.typecode, example)
843 self.assertRaises(TypeError, a.count)
844 for x in example:
845 self.assertEqual(a.count(x), example.count(x))
846 self.assertEqual(a.count(self.outside), 0)
847 self.assertEqual(a.count(None), 0)
848
849 def test_remove(self):
850 for x in self.example:
851 example = 2*self.example
852 a = array.array(self.typecode, example)
853 pos = example.index(x)
854 example2 = example[:pos] + example[pos+1:]
855 a.remove(x)
856 self.assertEqual(a, array.array(self.typecode, example2))
857
858 a = array.array(self.typecode, self.example)
859 self.assertRaises(ValueError, a.remove, self.outside)
860
861 self.assertRaises(ValueError, a.remove, None)
862
863 def test_pop(self):
864 a = array.array(self.typecode)
865 self.assertRaises(IndexError, a.pop)
866
867 a = array.array(self.typecode, 2*self.example)
868 self.assertRaises(TypeError, a.pop, 42, 42)
869 self.assertRaises(TypeError, a.pop, None)
870 self.assertRaises(IndexError, a.pop, len(a))
871 self.assertRaises(IndexError, a.pop, -len(a)-1)
872
873 self.assertEntryEqual(a.pop(0), self.example[0])
874 self.assertEqual(
875 a,
876 array.array(self.typecode, self.example[1:]+self.example)
877 )
878 self.assertEntryEqual(a.pop(1), self.example[2])
879 self.assertEqual(
880 a,
881 array.array(self.typecode, self.example[1:2]+self.example[3:]+self.example)
882 )
883 self.assertEntryEqual(a.pop(0), self.example[1])
884 self.assertEntryEqual(a.pop(), self.example[-1])
885 self.assertEqual(
886 a,
887 array.array(self.typecode, self.example[3:]+self.example[:-1])
888 )
889
890 def test_reverse(self):
891 a = array.array(self.typecode, self.example)
892 self.assertRaises(TypeError, a.reverse, 42)
Fred Drake004d5e62000-10-23 17:22:08 +0000893 a.reverse()
Walter Dörwald7fd94242003-05-18 00:47:47 +0000894 self.assertEqual(
895 a,
896 array.array(self.typecode, self.example[::-1])
897 )
898
899 def test_extend(self):
900 a = array.array(self.typecode, self.example)
901 self.assertRaises(TypeError, a.extend)
902 a.extend(array.array(self.typecode, self.example[::-1]))
903 self.assertEqual(
904 a,
905 array.array(self.typecode, self.example+self.example[::-1])
906 )
907
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000908 a = array.array(self.typecode, self.example)
909 a.extend(a)
910 self.assertEqual(
911 a,
912 array.array(self.typecode, self.example+self.example)
913 )
914
Walter Dörwald7fd94242003-05-18 00:47:47 +0000915 b = array.array(self.badtypecode())
916 self.assertRaises(TypeError, a.extend, b)
917
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000918 a = array.array(self.typecode, self.example)
919 a.extend(self.example[::-1])
920 self.assertEqual(
921 a,
922 array.array(self.typecode, self.example+self.example[::-1])
923 )
924
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +0000925 def test_constructor_with_iterable_argument(self):
926 a = array.array(self.typecode, iter(self.example))
927 b = array.array(self.typecode, self.example)
928 self.assertEqual(a, b)
929
930 # non-iterable argument
931 self.assertRaises(TypeError, array.array, self.typecode, 10)
932
933 # pass through errors raised in __iter__
934 class A:
935 def __iter__(self):
936 raise UnicodeError
937 self.assertRaises(UnicodeError, array.array, self.typecode, A())
938
939 # pass through errors raised in next()
940 def B():
941 raise UnicodeError
942 yield None
943 self.assertRaises(UnicodeError, array.array, self.typecode, B())
944
Walter Dörwald7fd94242003-05-18 00:47:47 +0000945 def test_coveritertraverse(self):
946 try:
947 import gc
948 except ImportError:
949 return
950 a = array.array(self.typecode)
951 l = [iter(a)]
952 l.append(l)
953 gc.collect()
954
955 def test_buffer(self):
956 a = array.array(self.typecode, self.example)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000957 m = memoryview(a)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000958 expected = m.tobytes()
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000959 self.assertEqual(a.tobytes(), expected)
960 self.assertEqual(a.tobytes()[0], expected[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000961 # Resizing is forbidden when there are buffer exports.
962 # For issue 4509, we also check after each error that
963 # the array was not modified.
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000964 self.assertRaises(BufferError, a.append, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000965 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000966 self.assertRaises(BufferError, a.extend, a[0:1])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000967 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000968 self.assertRaises(BufferError, a.remove, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000969 self.assertEqual(m.tobytes(), expected)
970 self.assertRaises(BufferError, a.pop, 0)
971 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000972 self.assertRaises(BufferError, a.fromlist, a.tolist())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000973 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000974 self.assertRaises(BufferError, a.frombytes, a.tobytes())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000975 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000976 if self.typecode == 'u':
977 self.assertRaises(BufferError, a.fromunicode, a.tounicode())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000978 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +0000979 self.assertRaises(BufferError, operator.imul, a, 2)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000980 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +0000981 self.assertRaises(BufferError, operator.imul, a, 0)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000982 self.assertEqual(m.tobytes(), expected)
983 self.assertRaises(BufferError, operator.setitem, a, slice(0, 0), a)
984 self.assertEqual(m.tobytes(), expected)
985 self.assertRaises(BufferError, operator.delitem, a, 0)
986 self.assertEqual(m.tobytes(), expected)
987 self.assertRaises(BufferError, operator.delitem, a, slice(0, 1))
988 self.assertEqual(m.tobytes(), expected)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000989
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000990 def test_weakref(self):
991 s = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000992 p = weakref.proxy(s)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000993 self.assertEqual(p.tobytes(), s.tobytes())
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000994 s = None
995 self.assertRaises(ReferenceError, len, p)
996
Serhiy Storchaka79080682013-11-03 21:31:18 +0200997 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
998 'test needs sys.getrefcount()')
Skip Montanarod5cf0b82003-08-03 23:02:10 +0000999 def test_bug_782369(self):
Serhiy Storchaka79080682013-11-03 21:31:18 +02001000 for i in range(10):
1001 b = array.array('B', range(64))
1002 rc = sys.getrefcount(10)
1003 for i in range(10):
1004 b = array.array('B', range(64))
1005 self.assertEqual(rc, sys.getrefcount(10))
Skip Montanarod5cf0b82003-08-03 23:02:10 +00001006
Thomas Woutersb2137042007-02-01 18:02:27 +00001007 def test_subclass_with_kwargs(self):
1008 # SF bug #1486663 -- this used to erroneously raise a TypeError
1009 ArraySubclassWithKwargs('b', newarg=1)
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001010
Guido van Rossum6b826ab2007-07-03 16:22:09 +00001011 def test_create_from_bytes(self):
Alexandre Vassalotti7e4f3212009-07-05 05:38:18 +00001012 # XXX This test probably needs to be moved in a subclass or
1013 # generalized to use self.typecode.
Guido van Rossum6b826ab2007-07-03 16:22:09 +00001014 a = array.array('H', b"1234")
1015 self.assertEqual(len(a) * a.itemsize, 4)
1016
Meador Inge03b4d502012-08-10 22:35:45 -05001017 @support.cpython_only
1018 def test_sizeof_with_buffer(self):
1019 a = array.array(self.typecode, self.example)
Meador Inge80dd1af2012-08-10 23:21:39 -05001020 basesize = support.calcvobjsize('Pn2Pi')
Meador Inge03b4d502012-08-10 22:35:45 -05001021 buffer_size = a.buffer_info()[1] * a.itemsize
1022 support.check_sizeof(self, a, basesize + buffer_size)
1023
1024 @support.cpython_only
1025 def test_sizeof_without_buffer(self):
1026 a = array.array(self.typecode)
Meador Inge80dd1af2012-08-10 23:21:39 -05001027 basesize = support.calcvobjsize('Pn2Pi')
Meador Inge03b4d502012-08-10 22:35:45 -05001028 support.check_sizeof(self, a, basesize)
1029
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001030
Walter Dörwald7fd94242003-05-18 00:47:47 +00001031class StringTest(BaseTest):
1032
1033 def test_setitem(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001034 super().test_setitem()
Walter Dörwald7fd94242003-05-18 00:47:47 +00001035 a = array.array(self.typecode, self.example)
1036 self.assertRaises(TypeError, a.__setitem__, 0, self.example[:2])
1037
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001038class UnicodeTest(StringTest, unittest.TestCase):
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001039 typecode = 'u'
1040 example = '\x01\u263a\x00\ufeff'
1041 smallerexample = '\x01\u263a\x00\ufefe'
1042 biggerexample = '\x01\u263a\x01\ufeff'
1043 outside = str('\x33')
Victor Stinner8d4734f2012-08-08 20:09:21 +02001044 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001045
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001046 def test_unicode(self):
1047 self.assertRaises(TypeError, array.array, 'b', 'foo')
Walter Dörwald7fd94242003-05-18 00:47:47 +00001048
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001049 a = array.array('u', '\xa0\xc2\u1234')
1050 a.fromunicode(' ')
1051 a.fromunicode('')
1052 a.fromunicode('')
1053 a.fromunicode('\x11abc\xff\u1234')
1054 s = a.tounicode()
1055 self.assertEqual(s, '\xa0\xc2\u1234 \x11abc\xff\u1234')
Victor Stinner9d512ab2012-08-09 00:43:56 +02001056 self.assertEqual(a.itemsize, sizeof_wchar)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001057
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001058 s = '\x00="\'a\\b\x80\xff\u0000\u0001\u1234'
1059 a = array.array('u', s)
1060 self.assertEqual(
1061 repr(a),
Georg Brandl559e5d72008-06-11 18:37:52 +00001062 "array('u', '\\x00=\"\\'a\\\\b\\x80\xff\\x00\\x01\u1234')")
Walter Dörwald7fd94242003-05-18 00:47:47 +00001063
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001064 self.assertRaises(TypeError, a.fromunicode)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001065
Victor Stinner29ec5952013-02-26 00:27:38 +01001066 def test_issue17223(self):
1067 # this used to crash
Victor Stinnerc472c5d2013-02-26 22:52:11 +01001068 if sizeof_wchar == 4:
1069 # U+FFFFFFFF is an invalid code point in Unicode 6.0
1070 invalid_str = b'\xff\xff\xff\xff'
1071 else:
Victor Stinner29c00342013-03-08 02:33:06 +01001072 # PyUnicode_FromUnicode() cannot fail with 16-bit wchar_t
1073 self.skipTest("specific to 32-bit wchar_t")
Victor Stinnerc472c5d2013-02-26 22:52:11 +01001074 a = array.array('u', invalid_str)
Victor Stinner29ec5952013-02-26 00:27:38 +01001075 self.assertRaises(ValueError, a.tounicode)
1076 self.assertRaises(ValueError, str, a)
1077
Walter Dörwald7fd94242003-05-18 00:47:47 +00001078class NumberTest(BaseTest):
1079
1080 def test_extslice(self):
1081 a = array.array(self.typecode, range(5))
1082 self.assertEqual(a[::], a)
1083 self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
1084 self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
1085 self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
1086 self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
1087 self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
1088 self.assertEqual(a[-100:100:], a)
1089 self.assertEqual(a[100:-100:-1], a[::-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +00001090 self.assertEqual(a[-100:100:2], array.array(self.typecode, [0,2,4]))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001091 self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
1092 self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
1093
1094 def test_delslice(self):
1095 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001096 del a[::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001097 self.assertEqual(a, array.array(self.typecode, [1,3]))
1098 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001099 del a[1::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001100 self.assertEqual(a, array.array(self.typecode, [0,2,4]))
1101 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001102 del a[1::-2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001103 self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
1104 a = array.array(self.typecode, range(10))
Michael W. Hudson56796f62002-07-29 14:35:04 +00001105 del a[::1000]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001106 self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
Mark Dickinsonbc099642010-01-29 17:27:24 +00001107 # test issue7788
1108 a = array.array(self.typecode, range(10))
1109 del a[9::1<<333]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001110
1111 def test_assignment(self):
1112 a = array.array(self.typecode, range(10))
1113 a[::2] = array.array(self.typecode, [42]*5)
1114 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
1115 a = array.array(self.typecode, range(10))
1116 a[::-4] = array.array(self.typecode, [10]*3)
1117 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
1118 a = array.array(self.typecode, range(4))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001119 a[::-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +00001120 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
1121 a = array.array(self.typecode, range(10))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001122 b = a[:]
1123 c = a[:]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001124 ins = array.array(self.typecode, range(2))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001125 a[2:3] = ins
1126 b[slice(2,3)] = ins
1127 c[2:3:] = ins
Fred Drake004d5e62000-10-23 17:22:08 +00001128
Walter Dörwald7fd94242003-05-18 00:47:47 +00001129 def test_iterationcontains(self):
1130 a = array.array(self.typecode, range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +00001131 self.assertEqual(list(a), list(range(10)))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001132 b = array.array(self.typecode, [20])
1133 self.assertEqual(a[-1] in a, True)
1134 self.assertEqual(b[0] not in a, True)
1135
1136 def check_overflow(self, lower, upper):
1137 # method to be used by subclasses
1138
1139 # should not overflow assigning lower limit
1140 a = array.array(self.typecode, [lower])
1141 a[0] = lower
1142 # should overflow assigning less than lower limit
1143 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
1144 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
1145 # should not overflow assigning upper limit
1146 a = array.array(self.typecode, [upper])
1147 a[0] = upper
1148 # should overflow assigning more than upper limit
1149 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
1150 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
1151
1152 def test_subclassing(self):
1153 typecode = self.typecode
1154 class ExaggeratingArray(array.array):
1155 __slots__ = ['offset']
1156
1157 def __new__(cls, typecode, data, offset):
1158 return array.array.__new__(cls, typecode, data)
1159
1160 def __init__(self, typecode, data, offset):
1161 self.offset = offset
1162
1163 def __getitem__(self, i):
1164 return array.array.__getitem__(self, i) + self.offset
1165
1166 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
1167 self.assertEntryEqual(a[0], 7)
1168
1169 self.assertRaises(AttributeError, setattr, a, "color", "blue")
1170
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00001171 def test_frombytearray(self):
1172 a = array.array('b', range(10))
1173 b = array.array(self.typecode, a)
1174 self.assertEqual(a, b)
1175
Walter Dörwald7fd94242003-05-18 00:47:47 +00001176class SignedNumberTest(NumberTest):
1177 example = [-1, 0, 1, 42, 0x7f]
1178 smallerexample = [-1, 0, 1, 42, 0x7e]
1179 biggerexample = [-1, 0, 1, 43, 0x7f]
1180 outside = 23
1181
1182 def test_overflow(self):
1183 a = array.array(self.typecode)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001184 lower = -1 * int(pow(2, a.itemsize * 8 - 1))
1185 upper = int(pow(2, a.itemsize * 8 - 1)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001186 self.check_overflow(lower, upper)
1187
1188class UnsignedNumberTest(NumberTest):
1189 example = [0, 1, 17, 23, 42, 0xff]
1190 smallerexample = [0, 1, 17, 23, 42, 0xfe]
1191 biggerexample = [0, 1, 17, 23, 43, 0xff]
1192 outside = 0xaa
1193
1194 def test_overflow(self):
1195 a = array.array(self.typecode)
1196 lower = 0
Guido van Rossume2a383d2007-01-15 16:59:06 +00001197 upper = int(pow(2, a.itemsize * 8)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001198 self.check_overflow(lower, upper)
Fred Drake004d5e62000-10-23 17:22:08 +00001199
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001200 def test_bytes_extend(self):
1201 s = bytes(self.example)
1202
1203 a = array.array(self.typecode, self.example)
1204 a.extend(s)
1205 self.assertEqual(
1206 a,
1207 array.array(self.typecode, self.example+self.example)
1208 )
1209
1210 a = array.array(self.typecode, self.example)
1211 a.extend(bytearray(reversed(s)))
1212 self.assertEqual(
1213 a,
1214 array.array(self.typecode, self.example+self.example[::-1])
1215 )
1216
Fred Drake004d5e62000-10-23 17:22:08 +00001217
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001218class ByteTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001219 typecode = 'b'
1220 minitemsize = 1
Fred Drake004d5e62000-10-23 17:22:08 +00001221
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001222class UnsignedByteTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001223 typecode = 'B'
1224 minitemsize = 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001225
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001226class ShortTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001227 typecode = 'h'
1228 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001229
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001230class UnsignedShortTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001231 typecode = 'H'
1232 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001233
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001234class IntTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001235 typecode = 'i'
1236 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001237
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001238class UnsignedIntTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001239 typecode = 'I'
1240 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001241
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001242class LongTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001243 typecode = 'l'
1244 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001245
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001246class UnsignedLongTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001247 typecode = 'L'
1248 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001249
Meador Inge1c9f0c92011-09-20 19:55:51 -05001250@unittest.skipIf(not have_long_long, 'need long long support')
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001251class LongLongTest(SignedNumberTest, unittest.TestCase):
Meador Inge1c9f0c92011-09-20 19:55:51 -05001252 typecode = 'q'
1253 minitemsize = 8
Meador Inge1c9f0c92011-09-20 19:55:51 -05001254
1255@unittest.skipIf(not have_long_long, 'need long long support')
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001256class UnsignedLongLongTest(UnsignedNumberTest, unittest.TestCase):
Meador Inge1c9f0c92011-09-20 19:55:51 -05001257 typecode = 'Q'
1258 minitemsize = 8
Meador Inge1c9f0c92011-09-20 19:55:51 -05001259
Walter Dörwald7fd94242003-05-18 00:47:47 +00001260class FPTest(NumberTest):
1261 example = [-42.0, 0, 42, 1e5, -1e10]
1262 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
1263 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
1264 outside = 23
1265
1266 def assertEntryEqual(self, entry1, entry2):
1267 self.assertAlmostEqual(entry1, entry2)
1268
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001269 def test_byteswap(self):
1270 a = array.array(self.typecode, self.example)
1271 self.assertRaises(TypeError, a.byteswap, 42)
1272 if a.itemsize in (1, 2, 4, 8):
1273 b = array.array(self.typecode, self.example)
1274 b.byteswap()
1275 if a.itemsize==1:
1276 self.assertEqual(a, b)
1277 else:
1278 # On alphas treating the byte swapped bit patters as
1279 # floats/doubles results in floating point exceptions
1280 # => compare the 8bit string values instead
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001281 self.assertNotEqual(a.tobytes(), b.tobytes())
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001282 b.byteswap()
1283 self.assertEqual(a, b)
1284
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001285class FloatTest(FPTest, unittest.TestCase):
Neal Norwitz35c6cd02003-05-22 13:29:15 +00001286 typecode = 'f'
1287 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001288
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001289class DoubleTest(FPTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001290 typecode = 'd'
1291 minitemsize = 8
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001292
1293 def test_alloc_overflow(self):
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001294 from sys import maxsize
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001295 a = array.array('d', [-1]*65536)
1296 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001297 a *= maxsize//65536 + 1
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001298 except MemoryError:
1299 pass
1300 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001301 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001302 b = array.array('d', [ 2.71828183, 3.14159265, -1])
1303 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001304 b * (maxsize//3 + 1)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001305 except MemoryError:
1306 pass
1307 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001308 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001309
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001310
1311if __name__ == "__main__":
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001312 unittest.main()