blob: 544c2cefa23bb80d78d0cfde55119fad6b7b6c46 [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
27class ArraySubclass(array.array):
28 pass
Guido van Rossumc9f8f141997-04-09 20:51:54 +000029
Thomas Woutersb2137042007-02-01 18:02:27 +000030class ArraySubclassWithKwargs(array.array):
31 def __init__(self, typecode, newarg=None):
Victor Stinner7a6a0092011-01-04 00:04:44 +000032 array.array.__init__(self)
Thomas Woutersb2137042007-02-01 18:02:27 +000033
Walter Dörwald7fd94242003-05-18 00:47:47 +000034tests = [] # list to accumulate all tests
Guido van Rossum31f72d72007-06-18 18:44:28 +000035typecodes = "ubBhHiIlLfd"
Meador Inge1c9f0c92011-09-20 19:55:51 -050036if have_long_long:
37 typecodes += 'qQ'
Martin v. Löwis99866332002-03-01 10:27:01 +000038
Walter Dörwald7fd94242003-05-18 00:47:47 +000039class BadConstructorTest(unittest.TestCase):
Martin v. Löwis99866332002-03-01 10:27:01 +000040
Walter Dörwald7fd94242003-05-18 00:47:47 +000041 def test_constructor(self):
42 self.assertRaises(TypeError, array.array)
43 self.assertRaises(TypeError, array.array, spam=42)
44 self.assertRaises(TypeError, array.array, 'xx')
45 self.assertRaises(ValueError, array.array, 'x')
Martin v. Löwis99866332002-03-01 10:27:01 +000046
Walter Dörwald7fd94242003-05-18 00:47:47 +000047tests.append(BadConstructorTest)
Martin v. Löwis99866332002-03-01 10:27:01 +000048
Alexandre Vassalottiad077152009-07-15 17:49:23 +000049# Machine format codes.
50#
51# Search for "enum machine_format_code" in Modules/arraymodule.c to get the
52# authoritative values.
53UNKNOWN_FORMAT = -1
54UNSIGNED_INT8 = 0
55SIGNED_INT8 = 1
56UNSIGNED_INT16_LE = 2
57UNSIGNED_INT16_BE = 3
58SIGNED_INT16_LE = 4
59SIGNED_INT16_BE = 5
60UNSIGNED_INT32_LE = 6
61UNSIGNED_INT32_BE = 7
62SIGNED_INT32_LE = 8
63SIGNED_INT32_BE = 9
64UNSIGNED_INT64_LE = 10
65UNSIGNED_INT64_BE = 11
66SIGNED_INT64_LE = 12
67SIGNED_INT64_BE = 13
68IEEE_754_FLOAT_LE = 14
69IEEE_754_FLOAT_BE = 15
70IEEE_754_DOUBLE_LE = 16
71IEEE_754_DOUBLE_BE = 17
72UTF16_LE = 18
73UTF16_BE = 19
74UTF32_LE = 20
75UTF32_BE = 21
76
77class ArrayReconstructorTest(unittest.TestCase):
78
79 def test_error(self):
80 self.assertRaises(TypeError, array_reconstructor,
81 "", "b", 0, b"")
82 self.assertRaises(TypeError, array_reconstructor,
83 str, "b", 0, b"")
84 self.assertRaises(TypeError, array_reconstructor,
85 array.array, "b", '', b"")
86 self.assertRaises(TypeError, array_reconstructor,
87 array.array, "b", 0, "")
88 self.assertRaises(ValueError, array_reconstructor,
89 array.array, "?", 0, b"")
90 self.assertRaises(ValueError, array_reconstructor,
91 array.array, "b", UNKNOWN_FORMAT, b"")
92 self.assertRaises(ValueError, array_reconstructor,
93 array.array, "b", 22, b"")
94 self.assertRaises(ValueError, array_reconstructor,
95 array.array, "d", 16, b"a")
96
97 def test_numbers(self):
98 testcases = (
99 (['B', 'H', 'I', 'L'], UNSIGNED_INT8, '=BBBB',
100 [0x80, 0x7f, 0, 0xff]),
101 (['b', 'h', 'i', 'l'], SIGNED_INT8, '=bbb',
102 [-0x80, 0x7f, 0]),
103 (['H', 'I', 'L'], UNSIGNED_INT16_LE, '<HHHH',
104 [0x8000, 0x7fff, 0, 0xffff]),
105 (['H', 'I', 'L'], UNSIGNED_INT16_BE, '>HHHH',
106 [0x8000, 0x7fff, 0, 0xffff]),
107 (['h', 'i', 'l'], SIGNED_INT16_LE, '<hhh',
108 [-0x8000, 0x7fff, 0]),
109 (['h', 'i', 'l'], SIGNED_INT16_BE, '>hhh',
110 [-0x8000, 0x7fff, 0]),
111 (['I', 'L'], UNSIGNED_INT32_LE, '<IIII',
112 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
113 (['I', 'L'], UNSIGNED_INT32_BE, '>IIII',
114 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
115 (['i', 'l'], SIGNED_INT32_LE, '<iii',
116 [-1<<31, (1<<31)-1, 0]),
117 (['i', 'l'], SIGNED_INT32_BE, '>iii',
118 [-1<<31, (1<<31)-1, 0]),
119 (['L'], UNSIGNED_INT64_LE, '<QQQQ',
Alexandre Vassalotti0027d4b2009-07-15 20:53:55 +0000120 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
121 (['L'], UNSIGNED_INT64_BE, '>QQQQ',
122 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
123 (['l'], SIGNED_INT64_LE, '<qqq',
124 [-1<<31, (1<<31)-1, 0]),
125 (['l'], SIGNED_INT64_BE, '>qqq',
126 [-1<<31, (1<<31)-1, 0]),
127 # The following tests for INT64 will raise an OverflowError
128 # when run on a 32-bit machine. The tests are simply skipped
129 # in that case.
130 (['L'], UNSIGNED_INT64_LE, '<QQQQ',
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000131 [1<<63, (1<<63)-1, 0, (1<<64)-1]),
132 (['L'], UNSIGNED_INT64_BE, '>QQQQ',
133 [1<<63, (1<<63)-1, 0, (1<<64)-1]),
134 (['l'], SIGNED_INT64_LE, '<qqq',
135 [-1<<63, (1<<63)-1, 0]),
136 (['l'], SIGNED_INT64_BE, '>qqq',
137 [-1<<63, (1<<63)-1, 0]),
138 (['f'], IEEE_754_FLOAT_LE, '<ffff',
139 [16711938.0, float('inf'), float('-inf'), -0.0]),
140 (['f'], IEEE_754_FLOAT_BE, '>ffff',
141 [16711938.0, float('inf'), float('-inf'), -0.0]),
142 (['d'], IEEE_754_DOUBLE_LE, '<dddd',
143 [9006104071832581.0, float('inf'), float('-inf'), -0.0]),
144 (['d'], IEEE_754_DOUBLE_BE, '>dddd',
145 [9006104071832581.0, float('inf'), float('-inf'), -0.0])
146 )
147 for testcase in testcases:
148 valid_typecodes, mformat_code, struct_fmt, values = testcase
149 arraystr = struct.pack(struct_fmt, *values)
150 for typecode in valid_typecodes:
Alexandre Vassalotti0027d4b2009-07-15 20:53:55 +0000151 try:
152 a = array.array(typecode, values)
153 except OverflowError:
154 continue # Skip this test case.
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000155 b = array_reconstructor(
156 array.array, typecode, mformat_code, arraystr)
157 self.assertEqual(a, b,
158 msg="{0!r} != {1!r}; testcase={2!r}".format(a, b, testcase))
159
160 def test_unicode(self):
161 teststr = "Bonne Journ\xe9e \U0002030a\U00020347"
162 testcases = (
163 (UTF16_LE, "UTF-16-LE"),
164 (UTF16_BE, "UTF-16-BE"),
165 (UTF32_LE, "UTF-32-LE"),
166 (UTF32_BE, "UTF-32-BE")
167 )
168 for testcase in testcases:
169 mformat_code, encoding = testcase
170 a = array.array('u', teststr)
171 b = array_reconstructor(
172 array.array, 'u', mformat_code, teststr.encode(encoding))
173 self.assertEqual(a, b,
174 msg="{0!r} != {1!r}; testcase={2!r}".format(a, b, testcase))
175
176
177tests.append(ArrayReconstructorTest)
178
179
Walter Dörwald7fd94242003-05-18 00:47:47 +0000180class BaseTest(unittest.TestCase):
181 # Required class attributes (provided by subclasses
182 # typecode: the typecode to test
183 # example: an initializer usable in the constructor for this type
184 # smallerexample: the same length as example, but smaller
185 # biggerexample: the same length as example, but bigger
186 # outside: An entry that is not in example
187 # minitemsize: the minimum guaranteed itemsize
Martin v. Löwis99866332002-03-01 10:27:01 +0000188
Walter Dörwald7fd94242003-05-18 00:47:47 +0000189 def assertEntryEqual(self, entry1, entry2):
190 self.assertEqual(entry1, entry2)
Martin v. Löwis99866332002-03-01 10:27:01 +0000191
Walter Dörwald7fd94242003-05-18 00:47:47 +0000192 def badtypecode(self):
193 # Return a typecode that is different from our own
194 return typecodes[(typecodes.index(self.typecode)+1) % len(typecodes)]
Martin v. Löwis99866332002-03-01 10:27:01 +0000195
Walter Dörwald7fd94242003-05-18 00:47:47 +0000196 def test_constructor(self):
197 a = array.array(self.typecode)
198 self.assertEqual(a.typecode, self.typecode)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000199 self.assertTrue(a.itemsize>=self.minitemsize)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000200 self.assertRaises(TypeError, array.array, self.typecode, None)
Martin v. Löwis99866332002-03-01 10:27:01 +0000201
Walter Dörwald7fd94242003-05-18 00:47:47 +0000202 def test_len(self):
203 a = array.array(self.typecode)
204 a.append(self.example[0])
205 self.assertEqual(len(a), 1)
Martin v. Löwis99866332002-03-01 10:27:01 +0000206
Walter Dörwald7fd94242003-05-18 00:47:47 +0000207 a = array.array(self.typecode, self.example)
208 self.assertEqual(len(a), len(self.example))
Martin v. Löwis99866332002-03-01 10:27:01 +0000209
Walter Dörwald7fd94242003-05-18 00:47:47 +0000210 def test_buffer_info(self):
211 a = array.array(self.typecode, self.example)
212 self.assertRaises(TypeError, a.buffer_info, 42)
213 bi = a.buffer_info()
Ezio Melottie9615932010-01-24 19:26:24 +0000214 self.assertIsInstance(bi, tuple)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000215 self.assertEqual(len(bi), 2)
Ezio Melottie9615932010-01-24 19:26:24 +0000216 self.assertIsInstance(bi[0], int)
217 self.assertIsInstance(bi[1], int)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000218 self.assertEqual(bi[1], len(a))
Martin v. Löwis99866332002-03-01 10:27:01 +0000219
Walter Dörwald7fd94242003-05-18 00:47:47 +0000220 def test_byteswap(self):
Victor Stinner8dba4e02011-09-30 00:51:10 +0200221 if self.typecode == 'u':
222 example = '\U00100100'
223 else:
224 example = self.example
225 a = array.array(self.typecode, example)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000226 self.assertRaises(TypeError, a.byteswap, 42)
227 if a.itemsize in (1, 2, 4, 8):
Victor Stinner8dba4e02011-09-30 00:51:10 +0200228 b = array.array(self.typecode, example)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000229 b.byteswap()
230 if a.itemsize==1:
231 self.assertEqual(a, b)
232 else:
233 self.assertNotEqual(a, b)
234 b.byteswap()
235 self.assertEqual(a, b)
Martin v. Löwis99866332002-03-01 10:27:01 +0000236
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000237 def test_copy(self):
238 import copy
239 a = array.array(self.typecode, self.example)
240 b = copy.copy(a)
241 self.assertNotEqual(id(a), id(b))
242 self.assertEqual(a, b)
243
Thomas Wouters89f507f2006-12-13 04:49:30 +0000244 def test_deepcopy(self):
245 import copy
246 a = array.array(self.typecode, self.example)
247 b = copy.deepcopy(a)
248 self.assertNotEqual(id(a), id(b))
249 self.assertEqual(a, b)
250
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000251 def test_reduce_ex(self):
252 a = array.array(self.typecode, self.example)
253 for protocol in range(3):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000254 self.assertIs(a.__reduce_ex__(protocol)[0], array.array)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000255 for protocol in range(3, pickle.HIGHEST_PROTOCOL):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000256 self.assertIs(a.__reduce_ex__(protocol)[0], array_reconstructor)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000257
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000258 def test_pickle(self):
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000259 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000260 a = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000261 b = pickle.loads(pickle.dumps(a, protocol))
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000262 self.assertNotEqual(id(a), id(b))
263 self.assertEqual(a, b)
264
265 a = ArraySubclass(self.typecode, self.example)
266 a.x = 10
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 self.assertEqual(a.x, b.x)
271 self.assertEqual(type(a), type(b))
272
Guido van Rossumd8faa362007-04-27 19:54:29 +0000273 def test_pickle_for_empty_array(self):
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000274 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossumd8faa362007-04-27 19:54:29 +0000275 a = array.array(self.typecode)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000276 b = pickle.loads(pickle.dumps(a, protocol))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000277 self.assertNotEqual(id(a), id(b))
278 self.assertEqual(a, b)
279
280 a = ArraySubclass(self.typecode)
281 a.x = 10
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 self.assertEqual(a.x, b.x)
286 self.assertEqual(type(a), type(b))
287
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000288 def test_iterator_pickle(self):
289 data = array.array(self.typecode, self.example)
290 orgit = iter(data)
291 d = pickle.dumps(orgit)
292 it = pickle.loads(d)
293 self.assertEqual(type(orgit), type(it))
294 self.assertEqual(list(it), list(data))
295
296 if len(data):
297 it = pickle.loads(d)
298 next(it)
299 d = pickle.dumps(it)
300 self.assertEqual(list(it), list(data)[1:])
301
Walter Dörwald7fd94242003-05-18 00:47:47 +0000302 def test_insert(self):
303 a = array.array(self.typecode, self.example)
304 a.insert(0, self.example[0])
305 self.assertEqual(len(a), 1+len(self.example))
306 self.assertEqual(a[0], a[1])
307 self.assertRaises(TypeError, a.insert)
308 self.assertRaises(TypeError, a.insert, None)
Walter Dörwaldba39d9c2003-05-18 01:56:25 +0000309 self.assertRaises(TypeError, a.insert, 0, None)
Martin v. Löwis99866332002-03-01 10:27:01 +0000310
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000311 a = array.array(self.typecode, self.example)
312 a.insert(-1, self.example[0])
313 self.assertEqual(
314 a,
315 array.array(
316 self.typecode,
317 self.example[:-1] + self.example[:1] + self.example[-1:]
318 )
319 )
320
321 a = array.array(self.typecode, self.example)
322 a.insert(-1000, self.example[0])
323 self.assertEqual(
324 a,
325 array.array(self.typecode, self.example[:1] + self.example)
326 )
327
328 a = array.array(self.typecode, self.example)
329 a.insert(1000, self.example[0])
330 self.assertEqual(
331 a,
332 array.array(self.typecode, self.example + self.example[:1])
333 )
334
Walter Dörwald7fd94242003-05-18 00:47:47 +0000335 def test_tofromfile(self):
336 a = array.array(self.typecode, 2*self.example)
337 self.assertRaises(TypeError, a.tofile)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000338 support.unlink(support.TESTFN)
339 f = open(support.TESTFN, 'wb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000340 try:
341 a.tofile(f)
342 f.close()
343 b = array.array(self.typecode)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000344 f = open(support.TESTFN, 'rb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000345 self.assertRaises(TypeError, b.fromfile)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000346 b.fromfile(f, len(self.example))
347 self.assertEqual(b, array.array(self.typecode, self.example))
348 self.assertNotEqual(a, b)
Hirokazu Yamamoto54d0df62009-03-06 03:04:07 +0000349 self.assertRaises(EOFError, b.fromfile, f, len(self.example)+1)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000350 self.assertEqual(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000351 f.close()
352 finally:
353 if not f.closed:
354 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000355 support.unlink(support.TESTFN)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000356
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000357 def test_fromfile_ioerror(self):
358 # Issue #5395: Check if fromfile raises a proper IOError
359 # instead of EOFError.
360 a = array.array(self.typecode)
361 f = open(support.TESTFN, 'wb')
362 try:
363 self.assertRaises(IOError, a.fromfile, f, len(self.example))
364 finally:
365 f.close()
366 support.unlink(support.TESTFN)
367
Frank Wierzbicki17683432009-08-16 20:30:12 +0000368 def test_filewrite(self):
369 a = array.array(self.typecode, 2*self.example)
370 f = open(support.TESTFN, 'wb')
371 try:
372 f.write(a)
373 f.close()
374 b = array.array(self.typecode)
375 f = open(support.TESTFN, 'rb')
376 b.fromfile(f, len(self.example))
377 self.assertEqual(b, array.array(self.typecode, self.example))
378 self.assertNotEqual(a, b)
379 b.fromfile(f, len(self.example))
380 self.assertEqual(a, b)
381 f.close()
382 finally:
383 if not f.closed:
384 f.close()
385 support.unlink(support.TESTFN)
386
Walter Dörwald7fd94242003-05-18 00:47:47 +0000387 def test_tofromlist(self):
388 a = array.array(self.typecode, 2*self.example)
389 b = array.array(self.typecode)
390 self.assertRaises(TypeError, a.tolist, 42)
391 self.assertRaises(TypeError, b.fromlist)
392 self.assertRaises(TypeError, b.fromlist, 42)
393 self.assertRaises(TypeError, b.fromlist, [None])
394 b.fromlist(a.tolist())
395 self.assertEqual(a, b)
Fred Drake78334472000-06-28 17:50:51 +0000396
Walter Dörwald7fd94242003-05-18 00:47:47 +0000397 def test_tofromstring(self):
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000398 nb_warnings = 4
399 with warnings.catch_warnings(record=True) as r:
400 warnings.filterwarnings("always",
401 message=r"(to|from)string\(\) is deprecated",
402 category=DeprecationWarning)
403 a = array.array(self.typecode, 2*self.example)
404 b = array.array(self.typecode)
405 self.assertRaises(TypeError, a.tostring, 42)
406 self.assertRaises(TypeError, b.fromstring)
407 self.assertRaises(TypeError, b.fromstring, 42)
408 b.fromstring(a.tostring())
409 self.assertEqual(a, b)
410 if a.itemsize>1:
411 self.assertRaises(ValueError, b.fromstring, "x")
412 nb_warnings += 1
413 self.assertEqual(len(r), nb_warnings)
414
415 def test_tofrombytes(self):
Walter Dörwald7fd94242003-05-18 00:47:47 +0000416 a = array.array(self.typecode, 2*self.example)
417 b = array.array(self.typecode)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000418 self.assertRaises(TypeError, a.tobytes, 42)
419 self.assertRaises(TypeError, b.frombytes)
420 self.assertRaises(TypeError, b.frombytes, 42)
421 b.frombytes(a.tobytes())
422 c = array.array(self.typecode, bytearray(a.tobytes()))
Walter Dörwald7fd94242003-05-18 00:47:47 +0000423 self.assertEqual(a, b)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000424 self.assertEqual(a, c)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000425 if a.itemsize>1:
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000426 self.assertRaises(ValueError, b.frombytes, b"x")
Fred Drake78334472000-06-28 17:50:51 +0000427
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +0000428 def test_fromarray(self):
429 a = array.array(self.typecode, self.example)
430 b = array.array(self.typecode, a)
431 self.assertEqual(a, b)
432
Walter Dörwald7fd94242003-05-18 00:47:47 +0000433 def test_repr(self):
434 a = array.array(self.typecode, 2*self.example)
435 self.assertEqual(a, eval(repr(a), {"array": array.array}))
Fred Drake78334472000-06-28 17:50:51 +0000436
Walter Dörwald7fd94242003-05-18 00:47:47 +0000437 a = array.array(self.typecode)
438 self.assertEqual(repr(a), "array('%s')" % self.typecode)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000439
Walter Dörwald7fd94242003-05-18 00:47:47 +0000440 def test_str(self):
441 a = array.array(self.typecode, 2*self.example)
442 str(a)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000443
Walter Dörwald7fd94242003-05-18 00:47:47 +0000444 def test_cmp(self):
445 a = array.array(self.typecode, self.example)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000446 self.assertTrue((a == 42) is False)
447 self.assertTrue((a != 42) is True)
Tim Peterscc78e472000-11-14 21:36:07 +0000448
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000449 self.assertTrue((a == a) is True)
450 self.assertTrue((a != a) is False)
451 self.assertTrue((a < a) is False)
452 self.assertTrue((a <= a) is True)
453 self.assertTrue((a > a) is False)
454 self.assertTrue((a >= a) is True)
Tim Peterscc78e472000-11-14 21:36:07 +0000455
Neal Norwitzbd2835c2006-03-17 08:54:15 +0000456 al = array.array(self.typecode, self.smallerexample)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000457 ab = array.array(self.typecode, self.biggerexample)
Guido van Rossum7f1d3aa1998-07-16 15:31:43 +0000458
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000459 self.assertTrue((a == 2*a) is False)
460 self.assertTrue((a != 2*a) is True)
461 self.assertTrue((a < 2*a) is True)
462 self.assertTrue((a <= 2*a) is True)
463 self.assertTrue((a > 2*a) is False)
464 self.assertTrue((a >= 2*a) is False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000465
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000466 self.assertTrue((a == al) is False)
467 self.assertTrue((a != al) is True)
468 self.assertTrue((a < al) is False)
469 self.assertTrue((a <= al) is False)
470 self.assertTrue((a > al) is True)
471 self.assertTrue((a >= al) is True)
Martin v. Löwis99866332002-03-01 10:27:01 +0000472
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000473 self.assertTrue((a == ab) is False)
474 self.assertTrue((a != ab) is True)
475 self.assertTrue((a < ab) is True)
476 self.assertTrue((a <= ab) is True)
477 self.assertTrue((a > ab) is False)
478 self.assertTrue((a >= ab) is False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000479
Walter Dörwald7fd94242003-05-18 00:47:47 +0000480 def test_add(self):
481 a = array.array(self.typecode, self.example) \
482 + array.array(self.typecode, self.example[::-1])
483 self.assertEqual(
484 a,
485 array.array(self.typecode, self.example + self.example[::-1])
486 )
Martin v. Löwis99866332002-03-01 10:27:01 +0000487
Walter Dörwald7fd94242003-05-18 00:47:47 +0000488 b = array.array(self.badtypecode())
489 self.assertRaises(TypeError, a.__add__, b)
490
491 self.assertRaises(TypeError, a.__add__, "bad")
492
493 def test_iadd(self):
494 a = array.array(self.typecode, self.example[::-1])
495 b = a
496 a += array.array(self.typecode, 2*self.example)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000497 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000498 self.assertEqual(
499 a,
500 array.array(self.typecode, self.example[::-1]+2*self.example)
501 )
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000502 a = array.array(self.typecode, self.example)
503 a += a
504 self.assertEqual(
505 a,
506 array.array(self.typecode, self.example + self.example)
507 )
Walter Dörwald7fd94242003-05-18 00:47:47 +0000508
509 b = array.array(self.badtypecode())
510 self.assertRaises(TypeError, a.__add__, b)
511
512 self.assertRaises(TypeError, a.__iadd__, "bad")
513
514 def test_mul(self):
515 a = 5*array.array(self.typecode, self.example)
516 self.assertEqual(
517 a,
518 array.array(self.typecode, 5*self.example)
519 )
520
521 a = array.array(self.typecode, self.example)*5
522 self.assertEqual(
523 a,
524 array.array(self.typecode, self.example*5)
525 )
526
527 a = 0*array.array(self.typecode, self.example)
528 self.assertEqual(
529 a,
530 array.array(self.typecode)
531 )
532
533 a = (-1)*array.array(self.typecode, self.example)
534 self.assertEqual(
535 a,
536 array.array(self.typecode)
537 )
538
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000539 a = 5 * array.array(self.typecode, self.example[:1])
540 self.assertEqual(
541 a,
542 array.array(self.typecode, [a[0]] * 5)
543 )
544
Walter Dörwald7fd94242003-05-18 00:47:47 +0000545 self.assertRaises(TypeError, a.__mul__, "bad")
546
547 def test_imul(self):
548 a = array.array(self.typecode, self.example)
549 b = a
550
551 a *= 5
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000552 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000553 self.assertEqual(
554 a,
555 array.array(self.typecode, 5*self.example)
556 )
557
558 a *= 0
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000559 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000560 self.assertEqual(a, array.array(self.typecode))
561
562 a *= 1000
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000563 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000564 self.assertEqual(a, array.array(self.typecode))
565
566 a *= -1
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000567 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000568 self.assertEqual(a, array.array(self.typecode))
569
570 a = array.array(self.typecode, self.example)
571 a *= -1
572 self.assertEqual(a, array.array(self.typecode))
573
574 self.assertRaises(TypeError, a.__imul__, "bad")
575
576 def test_getitem(self):
577 a = array.array(self.typecode, self.example)
578 self.assertEntryEqual(a[0], self.example[0])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000579 self.assertEntryEqual(a[0], self.example[0])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000580 self.assertEntryEqual(a[-1], self.example[-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000581 self.assertEntryEqual(a[-1], self.example[-1])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000582 self.assertEntryEqual(a[len(self.example)-1], self.example[-1])
583 self.assertEntryEqual(a[-len(self.example)], self.example[0])
584 self.assertRaises(TypeError, a.__getitem__)
585 self.assertRaises(IndexError, a.__getitem__, len(self.example))
586 self.assertRaises(IndexError, a.__getitem__, -len(self.example)-1)
587
588 def test_setitem(self):
589 a = array.array(self.typecode, self.example)
590 a[0] = a[-1]
591 self.assertEntryEqual(a[0], a[-1])
592
593 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000594 a[0] = a[-1]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000595 self.assertEntryEqual(a[0], a[-1])
596
597 a = array.array(self.typecode, self.example)
598 a[-1] = a[0]
599 self.assertEntryEqual(a[0], a[-1])
600
601 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000602 a[-1] = a[0]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000603 self.assertEntryEqual(a[0], a[-1])
604
605 a = array.array(self.typecode, self.example)
606 a[len(self.example)-1] = a[0]
607 self.assertEntryEqual(a[0], a[-1])
608
609 a = array.array(self.typecode, self.example)
610 a[-len(self.example)] = a[-1]
611 self.assertEntryEqual(a[0], a[-1])
612
613 self.assertRaises(TypeError, a.__setitem__)
614 self.assertRaises(TypeError, a.__setitem__, None)
615 self.assertRaises(TypeError, a.__setitem__, 0, None)
616 self.assertRaises(
617 IndexError,
618 a.__setitem__,
619 len(self.example), self.example[0]
620 )
621 self.assertRaises(
622 IndexError,
623 a.__setitem__,
624 -len(self.example)-1, self.example[0]
625 )
626
627 def test_delitem(self):
628 a = array.array(self.typecode, self.example)
629 del a[0]
630 self.assertEqual(
631 a,
632 array.array(self.typecode, self.example[1:])
633 )
634
635 a = array.array(self.typecode, self.example)
636 del a[-1]
637 self.assertEqual(
638 a,
639 array.array(self.typecode, self.example[:-1])
640 )
641
642 a = array.array(self.typecode, self.example)
643 del a[len(self.example)-1]
644 self.assertEqual(
645 a,
646 array.array(self.typecode, self.example[:-1])
647 )
648
649 a = array.array(self.typecode, self.example)
650 del a[-len(self.example)]
651 self.assertEqual(
652 a,
653 array.array(self.typecode, self.example[1:])
654 )
655
656 self.assertRaises(TypeError, a.__delitem__)
657 self.assertRaises(TypeError, a.__delitem__, None)
658 self.assertRaises(IndexError, a.__delitem__, len(self.example))
659 self.assertRaises(IndexError, a.__delitem__, -len(self.example)-1)
660
661 def test_getslice(self):
662 a = array.array(self.typecode, self.example)
663 self.assertEqual(a[:], a)
664
665 self.assertEqual(
666 a[1:],
667 array.array(self.typecode, self.example[1:])
668 )
669
670 self.assertEqual(
671 a[:1],
672 array.array(self.typecode, self.example[:1])
673 )
674
675 self.assertEqual(
676 a[:-1],
677 array.array(self.typecode, self.example[:-1])
678 )
679
680 self.assertEqual(
681 a[-1:],
682 array.array(self.typecode, self.example[-1:])
683 )
684
685 self.assertEqual(
686 a[-1:-1],
687 array.array(self.typecode)
688 )
689
690 self.assertEqual(
Walter Dörwald1083c242005-01-21 21:16:51 +0000691 a[2:1],
692 array.array(self.typecode)
693 )
694
695 self.assertEqual(
Walter Dörwald7fd94242003-05-18 00:47:47 +0000696 a[1000:],
697 array.array(self.typecode)
698 )
699 self.assertEqual(a[-1000:], a)
700 self.assertEqual(a[:1000], a)
701 self.assertEqual(
702 a[:-1000],
703 array.array(self.typecode)
704 )
705 self.assertEqual(a[-1000:1000], a)
706 self.assertEqual(
707 a[2000:1000],
708 array.array(self.typecode)
709 )
710
Thomas Woutersed03b412007-08-28 21:37:11 +0000711 def test_extended_getslice(self):
712 # Test extended slicing by comparing with list slicing
713 # (Assumes list conversion works correctly, too)
714 a = array.array(self.typecode, self.example)
715 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
716 for start in indices:
717 for stop in indices:
718 # Everything except the initial 0 (invalid step)
719 for step in indices[1:]:
720 self.assertEqual(list(a[start:stop:step]),
721 list(a)[start:stop:step])
722
Walter Dörwald7fd94242003-05-18 00:47:47 +0000723 def test_setslice(self):
724 a = array.array(self.typecode, self.example)
725 a[:1] = a
726 self.assertEqual(
727 a,
728 array.array(self.typecode, self.example + self.example[1:])
729 )
730
731 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000732 a[:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000733 self.assertEqual(
734 a,
735 array.array(self.typecode, self.example + self.example[-1:])
736 )
737
738 a = array.array(self.typecode, self.example)
739 a[-1:] = a
740 self.assertEqual(
741 a,
742 array.array(self.typecode, self.example[:-1] + self.example)
743 )
744
745 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000746 a[1:] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000747 self.assertEqual(
748 a,
749 array.array(self.typecode, self.example[:1] + self.example)
750 )
751
752 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000753 a[1:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000754 self.assertEqual(
755 a,
756 array.array(
757 self.typecode,
758 self.example[:1] + self.example + self.example[-1:]
759 )
760 )
761
762 a = array.array(self.typecode, self.example)
763 a[1000:] = a
764 self.assertEqual(
765 a,
766 array.array(self.typecode, 2*self.example)
767 )
768
769 a = array.array(self.typecode, self.example)
770 a[-1000:] = a
771 self.assertEqual(
772 a,
773 array.array(self.typecode, self.example)
774 )
775
776 a = array.array(self.typecode, self.example)
777 a[:1000] = a
778 self.assertEqual(
779 a,
780 array.array(self.typecode, self.example)
781 )
782
783 a = array.array(self.typecode, self.example)
784 a[:-1000] = a
785 self.assertEqual(
786 a,
787 array.array(self.typecode, 2*self.example)
788 )
789
790 a = array.array(self.typecode, self.example)
791 a[1:0] = a
792 self.assertEqual(
793 a,
794 array.array(self.typecode, self.example[:1] + self.example + self.example[1:])
795 )
796
797 a = array.array(self.typecode, self.example)
798 a[2000:1000] = a
799 self.assertEqual(
800 a,
801 array.array(self.typecode, 2*self.example)
802 )
803
804 a = array.array(self.typecode, self.example)
Thomas Woutersed03b412007-08-28 21:37:11 +0000805 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), None)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000806 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), None)
807
808 b = array.array(self.badtypecode())
Thomas Woutersed03b412007-08-28 21:37:11 +0000809 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000810 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), b)
811
Thomas Woutersed03b412007-08-28 21:37:11 +0000812 def test_extended_set_del_slice(self):
813 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
814 for start in indices:
815 for stop in indices:
816 # Everything except the initial 0 (invalid step)
817 for step in indices[1:]:
818 a = array.array(self.typecode, self.example)
819 L = list(a)
820 # Make sure we have a slice of exactly the right length,
821 # but with (hopefully) different data.
822 data = L[start:stop:step]
823 data.reverse()
824 L[start:stop:step] = data
825 a[start:stop:step] = array.array(self.typecode, data)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000826 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000827
828 del L[start:stop:step]
829 del a[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +0000830 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000831
Walter Dörwald7fd94242003-05-18 00:47:47 +0000832 def test_index(self):
833 example = 2*self.example
834 a = array.array(self.typecode, example)
835 self.assertRaises(TypeError, a.index)
836 for x in example:
837 self.assertEqual(a.index(x), example.index(x))
838 self.assertRaises(ValueError, a.index, None)
839 self.assertRaises(ValueError, a.index, self.outside)
840
841 def test_count(self):
842 example = 2*self.example
843 a = array.array(self.typecode, example)
844 self.assertRaises(TypeError, a.count)
845 for x in example:
846 self.assertEqual(a.count(x), example.count(x))
847 self.assertEqual(a.count(self.outside), 0)
848 self.assertEqual(a.count(None), 0)
849
850 def test_remove(self):
851 for x in self.example:
852 example = 2*self.example
853 a = array.array(self.typecode, example)
854 pos = example.index(x)
855 example2 = example[:pos] + example[pos+1:]
856 a.remove(x)
857 self.assertEqual(a, array.array(self.typecode, example2))
858
859 a = array.array(self.typecode, self.example)
860 self.assertRaises(ValueError, a.remove, self.outside)
861
862 self.assertRaises(ValueError, a.remove, None)
863
864 def test_pop(self):
865 a = array.array(self.typecode)
866 self.assertRaises(IndexError, a.pop)
867
868 a = array.array(self.typecode, 2*self.example)
869 self.assertRaises(TypeError, a.pop, 42, 42)
870 self.assertRaises(TypeError, a.pop, None)
871 self.assertRaises(IndexError, a.pop, len(a))
872 self.assertRaises(IndexError, a.pop, -len(a)-1)
873
874 self.assertEntryEqual(a.pop(0), self.example[0])
875 self.assertEqual(
876 a,
877 array.array(self.typecode, self.example[1:]+self.example)
878 )
879 self.assertEntryEqual(a.pop(1), self.example[2])
880 self.assertEqual(
881 a,
882 array.array(self.typecode, self.example[1:2]+self.example[3:]+self.example)
883 )
884 self.assertEntryEqual(a.pop(0), self.example[1])
885 self.assertEntryEqual(a.pop(), self.example[-1])
886 self.assertEqual(
887 a,
888 array.array(self.typecode, self.example[3:]+self.example[:-1])
889 )
890
891 def test_reverse(self):
892 a = array.array(self.typecode, self.example)
893 self.assertRaises(TypeError, a.reverse, 42)
Fred Drake004d5e62000-10-23 17:22:08 +0000894 a.reverse()
Walter Dörwald7fd94242003-05-18 00:47:47 +0000895 self.assertEqual(
896 a,
897 array.array(self.typecode, self.example[::-1])
898 )
899
900 def test_extend(self):
901 a = array.array(self.typecode, self.example)
902 self.assertRaises(TypeError, a.extend)
903 a.extend(array.array(self.typecode, self.example[::-1]))
904 self.assertEqual(
905 a,
906 array.array(self.typecode, self.example+self.example[::-1])
907 )
908
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000909 a = array.array(self.typecode, self.example)
910 a.extend(a)
911 self.assertEqual(
912 a,
913 array.array(self.typecode, self.example+self.example)
914 )
915
Walter Dörwald7fd94242003-05-18 00:47:47 +0000916 b = array.array(self.badtypecode())
917 self.assertRaises(TypeError, a.extend, b)
918
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000919 a = array.array(self.typecode, self.example)
920 a.extend(self.example[::-1])
921 self.assertEqual(
922 a,
923 array.array(self.typecode, self.example+self.example[::-1])
924 )
925
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +0000926 def test_constructor_with_iterable_argument(self):
927 a = array.array(self.typecode, iter(self.example))
928 b = array.array(self.typecode, self.example)
929 self.assertEqual(a, b)
930
931 # non-iterable argument
932 self.assertRaises(TypeError, array.array, self.typecode, 10)
933
934 # pass through errors raised in __iter__
935 class A:
936 def __iter__(self):
937 raise UnicodeError
938 self.assertRaises(UnicodeError, array.array, self.typecode, A())
939
940 # pass through errors raised in next()
941 def B():
942 raise UnicodeError
943 yield None
944 self.assertRaises(UnicodeError, array.array, self.typecode, B())
945
Walter Dörwald7fd94242003-05-18 00:47:47 +0000946 def test_coveritertraverse(self):
947 try:
948 import gc
949 except ImportError:
950 return
951 a = array.array(self.typecode)
952 l = [iter(a)]
953 l.append(l)
954 gc.collect()
955
956 def test_buffer(self):
957 a = array.array(self.typecode, self.example)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000958 m = memoryview(a)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000959 expected = m.tobytes()
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000960 self.assertEqual(a.tobytes(), expected)
961 self.assertEqual(a.tobytes()[0], expected[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000962 # Resizing is forbidden when there are buffer exports.
963 # For issue 4509, we also check after each error that
964 # the array was not modified.
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000965 self.assertRaises(BufferError, a.append, a[0])
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.extend, a[0:1])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000968 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000969 self.assertRaises(BufferError, a.remove, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000970 self.assertEqual(m.tobytes(), expected)
971 self.assertRaises(BufferError, a.pop, 0)
972 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000973 self.assertRaises(BufferError, a.fromlist, a.tolist())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000974 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000975 self.assertRaises(BufferError, a.frombytes, a.tobytes())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000976 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000977 if self.typecode == 'u':
978 self.assertRaises(BufferError, a.fromunicode, a.tounicode())
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, 2)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000981 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +0000982 self.assertRaises(BufferError, operator.imul, a, 0)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000983 self.assertEqual(m.tobytes(), expected)
984 self.assertRaises(BufferError, operator.setitem, a, slice(0, 0), a)
985 self.assertEqual(m.tobytes(), expected)
986 self.assertRaises(BufferError, operator.delitem, a, 0)
987 self.assertEqual(m.tobytes(), expected)
988 self.assertRaises(BufferError, operator.delitem, a, slice(0, 1))
989 self.assertEqual(m.tobytes(), expected)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000990
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000991 def test_weakref(self):
992 s = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000993 p = weakref.proxy(s)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000994 self.assertEqual(p.tobytes(), s.tobytes())
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000995 s = None
996 self.assertRaises(ReferenceError, len, p)
997
Skip Montanarod5cf0b82003-08-03 23:02:10 +0000998 def test_bug_782369(self):
999 import sys
Skip Montanaroed9bf122003-08-03 23:30:40 +00001000 if hasattr(sys, "getrefcount"):
1001 for i in range(10):
1002 b = array.array('B', range(64))
1003 rc = sys.getrefcount(10)
1004 for i in range(10):
1005 b = array.array('B', range(64))
1006 self.assertEqual(rc, sys.getrefcount(10))
Skip Montanarod5cf0b82003-08-03 23:02:10 +00001007
Thomas Woutersb2137042007-02-01 18:02:27 +00001008 def test_subclass_with_kwargs(self):
1009 # SF bug #1486663 -- this used to erroneously raise a TypeError
1010 ArraySubclassWithKwargs('b', newarg=1)
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001011
Guido van Rossum6b826ab2007-07-03 16:22:09 +00001012 def test_create_from_bytes(self):
Alexandre Vassalotti7e4f3212009-07-05 05:38:18 +00001013 # XXX This test probably needs to be moved in a subclass or
1014 # generalized to use self.typecode.
Guido van Rossum6b826ab2007-07-03 16:22:09 +00001015 a = array.array('H', b"1234")
1016 self.assertEqual(len(a) * a.itemsize, 4)
1017
Meador Inge03b4d502012-08-10 22:35:45 -05001018 @support.cpython_only
1019 def test_sizeof_with_buffer(self):
1020 a = array.array(self.typecode, self.example)
Meador Inge80dd1af2012-08-10 23:21:39 -05001021 basesize = support.calcvobjsize('Pn2Pi')
Meador Inge03b4d502012-08-10 22:35:45 -05001022 buffer_size = a.buffer_info()[1] * a.itemsize
1023 support.check_sizeof(self, a, basesize + buffer_size)
1024
1025 @support.cpython_only
1026 def test_sizeof_without_buffer(self):
1027 a = array.array(self.typecode)
Meador Inge80dd1af2012-08-10 23:21:39 -05001028 basesize = support.calcvobjsize('Pn2Pi')
Meador Inge03b4d502012-08-10 22:35:45 -05001029 support.check_sizeof(self, a, basesize)
1030
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001031
Walter Dörwald7fd94242003-05-18 00:47:47 +00001032class StringTest(BaseTest):
1033
1034 def test_setitem(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001035 super().test_setitem()
Walter Dörwald7fd94242003-05-18 00:47:47 +00001036 a = array.array(self.typecode, self.example)
1037 self.assertRaises(TypeError, a.__setitem__, 0, self.example[:2])
1038
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001039class UnicodeTest(StringTest):
1040 typecode = 'u'
1041 example = '\x01\u263a\x00\ufeff'
1042 smallerexample = '\x01\u263a\x00\ufefe'
1043 biggerexample = '\x01\u263a\x01\ufeff'
1044 outside = str('\x33')
Victor Stinner8d4734f2012-08-08 20:09:21 +02001045 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001046
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001047 def test_unicode(self):
Victor Stinner9d512ab2012-08-09 00:43:56 +02001048 try:
1049 import ctypes
1050 sizeof_wchar = ctypes.sizeof(ctypes.c_wchar)
1051 except ImportError:
1052 import sys
1053 if sys.platform == 'win32':
1054 sizeof_wchar = 2
1055 else:
1056 sizeof_wchar = 4
1057
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001058 self.assertRaises(TypeError, array.array, 'b', 'foo')
Walter Dörwald7fd94242003-05-18 00:47:47 +00001059
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001060 a = array.array('u', '\xa0\xc2\u1234')
1061 a.fromunicode(' ')
1062 a.fromunicode('')
1063 a.fromunicode('')
1064 a.fromunicode('\x11abc\xff\u1234')
1065 s = a.tounicode()
1066 self.assertEqual(s, '\xa0\xc2\u1234 \x11abc\xff\u1234')
Victor Stinner9d512ab2012-08-09 00:43:56 +02001067 self.assertEqual(a.itemsize, sizeof_wchar)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001068
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001069 s = '\x00="\'a\\b\x80\xff\u0000\u0001\u1234'
1070 a = array.array('u', s)
1071 self.assertEqual(
1072 repr(a),
Georg Brandl559e5d72008-06-11 18:37:52 +00001073 "array('u', '\\x00=\"\\'a\\\\b\\x80\xff\\x00\\x01\u1234')")
Walter Dörwald7fd94242003-05-18 00:47:47 +00001074
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001075 self.assertRaises(TypeError, a.fromunicode)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001076
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001077tests.append(UnicodeTest)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001078
1079class NumberTest(BaseTest):
1080
1081 def test_extslice(self):
1082 a = array.array(self.typecode, range(5))
1083 self.assertEqual(a[::], a)
1084 self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
1085 self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
1086 self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
1087 self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
1088 self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
1089 self.assertEqual(a[-100:100:], a)
1090 self.assertEqual(a[100:-100:-1], a[::-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +00001091 self.assertEqual(a[-100:100:2], array.array(self.typecode, [0,2,4]))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001092 self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
1093 self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
1094
1095 def test_delslice(self):
1096 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001097 del a[::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001098 self.assertEqual(a, array.array(self.typecode, [1,3]))
1099 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001100 del a[1::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001101 self.assertEqual(a, array.array(self.typecode, [0,2,4]))
1102 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001103 del a[1::-2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001104 self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
1105 a = array.array(self.typecode, range(10))
Michael W. Hudson56796f62002-07-29 14:35:04 +00001106 del a[::1000]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001107 self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
Mark Dickinsonbc099642010-01-29 17:27:24 +00001108 # test issue7788
1109 a = array.array(self.typecode, range(10))
1110 del a[9::1<<333]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001111
1112 def test_assignment(self):
1113 a = array.array(self.typecode, range(10))
1114 a[::2] = array.array(self.typecode, [42]*5)
1115 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
1116 a = array.array(self.typecode, range(10))
1117 a[::-4] = array.array(self.typecode, [10]*3)
1118 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
1119 a = array.array(self.typecode, range(4))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001120 a[::-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +00001121 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
1122 a = array.array(self.typecode, range(10))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001123 b = a[:]
1124 c = a[:]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001125 ins = array.array(self.typecode, range(2))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001126 a[2:3] = ins
1127 b[slice(2,3)] = ins
1128 c[2:3:] = ins
Fred Drake004d5e62000-10-23 17:22:08 +00001129
Walter Dörwald7fd94242003-05-18 00:47:47 +00001130 def test_iterationcontains(self):
1131 a = array.array(self.typecode, range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +00001132 self.assertEqual(list(a), list(range(10)))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001133 b = array.array(self.typecode, [20])
1134 self.assertEqual(a[-1] in a, True)
1135 self.assertEqual(b[0] not in a, True)
1136
1137 def check_overflow(self, lower, upper):
1138 # method to be used by subclasses
1139
1140 # should not overflow assigning lower limit
1141 a = array.array(self.typecode, [lower])
1142 a[0] = lower
1143 # should overflow assigning less than lower limit
1144 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
1145 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
1146 # should not overflow assigning upper limit
1147 a = array.array(self.typecode, [upper])
1148 a[0] = upper
1149 # should overflow assigning more than upper limit
1150 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
1151 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
1152
1153 def test_subclassing(self):
1154 typecode = self.typecode
1155 class ExaggeratingArray(array.array):
1156 __slots__ = ['offset']
1157
1158 def __new__(cls, typecode, data, offset):
1159 return array.array.__new__(cls, typecode, data)
1160
1161 def __init__(self, typecode, data, offset):
1162 self.offset = offset
1163
1164 def __getitem__(self, i):
1165 return array.array.__getitem__(self, i) + self.offset
1166
1167 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
1168 self.assertEntryEqual(a[0], 7)
1169
1170 self.assertRaises(AttributeError, setattr, a, "color", "blue")
1171
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00001172 def test_frombytearray(self):
1173 a = array.array('b', range(10))
1174 b = array.array(self.typecode, a)
1175 self.assertEqual(a, b)
1176
Walter Dörwald7fd94242003-05-18 00:47:47 +00001177class SignedNumberTest(NumberTest):
1178 example = [-1, 0, 1, 42, 0x7f]
1179 smallerexample = [-1, 0, 1, 42, 0x7e]
1180 biggerexample = [-1, 0, 1, 43, 0x7f]
1181 outside = 23
1182
1183 def test_overflow(self):
1184 a = array.array(self.typecode)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001185 lower = -1 * int(pow(2, a.itemsize * 8 - 1))
1186 upper = int(pow(2, a.itemsize * 8 - 1)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001187 self.check_overflow(lower, upper)
1188
1189class UnsignedNumberTest(NumberTest):
1190 example = [0, 1, 17, 23, 42, 0xff]
1191 smallerexample = [0, 1, 17, 23, 42, 0xfe]
1192 biggerexample = [0, 1, 17, 23, 43, 0xff]
1193 outside = 0xaa
1194
1195 def test_overflow(self):
1196 a = array.array(self.typecode)
1197 lower = 0
Guido van Rossume2a383d2007-01-15 16:59:06 +00001198 upper = int(pow(2, a.itemsize * 8)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001199 self.check_overflow(lower, upper)
Fred Drake004d5e62000-10-23 17:22:08 +00001200
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001201 def test_bytes_extend(self):
1202 s = bytes(self.example)
1203
1204 a = array.array(self.typecode, self.example)
1205 a.extend(s)
1206 self.assertEqual(
1207 a,
1208 array.array(self.typecode, self.example+self.example)
1209 )
1210
1211 a = array.array(self.typecode, self.example)
1212 a.extend(bytearray(reversed(s)))
1213 self.assertEqual(
1214 a,
1215 array.array(self.typecode, self.example+self.example[::-1])
1216 )
1217
Fred Drake004d5e62000-10-23 17:22:08 +00001218
Walter Dörwald7fd94242003-05-18 00:47:47 +00001219class ByteTest(SignedNumberTest):
1220 typecode = 'b'
1221 minitemsize = 1
1222tests.append(ByteTest)
Fred Drake004d5e62000-10-23 17:22:08 +00001223
Walter Dörwald7fd94242003-05-18 00:47:47 +00001224class UnsignedByteTest(UnsignedNumberTest):
1225 typecode = 'B'
1226 minitemsize = 1
1227tests.append(UnsignedByteTest)
1228
1229class ShortTest(SignedNumberTest):
1230 typecode = 'h'
1231 minitemsize = 2
1232tests.append(ShortTest)
1233
1234class UnsignedShortTest(UnsignedNumberTest):
1235 typecode = 'H'
1236 minitemsize = 2
1237tests.append(UnsignedShortTest)
1238
1239class IntTest(SignedNumberTest):
1240 typecode = 'i'
1241 minitemsize = 2
1242tests.append(IntTest)
1243
1244class UnsignedIntTest(UnsignedNumberTest):
1245 typecode = 'I'
1246 minitemsize = 2
1247tests.append(UnsignedIntTest)
1248
1249class LongTest(SignedNumberTest):
1250 typecode = 'l'
1251 minitemsize = 4
1252tests.append(LongTest)
1253
1254class UnsignedLongTest(UnsignedNumberTest):
1255 typecode = 'L'
1256 minitemsize = 4
1257tests.append(UnsignedLongTest)
1258
Meador Inge1c9f0c92011-09-20 19:55:51 -05001259@unittest.skipIf(not have_long_long, 'need long long support')
1260class LongLongTest(SignedNumberTest):
1261 typecode = 'q'
1262 minitemsize = 8
1263tests.append(LongLongTest)
1264
1265@unittest.skipIf(not have_long_long, 'need long long support')
1266class UnsignedLongLongTest(UnsignedNumberTest):
1267 typecode = 'Q'
1268 minitemsize = 8
1269tests.append(UnsignedLongLongTest)
1270
Walter Dörwald7fd94242003-05-18 00:47:47 +00001271class FPTest(NumberTest):
1272 example = [-42.0, 0, 42, 1e5, -1e10]
1273 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
1274 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
1275 outside = 23
1276
1277 def assertEntryEqual(self, entry1, entry2):
1278 self.assertAlmostEqual(entry1, entry2)
1279
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001280 def test_byteswap(self):
1281 a = array.array(self.typecode, self.example)
1282 self.assertRaises(TypeError, a.byteswap, 42)
1283 if a.itemsize in (1, 2, 4, 8):
1284 b = array.array(self.typecode, self.example)
1285 b.byteswap()
1286 if a.itemsize==1:
1287 self.assertEqual(a, b)
1288 else:
1289 # On alphas treating the byte swapped bit patters as
1290 # floats/doubles results in floating point exceptions
1291 # => compare the 8bit string values instead
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001292 self.assertNotEqual(a.tobytes(), b.tobytes())
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001293 b.byteswap()
1294 self.assertEqual(a, b)
1295
Neal Norwitz35c6cd02003-05-22 13:29:15 +00001296class FloatTest(FPTest):
1297 typecode = 'f'
1298 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001299tests.append(FloatTest)
1300
1301class DoubleTest(FPTest):
1302 typecode = 'd'
1303 minitemsize = 8
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001304
1305 def test_alloc_overflow(self):
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001306 from sys import maxsize
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001307 a = array.array('d', [-1]*65536)
1308 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001309 a *= maxsize//65536 + 1
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001310 except MemoryError:
1311 pass
1312 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001313 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001314 b = array.array('d', [ 2.71828183, 3.14159265, -1])
1315 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001316 b * (maxsize//3 + 1)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001317 except MemoryError:
1318 pass
1319 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001320 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001321
Walter Dörwald7fd94242003-05-18 00:47:47 +00001322tests.append(DoubleTest)
1323
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001324def test_main(verbose=None):
1325 import sys
1326
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001327 support.run_unittest(*tests)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001328
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001329 # verify reference counting
1330 if verbose and hasattr(sys, "gettotalrefcount"):
1331 import gc
1332 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001333 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001334 support.run_unittest(*tests)
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001335 gc.collect()
1336 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001337 print(counts)
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001338
1339if __name__ == "__main__":
1340 test_main(verbose=True)