blob: eb6d77fc29d2f53aa9069f7d2deac3bd8d0ce0a2 [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')
Victor Stinner8d4734f2012-08-08 20:09:21 +02001032 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001033
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001034 def test_unicode(self):
Victor Stinner9d512ab2012-08-09 00:43:56 +02001035 try:
1036 import ctypes
1037 sizeof_wchar = ctypes.sizeof(ctypes.c_wchar)
1038 except ImportError:
1039 import sys
1040 if sys.platform == 'win32':
1041 sizeof_wchar = 2
1042 else:
1043 sizeof_wchar = 4
1044
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001045 self.assertRaises(TypeError, array.array, 'b', 'foo')
Walter Dörwald7fd94242003-05-18 00:47:47 +00001046
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001047 a = array.array('u', '\xa0\xc2\u1234')
1048 a.fromunicode(' ')
1049 a.fromunicode('')
1050 a.fromunicode('')
1051 a.fromunicode('\x11abc\xff\u1234')
1052 s = a.tounicode()
1053 self.assertEqual(s, '\xa0\xc2\u1234 \x11abc\xff\u1234')
Victor Stinner9d512ab2012-08-09 00:43:56 +02001054 self.assertEqual(a.itemsize, sizeof_wchar)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001055
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001056 s = '\x00="\'a\\b\x80\xff\u0000\u0001\u1234'
1057 a = array.array('u', s)
1058 self.assertEqual(
1059 repr(a),
Georg Brandl559e5d72008-06-11 18:37:52 +00001060 "array('u', '\\x00=\"\\'a\\\\b\\x80\xff\\x00\\x01\u1234')")
Walter Dörwald7fd94242003-05-18 00:47:47 +00001061
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001062 self.assertRaises(TypeError, a.fromunicode)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001063
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001064tests.append(UnicodeTest)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001065
1066class NumberTest(BaseTest):
1067
1068 def test_extslice(self):
1069 a = array.array(self.typecode, range(5))
1070 self.assertEqual(a[::], a)
1071 self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
1072 self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
1073 self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
1074 self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
1075 self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
1076 self.assertEqual(a[-100:100:], a)
1077 self.assertEqual(a[100:-100:-1], a[::-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +00001078 self.assertEqual(a[-100:100:2], array.array(self.typecode, [0,2,4]))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001079 self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
1080 self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
1081
1082 def test_delslice(self):
1083 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001084 del a[::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001085 self.assertEqual(a, array.array(self.typecode, [1,3]))
1086 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001087 del a[1::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001088 self.assertEqual(a, array.array(self.typecode, [0,2,4]))
1089 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001090 del a[1::-2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001091 self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
1092 a = array.array(self.typecode, range(10))
Michael W. Hudson56796f62002-07-29 14:35:04 +00001093 del a[::1000]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001094 self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
Mark Dickinsonbc099642010-01-29 17:27:24 +00001095 # test issue7788
1096 a = array.array(self.typecode, range(10))
1097 del a[9::1<<333]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001098
1099 def test_assignment(self):
1100 a = array.array(self.typecode, range(10))
1101 a[::2] = array.array(self.typecode, [42]*5)
1102 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
1103 a = array.array(self.typecode, range(10))
1104 a[::-4] = array.array(self.typecode, [10]*3)
1105 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
1106 a = array.array(self.typecode, range(4))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001107 a[::-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +00001108 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
1109 a = array.array(self.typecode, range(10))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001110 b = a[:]
1111 c = a[:]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001112 ins = array.array(self.typecode, range(2))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001113 a[2:3] = ins
1114 b[slice(2,3)] = ins
1115 c[2:3:] = ins
Fred Drake004d5e62000-10-23 17:22:08 +00001116
Walter Dörwald7fd94242003-05-18 00:47:47 +00001117 def test_iterationcontains(self):
1118 a = array.array(self.typecode, range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +00001119 self.assertEqual(list(a), list(range(10)))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001120 b = array.array(self.typecode, [20])
1121 self.assertEqual(a[-1] in a, True)
1122 self.assertEqual(b[0] not in a, True)
1123
1124 def check_overflow(self, lower, upper):
1125 # method to be used by subclasses
1126
1127 # should not overflow assigning lower limit
1128 a = array.array(self.typecode, [lower])
1129 a[0] = lower
1130 # should overflow assigning less than lower limit
1131 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
1132 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
1133 # should not overflow assigning upper limit
1134 a = array.array(self.typecode, [upper])
1135 a[0] = upper
1136 # should overflow assigning more than upper limit
1137 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
1138 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
1139
1140 def test_subclassing(self):
1141 typecode = self.typecode
1142 class ExaggeratingArray(array.array):
1143 __slots__ = ['offset']
1144
1145 def __new__(cls, typecode, data, offset):
1146 return array.array.__new__(cls, typecode, data)
1147
1148 def __init__(self, typecode, data, offset):
1149 self.offset = offset
1150
1151 def __getitem__(self, i):
1152 return array.array.__getitem__(self, i) + self.offset
1153
1154 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
1155 self.assertEntryEqual(a[0], 7)
1156
1157 self.assertRaises(AttributeError, setattr, a, "color", "blue")
1158
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00001159 def test_frombytearray(self):
1160 a = array.array('b', range(10))
1161 b = array.array(self.typecode, a)
1162 self.assertEqual(a, b)
1163
Walter Dörwald7fd94242003-05-18 00:47:47 +00001164class SignedNumberTest(NumberTest):
1165 example = [-1, 0, 1, 42, 0x7f]
1166 smallerexample = [-1, 0, 1, 42, 0x7e]
1167 biggerexample = [-1, 0, 1, 43, 0x7f]
1168 outside = 23
1169
1170 def test_overflow(self):
1171 a = array.array(self.typecode)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001172 lower = -1 * int(pow(2, a.itemsize * 8 - 1))
1173 upper = int(pow(2, a.itemsize * 8 - 1)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001174 self.check_overflow(lower, upper)
1175
1176class UnsignedNumberTest(NumberTest):
1177 example = [0, 1, 17, 23, 42, 0xff]
1178 smallerexample = [0, 1, 17, 23, 42, 0xfe]
1179 biggerexample = [0, 1, 17, 23, 43, 0xff]
1180 outside = 0xaa
1181
1182 def test_overflow(self):
1183 a = array.array(self.typecode)
1184 lower = 0
Guido van Rossume2a383d2007-01-15 16:59:06 +00001185 upper = int(pow(2, a.itemsize * 8)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001186 self.check_overflow(lower, upper)
Fred Drake004d5e62000-10-23 17:22:08 +00001187
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001188 def test_bytes_extend(self):
1189 s = bytes(self.example)
1190
1191 a = array.array(self.typecode, self.example)
1192 a.extend(s)
1193 self.assertEqual(
1194 a,
1195 array.array(self.typecode, self.example+self.example)
1196 )
1197
1198 a = array.array(self.typecode, self.example)
1199 a.extend(bytearray(reversed(s)))
1200 self.assertEqual(
1201 a,
1202 array.array(self.typecode, self.example+self.example[::-1])
1203 )
1204
Fred Drake004d5e62000-10-23 17:22:08 +00001205
Walter Dörwald7fd94242003-05-18 00:47:47 +00001206class ByteTest(SignedNumberTest):
1207 typecode = 'b'
1208 minitemsize = 1
1209tests.append(ByteTest)
Fred Drake004d5e62000-10-23 17:22:08 +00001210
Walter Dörwald7fd94242003-05-18 00:47:47 +00001211class UnsignedByteTest(UnsignedNumberTest):
1212 typecode = 'B'
1213 minitemsize = 1
1214tests.append(UnsignedByteTest)
1215
1216class ShortTest(SignedNumberTest):
1217 typecode = 'h'
1218 minitemsize = 2
1219tests.append(ShortTest)
1220
1221class UnsignedShortTest(UnsignedNumberTest):
1222 typecode = 'H'
1223 minitemsize = 2
1224tests.append(UnsignedShortTest)
1225
1226class IntTest(SignedNumberTest):
1227 typecode = 'i'
1228 minitemsize = 2
1229tests.append(IntTest)
1230
1231class UnsignedIntTest(UnsignedNumberTest):
1232 typecode = 'I'
1233 minitemsize = 2
1234tests.append(UnsignedIntTest)
1235
1236class LongTest(SignedNumberTest):
1237 typecode = 'l'
1238 minitemsize = 4
1239tests.append(LongTest)
1240
1241class UnsignedLongTest(UnsignedNumberTest):
1242 typecode = 'L'
1243 minitemsize = 4
1244tests.append(UnsignedLongTest)
1245
Meador Inge1c9f0c92011-09-20 19:55:51 -05001246@unittest.skipIf(not have_long_long, 'need long long support')
1247class LongLongTest(SignedNumberTest):
1248 typecode = 'q'
1249 minitemsize = 8
1250tests.append(LongLongTest)
1251
1252@unittest.skipIf(not have_long_long, 'need long long support')
1253class UnsignedLongLongTest(UnsignedNumberTest):
1254 typecode = 'Q'
1255 minitemsize = 8
1256tests.append(UnsignedLongLongTest)
1257
Walter Dörwald7fd94242003-05-18 00:47:47 +00001258class FPTest(NumberTest):
1259 example = [-42.0, 0, 42, 1e5, -1e10]
1260 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
1261 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
1262 outside = 23
1263
1264 def assertEntryEqual(self, entry1, entry2):
1265 self.assertAlmostEqual(entry1, entry2)
1266
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001267 def test_byteswap(self):
1268 a = array.array(self.typecode, self.example)
1269 self.assertRaises(TypeError, a.byteswap, 42)
1270 if a.itemsize in (1, 2, 4, 8):
1271 b = array.array(self.typecode, self.example)
1272 b.byteswap()
1273 if a.itemsize==1:
1274 self.assertEqual(a, b)
1275 else:
1276 # On alphas treating the byte swapped bit patters as
1277 # floats/doubles results in floating point exceptions
1278 # => compare the 8bit string values instead
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001279 self.assertNotEqual(a.tobytes(), b.tobytes())
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001280 b.byteswap()
1281 self.assertEqual(a, b)
1282
Neal Norwitz35c6cd02003-05-22 13:29:15 +00001283class FloatTest(FPTest):
1284 typecode = 'f'
1285 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001286tests.append(FloatTest)
1287
1288class DoubleTest(FPTest):
1289 typecode = 'd'
1290 minitemsize = 8
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001291
1292 def test_alloc_overflow(self):
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001293 from sys import maxsize
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001294 a = array.array('d', [-1]*65536)
1295 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001296 a *= maxsize//65536 + 1
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001297 except MemoryError:
1298 pass
1299 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001300 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001301 b = array.array('d', [ 2.71828183, 3.14159265, -1])
1302 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001303 b * (maxsize//3 + 1)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001304 except MemoryError:
1305 pass
1306 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001307 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001308
Walter Dörwald7fd94242003-05-18 00:47:47 +00001309tests.append(DoubleTest)
1310
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001311def test_main(verbose=None):
1312 import sys
1313
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001314 support.run_unittest(*tests)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001315
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001316 # verify reference counting
1317 if verbose and hasattr(sys, "gettotalrefcount"):
1318 import gc
1319 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001320 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001321 support.run_unittest(*tests)
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001322 gc.collect()
1323 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001324 print(counts)
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001325
1326if __name__ == "__main__":
1327 test_main(verbose=True)