blob: 409d586088ec96ea9d3a6d8ce1dcd3e2c735c428 [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 Storchaka43767632013-11-03 21:31:38 +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)
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200198 self.assertGreaterEqual(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):
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200357 # Issue #5395: Check if fromfile raises a proper OSError
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000358 # instead of EOFError.
359 a = array.array(self.typecode)
360 f = open(support.TESTFN, 'wb')
361 try:
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200362 self.assertRaises(OSError, a.fromfile, f, len(self.example))
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000363 finally:
364 f.close()
365 support.unlink(support.TESTFN)
366
Frank Wierzbicki17683432009-08-16 20:30:12 +0000367 def test_filewrite(self):
368 a = array.array(self.typecode, 2*self.example)
369 f = open(support.TESTFN, 'wb')
370 try:
371 f.write(a)
372 f.close()
373 b = array.array(self.typecode)
374 f = open(support.TESTFN, 'rb')
375 b.fromfile(f, len(self.example))
376 self.assertEqual(b, array.array(self.typecode, self.example))
377 self.assertNotEqual(a, b)
378 b.fromfile(f, len(self.example))
379 self.assertEqual(a, b)
380 f.close()
381 finally:
382 if not f.closed:
383 f.close()
384 support.unlink(support.TESTFN)
385
Walter Dörwald7fd94242003-05-18 00:47:47 +0000386 def test_tofromlist(self):
387 a = array.array(self.typecode, 2*self.example)
388 b = array.array(self.typecode)
389 self.assertRaises(TypeError, a.tolist, 42)
390 self.assertRaises(TypeError, b.fromlist)
391 self.assertRaises(TypeError, b.fromlist, 42)
392 self.assertRaises(TypeError, b.fromlist, [None])
393 b.fromlist(a.tolist())
394 self.assertEqual(a, b)
Fred Drake78334472000-06-28 17:50:51 +0000395
Walter Dörwald7fd94242003-05-18 00:47:47 +0000396 def test_tofromstring(self):
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)
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200445 self.assertIs(a == 42, False)
446 self.assertIs(a != 42, True)
Tim Peterscc78e472000-11-14 21:36:07 +0000447
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200448 self.assertIs(a == a, True)
449 self.assertIs(a != a, False)
450 self.assertIs(a < a, False)
451 self.assertIs(a <= a, True)
452 self.assertIs(a > a, False)
453 self.assertIs(a >= a, 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
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200458 self.assertIs(a == 2*a, False)
459 self.assertIs(a != 2*a, True)
460 self.assertIs(a < 2*a, True)
461 self.assertIs(a <= 2*a, True)
462 self.assertIs(a > 2*a, False)
463 self.assertIs(a >= 2*a, False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000464
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200465 self.assertIs(a == al, False)
466 self.assertIs(a != al, True)
467 self.assertIs(a < al, False)
468 self.assertIs(a <= al, False)
469 self.assertIs(a > al, True)
470 self.assertIs(a >= al, True)
Martin v. Löwis99866332002-03-01 10:27:01 +0000471
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200472 self.assertIs(a == ab, False)
473 self.assertIs(a != ab, True)
474 self.assertIs(a < ab, True)
475 self.assertIs(a <= ab, True)
476 self.assertIs(a > ab, False)
477 self.assertIs(a >= ab, 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)
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200496 self.assertIs(a, 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
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200551 self.assertIs(a, 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
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200558 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000559 self.assertEqual(a, array.array(self.typecode))
560
561 a *= 1000
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200562 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000563 self.assertEqual(a, array.array(self.typecode))
564
565 a *= -1
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200566 self.assertIs(a, 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 Storchaka43767632013-11-03 21:31:38 +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 Storchaka43767632013-11-03 21:31:38 +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
Alexandre Vassalotti9730e332013-11-29 20:47:15 -08001030 def test_initialize_with_unicode(self):
1031 if self.typecode != 'u':
1032 with self.assertRaises(TypeError) as cm:
1033 a = array.array(self.typecode, 'foo')
1034 self.assertIn("cannot use a str", str(cm.exception))
1035 with self.assertRaises(TypeError) as cm:
1036 a = array.array(self.typecode, array.array('u', 'foo'))
1037 self.assertIn("cannot use a unicode array", str(cm.exception))
1038 else:
1039 a = array.array(self.typecode, "foo")
1040 a = array.array(self.typecode, array.array('u', 'foo'))
1041
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001042
Walter Dörwald7fd94242003-05-18 00:47:47 +00001043class StringTest(BaseTest):
1044
1045 def test_setitem(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001046 super().test_setitem()
Walter Dörwald7fd94242003-05-18 00:47:47 +00001047 a = array.array(self.typecode, self.example)
1048 self.assertRaises(TypeError, a.__setitem__, 0, self.example[:2])
1049
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001050class UnicodeTest(StringTest, unittest.TestCase):
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001051 typecode = 'u'
1052 example = '\x01\u263a\x00\ufeff'
1053 smallerexample = '\x01\u263a\x00\ufefe'
1054 biggerexample = '\x01\u263a\x01\ufeff'
1055 outside = str('\x33')
Victor Stinner8d4734f2012-08-08 20:09:21 +02001056 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001057
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001058 def test_unicode(self):
1059 self.assertRaises(TypeError, array.array, 'b', 'foo')
Walter Dörwald7fd94242003-05-18 00:47:47 +00001060
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001061 a = array.array('u', '\xa0\xc2\u1234')
1062 a.fromunicode(' ')
1063 a.fromunicode('')
1064 a.fromunicode('')
1065 a.fromunicode('\x11abc\xff\u1234')
1066 s = a.tounicode()
1067 self.assertEqual(s, '\xa0\xc2\u1234 \x11abc\xff\u1234')
Victor Stinner9d512ab2012-08-09 00:43:56 +02001068 self.assertEqual(a.itemsize, sizeof_wchar)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001069
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001070 s = '\x00="\'a\\b\x80\xff\u0000\u0001\u1234'
1071 a = array.array('u', s)
1072 self.assertEqual(
1073 repr(a),
Georg Brandl559e5d72008-06-11 18:37:52 +00001074 "array('u', '\\x00=\"\\'a\\\\b\\x80\xff\\x00\\x01\u1234')")
Walter Dörwald7fd94242003-05-18 00:47:47 +00001075
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001076 self.assertRaises(TypeError, a.fromunicode)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001077
Victor Stinner29ec5952013-02-26 00:27:38 +01001078 def test_issue17223(self):
1079 # this used to crash
Victor Stinnerc472c5d2013-02-26 22:52:11 +01001080 if sizeof_wchar == 4:
1081 # U+FFFFFFFF is an invalid code point in Unicode 6.0
1082 invalid_str = b'\xff\xff\xff\xff'
1083 else:
Victor Stinner29c00342013-03-08 02:33:06 +01001084 # PyUnicode_FromUnicode() cannot fail with 16-bit wchar_t
1085 self.skipTest("specific to 32-bit wchar_t")
Victor Stinnerc472c5d2013-02-26 22:52:11 +01001086 a = array.array('u', invalid_str)
Victor Stinner29ec5952013-02-26 00:27:38 +01001087 self.assertRaises(ValueError, a.tounicode)
1088 self.assertRaises(ValueError, str, a)
1089
Walter Dörwald7fd94242003-05-18 00:47:47 +00001090class NumberTest(BaseTest):
1091
1092 def test_extslice(self):
1093 a = array.array(self.typecode, range(5))
1094 self.assertEqual(a[::], a)
1095 self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
1096 self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
1097 self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
1098 self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
1099 self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
1100 self.assertEqual(a[-100:100:], a)
1101 self.assertEqual(a[100:-100:-1], a[::-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +00001102 self.assertEqual(a[-100:100:2], array.array(self.typecode, [0,2,4]))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001103 self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
1104 self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
1105
1106 def test_delslice(self):
1107 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001108 del a[::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001109 self.assertEqual(a, array.array(self.typecode, [1,3]))
1110 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001111 del a[1::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001112 self.assertEqual(a, array.array(self.typecode, [0,2,4]))
1113 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001114 del a[1::-2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001115 self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
1116 a = array.array(self.typecode, range(10))
Michael W. Hudson56796f62002-07-29 14:35:04 +00001117 del a[::1000]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001118 self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
Mark Dickinsonbc099642010-01-29 17:27:24 +00001119 # test issue7788
1120 a = array.array(self.typecode, range(10))
1121 del a[9::1<<333]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001122
1123 def test_assignment(self):
1124 a = array.array(self.typecode, range(10))
1125 a[::2] = array.array(self.typecode, [42]*5)
1126 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
1127 a = array.array(self.typecode, range(10))
1128 a[::-4] = array.array(self.typecode, [10]*3)
1129 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
1130 a = array.array(self.typecode, range(4))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001131 a[::-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +00001132 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
1133 a = array.array(self.typecode, range(10))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001134 b = a[:]
1135 c = a[:]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001136 ins = array.array(self.typecode, range(2))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001137 a[2:3] = ins
1138 b[slice(2,3)] = ins
1139 c[2:3:] = ins
Fred Drake004d5e62000-10-23 17:22:08 +00001140
Walter Dörwald7fd94242003-05-18 00:47:47 +00001141 def test_iterationcontains(self):
1142 a = array.array(self.typecode, range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +00001143 self.assertEqual(list(a), list(range(10)))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001144 b = array.array(self.typecode, [20])
1145 self.assertEqual(a[-1] in a, True)
1146 self.assertEqual(b[0] not in a, True)
1147
1148 def check_overflow(self, lower, upper):
1149 # method to be used by subclasses
1150
1151 # should not overflow assigning lower limit
1152 a = array.array(self.typecode, [lower])
1153 a[0] = lower
1154 # should overflow assigning less than lower limit
1155 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
1156 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
1157 # should not overflow assigning upper limit
1158 a = array.array(self.typecode, [upper])
1159 a[0] = upper
1160 # should overflow assigning more than upper limit
1161 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
1162 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
1163
1164 def test_subclassing(self):
1165 typecode = self.typecode
1166 class ExaggeratingArray(array.array):
1167 __slots__ = ['offset']
1168
1169 def __new__(cls, typecode, data, offset):
1170 return array.array.__new__(cls, typecode, data)
1171
1172 def __init__(self, typecode, data, offset):
1173 self.offset = offset
1174
1175 def __getitem__(self, i):
1176 return array.array.__getitem__(self, i) + self.offset
1177
1178 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
1179 self.assertEntryEqual(a[0], 7)
1180
1181 self.assertRaises(AttributeError, setattr, a, "color", "blue")
1182
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00001183 def test_frombytearray(self):
1184 a = array.array('b', range(10))
1185 b = array.array(self.typecode, a)
1186 self.assertEqual(a, b)
1187
Walter Dörwald7fd94242003-05-18 00:47:47 +00001188class SignedNumberTest(NumberTest):
1189 example = [-1, 0, 1, 42, 0x7f]
1190 smallerexample = [-1, 0, 1, 42, 0x7e]
1191 biggerexample = [-1, 0, 1, 43, 0x7f]
1192 outside = 23
1193
1194 def test_overflow(self):
1195 a = array.array(self.typecode)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001196 lower = -1 * int(pow(2, a.itemsize * 8 - 1))
1197 upper = int(pow(2, a.itemsize * 8 - 1)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001198 self.check_overflow(lower, upper)
1199
1200class UnsignedNumberTest(NumberTest):
1201 example = [0, 1, 17, 23, 42, 0xff]
1202 smallerexample = [0, 1, 17, 23, 42, 0xfe]
1203 biggerexample = [0, 1, 17, 23, 43, 0xff]
1204 outside = 0xaa
1205
1206 def test_overflow(self):
1207 a = array.array(self.typecode)
1208 lower = 0
Guido van Rossume2a383d2007-01-15 16:59:06 +00001209 upper = int(pow(2, a.itemsize * 8)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001210 self.check_overflow(lower, upper)
Fred Drake004d5e62000-10-23 17:22:08 +00001211
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001212 def test_bytes_extend(self):
1213 s = bytes(self.example)
1214
1215 a = array.array(self.typecode, self.example)
1216 a.extend(s)
1217 self.assertEqual(
1218 a,
1219 array.array(self.typecode, self.example+self.example)
1220 )
1221
1222 a = array.array(self.typecode, self.example)
1223 a.extend(bytearray(reversed(s)))
1224 self.assertEqual(
1225 a,
1226 array.array(self.typecode, self.example+self.example[::-1])
1227 )
1228
Fred Drake004d5e62000-10-23 17:22:08 +00001229
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001230class ByteTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001231 typecode = 'b'
1232 minitemsize = 1
Fred Drake004d5e62000-10-23 17:22:08 +00001233
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001234class UnsignedByteTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001235 typecode = 'B'
1236 minitemsize = 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001237
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001238class ShortTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001239 typecode = 'h'
1240 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001241
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001242class UnsignedShortTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001243 typecode = 'H'
1244 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001245
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001246class IntTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001247 typecode = 'i'
1248 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001249
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001250class UnsignedIntTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001251 typecode = 'I'
1252 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001253
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001254class LongTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001255 typecode = 'l'
1256 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001257
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001258class UnsignedLongTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001259 typecode = 'L'
1260 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001261
Meador Inge1c9f0c92011-09-20 19:55:51 -05001262@unittest.skipIf(not have_long_long, 'need long long support')
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001263class LongLongTest(SignedNumberTest, unittest.TestCase):
Meador Inge1c9f0c92011-09-20 19:55:51 -05001264 typecode = 'q'
1265 minitemsize = 8
Meador Inge1c9f0c92011-09-20 19:55:51 -05001266
1267@unittest.skipIf(not have_long_long, 'need long long support')
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001268class UnsignedLongLongTest(UnsignedNumberTest, unittest.TestCase):
Meador Inge1c9f0c92011-09-20 19:55:51 -05001269 typecode = 'Q'
1270 minitemsize = 8
Meador Inge1c9f0c92011-09-20 19:55:51 -05001271
Walter Dörwald7fd94242003-05-18 00:47:47 +00001272class FPTest(NumberTest):
1273 example = [-42.0, 0, 42, 1e5, -1e10]
1274 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
1275 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
1276 outside = 23
1277
1278 def assertEntryEqual(self, entry1, entry2):
1279 self.assertAlmostEqual(entry1, entry2)
1280
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001281 def test_byteswap(self):
1282 a = array.array(self.typecode, self.example)
1283 self.assertRaises(TypeError, a.byteswap, 42)
1284 if a.itemsize in (1, 2, 4, 8):
1285 b = array.array(self.typecode, self.example)
1286 b.byteswap()
1287 if a.itemsize==1:
1288 self.assertEqual(a, b)
1289 else:
1290 # On alphas treating the byte swapped bit patters as
1291 # floats/doubles results in floating point exceptions
1292 # => compare the 8bit string values instead
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001293 self.assertNotEqual(a.tobytes(), b.tobytes())
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001294 b.byteswap()
1295 self.assertEqual(a, b)
1296
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001297class FloatTest(FPTest, unittest.TestCase):
Neal Norwitz35c6cd02003-05-22 13:29:15 +00001298 typecode = 'f'
1299 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001300
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001301class DoubleTest(FPTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001302 typecode = 'd'
1303 minitemsize = 8
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001304
1305 def test_alloc_overflow(self):
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001306 from sys import maxsize
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001307 a = array.array('d', [-1]*65536)
1308 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001309 a *= maxsize//65536 + 1
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001310 except MemoryError:
1311 pass
1312 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001313 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001314 b = array.array('d', [ 2.71828183, 3.14159265, -1])
1315 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001316 b * (maxsize//3 + 1)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001317 except MemoryError:
1318 pass
1319 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001320 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001321
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001322
1323if __name__ == "__main__":
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001324 unittest.main()