blob: 11184add6d399b68da8d256a1f4b3be992fd9858 [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
44 def test_immutable(self):
45 # bpo-43908: check that array.array is immutable
46 with self.assertRaises(TypeError):
47 array.array.foo = 1
48
Martin Panterbe8da9c2016-09-07 11:04:41 +000049 def test_empty(self):
50 # Exercise code for handling zero-length arrays
51 a = array.array('B')
52 a[:] = a
53 self.assertEqual(len(a), 0)
54 self.assertEqual(len(a + a), 0)
55 self.assertEqual(len(a * 3), 0)
56 a += a
57 self.assertEqual(len(a), 0)
58
Martin v. Löwis99866332002-03-01 10:27:01 +000059
Alexandre Vassalottiad077152009-07-15 17:49:23 +000060# Machine format codes.
61#
62# Search for "enum machine_format_code" in Modules/arraymodule.c to get the
63# authoritative values.
64UNKNOWN_FORMAT = -1
65UNSIGNED_INT8 = 0
66SIGNED_INT8 = 1
67UNSIGNED_INT16_LE = 2
68UNSIGNED_INT16_BE = 3
69SIGNED_INT16_LE = 4
70SIGNED_INT16_BE = 5
71UNSIGNED_INT32_LE = 6
72UNSIGNED_INT32_BE = 7
73SIGNED_INT32_LE = 8
74SIGNED_INT32_BE = 9
75UNSIGNED_INT64_LE = 10
76UNSIGNED_INT64_BE = 11
77SIGNED_INT64_LE = 12
78SIGNED_INT64_BE = 13
79IEEE_754_FLOAT_LE = 14
80IEEE_754_FLOAT_BE = 15
81IEEE_754_DOUBLE_LE = 16
82IEEE_754_DOUBLE_BE = 17
83UTF16_LE = 18
84UTF16_BE = 19
85UTF32_LE = 20
86UTF32_BE = 21
87
88class ArrayReconstructorTest(unittest.TestCase):
89
90 def test_error(self):
91 self.assertRaises(TypeError, array_reconstructor,
92 "", "b", 0, b"")
93 self.assertRaises(TypeError, array_reconstructor,
94 str, "b", 0, b"")
95 self.assertRaises(TypeError, array_reconstructor,
96 array.array, "b", '', b"")
97 self.assertRaises(TypeError, array_reconstructor,
98 array.array, "b", 0, "")
99 self.assertRaises(ValueError, array_reconstructor,
100 array.array, "?", 0, b"")
101 self.assertRaises(ValueError, array_reconstructor,
102 array.array, "b", UNKNOWN_FORMAT, b"")
103 self.assertRaises(ValueError, array_reconstructor,
104 array.array, "b", 22, b"")
105 self.assertRaises(ValueError, array_reconstructor,
106 array.array, "d", 16, b"a")
107
108 def test_numbers(self):
109 testcases = (
110 (['B', 'H', 'I', 'L'], UNSIGNED_INT8, '=BBBB',
111 [0x80, 0x7f, 0, 0xff]),
112 (['b', 'h', 'i', 'l'], SIGNED_INT8, '=bbb',
113 [-0x80, 0x7f, 0]),
114 (['H', 'I', 'L'], UNSIGNED_INT16_LE, '<HHHH',
115 [0x8000, 0x7fff, 0, 0xffff]),
116 (['H', 'I', 'L'], UNSIGNED_INT16_BE, '>HHHH',
117 [0x8000, 0x7fff, 0, 0xffff]),
118 (['h', 'i', 'l'], SIGNED_INT16_LE, '<hhh',
119 [-0x8000, 0x7fff, 0]),
120 (['h', 'i', 'l'], SIGNED_INT16_BE, '>hhh',
121 [-0x8000, 0x7fff, 0]),
122 (['I', 'L'], UNSIGNED_INT32_LE, '<IIII',
123 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
124 (['I', 'L'], UNSIGNED_INT32_BE, '>IIII',
125 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
126 (['i', 'l'], SIGNED_INT32_LE, '<iii',
127 [-1<<31, (1<<31)-1, 0]),
128 (['i', 'l'], SIGNED_INT32_BE, '>iii',
129 [-1<<31, (1<<31)-1, 0]),
130 (['L'], UNSIGNED_INT64_LE, '<QQQQ',
Alexandre Vassalotti0027d4b2009-07-15 20:53:55 +0000131 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
132 (['L'], UNSIGNED_INT64_BE, '>QQQQ',
133 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
134 (['l'], SIGNED_INT64_LE, '<qqq',
135 [-1<<31, (1<<31)-1, 0]),
136 (['l'], SIGNED_INT64_BE, '>qqq',
137 [-1<<31, (1<<31)-1, 0]),
138 # The following tests for INT64 will raise an OverflowError
139 # when run on a 32-bit machine. The tests are simply skipped
140 # in that case.
141 (['L'], UNSIGNED_INT64_LE, '<QQQQ',
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000142 [1<<63, (1<<63)-1, 0, (1<<64)-1]),
143 (['L'], UNSIGNED_INT64_BE, '>QQQQ',
144 [1<<63, (1<<63)-1, 0, (1<<64)-1]),
145 (['l'], SIGNED_INT64_LE, '<qqq',
146 [-1<<63, (1<<63)-1, 0]),
147 (['l'], SIGNED_INT64_BE, '>qqq',
148 [-1<<63, (1<<63)-1, 0]),
149 (['f'], IEEE_754_FLOAT_LE, '<ffff',
150 [16711938.0, float('inf'), float('-inf'), -0.0]),
151 (['f'], IEEE_754_FLOAT_BE, '>ffff',
152 [16711938.0, float('inf'), float('-inf'), -0.0]),
153 (['d'], IEEE_754_DOUBLE_LE, '<dddd',
154 [9006104071832581.0, float('inf'), float('-inf'), -0.0]),
155 (['d'], IEEE_754_DOUBLE_BE, '>dddd',
156 [9006104071832581.0, float('inf'), float('-inf'), -0.0])
157 )
158 for testcase in testcases:
159 valid_typecodes, mformat_code, struct_fmt, values = testcase
160 arraystr = struct.pack(struct_fmt, *values)
161 for typecode in valid_typecodes:
Alexandre Vassalotti0027d4b2009-07-15 20:53:55 +0000162 try:
163 a = array.array(typecode, values)
164 except OverflowError:
165 continue # Skip this test case.
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000166 b = array_reconstructor(
167 array.array, typecode, mformat_code, arraystr)
168 self.assertEqual(a, b,
169 msg="{0!r} != {1!r}; testcase={2!r}".format(a, b, testcase))
170
171 def test_unicode(self):
172 teststr = "Bonne Journ\xe9e \U0002030a\U00020347"
173 testcases = (
174 (UTF16_LE, "UTF-16-LE"),
175 (UTF16_BE, "UTF-16-BE"),
176 (UTF32_LE, "UTF-32-LE"),
177 (UTF32_BE, "UTF-32-BE")
178 )
179 for testcase in testcases:
180 mformat_code, encoding = testcase
181 a = array.array('u', teststr)
182 b = array_reconstructor(
183 array.array, 'u', mformat_code, teststr.encode(encoding))
184 self.assertEqual(a, b,
185 msg="{0!r} != {1!r}; testcase={2!r}".format(a, b, testcase))
186
187
Ezio Melotti1d3e96d2013-01-10 06:04:50 +0200188class BaseTest:
Walter Dörwald7fd94242003-05-18 00:47:47 +0000189 # Required class attributes (provided by subclasses
190 # typecode: the typecode to test
191 # example: an initializer usable in the constructor for this type
192 # smallerexample: the same length as example, but smaller
193 # biggerexample: the same length as example, but bigger
194 # outside: An entry that is not in example
195 # minitemsize: the minimum guaranteed itemsize
Martin v. Löwis99866332002-03-01 10:27:01 +0000196
Walter Dörwald7fd94242003-05-18 00:47:47 +0000197 def assertEntryEqual(self, entry1, entry2):
198 self.assertEqual(entry1, entry2)
Martin v. Löwis99866332002-03-01 10:27:01 +0000199
Walter Dörwald7fd94242003-05-18 00:47:47 +0000200 def badtypecode(self):
201 # Return a typecode that is different from our own
202 return typecodes[(typecodes.index(self.typecode)+1) % len(typecodes)]
Martin v. Löwis99866332002-03-01 10:27:01 +0000203
Walter Dörwald7fd94242003-05-18 00:47:47 +0000204 def test_constructor(self):
205 a = array.array(self.typecode)
206 self.assertEqual(a.typecode, self.typecode)
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200207 self.assertGreaterEqual(a.itemsize, self.minitemsize)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000208 self.assertRaises(TypeError, array.array, self.typecode, None)
Martin v. Löwis99866332002-03-01 10:27:01 +0000209
Walter Dörwald7fd94242003-05-18 00:47:47 +0000210 def test_len(self):
211 a = array.array(self.typecode)
212 a.append(self.example[0])
213 self.assertEqual(len(a), 1)
Martin v. Löwis99866332002-03-01 10:27:01 +0000214
Walter Dörwald7fd94242003-05-18 00:47:47 +0000215 a = array.array(self.typecode, self.example)
216 self.assertEqual(len(a), len(self.example))
Martin v. Löwis99866332002-03-01 10:27:01 +0000217
Walter Dörwald7fd94242003-05-18 00:47:47 +0000218 def test_buffer_info(self):
219 a = array.array(self.typecode, self.example)
220 self.assertRaises(TypeError, a.buffer_info, 42)
221 bi = a.buffer_info()
Ezio Melottie9615932010-01-24 19:26:24 +0000222 self.assertIsInstance(bi, tuple)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000223 self.assertEqual(len(bi), 2)
Ezio Melottie9615932010-01-24 19:26:24 +0000224 self.assertIsInstance(bi[0], int)
225 self.assertIsInstance(bi[1], int)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000226 self.assertEqual(bi[1], len(a))
Martin v. Löwis99866332002-03-01 10:27:01 +0000227
Walter Dörwald7fd94242003-05-18 00:47:47 +0000228 def test_byteswap(self):
Victor Stinner8dba4e02011-09-30 00:51:10 +0200229 if self.typecode == 'u':
230 example = '\U00100100'
231 else:
232 example = self.example
233 a = array.array(self.typecode, example)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000234 self.assertRaises(TypeError, a.byteswap, 42)
235 if a.itemsize in (1, 2, 4, 8):
Victor Stinner8dba4e02011-09-30 00:51:10 +0200236 b = array.array(self.typecode, example)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000237 b.byteswap()
238 if a.itemsize==1:
239 self.assertEqual(a, b)
240 else:
241 self.assertNotEqual(a, b)
242 b.byteswap()
243 self.assertEqual(a, b)
Martin v. Löwis99866332002-03-01 10:27:01 +0000244
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000245 def test_copy(self):
246 import copy
247 a = array.array(self.typecode, self.example)
248 b = copy.copy(a)
249 self.assertNotEqual(id(a), id(b))
250 self.assertEqual(a, b)
251
Thomas Wouters89f507f2006-12-13 04:49:30 +0000252 def test_deepcopy(self):
253 import copy
254 a = array.array(self.typecode, self.example)
255 b = copy.deepcopy(a)
256 self.assertNotEqual(id(a), id(b))
257 self.assertEqual(a, b)
258
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000259 def test_reduce_ex(self):
260 a = array.array(self.typecode, self.example)
261 for protocol in range(3):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000262 self.assertIs(a.__reduce_ex__(protocol)[0], array.array)
Zackery Spytzd1cbc6f2018-11-26 22:40:49 -0700263 for protocol in range(3, pickle.HIGHEST_PROTOCOL + 1):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000264 self.assertIs(a.__reduce_ex__(protocol)[0], array_reconstructor)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000265
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000266 def test_pickle(self):
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000267 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000268 a = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000269 b = pickle.loads(pickle.dumps(a, protocol))
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000270 self.assertNotEqual(id(a), id(b))
271 self.assertEqual(a, b)
272
273 a = ArraySubclass(self.typecode, self.example)
274 a.x = 10
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 self.assertEqual(a.x, b.x)
279 self.assertEqual(type(a), type(b))
280
Guido van Rossumd8faa362007-04-27 19:54:29 +0000281 def test_pickle_for_empty_array(self):
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000282 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossumd8faa362007-04-27 19:54:29 +0000283 a = array.array(self.typecode)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000284 b = pickle.loads(pickle.dumps(a, protocol))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000285 self.assertNotEqual(id(a), id(b))
286 self.assertEqual(a, b)
287
288 a = ArraySubclass(self.typecode)
289 a.x = 10
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 self.assertEqual(a.x, b.x)
294 self.assertEqual(type(a), type(b))
295
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000296 def test_iterator_pickle(self):
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200297 orig = array.array(self.typecode, self.example)
298 data = list(orig)
299 data2 = data[::-1]
Serhiy Storchakabad12572014-12-15 14:03:42 +0200300 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200301 # initial iterator
302 itorig = iter(orig)
303 d = pickle.dumps((itorig, orig), proto)
304 it, a = pickle.loads(d)
305 a.fromlist(data2)
306 self.assertEqual(type(it), type(itorig))
307 self.assertEqual(list(it), data + data2)
Serhiy Storchakabad12572014-12-15 14:03:42 +0200308
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200309 # running iterator
310 next(itorig)
311 d = pickle.dumps((itorig, orig), proto)
312 it, a = pickle.loads(d)
313 a.fromlist(data2)
314 self.assertEqual(type(it), type(itorig))
315 self.assertEqual(list(it), data[1:] + data2)
316
317 # empty iterator
318 for i in range(1, len(data)):
319 next(itorig)
320 d = pickle.dumps((itorig, orig), proto)
321 it, a = pickle.loads(d)
322 a.fromlist(data2)
323 self.assertEqual(type(it), type(itorig))
324 self.assertEqual(list(it), data2)
325
326 # exhausted iterator
327 self.assertRaises(StopIteration, next, itorig)
328 d = pickle.dumps((itorig, orig), proto)
329 it, a = pickle.loads(d)
330 a.fromlist(data2)
Serhiy Storchakaab0d1982016-03-30 21:11:16 +0300331 self.assertEqual(list(it), [])
332
333 def test_exhausted_iterator(self):
334 a = array.array(self.typecode, self.example)
335 self.assertEqual(list(a), list(self.example))
336 exhit = iter(a)
337 empit = iter(a)
338 for x in exhit: # exhaust the iterator
339 next(empit) # not exhausted
340 a.append(self.outside)
341 self.assertEqual(list(exhit), [])
342 self.assertEqual(list(empit), [self.outside])
343 self.assertEqual(list(a), list(self.example) + [self.outside])
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000344
Pablo Galindoe51dd9d2020-07-05 22:43:14 +0100345 def test_reverse_iterator(self):
346 a = array.array(self.typecode, self.example)
347 self.assertEqual(list(a), list(self.example))
348 self.assertEqual(list(reversed(a)), list(iter(a))[::-1])
349
350 def test_reverse_iterator_picking(self):
351 orig = array.array(self.typecode, self.example)
352 data = list(orig)
353 data2 = [self.outside] + data
354 rev_data = data[len(data)-2::-1] + [self.outside]
355 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
356 # initial iterator
357 itorig = reversed(orig)
358 d = pickle.dumps((itorig, orig), proto)
359 it, a = pickle.loads(d)
360 a.insert(0, self.outside)
361 self.assertEqual(type(it), type(itorig))
362 self.assertEqual(list(it), rev_data)
363 self.assertEqual(list(a), data2)
364
365 # running iterator
366 next(itorig)
367 d = pickle.dumps((itorig, orig), proto)
368 it, a = pickle.loads(d)
369 a.insert(0, self.outside)
370 self.assertEqual(type(it), type(itorig))
371 self.assertEqual(list(it), rev_data[1:])
372 self.assertEqual(list(a), data2)
373
374 # empty iterator
375 for i in range(1, len(data)):
376 next(itorig)
377 d = pickle.dumps((itorig, orig), proto)
378 it, a = pickle.loads(d)
379 a.insert(0, self.outside)
380 self.assertEqual(type(it), type(itorig))
381 self.assertEqual(list(it), [])
382 self.assertEqual(list(a), data2)
383
384 # exhausted iterator
385 self.assertRaises(StopIteration, next, itorig)
386 d = pickle.dumps((itorig, orig), proto)
387 it, a = pickle.loads(d)
388 a.insert(0, self.outside)
389 self.assertEqual(list(it), [])
390 self.assertEqual(list(a), data2)
391
392 def test_exhausted_reverse_iterator(self):
393 a = array.array(self.typecode, self.example)
394 self.assertEqual(list(a), list(self.example))
395 exhit = reversed(a)
396 empit = reversed(a)
397 for x in exhit: # exhaust the iterator
398 next(empit) # Pointing past the 0th position.
399 a.insert(0, self.outside)
400 self.assertEqual(list(exhit), [])
401 # The iterator index points past the 0th position so inserting
Ikko Ashimine9303b9e2020-11-10 21:42:36 +0900402 # an element in the beginning does not make it appear.
Pablo Galindoe51dd9d2020-07-05 22:43:14 +0100403 self.assertEqual(list(empit), [])
404 self.assertEqual(list(a), [self.outside] + list(self.example))
405
Walter Dörwald7fd94242003-05-18 00:47:47 +0000406 def test_insert(self):
407 a = array.array(self.typecode, self.example)
408 a.insert(0, self.example[0])
409 self.assertEqual(len(a), 1+len(self.example))
410 self.assertEqual(a[0], a[1])
411 self.assertRaises(TypeError, a.insert)
412 self.assertRaises(TypeError, a.insert, None)
Walter Dörwaldba39d9c2003-05-18 01:56:25 +0000413 self.assertRaises(TypeError, a.insert, 0, None)
Martin v. Löwis99866332002-03-01 10:27:01 +0000414
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000415 a = array.array(self.typecode, self.example)
416 a.insert(-1, self.example[0])
417 self.assertEqual(
418 a,
419 array.array(
420 self.typecode,
421 self.example[:-1] + self.example[:1] + self.example[-1:]
422 )
423 )
424
425 a = array.array(self.typecode, self.example)
426 a.insert(-1000, self.example[0])
427 self.assertEqual(
428 a,
429 array.array(self.typecode, self.example[:1] + self.example)
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 + self.example[:1])
437 )
438
Walter Dörwald7fd94242003-05-18 00:47:47 +0000439 def test_tofromfile(self):
440 a = array.array(self.typecode, 2*self.example)
441 self.assertRaises(TypeError, a.tofile)
Hai Shif7ba40b2020-06-25 18:38:51 +0800442 os_helper.unlink(os_helper.TESTFN)
443 f = open(os_helper.TESTFN, 'wb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000444 try:
445 a.tofile(f)
446 f.close()
447 b = array.array(self.typecode)
Hai Shif7ba40b2020-06-25 18:38:51 +0800448 f = open(os_helper.TESTFN, 'rb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000449 self.assertRaises(TypeError, b.fromfile)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000450 b.fromfile(f, len(self.example))
451 self.assertEqual(b, array.array(self.typecode, self.example))
452 self.assertNotEqual(a, b)
Hirokazu Yamamoto54d0df62009-03-06 03:04:07 +0000453 self.assertRaises(EOFError, b.fromfile, f, len(self.example)+1)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000454 self.assertEqual(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000455 f.close()
456 finally:
457 if not f.closed:
458 f.close()
Hai Shif7ba40b2020-06-25 18:38:51 +0800459 os_helper.unlink(os_helper.TESTFN)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000460
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000461 def test_fromfile_ioerror(self):
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200462 # Issue #5395: Check if fromfile raises a proper OSError
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000463 # instead of EOFError.
464 a = array.array(self.typecode)
Hai Shif7ba40b2020-06-25 18:38:51 +0800465 f = open(os_helper.TESTFN, 'wb')
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000466 try:
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200467 self.assertRaises(OSError, a.fromfile, f, len(self.example))
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000468 finally:
469 f.close()
Hai Shif7ba40b2020-06-25 18:38:51 +0800470 os_helper.unlink(os_helper.TESTFN)
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000471
Frank Wierzbicki17683432009-08-16 20:30:12 +0000472 def test_filewrite(self):
473 a = array.array(self.typecode, 2*self.example)
Hai Shif7ba40b2020-06-25 18:38:51 +0800474 f = open(os_helper.TESTFN, 'wb')
Frank Wierzbicki17683432009-08-16 20:30:12 +0000475 try:
476 f.write(a)
477 f.close()
478 b = array.array(self.typecode)
Hai Shif7ba40b2020-06-25 18:38:51 +0800479 f = open(os_helper.TESTFN, 'rb')
Frank Wierzbicki17683432009-08-16 20:30:12 +0000480 b.fromfile(f, len(self.example))
481 self.assertEqual(b, array.array(self.typecode, self.example))
482 self.assertNotEqual(a, b)
483 b.fromfile(f, len(self.example))
484 self.assertEqual(a, b)
485 f.close()
486 finally:
487 if not f.closed:
488 f.close()
Hai Shif7ba40b2020-06-25 18:38:51 +0800489 os_helper.unlink(os_helper.TESTFN)
Frank Wierzbicki17683432009-08-16 20:30:12 +0000490
Walter Dörwald7fd94242003-05-18 00:47:47 +0000491 def test_tofromlist(self):
492 a = array.array(self.typecode, 2*self.example)
493 b = array.array(self.typecode)
494 self.assertRaises(TypeError, a.tolist, 42)
495 self.assertRaises(TypeError, b.fromlist)
496 self.assertRaises(TypeError, b.fromlist, 42)
497 self.assertRaises(TypeError, b.fromlist, [None])
498 b.fromlist(a.tolist())
499 self.assertEqual(a, b)
Fred Drake78334472000-06-28 17:50:51 +0000500
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000501 def test_tofrombytes(self):
Walter Dörwald7fd94242003-05-18 00:47:47 +0000502 a = array.array(self.typecode, 2*self.example)
503 b = array.array(self.typecode)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000504 self.assertRaises(TypeError, a.tobytes, 42)
505 self.assertRaises(TypeError, b.frombytes)
506 self.assertRaises(TypeError, b.frombytes, 42)
507 b.frombytes(a.tobytes())
508 c = array.array(self.typecode, bytearray(a.tobytes()))
Walter Dörwald7fd94242003-05-18 00:47:47 +0000509 self.assertEqual(a, b)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000510 self.assertEqual(a, c)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000511 if a.itemsize>1:
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000512 self.assertRaises(ValueError, b.frombytes, b"x")
Fred Drake78334472000-06-28 17:50:51 +0000513
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +0000514 def test_fromarray(self):
515 a = array.array(self.typecode, self.example)
516 b = array.array(self.typecode, a)
517 self.assertEqual(a, b)
518
Walter Dörwald7fd94242003-05-18 00:47:47 +0000519 def test_repr(self):
520 a = array.array(self.typecode, 2*self.example)
521 self.assertEqual(a, eval(repr(a), {"array": array.array}))
Fred Drake78334472000-06-28 17:50:51 +0000522
Walter Dörwald7fd94242003-05-18 00:47:47 +0000523 a = array.array(self.typecode)
524 self.assertEqual(repr(a), "array('%s')" % self.typecode)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000525
Walter Dörwald7fd94242003-05-18 00:47:47 +0000526 def test_str(self):
527 a = array.array(self.typecode, 2*self.example)
528 str(a)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000529
Walter Dörwald7fd94242003-05-18 00:47:47 +0000530 def test_cmp(self):
531 a = array.array(self.typecode, self.example)
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200532 self.assertIs(a == 42, False)
533 self.assertIs(a != 42, True)
Tim Peterscc78e472000-11-14 21:36:07 +0000534
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200535 self.assertIs(a == a, True)
536 self.assertIs(a != a, False)
537 self.assertIs(a < a, False)
538 self.assertIs(a <= a, True)
539 self.assertIs(a > a, False)
540 self.assertIs(a >= a, True)
Tim Peterscc78e472000-11-14 21:36:07 +0000541
Neal Norwitzbd2835c2006-03-17 08:54:15 +0000542 al = array.array(self.typecode, self.smallerexample)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000543 ab = array.array(self.typecode, self.biggerexample)
Guido van Rossum7f1d3aa1998-07-16 15:31:43 +0000544
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200545 self.assertIs(a == 2*a, False)
546 self.assertIs(a != 2*a, True)
547 self.assertIs(a < 2*a, True)
548 self.assertIs(a <= 2*a, True)
549 self.assertIs(a > 2*a, False)
550 self.assertIs(a >= 2*a, False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000551
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200552 self.assertIs(a == al, False)
553 self.assertIs(a != al, True)
554 self.assertIs(a < al, False)
555 self.assertIs(a <= al, False)
556 self.assertIs(a > al, True)
557 self.assertIs(a >= al, True)
Martin v. Löwis99866332002-03-01 10:27:01 +0000558
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200559 self.assertIs(a == ab, False)
560 self.assertIs(a != ab, True)
561 self.assertIs(a < ab, True)
562 self.assertIs(a <= ab, True)
563 self.assertIs(a > ab, False)
564 self.assertIs(a >= ab, False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000565
Walter Dörwald7fd94242003-05-18 00:47:47 +0000566 def test_add(self):
567 a = array.array(self.typecode, self.example) \
568 + array.array(self.typecode, self.example[::-1])
569 self.assertEqual(
570 a,
571 array.array(self.typecode, self.example + self.example[::-1])
572 )
Martin v. Löwis99866332002-03-01 10:27:01 +0000573
Walter Dörwald7fd94242003-05-18 00:47:47 +0000574 b = array.array(self.badtypecode())
575 self.assertRaises(TypeError, a.__add__, b)
576
577 self.assertRaises(TypeError, a.__add__, "bad")
578
579 def test_iadd(self):
580 a = array.array(self.typecode, self.example[::-1])
581 b = a
582 a += array.array(self.typecode, 2*self.example)
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200583 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000584 self.assertEqual(
585 a,
586 array.array(self.typecode, self.example[::-1]+2*self.example)
587 )
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000588 a = array.array(self.typecode, self.example)
589 a += a
590 self.assertEqual(
591 a,
592 array.array(self.typecode, self.example + self.example)
593 )
Walter Dörwald7fd94242003-05-18 00:47:47 +0000594
595 b = array.array(self.badtypecode())
596 self.assertRaises(TypeError, a.__add__, b)
597
598 self.assertRaises(TypeError, a.__iadd__, "bad")
599
600 def test_mul(self):
601 a = 5*array.array(self.typecode, self.example)
602 self.assertEqual(
603 a,
604 array.array(self.typecode, 5*self.example)
605 )
606
607 a = array.array(self.typecode, self.example)*5
608 self.assertEqual(
609 a,
610 array.array(self.typecode, self.example*5)
611 )
612
613 a = 0*array.array(self.typecode, self.example)
614 self.assertEqual(
615 a,
616 array.array(self.typecode)
617 )
618
619 a = (-1)*array.array(self.typecode, self.example)
620 self.assertEqual(
621 a,
622 array.array(self.typecode)
623 )
624
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000625 a = 5 * array.array(self.typecode, self.example[:1])
626 self.assertEqual(
627 a,
628 array.array(self.typecode, [a[0]] * 5)
629 )
630
Walter Dörwald7fd94242003-05-18 00:47:47 +0000631 self.assertRaises(TypeError, a.__mul__, "bad")
632
633 def test_imul(self):
634 a = array.array(self.typecode, self.example)
635 b = a
636
637 a *= 5
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200638 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000639 self.assertEqual(
640 a,
641 array.array(self.typecode, 5*self.example)
642 )
643
644 a *= 0
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200645 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000646 self.assertEqual(a, array.array(self.typecode))
647
648 a *= 1000
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200649 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000650 self.assertEqual(a, array.array(self.typecode))
651
652 a *= -1
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200653 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000654 self.assertEqual(a, array.array(self.typecode))
655
656 a = array.array(self.typecode, self.example)
657 a *= -1
658 self.assertEqual(a, array.array(self.typecode))
659
660 self.assertRaises(TypeError, a.__imul__, "bad")
661
662 def test_getitem(self):
663 a = array.array(self.typecode, self.example)
664 self.assertEntryEqual(a[0], self.example[0])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000665 self.assertEntryEqual(a[0], self.example[0])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000666 self.assertEntryEqual(a[-1], self.example[-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000667 self.assertEntryEqual(a[-1], self.example[-1])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000668 self.assertEntryEqual(a[len(self.example)-1], self.example[-1])
669 self.assertEntryEqual(a[-len(self.example)], self.example[0])
670 self.assertRaises(TypeError, a.__getitem__)
671 self.assertRaises(IndexError, a.__getitem__, len(self.example))
672 self.assertRaises(IndexError, a.__getitem__, -len(self.example)-1)
673
674 def test_setitem(self):
675 a = array.array(self.typecode, self.example)
676 a[0] = a[-1]
677 self.assertEntryEqual(a[0], a[-1])
678
679 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000680 a[0] = a[-1]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000681 self.assertEntryEqual(a[0], a[-1])
682
683 a = array.array(self.typecode, self.example)
684 a[-1] = a[0]
685 self.assertEntryEqual(a[0], a[-1])
686
687 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000688 a[-1] = a[0]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000689 self.assertEntryEqual(a[0], a[-1])
690
691 a = array.array(self.typecode, self.example)
692 a[len(self.example)-1] = a[0]
693 self.assertEntryEqual(a[0], a[-1])
694
695 a = array.array(self.typecode, self.example)
696 a[-len(self.example)] = a[-1]
697 self.assertEntryEqual(a[0], a[-1])
698
699 self.assertRaises(TypeError, a.__setitem__)
700 self.assertRaises(TypeError, a.__setitem__, None)
701 self.assertRaises(TypeError, a.__setitem__, 0, None)
702 self.assertRaises(
703 IndexError,
704 a.__setitem__,
705 len(self.example), self.example[0]
706 )
707 self.assertRaises(
708 IndexError,
709 a.__setitem__,
710 -len(self.example)-1, self.example[0]
711 )
712
713 def test_delitem(self):
714 a = array.array(self.typecode, self.example)
715 del a[0]
716 self.assertEqual(
717 a,
718 array.array(self.typecode, self.example[1:])
719 )
720
721 a = array.array(self.typecode, self.example)
722 del a[-1]
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[len(self.example)-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)]
737 self.assertEqual(
738 a,
739 array.array(self.typecode, self.example[1:])
740 )
741
742 self.assertRaises(TypeError, a.__delitem__)
743 self.assertRaises(TypeError, a.__delitem__, None)
744 self.assertRaises(IndexError, a.__delitem__, len(self.example))
745 self.assertRaises(IndexError, a.__delitem__, -len(self.example)-1)
746
747 def test_getslice(self):
748 a = array.array(self.typecode, self.example)
749 self.assertEqual(a[:], a)
750
751 self.assertEqual(
752 a[1:],
753 array.array(self.typecode, self.example[1:])
754 )
755
756 self.assertEqual(
757 a[:1],
758 array.array(self.typecode, self.example[:1])
759 )
760
761 self.assertEqual(
762 a[:-1],
763 array.array(self.typecode, self.example[:-1])
764 )
765
766 self.assertEqual(
767 a[-1:],
768 array.array(self.typecode, self.example[-1:])
769 )
770
771 self.assertEqual(
772 a[-1:-1],
773 array.array(self.typecode)
774 )
775
776 self.assertEqual(
Walter Dörwald1083c242005-01-21 21:16:51 +0000777 a[2:1],
778 array.array(self.typecode)
779 )
780
781 self.assertEqual(
Walter Dörwald7fd94242003-05-18 00:47:47 +0000782 a[1000:],
783 array.array(self.typecode)
784 )
785 self.assertEqual(a[-1000:], a)
786 self.assertEqual(a[:1000], a)
787 self.assertEqual(
788 a[:-1000],
789 array.array(self.typecode)
790 )
791 self.assertEqual(a[-1000:1000], a)
792 self.assertEqual(
793 a[2000:1000],
794 array.array(self.typecode)
795 )
796
Thomas Woutersed03b412007-08-28 21:37:11 +0000797 def test_extended_getslice(self):
798 # Test extended slicing by comparing with list slicing
799 # (Assumes list conversion works correctly, too)
800 a = array.array(self.typecode, self.example)
Zackery Spytz14514d92019-05-17 01:13:03 -0600801 indices = (0, None, 1, 3, 19, 100, sys.maxsize, -1, -2, -31, -100)
Thomas Woutersed03b412007-08-28 21:37:11 +0000802 for start in indices:
803 for stop in indices:
804 # Everything except the initial 0 (invalid step)
805 for step in indices[1:]:
806 self.assertEqual(list(a[start:stop:step]),
807 list(a)[start:stop:step])
808
Walter Dörwald7fd94242003-05-18 00:47:47 +0000809 def test_setslice(self):
810 a = array.array(self.typecode, self.example)
811 a[:1] = a
812 self.assertEqual(
813 a,
814 array.array(self.typecode, self.example + self.example[1:])
815 )
816
817 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000818 a[:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000819 self.assertEqual(
820 a,
821 array.array(self.typecode, self.example + self.example[-1:])
822 )
823
824 a = array.array(self.typecode, self.example)
825 a[-1:] = a
826 self.assertEqual(
827 a,
828 array.array(self.typecode, self.example[:-1] + self.example)
829 )
830
831 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000832 a[1:] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000833 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:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000840 self.assertEqual(
841 a,
842 array.array(
843 self.typecode,
844 self.example[:1] + self.example + self.example[-1:]
845 )
846 )
847
848 a = array.array(self.typecode, self.example)
849 a[1000:] = a
850 self.assertEqual(
851 a,
852 array.array(self.typecode, 2*self.example)
853 )
854
855 a = array.array(self.typecode, self.example)
856 a[-1000:] = a
857 self.assertEqual(
858 a,
859 array.array(self.typecode, 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, 2*self.example)
874 )
875
876 a = array.array(self.typecode, self.example)
877 a[1:0] = a
878 self.assertEqual(
879 a,
880 array.array(self.typecode, self.example[:1] + self.example + self.example[1:])
881 )
882
883 a = array.array(self.typecode, self.example)
884 a[2000:1000] = a
885 self.assertEqual(
886 a,
887 array.array(self.typecode, 2*self.example)
888 )
889
890 a = array.array(self.typecode, self.example)
Thomas Woutersed03b412007-08-28 21:37:11 +0000891 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), None)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000892 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), None)
893
894 b = array.array(self.badtypecode())
Thomas Woutersed03b412007-08-28 21:37:11 +0000895 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000896 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), b)
897
Thomas Woutersed03b412007-08-28 21:37:11 +0000898 def test_extended_set_del_slice(self):
Zackery Spytz14514d92019-05-17 01:13:03 -0600899 indices = (0, None, 1, 3, 19, 100, sys.maxsize, -1, -2, -31, -100)
Thomas Woutersed03b412007-08-28 21:37:11 +0000900 for start in indices:
901 for stop in indices:
902 # Everything except the initial 0 (invalid step)
903 for step in indices[1:]:
904 a = array.array(self.typecode, self.example)
905 L = list(a)
906 # Make sure we have a slice of exactly the right length,
907 # but with (hopefully) different data.
908 data = L[start:stop:step]
909 data.reverse()
910 L[start:stop:step] = data
911 a[start:stop:step] = array.array(self.typecode, data)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000912 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000913
914 del L[start:stop:step]
915 del a[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +0000916 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000917
Walter Dörwald7fd94242003-05-18 00:47:47 +0000918 def test_index(self):
919 example = 2*self.example
920 a = array.array(self.typecode, example)
921 self.assertRaises(TypeError, a.index)
922 for x in example:
923 self.assertEqual(a.index(x), example.index(x))
924 self.assertRaises(ValueError, a.index, None)
925 self.assertRaises(ValueError, a.index, self.outside)
926
Zackery Spytzafd12652021-04-02 09:28:35 -0600927 a = array.array('i', [-2, -1, 0, 0, 1, 2])
928 self.assertEqual(a.index(0), 2)
929 self.assertEqual(a.index(0, 2), 2)
930 self.assertEqual(a.index(0, -4), 2)
931 self.assertEqual(a.index(-2, -10), 0)
932 self.assertEqual(a.index(0, 3), 3)
933 self.assertEqual(a.index(0, -3), 3)
934 self.assertEqual(a.index(0, 3, 4), 3)
935 self.assertEqual(a.index(0, -3, -2), 3)
936 self.assertRaises(ValueError, a.index, 2, 0, -10)
937
Walter Dörwald7fd94242003-05-18 00:47:47 +0000938 def test_count(self):
939 example = 2*self.example
940 a = array.array(self.typecode, example)
941 self.assertRaises(TypeError, a.count)
942 for x in example:
943 self.assertEqual(a.count(x), example.count(x))
944 self.assertEqual(a.count(self.outside), 0)
945 self.assertEqual(a.count(None), 0)
946
947 def test_remove(self):
948 for x in self.example:
949 example = 2*self.example
950 a = array.array(self.typecode, example)
951 pos = example.index(x)
952 example2 = example[:pos] + example[pos+1:]
953 a.remove(x)
954 self.assertEqual(a, array.array(self.typecode, example2))
955
956 a = array.array(self.typecode, self.example)
957 self.assertRaises(ValueError, a.remove, self.outside)
958
959 self.assertRaises(ValueError, a.remove, None)
960
961 def test_pop(self):
962 a = array.array(self.typecode)
963 self.assertRaises(IndexError, a.pop)
964
965 a = array.array(self.typecode, 2*self.example)
966 self.assertRaises(TypeError, a.pop, 42, 42)
967 self.assertRaises(TypeError, a.pop, None)
968 self.assertRaises(IndexError, a.pop, len(a))
969 self.assertRaises(IndexError, a.pop, -len(a)-1)
970
971 self.assertEntryEqual(a.pop(0), self.example[0])
972 self.assertEqual(
973 a,
974 array.array(self.typecode, self.example[1:]+self.example)
975 )
976 self.assertEntryEqual(a.pop(1), self.example[2])
977 self.assertEqual(
978 a,
979 array.array(self.typecode, self.example[1:2]+self.example[3:]+self.example)
980 )
981 self.assertEntryEqual(a.pop(0), self.example[1])
982 self.assertEntryEqual(a.pop(), self.example[-1])
983 self.assertEqual(
984 a,
985 array.array(self.typecode, self.example[3:]+self.example[:-1])
986 )
987
988 def test_reverse(self):
989 a = array.array(self.typecode, self.example)
990 self.assertRaises(TypeError, a.reverse, 42)
Fred Drake004d5e62000-10-23 17:22:08 +0000991 a.reverse()
Walter Dörwald7fd94242003-05-18 00:47:47 +0000992 self.assertEqual(
993 a,
994 array.array(self.typecode, self.example[::-1])
995 )
996
997 def test_extend(self):
998 a = array.array(self.typecode, self.example)
999 self.assertRaises(TypeError, a.extend)
1000 a.extend(array.array(self.typecode, self.example[::-1]))
1001 self.assertEqual(
1002 a,
1003 array.array(self.typecode, self.example+self.example[::-1])
1004 )
1005
Alexandre Vassalottie503cf92009-07-05 06:25:14 +00001006 a = array.array(self.typecode, self.example)
1007 a.extend(a)
1008 self.assertEqual(
1009 a,
1010 array.array(self.typecode, self.example+self.example)
1011 )
1012
Walter Dörwald7fd94242003-05-18 00:47:47 +00001013 b = array.array(self.badtypecode())
1014 self.assertRaises(TypeError, a.extend, b)
1015
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001016 a = array.array(self.typecode, self.example)
1017 a.extend(self.example[::-1])
1018 self.assertEqual(
1019 a,
1020 array.array(self.typecode, self.example+self.example[::-1])
1021 )
1022
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001023 def test_constructor_with_iterable_argument(self):
1024 a = array.array(self.typecode, iter(self.example))
1025 b = array.array(self.typecode, self.example)
1026 self.assertEqual(a, b)
1027
1028 # non-iterable argument
1029 self.assertRaises(TypeError, array.array, self.typecode, 10)
1030
1031 # pass through errors raised in __iter__
1032 class A:
1033 def __iter__(self):
1034 raise UnicodeError
1035 self.assertRaises(UnicodeError, array.array, self.typecode, A())
1036
1037 # pass through errors raised in next()
1038 def B():
1039 raise UnicodeError
1040 yield None
1041 self.assertRaises(UnicodeError, array.array, self.typecode, B())
1042
Walter Dörwald7fd94242003-05-18 00:47:47 +00001043 def test_coveritertraverse(self):
1044 try:
1045 import gc
1046 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001047 self.skipTest('gc module not available')
Walter Dörwald7fd94242003-05-18 00:47:47 +00001048 a = array.array(self.typecode)
1049 l = [iter(a)]
1050 l.append(l)
1051 gc.collect()
1052
1053 def test_buffer(self):
1054 a = array.array(self.typecode, self.example)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001055 m = memoryview(a)
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001056 expected = m.tobytes()
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001057 self.assertEqual(a.tobytes(), expected)
1058 self.assertEqual(a.tobytes()[0], expected[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001059 # Resizing is forbidden when there are buffer exports.
1060 # For issue 4509, we also check after each error that
1061 # the array was not modified.
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001062 self.assertRaises(BufferError, a.append, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001063 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001064 self.assertRaises(BufferError, a.extend, a[0:1])
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001065 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001066 self.assertRaises(BufferError, a.remove, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001067 self.assertEqual(m.tobytes(), expected)
1068 self.assertRaises(BufferError, a.pop, 0)
1069 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001070 self.assertRaises(BufferError, a.fromlist, a.tolist())
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001071 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001072 self.assertRaises(BufferError, a.frombytes, a.tobytes())
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001073 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001074 if self.typecode == 'u':
1075 self.assertRaises(BufferError, a.fromunicode, a.tounicode())
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001076 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +00001077 self.assertRaises(BufferError, operator.imul, a, 2)
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001078 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +00001079 self.assertRaises(BufferError, operator.imul, a, 0)
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001080 self.assertEqual(m.tobytes(), expected)
1081 self.assertRaises(BufferError, operator.setitem, a, slice(0, 0), a)
1082 self.assertEqual(m.tobytes(), expected)
1083 self.assertRaises(BufferError, operator.delitem, a, 0)
1084 self.assertEqual(m.tobytes(), expected)
1085 self.assertRaises(BufferError, operator.delitem, a, slice(0, 1))
1086 self.assertEqual(m.tobytes(), expected)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001087
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001088 def test_weakref(self):
1089 s = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001090 p = weakref.proxy(s)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001091 self.assertEqual(p.tobytes(), s.tobytes())
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001092 s = None
1093 self.assertRaises(ReferenceError, len, p)
1094
Serhiy Storchaka43767632013-11-03 21:31:38 +02001095 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
1096 'test needs sys.getrefcount()')
Skip Montanarod5cf0b82003-08-03 23:02:10 +00001097 def test_bug_782369(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +02001098 for i in range(10):
1099 b = array.array('B', range(64))
1100 rc = sys.getrefcount(10)
1101 for i in range(10):
1102 b = array.array('B', range(64))
1103 self.assertEqual(rc, sys.getrefcount(10))
Skip Montanarod5cf0b82003-08-03 23:02:10 +00001104
Thomas Woutersb2137042007-02-01 18:02:27 +00001105 def test_subclass_with_kwargs(self):
1106 # SF bug #1486663 -- this used to erroneously raise a TypeError
1107 ArraySubclassWithKwargs('b', newarg=1)
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001108
Guido van Rossum6b826ab2007-07-03 16:22:09 +00001109 def test_create_from_bytes(self):
Alexandre Vassalotti7e4f3212009-07-05 05:38:18 +00001110 # XXX This test probably needs to be moved in a subclass or
1111 # generalized to use self.typecode.
Guido van Rossum6b826ab2007-07-03 16:22:09 +00001112 a = array.array('H', b"1234")
1113 self.assertEqual(len(a) * a.itemsize, 4)
1114
Meador Inge03b4d502012-08-10 22:35:45 -05001115 @support.cpython_only
1116 def test_sizeof_with_buffer(self):
1117 a = array.array(self.typecode, self.example)
Meador Inge80dd1af2012-08-10 23:21:39 -05001118 basesize = support.calcvobjsize('Pn2Pi')
Meador Inge03b4d502012-08-10 22:35:45 -05001119 buffer_size = a.buffer_info()[1] * a.itemsize
1120 support.check_sizeof(self, a, basesize + buffer_size)
1121
1122 @support.cpython_only
1123 def test_sizeof_without_buffer(self):
1124 a = array.array(self.typecode)
Meador Inge80dd1af2012-08-10 23:21:39 -05001125 basesize = support.calcvobjsize('Pn2Pi')
Meador Inge03b4d502012-08-10 22:35:45 -05001126 support.check_sizeof(self, a, basesize)
1127
Alexandre Vassalotti9730e332013-11-29 20:47:15 -08001128 def test_initialize_with_unicode(self):
1129 if self.typecode != 'u':
1130 with self.assertRaises(TypeError) as cm:
1131 a = array.array(self.typecode, 'foo')
1132 self.assertIn("cannot use a str", str(cm.exception))
1133 with self.assertRaises(TypeError) as cm:
1134 a = array.array(self.typecode, array.array('u', 'foo'))
1135 self.assertIn("cannot use a unicode array", str(cm.exception))
1136 else:
1137 a = array.array(self.typecode, "foo")
1138 a = array.array(self.typecode, array.array('u', 'foo'))
1139
Stefan Krah650c1e82015-02-03 21:43:23 +01001140 @support.cpython_only
1141 def test_obsolete_write_lock(self):
1142 from _testcapi import getbuffer_with_null_view
1143 a = array.array('B', b"")
1144 self.assertRaises(BufferError, getbuffer_with_null_view, a)
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001145
Serhiy Storchakaab0d1982016-03-30 21:11:16 +03001146 def test_free_after_iterating(self):
1147 support.check_free_after_iterating(self, iter, array.array,
1148 (self.typecode,))
1149 support.check_free_after_iterating(self, reversed, array.array,
1150 (self.typecode,))
1151
Walter Dörwald7fd94242003-05-18 00:47:47 +00001152class StringTest(BaseTest):
1153
1154 def test_setitem(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001155 super().test_setitem()
Walter Dörwald7fd94242003-05-18 00:47:47 +00001156 a = array.array(self.typecode, self.example)
1157 self.assertRaises(TypeError, a.__setitem__, 0, self.example[:2])
1158
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001159class UnicodeTest(StringTest, unittest.TestCase):
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001160 typecode = 'u'
1161 example = '\x01\u263a\x00\ufeff'
1162 smallerexample = '\x01\u263a\x00\ufefe'
1163 biggerexample = '\x01\u263a\x01\ufeff'
1164 outside = str('\x33')
Victor Stinner8d4734f2012-08-08 20:09:21 +02001165 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001166
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001167 def test_unicode(self):
1168 self.assertRaises(TypeError, array.array, 'b', 'foo')
Walter Dörwald7fd94242003-05-18 00:47:47 +00001169
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001170 a = array.array('u', '\xa0\xc2\u1234')
1171 a.fromunicode(' ')
1172 a.fromunicode('')
1173 a.fromunicode('')
1174 a.fromunicode('\x11abc\xff\u1234')
1175 s = a.tounicode()
1176 self.assertEqual(s, '\xa0\xc2\u1234 \x11abc\xff\u1234')
Victor Stinner9d512ab2012-08-09 00:43:56 +02001177 self.assertEqual(a.itemsize, sizeof_wchar)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001178
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001179 s = '\x00="\'a\\b\x80\xff\u0000\u0001\u1234'
1180 a = array.array('u', s)
1181 self.assertEqual(
1182 repr(a),
Georg Brandl559e5d72008-06-11 18:37:52 +00001183 "array('u', '\\x00=\"\\'a\\\\b\\x80\xff\\x00\\x01\u1234')")
Walter Dörwald7fd94242003-05-18 00:47:47 +00001184
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001185 self.assertRaises(TypeError, a.fromunicode)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001186
Victor Stinner29ec5952013-02-26 00:27:38 +01001187 def test_issue17223(self):
1188 # this used to crash
Victor Stinnerc472c5d2013-02-26 22:52:11 +01001189 if sizeof_wchar == 4:
1190 # U+FFFFFFFF is an invalid code point in Unicode 6.0
1191 invalid_str = b'\xff\xff\xff\xff'
1192 else:
Victor Stinner29c00342013-03-08 02:33:06 +01001193 # PyUnicode_FromUnicode() cannot fail with 16-bit wchar_t
1194 self.skipTest("specific to 32-bit wchar_t")
Victor Stinnerc472c5d2013-02-26 22:52:11 +01001195 a = array.array('u', invalid_str)
Victor Stinner29ec5952013-02-26 00:27:38 +01001196 self.assertRaises(ValueError, a.tounicode)
1197 self.assertRaises(ValueError, str, a)
1198
Walter Dörwald7fd94242003-05-18 00:47:47 +00001199class NumberTest(BaseTest):
1200
1201 def test_extslice(self):
1202 a = array.array(self.typecode, range(5))
1203 self.assertEqual(a[::], a)
1204 self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
1205 self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
1206 self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
1207 self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
1208 self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
1209 self.assertEqual(a[-100:100:], a)
1210 self.assertEqual(a[100:-100:-1], a[::-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +00001211 self.assertEqual(a[-100:100:2], array.array(self.typecode, [0,2,4]))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001212 self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
1213 self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
1214
1215 def test_delslice(self):
1216 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001217 del a[::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001218 self.assertEqual(a, array.array(self.typecode, [1,3]))
1219 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001220 del a[1::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001221 self.assertEqual(a, array.array(self.typecode, [0,2,4]))
1222 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001223 del a[1::-2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001224 self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
1225 a = array.array(self.typecode, range(10))
Michael W. Hudson56796f62002-07-29 14:35:04 +00001226 del a[::1000]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001227 self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
Mark Dickinsonbc099642010-01-29 17:27:24 +00001228 # test issue7788
1229 a = array.array(self.typecode, range(10))
1230 del a[9::1<<333]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001231
1232 def test_assignment(self):
1233 a = array.array(self.typecode, range(10))
1234 a[::2] = array.array(self.typecode, [42]*5)
1235 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
1236 a = array.array(self.typecode, range(10))
1237 a[::-4] = array.array(self.typecode, [10]*3)
1238 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
1239 a = array.array(self.typecode, range(4))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001240 a[::-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +00001241 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
1242 a = array.array(self.typecode, range(10))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001243 b = a[:]
1244 c = a[:]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001245 ins = array.array(self.typecode, range(2))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001246 a[2:3] = ins
1247 b[slice(2,3)] = ins
1248 c[2:3:] = ins
Fred Drake004d5e62000-10-23 17:22:08 +00001249
Walter Dörwald7fd94242003-05-18 00:47:47 +00001250 def test_iterationcontains(self):
1251 a = array.array(self.typecode, range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +00001252 self.assertEqual(list(a), list(range(10)))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001253 b = array.array(self.typecode, [20])
1254 self.assertEqual(a[-1] in a, True)
1255 self.assertEqual(b[0] not in a, True)
1256
1257 def check_overflow(self, lower, upper):
1258 # method to be used by subclasses
1259
1260 # should not overflow assigning lower limit
1261 a = array.array(self.typecode, [lower])
1262 a[0] = lower
1263 # should overflow assigning less than lower limit
1264 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
1265 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
1266 # should not overflow assigning upper limit
1267 a = array.array(self.typecode, [upper])
1268 a[0] = upper
1269 # should overflow assigning more than upper limit
1270 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
1271 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
1272
1273 def test_subclassing(self):
1274 typecode = self.typecode
1275 class ExaggeratingArray(array.array):
1276 __slots__ = ['offset']
1277
1278 def __new__(cls, typecode, data, offset):
1279 return array.array.__new__(cls, typecode, data)
1280
1281 def __init__(self, typecode, data, offset):
1282 self.offset = offset
1283
1284 def __getitem__(self, i):
1285 return array.array.__getitem__(self, i) + self.offset
1286
1287 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
1288 self.assertEntryEqual(a[0], 7)
1289
1290 self.assertRaises(AttributeError, setattr, a, "color", "blue")
1291
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00001292 def test_frombytearray(self):
1293 a = array.array('b', range(10))
1294 b = array.array(self.typecode, a)
1295 self.assertEqual(a, b)
1296
orenmn964281a2017-03-09 11:35:28 +02001297class IntegerNumberTest(NumberTest):
1298 def test_type_error(self):
1299 a = array.array(self.typecode)
1300 a.append(42)
1301 with self.assertRaises(TypeError):
1302 a.append(42.0)
1303 with self.assertRaises(TypeError):
1304 a[0] = 42.0
1305
1306class Intable:
1307 def __init__(self, num):
1308 self._num = num
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +02001309 def __index__(self):
1310 return self._num
orenmn964281a2017-03-09 11:35:28 +02001311 def __int__(self):
1312 return self._num
1313 def __sub__(self, other):
1314 return Intable(int(self) - int(other))
1315 def __add__(self, other):
1316 return Intable(int(self) + int(other))
1317
1318class SignedNumberTest(IntegerNumberTest):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001319 example = [-1, 0, 1, 42, 0x7f]
1320 smallerexample = [-1, 0, 1, 42, 0x7e]
1321 biggerexample = [-1, 0, 1, 43, 0x7f]
1322 outside = 23
1323
1324 def test_overflow(self):
1325 a = array.array(self.typecode)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001326 lower = -1 * int(pow(2, a.itemsize * 8 - 1))
1327 upper = int(pow(2, a.itemsize * 8 - 1)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001328 self.check_overflow(lower, upper)
orenmn964281a2017-03-09 11:35:28 +02001329 self.check_overflow(Intable(lower), Intable(upper))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001330
orenmn964281a2017-03-09 11:35:28 +02001331class UnsignedNumberTest(IntegerNumberTest):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001332 example = [0, 1, 17, 23, 42, 0xff]
1333 smallerexample = [0, 1, 17, 23, 42, 0xfe]
1334 biggerexample = [0, 1, 17, 23, 43, 0xff]
1335 outside = 0xaa
1336
1337 def test_overflow(self):
1338 a = array.array(self.typecode)
1339 lower = 0
Guido van Rossume2a383d2007-01-15 16:59:06 +00001340 upper = int(pow(2, a.itemsize * 8)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001341 self.check_overflow(lower, upper)
orenmn964281a2017-03-09 11:35:28 +02001342 self.check_overflow(Intable(lower), Intable(upper))
Fred Drake004d5e62000-10-23 17:22:08 +00001343
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001344 def test_bytes_extend(self):
1345 s = bytes(self.example)
1346
1347 a = array.array(self.typecode, self.example)
1348 a.extend(s)
1349 self.assertEqual(
1350 a,
1351 array.array(self.typecode, self.example+self.example)
1352 )
1353
1354 a = array.array(self.typecode, self.example)
1355 a.extend(bytearray(reversed(s)))
1356 self.assertEqual(
1357 a,
1358 array.array(self.typecode, self.example+self.example[::-1])
1359 )
1360
Fred Drake004d5e62000-10-23 17:22:08 +00001361
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001362class ByteTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001363 typecode = 'b'
1364 minitemsize = 1
Fred Drake004d5e62000-10-23 17:22:08 +00001365
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001366class UnsignedByteTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001367 typecode = 'B'
1368 minitemsize = 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001369
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001370class ShortTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001371 typecode = 'h'
1372 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001373
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001374class UnsignedShortTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001375 typecode = 'H'
1376 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001377
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001378class IntTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001379 typecode = 'i'
1380 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001381
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001382class UnsignedIntTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001383 typecode = 'I'
1384 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001385
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001386class LongTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001387 typecode = 'l'
1388 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001389
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001390class UnsignedLongTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001391 typecode = 'L'
1392 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001393
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001394class LongLongTest(SignedNumberTest, unittest.TestCase):
Meador Inge1c9f0c92011-09-20 19:55:51 -05001395 typecode = 'q'
1396 minitemsize = 8
Meador Inge1c9f0c92011-09-20 19:55:51 -05001397
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001398class UnsignedLongLongTest(UnsignedNumberTest, unittest.TestCase):
Meador Inge1c9f0c92011-09-20 19:55:51 -05001399 typecode = 'Q'
1400 minitemsize = 8
Meador Inge1c9f0c92011-09-20 19:55:51 -05001401
Walter Dörwald7fd94242003-05-18 00:47:47 +00001402class FPTest(NumberTest):
1403 example = [-42.0, 0, 42, 1e5, -1e10]
1404 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
1405 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
1406 outside = 23
1407
1408 def assertEntryEqual(self, entry1, entry2):
1409 self.assertAlmostEqual(entry1, entry2)
1410
Adrian Wielgosik7c17e232017-08-17 12:46:06 +00001411 def test_nan(self):
1412 a = array.array(self.typecode, [float('nan')])
1413 b = array.array(self.typecode, [float('nan')])
1414 self.assertIs(a != b, True)
1415 self.assertIs(a == b, False)
1416 self.assertIs(a > b, False)
1417 self.assertIs(a >= b, False)
1418 self.assertIs(a < b, False)
1419 self.assertIs(a <= b, False)
1420
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001421 def test_byteswap(self):
1422 a = array.array(self.typecode, self.example)
1423 self.assertRaises(TypeError, a.byteswap, 42)
1424 if a.itemsize in (1, 2, 4, 8):
1425 b = array.array(self.typecode, self.example)
1426 b.byteswap()
1427 if a.itemsize==1:
1428 self.assertEqual(a, b)
1429 else:
1430 # On alphas treating the byte swapped bit patters as
1431 # floats/doubles results in floating point exceptions
1432 # => compare the 8bit string values instead
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001433 self.assertNotEqual(a.tobytes(), b.tobytes())
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001434 b.byteswap()
1435 self.assertEqual(a, b)
1436
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001437class FloatTest(FPTest, unittest.TestCase):
Neal Norwitz35c6cd02003-05-22 13:29:15 +00001438 typecode = 'f'
1439 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001440
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001441class DoubleTest(FPTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001442 typecode = 'd'
1443 minitemsize = 8
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001444
1445 def test_alloc_overflow(self):
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001446 from sys import maxsize
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001447 a = array.array('d', [-1]*65536)
1448 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001449 a *= maxsize//65536 + 1
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001450 except MemoryError:
1451 pass
1452 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001453 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001454 b = array.array('d', [ 2.71828183, 3.14159265, -1])
1455 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001456 b * (maxsize//3 + 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
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001462
sthaa3ecb82019-03-20 20:49:39 +01001463class LargeArrayTest(unittest.TestCase):
1464 typecode = 'b'
1465
1466 def example(self, size):
1467 # We assess a base memuse of <=2.125 for constructing this array
1468 base = array.array(self.typecode, [0, 1, 2, 3, 4, 5, 6, 7]) * (size // 8)
1469 base += array.array(self.typecode, [99]*(size % 8) + [8, 9, 10, 11])
1470 return base
1471
1472 @support.bigmemtest(_2G, memuse=2.125)
1473 def test_example_data(self, size):
1474 example = self.example(size)
1475 self.assertEqual(len(example), size+4)
1476
1477 @support.bigmemtest(_2G, memuse=2.125)
1478 def test_access(self, size):
1479 example = self.example(size)
1480 self.assertEqual(example[0], 0)
1481 self.assertEqual(example[-(size+4)], 0)
1482 self.assertEqual(example[size], 8)
1483 self.assertEqual(example[-4], 8)
1484 self.assertEqual(example[size+3], 11)
1485 self.assertEqual(example[-1], 11)
1486
1487 @support.bigmemtest(_2G, memuse=2.125+1)
1488 def test_slice(self, size):
1489 example = self.example(size)
1490 self.assertEqual(list(example[:4]), [0, 1, 2, 3])
1491 self.assertEqual(list(example[-4:]), [8, 9, 10, 11])
1492 part = example[1:-1]
1493 self.assertEqual(len(part), size+2)
1494 self.assertEqual(part[0], 1)
1495 self.assertEqual(part[-1], 10)
1496 del part
1497 part = example[::2]
1498 self.assertEqual(len(part), (size+5)//2)
1499 self.assertEqual(list(part[:4]), [0, 2, 4, 6])
1500 if size % 2:
1501 self.assertEqual(list(part[-2:]), [9, 11])
1502 else:
1503 self.assertEqual(list(part[-2:]), [8, 10])
1504
1505 @support.bigmemtest(_2G, memuse=2.125)
1506 def test_count(self, size):
1507 example = self.example(size)
1508 self.assertEqual(example.count(0), size//8)
1509 self.assertEqual(example.count(11), 1)
1510
1511 @support.bigmemtest(_2G, memuse=2.125)
1512 def test_append(self, size):
1513 example = self.example(size)
1514 example.append(12)
1515 self.assertEqual(example[-1], 12)
1516
1517 @support.bigmemtest(_2G, memuse=2.125)
1518 def test_extend(self, size):
1519 example = self.example(size)
1520 example.extend(iter([12, 13, 14, 15]))
1521 self.assertEqual(len(example), size+8)
1522 self.assertEqual(list(example[-8:]), [8, 9, 10, 11, 12, 13, 14, 15])
1523
1524 @support.bigmemtest(_2G, memuse=2.125)
1525 def test_frombytes(self, size):
1526 example = self.example(size)
1527 example.frombytes(b'abcd')
1528 self.assertEqual(len(example), size+8)
1529 self.assertEqual(list(example[-8:]), [8, 9, 10, 11] + list(b'abcd'))
1530
1531 @support.bigmemtest(_2G, memuse=2.125)
1532 def test_fromlist(self, size):
1533 example = self.example(size)
1534 example.fromlist([12, 13, 14, 15])
1535 self.assertEqual(len(example), size+8)
1536 self.assertEqual(list(example[-8:]), [8, 9, 10, 11, 12, 13, 14, 15])
1537
1538 @support.bigmemtest(_2G, memuse=2.125)
1539 def test_index(self, size):
1540 example = self.example(size)
1541 self.assertEqual(example.index(0), 0)
1542 self.assertEqual(example.index(1), 1)
1543 self.assertEqual(example.index(7), 7)
1544 self.assertEqual(example.index(11), size+3)
1545
1546 @support.bigmemtest(_2G, memuse=2.125)
1547 def test_insert(self, size):
1548 example = self.example(size)
1549 example.insert(0, 12)
1550 example.insert(10, 13)
1551 example.insert(size+1, 14)
1552 self.assertEqual(len(example), size+7)
1553 self.assertEqual(example[0], 12)
1554 self.assertEqual(example[10], 13)
1555 self.assertEqual(example[size+1], 14)
1556
1557 @support.bigmemtest(_2G, memuse=2.125)
1558 def test_pop(self, size):
1559 example = self.example(size)
1560 self.assertEqual(example.pop(0), 0)
1561 self.assertEqual(example[0], 1)
1562 self.assertEqual(example.pop(size+1), 10)
1563 self.assertEqual(example[size+1], 11)
1564 self.assertEqual(example.pop(1), 2)
1565 self.assertEqual(example[1], 3)
1566 self.assertEqual(len(example), size+1)
1567 self.assertEqual(example.pop(), 11)
1568 self.assertEqual(len(example), size)
1569
1570 @support.bigmemtest(_2G, memuse=2.125)
1571 def test_remove(self, size):
1572 example = self.example(size)
1573 example.remove(0)
1574 self.assertEqual(len(example), size+3)
1575 self.assertEqual(example[0], 1)
1576 example.remove(10)
1577 self.assertEqual(len(example), size+2)
1578 self.assertEqual(example[size], 9)
1579 self.assertEqual(example[size+1], 11)
1580
1581 @support.bigmemtest(_2G, memuse=2.125)
1582 def test_reverse(self, size):
1583 example = self.example(size)
1584 example.reverse()
1585 self.assertEqual(len(example), size+4)
1586 self.assertEqual(example[0], 11)
1587 self.assertEqual(example[3], 8)
1588 self.assertEqual(example[-1], 0)
1589 example.reverse()
1590 self.assertEqual(len(example), size+4)
1591 self.assertEqual(list(example[:4]), [0, 1, 2, 3])
1592 self.assertEqual(list(example[-4:]), [8, 9, 10, 11])
1593
1594 # list takes about 9 bytes per element
1595 @support.bigmemtest(_2G, memuse=2.125+9)
1596 def test_tolist(self, size):
1597 example = self.example(size)
1598 ls = example.tolist()
1599 self.assertEqual(len(ls), len(example))
1600 self.assertEqual(ls[:8], list(example[:8]))
1601 self.assertEqual(ls[-8:], list(example[-8:]))
1602
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001603if __name__ == "__main__":
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001604 unittest.main()