blob: b18467fb889d8bcd81db48e15851679cc8228f0e [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):
45 # Ensure that the type disallows instantiation (bpo-43916)
46 tp = type(iter(array.array('I')))
47 self.assertRaises(TypeError, tp)
48
49 @support.cpython_only
Erlend Egeberg Aaslandc6ad03f2021-04-29 08:47:48 +020050 def test_immutable(self):
51 # bpo-43908: check that array.array is immutable
52 with self.assertRaises(TypeError):
53 array.array.foo = 1
54
Martin Panterbe8da9c2016-09-07 11:04:41 +000055 def test_empty(self):
56 # Exercise code for handling zero-length arrays
57 a = array.array('B')
58 a[:] = a
59 self.assertEqual(len(a), 0)
60 self.assertEqual(len(a + a), 0)
61 self.assertEqual(len(a * 3), 0)
62 a += a
63 self.assertEqual(len(a), 0)
64
Martin v. Löwis99866332002-03-01 10:27:01 +000065
Alexandre Vassalottiad077152009-07-15 17:49:23 +000066# Machine format codes.
67#
68# Search for "enum machine_format_code" in Modules/arraymodule.c to get the
69# authoritative values.
70UNKNOWN_FORMAT = -1
71UNSIGNED_INT8 = 0
72SIGNED_INT8 = 1
73UNSIGNED_INT16_LE = 2
74UNSIGNED_INT16_BE = 3
75SIGNED_INT16_LE = 4
76SIGNED_INT16_BE = 5
77UNSIGNED_INT32_LE = 6
78UNSIGNED_INT32_BE = 7
79SIGNED_INT32_LE = 8
80SIGNED_INT32_BE = 9
81UNSIGNED_INT64_LE = 10
82UNSIGNED_INT64_BE = 11
83SIGNED_INT64_LE = 12
84SIGNED_INT64_BE = 13
85IEEE_754_FLOAT_LE = 14
86IEEE_754_FLOAT_BE = 15
87IEEE_754_DOUBLE_LE = 16
88IEEE_754_DOUBLE_BE = 17
89UTF16_LE = 18
90UTF16_BE = 19
91UTF32_LE = 20
92UTF32_BE = 21
93
94class ArrayReconstructorTest(unittest.TestCase):
95
96 def test_error(self):
97 self.assertRaises(TypeError, array_reconstructor,
98 "", "b", 0, b"")
99 self.assertRaises(TypeError, array_reconstructor,
100 str, "b", 0, b"")
101 self.assertRaises(TypeError, array_reconstructor,
102 array.array, "b", '', b"")
103 self.assertRaises(TypeError, array_reconstructor,
104 array.array, "b", 0, "")
105 self.assertRaises(ValueError, array_reconstructor,
106 array.array, "?", 0, b"")
107 self.assertRaises(ValueError, array_reconstructor,
108 array.array, "b", UNKNOWN_FORMAT, b"")
109 self.assertRaises(ValueError, array_reconstructor,
110 array.array, "b", 22, b"")
111 self.assertRaises(ValueError, array_reconstructor,
112 array.array, "d", 16, b"a")
113
114 def test_numbers(self):
115 testcases = (
116 (['B', 'H', 'I', 'L'], UNSIGNED_INT8, '=BBBB',
117 [0x80, 0x7f, 0, 0xff]),
118 (['b', 'h', 'i', 'l'], SIGNED_INT8, '=bbb',
119 [-0x80, 0x7f, 0]),
120 (['H', 'I', 'L'], UNSIGNED_INT16_LE, '<HHHH',
121 [0x8000, 0x7fff, 0, 0xffff]),
122 (['H', 'I', 'L'], UNSIGNED_INT16_BE, '>HHHH',
123 [0x8000, 0x7fff, 0, 0xffff]),
124 (['h', 'i', 'l'], SIGNED_INT16_LE, '<hhh',
125 [-0x8000, 0x7fff, 0]),
126 (['h', 'i', 'l'], SIGNED_INT16_BE, '>hhh',
127 [-0x8000, 0x7fff, 0]),
128 (['I', 'L'], UNSIGNED_INT32_LE, '<IIII',
129 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
130 (['I', 'L'], UNSIGNED_INT32_BE, '>IIII',
131 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
132 (['i', 'l'], SIGNED_INT32_LE, '<iii',
133 [-1<<31, (1<<31)-1, 0]),
134 (['i', 'l'], SIGNED_INT32_BE, '>iii',
135 [-1<<31, (1<<31)-1, 0]),
136 (['L'], UNSIGNED_INT64_LE, '<QQQQ',
Alexandre Vassalotti0027d4b2009-07-15 20:53:55 +0000137 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
138 (['L'], UNSIGNED_INT64_BE, '>QQQQ',
139 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
140 (['l'], SIGNED_INT64_LE, '<qqq',
141 [-1<<31, (1<<31)-1, 0]),
142 (['l'], SIGNED_INT64_BE, '>qqq',
143 [-1<<31, (1<<31)-1, 0]),
144 # The following tests for INT64 will raise an OverflowError
145 # when run on a 32-bit machine. The tests are simply skipped
146 # in that case.
147 (['L'], UNSIGNED_INT64_LE, '<QQQQ',
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000148 [1<<63, (1<<63)-1, 0, (1<<64)-1]),
149 (['L'], UNSIGNED_INT64_BE, '>QQQQ',
150 [1<<63, (1<<63)-1, 0, (1<<64)-1]),
151 (['l'], SIGNED_INT64_LE, '<qqq',
152 [-1<<63, (1<<63)-1, 0]),
153 (['l'], SIGNED_INT64_BE, '>qqq',
154 [-1<<63, (1<<63)-1, 0]),
155 (['f'], IEEE_754_FLOAT_LE, '<ffff',
156 [16711938.0, float('inf'), float('-inf'), -0.0]),
157 (['f'], IEEE_754_FLOAT_BE, '>ffff',
158 [16711938.0, float('inf'), float('-inf'), -0.0]),
159 (['d'], IEEE_754_DOUBLE_LE, '<dddd',
160 [9006104071832581.0, float('inf'), float('-inf'), -0.0]),
161 (['d'], IEEE_754_DOUBLE_BE, '>dddd',
162 [9006104071832581.0, float('inf'), float('-inf'), -0.0])
163 )
164 for testcase in testcases:
165 valid_typecodes, mformat_code, struct_fmt, values = testcase
166 arraystr = struct.pack(struct_fmt, *values)
167 for typecode in valid_typecodes:
Alexandre Vassalotti0027d4b2009-07-15 20:53:55 +0000168 try:
169 a = array.array(typecode, values)
170 except OverflowError:
171 continue # Skip this test case.
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000172 b = array_reconstructor(
173 array.array, typecode, mformat_code, arraystr)
174 self.assertEqual(a, b,
175 msg="{0!r} != {1!r}; testcase={2!r}".format(a, b, testcase))
176
177 def test_unicode(self):
178 teststr = "Bonne Journ\xe9e \U0002030a\U00020347"
179 testcases = (
180 (UTF16_LE, "UTF-16-LE"),
181 (UTF16_BE, "UTF-16-BE"),
182 (UTF32_LE, "UTF-32-LE"),
183 (UTF32_BE, "UTF-32-BE")
184 )
185 for testcase in testcases:
186 mformat_code, encoding = testcase
187 a = array.array('u', teststr)
188 b = array_reconstructor(
189 array.array, 'u', mformat_code, teststr.encode(encoding))
190 self.assertEqual(a, b,
191 msg="{0!r} != {1!r}; testcase={2!r}".format(a, b, testcase))
192
193
Ezio Melotti1d3e96d2013-01-10 06:04:50 +0200194class BaseTest:
Walter Dörwald7fd94242003-05-18 00:47:47 +0000195 # Required class attributes (provided by subclasses
196 # typecode: the typecode to test
197 # example: an initializer usable in the constructor for this type
198 # smallerexample: the same length as example, but smaller
199 # biggerexample: the same length as example, but bigger
200 # outside: An entry that is not in example
201 # minitemsize: the minimum guaranteed itemsize
Martin v. Löwis99866332002-03-01 10:27:01 +0000202
Walter Dörwald7fd94242003-05-18 00:47:47 +0000203 def assertEntryEqual(self, entry1, entry2):
204 self.assertEqual(entry1, entry2)
Martin v. Löwis99866332002-03-01 10:27:01 +0000205
Walter Dörwald7fd94242003-05-18 00:47:47 +0000206 def badtypecode(self):
207 # Return a typecode that is different from our own
208 return typecodes[(typecodes.index(self.typecode)+1) % len(typecodes)]
Martin v. Löwis99866332002-03-01 10:27:01 +0000209
Walter Dörwald7fd94242003-05-18 00:47:47 +0000210 def test_constructor(self):
211 a = array.array(self.typecode)
212 self.assertEqual(a.typecode, self.typecode)
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200213 self.assertGreaterEqual(a.itemsize, self.minitemsize)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000214 self.assertRaises(TypeError, array.array, self.typecode, None)
Martin v. Löwis99866332002-03-01 10:27:01 +0000215
Walter Dörwald7fd94242003-05-18 00:47:47 +0000216 def test_len(self):
217 a = array.array(self.typecode)
218 a.append(self.example[0])
219 self.assertEqual(len(a), 1)
Martin v. Löwis99866332002-03-01 10:27:01 +0000220
Walter Dörwald7fd94242003-05-18 00:47:47 +0000221 a = array.array(self.typecode, self.example)
222 self.assertEqual(len(a), len(self.example))
Martin v. Löwis99866332002-03-01 10:27:01 +0000223
Walter Dörwald7fd94242003-05-18 00:47:47 +0000224 def test_buffer_info(self):
225 a = array.array(self.typecode, self.example)
226 self.assertRaises(TypeError, a.buffer_info, 42)
227 bi = a.buffer_info()
Ezio Melottie9615932010-01-24 19:26:24 +0000228 self.assertIsInstance(bi, tuple)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000229 self.assertEqual(len(bi), 2)
Ezio Melottie9615932010-01-24 19:26:24 +0000230 self.assertIsInstance(bi[0], int)
231 self.assertIsInstance(bi[1], int)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000232 self.assertEqual(bi[1], len(a))
Martin v. Löwis99866332002-03-01 10:27:01 +0000233
Walter Dörwald7fd94242003-05-18 00:47:47 +0000234 def test_byteswap(self):
Victor Stinner8dba4e02011-09-30 00:51:10 +0200235 if self.typecode == 'u':
236 example = '\U00100100'
237 else:
238 example = self.example
239 a = array.array(self.typecode, example)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000240 self.assertRaises(TypeError, a.byteswap, 42)
241 if a.itemsize in (1, 2, 4, 8):
Victor Stinner8dba4e02011-09-30 00:51:10 +0200242 b = array.array(self.typecode, example)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000243 b.byteswap()
244 if a.itemsize==1:
245 self.assertEqual(a, b)
246 else:
247 self.assertNotEqual(a, b)
248 b.byteswap()
249 self.assertEqual(a, b)
Martin v. Löwis99866332002-03-01 10:27:01 +0000250
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000251 def test_copy(self):
252 import copy
253 a = array.array(self.typecode, self.example)
254 b = copy.copy(a)
255 self.assertNotEqual(id(a), id(b))
256 self.assertEqual(a, b)
257
Thomas Wouters89f507f2006-12-13 04:49:30 +0000258 def test_deepcopy(self):
259 import copy
260 a = array.array(self.typecode, self.example)
261 b = copy.deepcopy(a)
262 self.assertNotEqual(id(a), id(b))
263 self.assertEqual(a, b)
264
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000265 def test_reduce_ex(self):
266 a = array.array(self.typecode, self.example)
267 for protocol in range(3):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000268 self.assertIs(a.__reduce_ex__(protocol)[0], array.array)
Zackery Spytzd1cbc6f2018-11-26 22:40:49 -0700269 for protocol in range(3, pickle.HIGHEST_PROTOCOL + 1):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000270 self.assertIs(a.__reduce_ex__(protocol)[0], array_reconstructor)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000271
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000272 def test_pickle(self):
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000273 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000274 a = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000275 b = pickle.loads(pickle.dumps(a, protocol))
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000276 self.assertNotEqual(id(a), id(b))
277 self.assertEqual(a, b)
278
279 a = ArraySubclass(self.typecode, self.example)
280 a.x = 10
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000281 b = pickle.loads(pickle.dumps(a, protocol))
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000282 self.assertNotEqual(id(a), id(b))
283 self.assertEqual(a, b)
284 self.assertEqual(a.x, b.x)
285 self.assertEqual(type(a), type(b))
286
Guido van Rossumd8faa362007-04-27 19:54:29 +0000287 def test_pickle_for_empty_array(self):
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000288 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossumd8faa362007-04-27 19:54:29 +0000289 a = array.array(self.typecode)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000290 b = pickle.loads(pickle.dumps(a, protocol))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000291 self.assertNotEqual(id(a), id(b))
292 self.assertEqual(a, b)
293
294 a = ArraySubclass(self.typecode)
295 a.x = 10
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000296 b = pickle.loads(pickle.dumps(a, protocol))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000297 self.assertNotEqual(id(a), id(b))
298 self.assertEqual(a, b)
299 self.assertEqual(a.x, b.x)
300 self.assertEqual(type(a), type(b))
301
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000302 def test_iterator_pickle(self):
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200303 orig = array.array(self.typecode, self.example)
304 data = list(orig)
305 data2 = data[::-1]
Serhiy Storchakabad12572014-12-15 14:03:42 +0200306 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200307 # initial iterator
308 itorig = iter(orig)
309 d = pickle.dumps((itorig, orig), proto)
310 it, a = pickle.loads(d)
311 a.fromlist(data2)
312 self.assertEqual(type(it), type(itorig))
313 self.assertEqual(list(it), data + data2)
Serhiy Storchakabad12572014-12-15 14:03:42 +0200314
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200315 # running iterator
316 next(itorig)
317 d = pickle.dumps((itorig, orig), proto)
318 it, a = pickle.loads(d)
319 a.fromlist(data2)
320 self.assertEqual(type(it), type(itorig))
321 self.assertEqual(list(it), data[1:] + data2)
322
323 # empty iterator
324 for i in range(1, len(data)):
325 next(itorig)
326 d = pickle.dumps((itorig, orig), proto)
327 it, a = pickle.loads(d)
328 a.fromlist(data2)
329 self.assertEqual(type(it), type(itorig))
330 self.assertEqual(list(it), data2)
331
332 # exhausted iterator
333 self.assertRaises(StopIteration, next, itorig)
334 d = pickle.dumps((itorig, orig), proto)
335 it, a = pickle.loads(d)
336 a.fromlist(data2)
Serhiy Storchakaab0d1982016-03-30 21:11:16 +0300337 self.assertEqual(list(it), [])
338
339 def test_exhausted_iterator(self):
340 a = array.array(self.typecode, self.example)
341 self.assertEqual(list(a), list(self.example))
342 exhit = iter(a)
343 empit = iter(a)
344 for x in exhit: # exhaust the iterator
345 next(empit) # not exhausted
346 a.append(self.outside)
347 self.assertEqual(list(exhit), [])
348 self.assertEqual(list(empit), [self.outside])
349 self.assertEqual(list(a), list(self.example) + [self.outside])
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000350
Pablo Galindoe51dd9d2020-07-05 22:43:14 +0100351 def test_reverse_iterator(self):
352 a = array.array(self.typecode, self.example)
353 self.assertEqual(list(a), list(self.example))
354 self.assertEqual(list(reversed(a)), list(iter(a))[::-1])
355
356 def test_reverse_iterator_picking(self):
357 orig = array.array(self.typecode, self.example)
358 data = list(orig)
359 data2 = [self.outside] + data
360 rev_data = data[len(data)-2::-1] + [self.outside]
361 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
362 # initial iterator
363 itorig = reversed(orig)
364 d = pickle.dumps((itorig, orig), proto)
365 it, a = pickle.loads(d)
366 a.insert(0, self.outside)
367 self.assertEqual(type(it), type(itorig))
368 self.assertEqual(list(it), rev_data)
369 self.assertEqual(list(a), data2)
370
371 # running iterator
372 next(itorig)
373 d = pickle.dumps((itorig, orig), proto)
374 it, a = pickle.loads(d)
375 a.insert(0, self.outside)
376 self.assertEqual(type(it), type(itorig))
377 self.assertEqual(list(it), rev_data[1:])
378 self.assertEqual(list(a), data2)
379
380 # empty iterator
381 for i in range(1, len(data)):
382 next(itorig)
383 d = pickle.dumps((itorig, orig), proto)
384 it, a = pickle.loads(d)
385 a.insert(0, self.outside)
386 self.assertEqual(type(it), type(itorig))
387 self.assertEqual(list(it), [])
388 self.assertEqual(list(a), data2)
389
390 # exhausted iterator
391 self.assertRaises(StopIteration, next, itorig)
392 d = pickle.dumps((itorig, orig), proto)
393 it, a = pickle.loads(d)
394 a.insert(0, self.outside)
395 self.assertEqual(list(it), [])
396 self.assertEqual(list(a), data2)
397
398 def test_exhausted_reverse_iterator(self):
399 a = array.array(self.typecode, self.example)
400 self.assertEqual(list(a), list(self.example))
401 exhit = reversed(a)
402 empit = reversed(a)
403 for x in exhit: # exhaust the iterator
404 next(empit) # Pointing past the 0th position.
405 a.insert(0, self.outside)
406 self.assertEqual(list(exhit), [])
407 # The iterator index points past the 0th position so inserting
Ikko Ashimine9303b9e2020-11-10 21:42:36 +0900408 # an element in the beginning does not make it appear.
Pablo Galindoe51dd9d2020-07-05 22:43:14 +0100409 self.assertEqual(list(empit), [])
410 self.assertEqual(list(a), [self.outside] + list(self.example))
411
Walter Dörwald7fd94242003-05-18 00:47:47 +0000412 def test_insert(self):
413 a = array.array(self.typecode, self.example)
414 a.insert(0, self.example[0])
415 self.assertEqual(len(a), 1+len(self.example))
416 self.assertEqual(a[0], a[1])
417 self.assertRaises(TypeError, a.insert)
418 self.assertRaises(TypeError, a.insert, None)
Walter Dörwaldba39d9c2003-05-18 01:56:25 +0000419 self.assertRaises(TypeError, a.insert, 0, None)
Martin v. Löwis99866332002-03-01 10:27:01 +0000420
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000421 a = array.array(self.typecode, self.example)
422 a.insert(-1, self.example[0])
423 self.assertEqual(
424 a,
425 array.array(
426 self.typecode,
427 self.example[:-1] + self.example[:1] + self.example[-1:]
428 )
429 )
430
431 a = array.array(self.typecode, self.example)
432 a.insert(-1000, self.example[0])
433 self.assertEqual(
434 a,
435 array.array(self.typecode, self.example[:1] + self.example)
436 )
437
438 a = array.array(self.typecode, self.example)
439 a.insert(1000, self.example[0])
440 self.assertEqual(
441 a,
442 array.array(self.typecode, self.example + self.example[:1])
443 )
444
Walter Dörwald7fd94242003-05-18 00:47:47 +0000445 def test_tofromfile(self):
446 a = array.array(self.typecode, 2*self.example)
447 self.assertRaises(TypeError, a.tofile)
Hai Shif7ba40b2020-06-25 18:38:51 +0800448 os_helper.unlink(os_helper.TESTFN)
449 f = open(os_helper.TESTFN, 'wb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000450 try:
451 a.tofile(f)
452 f.close()
453 b = array.array(self.typecode)
Hai Shif7ba40b2020-06-25 18:38:51 +0800454 f = open(os_helper.TESTFN, 'rb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000455 self.assertRaises(TypeError, b.fromfile)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000456 b.fromfile(f, len(self.example))
457 self.assertEqual(b, array.array(self.typecode, self.example))
458 self.assertNotEqual(a, b)
Hirokazu Yamamoto54d0df62009-03-06 03:04:07 +0000459 self.assertRaises(EOFError, b.fromfile, f, len(self.example)+1)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000460 self.assertEqual(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000461 f.close()
462 finally:
463 if not f.closed:
464 f.close()
Hai Shif7ba40b2020-06-25 18:38:51 +0800465 os_helper.unlink(os_helper.TESTFN)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000466
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000467 def test_fromfile_ioerror(self):
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200468 # Issue #5395: Check if fromfile raises a proper OSError
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000469 # instead of EOFError.
470 a = array.array(self.typecode)
Hai Shif7ba40b2020-06-25 18:38:51 +0800471 f = open(os_helper.TESTFN, 'wb')
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000472 try:
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200473 self.assertRaises(OSError, a.fromfile, f, len(self.example))
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000474 finally:
475 f.close()
Hai Shif7ba40b2020-06-25 18:38:51 +0800476 os_helper.unlink(os_helper.TESTFN)
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000477
Frank Wierzbicki17683432009-08-16 20:30:12 +0000478 def test_filewrite(self):
479 a = array.array(self.typecode, 2*self.example)
Hai Shif7ba40b2020-06-25 18:38:51 +0800480 f = open(os_helper.TESTFN, 'wb')
Frank Wierzbicki17683432009-08-16 20:30:12 +0000481 try:
482 f.write(a)
483 f.close()
484 b = array.array(self.typecode)
Hai Shif7ba40b2020-06-25 18:38:51 +0800485 f = open(os_helper.TESTFN, 'rb')
Frank Wierzbicki17683432009-08-16 20:30:12 +0000486 b.fromfile(f, len(self.example))
487 self.assertEqual(b, array.array(self.typecode, self.example))
488 self.assertNotEqual(a, b)
489 b.fromfile(f, len(self.example))
490 self.assertEqual(a, b)
491 f.close()
492 finally:
493 if not f.closed:
494 f.close()
Hai Shif7ba40b2020-06-25 18:38:51 +0800495 os_helper.unlink(os_helper.TESTFN)
Frank Wierzbicki17683432009-08-16 20:30:12 +0000496
Walter Dörwald7fd94242003-05-18 00:47:47 +0000497 def test_tofromlist(self):
498 a = array.array(self.typecode, 2*self.example)
499 b = array.array(self.typecode)
500 self.assertRaises(TypeError, a.tolist, 42)
501 self.assertRaises(TypeError, b.fromlist)
502 self.assertRaises(TypeError, b.fromlist, 42)
503 self.assertRaises(TypeError, b.fromlist, [None])
504 b.fromlist(a.tolist())
505 self.assertEqual(a, b)
Fred Drake78334472000-06-28 17:50:51 +0000506
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000507 def test_tofrombytes(self):
Walter Dörwald7fd94242003-05-18 00:47:47 +0000508 a = array.array(self.typecode, 2*self.example)
509 b = array.array(self.typecode)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000510 self.assertRaises(TypeError, a.tobytes, 42)
511 self.assertRaises(TypeError, b.frombytes)
512 self.assertRaises(TypeError, b.frombytes, 42)
513 b.frombytes(a.tobytes())
514 c = array.array(self.typecode, bytearray(a.tobytes()))
Walter Dörwald7fd94242003-05-18 00:47:47 +0000515 self.assertEqual(a, b)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000516 self.assertEqual(a, c)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000517 if a.itemsize>1:
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000518 self.assertRaises(ValueError, b.frombytes, b"x")
Fred Drake78334472000-06-28 17:50:51 +0000519
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +0000520 def test_fromarray(self):
521 a = array.array(self.typecode, self.example)
522 b = array.array(self.typecode, a)
523 self.assertEqual(a, b)
524
Walter Dörwald7fd94242003-05-18 00:47:47 +0000525 def test_repr(self):
526 a = array.array(self.typecode, 2*self.example)
527 self.assertEqual(a, eval(repr(a), {"array": array.array}))
Fred Drake78334472000-06-28 17:50:51 +0000528
Walter Dörwald7fd94242003-05-18 00:47:47 +0000529 a = array.array(self.typecode)
530 self.assertEqual(repr(a), "array('%s')" % self.typecode)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000531
Walter Dörwald7fd94242003-05-18 00:47:47 +0000532 def test_str(self):
533 a = array.array(self.typecode, 2*self.example)
534 str(a)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000535
Walter Dörwald7fd94242003-05-18 00:47:47 +0000536 def test_cmp(self):
537 a = array.array(self.typecode, self.example)
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200538 self.assertIs(a == 42, False)
539 self.assertIs(a != 42, True)
Tim Peterscc78e472000-11-14 21:36:07 +0000540
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200541 self.assertIs(a == a, True)
542 self.assertIs(a != a, False)
543 self.assertIs(a < a, False)
544 self.assertIs(a <= a, True)
545 self.assertIs(a > a, False)
546 self.assertIs(a >= a, True)
Tim Peterscc78e472000-11-14 21:36:07 +0000547
Neal Norwitzbd2835c2006-03-17 08:54:15 +0000548 al = array.array(self.typecode, self.smallerexample)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000549 ab = array.array(self.typecode, self.biggerexample)
Guido van Rossum7f1d3aa1998-07-16 15:31:43 +0000550
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200551 self.assertIs(a == 2*a, False)
552 self.assertIs(a != 2*a, True)
553 self.assertIs(a < 2*a, True)
554 self.assertIs(a <= 2*a, True)
555 self.assertIs(a > 2*a, False)
556 self.assertIs(a >= 2*a, False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000557
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200558 self.assertIs(a == al, False)
559 self.assertIs(a != al, True)
560 self.assertIs(a < al, False)
561 self.assertIs(a <= al, False)
562 self.assertIs(a > al, True)
563 self.assertIs(a >= al, True)
Martin v. Löwis99866332002-03-01 10:27:01 +0000564
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200565 self.assertIs(a == ab, False)
566 self.assertIs(a != ab, True)
567 self.assertIs(a < ab, True)
568 self.assertIs(a <= ab, True)
569 self.assertIs(a > ab, False)
570 self.assertIs(a >= ab, False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000571
Walter Dörwald7fd94242003-05-18 00:47:47 +0000572 def test_add(self):
573 a = array.array(self.typecode, self.example) \
574 + array.array(self.typecode, self.example[::-1])
575 self.assertEqual(
576 a,
577 array.array(self.typecode, self.example + self.example[::-1])
578 )
Martin v. Löwis99866332002-03-01 10:27:01 +0000579
Walter Dörwald7fd94242003-05-18 00:47:47 +0000580 b = array.array(self.badtypecode())
581 self.assertRaises(TypeError, a.__add__, b)
582
583 self.assertRaises(TypeError, a.__add__, "bad")
584
585 def test_iadd(self):
586 a = array.array(self.typecode, self.example[::-1])
587 b = a
588 a += array.array(self.typecode, 2*self.example)
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200589 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000590 self.assertEqual(
591 a,
592 array.array(self.typecode, self.example[::-1]+2*self.example)
593 )
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000594 a = array.array(self.typecode, self.example)
595 a += a
596 self.assertEqual(
597 a,
598 array.array(self.typecode, self.example + self.example)
599 )
Walter Dörwald7fd94242003-05-18 00:47:47 +0000600
601 b = array.array(self.badtypecode())
602 self.assertRaises(TypeError, a.__add__, b)
603
604 self.assertRaises(TypeError, a.__iadd__, "bad")
605
606 def test_mul(self):
607 a = 5*array.array(self.typecode, self.example)
608 self.assertEqual(
609 a,
610 array.array(self.typecode, 5*self.example)
611 )
612
613 a = array.array(self.typecode, self.example)*5
614 self.assertEqual(
615 a,
616 array.array(self.typecode, self.example*5)
617 )
618
619 a = 0*array.array(self.typecode, self.example)
620 self.assertEqual(
621 a,
622 array.array(self.typecode)
623 )
624
625 a = (-1)*array.array(self.typecode, self.example)
626 self.assertEqual(
627 a,
628 array.array(self.typecode)
629 )
630
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000631 a = 5 * array.array(self.typecode, self.example[:1])
632 self.assertEqual(
633 a,
634 array.array(self.typecode, [a[0]] * 5)
635 )
636
Walter Dörwald7fd94242003-05-18 00:47:47 +0000637 self.assertRaises(TypeError, a.__mul__, "bad")
638
639 def test_imul(self):
640 a = array.array(self.typecode, self.example)
641 b = a
642
643 a *= 5
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200644 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000645 self.assertEqual(
646 a,
647 array.array(self.typecode, 5*self.example)
648 )
649
650 a *= 0
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200651 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000652 self.assertEqual(a, array.array(self.typecode))
653
654 a *= 1000
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200655 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000656 self.assertEqual(a, array.array(self.typecode))
657
658 a *= -1
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200659 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000660 self.assertEqual(a, array.array(self.typecode))
661
662 a = array.array(self.typecode, self.example)
663 a *= -1
664 self.assertEqual(a, array.array(self.typecode))
665
666 self.assertRaises(TypeError, a.__imul__, "bad")
667
668 def test_getitem(self):
669 a = array.array(self.typecode, self.example)
670 self.assertEntryEqual(a[0], self.example[0])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000671 self.assertEntryEqual(a[0], self.example[0])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000672 self.assertEntryEqual(a[-1], self.example[-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000673 self.assertEntryEqual(a[-1], self.example[-1])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000674 self.assertEntryEqual(a[len(self.example)-1], self.example[-1])
675 self.assertEntryEqual(a[-len(self.example)], self.example[0])
676 self.assertRaises(TypeError, a.__getitem__)
677 self.assertRaises(IndexError, a.__getitem__, len(self.example))
678 self.assertRaises(IndexError, a.__getitem__, -len(self.example)-1)
679
680 def test_setitem(self):
681 a = array.array(self.typecode, self.example)
682 a[0] = a[-1]
683 self.assertEntryEqual(a[0], a[-1])
684
685 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000686 a[0] = a[-1]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000687 self.assertEntryEqual(a[0], a[-1])
688
689 a = array.array(self.typecode, self.example)
690 a[-1] = a[0]
691 self.assertEntryEqual(a[0], a[-1])
692
693 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000694 a[-1] = a[0]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000695 self.assertEntryEqual(a[0], a[-1])
696
697 a = array.array(self.typecode, self.example)
698 a[len(self.example)-1] = a[0]
699 self.assertEntryEqual(a[0], a[-1])
700
701 a = array.array(self.typecode, self.example)
702 a[-len(self.example)] = a[-1]
703 self.assertEntryEqual(a[0], a[-1])
704
705 self.assertRaises(TypeError, a.__setitem__)
706 self.assertRaises(TypeError, a.__setitem__, None)
707 self.assertRaises(TypeError, a.__setitem__, 0, None)
708 self.assertRaises(
709 IndexError,
710 a.__setitem__,
711 len(self.example), self.example[0]
712 )
713 self.assertRaises(
714 IndexError,
715 a.__setitem__,
716 -len(self.example)-1, self.example[0]
717 )
718
719 def test_delitem(self):
720 a = array.array(self.typecode, self.example)
721 del a[0]
722 self.assertEqual(
723 a,
724 array.array(self.typecode, self.example[1:])
725 )
726
727 a = array.array(self.typecode, self.example)
728 del a[-1]
729 self.assertEqual(
730 a,
731 array.array(self.typecode, self.example[:-1])
732 )
733
734 a = array.array(self.typecode, self.example)
735 del a[len(self.example)-1]
736 self.assertEqual(
737 a,
738 array.array(self.typecode, self.example[:-1])
739 )
740
741 a = array.array(self.typecode, self.example)
742 del a[-len(self.example)]
743 self.assertEqual(
744 a,
745 array.array(self.typecode, self.example[1:])
746 )
747
748 self.assertRaises(TypeError, a.__delitem__)
749 self.assertRaises(TypeError, a.__delitem__, None)
750 self.assertRaises(IndexError, a.__delitem__, len(self.example))
751 self.assertRaises(IndexError, a.__delitem__, -len(self.example)-1)
752
753 def test_getslice(self):
754 a = array.array(self.typecode, self.example)
755 self.assertEqual(a[:], a)
756
757 self.assertEqual(
758 a[1:],
759 array.array(self.typecode, self.example[1:])
760 )
761
762 self.assertEqual(
763 a[:1],
764 array.array(self.typecode, self.example[:1])
765 )
766
767 self.assertEqual(
768 a[:-1],
769 array.array(self.typecode, self.example[:-1])
770 )
771
772 self.assertEqual(
773 a[-1:],
774 array.array(self.typecode, self.example[-1:])
775 )
776
777 self.assertEqual(
778 a[-1:-1],
779 array.array(self.typecode)
780 )
781
782 self.assertEqual(
Walter Dörwald1083c242005-01-21 21:16:51 +0000783 a[2:1],
784 array.array(self.typecode)
785 )
786
787 self.assertEqual(
Walter Dörwald7fd94242003-05-18 00:47:47 +0000788 a[1000:],
789 array.array(self.typecode)
790 )
791 self.assertEqual(a[-1000:], a)
792 self.assertEqual(a[:1000], a)
793 self.assertEqual(
794 a[:-1000],
795 array.array(self.typecode)
796 )
797 self.assertEqual(a[-1000:1000], a)
798 self.assertEqual(
799 a[2000:1000],
800 array.array(self.typecode)
801 )
802
Thomas Woutersed03b412007-08-28 21:37:11 +0000803 def test_extended_getslice(self):
804 # Test extended slicing by comparing with list slicing
805 # (Assumes list conversion works correctly, too)
806 a = array.array(self.typecode, self.example)
Zackery Spytz14514d92019-05-17 01:13:03 -0600807 indices = (0, None, 1, 3, 19, 100, sys.maxsize, -1, -2, -31, -100)
Thomas Woutersed03b412007-08-28 21:37:11 +0000808 for start in indices:
809 for stop in indices:
810 # Everything except the initial 0 (invalid step)
811 for step in indices[1:]:
812 self.assertEqual(list(a[start:stop:step]),
813 list(a)[start:stop:step])
814
Walter Dörwald7fd94242003-05-18 00:47:47 +0000815 def test_setslice(self):
816 a = array.array(self.typecode, self.example)
817 a[:1] = a
818 self.assertEqual(
819 a,
820 array.array(self.typecode, self.example + self.example[1:])
821 )
822
823 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000824 a[:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000825 self.assertEqual(
826 a,
827 array.array(self.typecode, self.example + self.example[-1:])
828 )
829
830 a = array.array(self.typecode, self.example)
831 a[-1:] = a
832 self.assertEqual(
833 a,
834 array.array(self.typecode, self.example[:-1] + self.example)
835 )
836
837 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000838 a[1:] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000839 self.assertEqual(
840 a,
841 array.array(self.typecode, self.example[:1] + self.example)
842 )
843
844 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000845 a[1:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000846 self.assertEqual(
847 a,
848 array.array(
849 self.typecode,
850 self.example[:1] + self.example + self.example[-1:]
851 )
852 )
853
854 a = array.array(self.typecode, self.example)
855 a[1000:] = a
856 self.assertEqual(
857 a,
858 array.array(self.typecode, 2*self.example)
859 )
860
861 a = array.array(self.typecode, self.example)
862 a[-1000:] = a
863 self.assertEqual(
864 a,
865 array.array(self.typecode, self.example)
866 )
867
868 a = array.array(self.typecode, self.example)
869 a[:1000] = a
870 self.assertEqual(
871 a,
872 array.array(self.typecode, self.example)
873 )
874
875 a = array.array(self.typecode, self.example)
876 a[:-1000] = a
877 self.assertEqual(
878 a,
879 array.array(self.typecode, 2*self.example)
880 )
881
882 a = array.array(self.typecode, self.example)
883 a[1:0] = a
884 self.assertEqual(
885 a,
886 array.array(self.typecode, self.example[:1] + self.example + self.example[1:])
887 )
888
889 a = array.array(self.typecode, self.example)
890 a[2000:1000] = a
891 self.assertEqual(
892 a,
893 array.array(self.typecode, 2*self.example)
894 )
895
896 a = array.array(self.typecode, self.example)
Thomas Woutersed03b412007-08-28 21:37:11 +0000897 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), None)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000898 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), None)
899
900 b = array.array(self.badtypecode())
Thomas Woutersed03b412007-08-28 21:37:11 +0000901 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000902 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), b)
903
Thomas Woutersed03b412007-08-28 21:37:11 +0000904 def test_extended_set_del_slice(self):
Zackery Spytz14514d92019-05-17 01:13:03 -0600905 indices = (0, None, 1, 3, 19, 100, sys.maxsize, -1, -2, -31, -100)
Thomas Woutersed03b412007-08-28 21:37:11 +0000906 for start in indices:
907 for stop in indices:
908 # Everything except the initial 0 (invalid step)
909 for step in indices[1:]:
910 a = array.array(self.typecode, self.example)
911 L = list(a)
912 # Make sure we have a slice of exactly the right length,
913 # but with (hopefully) different data.
914 data = L[start:stop:step]
915 data.reverse()
916 L[start:stop:step] = data
917 a[start:stop:step] = array.array(self.typecode, data)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000918 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000919
920 del L[start:stop:step]
921 del a[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +0000922 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000923
Walter Dörwald7fd94242003-05-18 00:47:47 +0000924 def test_index(self):
925 example = 2*self.example
926 a = array.array(self.typecode, example)
927 self.assertRaises(TypeError, a.index)
928 for x in example:
929 self.assertEqual(a.index(x), example.index(x))
930 self.assertRaises(ValueError, a.index, None)
931 self.assertRaises(ValueError, a.index, self.outside)
932
Zackery Spytzafd12652021-04-02 09:28:35 -0600933 a = array.array('i', [-2, -1, 0, 0, 1, 2])
934 self.assertEqual(a.index(0), 2)
935 self.assertEqual(a.index(0, 2), 2)
936 self.assertEqual(a.index(0, -4), 2)
937 self.assertEqual(a.index(-2, -10), 0)
938 self.assertEqual(a.index(0, 3), 3)
939 self.assertEqual(a.index(0, -3), 3)
940 self.assertEqual(a.index(0, 3, 4), 3)
941 self.assertEqual(a.index(0, -3, -2), 3)
942 self.assertRaises(ValueError, a.index, 2, 0, -10)
943
Walter Dörwald7fd94242003-05-18 00:47:47 +0000944 def test_count(self):
945 example = 2*self.example
946 a = array.array(self.typecode, example)
947 self.assertRaises(TypeError, a.count)
948 for x in example:
949 self.assertEqual(a.count(x), example.count(x))
950 self.assertEqual(a.count(self.outside), 0)
951 self.assertEqual(a.count(None), 0)
952
953 def test_remove(self):
954 for x in self.example:
955 example = 2*self.example
956 a = array.array(self.typecode, example)
957 pos = example.index(x)
958 example2 = example[:pos] + example[pos+1:]
959 a.remove(x)
960 self.assertEqual(a, array.array(self.typecode, example2))
961
962 a = array.array(self.typecode, self.example)
963 self.assertRaises(ValueError, a.remove, self.outside)
964
965 self.assertRaises(ValueError, a.remove, None)
966
967 def test_pop(self):
968 a = array.array(self.typecode)
969 self.assertRaises(IndexError, a.pop)
970
971 a = array.array(self.typecode, 2*self.example)
972 self.assertRaises(TypeError, a.pop, 42, 42)
973 self.assertRaises(TypeError, a.pop, None)
974 self.assertRaises(IndexError, a.pop, len(a))
975 self.assertRaises(IndexError, a.pop, -len(a)-1)
976
977 self.assertEntryEqual(a.pop(0), self.example[0])
978 self.assertEqual(
979 a,
980 array.array(self.typecode, self.example[1:]+self.example)
981 )
982 self.assertEntryEqual(a.pop(1), self.example[2])
983 self.assertEqual(
984 a,
985 array.array(self.typecode, self.example[1:2]+self.example[3:]+self.example)
986 )
987 self.assertEntryEqual(a.pop(0), self.example[1])
988 self.assertEntryEqual(a.pop(), self.example[-1])
989 self.assertEqual(
990 a,
991 array.array(self.typecode, self.example[3:]+self.example[:-1])
992 )
993
994 def test_reverse(self):
995 a = array.array(self.typecode, self.example)
996 self.assertRaises(TypeError, a.reverse, 42)
Fred Drake004d5e62000-10-23 17:22:08 +0000997 a.reverse()
Walter Dörwald7fd94242003-05-18 00:47:47 +0000998 self.assertEqual(
999 a,
1000 array.array(self.typecode, self.example[::-1])
1001 )
1002
1003 def test_extend(self):
1004 a = array.array(self.typecode, self.example)
1005 self.assertRaises(TypeError, a.extend)
1006 a.extend(array.array(self.typecode, self.example[::-1]))
1007 self.assertEqual(
1008 a,
1009 array.array(self.typecode, self.example+self.example[::-1])
1010 )
1011
Alexandre Vassalottie503cf92009-07-05 06:25:14 +00001012 a = array.array(self.typecode, self.example)
1013 a.extend(a)
1014 self.assertEqual(
1015 a,
1016 array.array(self.typecode, self.example+self.example)
1017 )
1018
Walter Dörwald7fd94242003-05-18 00:47:47 +00001019 b = array.array(self.badtypecode())
1020 self.assertRaises(TypeError, a.extend, b)
1021
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001022 a = array.array(self.typecode, self.example)
1023 a.extend(self.example[::-1])
1024 self.assertEqual(
1025 a,
1026 array.array(self.typecode, self.example+self.example[::-1])
1027 )
1028
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001029 def test_constructor_with_iterable_argument(self):
1030 a = array.array(self.typecode, iter(self.example))
1031 b = array.array(self.typecode, self.example)
1032 self.assertEqual(a, b)
1033
1034 # non-iterable argument
1035 self.assertRaises(TypeError, array.array, self.typecode, 10)
1036
1037 # pass through errors raised in __iter__
1038 class A:
1039 def __iter__(self):
1040 raise UnicodeError
1041 self.assertRaises(UnicodeError, array.array, self.typecode, A())
1042
1043 # pass through errors raised in next()
1044 def B():
1045 raise UnicodeError
1046 yield None
1047 self.assertRaises(UnicodeError, array.array, self.typecode, B())
1048
Walter Dörwald7fd94242003-05-18 00:47:47 +00001049 def test_coveritertraverse(self):
1050 try:
1051 import gc
1052 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001053 self.skipTest('gc module not available')
Walter Dörwald7fd94242003-05-18 00:47:47 +00001054 a = array.array(self.typecode)
1055 l = [iter(a)]
1056 l.append(l)
1057 gc.collect()
1058
1059 def test_buffer(self):
1060 a = array.array(self.typecode, self.example)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001061 m = memoryview(a)
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001062 expected = m.tobytes()
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001063 self.assertEqual(a.tobytes(), expected)
1064 self.assertEqual(a.tobytes()[0], expected[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001065 # Resizing is forbidden when there are buffer exports.
1066 # For issue 4509, we also check after each error that
1067 # the array was not modified.
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001068 self.assertRaises(BufferError, a.append, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001069 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001070 self.assertRaises(BufferError, a.extend, a[0:1])
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001071 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001072 self.assertRaises(BufferError, a.remove, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001073 self.assertEqual(m.tobytes(), expected)
1074 self.assertRaises(BufferError, a.pop, 0)
1075 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001076 self.assertRaises(BufferError, a.fromlist, a.tolist())
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001077 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001078 self.assertRaises(BufferError, a.frombytes, a.tobytes())
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001079 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001080 if self.typecode == 'u':
1081 self.assertRaises(BufferError, a.fromunicode, a.tounicode())
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001082 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +00001083 self.assertRaises(BufferError, operator.imul, a, 2)
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001084 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +00001085 self.assertRaises(BufferError, operator.imul, a, 0)
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001086 self.assertEqual(m.tobytes(), expected)
1087 self.assertRaises(BufferError, operator.setitem, a, slice(0, 0), a)
1088 self.assertEqual(m.tobytes(), expected)
1089 self.assertRaises(BufferError, operator.delitem, a, 0)
1090 self.assertEqual(m.tobytes(), expected)
1091 self.assertRaises(BufferError, operator.delitem, a, slice(0, 1))
1092 self.assertEqual(m.tobytes(), expected)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001093
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001094 def test_weakref(self):
1095 s = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001096 p = weakref.proxy(s)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001097 self.assertEqual(p.tobytes(), s.tobytes())
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001098 s = None
1099 self.assertRaises(ReferenceError, len, p)
1100
Serhiy Storchaka43767632013-11-03 21:31:38 +02001101 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
1102 'test needs sys.getrefcount()')
Skip Montanarod5cf0b82003-08-03 23:02:10 +00001103 def test_bug_782369(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +02001104 for i in range(10):
1105 b = array.array('B', range(64))
1106 rc = sys.getrefcount(10)
1107 for i in range(10):
1108 b = array.array('B', range(64))
1109 self.assertEqual(rc, sys.getrefcount(10))
Skip Montanarod5cf0b82003-08-03 23:02:10 +00001110
Thomas Woutersb2137042007-02-01 18:02:27 +00001111 def test_subclass_with_kwargs(self):
1112 # SF bug #1486663 -- this used to erroneously raise a TypeError
1113 ArraySubclassWithKwargs('b', newarg=1)
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001114
Guido van Rossum6b826ab2007-07-03 16:22:09 +00001115 def test_create_from_bytes(self):
Alexandre Vassalotti7e4f3212009-07-05 05:38:18 +00001116 # XXX This test probably needs to be moved in a subclass or
1117 # generalized to use self.typecode.
Guido van Rossum6b826ab2007-07-03 16:22:09 +00001118 a = array.array('H', b"1234")
1119 self.assertEqual(len(a) * a.itemsize, 4)
1120
Meador Inge03b4d502012-08-10 22:35:45 -05001121 @support.cpython_only
1122 def test_sizeof_with_buffer(self):
1123 a = array.array(self.typecode, self.example)
Meador Inge80dd1af2012-08-10 23:21:39 -05001124 basesize = support.calcvobjsize('Pn2Pi')
Meador Inge03b4d502012-08-10 22:35:45 -05001125 buffer_size = a.buffer_info()[1] * a.itemsize
1126 support.check_sizeof(self, a, basesize + buffer_size)
1127
1128 @support.cpython_only
1129 def test_sizeof_without_buffer(self):
1130 a = array.array(self.typecode)
Meador Inge80dd1af2012-08-10 23:21:39 -05001131 basesize = support.calcvobjsize('Pn2Pi')
Meador Inge03b4d502012-08-10 22:35:45 -05001132 support.check_sizeof(self, a, basesize)
1133
Alexandre Vassalotti9730e332013-11-29 20:47:15 -08001134 def test_initialize_with_unicode(self):
1135 if self.typecode != 'u':
1136 with self.assertRaises(TypeError) as cm:
1137 a = array.array(self.typecode, 'foo')
1138 self.assertIn("cannot use a str", str(cm.exception))
1139 with self.assertRaises(TypeError) as cm:
1140 a = array.array(self.typecode, array.array('u', 'foo'))
1141 self.assertIn("cannot use a unicode array", str(cm.exception))
1142 else:
1143 a = array.array(self.typecode, "foo")
1144 a = array.array(self.typecode, array.array('u', 'foo'))
1145
Stefan Krah650c1e82015-02-03 21:43:23 +01001146 @support.cpython_only
1147 def test_obsolete_write_lock(self):
1148 from _testcapi import getbuffer_with_null_view
1149 a = array.array('B', b"")
1150 self.assertRaises(BufferError, getbuffer_with_null_view, a)
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001151
Serhiy Storchakaab0d1982016-03-30 21:11:16 +03001152 def test_free_after_iterating(self):
1153 support.check_free_after_iterating(self, iter, array.array,
1154 (self.typecode,))
1155 support.check_free_after_iterating(self, reversed, array.array,
1156 (self.typecode,))
1157
Walter Dörwald7fd94242003-05-18 00:47:47 +00001158class StringTest(BaseTest):
1159
1160 def test_setitem(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001161 super().test_setitem()
Walter Dörwald7fd94242003-05-18 00:47:47 +00001162 a = array.array(self.typecode, self.example)
1163 self.assertRaises(TypeError, a.__setitem__, 0, self.example[:2])
1164
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001165class UnicodeTest(StringTest, unittest.TestCase):
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001166 typecode = 'u'
1167 example = '\x01\u263a\x00\ufeff'
1168 smallerexample = '\x01\u263a\x00\ufefe'
1169 biggerexample = '\x01\u263a\x01\ufeff'
1170 outside = str('\x33')
Victor Stinner8d4734f2012-08-08 20:09:21 +02001171 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001172
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001173 def test_unicode(self):
1174 self.assertRaises(TypeError, array.array, 'b', 'foo')
Walter Dörwald7fd94242003-05-18 00:47:47 +00001175
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001176 a = array.array('u', '\xa0\xc2\u1234')
1177 a.fromunicode(' ')
1178 a.fromunicode('')
1179 a.fromunicode('')
1180 a.fromunicode('\x11abc\xff\u1234')
1181 s = a.tounicode()
1182 self.assertEqual(s, '\xa0\xc2\u1234 \x11abc\xff\u1234')
Victor Stinner9d512ab2012-08-09 00:43:56 +02001183 self.assertEqual(a.itemsize, sizeof_wchar)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001184
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001185 s = '\x00="\'a\\b\x80\xff\u0000\u0001\u1234'
1186 a = array.array('u', s)
1187 self.assertEqual(
1188 repr(a),
Georg Brandl559e5d72008-06-11 18:37:52 +00001189 "array('u', '\\x00=\"\\'a\\\\b\\x80\xff\\x00\\x01\u1234')")
Walter Dörwald7fd94242003-05-18 00:47:47 +00001190
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001191 self.assertRaises(TypeError, a.fromunicode)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001192
Victor Stinner29ec5952013-02-26 00:27:38 +01001193 def test_issue17223(self):
1194 # this used to crash
Victor Stinnerc472c5d2013-02-26 22:52:11 +01001195 if sizeof_wchar == 4:
1196 # U+FFFFFFFF is an invalid code point in Unicode 6.0
1197 invalid_str = b'\xff\xff\xff\xff'
1198 else:
Victor Stinner29c00342013-03-08 02:33:06 +01001199 # PyUnicode_FromUnicode() cannot fail with 16-bit wchar_t
1200 self.skipTest("specific to 32-bit wchar_t")
Victor Stinnerc472c5d2013-02-26 22:52:11 +01001201 a = array.array('u', invalid_str)
Victor Stinner29ec5952013-02-26 00:27:38 +01001202 self.assertRaises(ValueError, a.tounicode)
1203 self.assertRaises(ValueError, str, a)
1204
Walter Dörwald7fd94242003-05-18 00:47:47 +00001205class NumberTest(BaseTest):
1206
1207 def test_extslice(self):
1208 a = array.array(self.typecode, range(5))
1209 self.assertEqual(a[::], a)
1210 self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
1211 self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
1212 self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
1213 self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
1214 self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
1215 self.assertEqual(a[-100:100:], a)
1216 self.assertEqual(a[100:-100:-1], a[::-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +00001217 self.assertEqual(a[-100:100:2], array.array(self.typecode, [0,2,4]))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001218 self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
1219 self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
1220
1221 def test_delslice(self):
1222 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001223 del a[::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001224 self.assertEqual(a, array.array(self.typecode, [1,3]))
1225 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001226 del a[1::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001227 self.assertEqual(a, array.array(self.typecode, [0,2,4]))
1228 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001229 del a[1::-2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001230 self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
1231 a = array.array(self.typecode, range(10))
Michael W. Hudson56796f62002-07-29 14:35:04 +00001232 del a[::1000]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001233 self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
Mark Dickinsonbc099642010-01-29 17:27:24 +00001234 # test issue7788
1235 a = array.array(self.typecode, range(10))
1236 del a[9::1<<333]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001237
1238 def test_assignment(self):
1239 a = array.array(self.typecode, range(10))
1240 a[::2] = array.array(self.typecode, [42]*5)
1241 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
1242 a = array.array(self.typecode, range(10))
1243 a[::-4] = array.array(self.typecode, [10]*3)
1244 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
1245 a = array.array(self.typecode, range(4))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001246 a[::-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +00001247 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
1248 a = array.array(self.typecode, range(10))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001249 b = a[:]
1250 c = a[:]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001251 ins = array.array(self.typecode, range(2))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001252 a[2:3] = ins
1253 b[slice(2,3)] = ins
1254 c[2:3:] = ins
Fred Drake004d5e62000-10-23 17:22:08 +00001255
Walter Dörwald7fd94242003-05-18 00:47:47 +00001256 def test_iterationcontains(self):
1257 a = array.array(self.typecode, range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +00001258 self.assertEqual(list(a), list(range(10)))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001259 b = array.array(self.typecode, [20])
1260 self.assertEqual(a[-1] in a, True)
1261 self.assertEqual(b[0] not in a, True)
1262
1263 def check_overflow(self, lower, upper):
1264 # method to be used by subclasses
1265
1266 # should not overflow assigning lower limit
1267 a = array.array(self.typecode, [lower])
1268 a[0] = lower
1269 # should overflow assigning less than lower limit
1270 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
1271 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
1272 # should not overflow assigning upper limit
1273 a = array.array(self.typecode, [upper])
1274 a[0] = upper
1275 # should overflow assigning more than upper limit
1276 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
1277 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
1278
1279 def test_subclassing(self):
1280 typecode = self.typecode
1281 class ExaggeratingArray(array.array):
1282 __slots__ = ['offset']
1283
1284 def __new__(cls, typecode, data, offset):
1285 return array.array.__new__(cls, typecode, data)
1286
1287 def __init__(self, typecode, data, offset):
1288 self.offset = offset
1289
1290 def __getitem__(self, i):
1291 return array.array.__getitem__(self, i) + self.offset
1292
1293 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
1294 self.assertEntryEqual(a[0], 7)
1295
1296 self.assertRaises(AttributeError, setattr, a, "color", "blue")
1297
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00001298 def test_frombytearray(self):
1299 a = array.array('b', range(10))
1300 b = array.array(self.typecode, a)
1301 self.assertEqual(a, b)
1302
orenmn964281a2017-03-09 11:35:28 +02001303class IntegerNumberTest(NumberTest):
1304 def test_type_error(self):
1305 a = array.array(self.typecode)
1306 a.append(42)
1307 with self.assertRaises(TypeError):
1308 a.append(42.0)
1309 with self.assertRaises(TypeError):
1310 a[0] = 42.0
1311
1312class Intable:
1313 def __init__(self, num):
1314 self._num = num
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +02001315 def __index__(self):
1316 return self._num
orenmn964281a2017-03-09 11:35:28 +02001317 def __int__(self):
1318 return self._num
1319 def __sub__(self, other):
1320 return Intable(int(self) - int(other))
1321 def __add__(self, other):
1322 return Intable(int(self) + int(other))
1323
1324class SignedNumberTest(IntegerNumberTest):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001325 example = [-1, 0, 1, 42, 0x7f]
1326 smallerexample = [-1, 0, 1, 42, 0x7e]
1327 biggerexample = [-1, 0, 1, 43, 0x7f]
1328 outside = 23
1329
1330 def test_overflow(self):
1331 a = array.array(self.typecode)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001332 lower = -1 * int(pow(2, a.itemsize * 8 - 1))
1333 upper = int(pow(2, a.itemsize * 8 - 1)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001334 self.check_overflow(lower, upper)
orenmn964281a2017-03-09 11:35:28 +02001335 self.check_overflow(Intable(lower), Intable(upper))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001336
orenmn964281a2017-03-09 11:35:28 +02001337class UnsignedNumberTest(IntegerNumberTest):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001338 example = [0, 1, 17, 23, 42, 0xff]
1339 smallerexample = [0, 1, 17, 23, 42, 0xfe]
1340 biggerexample = [0, 1, 17, 23, 43, 0xff]
1341 outside = 0xaa
1342
1343 def test_overflow(self):
1344 a = array.array(self.typecode)
1345 lower = 0
Guido van Rossume2a383d2007-01-15 16:59:06 +00001346 upper = int(pow(2, a.itemsize * 8)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001347 self.check_overflow(lower, upper)
orenmn964281a2017-03-09 11:35:28 +02001348 self.check_overflow(Intable(lower), Intable(upper))
Fred Drake004d5e62000-10-23 17:22:08 +00001349
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001350 def test_bytes_extend(self):
1351 s = bytes(self.example)
1352
1353 a = array.array(self.typecode, self.example)
1354 a.extend(s)
1355 self.assertEqual(
1356 a,
1357 array.array(self.typecode, self.example+self.example)
1358 )
1359
1360 a = array.array(self.typecode, self.example)
1361 a.extend(bytearray(reversed(s)))
1362 self.assertEqual(
1363 a,
1364 array.array(self.typecode, self.example+self.example[::-1])
1365 )
1366
Fred Drake004d5e62000-10-23 17:22:08 +00001367
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001368class ByteTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001369 typecode = 'b'
1370 minitemsize = 1
Fred Drake004d5e62000-10-23 17:22:08 +00001371
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001372class UnsignedByteTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001373 typecode = 'B'
1374 minitemsize = 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001375
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001376class ShortTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001377 typecode = 'h'
1378 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001379
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001380class UnsignedShortTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001381 typecode = 'H'
1382 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001383
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001384class IntTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001385 typecode = 'i'
1386 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001387
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001388class UnsignedIntTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001389 typecode = 'I'
1390 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001391
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001392class LongTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001393 typecode = 'l'
1394 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001395
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001396class UnsignedLongTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001397 typecode = 'L'
1398 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001399
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001400class LongLongTest(SignedNumberTest, unittest.TestCase):
Meador Inge1c9f0c92011-09-20 19:55:51 -05001401 typecode = 'q'
1402 minitemsize = 8
Meador Inge1c9f0c92011-09-20 19:55:51 -05001403
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001404class UnsignedLongLongTest(UnsignedNumberTest, unittest.TestCase):
Meador Inge1c9f0c92011-09-20 19:55:51 -05001405 typecode = 'Q'
1406 minitemsize = 8
Meador Inge1c9f0c92011-09-20 19:55:51 -05001407
Walter Dörwald7fd94242003-05-18 00:47:47 +00001408class FPTest(NumberTest):
1409 example = [-42.0, 0, 42, 1e5, -1e10]
1410 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
1411 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
1412 outside = 23
1413
1414 def assertEntryEqual(self, entry1, entry2):
1415 self.assertAlmostEqual(entry1, entry2)
1416
Adrian Wielgosik7c17e232017-08-17 12:46:06 +00001417 def test_nan(self):
1418 a = array.array(self.typecode, [float('nan')])
1419 b = array.array(self.typecode, [float('nan')])
1420 self.assertIs(a != b, True)
1421 self.assertIs(a == b, False)
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
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001427 def test_byteswap(self):
1428 a = array.array(self.typecode, self.example)
1429 self.assertRaises(TypeError, a.byteswap, 42)
1430 if a.itemsize in (1, 2, 4, 8):
1431 b = array.array(self.typecode, self.example)
1432 b.byteswap()
1433 if a.itemsize==1:
1434 self.assertEqual(a, b)
1435 else:
1436 # On alphas treating the byte swapped bit patters as
1437 # floats/doubles results in floating point exceptions
1438 # => compare the 8bit string values instead
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001439 self.assertNotEqual(a.tobytes(), b.tobytes())
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001440 b.byteswap()
1441 self.assertEqual(a, b)
1442
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001443class FloatTest(FPTest, unittest.TestCase):
Neal Norwitz35c6cd02003-05-22 13:29:15 +00001444 typecode = 'f'
1445 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001446
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001447class DoubleTest(FPTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001448 typecode = 'd'
1449 minitemsize = 8
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001450
1451 def test_alloc_overflow(self):
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001452 from sys import maxsize
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001453 a = array.array('d', [-1]*65536)
1454 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001455 a *= maxsize//65536 + 1
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001456 except MemoryError:
1457 pass
1458 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001459 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001460 b = array.array('d', [ 2.71828183, 3.14159265, -1])
1461 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001462 b * (maxsize//3 + 1)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001463 except MemoryError:
1464 pass
1465 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001466 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001467
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001468
sthaa3ecb82019-03-20 20:49:39 +01001469class LargeArrayTest(unittest.TestCase):
1470 typecode = 'b'
1471
1472 def example(self, size):
1473 # We assess a base memuse of <=2.125 for constructing this array
1474 base = array.array(self.typecode, [0, 1, 2, 3, 4, 5, 6, 7]) * (size // 8)
1475 base += array.array(self.typecode, [99]*(size % 8) + [8, 9, 10, 11])
1476 return base
1477
1478 @support.bigmemtest(_2G, memuse=2.125)
1479 def test_example_data(self, size):
1480 example = self.example(size)
1481 self.assertEqual(len(example), size+4)
1482
1483 @support.bigmemtest(_2G, memuse=2.125)
1484 def test_access(self, size):
1485 example = self.example(size)
1486 self.assertEqual(example[0], 0)
1487 self.assertEqual(example[-(size+4)], 0)
1488 self.assertEqual(example[size], 8)
1489 self.assertEqual(example[-4], 8)
1490 self.assertEqual(example[size+3], 11)
1491 self.assertEqual(example[-1], 11)
1492
1493 @support.bigmemtest(_2G, memuse=2.125+1)
1494 def test_slice(self, size):
1495 example = self.example(size)
1496 self.assertEqual(list(example[:4]), [0, 1, 2, 3])
1497 self.assertEqual(list(example[-4:]), [8, 9, 10, 11])
1498 part = example[1:-1]
1499 self.assertEqual(len(part), size+2)
1500 self.assertEqual(part[0], 1)
1501 self.assertEqual(part[-1], 10)
1502 del part
1503 part = example[::2]
1504 self.assertEqual(len(part), (size+5)//2)
1505 self.assertEqual(list(part[:4]), [0, 2, 4, 6])
1506 if size % 2:
1507 self.assertEqual(list(part[-2:]), [9, 11])
1508 else:
1509 self.assertEqual(list(part[-2:]), [8, 10])
1510
1511 @support.bigmemtest(_2G, memuse=2.125)
1512 def test_count(self, size):
1513 example = self.example(size)
1514 self.assertEqual(example.count(0), size//8)
1515 self.assertEqual(example.count(11), 1)
1516
1517 @support.bigmemtest(_2G, memuse=2.125)
1518 def test_append(self, size):
1519 example = self.example(size)
1520 example.append(12)
1521 self.assertEqual(example[-1], 12)
1522
1523 @support.bigmemtest(_2G, memuse=2.125)
1524 def test_extend(self, size):
1525 example = self.example(size)
1526 example.extend(iter([12, 13, 14, 15]))
1527 self.assertEqual(len(example), size+8)
1528 self.assertEqual(list(example[-8:]), [8, 9, 10, 11, 12, 13, 14, 15])
1529
1530 @support.bigmemtest(_2G, memuse=2.125)
1531 def test_frombytes(self, size):
1532 example = self.example(size)
1533 example.frombytes(b'abcd')
1534 self.assertEqual(len(example), size+8)
1535 self.assertEqual(list(example[-8:]), [8, 9, 10, 11] + list(b'abcd'))
1536
1537 @support.bigmemtest(_2G, memuse=2.125)
1538 def test_fromlist(self, size):
1539 example = self.example(size)
1540 example.fromlist([12, 13, 14, 15])
1541 self.assertEqual(len(example), size+8)
1542 self.assertEqual(list(example[-8:]), [8, 9, 10, 11, 12, 13, 14, 15])
1543
1544 @support.bigmemtest(_2G, memuse=2.125)
1545 def test_index(self, size):
1546 example = self.example(size)
1547 self.assertEqual(example.index(0), 0)
1548 self.assertEqual(example.index(1), 1)
1549 self.assertEqual(example.index(7), 7)
1550 self.assertEqual(example.index(11), size+3)
1551
1552 @support.bigmemtest(_2G, memuse=2.125)
1553 def test_insert(self, size):
1554 example = self.example(size)
1555 example.insert(0, 12)
1556 example.insert(10, 13)
1557 example.insert(size+1, 14)
1558 self.assertEqual(len(example), size+7)
1559 self.assertEqual(example[0], 12)
1560 self.assertEqual(example[10], 13)
1561 self.assertEqual(example[size+1], 14)
1562
1563 @support.bigmemtest(_2G, memuse=2.125)
1564 def test_pop(self, size):
1565 example = self.example(size)
1566 self.assertEqual(example.pop(0), 0)
1567 self.assertEqual(example[0], 1)
1568 self.assertEqual(example.pop(size+1), 10)
1569 self.assertEqual(example[size+1], 11)
1570 self.assertEqual(example.pop(1), 2)
1571 self.assertEqual(example[1], 3)
1572 self.assertEqual(len(example), size+1)
1573 self.assertEqual(example.pop(), 11)
1574 self.assertEqual(len(example), size)
1575
1576 @support.bigmemtest(_2G, memuse=2.125)
1577 def test_remove(self, size):
1578 example = self.example(size)
1579 example.remove(0)
1580 self.assertEqual(len(example), size+3)
1581 self.assertEqual(example[0], 1)
1582 example.remove(10)
1583 self.assertEqual(len(example), size+2)
1584 self.assertEqual(example[size], 9)
1585 self.assertEqual(example[size+1], 11)
1586
1587 @support.bigmemtest(_2G, memuse=2.125)
1588 def test_reverse(self, size):
1589 example = self.example(size)
1590 example.reverse()
1591 self.assertEqual(len(example), size+4)
1592 self.assertEqual(example[0], 11)
1593 self.assertEqual(example[3], 8)
1594 self.assertEqual(example[-1], 0)
1595 example.reverse()
1596 self.assertEqual(len(example), size+4)
1597 self.assertEqual(list(example[:4]), [0, 1, 2, 3])
1598 self.assertEqual(list(example[-4:]), [8, 9, 10, 11])
1599
1600 # list takes about 9 bytes per element
1601 @support.bigmemtest(_2G, memuse=2.125+9)
1602 def test_tolist(self, size):
1603 example = self.example(size)
1604 ls = example.tolist()
1605 self.assertEqual(len(ls), len(example))
1606 self.assertEqual(ls[:8], list(example[:8]))
1607 self.assertEqual(ls[-8:], list(example[-8:]))
1608
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001609if __name__ == "__main__":
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001610 unittest.main()