blob: 604dcdf8a5e51b83b6dbb4f60a8473e42c46f4ca [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):
221 a = array.array(self.typecode, self.example)
222 self.assertRaises(TypeError, a.byteswap, 42)
223 if a.itemsize in (1, 2, 4, 8):
224 b = array.array(self.typecode, self.example)
225 b.byteswap()
226 if a.itemsize==1:
227 self.assertEqual(a, b)
228 else:
229 self.assertNotEqual(a, b)
230 b.byteswap()
231 self.assertEqual(a, b)
Martin v. Löwis99866332002-03-01 10:27:01 +0000232
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000233 def test_copy(self):
234 import copy
235 a = array.array(self.typecode, self.example)
236 b = copy.copy(a)
237 self.assertNotEqual(id(a), id(b))
238 self.assertEqual(a, b)
239
Thomas Wouters89f507f2006-12-13 04:49:30 +0000240 def test_deepcopy(self):
241 import copy
242 a = array.array(self.typecode, self.example)
243 b = copy.deepcopy(a)
244 self.assertNotEqual(id(a), id(b))
245 self.assertEqual(a, b)
246
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000247 def test_reduce_ex(self):
248 a = array.array(self.typecode, self.example)
249 for protocol in range(3):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000250 self.assertIs(a.__reduce_ex__(protocol)[0], array.array)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000251 for protocol in range(3, pickle.HIGHEST_PROTOCOL):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000252 self.assertIs(a.__reduce_ex__(protocol)[0], array_reconstructor)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000253
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000254 def test_pickle(self):
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000255 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000256 a = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000257 b = pickle.loads(pickle.dumps(a, protocol))
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000258 self.assertNotEqual(id(a), id(b))
259 self.assertEqual(a, b)
260
261 a = ArraySubclass(self.typecode, self.example)
262 a.x = 10
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000263 b = pickle.loads(pickle.dumps(a, protocol))
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000264 self.assertNotEqual(id(a), id(b))
265 self.assertEqual(a, b)
266 self.assertEqual(a.x, b.x)
267 self.assertEqual(type(a), type(b))
268
Guido van Rossumd8faa362007-04-27 19:54:29 +0000269 def test_pickle_for_empty_array(self):
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000270 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossumd8faa362007-04-27 19:54:29 +0000271 a = array.array(self.typecode)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000272 b = pickle.loads(pickle.dumps(a, protocol))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000273 self.assertNotEqual(id(a), id(b))
274 self.assertEqual(a, b)
275
276 a = ArraySubclass(self.typecode)
277 a.x = 10
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000278 b = pickle.loads(pickle.dumps(a, protocol))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000279 self.assertNotEqual(id(a), id(b))
280 self.assertEqual(a, b)
281 self.assertEqual(a.x, b.x)
282 self.assertEqual(type(a), type(b))
283
Walter Dörwald7fd94242003-05-18 00:47:47 +0000284 def test_insert(self):
285 a = array.array(self.typecode, self.example)
286 a.insert(0, self.example[0])
287 self.assertEqual(len(a), 1+len(self.example))
288 self.assertEqual(a[0], a[1])
289 self.assertRaises(TypeError, a.insert)
290 self.assertRaises(TypeError, a.insert, None)
Walter Dörwaldba39d9c2003-05-18 01:56:25 +0000291 self.assertRaises(TypeError, a.insert, 0, None)
Martin v. Löwis99866332002-03-01 10:27:01 +0000292
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000293 a = array.array(self.typecode, self.example)
294 a.insert(-1, self.example[0])
295 self.assertEqual(
296 a,
297 array.array(
298 self.typecode,
299 self.example[:-1] + self.example[:1] + self.example[-1:]
300 )
301 )
302
303 a = array.array(self.typecode, self.example)
304 a.insert(-1000, self.example[0])
305 self.assertEqual(
306 a,
307 array.array(self.typecode, self.example[:1] + self.example)
308 )
309
310 a = array.array(self.typecode, self.example)
311 a.insert(1000, self.example[0])
312 self.assertEqual(
313 a,
314 array.array(self.typecode, self.example + self.example[:1])
315 )
316
Walter Dörwald7fd94242003-05-18 00:47:47 +0000317 def test_tofromfile(self):
318 a = array.array(self.typecode, 2*self.example)
319 self.assertRaises(TypeError, a.tofile)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000320 support.unlink(support.TESTFN)
321 f = open(support.TESTFN, 'wb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000322 try:
323 a.tofile(f)
324 f.close()
325 b = array.array(self.typecode)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000326 f = open(support.TESTFN, 'rb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000327 self.assertRaises(TypeError, b.fromfile)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000328 b.fromfile(f, len(self.example))
329 self.assertEqual(b, array.array(self.typecode, self.example))
330 self.assertNotEqual(a, b)
Hirokazu Yamamoto54d0df62009-03-06 03:04:07 +0000331 self.assertRaises(EOFError, b.fromfile, f, len(self.example)+1)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000332 self.assertEqual(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000333 f.close()
334 finally:
335 if not f.closed:
336 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000337 support.unlink(support.TESTFN)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000338
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000339 def test_fromfile_ioerror(self):
340 # Issue #5395: Check if fromfile raises a proper IOError
341 # instead of EOFError.
342 a = array.array(self.typecode)
343 f = open(support.TESTFN, 'wb')
344 try:
345 self.assertRaises(IOError, a.fromfile, f, len(self.example))
346 finally:
347 f.close()
348 support.unlink(support.TESTFN)
349
Frank Wierzbicki17683432009-08-16 20:30:12 +0000350 def test_filewrite(self):
351 a = array.array(self.typecode, 2*self.example)
352 f = open(support.TESTFN, 'wb')
353 try:
354 f.write(a)
355 f.close()
356 b = array.array(self.typecode)
357 f = open(support.TESTFN, 'rb')
358 b.fromfile(f, len(self.example))
359 self.assertEqual(b, array.array(self.typecode, self.example))
360 self.assertNotEqual(a, b)
361 b.fromfile(f, len(self.example))
362 self.assertEqual(a, b)
363 f.close()
364 finally:
365 if not f.closed:
366 f.close()
367 support.unlink(support.TESTFN)
368
Walter Dörwald7fd94242003-05-18 00:47:47 +0000369 def test_tofromlist(self):
370 a = array.array(self.typecode, 2*self.example)
371 b = array.array(self.typecode)
372 self.assertRaises(TypeError, a.tolist, 42)
373 self.assertRaises(TypeError, b.fromlist)
374 self.assertRaises(TypeError, b.fromlist, 42)
375 self.assertRaises(TypeError, b.fromlist, [None])
376 b.fromlist(a.tolist())
377 self.assertEqual(a, b)
Fred Drake78334472000-06-28 17:50:51 +0000378
Walter Dörwald7fd94242003-05-18 00:47:47 +0000379 def test_tofromstring(self):
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000380 nb_warnings = 4
381 with warnings.catch_warnings(record=True) as r:
382 warnings.filterwarnings("always",
383 message=r"(to|from)string\(\) is deprecated",
384 category=DeprecationWarning)
385 a = array.array(self.typecode, 2*self.example)
386 b = array.array(self.typecode)
387 self.assertRaises(TypeError, a.tostring, 42)
388 self.assertRaises(TypeError, b.fromstring)
389 self.assertRaises(TypeError, b.fromstring, 42)
390 b.fromstring(a.tostring())
391 self.assertEqual(a, b)
392 if a.itemsize>1:
393 self.assertRaises(ValueError, b.fromstring, "x")
394 nb_warnings += 1
395 self.assertEqual(len(r), nb_warnings)
396
397 def test_tofrombytes(self):
Walter Dörwald7fd94242003-05-18 00:47:47 +0000398 a = array.array(self.typecode, 2*self.example)
399 b = array.array(self.typecode)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000400 self.assertRaises(TypeError, a.tobytes, 42)
401 self.assertRaises(TypeError, b.frombytes)
402 self.assertRaises(TypeError, b.frombytes, 42)
403 b.frombytes(a.tobytes())
404 c = array.array(self.typecode, bytearray(a.tobytes()))
Walter Dörwald7fd94242003-05-18 00:47:47 +0000405 self.assertEqual(a, b)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000406 self.assertEqual(a, c)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000407 if a.itemsize>1:
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000408 self.assertRaises(ValueError, b.frombytes, b"x")
Fred Drake78334472000-06-28 17:50:51 +0000409
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +0000410 def test_fromarray(self):
411 a = array.array(self.typecode, self.example)
412 b = array.array(self.typecode, a)
413 self.assertEqual(a, b)
414
Walter Dörwald7fd94242003-05-18 00:47:47 +0000415 def test_repr(self):
416 a = array.array(self.typecode, 2*self.example)
417 self.assertEqual(a, eval(repr(a), {"array": array.array}))
Fred Drake78334472000-06-28 17:50:51 +0000418
Walter Dörwald7fd94242003-05-18 00:47:47 +0000419 a = array.array(self.typecode)
420 self.assertEqual(repr(a), "array('%s')" % self.typecode)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000421
Walter Dörwald7fd94242003-05-18 00:47:47 +0000422 def test_str(self):
423 a = array.array(self.typecode, 2*self.example)
424 str(a)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000425
Walter Dörwald7fd94242003-05-18 00:47:47 +0000426 def test_cmp(self):
427 a = array.array(self.typecode, self.example)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000428 self.assertTrue((a == 42) is False)
429 self.assertTrue((a != 42) is True)
Tim Peterscc78e472000-11-14 21:36:07 +0000430
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000431 self.assertTrue((a == a) is True)
432 self.assertTrue((a != a) is False)
433 self.assertTrue((a < a) is False)
434 self.assertTrue((a <= a) is True)
435 self.assertTrue((a > a) is False)
436 self.assertTrue((a >= a) is True)
Tim Peterscc78e472000-11-14 21:36:07 +0000437
Neal Norwitzbd2835c2006-03-17 08:54:15 +0000438 al = array.array(self.typecode, self.smallerexample)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000439 ab = array.array(self.typecode, self.biggerexample)
Guido van Rossum7f1d3aa1998-07-16 15:31:43 +0000440
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000441 self.assertTrue((a == 2*a) is False)
442 self.assertTrue((a != 2*a) is True)
443 self.assertTrue((a < 2*a) is True)
444 self.assertTrue((a <= 2*a) is True)
445 self.assertTrue((a > 2*a) is False)
446 self.assertTrue((a >= 2*a) is False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000447
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000448 self.assertTrue((a == al) is False)
449 self.assertTrue((a != al) is True)
450 self.assertTrue((a < al) is False)
451 self.assertTrue((a <= al) is False)
452 self.assertTrue((a > al) is True)
453 self.assertTrue((a >= al) is True)
Martin v. Löwis99866332002-03-01 10:27:01 +0000454
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000455 self.assertTrue((a == ab) is False)
456 self.assertTrue((a != ab) is True)
457 self.assertTrue((a < ab) is True)
458 self.assertTrue((a <= ab) is True)
459 self.assertTrue((a > ab) is False)
460 self.assertTrue((a >= ab) is False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000461
Walter Dörwald7fd94242003-05-18 00:47:47 +0000462 def test_add(self):
463 a = array.array(self.typecode, self.example) \
464 + array.array(self.typecode, self.example[::-1])
465 self.assertEqual(
466 a,
467 array.array(self.typecode, self.example + self.example[::-1])
468 )
Martin v. Löwis99866332002-03-01 10:27:01 +0000469
Walter Dörwald7fd94242003-05-18 00:47:47 +0000470 b = array.array(self.badtypecode())
471 self.assertRaises(TypeError, a.__add__, b)
472
473 self.assertRaises(TypeError, a.__add__, "bad")
474
475 def test_iadd(self):
476 a = array.array(self.typecode, self.example[::-1])
477 b = a
478 a += array.array(self.typecode, 2*self.example)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000479 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000480 self.assertEqual(
481 a,
482 array.array(self.typecode, self.example[::-1]+2*self.example)
483 )
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000484 a = array.array(self.typecode, self.example)
485 a += a
486 self.assertEqual(
487 a,
488 array.array(self.typecode, self.example + self.example)
489 )
Walter Dörwald7fd94242003-05-18 00:47:47 +0000490
491 b = array.array(self.badtypecode())
492 self.assertRaises(TypeError, a.__add__, b)
493
494 self.assertRaises(TypeError, a.__iadd__, "bad")
495
496 def test_mul(self):
497 a = 5*array.array(self.typecode, self.example)
498 self.assertEqual(
499 a,
500 array.array(self.typecode, 5*self.example)
501 )
502
503 a = array.array(self.typecode, self.example)*5
504 self.assertEqual(
505 a,
506 array.array(self.typecode, self.example*5)
507 )
508
509 a = 0*array.array(self.typecode, self.example)
510 self.assertEqual(
511 a,
512 array.array(self.typecode)
513 )
514
515 a = (-1)*array.array(self.typecode, self.example)
516 self.assertEqual(
517 a,
518 array.array(self.typecode)
519 )
520
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000521 a = 5 * array.array(self.typecode, self.example[:1])
522 self.assertEqual(
523 a,
524 array.array(self.typecode, [a[0]] * 5)
525 )
526
Walter Dörwald7fd94242003-05-18 00:47:47 +0000527 self.assertRaises(TypeError, a.__mul__, "bad")
528
529 def test_imul(self):
530 a = array.array(self.typecode, self.example)
531 b = a
532
533 a *= 5
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000534 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000535 self.assertEqual(
536 a,
537 array.array(self.typecode, 5*self.example)
538 )
539
540 a *= 0
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000541 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000542 self.assertEqual(a, array.array(self.typecode))
543
544 a *= 1000
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 *= -1
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 = array.array(self.typecode, self.example)
553 a *= -1
554 self.assertEqual(a, array.array(self.typecode))
555
556 self.assertRaises(TypeError, a.__imul__, "bad")
557
558 def test_getitem(self):
559 a = array.array(self.typecode, self.example)
560 self.assertEntryEqual(a[0], self.example[0])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000561 self.assertEntryEqual(a[0], self.example[0])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000562 self.assertEntryEqual(a[-1], self.example[-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000563 self.assertEntryEqual(a[-1], self.example[-1])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000564 self.assertEntryEqual(a[len(self.example)-1], self.example[-1])
565 self.assertEntryEqual(a[-len(self.example)], self.example[0])
566 self.assertRaises(TypeError, a.__getitem__)
567 self.assertRaises(IndexError, a.__getitem__, len(self.example))
568 self.assertRaises(IndexError, a.__getitem__, -len(self.example)-1)
569
570 def test_setitem(self):
571 a = array.array(self.typecode, self.example)
572 a[0] = a[-1]
573 self.assertEntryEqual(a[0], a[-1])
574
575 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000576 a[0] = a[-1]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000577 self.assertEntryEqual(a[0], a[-1])
578
579 a = array.array(self.typecode, self.example)
580 a[-1] = a[0]
581 self.assertEntryEqual(a[0], a[-1])
582
583 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000584 a[-1] = a[0]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000585 self.assertEntryEqual(a[0], a[-1])
586
587 a = array.array(self.typecode, self.example)
588 a[len(self.example)-1] = a[0]
589 self.assertEntryEqual(a[0], a[-1])
590
591 a = array.array(self.typecode, self.example)
592 a[-len(self.example)] = a[-1]
593 self.assertEntryEqual(a[0], a[-1])
594
595 self.assertRaises(TypeError, a.__setitem__)
596 self.assertRaises(TypeError, a.__setitem__, None)
597 self.assertRaises(TypeError, a.__setitem__, 0, None)
598 self.assertRaises(
599 IndexError,
600 a.__setitem__,
601 len(self.example), self.example[0]
602 )
603 self.assertRaises(
604 IndexError,
605 a.__setitem__,
606 -len(self.example)-1, self.example[0]
607 )
608
609 def test_delitem(self):
610 a = array.array(self.typecode, self.example)
611 del a[0]
612 self.assertEqual(
613 a,
614 array.array(self.typecode, self.example[1:])
615 )
616
617 a = array.array(self.typecode, self.example)
618 del a[-1]
619 self.assertEqual(
620 a,
621 array.array(self.typecode, self.example[:-1])
622 )
623
624 a = array.array(self.typecode, self.example)
625 del a[len(self.example)-1]
626 self.assertEqual(
627 a,
628 array.array(self.typecode, self.example[:-1])
629 )
630
631 a = array.array(self.typecode, self.example)
632 del a[-len(self.example)]
633 self.assertEqual(
634 a,
635 array.array(self.typecode, self.example[1:])
636 )
637
638 self.assertRaises(TypeError, a.__delitem__)
639 self.assertRaises(TypeError, a.__delitem__, None)
640 self.assertRaises(IndexError, a.__delitem__, len(self.example))
641 self.assertRaises(IndexError, a.__delitem__, -len(self.example)-1)
642
643 def test_getslice(self):
644 a = array.array(self.typecode, self.example)
645 self.assertEqual(a[:], a)
646
647 self.assertEqual(
648 a[1:],
649 array.array(self.typecode, self.example[1:])
650 )
651
652 self.assertEqual(
653 a[:1],
654 array.array(self.typecode, self.example[:1])
655 )
656
657 self.assertEqual(
658 a[:-1],
659 array.array(self.typecode, self.example[:-1])
660 )
661
662 self.assertEqual(
663 a[-1:],
664 array.array(self.typecode, self.example[-1:])
665 )
666
667 self.assertEqual(
668 a[-1:-1],
669 array.array(self.typecode)
670 )
671
672 self.assertEqual(
Walter Dörwald1083c242005-01-21 21:16:51 +0000673 a[2:1],
674 array.array(self.typecode)
675 )
676
677 self.assertEqual(
Walter Dörwald7fd94242003-05-18 00:47:47 +0000678 a[1000:],
679 array.array(self.typecode)
680 )
681 self.assertEqual(a[-1000:], a)
682 self.assertEqual(a[:1000], a)
683 self.assertEqual(
684 a[:-1000],
685 array.array(self.typecode)
686 )
687 self.assertEqual(a[-1000:1000], a)
688 self.assertEqual(
689 a[2000:1000],
690 array.array(self.typecode)
691 )
692
Thomas Woutersed03b412007-08-28 21:37:11 +0000693 def test_extended_getslice(self):
694 # Test extended slicing by comparing with list slicing
695 # (Assumes list conversion works correctly, too)
696 a = array.array(self.typecode, self.example)
697 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
698 for start in indices:
699 for stop in indices:
700 # Everything except the initial 0 (invalid step)
701 for step in indices[1:]:
702 self.assertEqual(list(a[start:stop:step]),
703 list(a)[start:stop:step])
704
Walter Dörwald7fd94242003-05-18 00:47:47 +0000705 def test_setslice(self):
706 a = array.array(self.typecode, self.example)
707 a[:1] = a
708 self.assertEqual(
709 a,
710 array.array(self.typecode, self.example + self.example[1:])
711 )
712
713 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000714 a[:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000715 self.assertEqual(
716 a,
717 array.array(self.typecode, self.example + self.example[-1:])
718 )
719
720 a = array.array(self.typecode, self.example)
721 a[-1:] = a
722 self.assertEqual(
723 a,
724 array.array(self.typecode, self.example[:-1] + self.example)
725 )
726
727 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000728 a[1:] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000729 self.assertEqual(
730 a,
731 array.array(self.typecode, self.example[:1] + self.example)
732 )
733
734 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000735 a[1:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000736 self.assertEqual(
737 a,
738 array.array(
739 self.typecode,
740 self.example[:1] + self.example + self.example[-1:]
741 )
742 )
743
744 a = array.array(self.typecode, self.example)
745 a[1000:] = a
746 self.assertEqual(
747 a,
748 array.array(self.typecode, 2*self.example)
749 )
750
751 a = array.array(self.typecode, self.example)
752 a[-1000:] = a
753 self.assertEqual(
754 a,
755 array.array(self.typecode, self.example)
756 )
757
758 a = array.array(self.typecode, self.example)
759 a[:1000] = a
760 self.assertEqual(
761 a,
762 array.array(self.typecode, self.example)
763 )
764
765 a = array.array(self.typecode, self.example)
766 a[:-1000] = a
767 self.assertEqual(
768 a,
769 array.array(self.typecode, 2*self.example)
770 )
771
772 a = array.array(self.typecode, self.example)
773 a[1:0] = a
774 self.assertEqual(
775 a,
776 array.array(self.typecode, self.example[:1] + self.example + self.example[1:])
777 )
778
779 a = array.array(self.typecode, self.example)
780 a[2000:1000] = a
781 self.assertEqual(
782 a,
783 array.array(self.typecode, 2*self.example)
784 )
785
786 a = array.array(self.typecode, self.example)
Thomas Woutersed03b412007-08-28 21:37:11 +0000787 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), None)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000788 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), None)
789
790 b = array.array(self.badtypecode())
Thomas Woutersed03b412007-08-28 21:37:11 +0000791 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000792 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), b)
793
Thomas Woutersed03b412007-08-28 21:37:11 +0000794 def test_extended_set_del_slice(self):
795 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
796 for start in indices:
797 for stop in indices:
798 # Everything except the initial 0 (invalid step)
799 for step in indices[1:]:
800 a = array.array(self.typecode, self.example)
801 L = list(a)
802 # Make sure we have a slice of exactly the right length,
803 # but with (hopefully) different data.
804 data = L[start:stop:step]
805 data.reverse()
806 L[start:stop:step] = data
807 a[start:stop:step] = array.array(self.typecode, data)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000808 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000809
810 del L[start:stop:step]
811 del a[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +0000812 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000813
Walter Dörwald7fd94242003-05-18 00:47:47 +0000814 def test_index(self):
815 example = 2*self.example
816 a = array.array(self.typecode, example)
817 self.assertRaises(TypeError, a.index)
818 for x in example:
819 self.assertEqual(a.index(x), example.index(x))
820 self.assertRaises(ValueError, a.index, None)
821 self.assertRaises(ValueError, a.index, self.outside)
822
823 def test_count(self):
824 example = 2*self.example
825 a = array.array(self.typecode, example)
826 self.assertRaises(TypeError, a.count)
827 for x in example:
828 self.assertEqual(a.count(x), example.count(x))
829 self.assertEqual(a.count(self.outside), 0)
830 self.assertEqual(a.count(None), 0)
831
832 def test_remove(self):
833 for x in self.example:
834 example = 2*self.example
835 a = array.array(self.typecode, example)
836 pos = example.index(x)
837 example2 = example[:pos] + example[pos+1:]
838 a.remove(x)
839 self.assertEqual(a, array.array(self.typecode, example2))
840
841 a = array.array(self.typecode, self.example)
842 self.assertRaises(ValueError, a.remove, self.outside)
843
844 self.assertRaises(ValueError, a.remove, None)
845
846 def test_pop(self):
847 a = array.array(self.typecode)
848 self.assertRaises(IndexError, a.pop)
849
850 a = array.array(self.typecode, 2*self.example)
851 self.assertRaises(TypeError, a.pop, 42, 42)
852 self.assertRaises(TypeError, a.pop, None)
853 self.assertRaises(IndexError, a.pop, len(a))
854 self.assertRaises(IndexError, a.pop, -len(a)-1)
855
856 self.assertEntryEqual(a.pop(0), self.example[0])
857 self.assertEqual(
858 a,
859 array.array(self.typecode, self.example[1:]+self.example)
860 )
861 self.assertEntryEqual(a.pop(1), self.example[2])
862 self.assertEqual(
863 a,
864 array.array(self.typecode, self.example[1:2]+self.example[3:]+self.example)
865 )
866 self.assertEntryEqual(a.pop(0), self.example[1])
867 self.assertEntryEqual(a.pop(), self.example[-1])
868 self.assertEqual(
869 a,
870 array.array(self.typecode, self.example[3:]+self.example[:-1])
871 )
872
873 def test_reverse(self):
874 a = array.array(self.typecode, self.example)
875 self.assertRaises(TypeError, a.reverse, 42)
Fred Drake004d5e62000-10-23 17:22:08 +0000876 a.reverse()
Walter Dörwald7fd94242003-05-18 00:47:47 +0000877 self.assertEqual(
878 a,
879 array.array(self.typecode, self.example[::-1])
880 )
881
882 def test_extend(self):
883 a = array.array(self.typecode, self.example)
884 self.assertRaises(TypeError, a.extend)
885 a.extend(array.array(self.typecode, self.example[::-1]))
886 self.assertEqual(
887 a,
888 array.array(self.typecode, self.example+self.example[::-1])
889 )
890
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000891 a = array.array(self.typecode, self.example)
892 a.extend(a)
893 self.assertEqual(
894 a,
895 array.array(self.typecode, self.example+self.example)
896 )
897
Walter Dörwald7fd94242003-05-18 00:47:47 +0000898 b = array.array(self.badtypecode())
899 self.assertRaises(TypeError, a.extend, b)
900
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000901 a = array.array(self.typecode, self.example)
902 a.extend(self.example[::-1])
903 self.assertEqual(
904 a,
905 array.array(self.typecode, self.example+self.example[::-1])
906 )
907
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +0000908 def test_constructor_with_iterable_argument(self):
909 a = array.array(self.typecode, iter(self.example))
910 b = array.array(self.typecode, self.example)
911 self.assertEqual(a, b)
912
913 # non-iterable argument
914 self.assertRaises(TypeError, array.array, self.typecode, 10)
915
916 # pass through errors raised in __iter__
917 class A:
918 def __iter__(self):
919 raise UnicodeError
920 self.assertRaises(UnicodeError, array.array, self.typecode, A())
921
922 # pass through errors raised in next()
923 def B():
924 raise UnicodeError
925 yield None
926 self.assertRaises(UnicodeError, array.array, self.typecode, B())
927
Walter Dörwald7fd94242003-05-18 00:47:47 +0000928 def test_coveritertraverse(self):
929 try:
930 import gc
931 except ImportError:
932 return
933 a = array.array(self.typecode)
934 l = [iter(a)]
935 l.append(l)
936 gc.collect()
937
938 def test_buffer(self):
939 a = array.array(self.typecode, self.example)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000940 m = memoryview(a)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000941 expected = m.tobytes()
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000942 self.assertEqual(a.tobytes(), expected)
943 self.assertEqual(a.tobytes()[0], expected[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000944 # Resizing is forbidden when there are buffer exports.
945 # For issue 4509, we also check after each error that
946 # the array was not modified.
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000947 self.assertRaises(BufferError, a.append, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000948 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000949 self.assertRaises(BufferError, a.extend, a[0:1])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000950 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000951 self.assertRaises(BufferError, a.remove, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000952 self.assertEqual(m.tobytes(), expected)
953 self.assertRaises(BufferError, a.pop, 0)
954 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000955 self.assertRaises(BufferError, a.fromlist, a.tolist())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000956 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000957 self.assertRaises(BufferError, a.frombytes, a.tobytes())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000958 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000959 if self.typecode == 'u':
960 self.assertRaises(BufferError, a.fromunicode, a.tounicode())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000961 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +0000962 self.assertRaises(BufferError, operator.imul, a, 2)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000963 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +0000964 self.assertRaises(BufferError, operator.imul, a, 0)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000965 self.assertEqual(m.tobytes(), expected)
966 self.assertRaises(BufferError, operator.setitem, a, slice(0, 0), a)
967 self.assertEqual(m.tobytes(), expected)
968 self.assertRaises(BufferError, operator.delitem, a, 0)
969 self.assertEqual(m.tobytes(), expected)
970 self.assertRaises(BufferError, operator.delitem, a, slice(0, 1))
971 self.assertEqual(m.tobytes(), expected)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000972
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000973 def test_weakref(self):
974 s = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000975 p = weakref.proxy(s)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000976 self.assertEqual(p.tobytes(), s.tobytes())
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000977 s = None
978 self.assertRaises(ReferenceError, len, p)
979
Skip Montanarod5cf0b82003-08-03 23:02:10 +0000980 def test_bug_782369(self):
981 import sys
Skip Montanaroed9bf122003-08-03 23:30:40 +0000982 if hasattr(sys, "getrefcount"):
983 for i in range(10):
984 b = array.array('B', range(64))
985 rc = sys.getrefcount(10)
986 for i in range(10):
987 b = array.array('B', range(64))
988 self.assertEqual(rc, sys.getrefcount(10))
Skip Montanarod5cf0b82003-08-03 23:02:10 +0000989
Thomas Woutersb2137042007-02-01 18:02:27 +0000990 def test_subclass_with_kwargs(self):
991 # SF bug #1486663 -- this used to erroneously raise a TypeError
992 ArraySubclassWithKwargs('b', newarg=1)
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000993
Guido van Rossum6b826ab2007-07-03 16:22:09 +0000994 def test_create_from_bytes(self):
Alexandre Vassalotti7e4f3212009-07-05 05:38:18 +0000995 # XXX This test probably needs to be moved in a subclass or
996 # generalized to use self.typecode.
Guido van Rossum6b826ab2007-07-03 16:22:09 +0000997 a = array.array('H', b"1234")
998 self.assertEqual(len(a) * a.itemsize, 4)
999
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001000
Walter Dörwald7fd94242003-05-18 00:47:47 +00001001class StringTest(BaseTest):
1002
1003 def test_setitem(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001004 super().test_setitem()
Walter Dörwald7fd94242003-05-18 00:47:47 +00001005 a = array.array(self.typecode, self.example)
1006 self.assertRaises(TypeError, a.__setitem__, 0, self.example[:2])
1007
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001008class UnicodeTest(StringTest):
1009 typecode = 'u'
1010 example = '\x01\u263a\x00\ufeff'
1011 smallerexample = '\x01\u263a\x00\ufefe'
1012 biggerexample = '\x01\u263a\x01\ufeff'
1013 outside = str('\x33')
1014 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001015
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001016 def test_unicode(self):
1017 self.assertRaises(TypeError, array.array, 'b', 'foo')
Walter Dörwald7fd94242003-05-18 00:47:47 +00001018
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001019 a = array.array('u', '\xa0\xc2\u1234')
1020 a.fromunicode(' ')
1021 a.fromunicode('')
1022 a.fromunicode('')
1023 a.fromunicode('\x11abc\xff\u1234')
1024 s = a.tounicode()
1025 self.assertEqual(s, '\xa0\xc2\u1234 \x11abc\xff\u1234')
Walter Dörwald7fd94242003-05-18 00:47:47 +00001026
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001027 s = '\x00="\'a\\b\x80\xff\u0000\u0001\u1234'
1028 a = array.array('u', s)
1029 self.assertEqual(
1030 repr(a),
Georg Brandl559e5d72008-06-11 18:37:52 +00001031 "array('u', '\\x00=\"\\'a\\\\b\\x80\xff\\x00\\x01\u1234')")
Walter Dörwald7fd94242003-05-18 00:47:47 +00001032
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001033 self.assertRaises(TypeError, a.fromunicode)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001034
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001035tests.append(UnicodeTest)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001036
1037class NumberTest(BaseTest):
1038
1039 def test_extslice(self):
1040 a = array.array(self.typecode, range(5))
1041 self.assertEqual(a[::], a)
1042 self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
1043 self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
1044 self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
1045 self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
1046 self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
1047 self.assertEqual(a[-100:100:], a)
1048 self.assertEqual(a[100:-100:-1], a[::-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +00001049 self.assertEqual(a[-100:100:2], array.array(self.typecode, [0,2,4]))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001050 self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
1051 self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
1052
1053 def test_delslice(self):
1054 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001055 del a[::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001056 self.assertEqual(a, array.array(self.typecode, [1,3]))
1057 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001058 del a[1::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001059 self.assertEqual(a, array.array(self.typecode, [0,2,4]))
1060 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001061 del a[1::-2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001062 self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
1063 a = array.array(self.typecode, range(10))
Michael W. Hudson56796f62002-07-29 14:35:04 +00001064 del a[::1000]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001065 self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
Mark Dickinsonbc099642010-01-29 17:27:24 +00001066 # test issue7788
1067 a = array.array(self.typecode, range(10))
1068 del a[9::1<<333]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001069
1070 def test_assignment(self):
1071 a = array.array(self.typecode, range(10))
1072 a[::2] = array.array(self.typecode, [42]*5)
1073 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
1074 a = array.array(self.typecode, range(10))
1075 a[::-4] = array.array(self.typecode, [10]*3)
1076 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
1077 a = array.array(self.typecode, range(4))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001078 a[::-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +00001079 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
1080 a = array.array(self.typecode, range(10))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001081 b = a[:]
1082 c = a[:]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001083 ins = array.array(self.typecode, range(2))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001084 a[2:3] = ins
1085 b[slice(2,3)] = ins
1086 c[2:3:] = ins
Fred Drake004d5e62000-10-23 17:22:08 +00001087
Walter Dörwald7fd94242003-05-18 00:47:47 +00001088 def test_iterationcontains(self):
1089 a = array.array(self.typecode, range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +00001090 self.assertEqual(list(a), list(range(10)))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001091 b = array.array(self.typecode, [20])
1092 self.assertEqual(a[-1] in a, True)
1093 self.assertEqual(b[0] not in a, True)
1094
1095 def check_overflow(self, lower, upper):
1096 # method to be used by subclasses
1097
1098 # should not overflow assigning lower limit
1099 a = array.array(self.typecode, [lower])
1100 a[0] = lower
1101 # should overflow assigning less than lower limit
1102 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
1103 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
1104 # should not overflow assigning upper limit
1105 a = array.array(self.typecode, [upper])
1106 a[0] = upper
1107 # should overflow assigning more than upper limit
1108 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
1109 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
1110
1111 def test_subclassing(self):
1112 typecode = self.typecode
1113 class ExaggeratingArray(array.array):
1114 __slots__ = ['offset']
1115
1116 def __new__(cls, typecode, data, offset):
1117 return array.array.__new__(cls, typecode, data)
1118
1119 def __init__(self, typecode, data, offset):
1120 self.offset = offset
1121
1122 def __getitem__(self, i):
1123 return array.array.__getitem__(self, i) + self.offset
1124
1125 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
1126 self.assertEntryEqual(a[0], 7)
1127
1128 self.assertRaises(AttributeError, setattr, a, "color", "blue")
1129
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00001130 def test_frombytearray(self):
1131 a = array.array('b', range(10))
1132 b = array.array(self.typecode, a)
1133 self.assertEqual(a, b)
1134
Walter Dörwald7fd94242003-05-18 00:47:47 +00001135class SignedNumberTest(NumberTest):
1136 example = [-1, 0, 1, 42, 0x7f]
1137 smallerexample = [-1, 0, 1, 42, 0x7e]
1138 biggerexample = [-1, 0, 1, 43, 0x7f]
1139 outside = 23
1140
1141 def test_overflow(self):
1142 a = array.array(self.typecode)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001143 lower = -1 * int(pow(2, a.itemsize * 8 - 1))
1144 upper = int(pow(2, a.itemsize * 8 - 1)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001145 self.check_overflow(lower, upper)
1146
1147class UnsignedNumberTest(NumberTest):
1148 example = [0, 1, 17, 23, 42, 0xff]
1149 smallerexample = [0, 1, 17, 23, 42, 0xfe]
1150 biggerexample = [0, 1, 17, 23, 43, 0xff]
1151 outside = 0xaa
1152
1153 def test_overflow(self):
1154 a = array.array(self.typecode)
1155 lower = 0
Guido van Rossume2a383d2007-01-15 16:59:06 +00001156 upper = int(pow(2, a.itemsize * 8)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001157 self.check_overflow(lower, upper)
Fred Drake004d5e62000-10-23 17:22:08 +00001158
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001159 def test_bytes_extend(self):
1160 s = bytes(self.example)
1161
1162 a = array.array(self.typecode, self.example)
1163 a.extend(s)
1164 self.assertEqual(
1165 a,
1166 array.array(self.typecode, self.example+self.example)
1167 )
1168
1169 a = array.array(self.typecode, self.example)
1170 a.extend(bytearray(reversed(s)))
1171 self.assertEqual(
1172 a,
1173 array.array(self.typecode, self.example+self.example[::-1])
1174 )
1175
Fred Drake004d5e62000-10-23 17:22:08 +00001176
Walter Dörwald7fd94242003-05-18 00:47:47 +00001177class ByteTest(SignedNumberTest):
1178 typecode = 'b'
1179 minitemsize = 1
1180tests.append(ByteTest)
Fred Drake004d5e62000-10-23 17:22:08 +00001181
Walter Dörwald7fd94242003-05-18 00:47:47 +00001182class UnsignedByteTest(UnsignedNumberTest):
1183 typecode = 'B'
1184 minitemsize = 1
1185tests.append(UnsignedByteTest)
1186
1187class ShortTest(SignedNumberTest):
1188 typecode = 'h'
1189 minitemsize = 2
1190tests.append(ShortTest)
1191
1192class UnsignedShortTest(UnsignedNumberTest):
1193 typecode = 'H'
1194 minitemsize = 2
1195tests.append(UnsignedShortTest)
1196
1197class IntTest(SignedNumberTest):
1198 typecode = 'i'
1199 minitemsize = 2
1200tests.append(IntTest)
1201
1202class UnsignedIntTest(UnsignedNumberTest):
1203 typecode = 'I'
1204 minitemsize = 2
1205tests.append(UnsignedIntTest)
1206
1207class LongTest(SignedNumberTest):
1208 typecode = 'l'
1209 minitemsize = 4
1210tests.append(LongTest)
1211
1212class UnsignedLongTest(UnsignedNumberTest):
1213 typecode = 'L'
1214 minitemsize = 4
1215tests.append(UnsignedLongTest)
1216
Meador Inge1c9f0c92011-09-20 19:55:51 -05001217@unittest.skipIf(not have_long_long, 'need long long support')
1218class LongLongTest(SignedNumberTest):
1219 typecode = 'q'
1220 minitemsize = 8
1221tests.append(LongLongTest)
1222
1223@unittest.skipIf(not have_long_long, 'need long long support')
1224class UnsignedLongLongTest(UnsignedNumberTest):
1225 typecode = 'Q'
1226 minitemsize = 8
1227tests.append(UnsignedLongLongTest)
1228
Walter Dörwald7fd94242003-05-18 00:47:47 +00001229class FPTest(NumberTest):
1230 example = [-42.0, 0, 42, 1e5, -1e10]
1231 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
1232 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
1233 outside = 23
1234
1235 def assertEntryEqual(self, entry1, entry2):
1236 self.assertAlmostEqual(entry1, entry2)
1237
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001238 def test_byteswap(self):
1239 a = array.array(self.typecode, self.example)
1240 self.assertRaises(TypeError, a.byteswap, 42)
1241 if a.itemsize in (1, 2, 4, 8):
1242 b = array.array(self.typecode, self.example)
1243 b.byteswap()
1244 if a.itemsize==1:
1245 self.assertEqual(a, b)
1246 else:
1247 # On alphas treating the byte swapped bit patters as
1248 # floats/doubles results in floating point exceptions
1249 # => compare the 8bit string values instead
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001250 self.assertNotEqual(a.tobytes(), b.tobytes())
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001251 b.byteswap()
1252 self.assertEqual(a, b)
1253
Neal Norwitz35c6cd02003-05-22 13:29:15 +00001254class FloatTest(FPTest):
1255 typecode = 'f'
1256 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001257tests.append(FloatTest)
1258
1259class DoubleTest(FPTest):
1260 typecode = 'd'
1261 minitemsize = 8
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001262
1263 def test_alloc_overflow(self):
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001264 from sys import maxsize
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001265 a = array.array('d', [-1]*65536)
1266 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001267 a *= maxsize//65536 + 1
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001268 except MemoryError:
1269 pass
1270 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001271 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001272 b = array.array('d', [ 2.71828183, 3.14159265, -1])
1273 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001274 b * (maxsize//3 + 1)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001275 except MemoryError:
1276 pass
1277 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001278 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001279
Walter Dörwald7fd94242003-05-18 00:47:47 +00001280tests.append(DoubleTest)
1281
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001282def test_main(verbose=None):
1283 import sys
1284
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001285 support.run_unittest(*tests)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001286
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001287 # verify reference counting
1288 if verbose and hasattr(sys, "gettotalrefcount"):
1289 import gc
1290 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001291 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001292 support.run_unittest(*tests)
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001293 gc.collect()
1294 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001295 print(counts)
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001296
1297if __name__ == "__main__":
1298 test_main(verbose=True)