blob: 18f78d52467e2b461f829fd600c92d96d63548fa [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
Erlend Egeberg Aaslandc6ad03f2021-04-29 08:47:48 +020043 @support.cpython_only
Erlend Egeberg Aasland9746cda2021-04-30 16:04:57 +020044 def test_disallow_instantiation(self):
Erlend Egeberg Aasland0a3452e2021-06-24 01:46:25 +020045 my_array = array.array("I")
46 support.check_disallow_instantiation(
47 self, type(iter(my_array)), my_array
48 )
Erlend Egeberg Aasland9746cda2021-04-30 16:04:57 +020049
50 @support.cpython_only
Erlend Egeberg Aaslandc6ad03f2021-04-29 08:47:48 +020051 def test_immutable(self):
52 # bpo-43908: check that array.array is immutable
53 with self.assertRaises(TypeError):
54 array.array.foo = 1
55
Martin Panterbe8da9c2016-09-07 11:04:41 +000056 def test_empty(self):
57 # Exercise code for handling zero-length arrays
58 a = array.array('B')
59 a[:] = a
60 self.assertEqual(len(a), 0)
61 self.assertEqual(len(a + a), 0)
62 self.assertEqual(len(a * 3), 0)
63 a += a
64 self.assertEqual(len(a), 0)
65
Martin v. Löwis99866332002-03-01 10:27:01 +000066
Alexandre Vassalottiad077152009-07-15 17:49:23 +000067# Machine format codes.
68#
69# Search for "enum machine_format_code" in Modules/arraymodule.c to get the
70# authoritative values.
71UNKNOWN_FORMAT = -1
72UNSIGNED_INT8 = 0
73SIGNED_INT8 = 1
74UNSIGNED_INT16_LE = 2
75UNSIGNED_INT16_BE = 3
76SIGNED_INT16_LE = 4
77SIGNED_INT16_BE = 5
78UNSIGNED_INT32_LE = 6
79UNSIGNED_INT32_BE = 7
80SIGNED_INT32_LE = 8
81SIGNED_INT32_BE = 9
82UNSIGNED_INT64_LE = 10
83UNSIGNED_INT64_BE = 11
84SIGNED_INT64_LE = 12
85SIGNED_INT64_BE = 13
86IEEE_754_FLOAT_LE = 14
87IEEE_754_FLOAT_BE = 15
88IEEE_754_DOUBLE_LE = 16
89IEEE_754_DOUBLE_BE = 17
90UTF16_LE = 18
91UTF16_BE = 19
92UTF32_LE = 20
93UTF32_BE = 21
94
95class ArrayReconstructorTest(unittest.TestCase):
96
97 def test_error(self):
98 self.assertRaises(TypeError, array_reconstructor,
99 "", "b", 0, b"")
100 self.assertRaises(TypeError, array_reconstructor,
101 str, "b", 0, b"")
102 self.assertRaises(TypeError, array_reconstructor,
103 array.array, "b", '', b"")
104 self.assertRaises(TypeError, array_reconstructor,
105 array.array, "b", 0, "")
106 self.assertRaises(ValueError, array_reconstructor,
107 array.array, "?", 0, b"")
108 self.assertRaises(ValueError, array_reconstructor,
109 array.array, "b", UNKNOWN_FORMAT, b"")
110 self.assertRaises(ValueError, array_reconstructor,
111 array.array, "b", 22, b"")
112 self.assertRaises(ValueError, array_reconstructor,
113 array.array, "d", 16, b"a")
114
115 def test_numbers(self):
116 testcases = (
117 (['B', 'H', 'I', 'L'], UNSIGNED_INT8, '=BBBB',
118 [0x80, 0x7f, 0, 0xff]),
119 (['b', 'h', 'i', 'l'], SIGNED_INT8, '=bbb',
120 [-0x80, 0x7f, 0]),
121 (['H', 'I', 'L'], UNSIGNED_INT16_LE, '<HHHH',
122 [0x8000, 0x7fff, 0, 0xffff]),
123 (['H', 'I', 'L'], UNSIGNED_INT16_BE, '>HHHH',
124 [0x8000, 0x7fff, 0, 0xffff]),
125 (['h', 'i', 'l'], SIGNED_INT16_LE, '<hhh',
126 [-0x8000, 0x7fff, 0]),
127 (['h', 'i', 'l'], SIGNED_INT16_BE, '>hhh',
128 [-0x8000, 0x7fff, 0]),
129 (['I', 'L'], UNSIGNED_INT32_LE, '<IIII',
130 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
131 (['I', 'L'], UNSIGNED_INT32_BE, '>IIII',
132 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
133 (['i', 'l'], SIGNED_INT32_LE, '<iii',
134 [-1<<31, (1<<31)-1, 0]),
135 (['i', 'l'], SIGNED_INT32_BE, '>iii',
136 [-1<<31, (1<<31)-1, 0]),
137 (['L'], UNSIGNED_INT64_LE, '<QQQQ',
Alexandre Vassalotti0027d4b2009-07-15 20:53:55 +0000138 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
139 (['L'], UNSIGNED_INT64_BE, '>QQQQ',
140 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
141 (['l'], SIGNED_INT64_LE, '<qqq',
142 [-1<<31, (1<<31)-1, 0]),
143 (['l'], SIGNED_INT64_BE, '>qqq',
144 [-1<<31, (1<<31)-1, 0]),
145 # The following tests for INT64 will raise an OverflowError
146 # when run on a 32-bit machine. The tests are simply skipped
147 # in that case.
148 (['L'], UNSIGNED_INT64_LE, '<QQQQ',
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000149 [1<<63, (1<<63)-1, 0, (1<<64)-1]),
150 (['L'], UNSIGNED_INT64_BE, '>QQQQ',
151 [1<<63, (1<<63)-1, 0, (1<<64)-1]),
152 (['l'], SIGNED_INT64_LE, '<qqq',
153 [-1<<63, (1<<63)-1, 0]),
154 (['l'], SIGNED_INT64_BE, '>qqq',
155 [-1<<63, (1<<63)-1, 0]),
156 (['f'], IEEE_754_FLOAT_LE, '<ffff',
157 [16711938.0, float('inf'), float('-inf'), -0.0]),
158 (['f'], IEEE_754_FLOAT_BE, '>ffff',
159 [16711938.0, float('inf'), float('-inf'), -0.0]),
160 (['d'], IEEE_754_DOUBLE_LE, '<dddd',
161 [9006104071832581.0, float('inf'), float('-inf'), -0.0]),
162 (['d'], IEEE_754_DOUBLE_BE, '>dddd',
163 [9006104071832581.0, float('inf'), float('-inf'), -0.0])
164 )
165 for testcase in testcases:
166 valid_typecodes, mformat_code, struct_fmt, values = testcase
167 arraystr = struct.pack(struct_fmt, *values)
168 for typecode in valid_typecodes:
Alexandre Vassalotti0027d4b2009-07-15 20:53:55 +0000169 try:
170 a = array.array(typecode, values)
171 except OverflowError:
172 continue # Skip this test case.
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000173 b = array_reconstructor(
174 array.array, typecode, mformat_code, arraystr)
175 self.assertEqual(a, b,
176 msg="{0!r} != {1!r}; testcase={2!r}".format(a, b, testcase))
177
178 def test_unicode(self):
179 teststr = "Bonne Journ\xe9e \U0002030a\U00020347"
180 testcases = (
181 (UTF16_LE, "UTF-16-LE"),
182 (UTF16_BE, "UTF-16-BE"),
183 (UTF32_LE, "UTF-32-LE"),
184 (UTF32_BE, "UTF-32-BE")
185 )
186 for testcase in testcases:
187 mformat_code, encoding = testcase
188 a = array.array('u', teststr)
189 b = array_reconstructor(
190 array.array, 'u', mformat_code, teststr.encode(encoding))
191 self.assertEqual(a, b,
192 msg="{0!r} != {1!r}; testcase={2!r}".format(a, b, testcase))
193
194
Ezio Melotti1d3e96d2013-01-10 06:04:50 +0200195class BaseTest:
Walter Dörwald7fd94242003-05-18 00:47:47 +0000196 # Required class attributes (provided by subclasses
197 # typecode: the typecode to test
198 # example: an initializer usable in the constructor for this type
199 # smallerexample: the same length as example, but smaller
200 # biggerexample: the same length as example, but bigger
201 # outside: An entry that is not in example
202 # minitemsize: the minimum guaranteed itemsize
Martin v. Löwis99866332002-03-01 10:27:01 +0000203
Walter Dörwald7fd94242003-05-18 00:47:47 +0000204 def assertEntryEqual(self, entry1, entry2):
205 self.assertEqual(entry1, entry2)
Martin v. Löwis99866332002-03-01 10:27:01 +0000206
Walter Dörwald7fd94242003-05-18 00:47:47 +0000207 def badtypecode(self):
208 # Return a typecode that is different from our own
209 return typecodes[(typecodes.index(self.typecode)+1) % len(typecodes)]
Martin v. Löwis99866332002-03-01 10:27:01 +0000210
Walter Dörwald7fd94242003-05-18 00:47:47 +0000211 def test_constructor(self):
212 a = array.array(self.typecode)
213 self.assertEqual(a.typecode, self.typecode)
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200214 self.assertGreaterEqual(a.itemsize, self.minitemsize)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000215 self.assertRaises(TypeError, array.array, self.typecode, None)
Martin v. Löwis99866332002-03-01 10:27:01 +0000216
Walter Dörwald7fd94242003-05-18 00:47:47 +0000217 def test_len(self):
218 a = array.array(self.typecode)
219 a.append(self.example[0])
220 self.assertEqual(len(a), 1)
Martin v. Löwis99866332002-03-01 10:27:01 +0000221
Walter Dörwald7fd94242003-05-18 00:47:47 +0000222 a = array.array(self.typecode, self.example)
223 self.assertEqual(len(a), len(self.example))
Martin v. Löwis99866332002-03-01 10:27:01 +0000224
Walter Dörwald7fd94242003-05-18 00:47:47 +0000225 def test_buffer_info(self):
226 a = array.array(self.typecode, self.example)
227 self.assertRaises(TypeError, a.buffer_info, 42)
228 bi = a.buffer_info()
Ezio Melottie9615932010-01-24 19:26:24 +0000229 self.assertIsInstance(bi, tuple)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000230 self.assertEqual(len(bi), 2)
Ezio Melottie9615932010-01-24 19:26:24 +0000231 self.assertIsInstance(bi[0], int)
232 self.assertIsInstance(bi[1], int)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000233 self.assertEqual(bi[1], len(a))
Martin v. Löwis99866332002-03-01 10:27:01 +0000234
Walter Dörwald7fd94242003-05-18 00:47:47 +0000235 def test_byteswap(self):
Victor Stinner8dba4e02011-09-30 00:51:10 +0200236 if self.typecode == 'u':
237 example = '\U00100100'
238 else:
239 example = self.example
240 a = array.array(self.typecode, example)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000241 self.assertRaises(TypeError, a.byteswap, 42)
242 if a.itemsize in (1, 2, 4, 8):
Victor Stinner8dba4e02011-09-30 00:51:10 +0200243 b = array.array(self.typecode, example)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000244 b.byteswap()
245 if a.itemsize==1:
246 self.assertEqual(a, b)
247 else:
248 self.assertNotEqual(a, b)
249 b.byteswap()
250 self.assertEqual(a, b)
Martin v. Löwis99866332002-03-01 10:27:01 +0000251
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000252 def test_copy(self):
253 import copy
254 a = array.array(self.typecode, self.example)
255 b = copy.copy(a)
256 self.assertNotEqual(id(a), id(b))
257 self.assertEqual(a, b)
258
Thomas Wouters89f507f2006-12-13 04:49:30 +0000259 def test_deepcopy(self):
260 import copy
261 a = array.array(self.typecode, self.example)
262 b = copy.deepcopy(a)
263 self.assertNotEqual(id(a), id(b))
264 self.assertEqual(a, b)
265
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000266 def test_reduce_ex(self):
267 a = array.array(self.typecode, self.example)
268 for protocol in range(3):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000269 self.assertIs(a.__reduce_ex__(protocol)[0], array.array)
Zackery Spytzd1cbc6f2018-11-26 22:40:49 -0700270 for protocol in range(3, pickle.HIGHEST_PROTOCOL + 1):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000271 self.assertIs(a.__reduce_ex__(protocol)[0], array_reconstructor)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000272
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000273 def test_pickle(self):
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000274 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000275 a = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000276 b = pickle.loads(pickle.dumps(a, protocol))
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000277 self.assertNotEqual(id(a), id(b))
278 self.assertEqual(a, b)
279
280 a = ArraySubclass(self.typecode, self.example)
281 a.x = 10
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000282 b = pickle.loads(pickle.dumps(a, protocol))
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000283 self.assertNotEqual(id(a), id(b))
284 self.assertEqual(a, b)
285 self.assertEqual(a.x, b.x)
286 self.assertEqual(type(a), type(b))
287
Guido van Rossumd8faa362007-04-27 19:54:29 +0000288 def test_pickle_for_empty_array(self):
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000289 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossumd8faa362007-04-27 19:54:29 +0000290 a = array.array(self.typecode)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000291 b = pickle.loads(pickle.dumps(a, protocol))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000292 self.assertNotEqual(id(a), id(b))
293 self.assertEqual(a, b)
294
295 a = ArraySubclass(self.typecode)
296 a.x = 10
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000297 b = pickle.loads(pickle.dumps(a, protocol))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000298 self.assertNotEqual(id(a), id(b))
299 self.assertEqual(a, b)
300 self.assertEqual(a.x, b.x)
301 self.assertEqual(type(a), type(b))
302
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000303 def test_iterator_pickle(self):
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200304 orig = array.array(self.typecode, self.example)
305 data = list(orig)
306 data2 = data[::-1]
Serhiy Storchakabad12572014-12-15 14:03:42 +0200307 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200308 # initial iterator
309 itorig = iter(orig)
310 d = pickle.dumps((itorig, orig), proto)
311 it, a = pickle.loads(d)
312 a.fromlist(data2)
313 self.assertEqual(type(it), type(itorig))
314 self.assertEqual(list(it), data + data2)
Serhiy Storchakabad12572014-12-15 14:03:42 +0200315
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200316 # running iterator
317 next(itorig)
318 d = pickle.dumps((itorig, orig), proto)
319 it, a = pickle.loads(d)
320 a.fromlist(data2)
321 self.assertEqual(type(it), type(itorig))
322 self.assertEqual(list(it), data[1:] + data2)
323
324 # empty iterator
325 for i in range(1, len(data)):
326 next(itorig)
327 d = pickle.dumps((itorig, orig), proto)
328 it, a = pickle.loads(d)
329 a.fromlist(data2)
330 self.assertEqual(type(it), type(itorig))
331 self.assertEqual(list(it), data2)
332
333 # exhausted iterator
334 self.assertRaises(StopIteration, next, itorig)
335 d = pickle.dumps((itorig, orig), proto)
336 it, a = pickle.loads(d)
337 a.fromlist(data2)
Serhiy Storchakaab0d1982016-03-30 21:11:16 +0300338 self.assertEqual(list(it), [])
339
340 def test_exhausted_iterator(self):
341 a = array.array(self.typecode, self.example)
342 self.assertEqual(list(a), list(self.example))
343 exhit = iter(a)
344 empit = iter(a)
345 for x in exhit: # exhaust the iterator
346 next(empit) # not exhausted
347 a.append(self.outside)
348 self.assertEqual(list(exhit), [])
349 self.assertEqual(list(empit), [self.outside])
350 self.assertEqual(list(a), list(self.example) + [self.outside])
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000351
Pablo Galindoe51dd9d2020-07-05 22:43:14 +0100352 def test_reverse_iterator(self):
353 a = array.array(self.typecode, self.example)
354 self.assertEqual(list(a), list(self.example))
355 self.assertEqual(list(reversed(a)), list(iter(a))[::-1])
356
357 def test_reverse_iterator_picking(self):
358 orig = array.array(self.typecode, self.example)
359 data = list(orig)
360 data2 = [self.outside] + data
361 rev_data = data[len(data)-2::-1] + [self.outside]
362 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
363 # initial iterator
364 itorig = reversed(orig)
365 d = pickle.dumps((itorig, orig), proto)
366 it, a = pickle.loads(d)
367 a.insert(0, self.outside)
368 self.assertEqual(type(it), type(itorig))
369 self.assertEqual(list(it), rev_data)
370 self.assertEqual(list(a), data2)
371
372 # running iterator
373 next(itorig)
374 d = pickle.dumps((itorig, orig), proto)
375 it, a = pickle.loads(d)
376 a.insert(0, self.outside)
377 self.assertEqual(type(it), type(itorig))
378 self.assertEqual(list(it), rev_data[1:])
379 self.assertEqual(list(a), data2)
380
381 # empty iterator
382 for i in range(1, len(data)):
383 next(itorig)
384 d = pickle.dumps((itorig, orig), proto)
385 it, a = pickle.loads(d)
386 a.insert(0, self.outside)
387 self.assertEqual(type(it), type(itorig))
388 self.assertEqual(list(it), [])
389 self.assertEqual(list(a), data2)
390
391 # exhausted iterator
392 self.assertRaises(StopIteration, next, itorig)
393 d = pickle.dumps((itorig, orig), proto)
394 it, a = pickle.loads(d)
395 a.insert(0, self.outside)
396 self.assertEqual(list(it), [])
397 self.assertEqual(list(a), data2)
398
399 def test_exhausted_reverse_iterator(self):
400 a = array.array(self.typecode, self.example)
401 self.assertEqual(list(a), list(self.example))
402 exhit = reversed(a)
403 empit = reversed(a)
404 for x in exhit: # exhaust the iterator
405 next(empit) # Pointing past the 0th position.
406 a.insert(0, self.outside)
407 self.assertEqual(list(exhit), [])
408 # The iterator index points past the 0th position so inserting
Ikko Ashimine9303b9e2020-11-10 21:42:36 +0900409 # an element in the beginning does not make it appear.
Pablo Galindoe51dd9d2020-07-05 22:43:14 +0100410 self.assertEqual(list(empit), [])
411 self.assertEqual(list(a), [self.outside] + list(self.example))
412
Walter Dörwald7fd94242003-05-18 00:47:47 +0000413 def test_insert(self):
414 a = array.array(self.typecode, self.example)
415 a.insert(0, self.example[0])
416 self.assertEqual(len(a), 1+len(self.example))
417 self.assertEqual(a[0], a[1])
418 self.assertRaises(TypeError, a.insert)
419 self.assertRaises(TypeError, a.insert, None)
Walter Dörwaldba39d9c2003-05-18 01:56:25 +0000420 self.assertRaises(TypeError, a.insert, 0, None)
Martin v. Löwis99866332002-03-01 10:27:01 +0000421
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000422 a = array.array(self.typecode, self.example)
423 a.insert(-1, self.example[0])
424 self.assertEqual(
425 a,
426 array.array(
427 self.typecode,
428 self.example[:-1] + self.example[:1] + self.example[-1:]
429 )
430 )
431
432 a = array.array(self.typecode, self.example)
433 a.insert(-1000, self.example[0])
434 self.assertEqual(
435 a,
436 array.array(self.typecode, self.example[:1] + self.example)
437 )
438
439 a = array.array(self.typecode, self.example)
440 a.insert(1000, self.example[0])
441 self.assertEqual(
442 a,
443 array.array(self.typecode, self.example + self.example[:1])
444 )
445
Walter Dörwald7fd94242003-05-18 00:47:47 +0000446 def test_tofromfile(self):
447 a = array.array(self.typecode, 2*self.example)
448 self.assertRaises(TypeError, a.tofile)
Hai Shif7ba40b2020-06-25 18:38:51 +0800449 os_helper.unlink(os_helper.TESTFN)
450 f = open(os_helper.TESTFN, 'wb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000451 try:
452 a.tofile(f)
453 f.close()
454 b = array.array(self.typecode)
Hai Shif7ba40b2020-06-25 18:38:51 +0800455 f = open(os_helper.TESTFN, 'rb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000456 self.assertRaises(TypeError, b.fromfile)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000457 b.fromfile(f, len(self.example))
458 self.assertEqual(b, array.array(self.typecode, self.example))
459 self.assertNotEqual(a, b)
Hirokazu Yamamoto54d0df62009-03-06 03:04:07 +0000460 self.assertRaises(EOFError, b.fromfile, f, len(self.example)+1)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000461 self.assertEqual(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000462 f.close()
463 finally:
464 if not f.closed:
465 f.close()
Hai Shif7ba40b2020-06-25 18:38:51 +0800466 os_helper.unlink(os_helper.TESTFN)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000467
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000468 def test_fromfile_ioerror(self):
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200469 # Issue #5395: Check if fromfile raises a proper OSError
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000470 # instead of EOFError.
471 a = array.array(self.typecode)
Hai Shif7ba40b2020-06-25 18:38:51 +0800472 f = open(os_helper.TESTFN, 'wb')
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000473 try:
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200474 self.assertRaises(OSError, a.fromfile, f, len(self.example))
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000475 finally:
476 f.close()
Hai Shif7ba40b2020-06-25 18:38:51 +0800477 os_helper.unlink(os_helper.TESTFN)
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000478
Frank Wierzbicki17683432009-08-16 20:30:12 +0000479 def test_filewrite(self):
480 a = array.array(self.typecode, 2*self.example)
Hai Shif7ba40b2020-06-25 18:38:51 +0800481 f = open(os_helper.TESTFN, 'wb')
Frank Wierzbicki17683432009-08-16 20:30:12 +0000482 try:
483 f.write(a)
484 f.close()
485 b = array.array(self.typecode)
Hai Shif7ba40b2020-06-25 18:38:51 +0800486 f = open(os_helper.TESTFN, 'rb')
Frank Wierzbicki17683432009-08-16 20:30:12 +0000487 b.fromfile(f, len(self.example))
488 self.assertEqual(b, array.array(self.typecode, self.example))
489 self.assertNotEqual(a, b)
490 b.fromfile(f, len(self.example))
491 self.assertEqual(a, b)
492 f.close()
493 finally:
494 if not f.closed:
495 f.close()
Hai Shif7ba40b2020-06-25 18:38:51 +0800496 os_helper.unlink(os_helper.TESTFN)
Frank Wierzbicki17683432009-08-16 20:30:12 +0000497
Walter Dörwald7fd94242003-05-18 00:47:47 +0000498 def test_tofromlist(self):
499 a = array.array(self.typecode, 2*self.example)
500 b = array.array(self.typecode)
501 self.assertRaises(TypeError, a.tolist, 42)
502 self.assertRaises(TypeError, b.fromlist)
503 self.assertRaises(TypeError, b.fromlist, 42)
504 self.assertRaises(TypeError, b.fromlist, [None])
505 b.fromlist(a.tolist())
506 self.assertEqual(a, b)
Fred Drake78334472000-06-28 17:50:51 +0000507
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000508 def test_tofrombytes(self):
Walter Dörwald7fd94242003-05-18 00:47:47 +0000509 a = array.array(self.typecode, 2*self.example)
510 b = array.array(self.typecode)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000511 self.assertRaises(TypeError, a.tobytes, 42)
512 self.assertRaises(TypeError, b.frombytes)
513 self.assertRaises(TypeError, b.frombytes, 42)
514 b.frombytes(a.tobytes())
515 c = array.array(self.typecode, bytearray(a.tobytes()))
Walter Dörwald7fd94242003-05-18 00:47:47 +0000516 self.assertEqual(a, b)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000517 self.assertEqual(a, c)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000518 if a.itemsize>1:
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000519 self.assertRaises(ValueError, b.frombytes, b"x")
Fred Drake78334472000-06-28 17:50:51 +0000520
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +0000521 def test_fromarray(self):
522 a = array.array(self.typecode, self.example)
523 b = array.array(self.typecode, a)
524 self.assertEqual(a, b)
525
Walter Dörwald7fd94242003-05-18 00:47:47 +0000526 def test_repr(self):
527 a = array.array(self.typecode, 2*self.example)
528 self.assertEqual(a, eval(repr(a), {"array": array.array}))
Fred Drake78334472000-06-28 17:50:51 +0000529
Walter Dörwald7fd94242003-05-18 00:47:47 +0000530 a = array.array(self.typecode)
531 self.assertEqual(repr(a), "array('%s')" % self.typecode)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000532
Walter Dörwald7fd94242003-05-18 00:47:47 +0000533 def test_str(self):
534 a = array.array(self.typecode, 2*self.example)
535 str(a)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000536
Walter Dörwald7fd94242003-05-18 00:47:47 +0000537 def test_cmp(self):
538 a = array.array(self.typecode, self.example)
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200539 self.assertIs(a == 42, False)
540 self.assertIs(a != 42, True)
Tim Peterscc78e472000-11-14 21:36:07 +0000541
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200542 self.assertIs(a == a, True)
543 self.assertIs(a != a, False)
544 self.assertIs(a < a, False)
545 self.assertIs(a <= a, True)
546 self.assertIs(a > a, False)
547 self.assertIs(a >= a, True)
Tim Peterscc78e472000-11-14 21:36:07 +0000548
Neal Norwitzbd2835c2006-03-17 08:54:15 +0000549 al = array.array(self.typecode, self.smallerexample)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000550 ab = array.array(self.typecode, self.biggerexample)
Guido van Rossum7f1d3aa1998-07-16 15:31:43 +0000551
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200552 self.assertIs(a == 2*a, False)
553 self.assertIs(a != 2*a, True)
554 self.assertIs(a < 2*a, True)
555 self.assertIs(a <= 2*a, True)
556 self.assertIs(a > 2*a, False)
557 self.assertIs(a >= 2*a, False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000558
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200559 self.assertIs(a == al, False)
560 self.assertIs(a != al, True)
561 self.assertIs(a < al, False)
562 self.assertIs(a <= al, False)
563 self.assertIs(a > al, True)
564 self.assertIs(a >= al, True)
Martin v. Löwis99866332002-03-01 10:27:01 +0000565
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200566 self.assertIs(a == ab, False)
567 self.assertIs(a != ab, True)
568 self.assertIs(a < ab, True)
569 self.assertIs(a <= ab, True)
570 self.assertIs(a > ab, False)
571 self.assertIs(a >= ab, False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000572
Walter Dörwald7fd94242003-05-18 00:47:47 +0000573 def test_add(self):
574 a = array.array(self.typecode, self.example) \
575 + array.array(self.typecode, self.example[::-1])
576 self.assertEqual(
577 a,
578 array.array(self.typecode, self.example + self.example[::-1])
579 )
Martin v. Löwis99866332002-03-01 10:27:01 +0000580
Walter Dörwald7fd94242003-05-18 00:47:47 +0000581 b = array.array(self.badtypecode())
582 self.assertRaises(TypeError, a.__add__, b)
583
584 self.assertRaises(TypeError, a.__add__, "bad")
585
586 def test_iadd(self):
587 a = array.array(self.typecode, self.example[::-1])
588 b = a
589 a += array.array(self.typecode, 2*self.example)
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200590 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000591 self.assertEqual(
592 a,
593 array.array(self.typecode, self.example[::-1]+2*self.example)
594 )
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000595 a = array.array(self.typecode, self.example)
596 a += a
597 self.assertEqual(
598 a,
599 array.array(self.typecode, self.example + self.example)
600 )
Walter Dörwald7fd94242003-05-18 00:47:47 +0000601
602 b = array.array(self.badtypecode())
603 self.assertRaises(TypeError, a.__add__, b)
604
605 self.assertRaises(TypeError, a.__iadd__, "bad")
606
607 def test_mul(self):
608 a = 5*array.array(self.typecode, self.example)
609 self.assertEqual(
610 a,
611 array.array(self.typecode, 5*self.example)
612 )
613
614 a = array.array(self.typecode, self.example)*5
615 self.assertEqual(
616 a,
617 array.array(self.typecode, self.example*5)
618 )
619
620 a = 0*array.array(self.typecode, self.example)
621 self.assertEqual(
622 a,
623 array.array(self.typecode)
624 )
625
626 a = (-1)*array.array(self.typecode, self.example)
627 self.assertEqual(
628 a,
629 array.array(self.typecode)
630 )
631
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000632 a = 5 * array.array(self.typecode, self.example[:1])
633 self.assertEqual(
634 a,
635 array.array(self.typecode, [a[0]] * 5)
636 )
637
Walter Dörwald7fd94242003-05-18 00:47:47 +0000638 self.assertRaises(TypeError, a.__mul__, "bad")
639
640 def test_imul(self):
641 a = array.array(self.typecode, self.example)
642 b = a
643
644 a *= 5
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200645 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000646 self.assertEqual(
647 a,
648 array.array(self.typecode, 5*self.example)
649 )
650
651 a *= 0
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200652 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000653 self.assertEqual(a, array.array(self.typecode))
654
655 a *= 1000
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200656 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000657 self.assertEqual(a, array.array(self.typecode))
658
659 a *= -1
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200660 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000661 self.assertEqual(a, array.array(self.typecode))
662
663 a = array.array(self.typecode, self.example)
664 a *= -1
665 self.assertEqual(a, array.array(self.typecode))
666
667 self.assertRaises(TypeError, a.__imul__, "bad")
668
669 def test_getitem(self):
670 a = array.array(self.typecode, self.example)
671 self.assertEntryEqual(a[0], self.example[0])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000672 self.assertEntryEqual(a[0], self.example[0])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000673 self.assertEntryEqual(a[-1], self.example[-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000674 self.assertEntryEqual(a[-1], self.example[-1])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000675 self.assertEntryEqual(a[len(self.example)-1], self.example[-1])
676 self.assertEntryEqual(a[-len(self.example)], self.example[0])
677 self.assertRaises(TypeError, a.__getitem__)
678 self.assertRaises(IndexError, a.__getitem__, len(self.example))
679 self.assertRaises(IndexError, a.__getitem__, -len(self.example)-1)
680
681 def test_setitem(self):
682 a = array.array(self.typecode, self.example)
683 a[0] = a[-1]
684 self.assertEntryEqual(a[0], a[-1])
685
686 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000687 a[0] = a[-1]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000688 self.assertEntryEqual(a[0], a[-1])
689
690 a = array.array(self.typecode, self.example)
691 a[-1] = a[0]
692 self.assertEntryEqual(a[0], a[-1])
693
694 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000695 a[-1] = a[0]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000696 self.assertEntryEqual(a[0], a[-1])
697
698 a = array.array(self.typecode, self.example)
699 a[len(self.example)-1] = a[0]
700 self.assertEntryEqual(a[0], a[-1])
701
702 a = array.array(self.typecode, self.example)
703 a[-len(self.example)] = a[-1]
704 self.assertEntryEqual(a[0], a[-1])
705
706 self.assertRaises(TypeError, a.__setitem__)
707 self.assertRaises(TypeError, a.__setitem__, None)
708 self.assertRaises(TypeError, a.__setitem__, 0, None)
709 self.assertRaises(
710 IndexError,
711 a.__setitem__,
712 len(self.example), self.example[0]
713 )
714 self.assertRaises(
715 IndexError,
716 a.__setitem__,
717 -len(self.example)-1, self.example[0]
718 )
719
720 def test_delitem(self):
721 a = array.array(self.typecode, self.example)
722 del a[0]
723 self.assertEqual(
724 a,
725 array.array(self.typecode, self.example[1:])
726 )
727
728 a = array.array(self.typecode, self.example)
729 del a[-1]
730 self.assertEqual(
731 a,
732 array.array(self.typecode, self.example[:-1])
733 )
734
735 a = array.array(self.typecode, self.example)
736 del a[len(self.example)-1]
737 self.assertEqual(
738 a,
739 array.array(self.typecode, self.example[:-1])
740 )
741
742 a = array.array(self.typecode, self.example)
743 del a[-len(self.example)]
744 self.assertEqual(
745 a,
746 array.array(self.typecode, self.example[1:])
747 )
748
749 self.assertRaises(TypeError, a.__delitem__)
750 self.assertRaises(TypeError, a.__delitem__, None)
751 self.assertRaises(IndexError, a.__delitem__, len(self.example))
752 self.assertRaises(IndexError, a.__delitem__, -len(self.example)-1)
753
754 def test_getslice(self):
755 a = array.array(self.typecode, self.example)
756 self.assertEqual(a[:], a)
757
758 self.assertEqual(
759 a[1:],
760 array.array(self.typecode, self.example[1:])
761 )
762
763 self.assertEqual(
764 a[:1],
765 array.array(self.typecode, self.example[:1])
766 )
767
768 self.assertEqual(
769 a[:-1],
770 array.array(self.typecode, self.example[:-1])
771 )
772
773 self.assertEqual(
774 a[-1:],
775 array.array(self.typecode, self.example[-1:])
776 )
777
778 self.assertEqual(
779 a[-1:-1],
780 array.array(self.typecode)
781 )
782
783 self.assertEqual(
Walter Dörwald1083c242005-01-21 21:16:51 +0000784 a[2:1],
785 array.array(self.typecode)
786 )
787
788 self.assertEqual(
Walter Dörwald7fd94242003-05-18 00:47:47 +0000789 a[1000:],
790 array.array(self.typecode)
791 )
792 self.assertEqual(a[-1000:], a)
793 self.assertEqual(a[:1000], a)
794 self.assertEqual(
795 a[:-1000],
796 array.array(self.typecode)
797 )
798 self.assertEqual(a[-1000:1000], a)
799 self.assertEqual(
800 a[2000:1000],
801 array.array(self.typecode)
802 )
803
Thomas Woutersed03b412007-08-28 21:37:11 +0000804 def test_extended_getslice(self):
805 # Test extended slicing by comparing with list slicing
806 # (Assumes list conversion works correctly, too)
807 a = array.array(self.typecode, self.example)
Zackery Spytz14514d92019-05-17 01:13:03 -0600808 indices = (0, None, 1, 3, 19, 100, sys.maxsize, -1, -2, -31, -100)
Thomas Woutersed03b412007-08-28 21:37:11 +0000809 for start in indices:
810 for stop in indices:
811 # Everything except the initial 0 (invalid step)
812 for step in indices[1:]:
813 self.assertEqual(list(a[start:stop:step]),
814 list(a)[start:stop:step])
815
Walter Dörwald7fd94242003-05-18 00:47:47 +0000816 def test_setslice(self):
817 a = array.array(self.typecode, self.example)
818 a[:1] = a
819 self.assertEqual(
820 a,
821 array.array(self.typecode, self.example + self.example[1:])
822 )
823
824 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000825 a[:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000826 self.assertEqual(
827 a,
828 array.array(self.typecode, self.example + self.example[-1:])
829 )
830
831 a = array.array(self.typecode, self.example)
832 a[-1:] = a
833 self.assertEqual(
834 a,
835 array.array(self.typecode, self.example[:-1] + self.example)
836 )
837
838 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000839 a[1:] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000840 self.assertEqual(
841 a,
842 array.array(self.typecode, self.example[:1] + self.example)
843 )
844
845 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000846 a[1:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000847 self.assertEqual(
848 a,
849 array.array(
850 self.typecode,
851 self.example[:1] + self.example + self.example[-1:]
852 )
853 )
854
855 a = array.array(self.typecode, self.example)
856 a[1000:] = a
857 self.assertEqual(
858 a,
859 array.array(self.typecode, 2*self.example)
860 )
861
862 a = array.array(self.typecode, self.example)
863 a[-1000:] = a
864 self.assertEqual(
865 a,
866 array.array(self.typecode, self.example)
867 )
868
869 a = array.array(self.typecode, self.example)
870 a[:1000] = a
871 self.assertEqual(
872 a,
873 array.array(self.typecode, self.example)
874 )
875
876 a = array.array(self.typecode, self.example)
877 a[:-1000] = a
878 self.assertEqual(
879 a,
880 array.array(self.typecode, 2*self.example)
881 )
882
883 a = array.array(self.typecode, self.example)
884 a[1:0] = a
885 self.assertEqual(
886 a,
887 array.array(self.typecode, self.example[:1] + self.example + self.example[1:])
888 )
889
890 a = array.array(self.typecode, self.example)
891 a[2000:1000] = a
892 self.assertEqual(
893 a,
894 array.array(self.typecode, 2*self.example)
895 )
896
897 a = array.array(self.typecode, self.example)
Thomas Woutersed03b412007-08-28 21:37:11 +0000898 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), None)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000899 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), None)
900
901 b = array.array(self.badtypecode())
Thomas Woutersed03b412007-08-28 21:37:11 +0000902 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000903 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), b)
904
Thomas Woutersed03b412007-08-28 21:37:11 +0000905 def test_extended_set_del_slice(self):
Zackery Spytz14514d92019-05-17 01:13:03 -0600906 indices = (0, None, 1, 3, 19, 100, sys.maxsize, -1, -2, -31, -100)
Thomas Woutersed03b412007-08-28 21:37:11 +0000907 for start in indices:
908 for stop in indices:
909 # Everything except the initial 0 (invalid step)
910 for step in indices[1:]:
911 a = array.array(self.typecode, self.example)
912 L = list(a)
913 # Make sure we have a slice of exactly the right length,
914 # but with (hopefully) different data.
915 data = L[start:stop:step]
916 data.reverse()
917 L[start:stop:step] = data
918 a[start:stop:step] = array.array(self.typecode, data)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000919 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000920
921 del L[start:stop:step]
922 del a[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +0000923 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000924
Walter Dörwald7fd94242003-05-18 00:47:47 +0000925 def test_index(self):
926 example = 2*self.example
927 a = array.array(self.typecode, example)
928 self.assertRaises(TypeError, a.index)
929 for x in example:
930 self.assertEqual(a.index(x), example.index(x))
931 self.assertRaises(ValueError, a.index, None)
932 self.assertRaises(ValueError, a.index, self.outside)
933
Zackery Spytzafd12652021-04-02 09:28:35 -0600934 a = array.array('i', [-2, -1, 0, 0, 1, 2])
935 self.assertEqual(a.index(0), 2)
936 self.assertEqual(a.index(0, 2), 2)
937 self.assertEqual(a.index(0, -4), 2)
938 self.assertEqual(a.index(-2, -10), 0)
939 self.assertEqual(a.index(0, 3), 3)
940 self.assertEqual(a.index(0, -3), 3)
941 self.assertEqual(a.index(0, 3, 4), 3)
942 self.assertEqual(a.index(0, -3, -2), 3)
943 self.assertRaises(ValueError, a.index, 2, 0, -10)
944
Walter Dörwald7fd94242003-05-18 00:47:47 +0000945 def test_count(self):
946 example = 2*self.example
947 a = array.array(self.typecode, example)
948 self.assertRaises(TypeError, a.count)
949 for x in example:
950 self.assertEqual(a.count(x), example.count(x))
951 self.assertEqual(a.count(self.outside), 0)
952 self.assertEqual(a.count(None), 0)
953
954 def test_remove(self):
955 for x in self.example:
956 example = 2*self.example
957 a = array.array(self.typecode, example)
958 pos = example.index(x)
959 example2 = example[:pos] + example[pos+1:]
960 a.remove(x)
961 self.assertEqual(a, array.array(self.typecode, example2))
962
963 a = array.array(self.typecode, self.example)
964 self.assertRaises(ValueError, a.remove, self.outside)
965
966 self.assertRaises(ValueError, a.remove, None)
967
968 def test_pop(self):
969 a = array.array(self.typecode)
970 self.assertRaises(IndexError, a.pop)
971
972 a = array.array(self.typecode, 2*self.example)
973 self.assertRaises(TypeError, a.pop, 42, 42)
974 self.assertRaises(TypeError, a.pop, None)
975 self.assertRaises(IndexError, a.pop, len(a))
976 self.assertRaises(IndexError, a.pop, -len(a)-1)
977
978 self.assertEntryEqual(a.pop(0), self.example[0])
979 self.assertEqual(
980 a,
981 array.array(self.typecode, self.example[1:]+self.example)
982 )
983 self.assertEntryEqual(a.pop(1), self.example[2])
984 self.assertEqual(
985 a,
986 array.array(self.typecode, self.example[1:2]+self.example[3:]+self.example)
987 )
988 self.assertEntryEqual(a.pop(0), self.example[1])
989 self.assertEntryEqual(a.pop(), self.example[-1])
990 self.assertEqual(
991 a,
992 array.array(self.typecode, self.example[3:]+self.example[:-1])
993 )
994
995 def test_reverse(self):
996 a = array.array(self.typecode, self.example)
997 self.assertRaises(TypeError, a.reverse, 42)
Fred Drake004d5e62000-10-23 17:22:08 +0000998 a.reverse()
Walter Dörwald7fd94242003-05-18 00:47:47 +0000999 self.assertEqual(
1000 a,
1001 array.array(self.typecode, self.example[::-1])
1002 )
1003
1004 def test_extend(self):
1005 a = array.array(self.typecode, self.example)
1006 self.assertRaises(TypeError, a.extend)
1007 a.extend(array.array(self.typecode, self.example[::-1]))
1008 self.assertEqual(
1009 a,
1010 array.array(self.typecode, self.example+self.example[::-1])
1011 )
1012
Alexandre Vassalottie503cf92009-07-05 06:25:14 +00001013 a = array.array(self.typecode, self.example)
1014 a.extend(a)
1015 self.assertEqual(
1016 a,
1017 array.array(self.typecode, self.example+self.example)
1018 )
1019
Walter Dörwald7fd94242003-05-18 00:47:47 +00001020 b = array.array(self.badtypecode())
1021 self.assertRaises(TypeError, a.extend, b)
1022
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001023 a = array.array(self.typecode, self.example)
1024 a.extend(self.example[::-1])
1025 self.assertEqual(
1026 a,
1027 array.array(self.typecode, self.example+self.example[::-1])
1028 )
1029
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001030 def test_constructor_with_iterable_argument(self):
1031 a = array.array(self.typecode, iter(self.example))
1032 b = array.array(self.typecode, self.example)
1033 self.assertEqual(a, b)
1034
1035 # non-iterable argument
1036 self.assertRaises(TypeError, array.array, self.typecode, 10)
1037
1038 # pass through errors raised in __iter__
1039 class A:
1040 def __iter__(self):
1041 raise UnicodeError
1042 self.assertRaises(UnicodeError, array.array, self.typecode, A())
1043
1044 # pass through errors raised in next()
1045 def B():
1046 raise UnicodeError
1047 yield None
1048 self.assertRaises(UnicodeError, array.array, self.typecode, B())
1049
Walter Dörwald7fd94242003-05-18 00:47:47 +00001050 def test_coveritertraverse(self):
1051 try:
1052 import gc
1053 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001054 self.skipTest('gc module not available')
Walter Dörwald7fd94242003-05-18 00:47:47 +00001055 a = array.array(self.typecode)
1056 l = [iter(a)]
1057 l.append(l)
1058 gc.collect()
1059
1060 def test_buffer(self):
1061 a = array.array(self.typecode, self.example)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001062 m = memoryview(a)
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001063 expected = m.tobytes()
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001064 self.assertEqual(a.tobytes(), expected)
1065 self.assertEqual(a.tobytes()[0], expected[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001066 # Resizing is forbidden when there are buffer exports.
1067 # For issue 4509, we also check after each error that
1068 # the array was not modified.
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001069 self.assertRaises(BufferError, a.append, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001070 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001071 self.assertRaises(BufferError, a.extend, a[0:1])
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001072 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001073 self.assertRaises(BufferError, a.remove, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001074 self.assertEqual(m.tobytes(), expected)
1075 self.assertRaises(BufferError, a.pop, 0)
1076 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001077 self.assertRaises(BufferError, a.fromlist, a.tolist())
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001078 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001079 self.assertRaises(BufferError, a.frombytes, a.tobytes())
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001080 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001081 if self.typecode == 'u':
1082 self.assertRaises(BufferError, a.fromunicode, a.tounicode())
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001083 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +00001084 self.assertRaises(BufferError, operator.imul, a, 2)
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001085 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +00001086 self.assertRaises(BufferError, operator.imul, a, 0)
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001087 self.assertEqual(m.tobytes(), expected)
1088 self.assertRaises(BufferError, operator.setitem, a, slice(0, 0), a)
1089 self.assertEqual(m.tobytes(), expected)
1090 self.assertRaises(BufferError, operator.delitem, a, 0)
1091 self.assertEqual(m.tobytes(), expected)
1092 self.assertRaises(BufferError, operator.delitem, a, slice(0, 1))
1093 self.assertEqual(m.tobytes(), expected)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001094
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001095 def test_weakref(self):
1096 s = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001097 p = weakref.proxy(s)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001098 self.assertEqual(p.tobytes(), s.tobytes())
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001099 s = None
1100 self.assertRaises(ReferenceError, len, p)
1101
Serhiy Storchaka43767632013-11-03 21:31:38 +02001102 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
1103 'test needs sys.getrefcount()')
Skip Montanarod5cf0b82003-08-03 23:02:10 +00001104 def test_bug_782369(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +02001105 for i in range(10):
1106 b = array.array('B', range(64))
1107 rc = sys.getrefcount(10)
1108 for i in range(10):
1109 b = array.array('B', range(64))
1110 self.assertEqual(rc, sys.getrefcount(10))
Skip Montanarod5cf0b82003-08-03 23:02:10 +00001111
Thomas Woutersb2137042007-02-01 18:02:27 +00001112 def test_subclass_with_kwargs(self):
1113 # SF bug #1486663 -- this used to erroneously raise a TypeError
1114 ArraySubclassWithKwargs('b', newarg=1)
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001115
Guido van Rossum6b826ab2007-07-03 16:22:09 +00001116 def test_create_from_bytes(self):
Alexandre Vassalotti7e4f3212009-07-05 05:38:18 +00001117 # XXX This test probably needs to be moved in a subclass or
1118 # generalized to use self.typecode.
Guido van Rossum6b826ab2007-07-03 16:22:09 +00001119 a = array.array('H', b"1234")
1120 self.assertEqual(len(a) * a.itemsize, 4)
1121
Meador Inge03b4d502012-08-10 22:35:45 -05001122 @support.cpython_only
1123 def test_sizeof_with_buffer(self):
1124 a = array.array(self.typecode, self.example)
Meador Inge80dd1af2012-08-10 23:21:39 -05001125 basesize = support.calcvobjsize('Pn2Pi')
Meador Inge03b4d502012-08-10 22:35:45 -05001126 buffer_size = a.buffer_info()[1] * a.itemsize
1127 support.check_sizeof(self, a, basesize + buffer_size)
1128
1129 @support.cpython_only
1130 def test_sizeof_without_buffer(self):
1131 a = array.array(self.typecode)
Meador Inge80dd1af2012-08-10 23:21:39 -05001132 basesize = support.calcvobjsize('Pn2Pi')
Meador Inge03b4d502012-08-10 22:35:45 -05001133 support.check_sizeof(self, a, basesize)
1134
Alexandre Vassalotti9730e332013-11-29 20:47:15 -08001135 def test_initialize_with_unicode(self):
1136 if self.typecode != 'u':
1137 with self.assertRaises(TypeError) as cm:
1138 a = array.array(self.typecode, 'foo')
1139 self.assertIn("cannot use a str", str(cm.exception))
1140 with self.assertRaises(TypeError) as cm:
1141 a = array.array(self.typecode, array.array('u', 'foo'))
1142 self.assertIn("cannot use a unicode array", str(cm.exception))
1143 else:
1144 a = array.array(self.typecode, "foo")
1145 a = array.array(self.typecode, array.array('u', 'foo'))
1146
Stefan Krah650c1e82015-02-03 21:43:23 +01001147 @support.cpython_only
1148 def test_obsolete_write_lock(self):
1149 from _testcapi import getbuffer_with_null_view
1150 a = array.array('B', b"")
1151 self.assertRaises(BufferError, getbuffer_with_null_view, a)
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001152
Serhiy Storchakaab0d1982016-03-30 21:11:16 +03001153 def test_free_after_iterating(self):
1154 support.check_free_after_iterating(self, iter, array.array,
1155 (self.typecode,))
1156 support.check_free_after_iterating(self, reversed, array.array,
1157 (self.typecode,))
1158
Walter Dörwald7fd94242003-05-18 00:47:47 +00001159class StringTest(BaseTest):
1160
1161 def test_setitem(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001162 super().test_setitem()
Walter Dörwald7fd94242003-05-18 00:47:47 +00001163 a = array.array(self.typecode, self.example)
1164 self.assertRaises(TypeError, a.__setitem__, 0, self.example[:2])
1165
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001166class UnicodeTest(StringTest, unittest.TestCase):
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001167 typecode = 'u'
1168 example = '\x01\u263a\x00\ufeff'
1169 smallerexample = '\x01\u263a\x00\ufefe'
1170 biggerexample = '\x01\u263a\x01\ufeff'
1171 outside = str('\x33')
Victor Stinner8d4734f2012-08-08 20:09:21 +02001172 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001173
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001174 def test_unicode(self):
1175 self.assertRaises(TypeError, array.array, 'b', 'foo')
Walter Dörwald7fd94242003-05-18 00:47:47 +00001176
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001177 a = array.array('u', '\xa0\xc2\u1234')
1178 a.fromunicode(' ')
1179 a.fromunicode('')
1180 a.fromunicode('')
1181 a.fromunicode('\x11abc\xff\u1234')
1182 s = a.tounicode()
1183 self.assertEqual(s, '\xa0\xc2\u1234 \x11abc\xff\u1234')
Victor Stinner9d512ab2012-08-09 00:43:56 +02001184 self.assertEqual(a.itemsize, sizeof_wchar)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001185
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001186 s = '\x00="\'a\\b\x80\xff\u0000\u0001\u1234'
1187 a = array.array('u', s)
1188 self.assertEqual(
1189 repr(a),
Georg Brandl559e5d72008-06-11 18:37:52 +00001190 "array('u', '\\x00=\"\\'a\\\\b\\x80\xff\\x00\\x01\u1234')")
Walter Dörwald7fd94242003-05-18 00:47:47 +00001191
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001192 self.assertRaises(TypeError, a.fromunicode)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001193
Victor Stinner29ec5952013-02-26 00:27:38 +01001194 def test_issue17223(self):
1195 # this used to crash
Victor Stinnerc472c5d2013-02-26 22:52:11 +01001196 if sizeof_wchar == 4:
1197 # U+FFFFFFFF is an invalid code point in Unicode 6.0
1198 invalid_str = b'\xff\xff\xff\xff'
1199 else:
Victor Stinner29c00342013-03-08 02:33:06 +01001200 # PyUnicode_FromUnicode() cannot fail with 16-bit wchar_t
1201 self.skipTest("specific to 32-bit wchar_t")
Victor Stinnerc472c5d2013-02-26 22:52:11 +01001202 a = array.array('u', invalid_str)
Victor Stinner29ec5952013-02-26 00:27:38 +01001203 self.assertRaises(ValueError, a.tounicode)
1204 self.assertRaises(ValueError, str, a)
1205
Walter Dörwald7fd94242003-05-18 00:47:47 +00001206class NumberTest(BaseTest):
1207
1208 def test_extslice(self):
1209 a = array.array(self.typecode, range(5))
1210 self.assertEqual(a[::], a)
1211 self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
1212 self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
1213 self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
1214 self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
1215 self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
1216 self.assertEqual(a[-100:100:], a)
1217 self.assertEqual(a[100:-100:-1], a[::-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +00001218 self.assertEqual(a[-100:100:2], array.array(self.typecode, [0,2,4]))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001219 self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
1220 self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
1221
1222 def test_delslice(self):
1223 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001224 del a[::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001225 self.assertEqual(a, array.array(self.typecode, [1,3]))
1226 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001227 del a[1::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001228 self.assertEqual(a, array.array(self.typecode, [0,2,4]))
1229 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001230 del a[1::-2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001231 self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
1232 a = array.array(self.typecode, range(10))
Michael W. Hudson56796f62002-07-29 14:35:04 +00001233 del a[::1000]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001234 self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
Mark Dickinsonbc099642010-01-29 17:27:24 +00001235 # test issue7788
1236 a = array.array(self.typecode, range(10))
1237 del a[9::1<<333]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001238
1239 def test_assignment(self):
1240 a = array.array(self.typecode, range(10))
1241 a[::2] = array.array(self.typecode, [42]*5)
1242 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
1243 a = array.array(self.typecode, range(10))
1244 a[::-4] = array.array(self.typecode, [10]*3)
1245 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
1246 a = array.array(self.typecode, range(4))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001247 a[::-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +00001248 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
1249 a = array.array(self.typecode, range(10))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001250 b = a[:]
1251 c = a[:]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001252 ins = array.array(self.typecode, range(2))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001253 a[2:3] = ins
1254 b[slice(2,3)] = ins
1255 c[2:3:] = ins
Fred Drake004d5e62000-10-23 17:22:08 +00001256
Walter Dörwald7fd94242003-05-18 00:47:47 +00001257 def test_iterationcontains(self):
1258 a = array.array(self.typecode, range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +00001259 self.assertEqual(list(a), list(range(10)))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001260 b = array.array(self.typecode, [20])
1261 self.assertEqual(a[-1] in a, True)
1262 self.assertEqual(b[0] not in a, True)
1263
1264 def check_overflow(self, lower, upper):
1265 # method to be used by subclasses
1266
1267 # should not overflow assigning lower limit
1268 a = array.array(self.typecode, [lower])
1269 a[0] = lower
1270 # should overflow assigning less than lower limit
1271 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
1272 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
1273 # should not overflow assigning upper limit
1274 a = array.array(self.typecode, [upper])
1275 a[0] = upper
1276 # should overflow assigning more than upper limit
1277 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
1278 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
1279
1280 def test_subclassing(self):
1281 typecode = self.typecode
1282 class ExaggeratingArray(array.array):
1283 __slots__ = ['offset']
1284
1285 def __new__(cls, typecode, data, offset):
1286 return array.array.__new__(cls, typecode, data)
1287
1288 def __init__(self, typecode, data, offset):
1289 self.offset = offset
1290
1291 def __getitem__(self, i):
1292 return array.array.__getitem__(self, i) + self.offset
1293
1294 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
1295 self.assertEntryEqual(a[0], 7)
1296
1297 self.assertRaises(AttributeError, setattr, a, "color", "blue")
1298
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00001299 def test_frombytearray(self):
1300 a = array.array('b', range(10))
1301 b = array.array(self.typecode, a)
1302 self.assertEqual(a, b)
1303
orenmn964281a2017-03-09 11:35:28 +02001304class IntegerNumberTest(NumberTest):
1305 def test_type_error(self):
1306 a = array.array(self.typecode)
1307 a.append(42)
1308 with self.assertRaises(TypeError):
1309 a.append(42.0)
1310 with self.assertRaises(TypeError):
1311 a[0] = 42.0
1312
1313class Intable:
1314 def __init__(self, num):
1315 self._num = num
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +02001316 def __index__(self):
1317 return self._num
orenmn964281a2017-03-09 11:35:28 +02001318 def __int__(self):
1319 return self._num
1320 def __sub__(self, other):
1321 return Intable(int(self) - int(other))
1322 def __add__(self, other):
1323 return Intable(int(self) + int(other))
1324
1325class SignedNumberTest(IntegerNumberTest):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001326 example = [-1, 0, 1, 42, 0x7f]
1327 smallerexample = [-1, 0, 1, 42, 0x7e]
1328 biggerexample = [-1, 0, 1, 43, 0x7f]
1329 outside = 23
1330
1331 def test_overflow(self):
1332 a = array.array(self.typecode)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001333 lower = -1 * int(pow(2, a.itemsize * 8 - 1))
1334 upper = int(pow(2, a.itemsize * 8 - 1)) - 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))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001337
orenmn964281a2017-03-09 11:35:28 +02001338class UnsignedNumberTest(IntegerNumberTest):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001339 example = [0, 1, 17, 23, 42, 0xff]
1340 smallerexample = [0, 1, 17, 23, 42, 0xfe]
1341 biggerexample = [0, 1, 17, 23, 43, 0xff]
1342 outside = 0xaa
1343
1344 def test_overflow(self):
1345 a = array.array(self.typecode)
1346 lower = 0
Guido van Rossume2a383d2007-01-15 16:59:06 +00001347 upper = int(pow(2, a.itemsize * 8)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001348 self.check_overflow(lower, upper)
orenmn964281a2017-03-09 11:35:28 +02001349 self.check_overflow(Intable(lower), Intable(upper))
Fred Drake004d5e62000-10-23 17:22:08 +00001350
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001351 def test_bytes_extend(self):
1352 s = bytes(self.example)
1353
1354 a = array.array(self.typecode, self.example)
1355 a.extend(s)
1356 self.assertEqual(
1357 a,
1358 array.array(self.typecode, self.example+self.example)
1359 )
1360
1361 a = array.array(self.typecode, self.example)
1362 a.extend(bytearray(reversed(s)))
1363 self.assertEqual(
1364 a,
1365 array.array(self.typecode, self.example+self.example[::-1])
1366 )
1367
Fred Drake004d5e62000-10-23 17:22:08 +00001368
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001369class ByteTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001370 typecode = 'b'
1371 minitemsize = 1
Fred Drake004d5e62000-10-23 17:22:08 +00001372
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001373class UnsignedByteTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001374 typecode = 'B'
1375 minitemsize = 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001376
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001377class ShortTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001378 typecode = 'h'
1379 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001380
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001381class UnsignedShortTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001382 typecode = 'H'
1383 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001384
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001385class IntTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001386 typecode = 'i'
1387 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001388
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001389class UnsignedIntTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001390 typecode = 'I'
1391 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001392
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001393class LongTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001394 typecode = 'l'
1395 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001396
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001397class UnsignedLongTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001398 typecode = 'L'
1399 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001400
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001401class LongLongTest(SignedNumberTest, unittest.TestCase):
Meador Inge1c9f0c92011-09-20 19:55:51 -05001402 typecode = 'q'
1403 minitemsize = 8
Meador Inge1c9f0c92011-09-20 19:55:51 -05001404
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001405class UnsignedLongLongTest(UnsignedNumberTest, unittest.TestCase):
Meador Inge1c9f0c92011-09-20 19:55:51 -05001406 typecode = 'Q'
1407 minitemsize = 8
Meador Inge1c9f0c92011-09-20 19:55:51 -05001408
Walter Dörwald7fd94242003-05-18 00:47:47 +00001409class FPTest(NumberTest):
1410 example = [-42.0, 0, 42, 1e5, -1e10]
1411 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
1412 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
1413 outside = 23
1414
1415 def assertEntryEqual(self, entry1, entry2):
1416 self.assertAlmostEqual(entry1, entry2)
1417
Adrian Wielgosik7c17e232017-08-17 12:46:06 +00001418 def test_nan(self):
1419 a = array.array(self.typecode, [float('nan')])
1420 b = array.array(self.typecode, [float('nan')])
1421 self.assertIs(a != b, True)
1422 self.assertIs(a == b, False)
1423 self.assertIs(a > b, False)
1424 self.assertIs(a >= b, False)
1425 self.assertIs(a < b, False)
1426 self.assertIs(a <= b, False)
1427
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001428 def test_byteswap(self):
1429 a = array.array(self.typecode, self.example)
1430 self.assertRaises(TypeError, a.byteswap, 42)
1431 if a.itemsize in (1, 2, 4, 8):
1432 b = array.array(self.typecode, self.example)
1433 b.byteswap()
1434 if a.itemsize==1:
1435 self.assertEqual(a, b)
1436 else:
1437 # On alphas treating the byte swapped bit patters as
1438 # floats/doubles results in floating point exceptions
1439 # => compare the 8bit string values instead
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001440 self.assertNotEqual(a.tobytes(), b.tobytes())
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001441 b.byteswap()
1442 self.assertEqual(a, b)
1443
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001444class FloatTest(FPTest, unittest.TestCase):
Neal Norwitz35c6cd02003-05-22 13:29:15 +00001445 typecode = 'f'
1446 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001447
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001448class DoubleTest(FPTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001449 typecode = 'd'
1450 minitemsize = 8
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001451
1452 def test_alloc_overflow(self):
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001453 from sys import maxsize
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001454 a = array.array('d', [-1]*65536)
1455 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001456 a *= maxsize//65536 + 1
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001457 except MemoryError:
1458 pass
1459 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001460 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001461 b = array.array('d', [ 2.71828183, 3.14159265, -1])
1462 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001463 b * (maxsize//3 + 1)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001464 except MemoryError:
1465 pass
1466 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001467 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001468
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001469
sthaa3ecb82019-03-20 20:49:39 +01001470class LargeArrayTest(unittest.TestCase):
1471 typecode = 'b'
1472
1473 def example(self, size):
1474 # We assess a base memuse of <=2.125 for constructing this array
1475 base = array.array(self.typecode, [0, 1, 2, 3, 4, 5, 6, 7]) * (size // 8)
1476 base += array.array(self.typecode, [99]*(size % 8) + [8, 9, 10, 11])
1477 return base
1478
1479 @support.bigmemtest(_2G, memuse=2.125)
1480 def test_example_data(self, size):
1481 example = self.example(size)
1482 self.assertEqual(len(example), size+4)
1483
1484 @support.bigmemtest(_2G, memuse=2.125)
1485 def test_access(self, size):
1486 example = self.example(size)
1487 self.assertEqual(example[0], 0)
1488 self.assertEqual(example[-(size+4)], 0)
1489 self.assertEqual(example[size], 8)
1490 self.assertEqual(example[-4], 8)
1491 self.assertEqual(example[size+3], 11)
1492 self.assertEqual(example[-1], 11)
1493
1494 @support.bigmemtest(_2G, memuse=2.125+1)
1495 def test_slice(self, size):
1496 example = self.example(size)
1497 self.assertEqual(list(example[:4]), [0, 1, 2, 3])
1498 self.assertEqual(list(example[-4:]), [8, 9, 10, 11])
1499 part = example[1:-1]
1500 self.assertEqual(len(part), size+2)
1501 self.assertEqual(part[0], 1)
1502 self.assertEqual(part[-1], 10)
1503 del part
1504 part = example[::2]
1505 self.assertEqual(len(part), (size+5)//2)
1506 self.assertEqual(list(part[:4]), [0, 2, 4, 6])
1507 if size % 2:
1508 self.assertEqual(list(part[-2:]), [9, 11])
1509 else:
1510 self.assertEqual(list(part[-2:]), [8, 10])
1511
1512 @support.bigmemtest(_2G, memuse=2.125)
1513 def test_count(self, size):
1514 example = self.example(size)
1515 self.assertEqual(example.count(0), size//8)
1516 self.assertEqual(example.count(11), 1)
1517
1518 @support.bigmemtest(_2G, memuse=2.125)
1519 def test_append(self, size):
1520 example = self.example(size)
1521 example.append(12)
1522 self.assertEqual(example[-1], 12)
1523
1524 @support.bigmemtest(_2G, memuse=2.125)
1525 def test_extend(self, size):
1526 example = self.example(size)
1527 example.extend(iter([12, 13, 14, 15]))
1528 self.assertEqual(len(example), size+8)
1529 self.assertEqual(list(example[-8:]), [8, 9, 10, 11, 12, 13, 14, 15])
1530
1531 @support.bigmemtest(_2G, memuse=2.125)
1532 def test_frombytes(self, size):
1533 example = self.example(size)
1534 example.frombytes(b'abcd')
1535 self.assertEqual(len(example), size+8)
1536 self.assertEqual(list(example[-8:]), [8, 9, 10, 11] + list(b'abcd'))
1537
1538 @support.bigmemtest(_2G, memuse=2.125)
1539 def test_fromlist(self, size):
1540 example = self.example(size)
1541 example.fromlist([12, 13, 14, 15])
1542 self.assertEqual(len(example), size+8)
1543 self.assertEqual(list(example[-8:]), [8, 9, 10, 11, 12, 13, 14, 15])
1544
1545 @support.bigmemtest(_2G, memuse=2.125)
1546 def test_index(self, size):
1547 example = self.example(size)
1548 self.assertEqual(example.index(0), 0)
1549 self.assertEqual(example.index(1), 1)
1550 self.assertEqual(example.index(7), 7)
1551 self.assertEqual(example.index(11), size+3)
1552
1553 @support.bigmemtest(_2G, memuse=2.125)
1554 def test_insert(self, size):
1555 example = self.example(size)
1556 example.insert(0, 12)
1557 example.insert(10, 13)
1558 example.insert(size+1, 14)
1559 self.assertEqual(len(example), size+7)
1560 self.assertEqual(example[0], 12)
1561 self.assertEqual(example[10], 13)
1562 self.assertEqual(example[size+1], 14)
1563
1564 @support.bigmemtest(_2G, memuse=2.125)
1565 def test_pop(self, size):
1566 example = self.example(size)
1567 self.assertEqual(example.pop(0), 0)
1568 self.assertEqual(example[0], 1)
1569 self.assertEqual(example.pop(size+1), 10)
1570 self.assertEqual(example[size+1], 11)
1571 self.assertEqual(example.pop(1), 2)
1572 self.assertEqual(example[1], 3)
1573 self.assertEqual(len(example), size+1)
1574 self.assertEqual(example.pop(), 11)
1575 self.assertEqual(len(example), size)
1576
1577 @support.bigmemtest(_2G, memuse=2.125)
1578 def test_remove(self, size):
1579 example = self.example(size)
1580 example.remove(0)
1581 self.assertEqual(len(example), size+3)
1582 self.assertEqual(example[0], 1)
1583 example.remove(10)
1584 self.assertEqual(len(example), size+2)
1585 self.assertEqual(example[size], 9)
1586 self.assertEqual(example[size+1], 11)
1587
1588 @support.bigmemtest(_2G, memuse=2.125)
1589 def test_reverse(self, size):
1590 example = self.example(size)
1591 example.reverse()
1592 self.assertEqual(len(example), size+4)
1593 self.assertEqual(example[0], 11)
1594 self.assertEqual(example[3], 8)
1595 self.assertEqual(example[-1], 0)
1596 example.reverse()
1597 self.assertEqual(len(example), size+4)
1598 self.assertEqual(list(example[:4]), [0, 1, 2, 3])
1599 self.assertEqual(list(example[-4:]), [8, 9, 10, 11])
1600
1601 # list takes about 9 bytes per element
1602 @support.bigmemtest(_2G, memuse=2.125+9)
1603 def test_tolist(self, size):
1604 example = self.example(size)
1605 ls = example.tolist()
1606 self.assertEqual(len(ls), len(example))
1607 self.assertEqual(ls[:8], list(example[:8]))
1608 self.assertEqual(ls[-8:], list(example[-8:]))
1609
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001610if __name__ == "__main__":
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001611 unittest.main()