blob: a44ee07ce3ba2c8f87be2f34345447697eff4b52 [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 Stinner29c00342013-03-08 02:33:06 +010027sizeof_wchar = array.array('u').itemsize
Victor Stinnerc472c5d2013-02-26 22:52:11 +010028
29
Raymond Hettingerb0900e62004-12-16 16:23:40 +000030class ArraySubclass(array.array):
31 pass
Guido van Rossumc9f8f141997-04-09 20:51:54 +000032
Thomas Woutersb2137042007-02-01 18:02:27 +000033class ArraySubclassWithKwargs(array.array):
34 def __init__(self, typecode, newarg=None):
Victor Stinner7a6a0092011-01-04 00:04:44 +000035 array.array.__init__(self)
Thomas Woutersb2137042007-02-01 18:02:27 +000036
Guido van Rossum31f72d72007-06-18 18:44:28 +000037typecodes = "ubBhHiIlLfd"
Meador Inge1c9f0c92011-09-20 19:55:51 -050038if have_long_long:
39 typecodes += 'qQ'
Martin v. Löwis99866332002-03-01 10:27:01 +000040
Walter Dörwald7fd94242003-05-18 00:47:47 +000041class BadConstructorTest(unittest.TestCase):
Martin v. Löwis99866332002-03-01 10:27:01 +000042
Walter Dörwald7fd94242003-05-18 00:47:47 +000043 def test_constructor(self):
44 self.assertRaises(TypeError, array.array)
45 self.assertRaises(TypeError, array.array, spam=42)
46 self.assertRaises(TypeError, array.array, 'xx')
47 self.assertRaises(ValueError, array.array, 'x')
Martin v. Löwis99866332002-03-01 10:27:01 +000048
Martin v. Löwis99866332002-03-01 10:27:01 +000049
Alexandre Vassalottiad077152009-07-15 17:49:23 +000050# Machine format codes.
51#
52# Search for "enum machine_format_code" in Modules/arraymodule.c to get the
53# authoritative values.
54UNKNOWN_FORMAT = -1
55UNSIGNED_INT8 = 0
56SIGNED_INT8 = 1
57UNSIGNED_INT16_LE = 2
58UNSIGNED_INT16_BE = 3
59SIGNED_INT16_LE = 4
60SIGNED_INT16_BE = 5
61UNSIGNED_INT32_LE = 6
62UNSIGNED_INT32_BE = 7
63SIGNED_INT32_LE = 8
64SIGNED_INT32_BE = 9
65UNSIGNED_INT64_LE = 10
66UNSIGNED_INT64_BE = 11
67SIGNED_INT64_LE = 12
68SIGNED_INT64_BE = 13
69IEEE_754_FLOAT_LE = 14
70IEEE_754_FLOAT_BE = 15
71IEEE_754_DOUBLE_LE = 16
72IEEE_754_DOUBLE_BE = 17
73UTF16_LE = 18
74UTF16_BE = 19
75UTF32_LE = 20
76UTF32_BE = 21
77
78class ArrayReconstructorTest(unittest.TestCase):
79
80 def test_error(self):
81 self.assertRaises(TypeError, array_reconstructor,
82 "", "b", 0, b"")
83 self.assertRaises(TypeError, array_reconstructor,
84 str, "b", 0, b"")
85 self.assertRaises(TypeError, array_reconstructor,
86 array.array, "b", '', b"")
87 self.assertRaises(TypeError, array_reconstructor,
88 array.array, "b", 0, "")
89 self.assertRaises(ValueError, array_reconstructor,
90 array.array, "?", 0, b"")
91 self.assertRaises(ValueError, array_reconstructor,
92 array.array, "b", UNKNOWN_FORMAT, b"")
93 self.assertRaises(ValueError, array_reconstructor,
94 array.array, "b", 22, b"")
95 self.assertRaises(ValueError, array_reconstructor,
96 array.array, "d", 16, b"a")
97
98 def test_numbers(self):
99 testcases = (
100 (['B', 'H', 'I', 'L'], UNSIGNED_INT8, '=BBBB',
101 [0x80, 0x7f, 0, 0xff]),
102 (['b', 'h', 'i', 'l'], SIGNED_INT8, '=bbb',
103 [-0x80, 0x7f, 0]),
104 (['H', 'I', 'L'], UNSIGNED_INT16_LE, '<HHHH',
105 [0x8000, 0x7fff, 0, 0xffff]),
106 (['H', 'I', 'L'], UNSIGNED_INT16_BE, '>HHHH',
107 [0x8000, 0x7fff, 0, 0xffff]),
108 (['h', 'i', 'l'], SIGNED_INT16_LE, '<hhh',
109 [-0x8000, 0x7fff, 0]),
110 (['h', 'i', 'l'], SIGNED_INT16_BE, '>hhh',
111 [-0x8000, 0x7fff, 0]),
112 (['I', 'L'], UNSIGNED_INT32_LE, '<IIII',
113 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
114 (['I', 'L'], UNSIGNED_INT32_BE, '>IIII',
115 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
116 (['i', 'l'], SIGNED_INT32_LE, '<iii',
117 [-1<<31, (1<<31)-1, 0]),
118 (['i', 'l'], SIGNED_INT32_BE, '>iii',
119 [-1<<31, (1<<31)-1, 0]),
120 (['L'], UNSIGNED_INT64_LE, '<QQQQ',
Alexandre Vassalotti0027d4b2009-07-15 20:53:55 +0000121 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
122 (['L'], UNSIGNED_INT64_BE, '>QQQQ',
123 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
124 (['l'], SIGNED_INT64_LE, '<qqq',
125 [-1<<31, (1<<31)-1, 0]),
126 (['l'], SIGNED_INT64_BE, '>qqq',
127 [-1<<31, (1<<31)-1, 0]),
128 # The following tests for INT64 will raise an OverflowError
129 # when run on a 32-bit machine. The tests are simply skipped
130 # in that case.
131 (['L'], UNSIGNED_INT64_LE, '<QQQQ',
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000132 [1<<63, (1<<63)-1, 0, (1<<64)-1]),
133 (['L'], UNSIGNED_INT64_BE, '>QQQQ',
134 [1<<63, (1<<63)-1, 0, (1<<64)-1]),
135 (['l'], SIGNED_INT64_LE, '<qqq',
136 [-1<<63, (1<<63)-1, 0]),
137 (['l'], SIGNED_INT64_BE, '>qqq',
138 [-1<<63, (1<<63)-1, 0]),
139 (['f'], IEEE_754_FLOAT_LE, '<ffff',
140 [16711938.0, float('inf'), float('-inf'), -0.0]),
141 (['f'], IEEE_754_FLOAT_BE, '>ffff',
142 [16711938.0, float('inf'), float('-inf'), -0.0]),
143 (['d'], IEEE_754_DOUBLE_LE, '<dddd',
144 [9006104071832581.0, float('inf'), float('-inf'), -0.0]),
145 (['d'], IEEE_754_DOUBLE_BE, '>dddd',
146 [9006104071832581.0, float('inf'), float('-inf'), -0.0])
147 )
148 for testcase in testcases:
149 valid_typecodes, mformat_code, struct_fmt, values = testcase
150 arraystr = struct.pack(struct_fmt, *values)
151 for typecode in valid_typecodes:
Alexandre Vassalotti0027d4b2009-07-15 20:53:55 +0000152 try:
153 a = array.array(typecode, values)
154 except OverflowError:
155 continue # Skip this test case.
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000156 b = array_reconstructor(
157 array.array, typecode, mformat_code, arraystr)
158 self.assertEqual(a, b,
159 msg="{0!r} != {1!r}; testcase={2!r}".format(a, b, testcase))
160
161 def test_unicode(self):
162 teststr = "Bonne Journ\xe9e \U0002030a\U00020347"
163 testcases = (
164 (UTF16_LE, "UTF-16-LE"),
165 (UTF16_BE, "UTF-16-BE"),
166 (UTF32_LE, "UTF-32-LE"),
167 (UTF32_BE, "UTF-32-BE")
168 )
169 for testcase in testcases:
170 mformat_code, encoding = testcase
171 a = array.array('u', teststr)
172 b = array_reconstructor(
173 array.array, 'u', mformat_code, teststr.encode(encoding))
174 self.assertEqual(a, b,
175 msg="{0!r} != {1!r}; testcase={2!r}".format(a, b, testcase))
176
177
Ezio Melotti1d3e96d2013-01-10 06:04:50 +0200178class BaseTest:
Walter Dörwald7fd94242003-05-18 00:47:47 +0000179 # Required class attributes (provided by subclasses
180 # typecode: the typecode to test
181 # example: an initializer usable in the constructor for this type
182 # smallerexample: the same length as example, but smaller
183 # biggerexample: the same length as example, but bigger
184 # outside: An entry that is not in example
185 # minitemsize: the minimum guaranteed itemsize
Martin v. Löwis99866332002-03-01 10:27:01 +0000186
Walter Dörwald7fd94242003-05-18 00:47:47 +0000187 def assertEntryEqual(self, entry1, entry2):
188 self.assertEqual(entry1, entry2)
Martin v. Löwis99866332002-03-01 10:27:01 +0000189
Walter Dörwald7fd94242003-05-18 00:47:47 +0000190 def badtypecode(self):
191 # Return a typecode that is different from our own
192 return typecodes[(typecodes.index(self.typecode)+1) % len(typecodes)]
Martin v. Löwis99866332002-03-01 10:27:01 +0000193
Walter Dörwald7fd94242003-05-18 00:47:47 +0000194 def test_constructor(self):
195 a = array.array(self.typecode)
196 self.assertEqual(a.typecode, self.typecode)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000197 self.assertTrue(a.itemsize>=self.minitemsize)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000198 self.assertRaises(TypeError, array.array, self.typecode, None)
Martin v. Löwis99866332002-03-01 10:27:01 +0000199
Walter Dörwald7fd94242003-05-18 00:47:47 +0000200 def test_len(self):
201 a = array.array(self.typecode)
202 a.append(self.example[0])
203 self.assertEqual(len(a), 1)
Martin v. Löwis99866332002-03-01 10:27:01 +0000204
Walter Dörwald7fd94242003-05-18 00:47:47 +0000205 a = array.array(self.typecode, self.example)
206 self.assertEqual(len(a), len(self.example))
Martin v. Löwis99866332002-03-01 10:27:01 +0000207
Walter Dörwald7fd94242003-05-18 00:47:47 +0000208 def test_buffer_info(self):
209 a = array.array(self.typecode, self.example)
210 self.assertRaises(TypeError, a.buffer_info, 42)
211 bi = a.buffer_info()
Ezio Melottie9615932010-01-24 19:26:24 +0000212 self.assertIsInstance(bi, tuple)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000213 self.assertEqual(len(bi), 2)
Ezio Melottie9615932010-01-24 19:26:24 +0000214 self.assertIsInstance(bi[0], int)
215 self.assertIsInstance(bi[1], int)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000216 self.assertEqual(bi[1], len(a))
Martin v. Löwis99866332002-03-01 10:27:01 +0000217
Walter Dörwald7fd94242003-05-18 00:47:47 +0000218 def test_byteswap(self):
Victor Stinner8dba4e02011-09-30 00:51:10 +0200219 if self.typecode == 'u':
220 example = '\U00100100'
221 else:
222 example = self.example
223 a = array.array(self.typecode, example)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000224 self.assertRaises(TypeError, a.byteswap, 42)
225 if a.itemsize in (1, 2, 4, 8):
Victor Stinner8dba4e02011-09-30 00:51:10 +0200226 b = array.array(self.typecode, example)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000227 b.byteswap()
228 if a.itemsize==1:
229 self.assertEqual(a, b)
230 else:
231 self.assertNotEqual(a, b)
232 b.byteswap()
233 self.assertEqual(a, b)
Martin v. Löwis99866332002-03-01 10:27:01 +0000234
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000235 def test_copy(self):
236 import copy
237 a = array.array(self.typecode, self.example)
238 b = copy.copy(a)
239 self.assertNotEqual(id(a), id(b))
240 self.assertEqual(a, b)
241
Thomas Wouters89f507f2006-12-13 04:49:30 +0000242 def test_deepcopy(self):
243 import copy
244 a = array.array(self.typecode, self.example)
245 b = copy.deepcopy(a)
246 self.assertNotEqual(id(a), id(b))
247 self.assertEqual(a, b)
248
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000249 def test_reduce_ex(self):
250 a = array.array(self.typecode, self.example)
251 for protocol in range(3):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000252 self.assertIs(a.__reduce_ex__(protocol)[0], array.array)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000253 for protocol in range(3, pickle.HIGHEST_PROTOCOL):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000254 self.assertIs(a.__reduce_ex__(protocol)[0], array_reconstructor)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000255
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000256 def test_pickle(self):
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000257 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000258 a = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000259 b = pickle.loads(pickle.dumps(a, protocol))
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000260 self.assertNotEqual(id(a), id(b))
261 self.assertEqual(a, b)
262
263 a = ArraySubclass(self.typecode, self.example)
264 a.x = 10
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000265 b = pickle.loads(pickle.dumps(a, protocol))
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000266 self.assertNotEqual(id(a), id(b))
267 self.assertEqual(a, b)
268 self.assertEqual(a.x, b.x)
269 self.assertEqual(type(a), type(b))
270
Guido van Rossumd8faa362007-04-27 19:54:29 +0000271 def test_pickle_for_empty_array(self):
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000272 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossumd8faa362007-04-27 19:54:29 +0000273 a = array.array(self.typecode)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000274 b = pickle.loads(pickle.dumps(a, protocol))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000275 self.assertNotEqual(id(a), id(b))
276 self.assertEqual(a, b)
277
278 a = ArraySubclass(self.typecode)
279 a.x = 10
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000280 b = pickle.loads(pickle.dumps(a, protocol))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000281 self.assertNotEqual(id(a), id(b))
282 self.assertEqual(a, b)
283 self.assertEqual(a.x, b.x)
284 self.assertEqual(type(a), type(b))
285
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000286 def test_iterator_pickle(self):
287 data = array.array(self.typecode, self.example)
288 orgit = iter(data)
289 d = pickle.dumps(orgit)
290 it = pickle.loads(d)
291 self.assertEqual(type(orgit), type(it))
292 self.assertEqual(list(it), list(data))
293
294 if len(data):
295 it = pickle.loads(d)
296 next(it)
297 d = pickle.dumps(it)
298 self.assertEqual(list(it), list(data)[1:])
299
Walter Dörwald7fd94242003-05-18 00:47:47 +0000300 def test_insert(self):
301 a = array.array(self.typecode, self.example)
302 a.insert(0, self.example[0])
303 self.assertEqual(len(a), 1+len(self.example))
304 self.assertEqual(a[0], a[1])
305 self.assertRaises(TypeError, a.insert)
306 self.assertRaises(TypeError, a.insert, None)
Walter Dörwaldba39d9c2003-05-18 01:56:25 +0000307 self.assertRaises(TypeError, a.insert, 0, None)
Martin v. Löwis99866332002-03-01 10:27:01 +0000308
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000309 a = array.array(self.typecode, self.example)
310 a.insert(-1, self.example[0])
311 self.assertEqual(
312 a,
313 array.array(
314 self.typecode,
315 self.example[:-1] + self.example[:1] + self.example[-1:]
316 )
317 )
318
319 a = array.array(self.typecode, self.example)
320 a.insert(-1000, self.example[0])
321 self.assertEqual(
322 a,
323 array.array(self.typecode, self.example[:1] + self.example)
324 )
325
326 a = array.array(self.typecode, self.example)
327 a.insert(1000, self.example[0])
328 self.assertEqual(
329 a,
330 array.array(self.typecode, self.example + self.example[:1])
331 )
332
Walter Dörwald7fd94242003-05-18 00:47:47 +0000333 def test_tofromfile(self):
334 a = array.array(self.typecode, 2*self.example)
335 self.assertRaises(TypeError, a.tofile)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000336 support.unlink(support.TESTFN)
337 f = open(support.TESTFN, 'wb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000338 try:
339 a.tofile(f)
340 f.close()
341 b = array.array(self.typecode)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000342 f = open(support.TESTFN, 'rb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000343 self.assertRaises(TypeError, b.fromfile)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000344 b.fromfile(f, len(self.example))
345 self.assertEqual(b, array.array(self.typecode, self.example))
346 self.assertNotEqual(a, b)
Hirokazu Yamamoto54d0df62009-03-06 03:04:07 +0000347 self.assertRaises(EOFError, b.fromfile, f, len(self.example)+1)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000348 self.assertEqual(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000349 f.close()
350 finally:
351 if not f.closed:
352 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000353 support.unlink(support.TESTFN)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000354
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000355 def test_fromfile_ioerror(self):
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200356 # Issue #5395: Check if fromfile raises a proper OSError
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000357 # instead of EOFError.
358 a = array.array(self.typecode)
359 f = open(support.TESTFN, 'wb')
360 try:
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200361 self.assertRaises(OSError, a.fromfile, f, len(self.example))
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000362 finally:
363 f.close()
364 support.unlink(support.TESTFN)
365
Frank Wierzbicki17683432009-08-16 20:30:12 +0000366 def test_filewrite(self):
367 a = array.array(self.typecode, 2*self.example)
368 f = open(support.TESTFN, 'wb')
369 try:
370 f.write(a)
371 f.close()
372 b = array.array(self.typecode)
373 f = open(support.TESTFN, 'rb')
374 b.fromfile(f, len(self.example))
375 self.assertEqual(b, array.array(self.typecode, self.example))
376 self.assertNotEqual(a, b)
377 b.fromfile(f, len(self.example))
378 self.assertEqual(a, b)
379 f.close()
380 finally:
381 if not f.closed:
382 f.close()
383 support.unlink(support.TESTFN)
384
Walter Dörwald7fd94242003-05-18 00:47:47 +0000385 def test_tofromlist(self):
386 a = array.array(self.typecode, 2*self.example)
387 b = array.array(self.typecode)
388 self.assertRaises(TypeError, a.tolist, 42)
389 self.assertRaises(TypeError, b.fromlist)
390 self.assertRaises(TypeError, b.fromlist, 42)
391 self.assertRaises(TypeError, b.fromlist, [None])
392 b.fromlist(a.tolist())
393 self.assertEqual(a, b)
Fred Drake78334472000-06-28 17:50:51 +0000394
Walter Dörwald7fd94242003-05-18 00:47:47 +0000395 def test_tofromstring(self):
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000396 nb_warnings = 4
397 with warnings.catch_warnings(record=True) as r:
398 warnings.filterwarnings("always",
399 message=r"(to|from)string\(\) is deprecated",
400 category=DeprecationWarning)
401 a = array.array(self.typecode, 2*self.example)
402 b = array.array(self.typecode)
403 self.assertRaises(TypeError, a.tostring, 42)
404 self.assertRaises(TypeError, b.fromstring)
405 self.assertRaises(TypeError, b.fromstring, 42)
406 b.fromstring(a.tostring())
407 self.assertEqual(a, b)
408 if a.itemsize>1:
409 self.assertRaises(ValueError, b.fromstring, "x")
410 nb_warnings += 1
411 self.assertEqual(len(r), nb_warnings)
412
413 def test_tofrombytes(self):
Walter Dörwald7fd94242003-05-18 00:47:47 +0000414 a = array.array(self.typecode, 2*self.example)
415 b = array.array(self.typecode)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000416 self.assertRaises(TypeError, a.tobytes, 42)
417 self.assertRaises(TypeError, b.frombytes)
418 self.assertRaises(TypeError, b.frombytes, 42)
419 b.frombytes(a.tobytes())
420 c = array.array(self.typecode, bytearray(a.tobytes()))
Walter Dörwald7fd94242003-05-18 00:47:47 +0000421 self.assertEqual(a, b)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000422 self.assertEqual(a, c)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000423 if a.itemsize>1:
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000424 self.assertRaises(ValueError, b.frombytes, b"x")
Fred Drake78334472000-06-28 17:50:51 +0000425
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +0000426 def test_fromarray(self):
427 a = array.array(self.typecode, self.example)
428 b = array.array(self.typecode, a)
429 self.assertEqual(a, b)
430
Walter Dörwald7fd94242003-05-18 00:47:47 +0000431 def test_repr(self):
432 a = array.array(self.typecode, 2*self.example)
433 self.assertEqual(a, eval(repr(a), {"array": array.array}))
Fred Drake78334472000-06-28 17:50:51 +0000434
Walter Dörwald7fd94242003-05-18 00:47:47 +0000435 a = array.array(self.typecode)
436 self.assertEqual(repr(a), "array('%s')" % self.typecode)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000437
Walter Dörwald7fd94242003-05-18 00:47:47 +0000438 def test_str(self):
439 a = array.array(self.typecode, 2*self.example)
440 str(a)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000441
Walter Dörwald7fd94242003-05-18 00:47:47 +0000442 def test_cmp(self):
443 a = array.array(self.typecode, self.example)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000444 self.assertTrue((a == 42) is False)
445 self.assertTrue((a != 42) is True)
Tim Peterscc78e472000-11-14 21:36:07 +0000446
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000447 self.assertTrue((a == a) is True)
448 self.assertTrue((a != a) is False)
449 self.assertTrue((a < a) is False)
450 self.assertTrue((a <= a) is True)
451 self.assertTrue((a > a) is False)
452 self.assertTrue((a >= a) is True)
Tim Peterscc78e472000-11-14 21:36:07 +0000453
Neal Norwitzbd2835c2006-03-17 08:54:15 +0000454 al = array.array(self.typecode, self.smallerexample)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000455 ab = array.array(self.typecode, self.biggerexample)
Guido van Rossum7f1d3aa1998-07-16 15:31:43 +0000456
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000457 self.assertTrue((a == 2*a) is False)
458 self.assertTrue((a != 2*a) is True)
459 self.assertTrue((a < 2*a) is True)
460 self.assertTrue((a <= 2*a) is True)
461 self.assertTrue((a > 2*a) is False)
462 self.assertTrue((a >= 2*a) is False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000463
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000464 self.assertTrue((a == al) is False)
465 self.assertTrue((a != al) is True)
466 self.assertTrue((a < al) is False)
467 self.assertTrue((a <= al) is False)
468 self.assertTrue((a > al) is True)
469 self.assertTrue((a >= al) is True)
Martin v. Löwis99866332002-03-01 10:27:01 +0000470
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000471 self.assertTrue((a == ab) is False)
472 self.assertTrue((a != ab) is True)
473 self.assertTrue((a < ab) is True)
474 self.assertTrue((a <= ab) is True)
475 self.assertTrue((a > ab) is False)
476 self.assertTrue((a >= ab) is False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000477
Walter Dörwald7fd94242003-05-18 00:47:47 +0000478 def test_add(self):
479 a = array.array(self.typecode, self.example) \
480 + array.array(self.typecode, self.example[::-1])
481 self.assertEqual(
482 a,
483 array.array(self.typecode, self.example + self.example[::-1])
484 )
Martin v. Löwis99866332002-03-01 10:27:01 +0000485
Walter Dörwald7fd94242003-05-18 00:47:47 +0000486 b = array.array(self.badtypecode())
487 self.assertRaises(TypeError, a.__add__, b)
488
489 self.assertRaises(TypeError, a.__add__, "bad")
490
491 def test_iadd(self):
492 a = array.array(self.typecode, self.example[::-1])
493 b = a
494 a += array.array(self.typecode, 2*self.example)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000495 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000496 self.assertEqual(
497 a,
498 array.array(self.typecode, self.example[::-1]+2*self.example)
499 )
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000500 a = array.array(self.typecode, self.example)
501 a += a
502 self.assertEqual(
503 a,
504 array.array(self.typecode, self.example + self.example)
505 )
Walter Dörwald7fd94242003-05-18 00:47:47 +0000506
507 b = array.array(self.badtypecode())
508 self.assertRaises(TypeError, a.__add__, b)
509
510 self.assertRaises(TypeError, a.__iadd__, "bad")
511
512 def test_mul(self):
513 a = 5*array.array(self.typecode, self.example)
514 self.assertEqual(
515 a,
516 array.array(self.typecode, 5*self.example)
517 )
518
519 a = array.array(self.typecode, self.example)*5
520 self.assertEqual(
521 a,
522 array.array(self.typecode, self.example*5)
523 )
524
525 a = 0*array.array(self.typecode, self.example)
526 self.assertEqual(
527 a,
528 array.array(self.typecode)
529 )
530
531 a = (-1)*array.array(self.typecode, self.example)
532 self.assertEqual(
533 a,
534 array.array(self.typecode)
535 )
536
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000537 a = 5 * array.array(self.typecode, self.example[:1])
538 self.assertEqual(
539 a,
540 array.array(self.typecode, [a[0]] * 5)
541 )
542
Walter Dörwald7fd94242003-05-18 00:47:47 +0000543 self.assertRaises(TypeError, a.__mul__, "bad")
544
545 def test_imul(self):
546 a = array.array(self.typecode, self.example)
547 b = a
548
549 a *= 5
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000550 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000551 self.assertEqual(
552 a,
553 array.array(self.typecode, 5*self.example)
554 )
555
556 a *= 0
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000557 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000558 self.assertEqual(a, array.array(self.typecode))
559
560 a *= 1000
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000561 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000562 self.assertEqual(a, array.array(self.typecode))
563
564 a *= -1
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 = array.array(self.typecode, self.example)
569 a *= -1
570 self.assertEqual(a, array.array(self.typecode))
571
572 self.assertRaises(TypeError, a.__imul__, "bad")
573
574 def test_getitem(self):
575 a = array.array(self.typecode, self.example)
576 self.assertEntryEqual(a[0], self.example[0])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000577 self.assertEntryEqual(a[0], self.example[0])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000578 self.assertEntryEqual(a[-1], self.example[-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000579 self.assertEntryEqual(a[-1], self.example[-1])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000580 self.assertEntryEqual(a[len(self.example)-1], self.example[-1])
581 self.assertEntryEqual(a[-len(self.example)], self.example[0])
582 self.assertRaises(TypeError, a.__getitem__)
583 self.assertRaises(IndexError, a.__getitem__, len(self.example))
584 self.assertRaises(IndexError, a.__getitem__, -len(self.example)-1)
585
586 def test_setitem(self):
587 a = array.array(self.typecode, self.example)
588 a[0] = a[-1]
589 self.assertEntryEqual(a[0], a[-1])
590
591 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000592 a[0] = a[-1]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000593 self.assertEntryEqual(a[0], a[-1])
594
595 a = array.array(self.typecode, self.example)
596 a[-1] = a[0]
597 self.assertEntryEqual(a[0], a[-1])
598
599 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000600 a[-1] = a[0]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000601 self.assertEntryEqual(a[0], a[-1])
602
603 a = array.array(self.typecode, self.example)
604 a[len(self.example)-1] = a[0]
605 self.assertEntryEqual(a[0], a[-1])
606
607 a = array.array(self.typecode, self.example)
608 a[-len(self.example)] = a[-1]
609 self.assertEntryEqual(a[0], a[-1])
610
611 self.assertRaises(TypeError, a.__setitem__)
612 self.assertRaises(TypeError, a.__setitem__, None)
613 self.assertRaises(TypeError, a.__setitem__, 0, None)
614 self.assertRaises(
615 IndexError,
616 a.__setitem__,
617 len(self.example), self.example[0]
618 )
619 self.assertRaises(
620 IndexError,
621 a.__setitem__,
622 -len(self.example)-1, self.example[0]
623 )
624
625 def test_delitem(self):
626 a = array.array(self.typecode, self.example)
627 del a[0]
628 self.assertEqual(
629 a,
630 array.array(self.typecode, self.example[1:])
631 )
632
633 a = array.array(self.typecode, self.example)
634 del a[-1]
635 self.assertEqual(
636 a,
637 array.array(self.typecode, self.example[:-1])
638 )
639
640 a = array.array(self.typecode, self.example)
641 del a[len(self.example)-1]
642 self.assertEqual(
643 a,
644 array.array(self.typecode, self.example[:-1])
645 )
646
647 a = array.array(self.typecode, self.example)
648 del a[-len(self.example)]
649 self.assertEqual(
650 a,
651 array.array(self.typecode, self.example[1:])
652 )
653
654 self.assertRaises(TypeError, a.__delitem__)
655 self.assertRaises(TypeError, a.__delitem__, None)
656 self.assertRaises(IndexError, a.__delitem__, len(self.example))
657 self.assertRaises(IndexError, a.__delitem__, -len(self.example)-1)
658
659 def test_getslice(self):
660 a = array.array(self.typecode, self.example)
661 self.assertEqual(a[:], a)
662
663 self.assertEqual(
664 a[1:],
665 array.array(self.typecode, self.example[1:])
666 )
667
668 self.assertEqual(
669 a[:1],
670 array.array(self.typecode, self.example[:1])
671 )
672
673 self.assertEqual(
674 a[:-1],
675 array.array(self.typecode, self.example[:-1])
676 )
677
678 self.assertEqual(
679 a[-1:],
680 array.array(self.typecode, self.example[-1:])
681 )
682
683 self.assertEqual(
684 a[-1:-1],
685 array.array(self.typecode)
686 )
687
688 self.assertEqual(
Walter Dörwald1083c242005-01-21 21:16:51 +0000689 a[2:1],
690 array.array(self.typecode)
691 )
692
693 self.assertEqual(
Walter Dörwald7fd94242003-05-18 00:47:47 +0000694 a[1000:],
695 array.array(self.typecode)
696 )
697 self.assertEqual(a[-1000:], a)
698 self.assertEqual(a[:1000], a)
699 self.assertEqual(
700 a[:-1000],
701 array.array(self.typecode)
702 )
703 self.assertEqual(a[-1000:1000], a)
704 self.assertEqual(
705 a[2000:1000],
706 array.array(self.typecode)
707 )
708
Thomas Woutersed03b412007-08-28 21:37:11 +0000709 def test_extended_getslice(self):
710 # Test extended slicing by comparing with list slicing
711 # (Assumes list conversion works correctly, too)
712 a = array.array(self.typecode, self.example)
713 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
714 for start in indices:
715 for stop in indices:
716 # Everything except the initial 0 (invalid step)
717 for step in indices[1:]:
718 self.assertEqual(list(a[start:stop:step]),
719 list(a)[start:stop:step])
720
Walter Dörwald7fd94242003-05-18 00:47:47 +0000721 def test_setslice(self):
722 a = array.array(self.typecode, self.example)
723 a[:1] = a
724 self.assertEqual(
725 a,
726 array.array(self.typecode, self.example + self.example[1:])
727 )
728
729 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000730 a[:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000731 self.assertEqual(
732 a,
733 array.array(self.typecode, self.example + self.example[-1:])
734 )
735
736 a = array.array(self.typecode, self.example)
737 a[-1:] = a
738 self.assertEqual(
739 a,
740 array.array(self.typecode, self.example[:-1] + self.example)
741 )
742
743 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000744 a[1:] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000745 self.assertEqual(
746 a,
747 array.array(self.typecode, self.example[:1] + self.example)
748 )
749
750 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000751 a[1:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000752 self.assertEqual(
753 a,
754 array.array(
755 self.typecode,
756 self.example[:1] + self.example + self.example[-1:]
757 )
758 )
759
760 a = array.array(self.typecode, self.example)
761 a[1000:] = a
762 self.assertEqual(
763 a,
764 array.array(self.typecode, 2*self.example)
765 )
766
767 a = array.array(self.typecode, self.example)
768 a[-1000:] = a
769 self.assertEqual(
770 a,
771 array.array(self.typecode, self.example)
772 )
773
774 a = array.array(self.typecode, self.example)
775 a[:1000] = a
776 self.assertEqual(
777 a,
778 array.array(self.typecode, self.example)
779 )
780
781 a = array.array(self.typecode, self.example)
782 a[:-1000] = a
783 self.assertEqual(
784 a,
785 array.array(self.typecode, 2*self.example)
786 )
787
788 a = array.array(self.typecode, self.example)
789 a[1:0] = a
790 self.assertEqual(
791 a,
792 array.array(self.typecode, self.example[:1] + self.example + self.example[1:])
793 )
794
795 a = array.array(self.typecode, self.example)
796 a[2000:1000] = a
797 self.assertEqual(
798 a,
799 array.array(self.typecode, 2*self.example)
800 )
801
802 a = array.array(self.typecode, self.example)
Thomas Woutersed03b412007-08-28 21:37:11 +0000803 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), None)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000804 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), None)
805
806 b = array.array(self.badtypecode())
Thomas Woutersed03b412007-08-28 21:37:11 +0000807 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000808 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), b)
809
Thomas Woutersed03b412007-08-28 21:37:11 +0000810 def test_extended_set_del_slice(self):
811 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
812 for start in indices:
813 for stop in indices:
814 # Everything except the initial 0 (invalid step)
815 for step in indices[1:]:
816 a = array.array(self.typecode, self.example)
817 L = list(a)
818 # Make sure we have a slice of exactly the right length,
819 # but with (hopefully) different data.
820 data = L[start:stop:step]
821 data.reverse()
822 L[start:stop:step] = data
823 a[start:stop:step] = array.array(self.typecode, data)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000824 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000825
826 del L[start:stop:step]
827 del a[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +0000828 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000829
Walter Dörwald7fd94242003-05-18 00:47:47 +0000830 def test_index(self):
831 example = 2*self.example
832 a = array.array(self.typecode, example)
833 self.assertRaises(TypeError, a.index)
834 for x in example:
835 self.assertEqual(a.index(x), example.index(x))
836 self.assertRaises(ValueError, a.index, None)
837 self.assertRaises(ValueError, a.index, self.outside)
838
839 def test_count(self):
840 example = 2*self.example
841 a = array.array(self.typecode, example)
842 self.assertRaises(TypeError, a.count)
843 for x in example:
844 self.assertEqual(a.count(x), example.count(x))
845 self.assertEqual(a.count(self.outside), 0)
846 self.assertEqual(a.count(None), 0)
847
848 def test_remove(self):
849 for x in self.example:
850 example = 2*self.example
851 a = array.array(self.typecode, example)
852 pos = example.index(x)
853 example2 = example[:pos] + example[pos+1:]
854 a.remove(x)
855 self.assertEqual(a, array.array(self.typecode, example2))
856
857 a = array.array(self.typecode, self.example)
858 self.assertRaises(ValueError, a.remove, self.outside)
859
860 self.assertRaises(ValueError, a.remove, None)
861
862 def test_pop(self):
863 a = array.array(self.typecode)
864 self.assertRaises(IndexError, a.pop)
865
866 a = array.array(self.typecode, 2*self.example)
867 self.assertRaises(TypeError, a.pop, 42, 42)
868 self.assertRaises(TypeError, a.pop, None)
869 self.assertRaises(IndexError, a.pop, len(a))
870 self.assertRaises(IndexError, a.pop, -len(a)-1)
871
872 self.assertEntryEqual(a.pop(0), self.example[0])
873 self.assertEqual(
874 a,
875 array.array(self.typecode, self.example[1:]+self.example)
876 )
877 self.assertEntryEqual(a.pop(1), self.example[2])
878 self.assertEqual(
879 a,
880 array.array(self.typecode, self.example[1:2]+self.example[3:]+self.example)
881 )
882 self.assertEntryEqual(a.pop(0), self.example[1])
883 self.assertEntryEqual(a.pop(), self.example[-1])
884 self.assertEqual(
885 a,
886 array.array(self.typecode, self.example[3:]+self.example[:-1])
887 )
888
889 def test_reverse(self):
890 a = array.array(self.typecode, self.example)
891 self.assertRaises(TypeError, a.reverse, 42)
Fred Drake004d5e62000-10-23 17:22:08 +0000892 a.reverse()
Walter Dörwald7fd94242003-05-18 00:47:47 +0000893 self.assertEqual(
894 a,
895 array.array(self.typecode, self.example[::-1])
896 )
897
898 def test_extend(self):
899 a = array.array(self.typecode, self.example)
900 self.assertRaises(TypeError, a.extend)
901 a.extend(array.array(self.typecode, self.example[::-1]))
902 self.assertEqual(
903 a,
904 array.array(self.typecode, self.example+self.example[::-1])
905 )
906
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000907 a = array.array(self.typecode, self.example)
908 a.extend(a)
909 self.assertEqual(
910 a,
911 array.array(self.typecode, self.example+self.example)
912 )
913
Walter Dörwald7fd94242003-05-18 00:47:47 +0000914 b = array.array(self.badtypecode())
915 self.assertRaises(TypeError, a.extend, b)
916
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000917 a = array.array(self.typecode, self.example)
918 a.extend(self.example[::-1])
919 self.assertEqual(
920 a,
921 array.array(self.typecode, self.example+self.example[::-1])
922 )
923
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +0000924 def test_constructor_with_iterable_argument(self):
925 a = array.array(self.typecode, iter(self.example))
926 b = array.array(self.typecode, self.example)
927 self.assertEqual(a, b)
928
929 # non-iterable argument
930 self.assertRaises(TypeError, array.array, self.typecode, 10)
931
932 # pass through errors raised in __iter__
933 class A:
934 def __iter__(self):
935 raise UnicodeError
936 self.assertRaises(UnicodeError, array.array, self.typecode, A())
937
938 # pass through errors raised in next()
939 def B():
940 raise UnicodeError
941 yield None
942 self.assertRaises(UnicodeError, array.array, self.typecode, B())
943
Walter Dörwald7fd94242003-05-18 00:47:47 +0000944 def test_coveritertraverse(self):
945 try:
946 import gc
947 except ImportError:
948 return
949 a = array.array(self.typecode)
950 l = [iter(a)]
951 l.append(l)
952 gc.collect()
953
954 def test_buffer(self):
955 a = array.array(self.typecode, self.example)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000956 m = memoryview(a)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000957 expected = m.tobytes()
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000958 self.assertEqual(a.tobytes(), expected)
959 self.assertEqual(a.tobytes()[0], expected[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000960 # Resizing is forbidden when there are buffer exports.
961 # For issue 4509, we also check after each error that
962 # the array was not modified.
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000963 self.assertRaises(BufferError, a.append, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000964 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000965 self.assertRaises(BufferError, a.extend, a[0:1])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000966 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000967 self.assertRaises(BufferError, a.remove, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000968 self.assertEqual(m.tobytes(), expected)
969 self.assertRaises(BufferError, a.pop, 0)
970 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000971 self.assertRaises(BufferError, a.fromlist, a.tolist())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000972 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000973 self.assertRaises(BufferError, a.frombytes, a.tobytes())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000974 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000975 if self.typecode == 'u':
976 self.assertRaises(BufferError, a.fromunicode, a.tounicode())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000977 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +0000978 self.assertRaises(BufferError, operator.imul, a, 2)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000979 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +0000980 self.assertRaises(BufferError, operator.imul, a, 0)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000981 self.assertEqual(m.tobytes(), expected)
982 self.assertRaises(BufferError, operator.setitem, a, slice(0, 0), a)
983 self.assertEqual(m.tobytes(), expected)
984 self.assertRaises(BufferError, operator.delitem, a, 0)
985 self.assertEqual(m.tobytes(), expected)
986 self.assertRaises(BufferError, operator.delitem, a, slice(0, 1))
987 self.assertEqual(m.tobytes(), expected)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000988
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000989 def test_weakref(self):
990 s = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000991 p = weakref.proxy(s)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000992 self.assertEqual(p.tobytes(), s.tobytes())
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000993 s = None
994 self.assertRaises(ReferenceError, len, p)
995
Skip Montanarod5cf0b82003-08-03 23:02:10 +0000996 def test_bug_782369(self):
997 import sys
Skip Montanaroed9bf122003-08-03 23:30:40 +0000998 if hasattr(sys, "getrefcount"):
999 for i in range(10):
1000 b = array.array('B', range(64))
1001 rc = sys.getrefcount(10)
1002 for i in range(10):
1003 b = array.array('B', range(64))
1004 self.assertEqual(rc, sys.getrefcount(10))
Skip Montanarod5cf0b82003-08-03 23:02:10 +00001005
Thomas Woutersb2137042007-02-01 18:02:27 +00001006 def test_subclass_with_kwargs(self):
1007 # SF bug #1486663 -- this used to erroneously raise a TypeError
1008 ArraySubclassWithKwargs('b', newarg=1)
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001009
Guido van Rossum6b826ab2007-07-03 16:22:09 +00001010 def test_create_from_bytes(self):
Alexandre Vassalotti7e4f3212009-07-05 05:38:18 +00001011 # XXX This test probably needs to be moved in a subclass or
1012 # generalized to use self.typecode.
Guido van Rossum6b826ab2007-07-03 16:22:09 +00001013 a = array.array('H', b"1234")
1014 self.assertEqual(len(a) * a.itemsize, 4)
1015
Meador Inge03b4d502012-08-10 22:35:45 -05001016 @support.cpython_only
1017 def test_sizeof_with_buffer(self):
1018 a = array.array(self.typecode, self.example)
Meador Inge80dd1af2012-08-10 23:21:39 -05001019 basesize = support.calcvobjsize('Pn2Pi')
Meador Inge03b4d502012-08-10 22:35:45 -05001020 buffer_size = a.buffer_info()[1] * a.itemsize
1021 support.check_sizeof(self, a, basesize + buffer_size)
1022
1023 @support.cpython_only
1024 def test_sizeof_without_buffer(self):
1025 a = array.array(self.typecode)
Meador Inge80dd1af2012-08-10 23:21:39 -05001026 basesize = support.calcvobjsize('Pn2Pi')
Meador Inge03b4d502012-08-10 22:35:45 -05001027 support.check_sizeof(self, a, basesize)
1028
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001029
Walter Dörwald7fd94242003-05-18 00:47:47 +00001030class StringTest(BaseTest):
1031
1032 def test_setitem(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001033 super().test_setitem()
Walter Dörwald7fd94242003-05-18 00:47:47 +00001034 a = array.array(self.typecode, self.example)
1035 self.assertRaises(TypeError, a.__setitem__, 0, self.example[:2])
1036
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001037class UnicodeTest(StringTest, unittest.TestCase):
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001038 typecode = 'u'
1039 example = '\x01\u263a\x00\ufeff'
1040 smallerexample = '\x01\u263a\x00\ufefe'
1041 biggerexample = '\x01\u263a\x01\ufeff'
1042 outside = str('\x33')
Victor Stinner8d4734f2012-08-08 20:09:21 +02001043 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001044
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001045 def test_unicode(self):
1046 self.assertRaises(TypeError, array.array, 'b', 'foo')
Walter Dörwald7fd94242003-05-18 00:47:47 +00001047
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001048 a = array.array('u', '\xa0\xc2\u1234')
1049 a.fromunicode(' ')
1050 a.fromunicode('')
1051 a.fromunicode('')
1052 a.fromunicode('\x11abc\xff\u1234')
1053 s = a.tounicode()
1054 self.assertEqual(s, '\xa0\xc2\u1234 \x11abc\xff\u1234')
Victor Stinner9d512ab2012-08-09 00:43:56 +02001055 self.assertEqual(a.itemsize, sizeof_wchar)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001056
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001057 s = '\x00="\'a\\b\x80\xff\u0000\u0001\u1234'
1058 a = array.array('u', s)
1059 self.assertEqual(
1060 repr(a),
Georg Brandl559e5d72008-06-11 18:37:52 +00001061 "array('u', '\\x00=\"\\'a\\\\b\\x80\xff\\x00\\x01\u1234')")
Walter Dörwald7fd94242003-05-18 00:47:47 +00001062
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001063 self.assertRaises(TypeError, a.fromunicode)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001064
Victor Stinner29ec5952013-02-26 00:27:38 +01001065 def test_issue17223(self):
1066 # this used to crash
Victor Stinnerc472c5d2013-02-26 22:52:11 +01001067 if sizeof_wchar == 4:
1068 # U+FFFFFFFF is an invalid code point in Unicode 6.0
1069 invalid_str = b'\xff\xff\xff\xff'
1070 else:
Victor Stinner29c00342013-03-08 02:33:06 +01001071 # PyUnicode_FromUnicode() cannot fail with 16-bit wchar_t
1072 self.skipTest("specific to 32-bit wchar_t")
Victor Stinnerc472c5d2013-02-26 22:52:11 +01001073 a = array.array('u', invalid_str)
Victor Stinner29ec5952013-02-26 00:27:38 +01001074 self.assertRaises(ValueError, a.tounicode)
1075 self.assertRaises(ValueError, str, a)
1076
Walter Dörwald7fd94242003-05-18 00:47:47 +00001077class NumberTest(BaseTest):
1078
1079 def test_extslice(self):
1080 a = array.array(self.typecode, range(5))
1081 self.assertEqual(a[::], a)
1082 self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
1083 self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
1084 self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
1085 self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
1086 self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
1087 self.assertEqual(a[-100:100:], a)
1088 self.assertEqual(a[100:-100:-1], a[::-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +00001089 self.assertEqual(a[-100:100:2], array.array(self.typecode, [0,2,4]))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001090 self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
1091 self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
1092
1093 def test_delslice(self):
1094 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001095 del a[::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001096 self.assertEqual(a, array.array(self.typecode, [1,3]))
1097 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001098 del a[1::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001099 self.assertEqual(a, array.array(self.typecode, [0,2,4]))
1100 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001101 del a[1::-2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001102 self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
1103 a = array.array(self.typecode, range(10))
Michael W. Hudson56796f62002-07-29 14:35:04 +00001104 del a[::1000]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001105 self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
Mark Dickinsonbc099642010-01-29 17:27:24 +00001106 # test issue7788
1107 a = array.array(self.typecode, range(10))
1108 del a[9::1<<333]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001109
1110 def test_assignment(self):
1111 a = array.array(self.typecode, range(10))
1112 a[::2] = array.array(self.typecode, [42]*5)
1113 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
1114 a = array.array(self.typecode, range(10))
1115 a[::-4] = array.array(self.typecode, [10]*3)
1116 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
1117 a = array.array(self.typecode, range(4))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001118 a[::-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +00001119 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
1120 a = array.array(self.typecode, range(10))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001121 b = a[:]
1122 c = a[:]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001123 ins = array.array(self.typecode, range(2))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001124 a[2:3] = ins
1125 b[slice(2,3)] = ins
1126 c[2:3:] = ins
Fred Drake004d5e62000-10-23 17:22:08 +00001127
Walter Dörwald7fd94242003-05-18 00:47:47 +00001128 def test_iterationcontains(self):
1129 a = array.array(self.typecode, range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +00001130 self.assertEqual(list(a), list(range(10)))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001131 b = array.array(self.typecode, [20])
1132 self.assertEqual(a[-1] in a, True)
1133 self.assertEqual(b[0] not in a, True)
1134
1135 def check_overflow(self, lower, upper):
1136 # method to be used by subclasses
1137
1138 # should not overflow assigning lower limit
1139 a = array.array(self.typecode, [lower])
1140 a[0] = lower
1141 # should overflow assigning less than lower limit
1142 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
1143 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
1144 # should not overflow assigning upper limit
1145 a = array.array(self.typecode, [upper])
1146 a[0] = upper
1147 # should overflow assigning more than upper limit
1148 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
1149 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
1150
1151 def test_subclassing(self):
1152 typecode = self.typecode
1153 class ExaggeratingArray(array.array):
1154 __slots__ = ['offset']
1155
1156 def __new__(cls, typecode, data, offset):
1157 return array.array.__new__(cls, typecode, data)
1158
1159 def __init__(self, typecode, data, offset):
1160 self.offset = offset
1161
1162 def __getitem__(self, i):
1163 return array.array.__getitem__(self, i) + self.offset
1164
1165 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
1166 self.assertEntryEqual(a[0], 7)
1167
1168 self.assertRaises(AttributeError, setattr, a, "color", "blue")
1169
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00001170 def test_frombytearray(self):
1171 a = array.array('b', range(10))
1172 b = array.array(self.typecode, a)
1173 self.assertEqual(a, b)
1174
Walter Dörwald7fd94242003-05-18 00:47:47 +00001175class SignedNumberTest(NumberTest):
1176 example = [-1, 0, 1, 42, 0x7f]
1177 smallerexample = [-1, 0, 1, 42, 0x7e]
1178 biggerexample = [-1, 0, 1, 43, 0x7f]
1179 outside = 23
1180
1181 def test_overflow(self):
1182 a = array.array(self.typecode)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001183 lower = -1 * int(pow(2, a.itemsize * 8 - 1))
1184 upper = int(pow(2, a.itemsize * 8 - 1)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001185 self.check_overflow(lower, upper)
1186
1187class UnsignedNumberTest(NumberTest):
1188 example = [0, 1, 17, 23, 42, 0xff]
1189 smallerexample = [0, 1, 17, 23, 42, 0xfe]
1190 biggerexample = [0, 1, 17, 23, 43, 0xff]
1191 outside = 0xaa
1192
1193 def test_overflow(self):
1194 a = array.array(self.typecode)
1195 lower = 0
Guido van Rossume2a383d2007-01-15 16:59:06 +00001196 upper = int(pow(2, a.itemsize * 8)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001197 self.check_overflow(lower, upper)
Fred Drake004d5e62000-10-23 17:22:08 +00001198
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001199 def test_bytes_extend(self):
1200 s = bytes(self.example)
1201
1202 a = array.array(self.typecode, self.example)
1203 a.extend(s)
1204 self.assertEqual(
1205 a,
1206 array.array(self.typecode, self.example+self.example)
1207 )
1208
1209 a = array.array(self.typecode, self.example)
1210 a.extend(bytearray(reversed(s)))
1211 self.assertEqual(
1212 a,
1213 array.array(self.typecode, self.example+self.example[::-1])
1214 )
1215
Fred Drake004d5e62000-10-23 17:22:08 +00001216
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001217class ByteTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001218 typecode = 'b'
1219 minitemsize = 1
Fred Drake004d5e62000-10-23 17:22:08 +00001220
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001221class UnsignedByteTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001222 typecode = 'B'
1223 minitemsize = 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001224
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001225class ShortTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001226 typecode = 'h'
1227 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001228
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001229class UnsignedShortTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001230 typecode = 'H'
1231 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001232
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001233class IntTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001234 typecode = 'i'
1235 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001236
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001237class UnsignedIntTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001238 typecode = 'I'
1239 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001240
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001241class LongTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001242 typecode = 'l'
1243 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001244
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001245class UnsignedLongTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001246 typecode = 'L'
1247 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001248
Meador Inge1c9f0c92011-09-20 19:55:51 -05001249@unittest.skipIf(not have_long_long, 'need long long support')
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001250class LongLongTest(SignedNumberTest, unittest.TestCase):
Meador Inge1c9f0c92011-09-20 19:55:51 -05001251 typecode = 'q'
1252 minitemsize = 8
Meador Inge1c9f0c92011-09-20 19:55:51 -05001253
1254@unittest.skipIf(not have_long_long, 'need long long support')
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001255class UnsignedLongLongTest(UnsignedNumberTest, unittest.TestCase):
Meador Inge1c9f0c92011-09-20 19:55:51 -05001256 typecode = 'Q'
1257 minitemsize = 8
Meador Inge1c9f0c92011-09-20 19:55:51 -05001258
Walter Dörwald7fd94242003-05-18 00:47:47 +00001259class FPTest(NumberTest):
1260 example = [-42.0, 0, 42, 1e5, -1e10]
1261 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
1262 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
1263 outside = 23
1264
1265 def assertEntryEqual(self, entry1, entry2):
1266 self.assertAlmostEqual(entry1, entry2)
1267
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001268 def test_byteswap(self):
1269 a = array.array(self.typecode, self.example)
1270 self.assertRaises(TypeError, a.byteswap, 42)
1271 if a.itemsize in (1, 2, 4, 8):
1272 b = array.array(self.typecode, self.example)
1273 b.byteswap()
1274 if a.itemsize==1:
1275 self.assertEqual(a, b)
1276 else:
1277 # On alphas treating the byte swapped bit patters as
1278 # floats/doubles results in floating point exceptions
1279 # => compare the 8bit string values instead
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001280 self.assertNotEqual(a.tobytes(), b.tobytes())
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001281 b.byteswap()
1282 self.assertEqual(a, b)
1283
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001284class FloatTest(FPTest, unittest.TestCase):
Neal Norwitz35c6cd02003-05-22 13:29:15 +00001285 typecode = 'f'
1286 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001287
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001288class DoubleTest(FPTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001289 typecode = 'd'
1290 minitemsize = 8
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001291
1292 def test_alloc_overflow(self):
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001293 from sys import maxsize
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001294 a = array.array('d', [-1]*65536)
1295 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001296 a *= maxsize//65536 + 1
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001297 except MemoryError:
1298 pass
1299 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001300 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001301 b = array.array('d', [ 2.71828183, 3.14159265, -1])
1302 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001303 b * (maxsize//3 + 1)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001304 except MemoryError:
1305 pass
1306 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001307 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001308
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001309
1310if __name__ == "__main__":
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001311 unittest.main()