blob: e004c0ee463aec655ca2dea402b45cd5e104d0db [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
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +000014import warnings
Alexandre Vassalottiad077152009-07-15 17:49:23 +000015
16import array
17from array import _array_reconstructor as array_reconstructor
18
Meador Inge1c9f0c92011-09-20 19:55:51 -050019try:
20 # Try to determine availability of long long independently
21 # of the array module under test
22 struct.calcsize('@q')
23 have_long_long = True
24except struct.error:
25 have_long_long = False
Raymond Hettingerb0900e62004-12-16 16:23:40 +000026
Victor Stinnerc472c5d2013-02-26 22:52:11 +010027try:
28 import ctypes
29 sizeof_wchar = ctypes.sizeof(ctypes.c_wchar)
30except ImportError:
31 import sys
32 if sys.platform == 'win32':
33 sizeof_wchar = 2
34 else:
35 sizeof_wchar = 4
36
37
Raymond Hettingerb0900e62004-12-16 16:23:40 +000038class ArraySubclass(array.array):
39 pass
Guido van Rossumc9f8f141997-04-09 20:51:54 +000040
Thomas Woutersb2137042007-02-01 18:02:27 +000041class ArraySubclassWithKwargs(array.array):
42 def __init__(self, typecode, newarg=None):
Victor Stinner7a6a0092011-01-04 00:04:44 +000043 array.array.__init__(self)
Thomas Woutersb2137042007-02-01 18:02:27 +000044
Guido van Rossum31f72d72007-06-18 18:44:28 +000045typecodes = "ubBhHiIlLfd"
Meador Inge1c9f0c92011-09-20 19:55:51 -050046if have_long_long:
47 typecodes += 'qQ'
Martin v. Löwis99866332002-03-01 10:27:01 +000048
Walter Dörwald7fd94242003-05-18 00:47:47 +000049class BadConstructorTest(unittest.TestCase):
Martin v. Löwis99866332002-03-01 10:27:01 +000050
Walter Dörwald7fd94242003-05-18 00:47:47 +000051 def test_constructor(self):
52 self.assertRaises(TypeError, array.array)
53 self.assertRaises(TypeError, array.array, spam=42)
54 self.assertRaises(TypeError, array.array, 'xx')
55 self.assertRaises(ValueError, array.array, 'x')
Martin v. Löwis99866332002-03-01 10:27:01 +000056
Martin v. Löwis99866332002-03-01 10:27:01 +000057
Alexandre Vassalottiad077152009-07-15 17:49:23 +000058# Machine format codes.
59#
60# Search for "enum machine_format_code" in Modules/arraymodule.c to get the
61# authoritative values.
62UNKNOWN_FORMAT = -1
63UNSIGNED_INT8 = 0
64SIGNED_INT8 = 1
65UNSIGNED_INT16_LE = 2
66UNSIGNED_INT16_BE = 3
67SIGNED_INT16_LE = 4
68SIGNED_INT16_BE = 5
69UNSIGNED_INT32_LE = 6
70UNSIGNED_INT32_BE = 7
71SIGNED_INT32_LE = 8
72SIGNED_INT32_BE = 9
73UNSIGNED_INT64_LE = 10
74UNSIGNED_INT64_BE = 11
75SIGNED_INT64_LE = 12
76SIGNED_INT64_BE = 13
77IEEE_754_FLOAT_LE = 14
78IEEE_754_FLOAT_BE = 15
79IEEE_754_DOUBLE_LE = 16
80IEEE_754_DOUBLE_BE = 17
81UTF16_LE = 18
82UTF16_BE = 19
83UTF32_LE = 20
84UTF32_BE = 21
85
86class ArrayReconstructorTest(unittest.TestCase):
87
88 def test_error(self):
89 self.assertRaises(TypeError, array_reconstructor,
90 "", "b", 0, b"")
91 self.assertRaises(TypeError, array_reconstructor,
92 str, "b", 0, b"")
93 self.assertRaises(TypeError, array_reconstructor,
94 array.array, "b", '', b"")
95 self.assertRaises(TypeError, array_reconstructor,
96 array.array, "b", 0, "")
97 self.assertRaises(ValueError, array_reconstructor,
98 array.array, "?", 0, b"")
99 self.assertRaises(ValueError, array_reconstructor,
100 array.array, "b", UNKNOWN_FORMAT, b"")
101 self.assertRaises(ValueError, array_reconstructor,
102 array.array, "b", 22, b"")
103 self.assertRaises(ValueError, array_reconstructor,
104 array.array, "d", 16, b"a")
105
106 def test_numbers(self):
107 testcases = (
108 (['B', 'H', 'I', 'L'], UNSIGNED_INT8, '=BBBB',
109 [0x80, 0x7f, 0, 0xff]),
110 (['b', 'h', 'i', 'l'], SIGNED_INT8, '=bbb',
111 [-0x80, 0x7f, 0]),
112 (['H', 'I', 'L'], UNSIGNED_INT16_LE, '<HHHH',
113 [0x8000, 0x7fff, 0, 0xffff]),
114 (['H', 'I', 'L'], UNSIGNED_INT16_BE, '>HHHH',
115 [0x8000, 0x7fff, 0, 0xffff]),
116 (['h', 'i', 'l'], SIGNED_INT16_LE, '<hhh',
117 [-0x8000, 0x7fff, 0]),
118 (['h', 'i', 'l'], SIGNED_INT16_BE, '>hhh',
119 [-0x8000, 0x7fff, 0]),
120 (['I', 'L'], UNSIGNED_INT32_LE, '<IIII',
121 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
122 (['I', 'L'], UNSIGNED_INT32_BE, '>IIII',
123 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
124 (['i', 'l'], SIGNED_INT32_LE, '<iii',
125 [-1<<31, (1<<31)-1, 0]),
126 (['i', 'l'], SIGNED_INT32_BE, '>iii',
127 [-1<<31, (1<<31)-1, 0]),
128 (['L'], UNSIGNED_INT64_LE, '<QQQQ',
Alexandre Vassalotti0027d4b2009-07-15 20:53:55 +0000129 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
130 (['L'], UNSIGNED_INT64_BE, '>QQQQ',
131 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
132 (['l'], SIGNED_INT64_LE, '<qqq',
133 [-1<<31, (1<<31)-1, 0]),
134 (['l'], SIGNED_INT64_BE, '>qqq',
135 [-1<<31, (1<<31)-1, 0]),
136 # The following tests for INT64 will raise an OverflowError
137 # when run on a 32-bit machine. The tests are simply skipped
138 # in that case.
139 (['L'], UNSIGNED_INT64_LE, '<QQQQ',
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000140 [1<<63, (1<<63)-1, 0, (1<<64)-1]),
141 (['L'], UNSIGNED_INT64_BE, '>QQQQ',
142 [1<<63, (1<<63)-1, 0, (1<<64)-1]),
143 (['l'], SIGNED_INT64_LE, '<qqq',
144 [-1<<63, (1<<63)-1, 0]),
145 (['l'], SIGNED_INT64_BE, '>qqq',
146 [-1<<63, (1<<63)-1, 0]),
147 (['f'], IEEE_754_FLOAT_LE, '<ffff',
148 [16711938.0, float('inf'), float('-inf'), -0.0]),
149 (['f'], IEEE_754_FLOAT_BE, '>ffff',
150 [16711938.0, float('inf'), float('-inf'), -0.0]),
151 (['d'], IEEE_754_DOUBLE_LE, '<dddd',
152 [9006104071832581.0, float('inf'), float('-inf'), -0.0]),
153 (['d'], IEEE_754_DOUBLE_BE, '>dddd',
154 [9006104071832581.0, float('inf'), float('-inf'), -0.0])
155 )
156 for testcase in testcases:
157 valid_typecodes, mformat_code, struct_fmt, values = testcase
158 arraystr = struct.pack(struct_fmt, *values)
159 for typecode in valid_typecodes:
Alexandre Vassalotti0027d4b2009-07-15 20:53:55 +0000160 try:
161 a = array.array(typecode, values)
162 except OverflowError:
163 continue # Skip this test case.
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000164 b = array_reconstructor(
165 array.array, typecode, mformat_code, arraystr)
166 self.assertEqual(a, b,
167 msg="{0!r} != {1!r}; testcase={2!r}".format(a, b, testcase))
168
169 def test_unicode(self):
170 teststr = "Bonne Journ\xe9e \U0002030a\U00020347"
171 testcases = (
172 (UTF16_LE, "UTF-16-LE"),
173 (UTF16_BE, "UTF-16-BE"),
174 (UTF32_LE, "UTF-32-LE"),
175 (UTF32_BE, "UTF-32-BE")
176 )
177 for testcase in testcases:
178 mformat_code, encoding = testcase
179 a = array.array('u', teststr)
180 b = array_reconstructor(
181 array.array, 'u', mformat_code, teststr.encode(encoding))
182 self.assertEqual(a, b,
183 msg="{0!r} != {1!r}; testcase={2!r}".format(a, b, testcase))
184
185
Ezio Melotti1d3e96d2013-01-10 06:04:50 +0200186class BaseTest:
Walter Dörwald7fd94242003-05-18 00:47:47 +0000187 # Required class attributes (provided by subclasses
188 # typecode: the typecode to test
189 # example: an initializer usable in the constructor for this type
190 # smallerexample: the same length as example, but smaller
191 # biggerexample: the same length as example, but bigger
192 # outside: An entry that is not in example
193 # minitemsize: the minimum guaranteed itemsize
Martin v. Löwis99866332002-03-01 10:27:01 +0000194
Walter Dörwald7fd94242003-05-18 00:47:47 +0000195 def assertEntryEqual(self, entry1, entry2):
196 self.assertEqual(entry1, entry2)
Martin v. Löwis99866332002-03-01 10:27:01 +0000197
Walter Dörwald7fd94242003-05-18 00:47:47 +0000198 def badtypecode(self):
199 # Return a typecode that is different from our own
200 return typecodes[(typecodes.index(self.typecode)+1) % len(typecodes)]
Martin v. Löwis99866332002-03-01 10:27:01 +0000201
Walter Dörwald7fd94242003-05-18 00:47:47 +0000202 def test_constructor(self):
203 a = array.array(self.typecode)
204 self.assertEqual(a.typecode, self.typecode)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000205 self.assertTrue(a.itemsize>=self.minitemsize)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000206 self.assertRaises(TypeError, array.array, self.typecode, None)
Martin v. Löwis99866332002-03-01 10:27:01 +0000207
Walter Dörwald7fd94242003-05-18 00:47:47 +0000208 def test_len(self):
209 a = array.array(self.typecode)
210 a.append(self.example[0])
211 self.assertEqual(len(a), 1)
Martin v. Löwis99866332002-03-01 10:27:01 +0000212
Walter Dörwald7fd94242003-05-18 00:47:47 +0000213 a = array.array(self.typecode, self.example)
214 self.assertEqual(len(a), len(self.example))
Martin v. Löwis99866332002-03-01 10:27:01 +0000215
Walter Dörwald7fd94242003-05-18 00:47:47 +0000216 def test_buffer_info(self):
217 a = array.array(self.typecode, self.example)
218 self.assertRaises(TypeError, a.buffer_info, 42)
219 bi = a.buffer_info()
Ezio Melottie9615932010-01-24 19:26:24 +0000220 self.assertIsInstance(bi, tuple)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000221 self.assertEqual(len(bi), 2)
Ezio Melottie9615932010-01-24 19:26:24 +0000222 self.assertIsInstance(bi[0], int)
223 self.assertIsInstance(bi[1], int)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000224 self.assertEqual(bi[1], len(a))
Martin v. Löwis99866332002-03-01 10:27:01 +0000225
Walter Dörwald7fd94242003-05-18 00:47:47 +0000226 def test_byteswap(self):
Victor Stinner8dba4e02011-09-30 00:51:10 +0200227 if self.typecode == 'u':
228 example = '\U00100100'
229 else:
230 example = self.example
231 a = array.array(self.typecode, example)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000232 self.assertRaises(TypeError, a.byteswap, 42)
233 if a.itemsize in (1, 2, 4, 8):
Victor Stinner8dba4e02011-09-30 00:51:10 +0200234 b = array.array(self.typecode, example)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000235 b.byteswap()
236 if a.itemsize==1:
237 self.assertEqual(a, b)
238 else:
239 self.assertNotEqual(a, b)
240 b.byteswap()
241 self.assertEqual(a, b)
Martin v. Löwis99866332002-03-01 10:27:01 +0000242
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000243 def test_copy(self):
244 import copy
245 a = array.array(self.typecode, self.example)
246 b = copy.copy(a)
247 self.assertNotEqual(id(a), id(b))
248 self.assertEqual(a, b)
249
Thomas Wouters89f507f2006-12-13 04:49:30 +0000250 def test_deepcopy(self):
251 import copy
252 a = array.array(self.typecode, self.example)
253 b = copy.deepcopy(a)
254 self.assertNotEqual(id(a), id(b))
255 self.assertEqual(a, b)
256
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000257 def test_reduce_ex(self):
258 a = array.array(self.typecode, self.example)
259 for protocol in range(3):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000260 self.assertIs(a.__reduce_ex__(protocol)[0], array.array)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000261 for protocol in range(3, pickle.HIGHEST_PROTOCOL):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000262 self.assertIs(a.__reduce_ex__(protocol)[0], array_reconstructor)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000263
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000264 def test_pickle(self):
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000265 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000266 a = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000267 b = pickle.loads(pickle.dumps(a, protocol))
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000268 self.assertNotEqual(id(a), id(b))
269 self.assertEqual(a, b)
270
271 a = ArraySubclass(self.typecode, self.example)
272 a.x = 10
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000273 b = pickle.loads(pickle.dumps(a, protocol))
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000274 self.assertNotEqual(id(a), id(b))
275 self.assertEqual(a, b)
276 self.assertEqual(a.x, b.x)
277 self.assertEqual(type(a), type(b))
278
Guido van Rossumd8faa362007-04-27 19:54:29 +0000279 def test_pickle_for_empty_array(self):
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000280 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossumd8faa362007-04-27 19:54:29 +0000281 a = array.array(self.typecode)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000282 b = pickle.loads(pickle.dumps(a, protocol))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000283 self.assertNotEqual(id(a), id(b))
284 self.assertEqual(a, b)
285
286 a = ArraySubclass(self.typecode)
287 a.x = 10
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000288 b = pickle.loads(pickle.dumps(a, protocol))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000289 self.assertNotEqual(id(a), id(b))
290 self.assertEqual(a, b)
291 self.assertEqual(a.x, b.x)
292 self.assertEqual(type(a), type(b))
293
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000294 def test_iterator_pickle(self):
295 data = array.array(self.typecode, self.example)
296 orgit = iter(data)
297 d = pickle.dumps(orgit)
298 it = pickle.loads(d)
299 self.assertEqual(type(orgit), type(it))
300 self.assertEqual(list(it), list(data))
301
302 if len(data):
303 it = pickle.loads(d)
304 next(it)
305 d = pickle.dumps(it)
306 self.assertEqual(list(it), list(data)[1:])
307
Walter Dörwald7fd94242003-05-18 00:47:47 +0000308 def test_insert(self):
309 a = array.array(self.typecode, self.example)
310 a.insert(0, self.example[0])
311 self.assertEqual(len(a), 1+len(self.example))
312 self.assertEqual(a[0], a[1])
313 self.assertRaises(TypeError, a.insert)
314 self.assertRaises(TypeError, a.insert, None)
Walter Dörwaldba39d9c2003-05-18 01:56:25 +0000315 self.assertRaises(TypeError, a.insert, 0, None)
Martin v. Löwis99866332002-03-01 10:27:01 +0000316
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000317 a = array.array(self.typecode, self.example)
318 a.insert(-1, self.example[0])
319 self.assertEqual(
320 a,
321 array.array(
322 self.typecode,
323 self.example[:-1] + self.example[:1] + self.example[-1:]
324 )
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[:1] + self.example)
332 )
333
334 a = array.array(self.typecode, self.example)
335 a.insert(1000, self.example[0])
336 self.assertEqual(
337 a,
338 array.array(self.typecode, self.example + self.example[:1])
339 )
340
Walter Dörwald7fd94242003-05-18 00:47:47 +0000341 def test_tofromfile(self):
342 a = array.array(self.typecode, 2*self.example)
343 self.assertRaises(TypeError, a.tofile)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000344 support.unlink(support.TESTFN)
345 f = open(support.TESTFN, 'wb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000346 try:
347 a.tofile(f)
348 f.close()
349 b = array.array(self.typecode)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000350 f = open(support.TESTFN, 'rb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000351 self.assertRaises(TypeError, b.fromfile)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000352 b.fromfile(f, len(self.example))
353 self.assertEqual(b, array.array(self.typecode, self.example))
354 self.assertNotEqual(a, b)
Hirokazu Yamamoto54d0df62009-03-06 03:04:07 +0000355 self.assertRaises(EOFError, b.fromfile, f, len(self.example)+1)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000356 self.assertEqual(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000357 f.close()
358 finally:
359 if not f.closed:
360 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000361 support.unlink(support.TESTFN)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000362
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000363 def test_fromfile_ioerror(self):
364 # Issue #5395: Check if fromfile raises a proper IOError
365 # instead of EOFError.
366 a = array.array(self.typecode)
367 f = open(support.TESTFN, 'wb')
368 try:
369 self.assertRaises(IOError, a.fromfile, f, len(self.example))
370 finally:
371 f.close()
372 support.unlink(support.TESTFN)
373
Frank Wierzbicki17683432009-08-16 20:30:12 +0000374 def test_filewrite(self):
375 a = array.array(self.typecode, 2*self.example)
376 f = open(support.TESTFN, 'wb')
377 try:
378 f.write(a)
379 f.close()
380 b = array.array(self.typecode)
381 f = open(support.TESTFN, 'rb')
382 b.fromfile(f, len(self.example))
383 self.assertEqual(b, array.array(self.typecode, self.example))
384 self.assertNotEqual(a, b)
385 b.fromfile(f, len(self.example))
386 self.assertEqual(a, b)
387 f.close()
388 finally:
389 if not f.closed:
390 f.close()
391 support.unlink(support.TESTFN)
392
Walter Dörwald7fd94242003-05-18 00:47:47 +0000393 def test_tofromlist(self):
394 a = array.array(self.typecode, 2*self.example)
395 b = array.array(self.typecode)
396 self.assertRaises(TypeError, a.tolist, 42)
397 self.assertRaises(TypeError, b.fromlist)
398 self.assertRaises(TypeError, b.fromlist, 42)
399 self.assertRaises(TypeError, b.fromlist, [None])
400 b.fromlist(a.tolist())
401 self.assertEqual(a, b)
Fred Drake78334472000-06-28 17:50:51 +0000402
Walter Dörwald7fd94242003-05-18 00:47:47 +0000403 def test_tofromstring(self):
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000404 nb_warnings = 4
405 with warnings.catch_warnings(record=True) as r:
406 warnings.filterwarnings("always",
407 message=r"(to|from)string\(\) is deprecated",
408 category=DeprecationWarning)
409 a = array.array(self.typecode, 2*self.example)
410 b = array.array(self.typecode)
411 self.assertRaises(TypeError, a.tostring, 42)
412 self.assertRaises(TypeError, b.fromstring)
413 self.assertRaises(TypeError, b.fromstring, 42)
414 b.fromstring(a.tostring())
415 self.assertEqual(a, b)
416 if a.itemsize>1:
417 self.assertRaises(ValueError, b.fromstring, "x")
418 nb_warnings += 1
419 self.assertEqual(len(r), nb_warnings)
420
421 def test_tofrombytes(self):
Walter Dörwald7fd94242003-05-18 00:47:47 +0000422 a = array.array(self.typecode, 2*self.example)
423 b = array.array(self.typecode)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000424 self.assertRaises(TypeError, a.tobytes, 42)
425 self.assertRaises(TypeError, b.frombytes)
426 self.assertRaises(TypeError, b.frombytes, 42)
427 b.frombytes(a.tobytes())
428 c = array.array(self.typecode, bytearray(a.tobytes()))
Walter Dörwald7fd94242003-05-18 00:47:47 +0000429 self.assertEqual(a, b)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000430 self.assertEqual(a, c)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000431 if a.itemsize>1:
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000432 self.assertRaises(ValueError, b.frombytes, b"x")
Fred Drake78334472000-06-28 17:50:51 +0000433
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +0000434 def test_fromarray(self):
435 a = array.array(self.typecode, self.example)
436 b = array.array(self.typecode, a)
437 self.assertEqual(a, b)
438
Walter Dörwald7fd94242003-05-18 00:47:47 +0000439 def test_repr(self):
440 a = array.array(self.typecode, 2*self.example)
441 self.assertEqual(a, eval(repr(a), {"array": array.array}))
Fred Drake78334472000-06-28 17:50:51 +0000442
Walter Dörwald7fd94242003-05-18 00:47:47 +0000443 a = array.array(self.typecode)
444 self.assertEqual(repr(a), "array('%s')" % self.typecode)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000445
Walter Dörwald7fd94242003-05-18 00:47:47 +0000446 def test_str(self):
447 a = array.array(self.typecode, 2*self.example)
448 str(a)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000449
Walter Dörwald7fd94242003-05-18 00:47:47 +0000450 def test_cmp(self):
451 a = array.array(self.typecode, self.example)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000452 self.assertTrue((a == 42) is False)
453 self.assertTrue((a != 42) is True)
Tim Peterscc78e472000-11-14 21:36:07 +0000454
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000455 self.assertTrue((a == a) is True)
456 self.assertTrue((a != a) is False)
457 self.assertTrue((a < a) is False)
458 self.assertTrue((a <= a) is True)
459 self.assertTrue((a > a) is False)
460 self.assertTrue((a >= a) is True)
Tim Peterscc78e472000-11-14 21:36:07 +0000461
Neal Norwitzbd2835c2006-03-17 08:54:15 +0000462 al = array.array(self.typecode, self.smallerexample)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000463 ab = array.array(self.typecode, self.biggerexample)
Guido van Rossum7f1d3aa1998-07-16 15:31:43 +0000464
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000465 self.assertTrue((a == 2*a) is False)
466 self.assertTrue((a != 2*a) is True)
467 self.assertTrue((a < 2*a) is True)
468 self.assertTrue((a <= 2*a) is True)
469 self.assertTrue((a > 2*a) is False)
470 self.assertTrue((a >= 2*a) is False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000471
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000472 self.assertTrue((a == al) is False)
473 self.assertTrue((a != al) is True)
474 self.assertTrue((a < al) is False)
475 self.assertTrue((a <= al) is False)
476 self.assertTrue((a > al) is True)
477 self.assertTrue((a >= al) is True)
Martin v. Löwis99866332002-03-01 10:27:01 +0000478
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000479 self.assertTrue((a == ab) is False)
480 self.assertTrue((a != ab) is True)
481 self.assertTrue((a < ab) is True)
482 self.assertTrue((a <= ab) is True)
483 self.assertTrue((a > ab) is False)
484 self.assertTrue((a >= ab) is False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000485
Walter Dörwald7fd94242003-05-18 00:47:47 +0000486 def test_add(self):
487 a = array.array(self.typecode, self.example) \
488 + array.array(self.typecode, self.example[::-1])
489 self.assertEqual(
490 a,
491 array.array(self.typecode, self.example + self.example[::-1])
492 )
Martin v. Löwis99866332002-03-01 10:27:01 +0000493
Walter Dörwald7fd94242003-05-18 00:47:47 +0000494 b = array.array(self.badtypecode())
495 self.assertRaises(TypeError, a.__add__, b)
496
497 self.assertRaises(TypeError, a.__add__, "bad")
498
499 def test_iadd(self):
500 a = array.array(self.typecode, self.example[::-1])
501 b = a
502 a += array.array(self.typecode, 2*self.example)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000503 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000504 self.assertEqual(
505 a,
506 array.array(self.typecode, self.example[::-1]+2*self.example)
507 )
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000508 a = array.array(self.typecode, self.example)
509 a += a
510 self.assertEqual(
511 a,
512 array.array(self.typecode, self.example + self.example)
513 )
Walter Dörwald7fd94242003-05-18 00:47:47 +0000514
515 b = array.array(self.badtypecode())
516 self.assertRaises(TypeError, a.__add__, b)
517
518 self.assertRaises(TypeError, a.__iadd__, "bad")
519
520 def test_mul(self):
521 a = 5*array.array(self.typecode, self.example)
522 self.assertEqual(
523 a,
524 array.array(self.typecode, 5*self.example)
525 )
526
527 a = array.array(self.typecode, self.example)*5
528 self.assertEqual(
529 a,
530 array.array(self.typecode, self.example*5)
531 )
532
533 a = 0*array.array(self.typecode, self.example)
534 self.assertEqual(
535 a,
536 array.array(self.typecode)
537 )
538
539 a = (-1)*array.array(self.typecode, self.example)
540 self.assertEqual(
541 a,
542 array.array(self.typecode)
543 )
544
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000545 a = 5 * array.array(self.typecode, self.example[:1])
546 self.assertEqual(
547 a,
548 array.array(self.typecode, [a[0]] * 5)
549 )
550
Walter Dörwald7fd94242003-05-18 00:47:47 +0000551 self.assertRaises(TypeError, a.__mul__, "bad")
552
553 def test_imul(self):
554 a = array.array(self.typecode, self.example)
555 b = a
556
557 a *= 5
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000558 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000559 self.assertEqual(
560 a,
561 array.array(self.typecode, 5*self.example)
562 )
563
564 a *= 0
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000565 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000566 self.assertEqual(a, array.array(self.typecode))
567
568 a *= 1000
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000569 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000570 self.assertEqual(a, array.array(self.typecode))
571
572 a *= -1
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000573 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000574 self.assertEqual(a, array.array(self.typecode))
575
576 a = array.array(self.typecode, self.example)
577 a *= -1
578 self.assertEqual(a, array.array(self.typecode))
579
580 self.assertRaises(TypeError, a.__imul__, "bad")
581
582 def test_getitem(self):
583 a = array.array(self.typecode, self.example)
584 self.assertEntryEqual(a[0], self.example[0])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000585 self.assertEntryEqual(a[0], self.example[0])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000586 self.assertEntryEqual(a[-1], self.example[-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000587 self.assertEntryEqual(a[-1], self.example[-1])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000588 self.assertEntryEqual(a[len(self.example)-1], self.example[-1])
589 self.assertEntryEqual(a[-len(self.example)], self.example[0])
590 self.assertRaises(TypeError, a.__getitem__)
591 self.assertRaises(IndexError, a.__getitem__, len(self.example))
592 self.assertRaises(IndexError, a.__getitem__, -len(self.example)-1)
593
594 def test_setitem(self):
595 a = array.array(self.typecode, self.example)
596 a[0] = a[-1]
597 self.assertEntryEqual(a[0], a[-1])
598
599 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000600 a[0] = a[-1]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000601 self.assertEntryEqual(a[0], a[-1])
602
603 a = array.array(self.typecode, self.example)
604 a[-1] = a[0]
605 self.assertEntryEqual(a[0], a[-1])
606
607 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000608 a[-1] = a[0]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000609 self.assertEntryEqual(a[0], a[-1])
610
611 a = array.array(self.typecode, self.example)
612 a[len(self.example)-1] = a[0]
613 self.assertEntryEqual(a[0], a[-1])
614
615 a = array.array(self.typecode, self.example)
616 a[-len(self.example)] = a[-1]
617 self.assertEntryEqual(a[0], a[-1])
618
619 self.assertRaises(TypeError, a.__setitem__)
620 self.assertRaises(TypeError, a.__setitem__, None)
621 self.assertRaises(TypeError, a.__setitem__, 0, None)
622 self.assertRaises(
623 IndexError,
624 a.__setitem__,
625 len(self.example), self.example[0]
626 )
627 self.assertRaises(
628 IndexError,
629 a.__setitem__,
630 -len(self.example)-1, self.example[0]
631 )
632
633 def test_delitem(self):
634 a = array.array(self.typecode, self.example)
635 del a[0]
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[-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)-1]
650 self.assertEqual(
651 a,
652 array.array(self.typecode, self.example[:-1])
653 )
654
655 a = array.array(self.typecode, self.example)
656 del a[-len(self.example)]
657 self.assertEqual(
658 a,
659 array.array(self.typecode, self.example[1:])
660 )
661
662 self.assertRaises(TypeError, a.__delitem__)
663 self.assertRaises(TypeError, a.__delitem__, None)
664 self.assertRaises(IndexError, a.__delitem__, len(self.example))
665 self.assertRaises(IndexError, a.__delitem__, -len(self.example)-1)
666
667 def test_getslice(self):
668 a = array.array(self.typecode, self.example)
669 self.assertEqual(a[:], a)
670
671 self.assertEqual(
672 a[1:],
673 array.array(self.typecode, self.example[1:])
674 )
675
676 self.assertEqual(
677 a[:1],
678 array.array(self.typecode, self.example[:1])
679 )
680
681 self.assertEqual(
682 a[:-1],
683 array.array(self.typecode, self.example[:-1])
684 )
685
686 self.assertEqual(
687 a[-1:],
688 array.array(self.typecode, self.example[-1:])
689 )
690
691 self.assertEqual(
692 a[-1:-1],
693 array.array(self.typecode)
694 )
695
696 self.assertEqual(
Walter Dörwald1083c242005-01-21 21:16:51 +0000697 a[2:1],
698 array.array(self.typecode)
699 )
700
701 self.assertEqual(
Walter Dörwald7fd94242003-05-18 00:47:47 +0000702 a[1000:],
703 array.array(self.typecode)
704 )
705 self.assertEqual(a[-1000:], a)
706 self.assertEqual(a[:1000], a)
707 self.assertEqual(
708 a[:-1000],
709 array.array(self.typecode)
710 )
711 self.assertEqual(a[-1000:1000], a)
712 self.assertEqual(
713 a[2000:1000],
714 array.array(self.typecode)
715 )
716
Thomas Woutersed03b412007-08-28 21:37:11 +0000717 def test_extended_getslice(self):
718 # Test extended slicing by comparing with list slicing
719 # (Assumes list conversion works correctly, too)
720 a = array.array(self.typecode, self.example)
721 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
722 for start in indices:
723 for stop in indices:
724 # Everything except the initial 0 (invalid step)
725 for step in indices[1:]:
726 self.assertEqual(list(a[start:stop:step]),
727 list(a)[start:stop:step])
728
Walter Dörwald7fd94242003-05-18 00:47:47 +0000729 def test_setslice(self):
730 a = array.array(self.typecode, self.example)
731 a[:1] = a
732 self.assertEqual(
733 a,
734 array.array(self.typecode, self.example + self.example[1:])
735 )
736
737 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000738 a[:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000739 self.assertEqual(
740 a,
741 array.array(self.typecode, self.example + self.example[-1:])
742 )
743
744 a = array.array(self.typecode, self.example)
745 a[-1:] = a
746 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:] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000753 self.assertEqual(
754 a,
755 array.array(self.typecode, self.example[:1] + self.example)
756 )
757
758 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000759 a[1:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000760 self.assertEqual(
761 a,
762 array.array(
763 self.typecode,
764 self.example[:1] + self.example + self.example[-1:]
765 )
766 )
767
768 a = array.array(self.typecode, self.example)
769 a[1000:] = a
770 self.assertEqual(
771 a,
772 array.array(self.typecode, 2*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, self.example)
787 )
788
789 a = array.array(self.typecode, self.example)
790 a[:-1000] = a
791 self.assertEqual(
792 a,
793 array.array(self.typecode, 2*self.example)
794 )
795
796 a = array.array(self.typecode, self.example)
797 a[1:0] = a
798 self.assertEqual(
799 a,
800 array.array(self.typecode, self.example[:1] + self.example + self.example[1:])
801 )
802
803 a = array.array(self.typecode, self.example)
804 a[2000:1000] = a
805 self.assertEqual(
806 a,
807 array.array(self.typecode, 2*self.example)
808 )
809
810 a = array.array(self.typecode, self.example)
Thomas Woutersed03b412007-08-28 21:37:11 +0000811 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), None)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000812 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), None)
813
814 b = array.array(self.badtypecode())
Thomas Woutersed03b412007-08-28 21:37:11 +0000815 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000816 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), b)
817
Thomas Woutersed03b412007-08-28 21:37:11 +0000818 def test_extended_set_del_slice(self):
819 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
820 for start in indices:
821 for stop in indices:
822 # Everything except the initial 0 (invalid step)
823 for step in indices[1:]:
824 a = array.array(self.typecode, self.example)
825 L = list(a)
826 # Make sure we have a slice of exactly the right length,
827 # but with (hopefully) different data.
828 data = L[start:stop:step]
829 data.reverse()
830 L[start:stop:step] = data
831 a[start:stop:step] = array.array(self.typecode, data)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000832 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000833
834 del L[start:stop:step]
835 del a[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +0000836 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000837
Walter Dörwald7fd94242003-05-18 00:47:47 +0000838 def test_index(self):
839 example = 2*self.example
840 a = array.array(self.typecode, example)
841 self.assertRaises(TypeError, a.index)
842 for x in example:
843 self.assertEqual(a.index(x), example.index(x))
844 self.assertRaises(ValueError, a.index, None)
845 self.assertRaises(ValueError, a.index, self.outside)
846
847 def test_count(self):
848 example = 2*self.example
849 a = array.array(self.typecode, example)
850 self.assertRaises(TypeError, a.count)
851 for x in example:
852 self.assertEqual(a.count(x), example.count(x))
853 self.assertEqual(a.count(self.outside), 0)
854 self.assertEqual(a.count(None), 0)
855
856 def test_remove(self):
857 for x in self.example:
858 example = 2*self.example
859 a = array.array(self.typecode, example)
860 pos = example.index(x)
861 example2 = example[:pos] + example[pos+1:]
862 a.remove(x)
863 self.assertEqual(a, array.array(self.typecode, example2))
864
865 a = array.array(self.typecode, self.example)
866 self.assertRaises(ValueError, a.remove, self.outside)
867
868 self.assertRaises(ValueError, a.remove, None)
869
870 def test_pop(self):
871 a = array.array(self.typecode)
872 self.assertRaises(IndexError, a.pop)
873
874 a = array.array(self.typecode, 2*self.example)
875 self.assertRaises(TypeError, a.pop, 42, 42)
876 self.assertRaises(TypeError, a.pop, None)
877 self.assertRaises(IndexError, a.pop, len(a))
878 self.assertRaises(IndexError, a.pop, -len(a)-1)
879
880 self.assertEntryEqual(a.pop(0), self.example[0])
881 self.assertEqual(
882 a,
883 array.array(self.typecode, self.example[1:]+self.example)
884 )
885 self.assertEntryEqual(a.pop(1), self.example[2])
886 self.assertEqual(
887 a,
888 array.array(self.typecode, self.example[1:2]+self.example[3:]+self.example)
889 )
890 self.assertEntryEqual(a.pop(0), self.example[1])
891 self.assertEntryEqual(a.pop(), self.example[-1])
892 self.assertEqual(
893 a,
894 array.array(self.typecode, self.example[3:]+self.example[:-1])
895 )
896
897 def test_reverse(self):
898 a = array.array(self.typecode, self.example)
899 self.assertRaises(TypeError, a.reverse, 42)
Fred Drake004d5e62000-10-23 17:22:08 +0000900 a.reverse()
Walter Dörwald7fd94242003-05-18 00:47:47 +0000901 self.assertEqual(
902 a,
903 array.array(self.typecode, self.example[::-1])
904 )
905
906 def test_extend(self):
907 a = array.array(self.typecode, self.example)
908 self.assertRaises(TypeError, a.extend)
909 a.extend(array.array(self.typecode, self.example[::-1]))
910 self.assertEqual(
911 a,
912 array.array(self.typecode, self.example+self.example[::-1])
913 )
914
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000915 a = array.array(self.typecode, self.example)
916 a.extend(a)
917 self.assertEqual(
918 a,
919 array.array(self.typecode, self.example+self.example)
920 )
921
Walter Dörwald7fd94242003-05-18 00:47:47 +0000922 b = array.array(self.badtypecode())
923 self.assertRaises(TypeError, a.extend, b)
924
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000925 a = array.array(self.typecode, self.example)
926 a.extend(self.example[::-1])
927 self.assertEqual(
928 a,
929 array.array(self.typecode, self.example+self.example[::-1])
930 )
931
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +0000932 def test_constructor_with_iterable_argument(self):
933 a = array.array(self.typecode, iter(self.example))
934 b = array.array(self.typecode, self.example)
935 self.assertEqual(a, b)
936
937 # non-iterable argument
938 self.assertRaises(TypeError, array.array, self.typecode, 10)
939
940 # pass through errors raised in __iter__
941 class A:
942 def __iter__(self):
943 raise UnicodeError
944 self.assertRaises(UnicodeError, array.array, self.typecode, A())
945
946 # pass through errors raised in next()
947 def B():
948 raise UnicodeError
949 yield None
950 self.assertRaises(UnicodeError, array.array, self.typecode, B())
951
Walter Dörwald7fd94242003-05-18 00:47:47 +0000952 def test_coveritertraverse(self):
953 try:
954 import gc
955 except ImportError:
956 return
957 a = array.array(self.typecode)
958 l = [iter(a)]
959 l.append(l)
960 gc.collect()
961
962 def test_buffer(self):
963 a = array.array(self.typecode, self.example)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000964 m = memoryview(a)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000965 expected = m.tobytes()
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000966 self.assertEqual(a.tobytes(), expected)
967 self.assertEqual(a.tobytes()[0], expected[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000968 # Resizing is forbidden when there are buffer exports.
969 # For issue 4509, we also check after each error that
970 # the array was not modified.
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000971 self.assertRaises(BufferError, a.append, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000972 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000973 self.assertRaises(BufferError, a.extend, a[0:1])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000974 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000975 self.assertRaises(BufferError, a.remove, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000976 self.assertEqual(m.tobytes(), expected)
977 self.assertRaises(BufferError, a.pop, 0)
978 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000979 self.assertRaises(BufferError, a.fromlist, a.tolist())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000980 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000981 self.assertRaises(BufferError, a.frombytes, a.tobytes())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000982 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000983 if self.typecode == 'u':
984 self.assertRaises(BufferError, a.fromunicode, a.tounicode())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000985 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +0000986 self.assertRaises(BufferError, operator.imul, a, 2)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000987 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +0000988 self.assertRaises(BufferError, operator.imul, a, 0)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000989 self.assertEqual(m.tobytes(), expected)
990 self.assertRaises(BufferError, operator.setitem, a, slice(0, 0), a)
991 self.assertEqual(m.tobytes(), expected)
992 self.assertRaises(BufferError, operator.delitem, a, 0)
993 self.assertEqual(m.tobytes(), expected)
994 self.assertRaises(BufferError, operator.delitem, a, slice(0, 1))
995 self.assertEqual(m.tobytes(), expected)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000996
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000997 def test_weakref(self):
998 s = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000999 p = weakref.proxy(s)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001000 self.assertEqual(p.tobytes(), s.tobytes())
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001001 s = None
1002 self.assertRaises(ReferenceError, len, p)
1003
Skip Montanarod5cf0b82003-08-03 23:02:10 +00001004 def test_bug_782369(self):
1005 import sys
Skip Montanaroed9bf122003-08-03 23:30:40 +00001006 if hasattr(sys, "getrefcount"):
1007 for i in range(10):
1008 b = array.array('B', range(64))
1009 rc = sys.getrefcount(10)
1010 for i in range(10):
1011 b = array.array('B', range(64))
1012 self.assertEqual(rc, sys.getrefcount(10))
Skip Montanarod5cf0b82003-08-03 23:02:10 +00001013
Thomas Woutersb2137042007-02-01 18:02:27 +00001014 def test_subclass_with_kwargs(self):
1015 # SF bug #1486663 -- this used to erroneously raise a TypeError
1016 ArraySubclassWithKwargs('b', newarg=1)
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001017
Guido van Rossum6b826ab2007-07-03 16:22:09 +00001018 def test_create_from_bytes(self):
Alexandre Vassalotti7e4f3212009-07-05 05:38:18 +00001019 # XXX This test probably needs to be moved in a subclass or
1020 # generalized to use self.typecode.
Guido van Rossum6b826ab2007-07-03 16:22:09 +00001021 a = array.array('H', b"1234")
1022 self.assertEqual(len(a) * a.itemsize, 4)
1023
Meador Inge03b4d502012-08-10 22:35:45 -05001024 @support.cpython_only
1025 def test_sizeof_with_buffer(self):
1026 a = array.array(self.typecode, self.example)
Meador Inge80dd1af2012-08-10 23:21:39 -05001027 basesize = support.calcvobjsize('Pn2Pi')
Meador Inge03b4d502012-08-10 22:35:45 -05001028 buffer_size = a.buffer_info()[1] * a.itemsize
1029 support.check_sizeof(self, a, basesize + buffer_size)
1030
1031 @support.cpython_only
1032 def test_sizeof_without_buffer(self):
1033 a = array.array(self.typecode)
Meador Inge80dd1af2012-08-10 23:21:39 -05001034 basesize = support.calcvobjsize('Pn2Pi')
Meador Inge03b4d502012-08-10 22:35:45 -05001035 support.check_sizeof(self, a, basesize)
1036
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001037
Walter Dörwald7fd94242003-05-18 00:47:47 +00001038class StringTest(BaseTest):
1039
1040 def test_setitem(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001041 super().test_setitem()
Walter Dörwald7fd94242003-05-18 00:47:47 +00001042 a = array.array(self.typecode, self.example)
1043 self.assertRaises(TypeError, a.__setitem__, 0, self.example[:2])
1044
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001045class UnicodeTest(StringTest, unittest.TestCase):
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001046 typecode = 'u'
1047 example = '\x01\u263a\x00\ufeff'
1048 smallerexample = '\x01\u263a\x00\ufefe'
1049 biggerexample = '\x01\u263a\x01\ufeff'
1050 outside = str('\x33')
Victor Stinner8d4734f2012-08-08 20:09:21 +02001051 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001052
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001053 def test_unicode(self):
1054 self.assertRaises(TypeError, array.array, 'b', 'foo')
Walter Dörwald7fd94242003-05-18 00:47:47 +00001055
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001056 a = array.array('u', '\xa0\xc2\u1234')
1057 a.fromunicode(' ')
1058 a.fromunicode('')
1059 a.fromunicode('')
1060 a.fromunicode('\x11abc\xff\u1234')
1061 s = a.tounicode()
1062 self.assertEqual(s, '\xa0\xc2\u1234 \x11abc\xff\u1234')
Victor Stinner9d512ab2012-08-09 00:43:56 +02001063 self.assertEqual(a.itemsize, sizeof_wchar)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001064
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001065 s = '\x00="\'a\\b\x80\xff\u0000\u0001\u1234'
1066 a = array.array('u', s)
1067 self.assertEqual(
1068 repr(a),
Georg Brandl559e5d72008-06-11 18:37:52 +00001069 "array('u', '\\x00=\"\\'a\\\\b\\x80\xff\\x00\\x01\u1234')")
Walter Dörwald7fd94242003-05-18 00:47:47 +00001070
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001071 self.assertRaises(TypeError, a.fromunicode)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001072
Victor Stinner29ec5952013-02-26 00:27:38 +01001073 def test_issue17223(self):
1074 # this used to crash
Victor Stinnerc472c5d2013-02-26 22:52:11 +01001075 if sizeof_wchar == 4:
1076 # U+FFFFFFFF is an invalid code point in Unicode 6.0
1077 invalid_str = b'\xff\xff\xff\xff'
1078 else:
1079 # invalid UTF-16 surrogate pair
1080 invalid_str = b'\xff\xdf\x61\x00'
1081 a = array.array('u', invalid_str)
Victor Stinner29ec5952013-02-26 00:27:38 +01001082 self.assertRaises(ValueError, a.tounicode)
1083 self.assertRaises(ValueError, str, a)
1084
Walter Dörwald7fd94242003-05-18 00:47:47 +00001085class NumberTest(BaseTest):
1086
1087 def test_extslice(self):
1088 a = array.array(self.typecode, range(5))
1089 self.assertEqual(a[::], a)
1090 self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
1091 self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
1092 self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
1093 self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
1094 self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
1095 self.assertEqual(a[-100:100:], a)
1096 self.assertEqual(a[100:-100:-1], a[::-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +00001097 self.assertEqual(a[-100:100:2], array.array(self.typecode, [0,2,4]))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001098 self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
1099 self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
1100
1101 def test_delslice(self):
1102 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001103 del a[::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001104 self.assertEqual(a, array.array(self.typecode, [1,3]))
1105 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001106 del a[1::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001107 self.assertEqual(a, array.array(self.typecode, [0,2,4]))
1108 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001109 del a[1::-2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001110 self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
1111 a = array.array(self.typecode, range(10))
Michael W. Hudson56796f62002-07-29 14:35:04 +00001112 del a[::1000]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001113 self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
Mark Dickinsonbc099642010-01-29 17:27:24 +00001114 # test issue7788
1115 a = array.array(self.typecode, range(10))
1116 del a[9::1<<333]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001117
1118 def test_assignment(self):
1119 a = array.array(self.typecode, range(10))
1120 a[::2] = array.array(self.typecode, [42]*5)
1121 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
1122 a = array.array(self.typecode, range(10))
1123 a[::-4] = array.array(self.typecode, [10]*3)
1124 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
1125 a = array.array(self.typecode, range(4))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001126 a[::-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +00001127 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
1128 a = array.array(self.typecode, range(10))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001129 b = a[:]
1130 c = a[:]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001131 ins = array.array(self.typecode, range(2))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001132 a[2:3] = ins
1133 b[slice(2,3)] = ins
1134 c[2:3:] = ins
Fred Drake004d5e62000-10-23 17:22:08 +00001135
Walter Dörwald7fd94242003-05-18 00:47:47 +00001136 def test_iterationcontains(self):
1137 a = array.array(self.typecode, range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +00001138 self.assertEqual(list(a), list(range(10)))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001139 b = array.array(self.typecode, [20])
1140 self.assertEqual(a[-1] in a, True)
1141 self.assertEqual(b[0] not in a, True)
1142
1143 def check_overflow(self, lower, upper):
1144 # method to be used by subclasses
1145
1146 # should not overflow assigning lower limit
1147 a = array.array(self.typecode, [lower])
1148 a[0] = lower
1149 # should overflow assigning less than lower limit
1150 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
1151 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
1152 # should not overflow assigning upper limit
1153 a = array.array(self.typecode, [upper])
1154 a[0] = upper
1155 # should overflow assigning more than upper limit
1156 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
1157 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
1158
1159 def test_subclassing(self):
1160 typecode = self.typecode
1161 class ExaggeratingArray(array.array):
1162 __slots__ = ['offset']
1163
1164 def __new__(cls, typecode, data, offset):
1165 return array.array.__new__(cls, typecode, data)
1166
1167 def __init__(self, typecode, data, offset):
1168 self.offset = offset
1169
1170 def __getitem__(self, i):
1171 return array.array.__getitem__(self, i) + self.offset
1172
1173 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
1174 self.assertEntryEqual(a[0], 7)
1175
1176 self.assertRaises(AttributeError, setattr, a, "color", "blue")
1177
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00001178 def test_frombytearray(self):
1179 a = array.array('b', range(10))
1180 b = array.array(self.typecode, a)
1181 self.assertEqual(a, b)
1182
Walter Dörwald7fd94242003-05-18 00:47:47 +00001183class SignedNumberTest(NumberTest):
1184 example = [-1, 0, 1, 42, 0x7f]
1185 smallerexample = [-1, 0, 1, 42, 0x7e]
1186 biggerexample = [-1, 0, 1, 43, 0x7f]
1187 outside = 23
1188
1189 def test_overflow(self):
1190 a = array.array(self.typecode)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001191 lower = -1 * int(pow(2, a.itemsize * 8 - 1))
1192 upper = int(pow(2, a.itemsize * 8 - 1)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001193 self.check_overflow(lower, upper)
1194
1195class UnsignedNumberTest(NumberTest):
1196 example = [0, 1, 17, 23, 42, 0xff]
1197 smallerexample = [0, 1, 17, 23, 42, 0xfe]
1198 biggerexample = [0, 1, 17, 23, 43, 0xff]
1199 outside = 0xaa
1200
1201 def test_overflow(self):
1202 a = array.array(self.typecode)
1203 lower = 0
Guido van Rossume2a383d2007-01-15 16:59:06 +00001204 upper = int(pow(2, a.itemsize * 8)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001205 self.check_overflow(lower, upper)
Fred Drake004d5e62000-10-23 17:22:08 +00001206
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001207 def test_bytes_extend(self):
1208 s = bytes(self.example)
1209
1210 a = array.array(self.typecode, self.example)
1211 a.extend(s)
1212 self.assertEqual(
1213 a,
1214 array.array(self.typecode, self.example+self.example)
1215 )
1216
1217 a = array.array(self.typecode, self.example)
1218 a.extend(bytearray(reversed(s)))
1219 self.assertEqual(
1220 a,
1221 array.array(self.typecode, self.example+self.example[::-1])
1222 )
1223
Fred Drake004d5e62000-10-23 17:22:08 +00001224
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001225class ByteTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001226 typecode = 'b'
1227 minitemsize = 1
Fred Drake004d5e62000-10-23 17:22:08 +00001228
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001229class UnsignedByteTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001230 typecode = 'B'
1231 minitemsize = 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001232
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001233class ShortTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001234 typecode = 'h'
1235 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001236
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001237class UnsignedShortTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001238 typecode = 'H'
1239 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001240
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001241class IntTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001242 typecode = 'i'
1243 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001244
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001245class UnsignedIntTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001246 typecode = 'I'
1247 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001248
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001249class LongTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001250 typecode = 'l'
1251 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001252
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001253class UnsignedLongTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001254 typecode = 'L'
1255 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001256
Meador Inge1c9f0c92011-09-20 19:55:51 -05001257@unittest.skipIf(not have_long_long, 'need long long support')
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001258class LongLongTest(SignedNumberTest, unittest.TestCase):
Meador Inge1c9f0c92011-09-20 19:55:51 -05001259 typecode = 'q'
1260 minitemsize = 8
Meador Inge1c9f0c92011-09-20 19:55:51 -05001261
1262@unittest.skipIf(not have_long_long, 'need long long support')
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001263class UnsignedLongLongTest(UnsignedNumberTest, unittest.TestCase):
Meador Inge1c9f0c92011-09-20 19:55:51 -05001264 typecode = 'Q'
1265 minitemsize = 8
Meador Inge1c9f0c92011-09-20 19:55:51 -05001266
Walter Dörwald7fd94242003-05-18 00:47:47 +00001267class FPTest(NumberTest):
1268 example = [-42.0, 0, 42, 1e5, -1e10]
1269 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
1270 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
1271 outside = 23
1272
1273 def assertEntryEqual(self, entry1, entry2):
1274 self.assertAlmostEqual(entry1, entry2)
1275
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001276 def test_byteswap(self):
1277 a = array.array(self.typecode, self.example)
1278 self.assertRaises(TypeError, a.byteswap, 42)
1279 if a.itemsize in (1, 2, 4, 8):
1280 b = array.array(self.typecode, self.example)
1281 b.byteswap()
1282 if a.itemsize==1:
1283 self.assertEqual(a, b)
1284 else:
1285 # On alphas treating the byte swapped bit patters as
1286 # floats/doubles results in floating point exceptions
1287 # => compare the 8bit string values instead
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001288 self.assertNotEqual(a.tobytes(), b.tobytes())
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001289 b.byteswap()
1290 self.assertEqual(a, b)
1291
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001292class FloatTest(FPTest, unittest.TestCase):
Neal Norwitz35c6cd02003-05-22 13:29:15 +00001293 typecode = 'f'
1294 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001295
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001296class DoubleTest(FPTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001297 typecode = 'd'
1298 minitemsize = 8
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001299
1300 def test_alloc_overflow(self):
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001301 from sys import maxsize
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001302 a = array.array('d', [-1]*65536)
1303 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001304 a *= maxsize//65536 + 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 b = array.array('d', [ 2.71828183, 3.14159265, -1])
1310 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001311 b * (maxsize//3 + 1)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001312 except MemoryError:
1313 pass
1314 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001315 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001316
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001317
1318if __name__ == "__main__":
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001319 unittest.main()