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