blob: 434e495f86f141d196289cfa0750e55c7ca3f03f [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
Walter Dörwald7fd94242003-05-18 00:47:47 +0000288 def test_insert(self):
289 a = array.array(self.typecode, self.example)
290 a.insert(0, self.example[0])
291 self.assertEqual(len(a), 1+len(self.example))
292 self.assertEqual(a[0], a[1])
293 self.assertRaises(TypeError, a.insert)
294 self.assertRaises(TypeError, a.insert, None)
Walter Dörwaldba39d9c2003-05-18 01:56:25 +0000295 self.assertRaises(TypeError, a.insert, 0, None)
Martin v. Löwis99866332002-03-01 10:27:01 +0000296
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000297 a = array.array(self.typecode, self.example)
298 a.insert(-1, self.example[0])
299 self.assertEqual(
300 a,
301 array.array(
302 self.typecode,
303 self.example[:-1] + self.example[:1] + self.example[-1:]
304 )
305 )
306
307 a = array.array(self.typecode, self.example)
308 a.insert(-1000, self.example[0])
309 self.assertEqual(
310 a,
311 array.array(self.typecode, self.example[:1] + self.example)
312 )
313
314 a = array.array(self.typecode, self.example)
315 a.insert(1000, self.example[0])
316 self.assertEqual(
317 a,
318 array.array(self.typecode, self.example + self.example[:1])
319 )
320
Walter Dörwald7fd94242003-05-18 00:47:47 +0000321 def test_tofromfile(self):
322 a = array.array(self.typecode, 2*self.example)
323 self.assertRaises(TypeError, a.tofile)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000324 support.unlink(support.TESTFN)
325 f = open(support.TESTFN, 'wb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000326 try:
327 a.tofile(f)
328 f.close()
329 b = array.array(self.typecode)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000330 f = open(support.TESTFN, 'rb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000331 self.assertRaises(TypeError, b.fromfile)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000332 b.fromfile(f, len(self.example))
333 self.assertEqual(b, array.array(self.typecode, self.example))
334 self.assertNotEqual(a, b)
Hirokazu Yamamoto54d0df62009-03-06 03:04:07 +0000335 self.assertRaises(EOFError, b.fromfile, f, len(self.example)+1)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000336 self.assertEqual(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000337 f.close()
338 finally:
339 if not f.closed:
340 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000341 support.unlink(support.TESTFN)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000342
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000343 def test_fromfile_ioerror(self):
344 # Issue #5395: Check if fromfile raises a proper IOError
345 # instead of EOFError.
346 a = array.array(self.typecode)
347 f = open(support.TESTFN, 'wb')
348 try:
349 self.assertRaises(IOError, a.fromfile, f, len(self.example))
350 finally:
351 f.close()
352 support.unlink(support.TESTFN)
353
Frank Wierzbicki17683432009-08-16 20:30:12 +0000354 def test_filewrite(self):
355 a = array.array(self.typecode, 2*self.example)
356 f = open(support.TESTFN, 'wb')
357 try:
358 f.write(a)
359 f.close()
360 b = array.array(self.typecode)
361 f = open(support.TESTFN, 'rb')
362 b.fromfile(f, len(self.example))
363 self.assertEqual(b, array.array(self.typecode, self.example))
364 self.assertNotEqual(a, b)
365 b.fromfile(f, len(self.example))
366 self.assertEqual(a, b)
367 f.close()
368 finally:
369 if not f.closed:
370 f.close()
371 support.unlink(support.TESTFN)
372
Walter Dörwald7fd94242003-05-18 00:47:47 +0000373 def test_tofromlist(self):
374 a = array.array(self.typecode, 2*self.example)
375 b = array.array(self.typecode)
376 self.assertRaises(TypeError, a.tolist, 42)
377 self.assertRaises(TypeError, b.fromlist)
378 self.assertRaises(TypeError, b.fromlist, 42)
379 self.assertRaises(TypeError, b.fromlist, [None])
380 b.fromlist(a.tolist())
381 self.assertEqual(a, b)
Fred Drake78334472000-06-28 17:50:51 +0000382
Walter Dörwald7fd94242003-05-18 00:47:47 +0000383 def test_tofromstring(self):
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000384 nb_warnings = 4
385 with warnings.catch_warnings(record=True) as r:
386 warnings.filterwarnings("always",
387 message=r"(to|from)string\(\) is deprecated",
388 category=DeprecationWarning)
389 a = array.array(self.typecode, 2*self.example)
390 b = array.array(self.typecode)
391 self.assertRaises(TypeError, a.tostring, 42)
392 self.assertRaises(TypeError, b.fromstring)
393 self.assertRaises(TypeError, b.fromstring, 42)
394 b.fromstring(a.tostring())
395 self.assertEqual(a, b)
396 if a.itemsize>1:
397 self.assertRaises(ValueError, b.fromstring, "x")
398 nb_warnings += 1
399 self.assertEqual(len(r), nb_warnings)
400
401 def test_tofrombytes(self):
Walter Dörwald7fd94242003-05-18 00:47:47 +0000402 a = array.array(self.typecode, 2*self.example)
403 b = array.array(self.typecode)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000404 self.assertRaises(TypeError, a.tobytes, 42)
405 self.assertRaises(TypeError, b.frombytes)
406 self.assertRaises(TypeError, b.frombytes, 42)
407 b.frombytes(a.tobytes())
408 c = array.array(self.typecode, bytearray(a.tobytes()))
Walter Dörwald7fd94242003-05-18 00:47:47 +0000409 self.assertEqual(a, b)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000410 self.assertEqual(a, c)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000411 if a.itemsize>1:
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000412 self.assertRaises(ValueError, b.frombytes, b"x")
Fred Drake78334472000-06-28 17:50:51 +0000413
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +0000414 def test_fromarray(self):
415 a = array.array(self.typecode, self.example)
416 b = array.array(self.typecode, a)
417 self.assertEqual(a, b)
418
Walter Dörwald7fd94242003-05-18 00:47:47 +0000419 def test_repr(self):
420 a = array.array(self.typecode, 2*self.example)
421 self.assertEqual(a, eval(repr(a), {"array": array.array}))
Fred Drake78334472000-06-28 17:50:51 +0000422
Walter Dörwald7fd94242003-05-18 00:47:47 +0000423 a = array.array(self.typecode)
424 self.assertEqual(repr(a), "array('%s')" % self.typecode)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000425
Walter Dörwald7fd94242003-05-18 00:47:47 +0000426 def test_str(self):
427 a = array.array(self.typecode, 2*self.example)
428 str(a)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000429
Walter Dörwald7fd94242003-05-18 00:47:47 +0000430 def test_cmp(self):
431 a = array.array(self.typecode, self.example)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000432 self.assertTrue((a == 42) is False)
433 self.assertTrue((a != 42) is True)
Tim Peterscc78e472000-11-14 21:36:07 +0000434
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000435 self.assertTrue((a == a) is True)
436 self.assertTrue((a != a) is False)
437 self.assertTrue((a < a) is False)
438 self.assertTrue((a <= a) is True)
439 self.assertTrue((a > a) is False)
440 self.assertTrue((a >= a) is True)
Tim Peterscc78e472000-11-14 21:36:07 +0000441
Neal Norwitzbd2835c2006-03-17 08:54:15 +0000442 al = array.array(self.typecode, self.smallerexample)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000443 ab = array.array(self.typecode, self.biggerexample)
Guido van Rossum7f1d3aa1998-07-16 15:31:43 +0000444
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000445 self.assertTrue((a == 2*a) is False)
446 self.assertTrue((a != 2*a) is True)
447 self.assertTrue((a < 2*a) is True)
448 self.assertTrue((a <= 2*a) is True)
449 self.assertTrue((a > 2*a) is False)
450 self.assertTrue((a >= 2*a) is False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000451
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000452 self.assertTrue((a == al) is False)
453 self.assertTrue((a != al) is True)
454 self.assertTrue((a < al) is False)
455 self.assertTrue((a <= al) is False)
456 self.assertTrue((a > al) is True)
457 self.assertTrue((a >= al) is True)
Martin v. Löwis99866332002-03-01 10:27:01 +0000458
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000459 self.assertTrue((a == ab) is False)
460 self.assertTrue((a != ab) is True)
461 self.assertTrue((a < ab) is True)
462 self.assertTrue((a <= ab) is True)
463 self.assertTrue((a > ab) is False)
464 self.assertTrue((a >= ab) is False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000465
Walter Dörwald7fd94242003-05-18 00:47:47 +0000466 def test_add(self):
467 a = array.array(self.typecode, self.example) \
468 + array.array(self.typecode, self.example[::-1])
469 self.assertEqual(
470 a,
471 array.array(self.typecode, self.example + self.example[::-1])
472 )
Martin v. Löwis99866332002-03-01 10:27:01 +0000473
Walter Dörwald7fd94242003-05-18 00:47:47 +0000474 b = array.array(self.badtypecode())
475 self.assertRaises(TypeError, a.__add__, b)
476
477 self.assertRaises(TypeError, a.__add__, "bad")
478
479 def test_iadd(self):
480 a = array.array(self.typecode, self.example[::-1])
481 b = a
482 a += array.array(self.typecode, 2*self.example)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000483 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000484 self.assertEqual(
485 a,
486 array.array(self.typecode, self.example[::-1]+2*self.example)
487 )
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000488 a = array.array(self.typecode, self.example)
489 a += a
490 self.assertEqual(
491 a,
492 array.array(self.typecode, self.example + self.example)
493 )
Walter Dörwald7fd94242003-05-18 00:47:47 +0000494
495 b = array.array(self.badtypecode())
496 self.assertRaises(TypeError, a.__add__, b)
497
498 self.assertRaises(TypeError, a.__iadd__, "bad")
499
500 def test_mul(self):
501 a = 5*array.array(self.typecode, self.example)
502 self.assertEqual(
503 a,
504 array.array(self.typecode, 5*self.example)
505 )
506
507 a = array.array(self.typecode, self.example)*5
508 self.assertEqual(
509 a,
510 array.array(self.typecode, self.example*5)
511 )
512
513 a = 0*array.array(self.typecode, self.example)
514 self.assertEqual(
515 a,
516 array.array(self.typecode)
517 )
518
519 a = (-1)*array.array(self.typecode, self.example)
520 self.assertEqual(
521 a,
522 array.array(self.typecode)
523 )
524
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000525 a = 5 * array.array(self.typecode, self.example[:1])
526 self.assertEqual(
527 a,
528 array.array(self.typecode, [a[0]] * 5)
529 )
530
Walter Dörwald7fd94242003-05-18 00:47:47 +0000531 self.assertRaises(TypeError, a.__mul__, "bad")
532
533 def test_imul(self):
534 a = array.array(self.typecode, self.example)
535 b = a
536
537 a *= 5
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000538 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000539 self.assertEqual(
540 a,
541 array.array(self.typecode, 5*self.example)
542 )
543
544 a *= 0
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000545 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000546 self.assertEqual(a, array.array(self.typecode))
547
548 a *= 1000
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000549 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000550 self.assertEqual(a, array.array(self.typecode))
551
552 a *= -1
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000553 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000554 self.assertEqual(a, array.array(self.typecode))
555
556 a = array.array(self.typecode, self.example)
557 a *= -1
558 self.assertEqual(a, array.array(self.typecode))
559
560 self.assertRaises(TypeError, a.__imul__, "bad")
561
562 def test_getitem(self):
563 a = array.array(self.typecode, self.example)
564 self.assertEntryEqual(a[0], self.example[0])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000565 self.assertEntryEqual(a[0], self.example[0])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000566 self.assertEntryEqual(a[-1], self.example[-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000567 self.assertEntryEqual(a[-1], self.example[-1])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000568 self.assertEntryEqual(a[len(self.example)-1], self.example[-1])
569 self.assertEntryEqual(a[-len(self.example)], self.example[0])
570 self.assertRaises(TypeError, a.__getitem__)
571 self.assertRaises(IndexError, a.__getitem__, len(self.example))
572 self.assertRaises(IndexError, a.__getitem__, -len(self.example)-1)
573
574 def test_setitem(self):
575 a = array.array(self.typecode, self.example)
576 a[0] = a[-1]
577 self.assertEntryEqual(a[0], a[-1])
578
579 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000580 a[0] = a[-1]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000581 self.assertEntryEqual(a[0], a[-1])
582
583 a = array.array(self.typecode, self.example)
584 a[-1] = a[0]
585 self.assertEntryEqual(a[0], a[-1])
586
587 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000588 a[-1] = a[0]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000589 self.assertEntryEqual(a[0], a[-1])
590
591 a = array.array(self.typecode, self.example)
592 a[len(self.example)-1] = a[0]
593 self.assertEntryEqual(a[0], a[-1])
594
595 a = array.array(self.typecode, self.example)
596 a[-len(self.example)] = a[-1]
597 self.assertEntryEqual(a[0], a[-1])
598
599 self.assertRaises(TypeError, a.__setitem__)
600 self.assertRaises(TypeError, a.__setitem__, None)
601 self.assertRaises(TypeError, a.__setitem__, 0, None)
602 self.assertRaises(
603 IndexError,
604 a.__setitem__,
605 len(self.example), self.example[0]
606 )
607 self.assertRaises(
608 IndexError,
609 a.__setitem__,
610 -len(self.example)-1, self.example[0]
611 )
612
613 def test_delitem(self):
614 a = array.array(self.typecode, self.example)
615 del a[0]
616 self.assertEqual(
617 a,
618 array.array(self.typecode, self.example[1:])
619 )
620
621 a = array.array(self.typecode, self.example)
622 del a[-1]
623 self.assertEqual(
624 a,
625 array.array(self.typecode, self.example[:-1])
626 )
627
628 a = array.array(self.typecode, self.example)
629 del a[len(self.example)-1]
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[-len(self.example)]
637 self.assertEqual(
638 a,
639 array.array(self.typecode, self.example[1:])
640 )
641
642 self.assertRaises(TypeError, a.__delitem__)
643 self.assertRaises(TypeError, a.__delitem__, None)
644 self.assertRaises(IndexError, a.__delitem__, len(self.example))
645 self.assertRaises(IndexError, a.__delitem__, -len(self.example)-1)
646
647 def test_getslice(self):
648 a = array.array(self.typecode, self.example)
649 self.assertEqual(a[:], a)
650
651 self.assertEqual(
652 a[1:],
653 array.array(self.typecode, self.example[1:])
654 )
655
656 self.assertEqual(
657 a[:1],
658 array.array(self.typecode, self.example[:1])
659 )
660
661 self.assertEqual(
662 a[:-1],
663 array.array(self.typecode, self.example[:-1])
664 )
665
666 self.assertEqual(
667 a[-1:],
668 array.array(self.typecode, self.example[-1:])
669 )
670
671 self.assertEqual(
672 a[-1:-1],
673 array.array(self.typecode)
674 )
675
676 self.assertEqual(
Walter Dörwald1083c242005-01-21 21:16:51 +0000677 a[2:1],
678 array.array(self.typecode)
679 )
680
681 self.assertEqual(
Walter Dörwald7fd94242003-05-18 00:47:47 +0000682 a[1000:],
683 array.array(self.typecode)
684 )
685 self.assertEqual(a[-1000:], a)
686 self.assertEqual(a[:1000], a)
687 self.assertEqual(
688 a[:-1000],
689 array.array(self.typecode)
690 )
691 self.assertEqual(a[-1000:1000], a)
692 self.assertEqual(
693 a[2000:1000],
694 array.array(self.typecode)
695 )
696
Thomas Woutersed03b412007-08-28 21:37:11 +0000697 def test_extended_getslice(self):
698 # Test extended slicing by comparing with list slicing
699 # (Assumes list conversion works correctly, too)
700 a = array.array(self.typecode, self.example)
701 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
702 for start in indices:
703 for stop in indices:
704 # Everything except the initial 0 (invalid step)
705 for step in indices[1:]:
706 self.assertEqual(list(a[start:stop:step]),
707 list(a)[start:stop:step])
708
Walter Dörwald7fd94242003-05-18 00:47:47 +0000709 def test_setslice(self):
710 a = array.array(self.typecode, self.example)
711 a[:1] = a
712 self.assertEqual(
713 a,
714 array.array(self.typecode, self.example + self.example[1:])
715 )
716
717 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000718 a[:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000719 self.assertEqual(
720 a,
721 array.array(self.typecode, self.example + self.example[-1:])
722 )
723
724 a = array.array(self.typecode, self.example)
725 a[-1:] = a
726 self.assertEqual(
727 a,
728 array.array(self.typecode, self.example[:-1] + self.example)
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[:1] + self.example)
736 )
737
738 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000739 a[1:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000740 self.assertEqual(
741 a,
742 array.array(
743 self.typecode,
744 self.example[:1] + self.example + self.example[-1:]
745 )
746 )
747
748 a = array.array(self.typecode, self.example)
749 a[1000:] = a
750 self.assertEqual(
751 a,
752 array.array(self.typecode, 2*self.example)
753 )
754
755 a = array.array(self.typecode, self.example)
756 a[-1000:] = a
757 self.assertEqual(
758 a,
759 array.array(self.typecode, self.example)
760 )
761
762 a = array.array(self.typecode, self.example)
763 a[:1000] = a
764 self.assertEqual(
765 a,
766 array.array(self.typecode, 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, 2*self.example)
774 )
775
776 a = array.array(self.typecode, self.example)
777 a[1:0] = a
778 self.assertEqual(
779 a,
780 array.array(self.typecode, self.example[:1] + self.example + self.example[1:])
781 )
782
783 a = array.array(self.typecode, self.example)
784 a[2000: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)
Thomas Woutersed03b412007-08-28 21:37:11 +0000791 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), None)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000792 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), None)
793
794 b = array.array(self.badtypecode())
Thomas Woutersed03b412007-08-28 21:37:11 +0000795 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000796 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), b)
797
Thomas Woutersed03b412007-08-28 21:37:11 +0000798 def test_extended_set_del_slice(self):
799 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
800 for start in indices:
801 for stop in indices:
802 # Everything except the initial 0 (invalid step)
803 for step in indices[1:]:
804 a = array.array(self.typecode, self.example)
805 L = list(a)
806 # Make sure we have a slice of exactly the right length,
807 # but with (hopefully) different data.
808 data = L[start:stop:step]
809 data.reverse()
810 L[start:stop:step] = data
811 a[start:stop:step] = array.array(self.typecode, data)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000812 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000813
814 del L[start:stop:step]
815 del a[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +0000816 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000817
Walter Dörwald7fd94242003-05-18 00:47:47 +0000818 def test_index(self):
819 example = 2*self.example
820 a = array.array(self.typecode, example)
821 self.assertRaises(TypeError, a.index)
822 for x in example:
823 self.assertEqual(a.index(x), example.index(x))
824 self.assertRaises(ValueError, a.index, None)
825 self.assertRaises(ValueError, a.index, self.outside)
826
827 def test_count(self):
828 example = 2*self.example
829 a = array.array(self.typecode, example)
830 self.assertRaises(TypeError, a.count)
831 for x in example:
832 self.assertEqual(a.count(x), example.count(x))
833 self.assertEqual(a.count(self.outside), 0)
834 self.assertEqual(a.count(None), 0)
835
836 def test_remove(self):
837 for x in self.example:
838 example = 2*self.example
839 a = array.array(self.typecode, example)
840 pos = example.index(x)
841 example2 = example[:pos] + example[pos+1:]
842 a.remove(x)
843 self.assertEqual(a, array.array(self.typecode, example2))
844
845 a = array.array(self.typecode, self.example)
846 self.assertRaises(ValueError, a.remove, self.outside)
847
848 self.assertRaises(ValueError, a.remove, None)
849
850 def test_pop(self):
851 a = array.array(self.typecode)
852 self.assertRaises(IndexError, a.pop)
853
854 a = array.array(self.typecode, 2*self.example)
855 self.assertRaises(TypeError, a.pop, 42, 42)
856 self.assertRaises(TypeError, a.pop, None)
857 self.assertRaises(IndexError, a.pop, len(a))
858 self.assertRaises(IndexError, a.pop, -len(a)-1)
859
860 self.assertEntryEqual(a.pop(0), self.example[0])
861 self.assertEqual(
862 a,
863 array.array(self.typecode, self.example[1:]+self.example)
864 )
865 self.assertEntryEqual(a.pop(1), self.example[2])
866 self.assertEqual(
867 a,
868 array.array(self.typecode, self.example[1:2]+self.example[3:]+self.example)
869 )
870 self.assertEntryEqual(a.pop(0), self.example[1])
871 self.assertEntryEqual(a.pop(), self.example[-1])
872 self.assertEqual(
873 a,
874 array.array(self.typecode, self.example[3:]+self.example[:-1])
875 )
876
877 def test_reverse(self):
878 a = array.array(self.typecode, self.example)
879 self.assertRaises(TypeError, a.reverse, 42)
Fred Drake004d5e62000-10-23 17:22:08 +0000880 a.reverse()
Walter Dörwald7fd94242003-05-18 00:47:47 +0000881 self.assertEqual(
882 a,
883 array.array(self.typecode, self.example[::-1])
884 )
885
886 def test_extend(self):
887 a = array.array(self.typecode, self.example)
888 self.assertRaises(TypeError, a.extend)
889 a.extend(array.array(self.typecode, self.example[::-1]))
890 self.assertEqual(
891 a,
892 array.array(self.typecode, self.example+self.example[::-1])
893 )
894
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000895 a = array.array(self.typecode, self.example)
896 a.extend(a)
897 self.assertEqual(
898 a,
899 array.array(self.typecode, self.example+self.example)
900 )
901
Walter Dörwald7fd94242003-05-18 00:47:47 +0000902 b = array.array(self.badtypecode())
903 self.assertRaises(TypeError, a.extend, b)
904
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000905 a = array.array(self.typecode, self.example)
906 a.extend(self.example[::-1])
907 self.assertEqual(
908 a,
909 array.array(self.typecode, self.example+self.example[::-1])
910 )
911
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +0000912 def test_constructor_with_iterable_argument(self):
913 a = array.array(self.typecode, iter(self.example))
914 b = array.array(self.typecode, self.example)
915 self.assertEqual(a, b)
916
917 # non-iterable argument
918 self.assertRaises(TypeError, array.array, self.typecode, 10)
919
920 # pass through errors raised in __iter__
921 class A:
922 def __iter__(self):
923 raise UnicodeError
924 self.assertRaises(UnicodeError, array.array, self.typecode, A())
925
926 # pass through errors raised in next()
927 def B():
928 raise UnicodeError
929 yield None
930 self.assertRaises(UnicodeError, array.array, self.typecode, B())
931
Walter Dörwald7fd94242003-05-18 00:47:47 +0000932 def test_coveritertraverse(self):
933 try:
934 import gc
935 except ImportError:
936 return
937 a = array.array(self.typecode)
938 l = [iter(a)]
939 l.append(l)
940 gc.collect()
941
942 def test_buffer(self):
943 a = array.array(self.typecode, self.example)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000944 m = memoryview(a)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000945 expected = m.tobytes()
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000946 self.assertEqual(a.tobytes(), expected)
947 self.assertEqual(a.tobytes()[0], expected[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000948 # Resizing is forbidden when there are buffer exports.
949 # For issue 4509, we also check after each error that
950 # the array was not modified.
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000951 self.assertRaises(BufferError, a.append, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000952 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000953 self.assertRaises(BufferError, a.extend, a[0:1])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000954 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000955 self.assertRaises(BufferError, a.remove, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000956 self.assertEqual(m.tobytes(), expected)
957 self.assertRaises(BufferError, a.pop, 0)
958 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000959 self.assertRaises(BufferError, a.fromlist, a.tolist())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000960 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000961 self.assertRaises(BufferError, a.frombytes, a.tobytes())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000962 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000963 if self.typecode == 'u':
964 self.assertRaises(BufferError, a.fromunicode, a.tounicode())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000965 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +0000966 self.assertRaises(BufferError, operator.imul, a, 2)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000967 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +0000968 self.assertRaises(BufferError, operator.imul, a, 0)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000969 self.assertEqual(m.tobytes(), expected)
970 self.assertRaises(BufferError, operator.setitem, a, slice(0, 0), a)
971 self.assertEqual(m.tobytes(), expected)
972 self.assertRaises(BufferError, operator.delitem, a, 0)
973 self.assertEqual(m.tobytes(), expected)
974 self.assertRaises(BufferError, operator.delitem, a, slice(0, 1))
975 self.assertEqual(m.tobytes(), expected)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000976
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000977 def test_weakref(self):
978 s = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000979 p = weakref.proxy(s)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000980 self.assertEqual(p.tobytes(), s.tobytes())
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000981 s = None
982 self.assertRaises(ReferenceError, len, p)
983
Skip Montanarod5cf0b82003-08-03 23:02:10 +0000984 def test_bug_782369(self):
985 import sys
Skip Montanaroed9bf122003-08-03 23:30:40 +0000986 if hasattr(sys, "getrefcount"):
987 for i in range(10):
988 b = array.array('B', range(64))
989 rc = sys.getrefcount(10)
990 for i in range(10):
991 b = array.array('B', range(64))
992 self.assertEqual(rc, sys.getrefcount(10))
Skip Montanarod5cf0b82003-08-03 23:02:10 +0000993
Thomas Woutersb2137042007-02-01 18:02:27 +0000994 def test_subclass_with_kwargs(self):
995 # SF bug #1486663 -- this used to erroneously raise a TypeError
996 ArraySubclassWithKwargs('b', newarg=1)
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000997
Guido van Rossum6b826ab2007-07-03 16:22:09 +0000998 def test_create_from_bytes(self):
Alexandre Vassalotti7e4f3212009-07-05 05:38:18 +0000999 # XXX This test probably needs to be moved in a subclass or
1000 # generalized to use self.typecode.
Guido van Rossum6b826ab2007-07-03 16:22:09 +00001001 a = array.array('H', b"1234")
1002 self.assertEqual(len(a) * a.itemsize, 4)
1003
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001004
Walter Dörwald7fd94242003-05-18 00:47:47 +00001005class StringTest(BaseTest):
1006
1007 def test_setitem(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001008 super().test_setitem()
Walter Dörwald7fd94242003-05-18 00:47:47 +00001009 a = array.array(self.typecode, self.example)
1010 self.assertRaises(TypeError, a.__setitem__, 0, self.example[:2])
1011
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001012class UnicodeTest(StringTest):
1013 typecode = 'u'
1014 example = '\x01\u263a\x00\ufeff'
1015 smallerexample = '\x01\u263a\x00\ufefe'
1016 biggerexample = '\x01\u263a\x01\ufeff'
1017 outside = str('\x33')
Ezio Melotti90bf5f12011-10-25 10:05:34 +03001018 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001019
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001020 def test_unicode(self):
1021 self.assertRaises(TypeError, array.array, 'b', 'foo')
Walter Dörwald7fd94242003-05-18 00:47:47 +00001022
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001023 a = array.array('u', '\xa0\xc2\u1234')
1024 a.fromunicode(' ')
1025 a.fromunicode('')
1026 a.fromunicode('')
1027 a.fromunicode('\x11abc\xff\u1234')
1028 s = a.tounicode()
1029 self.assertEqual(s, '\xa0\xc2\u1234 \x11abc\xff\u1234')
Ezio Melotti90bf5f12011-10-25 10:05:34 +03001030 self.assertEqual(a.itemsize, 4)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001031
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001032 s = '\x00="\'a\\b\x80\xff\u0000\u0001\u1234'
1033 a = array.array('u', s)
1034 self.assertEqual(
1035 repr(a),
Georg Brandl559e5d72008-06-11 18:37:52 +00001036 "array('u', '\\x00=\"\\'a\\\\b\\x80\xff\\x00\\x01\u1234')")
Walter Dörwald7fd94242003-05-18 00:47:47 +00001037
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001038 self.assertRaises(TypeError, a.fromunicode)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001039
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001040tests.append(UnicodeTest)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001041
1042class NumberTest(BaseTest):
1043
1044 def test_extslice(self):
1045 a = array.array(self.typecode, range(5))
1046 self.assertEqual(a[::], a)
1047 self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
1048 self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
1049 self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
1050 self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
1051 self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
1052 self.assertEqual(a[-100:100:], a)
1053 self.assertEqual(a[100:-100:-1], a[::-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +00001054 self.assertEqual(a[-100:100:2], array.array(self.typecode, [0,2,4]))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001055 self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
1056 self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
1057
1058 def test_delslice(self):
1059 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001060 del a[::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001061 self.assertEqual(a, array.array(self.typecode, [1,3]))
1062 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001063 del a[1::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001064 self.assertEqual(a, array.array(self.typecode, [0,2,4]))
1065 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001066 del a[1::-2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001067 self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
1068 a = array.array(self.typecode, range(10))
Michael W. Hudson56796f62002-07-29 14:35:04 +00001069 del a[::1000]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001070 self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
Mark Dickinsonbc099642010-01-29 17:27:24 +00001071 # test issue7788
1072 a = array.array(self.typecode, range(10))
1073 del a[9::1<<333]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001074
1075 def test_assignment(self):
1076 a = array.array(self.typecode, range(10))
1077 a[::2] = array.array(self.typecode, [42]*5)
1078 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
1079 a = array.array(self.typecode, range(10))
1080 a[::-4] = array.array(self.typecode, [10]*3)
1081 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
1082 a = array.array(self.typecode, range(4))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001083 a[::-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +00001084 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
1085 a = array.array(self.typecode, range(10))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001086 b = a[:]
1087 c = a[:]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001088 ins = array.array(self.typecode, range(2))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001089 a[2:3] = ins
1090 b[slice(2,3)] = ins
1091 c[2:3:] = ins
Fred Drake004d5e62000-10-23 17:22:08 +00001092
Walter Dörwald7fd94242003-05-18 00:47:47 +00001093 def test_iterationcontains(self):
1094 a = array.array(self.typecode, range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +00001095 self.assertEqual(list(a), list(range(10)))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001096 b = array.array(self.typecode, [20])
1097 self.assertEqual(a[-1] in a, True)
1098 self.assertEqual(b[0] not in a, True)
1099
1100 def check_overflow(self, lower, upper):
1101 # method to be used by subclasses
1102
1103 # should not overflow assigning lower limit
1104 a = array.array(self.typecode, [lower])
1105 a[0] = lower
1106 # should overflow assigning less than lower limit
1107 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
1108 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
1109 # should not overflow assigning upper limit
1110 a = array.array(self.typecode, [upper])
1111 a[0] = upper
1112 # should overflow assigning more than upper limit
1113 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
1114 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
1115
1116 def test_subclassing(self):
1117 typecode = self.typecode
1118 class ExaggeratingArray(array.array):
1119 __slots__ = ['offset']
1120
1121 def __new__(cls, typecode, data, offset):
1122 return array.array.__new__(cls, typecode, data)
1123
1124 def __init__(self, typecode, data, offset):
1125 self.offset = offset
1126
1127 def __getitem__(self, i):
1128 return array.array.__getitem__(self, i) + self.offset
1129
1130 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
1131 self.assertEntryEqual(a[0], 7)
1132
1133 self.assertRaises(AttributeError, setattr, a, "color", "blue")
1134
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00001135 def test_frombytearray(self):
1136 a = array.array('b', range(10))
1137 b = array.array(self.typecode, a)
1138 self.assertEqual(a, b)
1139
Walter Dörwald7fd94242003-05-18 00:47:47 +00001140class SignedNumberTest(NumberTest):
1141 example = [-1, 0, 1, 42, 0x7f]
1142 smallerexample = [-1, 0, 1, 42, 0x7e]
1143 biggerexample = [-1, 0, 1, 43, 0x7f]
1144 outside = 23
1145
1146 def test_overflow(self):
1147 a = array.array(self.typecode)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001148 lower = -1 * int(pow(2, a.itemsize * 8 - 1))
1149 upper = int(pow(2, a.itemsize * 8 - 1)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001150 self.check_overflow(lower, upper)
1151
1152class UnsignedNumberTest(NumberTest):
1153 example = [0, 1, 17, 23, 42, 0xff]
1154 smallerexample = [0, 1, 17, 23, 42, 0xfe]
1155 biggerexample = [0, 1, 17, 23, 43, 0xff]
1156 outside = 0xaa
1157
1158 def test_overflow(self):
1159 a = array.array(self.typecode)
1160 lower = 0
Guido van Rossume2a383d2007-01-15 16:59:06 +00001161 upper = int(pow(2, a.itemsize * 8)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001162 self.check_overflow(lower, upper)
Fred Drake004d5e62000-10-23 17:22:08 +00001163
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001164 def test_bytes_extend(self):
1165 s = bytes(self.example)
1166
1167 a = array.array(self.typecode, self.example)
1168 a.extend(s)
1169 self.assertEqual(
1170 a,
1171 array.array(self.typecode, self.example+self.example)
1172 )
1173
1174 a = array.array(self.typecode, self.example)
1175 a.extend(bytearray(reversed(s)))
1176 self.assertEqual(
1177 a,
1178 array.array(self.typecode, self.example+self.example[::-1])
1179 )
1180
Fred Drake004d5e62000-10-23 17:22:08 +00001181
Walter Dörwald7fd94242003-05-18 00:47:47 +00001182class ByteTest(SignedNumberTest):
1183 typecode = 'b'
1184 minitemsize = 1
1185tests.append(ByteTest)
Fred Drake004d5e62000-10-23 17:22:08 +00001186
Walter Dörwald7fd94242003-05-18 00:47:47 +00001187class UnsignedByteTest(UnsignedNumberTest):
1188 typecode = 'B'
1189 minitemsize = 1
1190tests.append(UnsignedByteTest)
1191
1192class ShortTest(SignedNumberTest):
1193 typecode = 'h'
1194 minitemsize = 2
1195tests.append(ShortTest)
1196
1197class UnsignedShortTest(UnsignedNumberTest):
1198 typecode = 'H'
1199 minitemsize = 2
1200tests.append(UnsignedShortTest)
1201
1202class IntTest(SignedNumberTest):
1203 typecode = 'i'
1204 minitemsize = 2
1205tests.append(IntTest)
1206
1207class UnsignedIntTest(UnsignedNumberTest):
1208 typecode = 'I'
1209 minitemsize = 2
1210tests.append(UnsignedIntTest)
1211
1212class LongTest(SignedNumberTest):
1213 typecode = 'l'
1214 minitemsize = 4
1215tests.append(LongTest)
1216
1217class UnsignedLongTest(UnsignedNumberTest):
1218 typecode = 'L'
1219 minitemsize = 4
1220tests.append(UnsignedLongTest)
1221
Meador Inge1c9f0c92011-09-20 19:55:51 -05001222@unittest.skipIf(not have_long_long, 'need long long support')
1223class LongLongTest(SignedNumberTest):
1224 typecode = 'q'
1225 minitemsize = 8
1226tests.append(LongLongTest)
1227
1228@unittest.skipIf(not have_long_long, 'need long long support')
1229class UnsignedLongLongTest(UnsignedNumberTest):
1230 typecode = 'Q'
1231 minitemsize = 8
1232tests.append(UnsignedLongLongTest)
1233
Walter Dörwald7fd94242003-05-18 00:47:47 +00001234class FPTest(NumberTest):
1235 example = [-42.0, 0, 42, 1e5, -1e10]
1236 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
1237 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
1238 outside = 23
1239
1240 def assertEntryEqual(self, entry1, entry2):
1241 self.assertAlmostEqual(entry1, entry2)
1242
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001243 def test_byteswap(self):
1244 a = array.array(self.typecode, self.example)
1245 self.assertRaises(TypeError, a.byteswap, 42)
1246 if a.itemsize in (1, 2, 4, 8):
1247 b = array.array(self.typecode, self.example)
1248 b.byteswap()
1249 if a.itemsize==1:
1250 self.assertEqual(a, b)
1251 else:
1252 # On alphas treating the byte swapped bit patters as
1253 # floats/doubles results in floating point exceptions
1254 # => compare the 8bit string values instead
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001255 self.assertNotEqual(a.tobytes(), b.tobytes())
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001256 b.byteswap()
1257 self.assertEqual(a, b)
1258
Neal Norwitz35c6cd02003-05-22 13:29:15 +00001259class FloatTest(FPTest):
1260 typecode = 'f'
1261 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001262tests.append(FloatTest)
1263
1264class DoubleTest(FPTest):
1265 typecode = 'd'
1266 minitemsize = 8
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001267
1268 def test_alloc_overflow(self):
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001269 from sys import maxsize
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001270 a = array.array('d', [-1]*65536)
1271 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001272 a *= maxsize//65536 + 1
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001273 except MemoryError:
1274 pass
1275 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001276 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001277 b = array.array('d', [ 2.71828183, 3.14159265, -1])
1278 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001279 b * (maxsize//3 + 1)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001280 except MemoryError:
1281 pass
1282 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001283 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001284
Walter Dörwald7fd94242003-05-18 00:47:47 +00001285tests.append(DoubleTest)
1286
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001287def test_main(verbose=None):
1288 import sys
1289
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001290 support.run_unittest(*tests)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001291
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001292 # verify reference counting
1293 if verbose and hasattr(sys, "gettotalrefcount"):
1294 import gc
1295 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001296 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001297 support.run_unittest(*tests)
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001298 gc.collect()
1299 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001300 print(counts)
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001301
1302if __name__ == "__main__":
1303 test_main(verbose=True)