blob: 93853396c9726f3c315a3ee2576723ae3e1b146c [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
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001018
Walter Dörwald7fd94242003-05-18 00:47:47 +00001019class StringTest(BaseTest):
1020
1021 def test_setitem(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001022 super().test_setitem()
Walter Dörwald7fd94242003-05-18 00:47:47 +00001023 a = array.array(self.typecode, self.example)
1024 self.assertRaises(TypeError, a.__setitem__, 0, self.example[:2])
1025
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001026class UnicodeTest(StringTest):
1027 typecode = 'u'
1028 example = '\x01\u263a\x00\ufeff'
1029 smallerexample = '\x01\u263a\x00\ufefe'
1030 biggerexample = '\x01\u263a\x01\ufeff'
1031 outside = str('\x33')
Ezio Melotti90bf5f12011-10-25 10:05:34 +03001032 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001033
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001034 def test_unicode(self):
1035 self.assertRaises(TypeError, array.array, 'b', 'foo')
Walter Dörwald7fd94242003-05-18 00:47:47 +00001036
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001037 a = array.array('u', '\xa0\xc2\u1234')
1038 a.fromunicode(' ')
1039 a.fromunicode('')
1040 a.fromunicode('')
1041 a.fromunicode('\x11abc\xff\u1234')
1042 s = a.tounicode()
1043 self.assertEqual(s, '\xa0\xc2\u1234 \x11abc\xff\u1234')
Ezio Melotti90bf5f12011-10-25 10:05:34 +03001044 self.assertEqual(a.itemsize, 4)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001045
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001046 s = '\x00="\'a\\b\x80\xff\u0000\u0001\u1234'
1047 a = array.array('u', s)
1048 self.assertEqual(
1049 repr(a),
Georg Brandl559e5d72008-06-11 18:37:52 +00001050 "array('u', '\\x00=\"\\'a\\\\b\\x80\xff\\x00\\x01\u1234')")
Walter Dörwald7fd94242003-05-18 00:47:47 +00001051
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001052 self.assertRaises(TypeError, a.fromunicode)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001053
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001054tests.append(UnicodeTest)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001055
1056class NumberTest(BaseTest):
1057
1058 def test_extslice(self):
1059 a = array.array(self.typecode, range(5))
1060 self.assertEqual(a[::], a)
1061 self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
1062 self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
1063 self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
1064 self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
1065 self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
1066 self.assertEqual(a[-100:100:], a)
1067 self.assertEqual(a[100:-100:-1], a[::-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +00001068 self.assertEqual(a[-100:100:2], array.array(self.typecode, [0,2,4]))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001069 self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
1070 self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
1071
1072 def test_delslice(self):
1073 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001074 del a[::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001075 self.assertEqual(a, array.array(self.typecode, [1,3]))
1076 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001077 del a[1::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001078 self.assertEqual(a, array.array(self.typecode, [0,2,4]))
1079 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001080 del a[1::-2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001081 self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
1082 a = array.array(self.typecode, range(10))
Michael W. Hudson56796f62002-07-29 14:35:04 +00001083 del a[::1000]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001084 self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
Mark Dickinsonbc099642010-01-29 17:27:24 +00001085 # test issue7788
1086 a = array.array(self.typecode, range(10))
1087 del a[9::1<<333]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001088
1089 def test_assignment(self):
1090 a = array.array(self.typecode, range(10))
1091 a[::2] = array.array(self.typecode, [42]*5)
1092 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
1093 a = array.array(self.typecode, range(10))
1094 a[::-4] = array.array(self.typecode, [10]*3)
1095 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
1096 a = array.array(self.typecode, range(4))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001097 a[::-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +00001098 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
1099 a = array.array(self.typecode, range(10))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001100 b = a[:]
1101 c = a[:]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001102 ins = array.array(self.typecode, range(2))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001103 a[2:3] = ins
1104 b[slice(2,3)] = ins
1105 c[2:3:] = ins
Fred Drake004d5e62000-10-23 17:22:08 +00001106
Walter Dörwald7fd94242003-05-18 00:47:47 +00001107 def test_iterationcontains(self):
1108 a = array.array(self.typecode, range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +00001109 self.assertEqual(list(a), list(range(10)))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001110 b = array.array(self.typecode, [20])
1111 self.assertEqual(a[-1] in a, True)
1112 self.assertEqual(b[0] not in a, True)
1113
1114 def check_overflow(self, lower, upper):
1115 # method to be used by subclasses
1116
1117 # should not overflow assigning lower limit
1118 a = array.array(self.typecode, [lower])
1119 a[0] = lower
1120 # should overflow assigning less than lower limit
1121 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
1122 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
1123 # should not overflow assigning upper limit
1124 a = array.array(self.typecode, [upper])
1125 a[0] = upper
1126 # should overflow assigning more than upper limit
1127 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
1128 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
1129
1130 def test_subclassing(self):
1131 typecode = self.typecode
1132 class ExaggeratingArray(array.array):
1133 __slots__ = ['offset']
1134
1135 def __new__(cls, typecode, data, offset):
1136 return array.array.__new__(cls, typecode, data)
1137
1138 def __init__(self, typecode, data, offset):
1139 self.offset = offset
1140
1141 def __getitem__(self, i):
1142 return array.array.__getitem__(self, i) + self.offset
1143
1144 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
1145 self.assertEntryEqual(a[0], 7)
1146
1147 self.assertRaises(AttributeError, setattr, a, "color", "blue")
1148
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00001149 def test_frombytearray(self):
1150 a = array.array('b', range(10))
1151 b = array.array(self.typecode, a)
1152 self.assertEqual(a, b)
1153
Walter Dörwald7fd94242003-05-18 00:47:47 +00001154class SignedNumberTest(NumberTest):
1155 example = [-1, 0, 1, 42, 0x7f]
1156 smallerexample = [-1, 0, 1, 42, 0x7e]
1157 biggerexample = [-1, 0, 1, 43, 0x7f]
1158 outside = 23
1159
1160 def test_overflow(self):
1161 a = array.array(self.typecode)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001162 lower = -1 * int(pow(2, a.itemsize * 8 - 1))
1163 upper = int(pow(2, a.itemsize * 8 - 1)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001164 self.check_overflow(lower, upper)
1165
1166class UnsignedNumberTest(NumberTest):
1167 example = [0, 1, 17, 23, 42, 0xff]
1168 smallerexample = [0, 1, 17, 23, 42, 0xfe]
1169 biggerexample = [0, 1, 17, 23, 43, 0xff]
1170 outside = 0xaa
1171
1172 def test_overflow(self):
1173 a = array.array(self.typecode)
1174 lower = 0
Guido van Rossume2a383d2007-01-15 16:59:06 +00001175 upper = int(pow(2, a.itemsize * 8)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001176 self.check_overflow(lower, upper)
Fred Drake004d5e62000-10-23 17:22:08 +00001177
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001178 def test_bytes_extend(self):
1179 s = bytes(self.example)
1180
1181 a = array.array(self.typecode, self.example)
1182 a.extend(s)
1183 self.assertEqual(
1184 a,
1185 array.array(self.typecode, self.example+self.example)
1186 )
1187
1188 a = array.array(self.typecode, self.example)
1189 a.extend(bytearray(reversed(s)))
1190 self.assertEqual(
1191 a,
1192 array.array(self.typecode, self.example+self.example[::-1])
1193 )
1194
Fred Drake004d5e62000-10-23 17:22:08 +00001195
Walter Dörwald7fd94242003-05-18 00:47:47 +00001196class ByteTest(SignedNumberTest):
1197 typecode = 'b'
1198 minitemsize = 1
1199tests.append(ByteTest)
Fred Drake004d5e62000-10-23 17:22:08 +00001200
Walter Dörwald7fd94242003-05-18 00:47:47 +00001201class UnsignedByteTest(UnsignedNumberTest):
1202 typecode = 'B'
1203 minitemsize = 1
1204tests.append(UnsignedByteTest)
1205
1206class ShortTest(SignedNumberTest):
1207 typecode = 'h'
1208 minitemsize = 2
1209tests.append(ShortTest)
1210
1211class UnsignedShortTest(UnsignedNumberTest):
1212 typecode = 'H'
1213 minitemsize = 2
1214tests.append(UnsignedShortTest)
1215
1216class IntTest(SignedNumberTest):
1217 typecode = 'i'
1218 minitemsize = 2
1219tests.append(IntTest)
1220
1221class UnsignedIntTest(UnsignedNumberTest):
1222 typecode = 'I'
1223 minitemsize = 2
1224tests.append(UnsignedIntTest)
1225
1226class LongTest(SignedNumberTest):
1227 typecode = 'l'
1228 minitemsize = 4
1229tests.append(LongTest)
1230
1231class UnsignedLongTest(UnsignedNumberTest):
1232 typecode = 'L'
1233 minitemsize = 4
1234tests.append(UnsignedLongTest)
1235
Meador Inge1c9f0c92011-09-20 19:55:51 -05001236@unittest.skipIf(not have_long_long, 'need long long support')
1237class LongLongTest(SignedNumberTest):
1238 typecode = 'q'
1239 minitemsize = 8
1240tests.append(LongLongTest)
1241
1242@unittest.skipIf(not have_long_long, 'need long long support')
1243class UnsignedLongLongTest(UnsignedNumberTest):
1244 typecode = 'Q'
1245 minitemsize = 8
1246tests.append(UnsignedLongLongTest)
1247
Walter Dörwald7fd94242003-05-18 00:47:47 +00001248class FPTest(NumberTest):
1249 example = [-42.0, 0, 42, 1e5, -1e10]
1250 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
1251 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
1252 outside = 23
1253
1254 def assertEntryEqual(self, entry1, entry2):
1255 self.assertAlmostEqual(entry1, entry2)
1256
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001257 def test_byteswap(self):
1258 a = array.array(self.typecode, self.example)
1259 self.assertRaises(TypeError, a.byteswap, 42)
1260 if a.itemsize in (1, 2, 4, 8):
1261 b = array.array(self.typecode, self.example)
1262 b.byteswap()
1263 if a.itemsize==1:
1264 self.assertEqual(a, b)
1265 else:
1266 # On alphas treating the byte swapped bit patters as
1267 # floats/doubles results in floating point exceptions
1268 # => compare the 8bit string values instead
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001269 self.assertNotEqual(a.tobytes(), b.tobytes())
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001270 b.byteswap()
1271 self.assertEqual(a, b)
1272
Neal Norwitz35c6cd02003-05-22 13:29:15 +00001273class FloatTest(FPTest):
1274 typecode = 'f'
1275 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001276tests.append(FloatTest)
1277
1278class DoubleTest(FPTest):
1279 typecode = 'd'
1280 minitemsize = 8
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001281
1282 def test_alloc_overflow(self):
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001283 from sys import maxsize
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001284 a = array.array('d', [-1]*65536)
1285 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001286 a *= maxsize//65536 + 1
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001287 except MemoryError:
1288 pass
1289 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001290 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001291 b = array.array('d', [ 2.71828183, 3.14159265, -1])
1292 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001293 b * (maxsize//3 + 1)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001294 except MemoryError:
1295 pass
1296 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001297 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001298
Walter Dörwald7fd94242003-05-18 00:47:47 +00001299tests.append(DoubleTest)
1300
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001301def test_main(verbose=None):
1302 import sys
1303
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001304 support.run_unittest(*tests)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001305
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001306 # verify reference counting
1307 if verbose and hasattr(sys, "gettotalrefcount"):
1308 import gc
1309 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001310 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001311 support.run_unittest(*tests)
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001312 gc.collect()
1313 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001314 print(counts)
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001315
1316if __name__ == "__main__":
1317 test_main(verbose=True)