blob: bdcd1254b304ff87be60110ab08d8a8e69c0707d [file] [log] [blame]
Roger E. Masse8db1b071996-12-09 20:09:16 +00001"""Test the arraymodule.
Roger E. Massefab8ab81996-12-20 22:36:52 +00002 Roger E. Masse
Roger E. Masse8db1b071996-12-09 20:09:16 +00003"""
Roger E. Massefab8ab81996-12-20 22:36:52 +00004
Pablo Galindoe51dd9d2020-07-05 22:43:14 +01005import collections.abc
Walter Dörwald7fd94242003-05-18 00:47:47 +00006import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00007from test import support
Hai Shif7ba40b2020-06-25 18:38:51 +08008from test.support import os_helper
sthaa3ecb82019-03-20 20:49:39 +01009from test.support import _2G
Alexandre Vassalottiad077152009-07-15 17:49:23 +000010import weakref
11import pickle
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +000012import operator
Alexandre Vassalottiad077152009-07-15 17:49:23 +000013import struct
Serhiy Storchaka43767632013-11-03 21:31:38 +020014import sys
Alexandre Vassalottiad077152009-07-15 17:49:23 +000015
16import array
17from array import _array_reconstructor as array_reconstructor
18
Victor Stinner29c00342013-03-08 02:33:06 +010019sizeof_wchar = array.array('u').itemsize
Victor Stinnerc472c5d2013-02-26 22:52:11 +010020
21
Raymond Hettingerb0900e62004-12-16 16:23:40 +000022class ArraySubclass(array.array):
23 pass
Guido van Rossumc9f8f141997-04-09 20:51:54 +000024
Thomas Woutersb2137042007-02-01 18:02:27 +000025class ArraySubclassWithKwargs(array.array):
26 def __init__(self, typecode, newarg=None):
Victor Stinner7a6a0092011-01-04 00:04:44 +000027 array.array.__init__(self)
Thomas Woutersb2137042007-02-01 18:02:27 +000028
orenmn964281a2017-03-09 11:35:28 +020029typecodes = 'ubBhHiIlLfdqQ'
Martin v. Löwis99866332002-03-01 10:27:01 +000030
Martin Panterbe8da9c2016-09-07 11:04:41 +000031class MiscTest(unittest.TestCase):
Martin v. Löwis99866332002-03-01 10:27:01 +000032
Pablo Galindoe51dd9d2020-07-05 22:43:14 +010033 def test_array_is_sequence(self):
34 self.assertIsInstance(array.array("B"), collections.abc.MutableSequence)
35 self.assertIsInstance(array.array("B"), collections.abc.Reversible)
36
Martin Panterbe8da9c2016-09-07 11:04:41 +000037 def test_bad_constructor(self):
Walter Dörwald7fd94242003-05-18 00:47:47 +000038 self.assertRaises(TypeError, array.array)
39 self.assertRaises(TypeError, array.array, spam=42)
40 self.assertRaises(TypeError, array.array, 'xx')
41 self.assertRaises(ValueError, array.array, 'x')
Martin v. Löwis99866332002-03-01 10:27:01 +000042
Martin Panterbe8da9c2016-09-07 11:04:41 +000043 def test_empty(self):
44 # Exercise code for handling zero-length arrays
45 a = array.array('B')
46 a[:] = a
47 self.assertEqual(len(a), 0)
48 self.assertEqual(len(a + a), 0)
49 self.assertEqual(len(a * 3), 0)
50 a += a
51 self.assertEqual(len(a), 0)
52
Martin v. Löwis99866332002-03-01 10:27:01 +000053
Alexandre Vassalottiad077152009-07-15 17:49:23 +000054# Machine format codes.
55#
56# Search for "enum machine_format_code" in Modules/arraymodule.c to get the
57# authoritative values.
58UNKNOWN_FORMAT = -1
59UNSIGNED_INT8 = 0
60SIGNED_INT8 = 1
61UNSIGNED_INT16_LE = 2
62UNSIGNED_INT16_BE = 3
63SIGNED_INT16_LE = 4
64SIGNED_INT16_BE = 5
65UNSIGNED_INT32_LE = 6
66UNSIGNED_INT32_BE = 7
67SIGNED_INT32_LE = 8
68SIGNED_INT32_BE = 9
69UNSIGNED_INT64_LE = 10
70UNSIGNED_INT64_BE = 11
71SIGNED_INT64_LE = 12
72SIGNED_INT64_BE = 13
73IEEE_754_FLOAT_LE = 14
74IEEE_754_FLOAT_BE = 15
75IEEE_754_DOUBLE_LE = 16
76IEEE_754_DOUBLE_BE = 17
77UTF16_LE = 18
78UTF16_BE = 19
79UTF32_LE = 20
80UTF32_BE = 21
81
82class ArrayReconstructorTest(unittest.TestCase):
83
84 def test_error(self):
85 self.assertRaises(TypeError, array_reconstructor,
86 "", "b", 0, b"")
87 self.assertRaises(TypeError, array_reconstructor,
88 str, "b", 0, b"")
89 self.assertRaises(TypeError, array_reconstructor,
90 array.array, "b", '', b"")
91 self.assertRaises(TypeError, array_reconstructor,
92 array.array, "b", 0, "")
93 self.assertRaises(ValueError, array_reconstructor,
94 array.array, "?", 0, b"")
95 self.assertRaises(ValueError, array_reconstructor,
96 array.array, "b", UNKNOWN_FORMAT, b"")
97 self.assertRaises(ValueError, array_reconstructor,
98 array.array, "b", 22, b"")
99 self.assertRaises(ValueError, array_reconstructor,
100 array.array, "d", 16, b"a")
101
102 def test_numbers(self):
103 testcases = (
104 (['B', 'H', 'I', 'L'], UNSIGNED_INT8, '=BBBB',
105 [0x80, 0x7f, 0, 0xff]),
106 (['b', 'h', 'i', 'l'], SIGNED_INT8, '=bbb',
107 [-0x80, 0x7f, 0]),
108 (['H', 'I', 'L'], UNSIGNED_INT16_LE, '<HHHH',
109 [0x8000, 0x7fff, 0, 0xffff]),
110 (['H', 'I', 'L'], UNSIGNED_INT16_BE, '>HHHH',
111 [0x8000, 0x7fff, 0, 0xffff]),
112 (['h', 'i', 'l'], SIGNED_INT16_LE, '<hhh',
113 [-0x8000, 0x7fff, 0]),
114 (['h', 'i', 'l'], SIGNED_INT16_BE, '>hhh',
115 [-0x8000, 0x7fff, 0]),
116 (['I', 'L'], UNSIGNED_INT32_LE, '<IIII',
117 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
118 (['I', 'L'], UNSIGNED_INT32_BE, '>IIII',
119 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
120 (['i', 'l'], SIGNED_INT32_LE, '<iii',
121 [-1<<31, (1<<31)-1, 0]),
122 (['i', 'l'], SIGNED_INT32_BE, '>iii',
123 [-1<<31, (1<<31)-1, 0]),
124 (['L'], UNSIGNED_INT64_LE, '<QQQQ',
Alexandre Vassalotti0027d4b2009-07-15 20:53:55 +0000125 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
126 (['L'], UNSIGNED_INT64_BE, '>QQQQ',
127 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
128 (['l'], SIGNED_INT64_LE, '<qqq',
129 [-1<<31, (1<<31)-1, 0]),
130 (['l'], SIGNED_INT64_BE, '>qqq',
131 [-1<<31, (1<<31)-1, 0]),
132 # The following tests for INT64 will raise an OverflowError
133 # when run on a 32-bit machine. The tests are simply skipped
134 # in that case.
135 (['L'], UNSIGNED_INT64_LE, '<QQQQ',
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000136 [1<<63, (1<<63)-1, 0, (1<<64)-1]),
137 (['L'], UNSIGNED_INT64_BE, '>QQQQ',
138 [1<<63, (1<<63)-1, 0, (1<<64)-1]),
139 (['l'], SIGNED_INT64_LE, '<qqq',
140 [-1<<63, (1<<63)-1, 0]),
141 (['l'], SIGNED_INT64_BE, '>qqq',
142 [-1<<63, (1<<63)-1, 0]),
143 (['f'], IEEE_754_FLOAT_LE, '<ffff',
144 [16711938.0, float('inf'), float('-inf'), -0.0]),
145 (['f'], IEEE_754_FLOAT_BE, '>ffff',
146 [16711938.0, float('inf'), float('-inf'), -0.0]),
147 (['d'], IEEE_754_DOUBLE_LE, '<dddd',
148 [9006104071832581.0, float('inf'), float('-inf'), -0.0]),
149 (['d'], IEEE_754_DOUBLE_BE, '>dddd',
150 [9006104071832581.0, float('inf'), float('-inf'), -0.0])
151 )
152 for testcase in testcases:
153 valid_typecodes, mformat_code, struct_fmt, values = testcase
154 arraystr = struct.pack(struct_fmt, *values)
155 for typecode in valid_typecodes:
Alexandre Vassalotti0027d4b2009-07-15 20:53:55 +0000156 try:
157 a = array.array(typecode, values)
158 except OverflowError:
159 continue # Skip this test case.
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000160 b = array_reconstructor(
161 array.array, typecode, mformat_code, arraystr)
162 self.assertEqual(a, b,
163 msg="{0!r} != {1!r}; testcase={2!r}".format(a, b, testcase))
164
165 def test_unicode(self):
166 teststr = "Bonne Journ\xe9e \U0002030a\U00020347"
167 testcases = (
168 (UTF16_LE, "UTF-16-LE"),
169 (UTF16_BE, "UTF-16-BE"),
170 (UTF32_LE, "UTF-32-LE"),
171 (UTF32_BE, "UTF-32-BE")
172 )
173 for testcase in testcases:
174 mformat_code, encoding = testcase
175 a = array.array('u', teststr)
176 b = array_reconstructor(
177 array.array, 'u', mformat_code, teststr.encode(encoding))
178 self.assertEqual(a, b,
179 msg="{0!r} != {1!r}; testcase={2!r}".format(a, b, testcase))
180
181
Ezio Melotti1d3e96d2013-01-10 06:04:50 +0200182class BaseTest:
Walter Dörwald7fd94242003-05-18 00:47:47 +0000183 # Required class attributes (provided by subclasses
184 # typecode: the typecode to test
185 # example: an initializer usable in the constructor for this type
186 # smallerexample: the same length as example, but smaller
187 # biggerexample: the same length as example, but bigger
188 # outside: An entry that is not in example
189 # minitemsize: the minimum guaranteed itemsize
Martin v. Löwis99866332002-03-01 10:27:01 +0000190
Walter Dörwald7fd94242003-05-18 00:47:47 +0000191 def assertEntryEqual(self, entry1, entry2):
192 self.assertEqual(entry1, entry2)
Martin v. Löwis99866332002-03-01 10:27:01 +0000193
Walter Dörwald7fd94242003-05-18 00:47:47 +0000194 def badtypecode(self):
195 # Return a typecode that is different from our own
196 return typecodes[(typecodes.index(self.typecode)+1) % len(typecodes)]
Martin v. Löwis99866332002-03-01 10:27:01 +0000197
Walter Dörwald7fd94242003-05-18 00:47:47 +0000198 def test_constructor(self):
199 a = array.array(self.typecode)
200 self.assertEqual(a.typecode, self.typecode)
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200201 self.assertGreaterEqual(a.itemsize, self.minitemsize)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000202 self.assertRaises(TypeError, array.array, self.typecode, None)
Martin v. Löwis99866332002-03-01 10:27:01 +0000203
Walter Dörwald7fd94242003-05-18 00:47:47 +0000204 def test_len(self):
205 a = array.array(self.typecode)
206 a.append(self.example[0])
207 self.assertEqual(len(a), 1)
Martin v. Löwis99866332002-03-01 10:27:01 +0000208
Walter Dörwald7fd94242003-05-18 00:47:47 +0000209 a = array.array(self.typecode, self.example)
210 self.assertEqual(len(a), len(self.example))
Martin v. Löwis99866332002-03-01 10:27:01 +0000211
Walter Dörwald7fd94242003-05-18 00:47:47 +0000212 def test_buffer_info(self):
213 a = array.array(self.typecode, self.example)
214 self.assertRaises(TypeError, a.buffer_info, 42)
215 bi = a.buffer_info()
Ezio Melottie9615932010-01-24 19:26:24 +0000216 self.assertIsInstance(bi, tuple)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000217 self.assertEqual(len(bi), 2)
Ezio Melottie9615932010-01-24 19:26:24 +0000218 self.assertIsInstance(bi[0], int)
219 self.assertIsInstance(bi[1], int)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000220 self.assertEqual(bi[1], len(a))
Martin v. Löwis99866332002-03-01 10:27:01 +0000221
Walter Dörwald7fd94242003-05-18 00:47:47 +0000222 def test_byteswap(self):
Victor Stinner8dba4e02011-09-30 00:51:10 +0200223 if self.typecode == 'u':
224 example = '\U00100100'
225 else:
226 example = self.example
227 a = array.array(self.typecode, example)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000228 self.assertRaises(TypeError, a.byteswap, 42)
229 if a.itemsize in (1, 2, 4, 8):
Victor Stinner8dba4e02011-09-30 00:51:10 +0200230 b = array.array(self.typecode, example)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000231 b.byteswap()
232 if a.itemsize==1:
233 self.assertEqual(a, b)
234 else:
235 self.assertNotEqual(a, b)
236 b.byteswap()
237 self.assertEqual(a, b)
Martin v. Löwis99866332002-03-01 10:27:01 +0000238
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000239 def test_copy(self):
240 import copy
241 a = array.array(self.typecode, self.example)
242 b = copy.copy(a)
243 self.assertNotEqual(id(a), id(b))
244 self.assertEqual(a, b)
245
Thomas Wouters89f507f2006-12-13 04:49:30 +0000246 def test_deepcopy(self):
247 import copy
248 a = array.array(self.typecode, self.example)
249 b = copy.deepcopy(a)
250 self.assertNotEqual(id(a), id(b))
251 self.assertEqual(a, b)
252
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000253 def test_reduce_ex(self):
254 a = array.array(self.typecode, self.example)
255 for protocol in range(3):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000256 self.assertIs(a.__reduce_ex__(protocol)[0], array.array)
Zackery Spytzd1cbc6f2018-11-26 22:40:49 -0700257 for protocol in range(3, pickle.HIGHEST_PROTOCOL + 1):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000258 self.assertIs(a.__reduce_ex__(protocol)[0], array_reconstructor)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000259
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000260 def test_pickle(self):
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000261 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000262 a = array.array(self.typecode, self.example)
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
267 a = ArraySubclass(self.typecode, self.example)
268 a.x = 10
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000269 b = pickle.loads(pickle.dumps(a, protocol))
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000270 self.assertNotEqual(id(a), id(b))
271 self.assertEqual(a, b)
272 self.assertEqual(a.x, b.x)
273 self.assertEqual(type(a), type(b))
274
Guido van Rossumd8faa362007-04-27 19:54:29 +0000275 def test_pickle_for_empty_array(self):
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000276 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossumd8faa362007-04-27 19:54:29 +0000277 a = array.array(self.typecode)
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
282 a = ArraySubclass(self.typecode)
283 a.x = 10
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000284 b = pickle.loads(pickle.dumps(a, protocol))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000285 self.assertNotEqual(id(a), id(b))
286 self.assertEqual(a, b)
287 self.assertEqual(a.x, b.x)
288 self.assertEqual(type(a), type(b))
289
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000290 def test_iterator_pickle(self):
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200291 orig = array.array(self.typecode, self.example)
292 data = list(orig)
293 data2 = data[::-1]
Serhiy Storchakabad12572014-12-15 14:03:42 +0200294 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200295 # initial iterator
296 itorig = iter(orig)
297 d = pickle.dumps((itorig, orig), proto)
298 it, a = pickle.loads(d)
299 a.fromlist(data2)
300 self.assertEqual(type(it), type(itorig))
301 self.assertEqual(list(it), data + data2)
Serhiy Storchakabad12572014-12-15 14:03:42 +0200302
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200303 # running iterator
304 next(itorig)
305 d = pickle.dumps((itorig, orig), proto)
306 it, a = pickle.loads(d)
307 a.fromlist(data2)
308 self.assertEqual(type(it), type(itorig))
309 self.assertEqual(list(it), data[1:] + data2)
310
311 # empty iterator
312 for i in range(1, len(data)):
313 next(itorig)
314 d = pickle.dumps((itorig, orig), proto)
315 it, a = pickle.loads(d)
316 a.fromlist(data2)
317 self.assertEqual(type(it), type(itorig))
318 self.assertEqual(list(it), data2)
319
320 # exhausted iterator
321 self.assertRaises(StopIteration, next, itorig)
322 d = pickle.dumps((itorig, orig), proto)
323 it, a = pickle.loads(d)
324 a.fromlist(data2)
Serhiy Storchakaab0d1982016-03-30 21:11:16 +0300325 self.assertEqual(list(it), [])
326
327 def test_exhausted_iterator(self):
328 a = array.array(self.typecode, self.example)
329 self.assertEqual(list(a), list(self.example))
330 exhit = iter(a)
331 empit = iter(a)
332 for x in exhit: # exhaust the iterator
333 next(empit) # not exhausted
334 a.append(self.outside)
335 self.assertEqual(list(exhit), [])
336 self.assertEqual(list(empit), [self.outside])
337 self.assertEqual(list(a), list(self.example) + [self.outside])
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000338
Pablo Galindoe51dd9d2020-07-05 22:43:14 +0100339 def test_reverse_iterator(self):
340 a = array.array(self.typecode, self.example)
341 self.assertEqual(list(a), list(self.example))
342 self.assertEqual(list(reversed(a)), list(iter(a))[::-1])
343
344 def test_reverse_iterator_picking(self):
345 orig = array.array(self.typecode, self.example)
346 data = list(orig)
347 data2 = [self.outside] + data
348 rev_data = data[len(data)-2::-1] + [self.outside]
349 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
350 # initial iterator
351 itorig = reversed(orig)
352 d = pickle.dumps((itorig, orig), proto)
353 it, a = pickle.loads(d)
354 a.insert(0, self.outside)
355 self.assertEqual(type(it), type(itorig))
356 self.assertEqual(list(it), rev_data)
357 self.assertEqual(list(a), data2)
358
359 # running iterator
360 next(itorig)
361 d = pickle.dumps((itorig, orig), proto)
362 it, a = pickle.loads(d)
363 a.insert(0, self.outside)
364 self.assertEqual(type(it), type(itorig))
365 self.assertEqual(list(it), rev_data[1:])
366 self.assertEqual(list(a), data2)
367
368 # empty iterator
369 for i in range(1, len(data)):
370 next(itorig)
371 d = pickle.dumps((itorig, orig), proto)
372 it, a = pickle.loads(d)
373 a.insert(0, self.outside)
374 self.assertEqual(type(it), type(itorig))
375 self.assertEqual(list(it), [])
376 self.assertEqual(list(a), data2)
377
378 # exhausted iterator
379 self.assertRaises(StopIteration, next, itorig)
380 d = pickle.dumps((itorig, orig), proto)
381 it, a = pickle.loads(d)
382 a.insert(0, self.outside)
383 self.assertEqual(list(it), [])
384 self.assertEqual(list(a), data2)
385
386 def test_exhausted_reverse_iterator(self):
387 a = array.array(self.typecode, self.example)
388 self.assertEqual(list(a), list(self.example))
389 exhit = reversed(a)
390 empit = reversed(a)
391 for x in exhit: # exhaust the iterator
392 next(empit) # Pointing past the 0th position.
393 a.insert(0, self.outside)
394 self.assertEqual(list(exhit), [])
395 # The iterator index points past the 0th position so inserting
Ikko Ashimine9303b9e2020-11-10 21:42:36 +0900396 # an element in the beginning does not make it appear.
Pablo Galindoe51dd9d2020-07-05 22:43:14 +0100397 self.assertEqual(list(empit), [])
398 self.assertEqual(list(a), [self.outside] + list(self.example))
399
Walter Dörwald7fd94242003-05-18 00:47:47 +0000400 def test_insert(self):
401 a = array.array(self.typecode, self.example)
402 a.insert(0, self.example[0])
403 self.assertEqual(len(a), 1+len(self.example))
404 self.assertEqual(a[0], a[1])
405 self.assertRaises(TypeError, a.insert)
406 self.assertRaises(TypeError, a.insert, None)
Walter Dörwaldba39d9c2003-05-18 01:56:25 +0000407 self.assertRaises(TypeError, a.insert, 0, None)
Martin v. Löwis99866332002-03-01 10:27:01 +0000408
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000409 a = array.array(self.typecode, self.example)
410 a.insert(-1, self.example[0])
411 self.assertEqual(
412 a,
413 array.array(
414 self.typecode,
415 self.example[:-1] + self.example[:1] + self.example[-1:]
416 )
417 )
418
419 a = array.array(self.typecode, self.example)
420 a.insert(-1000, self.example[0])
421 self.assertEqual(
422 a,
423 array.array(self.typecode, self.example[:1] + self.example)
424 )
425
426 a = array.array(self.typecode, self.example)
427 a.insert(1000, self.example[0])
428 self.assertEqual(
429 a,
430 array.array(self.typecode, self.example + self.example[:1])
431 )
432
Walter Dörwald7fd94242003-05-18 00:47:47 +0000433 def test_tofromfile(self):
434 a = array.array(self.typecode, 2*self.example)
435 self.assertRaises(TypeError, a.tofile)
Hai Shif7ba40b2020-06-25 18:38:51 +0800436 os_helper.unlink(os_helper.TESTFN)
437 f = open(os_helper.TESTFN, 'wb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000438 try:
439 a.tofile(f)
440 f.close()
441 b = array.array(self.typecode)
Hai Shif7ba40b2020-06-25 18:38:51 +0800442 f = open(os_helper.TESTFN, 'rb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000443 self.assertRaises(TypeError, b.fromfile)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000444 b.fromfile(f, len(self.example))
445 self.assertEqual(b, array.array(self.typecode, self.example))
446 self.assertNotEqual(a, b)
Hirokazu Yamamoto54d0df62009-03-06 03:04:07 +0000447 self.assertRaises(EOFError, b.fromfile, f, len(self.example)+1)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000448 self.assertEqual(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000449 f.close()
450 finally:
451 if not f.closed:
452 f.close()
Hai Shif7ba40b2020-06-25 18:38:51 +0800453 os_helper.unlink(os_helper.TESTFN)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000454
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000455 def test_fromfile_ioerror(self):
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200456 # Issue #5395: Check if fromfile raises a proper OSError
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000457 # instead of EOFError.
458 a = array.array(self.typecode)
Hai Shif7ba40b2020-06-25 18:38:51 +0800459 f = open(os_helper.TESTFN, 'wb')
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000460 try:
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200461 self.assertRaises(OSError, a.fromfile, f, len(self.example))
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000462 finally:
463 f.close()
Hai Shif7ba40b2020-06-25 18:38:51 +0800464 os_helper.unlink(os_helper.TESTFN)
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000465
Frank Wierzbicki17683432009-08-16 20:30:12 +0000466 def test_filewrite(self):
467 a = array.array(self.typecode, 2*self.example)
Hai Shif7ba40b2020-06-25 18:38:51 +0800468 f = open(os_helper.TESTFN, 'wb')
Frank Wierzbicki17683432009-08-16 20:30:12 +0000469 try:
470 f.write(a)
471 f.close()
472 b = array.array(self.typecode)
Hai Shif7ba40b2020-06-25 18:38:51 +0800473 f = open(os_helper.TESTFN, 'rb')
Frank Wierzbicki17683432009-08-16 20:30:12 +0000474 b.fromfile(f, len(self.example))
475 self.assertEqual(b, array.array(self.typecode, self.example))
476 self.assertNotEqual(a, b)
477 b.fromfile(f, len(self.example))
478 self.assertEqual(a, b)
479 f.close()
480 finally:
481 if not f.closed:
482 f.close()
Hai Shif7ba40b2020-06-25 18:38:51 +0800483 os_helper.unlink(os_helper.TESTFN)
Frank Wierzbicki17683432009-08-16 20:30:12 +0000484
Walter Dörwald7fd94242003-05-18 00:47:47 +0000485 def test_tofromlist(self):
486 a = array.array(self.typecode, 2*self.example)
487 b = array.array(self.typecode)
488 self.assertRaises(TypeError, a.tolist, 42)
489 self.assertRaises(TypeError, b.fromlist)
490 self.assertRaises(TypeError, b.fromlist, 42)
491 self.assertRaises(TypeError, b.fromlist, [None])
492 b.fromlist(a.tolist())
493 self.assertEqual(a, b)
Fred Drake78334472000-06-28 17:50:51 +0000494
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000495 def test_tofrombytes(self):
Walter Dörwald7fd94242003-05-18 00:47:47 +0000496 a = array.array(self.typecode, 2*self.example)
497 b = array.array(self.typecode)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000498 self.assertRaises(TypeError, a.tobytes, 42)
499 self.assertRaises(TypeError, b.frombytes)
500 self.assertRaises(TypeError, b.frombytes, 42)
501 b.frombytes(a.tobytes())
502 c = array.array(self.typecode, bytearray(a.tobytes()))
Walter Dörwald7fd94242003-05-18 00:47:47 +0000503 self.assertEqual(a, b)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000504 self.assertEqual(a, c)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000505 if a.itemsize>1:
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000506 self.assertRaises(ValueError, b.frombytes, b"x")
Fred Drake78334472000-06-28 17:50:51 +0000507
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +0000508 def test_fromarray(self):
509 a = array.array(self.typecode, self.example)
510 b = array.array(self.typecode, a)
511 self.assertEqual(a, b)
512
Walter Dörwald7fd94242003-05-18 00:47:47 +0000513 def test_repr(self):
514 a = array.array(self.typecode, 2*self.example)
515 self.assertEqual(a, eval(repr(a), {"array": array.array}))
Fred Drake78334472000-06-28 17:50:51 +0000516
Walter Dörwald7fd94242003-05-18 00:47:47 +0000517 a = array.array(self.typecode)
518 self.assertEqual(repr(a), "array('%s')" % self.typecode)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000519
Walter Dörwald7fd94242003-05-18 00:47:47 +0000520 def test_str(self):
521 a = array.array(self.typecode, 2*self.example)
522 str(a)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000523
Walter Dörwald7fd94242003-05-18 00:47:47 +0000524 def test_cmp(self):
525 a = array.array(self.typecode, self.example)
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200526 self.assertIs(a == 42, False)
527 self.assertIs(a != 42, True)
Tim Peterscc78e472000-11-14 21:36:07 +0000528
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200529 self.assertIs(a == a, True)
530 self.assertIs(a != a, False)
531 self.assertIs(a < a, False)
532 self.assertIs(a <= a, True)
533 self.assertIs(a > a, False)
534 self.assertIs(a >= a, True)
Tim Peterscc78e472000-11-14 21:36:07 +0000535
Neal Norwitzbd2835c2006-03-17 08:54:15 +0000536 al = array.array(self.typecode, self.smallerexample)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000537 ab = array.array(self.typecode, self.biggerexample)
Guido van Rossum7f1d3aa1998-07-16 15:31:43 +0000538
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200539 self.assertIs(a == 2*a, False)
540 self.assertIs(a != 2*a, True)
541 self.assertIs(a < 2*a, True)
542 self.assertIs(a <= 2*a, True)
543 self.assertIs(a > 2*a, False)
544 self.assertIs(a >= 2*a, False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000545
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200546 self.assertIs(a == al, False)
547 self.assertIs(a != al, True)
548 self.assertIs(a < al, False)
549 self.assertIs(a <= al, False)
550 self.assertIs(a > al, True)
551 self.assertIs(a >= al, True)
Martin v. Löwis99866332002-03-01 10:27:01 +0000552
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200553 self.assertIs(a == ab, False)
554 self.assertIs(a != ab, True)
555 self.assertIs(a < ab, True)
556 self.assertIs(a <= ab, True)
557 self.assertIs(a > ab, False)
558 self.assertIs(a >= ab, False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000559
Walter Dörwald7fd94242003-05-18 00:47:47 +0000560 def test_add(self):
561 a = array.array(self.typecode, self.example) \
562 + array.array(self.typecode, self.example[::-1])
563 self.assertEqual(
564 a,
565 array.array(self.typecode, self.example + self.example[::-1])
566 )
Martin v. Löwis99866332002-03-01 10:27:01 +0000567
Walter Dörwald7fd94242003-05-18 00:47:47 +0000568 b = array.array(self.badtypecode())
569 self.assertRaises(TypeError, a.__add__, b)
570
571 self.assertRaises(TypeError, a.__add__, "bad")
572
573 def test_iadd(self):
574 a = array.array(self.typecode, self.example[::-1])
575 b = a
576 a += array.array(self.typecode, 2*self.example)
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200577 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000578 self.assertEqual(
579 a,
580 array.array(self.typecode, self.example[::-1]+2*self.example)
581 )
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000582 a = array.array(self.typecode, self.example)
583 a += a
584 self.assertEqual(
585 a,
586 array.array(self.typecode, self.example + self.example)
587 )
Walter Dörwald7fd94242003-05-18 00:47:47 +0000588
589 b = array.array(self.badtypecode())
590 self.assertRaises(TypeError, a.__add__, b)
591
592 self.assertRaises(TypeError, a.__iadd__, "bad")
593
594 def test_mul(self):
595 a = 5*array.array(self.typecode, self.example)
596 self.assertEqual(
597 a,
598 array.array(self.typecode, 5*self.example)
599 )
600
601 a = array.array(self.typecode, self.example)*5
602 self.assertEqual(
603 a,
604 array.array(self.typecode, self.example*5)
605 )
606
607 a = 0*array.array(self.typecode, self.example)
608 self.assertEqual(
609 a,
610 array.array(self.typecode)
611 )
612
613 a = (-1)*array.array(self.typecode, self.example)
614 self.assertEqual(
615 a,
616 array.array(self.typecode)
617 )
618
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000619 a = 5 * array.array(self.typecode, self.example[:1])
620 self.assertEqual(
621 a,
622 array.array(self.typecode, [a[0]] * 5)
623 )
624
Walter Dörwald7fd94242003-05-18 00:47:47 +0000625 self.assertRaises(TypeError, a.__mul__, "bad")
626
627 def test_imul(self):
628 a = array.array(self.typecode, self.example)
629 b = a
630
631 a *= 5
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200632 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000633 self.assertEqual(
634 a,
635 array.array(self.typecode, 5*self.example)
636 )
637
638 a *= 0
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200639 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000640 self.assertEqual(a, array.array(self.typecode))
641
642 a *= 1000
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200643 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000644 self.assertEqual(a, array.array(self.typecode))
645
646 a *= -1
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200647 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000648 self.assertEqual(a, array.array(self.typecode))
649
650 a = array.array(self.typecode, self.example)
651 a *= -1
652 self.assertEqual(a, array.array(self.typecode))
653
654 self.assertRaises(TypeError, a.__imul__, "bad")
655
656 def test_getitem(self):
657 a = array.array(self.typecode, self.example)
658 self.assertEntryEqual(a[0], self.example[0])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000659 self.assertEntryEqual(a[0], self.example[0])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000660 self.assertEntryEqual(a[-1], self.example[-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000661 self.assertEntryEqual(a[-1], self.example[-1])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000662 self.assertEntryEqual(a[len(self.example)-1], self.example[-1])
663 self.assertEntryEqual(a[-len(self.example)], self.example[0])
664 self.assertRaises(TypeError, a.__getitem__)
665 self.assertRaises(IndexError, a.__getitem__, len(self.example))
666 self.assertRaises(IndexError, a.__getitem__, -len(self.example)-1)
667
668 def test_setitem(self):
669 a = array.array(self.typecode, self.example)
670 a[0] = a[-1]
671 self.assertEntryEqual(a[0], a[-1])
672
673 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000674 a[0] = a[-1]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000675 self.assertEntryEqual(a[0], a[-1])
676
677 a = array.array(self.typecode, self.example)
678 a[-1] = a[0]
679 self.assertEntryEqual(a[0], a[-1])
680
681 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000682 a[-1] = a[0]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000683 self.assertEntryEqual(a[0], a[-1])
684
685 a = array.array(self.typecode, self.example)
686 a[len(self.example)-1] = a[0]
687 self.assertEntryEqual(a[0], a[-1])
688
689 a = array.array(self.typecode, self.example)
690 a[-len(self.example)] = a[-1]
691 self.assertEntryEqual(a[0], a[-1])
692
693 self.assertRaises(TypeError, a.__setitem__)
694 self.assertRaises(TypeError, a.__setitem__, None)
695 self.assertRaises(TypeError, a.__setitem__, 0, None)
696 self.assertRaises(
697 IndexError,
698 a.__setitem__,
699 len(self.example), self.example[0]
700 )
701 self.assertRaises(
702 IndexError,
703 a.__setitem__,
704 -len(self.example)-1, self.example[0]
705 )
706
707 def test_delitem(self):
708 a = array.array(self.typecode, self.example)
709 del a[0]
710 self.assertEqual(
711 a,
712 array.array(self.typecode, self.example[1:])
713 )
714
715 a = array.array(self.typecode, self.example)
716 del a[-1]
717 self.assertEqual(
718 a,
719 array.array(self.typecode, self.example[:-1])
720 )
721
722 a = array.array(self.typecode, self.example)
723 del a[len(self.example)-1]
724 self.assertEqual(
725 a,
726 array.array(self.typecode, self.example[:-1])
727 )
728
729 a = array.array(self.typecode, self.example)
730 del a[-len(self.example)]
731 self.assertEqual(
732 a,
733 array.array(self.typecode, self.example[1:])
734 )
735
736 self.assertRaises(TypeError, a.__delitem__)
737 self.assertRaises(TypeError, a.__delitem__, None)
738 self.assertRaises(IndexError, a.__delitem__, len(self.example))
739 self.assertRaises(IndexError, a.__delitem__, -len(self.example)-1)
740
741 def test_getslice(self):
742 a = array.array(self.typecode, self.example)
743 self.assertEqual(a[:], a)
744
745 self.assertEqual(
746 a[1:],
747 array.array(self.typecode, self.example[1:])
748 )
749
750 self.assertEqual(
751 a[:1],
752 array.array(self.typecode, self.example[:1])
753 )
754
755 self.assertEqual(
756 a[:-1],
757 array.array(self.typecode, self.example[:-1])
758 )
759
760 self.assertEqual(
761 a[-1:],
762 array.array(self.typecode, self.example[-1:])
763 )
764
765 self.assertEqual(
766 a[-1:-1],
767 array.array(self.typecode)
768 )
769
770 self.assertEqual(
Walter Dörwald1083c242005-01-21 21:16:51 +0000771 a[2:1],
772 array.array(self.typecode)
773 )
774
775 self.assertEqual(
Walter Dörwald7fd94242003-05-18 00:47:47 +0000776 a[1000:],
777 array.array(self.typecode)
778 )
779 self.assertEqual(a[-1000:], a)
780 self.assertEqual(a[:1000], a)
781 self.assertEqual(
782 a[:-1000],
783 array.array(self.typecode)
784 )
785 self.assertEqual(a[-1000:1000], a)
786 self.assertEqual(
787 a[2000:1000],
788 array.array(self.typecode)
789 )
790
Thomas Woutersed03b412007-08-28 21:37:11 +0000791 def test_extended_getslice(self):
792 # Test extended slicing by comparing with list slicing
793 # (Assumes list conversion works correctly, too)
794 a = array.array(self.typecode, self.example)
Zackery Spytz14514d92019-05-17 01:13:03 -0600795 indices = (0, None, 1, 3, 19, 100, sys.maxsize, -1, -2, -31, -100)
Thomas Woutersed03b412007-08-28 21:37:11 +0000796 for start in indices:
797 for stop in indices:
798 # Everything except the initial 0 (invalid step)
799 for step in indices[1:]:
800 self.assertEqual(list(a[start:stop:step]),
801 list(a)[start:stop:step])
802
Walter Dörwald7fd94242003-05-18 00:47:47 +0000803 def test_setslice(self):
804 a = array.array(self.typecode, self.example)
805 a[:1] = a
806 self.assertEqual(
807 a,
808 array.array(self.typecode, self.example + self.example[1:])
809 )
810
811 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000812 a[:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000813 self.assertEqual(
814 a,
815 array.array(self.typecode, self.example + self.example[-1:])
816 )
817
818 a = array.array(self.typecode, self.example)
819 a[-1:] = a
820 self.assertEqual(
821 a,
822 array.array(self.typecode, self.example[:-1] + self.example)
823 )
824
825 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000826 a[1:] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000827 self.assertEqual(
828 a,
829 array.array(self.typecode, self.example[:1] + self.example)
830 )
831
832 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000833 a[1:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000834 self.assertEqual(
835 a,
836 array.array(
837 self.typecode,
838 self.example[:1] + self.example + self.example[-1:]
839 )
840 )
841
842 a = array.array(self.typecode, self.example)
843 a[1000:] = a
844 self.assertEqual(
845 a,
846 array.array(self.typecode, 2*self.example)
847 )
848
849 a = array.array(self.typecode, self.example)
850 a[-1000:] = a
851 self.assertEqual(
852 a,
853 array.array(self.typecode, self.example)
854 )
855
856 a = array.array(self.typecode, self.example)
857 a[:1000] = a
858 self.assertEqual(
859 a,
860 array.array(self.typecode, self.example)
861 )
862
863 a = array.array(self.typecode, self.example)
864 a[:-1000] = a
865 self.assertEqual(
866 a,
867 array.array(self.typecode, 2*self.example)
868 )
869
870 a = array.array(self.typecode, self.example)
871 a[1:0] = a
872 self.assertEqual(
873 a,
874 array.array(self.typecode, self.example[:1] + self.example + self.example[1:])
875 )
876
877 a = array.array(self.typecode, self.example)
878 a[2000:1000] = a
879 self.assertEqual(
880 a,
881 array.array(self.typecode, 2*self.example)
882 )
883
884 a = array.array(self.typecode, self.example)
Thomas Woutersed03b412007-08-28 21:37:11 +0000885 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), None)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000886 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), None)
887
888 b = array.array(self.badtypecode())
Thomas Woutersed03b412007-08-28 21:37:11 +0000889 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000890 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), b)
891
Thomas Woutersed03b412007-08-28 21:37:11 +0000892 def test_extended_set_del_slice(self):
Zackery Spytz14514d92019-05-17 01:13:03 -0600893 indices = (0, None, 1, 3, 19, 100, sys.maxsize, -1, -2, -31, -100)
Thomas Woutersed03b412007-08-28 21:37:11 +0000894 for start in indices:
895 for stop in indices:
896 # Everything except the initial 0 (invalid step)
897 for step in indices[1:]:
898 a = array.array(self.typecode, self.example)
899 L = list(a)
900 # Make sure we have a slice of exactly the right length,
901 # but with (hopefully) different data.
902 data = L[start:stop:step]
903 data.reverse()
904 L[start:stop:step] = data
905 a[start:stop:step] = array.array(self.typecode, data)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000906 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000907
908 del L[start:stop:step]
909 del a[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +0000910 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000911
Walter Dörwald7fd94242003-05-18 00:47:47 +0000912 def test_index(self):
913 example = 2*self.example
914 a = array.array(self.typecode, example)
915 self.assertRaises(TypeError, a.index)
916 for x in example:
917 self.assertEqual(a.index(x), example.index(x))
918 self.assertRaises(ValueError, a.index, None)
919 self.assertRaises(ValueError, a.index, self.outside)
920
Zackery Spytzafd12652021-04-02 09:28:35 -0600921 a = array.array('i', [-2, -1, 0, 0, 1, 2])
922 self.assertEqual(a.index(0), 2)
923 self.assertEqual(a.index(0, 2), 2)
924 self.assertEqual(a.index(0, -4), 2)
925 self.assertEqual(a.index(-2, -10), 0)
926 self.assertEqual(a.index(0, 3), 3)
927 self.assertEqual(a.index(0, -3), 3)
928 self.assertEqual(a.index(0, 3, 4), 3)
929 self.assertEqual(a.index(0, -3, -2), 3)
930 self.assertRaises(ValueError, a.index, 2, 0, -10)
931
Walter Dörwald7fd94242003-05-18 00:47:47 +0000932 def test_count(self):
933 example = 2*self.example
934 a = array.array(self.typecode, example)
935 self.assertRaises(TypeError, a.count)
936 for x in example:
937 self.assertEqual(a.count(x), example.count(x))
938 self.assertEqual(a.count(self.outside), 0)
939 self.assertEqual(a.count(None), 0)
940
941 def test_remove(self):
942 for x in self.example:
943 example = 2*self.example
944 a = array.array(self.typecode, example)
945 pos = example.index(x)
946 example2 = example[:pos] + example[pos+1:]
947 a.remove(x)
948 self.assertEqual(a, array.array(self.typecode, example2))
949
950 a = array.array(self.typecode, self.example)
951 self.assertRaises(ValueError, a.remove, self.outside)
952
953 self.assertRaises(ValueError, a.remove, None)
954
955 def test_pop(self):
956 a = array.array(self.typecode)
957 self.assertRaises(IndexError, a.pop)
958
959 a = array.array(self.typecode, 2*self.example)
960 self.assertRaises(TypeError, a.pop, 42, 42)
961 self.assertRaises(TypeError, a.pop, None)
962 self.assertRaises(IndexError, a.pop, len(a))
963 self.assertRaises(IndexError, a.pop, -len(a)-1)
964
965 self.assertEntryEqual(a.pop(0), self.example[0])
966 self.assertEqual(
967 a,
968 array.array(self.typecode, self.example[1:]+self.example)
969 )
970 self.assertEntryEqual(a.pop(1), self.example[2])
971 self.assertEqual(
972 a,
973 array.array(self.typecode, self.example[1:2]+self.example[3:]+self.example)
974 )
975 self.assertEntryEqual(a.pop(0), self.example[1])
976 self.assertEntryEqual(a.pop(), self.example[-1])
977 self.assertEqual(
978 a,
979 array.array(self.typecode, self.example[3:]+self.example[:-1])
980 )
981
982 def test_reverse(self):
983 a = array.array(self.typecode, self.example)
984 self.assertRaises(TypeError, a.reverse, 42)
Fred Drake004d5e62000-10-23 17:22:08 +0000985 a.reverse()
Walter Dörwald7fd94242003-05-18 00:47:47 +0000986 self.assertEqual(
987 a,
988 array.array(self.typecode, self.example[::-1])
989 )
990
991 def test_extend(self):
992 a = array.array(self.typecode, self.example)
993 self.assertRaises(TypeError, a.extend)
994 a.extend(array.array(self.typecode, self.example[::-1]))
995 self.assertEqual(
996 a,
997 array.array(self.typecode, self.example+self.example[::-1])
998 )
999
Alexandre Vassalottie503cf92009-07-05 06:25:14 +00001000 a = array.array(self.typecode, self.example)
1001 a.extend(a)
1002 self.assertEqual(
1003 a,
1004 array.array(self.typecode, self.example+self.example)
1005 )
1006
Walter Dörwald7fd94242003-05-18 00:47:47 +00001007 b = array.array(self.badtypecode())
1008 self.assertRaises(TypeError, a.extend, b)
1009
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001010 a = array.array(self.typecode, self.example)
1011 a.extend(self.example[::-1])
1012 self.assertEqual(
1013 a,
1014 array.array(self.typecode, self.example+self.example[::-1])
1015 )
1016
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001017 def test_constructor_with_iterable_argument(self):
1018 a = array.array(self.typecode, iter(self.example))
1019 b = array.array(self.typecode, self.example)
1020 self.assertEqual(a, b)
1021
1022 # non-iterable argument
1023 self.assertRaises(TypeError, array.array, self.typecode, 10)
1024
1025 # pass through errors raised in __iter__
1026 class A:
1027 def __iter__(self):
1028 raise UnicodeError
1029 self.assertRaises(UnicodeError, array.array, self.typecode, A())
1030
1031 # pass through errors raised in next()
1032 def B():
1033 raise UnicodeError
1034 yield None
1035 self.assertRaises(UnicodeError, array.array, self.typecode, B())
1036
Walter Dörwald7fd94242003-05-18 00:47:47 +00001037 def test_coveritertraverse(self):
1038 try:
1039 import gc
1040 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001041 self.skipTest('gc module not available')
Walter Dörwald7fd94242003-05-18 00:47:47 +00001042 a = array.array(self.typecode)
1043 l = [iter(a)]
1044 l.append(l)
1045 gc.collect()
1046
1047 def test_buffer(self):
1048 a = array.array(self.typecode, self.example)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001049 m = memoryview(a)
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001050 expected = m.tobytes()
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001051 self.assertEqual(a.tobytes(), expected)
1052 self.assertEqual(a.tobytes()[0], expected[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001053 # Resizing is forbidden when there are buffer exports.
1054 # For issue 4509, we also check after each error that
1055 # the array was not modified.
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001056 self.assertRaises(BufferError, a.append, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001057 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001058 self.assertRaises(BufferError, a.extend, a[0:1])
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001059 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001060 self.assertRaises(BufferError, a.remove, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001061 self.assertEqual(m.tobytes(), expected)
1062 self.assertRaises(BufferError, a.pop, 0)
1063 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001064 self.assertRaises(BufferError, a.fromlist, a.tolist())
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001065 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001066 self.assertRaises(BufferError, a.frombytes, a.tobytes())
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001067 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001068 if self.typecode == 'u':
1069 self.assertRaises(BufferError, a.fromunicode, a.tounicode())
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001070 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +00001071 self.assertRaises(BufferError, operator.imul, a, 2)
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001072 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +00001073 self.assertRaises(BufferError, operator.imul, a, 0)
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001074 self.assertEqual(m.tobytes(), expected)
1075 self.assertRaises(BufferError, operator.setitem, a, slice(0, 0), a)
1076 self.assertEqual(m.tobytes(), expected)
1077 self.assertRaises(BufferError, operator.delitem, a, 0)
1078 self.assertEqual(m.tobytes(), expected)
1079 self.assertRaises(BufferError, operator.delitem, a, slice(0, 1))
1080 self.assertEqual(m.tobytes(), expected)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001081
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001082 def test_weakref(self):
1083 s = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001084 p = weakref.proxy(s)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001085 self.assertEqual(p.tobytes(), s.tobytes())
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001086 s = None
1087 self.assertRaises(ReferenceError, len, p)
1088
Serhiy Storchaka43767632013-11-03 21:31:38 +02001089 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
1090 'test needs sys.getrefcount()')
Skip Montanarod5cf0b82003-08-03 23:02:10 +00001091 def test_bug_782369(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +02001092 for i in range(10):
1093 b = array.array('B', range(64))
1094 rc = sys.getrefcount(10)
1095 for i in range(10):
1096 b = array.array('B', range(64))
1097 self.assertEqual(rc, sys.getrefcount(10))
Skip Montanarod5cf0b82003-08-03 23:02:10 +00001098
Thomas Woutersb2137042007-02-01 18:02:27 +00001099 def test_subclass_with_kwargs(self):
1100 # SF bug #1486663 -- this used to erroneously raise a TypeError
1101 ArraySubclassWithKwargs('b', newarg=1)
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001102
Guido van Rossum6b826ab2007-07-03 16:22:09 +00001103 def test_create_from_bytes(self):
Alexandre Vassalotti7e4f3212009-07-05 05:38:18 +00001104 # XXX This test probably needs to be moved in a subclass or
1105 # generalized to use self.typecode.
Guido van Rossum6b826ab2007-07-03 16:22:09 +00001106 a = array.array('H', b"1234")
1107 self.assertEqual(len(a) * a.itemsize, 4)
1108
Meador Inge03b4d502012-08-10 22:35:45 -05001109 @support.cpython_only
1110 def test_sizeof_with_buffer(self):
1111 a = array.array(self.typecode, self.example)
Meador Inge80dd1af2012-08-10 23:21:39 -05001112 basesize = support.calcvobjsize('Pn2Pi')
Meador Inge03b4d502012-08-10 22:35:45 -05001113 buffer_size = a.buffer_info()[1] * a.itemsize
1114 support.check_sizeof(self, a, basesize + buffer_size)
1115
1116 @support.cpython_only
1117 def test_sizeof_without_buffer(self):
1118 a = array.array(self.typecode)
Meador Inge80dd1af2012-08-10 23:21:39 -05001119 basesize = support.calcvobjsize('Pn2Pi')
Meador Inge03b4d502012-08-10 22:35:45 -05001120 support.check_sizeof(self, a, basesize)
1121
Alexandre Vassalotti9730e332013-11-29 20:47:15 -08001122 def test_initialize_with_unicode(self):
1123 if self.typecode != 'u':
1124 with self.assertRaises(TypeError) as cm:
1125 a = array.array(self.typecode, 'foo')
1126 self.assertIn("cannot use a str", str(cm.exception))
1127 with self.assertRaises(TypeError) as cm:
1128 a = array.array(self.typecode, array.array('u', 'foo'))
1129 self.assertIn("cannot use a unicode array", str(cm.exception))
1130 else:
1131 a = array.array(self.typecode, "foo")
1132 a = array.array(self.typecode, array.array('u', 'foo'))
1133
Stefan Krah650c1e82015-02-03 21:43:23 +01001134 @support.cpython_only
1135 def test_obsolete_write_lock(self):
1136 from _testcapi import getbuffer_with_null_view
1137 a = array.array('B', b"")
1138 self.assertRaises(BufferError, getbuffer_with_null_view, a)
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001139
Serhiy Storchakaab0d1982016-03-30 21:11:16 +03001140 def test_free_after_iterating(self):
1141 support.check_free_after_iterating(self, iter, array.array,
1142 (self.typecode,))
1143 support.check_free_after_iterating(self, reversed, array.array,
1144 (self.typecode,))
1145
Walter Dörwald7fd94242003-05-18 00:47:47 +00001146class StringTest(BaseTest):
1147
1148 def test_setitem(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001149 super().test_setitem()
Walter Dörwald7fd94242003-05-18 00:47:47 +00001150 a = array.array(self.typecode, self.example)
1151 self.assertRaises(TypeError, a.__setitem__, 0, self.example[:2])
1152
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001153class UnicodeTest(StringTest, unittest.TestCase):
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001154 typecode = 'u'
1155 example = '\x01\u263a\x00\ufeff'
1156 smallerexample = '\x01\u263a\x00\ufefe'
1157 biggerexample = '\x01\u263a\x01\ufeff'
1158 outside = str('\x33')
Victor Stinner8d4734f2012-08-08 20:09:21 +02001159 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001160
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001161 def test_unicode(self):
1162 self.assertRaises(TypeError, array.array, 'b', 'foo')
Walter Dörwald7fd94242003-05-18 00:47:47 +00001163
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001164 a = array.array('u', '\xa0\xc2\u1234')
1165 a.fromunicode(' ')
1166 a.fromunicode('')
1167 a.fromunicode('')
1168 a.fromunicode('\x11abc\xff\u1234')
1169 s = a.tounicode()
1170 self.assertEqual(s, '\xa0\xc2\u1234 \x11abc\xff\u1234')
Victor Stinner9d512ab2012-08-09 00:43:56 +02001171 self.assertEqual(a.itemsize, sizeof_wchar)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001172
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001173 s = '\x00="\'a\\b\x80\xff\u0000\u0001\u1234'
1174 a = array.array('u', s)
1175 self.assertEqual(
1176 repr(a),
Georg Brandl559e5d72008-06-11 18:37:52 +00001177 "array('u', '\\x00=\"\\'a\\\\b\\x80\xff\\x00\\x01\u1234')")
Walter Dörwald7fd94242003-05-18 00:47:47 +00001178
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001179 self.assertRaises(TypeError, a.fromunicode)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001180
Victor Stinner29ec5952013-02-26 00:27:38 +01001181 def test_issue17223(self):
1182 # this used to crash
Victor Stinnerc472c5d2013-02-26 22:52:11 +01001183 if sizeof_wchar == 4:
1184 # U+FFFFFFFF is an invalid code point in Unicode 6.0
1185 invalid_str = b'\xff\xff\xff\xff'
1186 else:
Victor Stinner29c00342013-03-08 02:33:06 +01001187 # PyUnicode_FromUnicode() cannot fail with 16-bit wchar_t
1188 self.skipTest("specific to 32-bit wchar_t")
Victor Stinnerc472c5d2013-02-26 22:52:11 +01001189 a = array.array('u', invalid_str)
Victor Stinner29ec5952013-02-26 00:27:38 +01001190 self.assertRaises(ValueError, a.tounicode)
1191 self.assertRaises(ValueError, str, a)
1192
Walter Dörwald7fd94242003-05-18 00:47:47 +00001193class NumberTest(BaseTest):
1194
1195 def test_extslice(self):
1196 a = array.array(self.typecode, range(5))
1197 self.assertEqual(a[::], a)
1198 self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
1199 self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
1200 self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
1201 self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
1202 self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
1203 self.assertEqual(a[-100:100:], a)
1204 self.assertEqual(a[100:-100:-1], a[::-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +00001205 self.assertEqual(a[-100:100:2], array.array(self.typecode, [0,2,4]))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001206 self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
1207 self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
1208
1209 def test_delslice(self):
1210 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001211 del a[::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001212 self.assertEqual(a, array.array(self.typecode, [1,3]))
1213 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001214 del a[1::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001215 self.assertEqual(a, array.array(self.typecode, [0,2,4]))
1216 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001217 del a[1::-2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001218 self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
1219 a = array.array(self.typecode, range(10))
Michael W. Hudson56796f62002-07-29 14:35:04 +00001220 del a[::1000]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001221 self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
Mark Dickinsonbc099642010-01-29 17:27:24 +00001222 # test issue7788
1223 a = array.array(self.typecode, range(10))
1224 del a[9::1<<333]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001225
1226 def test_assignment(self):
1227 a = array.array(self.typecode, range(10))
1228 a[::2] = array.array(self.typecode, [42]*5)
1229 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
1230 a = array.array(self.typecode, range(10))
1231 a[::-4] = array.array(self.typecode, [10]*3)
1232 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
1233 a = array.array(self.typecode, range(4))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001234 a[::-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +00001235 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
1236 a = array.array(self.typecode, range(10))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001237 b = a[:]
1238 c = a[:]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001239 ins = array.array(self.typecode, range(2))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001240 a[2:3] = ins
1241 b[slice(2,3)] = ins
1242 c[2:3:] = ins
Fred Drake004d5e62000-10-23 17:22:08 +00001243
Walter Dörwald7fd94242003-05-18 00:47:47 +00001244 def test_iterationcontains(self):
1245 a = array.array(self.typecode, range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +00001246 self.assertEqual(list(a), list(range(10)))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001247 b = array.array(self.typecode, [20])
1248 self.assertEqual(a[-1] in a, True)
1249 self.assertEqual(b[0] not in a, True)
1250
1251 def check_overflow(self, lower, upper):
1252 # method to be used by subclasses
1253
1254 # should not overflow assigning lower limit
1255 a = array.array(self.typecode, [lower])
1256 a[0] = lower
1257 # should overflow assigning less than lower limit
1258 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
1259 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
1260 # should not overflow assigning upper limit
1261 a = array.array(self.typecode, [upper])
1262 a[0] = upper
1263 # should overflow assigning more than upper limit
1264 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
1265 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
1266
1267 def test_subclassing(self):
1268 typecode = self.typecode
1269 class ExaggeratingArray(array.array):
1270 __slots__ = ['offset']
1271
1272 def __new__(cls, typecode, data, offset):
1273 return array.array.__new__(cls, typecode, data)
1274
1275 def __init__(self, typecode, data, offset):
1276 self.offset = offset
1277
1278 def __getitem__(self, i):
1279 return array.array.__getitem__(self, i) + self.offset
1280
1281 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
1282 self.assertEntryEqual(a[0], 7)
1283
1284 self.assertRaises(AttributeError, setattr, a, "color", "blue")
1285
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00001286 def test_frombytearray(self):
1287 a = array.array('b', range(10))
1288 b = array.array(self.typecode, a)
1289 self.assertEqual(a, b)
1290
orenmn964281a2017-03-09 11:35:28 +02001291class IntegerNumberTest(NumberTest):
1292 def test_type_error(self):
1293 a = array.array(self.typecode)
1294 a.append(42)
1295 with self.assertRaises(TypeError):
1296 a.append(42.0)
1297 with self.assertRaises(TypeError):
1298 a[0] = 42.0
1299
1300class Intable:
1301 def __init__(self, num):
1302 self._num = num
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +02001303 def __index__(self):
1304 return self._num
orenmn964281a2017-03-09 11:35:28 +02001305 def __int__(self):
1306 return self._num
1307 def __sub__(self, other):
1308 return Intable(int(self) - int(other))
1309 def __add__(self, other):
1310 return Intable(int(self) + int(other))
1311
1312class SignedNumberTest(IntegerNumberTest):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001313 example = [-1, 0, 1, 42, 0x7f]
1314 smallerexample = [-1, 0, 1, 42, 0x7e]
1315 biggerexample = [-1, 0, 1, 43, 0x7f]
1316 outside = 23
1317
1318 def test_overflow(self):
1319 a = array.array(self.typecode)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001320 lower = -1 * int(pow(2, a.itemsize * 8 - 1))
1321 upper = int(pow(2, a.itemsize * 8 - 1)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001322 self.check_overflow(lower, upper)
orenmn964281a2017-03-09 11:35:28 +02001323 self.check_overflow(Intable(lower), Intable(upper))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001324
orenmn964281a2017-03-09 11:35:28 +02001325class UnsignedNumberTest(IntegerNumberTest):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001326 example = [0, 1, 17, 23, 42, 0xff]
1327 smallerexample = [0, 1, 17, 23, 42, 0xfe]
1328 biggerexample = [0, 1, 17, 23, 43, 0xff]
1329 outside = 0xaa
1330
1331 def test_overflow(self):
1332 a = array.array(self.typecode)
1333 lower = 0
Guido van Rossume2a383d2007-01-15 16:59:06 +00001334 upper = int(pow(2, a.itemsize * 8)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001335 self.check_overflow(lower, upper)
orenmn964281a2017-03-09 11:35:28 +02001336 self.check_overflow(Intable(lower), Intable(upper))
Fred Drake004d5e62000-10-23 17:22:08 +00001337
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001338 def test_bytes_extend(self):
1339 s = bytes(self.example)
1340
1341 a = array.array(self.typecode, self.example)
1342 a.extend(s)
1343 self.assertEqual(
1344 a,
1345 array.array(self.typecode, self.example+self.example)
1346 )
1347
1348 a = array.array(self.typecode, self.example)
1349 a.extend(bytearray(reversed(s)))
1350 self.assertEqual(
1351 a,
1352 array.array(self.typecode, self.example+self.example[::-1])
1353 )
1354
Fred Drake004d5e62000-10-23 17:22:08 +00001355
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001356class ByteTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001357 typecode = 'b'
1358 minitemsize = 1
Fred Drake004d5e62000-10-23 17:22:08 +00001359
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001360class UnsignedByteTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001361 typecode = 'B'
1362 minitemsize = 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001363
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001364class ShortTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001365 typecode = 'h'
1366 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001367
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001368class UnsignedShortTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001369 typecode = 'H'
1370 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001371
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001372class IntTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001373 typecode = 'i'
1374 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001375
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001376class UnsignedIntTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001377 typecode = 'I'
1378 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001379
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001380class LongTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001381 typecode = 'l'
1382 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001383
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001384class UnsignedLongTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001385 typecode = 'L'
1386 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001387
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001388class LongLongTest(SignedNumberTest, unittest.TestCase):
Meador Inge1c9f0c92011-09-20 19:55:51 -05001389 typecode = 'q'
1390 minitemsize = 8
Meador Inge1c9f0c92011-09-20 19:55:51 -05001391
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001392class UnsignedLongLongTest(UnsignedNumberTest, unittest.TestCase):
Meador Inge1c9f0c92011-09-20 19:55:51 -05001393 typecode = 'Q'
1394 minitemsize = 8
Meador Inge1c9f0c92011-09-20 19:55:51 -05001395
Walter Dörwald7fd94242003-05-18 00:47:47 +00001396class FPTest(NumberTest):
1397 example = [-42.0, 0, 42, 1e5, -1e10]
1398 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
1399 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
1400 outside = 23
1401
1402 def assertEntryEqual(self, entry1, entry2):
1403 self.assertAlmostEqual(entry1, entry2)
1404
Adrian Wielgosik7c17e232017-08-17 12:46:06 +00001405 def test_nan(self):
1406 a = array.array(self.typecode, [float('nan')])
1407 b = array.array(self.typecode, [float('nan')])
1408 self.assertIs(a != b, True)
1409 self.assertIs(a == b, False)
1410 self.assertIs(a > b, False)
1411 self.assertIs(a >= b, False)
1412 self.assertIs(a < b, False)
1413 self.assertIs(a <= b, False)
1414
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001415 def test_byteswap(self):
1416 a = array.array(self.typecode, self.example)
1417 self.assertRaises(TypeError, a.byteswap, 42)
1418 if a.itemsize in (1, 2, 4, 8):
1419 b = array.array(self.typecode, self.example)
1420 b.byteswap()
1421 if a.itemsize==1:
1422 self.assertEqual(a, b)
1423 else:
1424 # On alphas treating the byte swapped bit patters as
1425 # floats/doubles results in floating point exceptions
1426 # => compare the 8bit string values instead
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001427 self.assertNotEqual(a.tobytes(), b.tobytes())
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001428 b.byteswap()
1429 self.assertEqual(a, b)
1430
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001431class FloatTest(FPTest, unittest.TestCase):
Neal Norwitz35c6cd02003-05-22 13:29:15 +00001432 typecode = 'f'
1433 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001434
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001435class DoubleTest(FPTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001436 typecode = 'd'
1437 minitemsize = 8
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001438
1439 def test_alloc_overflow(self):
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001440 from sys import maxsize
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001441 a = array.array('d', [-1]*65536)
1442 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001443 a *= maxsize//65536 + 1
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001444 except MemoryError:
1445 pass
1446 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001447 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001448 b = array.array('d', [ 2.71828183, 3.14159265, -1])
1449 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001450 b * (maxsize//3 + 1)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001451 except MemoryError:
1452 pass
1453 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001454 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001455
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001456
sthaa3ecb82019-03-20 20:49:39 +01001457class LargeArrayTest(unittest.TestCase):
1458 typecode = 'b'
1459
1460 def example(self, size):
1461 # We assess a base memuse of <=2.125 for constructing this array
1462 base = array.array(self.typecode, [0, 1, 2, 3, 4, 5, 6, 7]) * (size // 8)
1463 base += array.array(self.typecode, [99]*(size % 8) + [8, 9, 10, 11])
1464 return base
1465
1466 @support.bigmemtest(_2G, memuse=2.125)
1467 def test_example_data(self, size):
1468 example = self.example(size)
1469 self.assertEqual(len(example), size+4)
1470
1471 @support.bigmemtest(_2G, memuse=2.125)
1472 def test_access(self, size):
1473 example = self.example(size)
1474 self.assertEqual(example[0], 0)
1475 self.assertEqual(example[-(size+4)], 0)
1476 self.assertEqual(example[size], 8)
1477 self.assertEqual(example[-4], 8)
1478 self.assertEqual(example[size+3], 11)
1479 self.assertEqual(example[-1], 11)
1480
1481 @support.bigmemtest(_2G, memuse=2.125+1)
1482 def test_slice(self, size):
1483 example = self.example(size)
1484 self.assertEqual(list(example[:4]), [0, 1, 2, 3])
1485 self.assertEqual(list(example[-4:]), [8, 9, 10, 11])
1486 part = example[1:-1]
1487 self.assertEqual(len(part), size+2)
1488 self.assertEqual(part[0], 1)
1489 self.assertEqual(part[-1], 10)
1490 del part
1491 part = example[::2]
1492 self.assertEqual(len(part), (size+5)//2)
1493 self.assertEqual(list(part[:4]), [0, 2, 4, 6])
1494 if size % 2:
1495 self.assertEqual(list(part[-2:]), [9, 11])
1496 else:
1497 self.assertEqual(list(part[-2:]), [8, 10])
1498
1499 @support.bigmemtest(_2G, memuse=2.125)
1500 def test_count(self, size):
1501 example = self.example(size)
1502 self.assertEqual(example.count(0), size//8)
1503 self.assertEqual(example.count(11), 1)
1504
1505 @support.bigmemtest(_2G, memuse=2.125)
1506 def test_append(self, size):
1507 example = self.example(size)
1508 example.append(12)
1509 self.assertEqual(example[-1], 12)
1510
1511 @support.bigmemtest(_2G, memuse=2.125)
1512 def test_extend(self, size):
1513 example = self.example(size)
1514 example.extend(iter([12, 13, 14, 15]))
1515 self.assertEqual(len(example), size+8)
1516 self.assertEqual(list(example[-8:]), [8, 9, 10, 11, 12, 13, 14, 15])
1517
1518 @support.bigmemtest(_2G, memuse=2.125)
1519 def test_frombytes(self, size):
1520 example = self.example(size)
1521 example.frombytes(b'abcd')
1522 self.assertEqual(len(example), size+8)
1523 self.assertEqual(list(example[-8:]), [8, 9, 10, 11] + list(b'abcd'))
1524
1525 @support.bigmemtest(_2G, memuse=2.125)
1526 def test_fromlist(self, size):
1527 example = self.example(size)
1528 example.fromlist([12, 13, 14, 15])
1529 self.assertEqual(len(example), size+8)
1530 self.assertEqual(list(example[-8:]), [8, 9, 10, 11, 12, 13, 14, 15])
1531
1532 @support.bigmemtest(_2G, memuse=2.125)
1533 def test_index(self, size):
1534 example = self.example(size)
1535 self.assertEqual(example.index(0), 0)
1536 self.assertEqual(example.index(1), 1)
1537 self.assertEqual(example.index(7), 7)
1538 self.assertEqual(example.index(11), size+3)
1539
1540 @support.bigmemtest(_2G, memuse=2.125)
1541 def test_insert(self, size):
1542 example = self.example(size)
1543 example.insert(0, 12)
1544 example.insert(10, 13)
1545 example.insert(size+1, 14)
1546 self.assertEqual(len(example), size+7)
1547 self.assertEqual(example[0], 12)
1548 self.assertEqual(example[10], 13)
1549 self.assertEqual(example[size+1], 14)
1550
1551 @support.bigmemtest(_2G, memuse=2.125)
1552 def test_pop(self, size):
1553 example = self.example(size)
1554 self.assertEqual(example.pop(0), 0)
1555 self.assertEqual(example[0], 1)
1556 self.assertEqual(example.pop(size+1), 10)
1557 self.assertEqual(example[size+1], 11)
1558 self.assertEqual(example.pop(1), 2)
1559 self.assertEqual(example[1], 3)
1560 self.assertEqual(len(example), size+1)
1561 self.assertEqual(example.pop(), 11)
1562 self.assertEqual(len(example), size)
1563
1564 @support.bigmemtest(_2G, memuse=2.125)
1565 def test_remove(self, size):
1566 example = self.example(size)
1567 example.remove(0)
1568 self.assertEqual(len(example), size+3)
1569 self.assertEqual(example[0], 1)
1570 example.remove(10)
1571 self.assertEqual(len(example), size+2)
1572 self.assertEqual(example[size], 9)
1573 self.assertEqual(example[size+1], 11)
1574
1575 @support.bigmemtest(_2G, memuse=2.125)
1576 def test_reverse(self, size):
1577 example = self.example(size)
1578 example.reverse()
1579 self.assertEqual(len(example), size+4)
1580 self.assertEqual(example[0], 11)
1581 self.assertEqual(example[3], 8)
1582 self.assertEqual(example[-1], 0)
1583 example.reverse()
1584 self.assertEqual(len(example), size+4)
1585 self.assertEqual(list(example[:4]), [0, 1, 2, 3])
1586 self.assertEqual(list(example[-4:]), [8, 9, 10, 11])
1587
1588 # list takes about 9 bytes per element
1589 @support.bigmemtest(_2G, memuse=2.125+9)
1590 def test_tolist(self, size):
1591 example = self.example(size)
1592 ls = example.tolist()
1593 self.assertEqual(len(ls), len(example))
1594 self.assertEqual(ls[:8], list(example[:8]))
1595 self.assertEqual(ls[-8:], list(example[-8:]))
1596
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001597if __name__ == "__main__":
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001598 unittest.main()