blob: f731b70415e7f66bf51834ee97e333db6e5dc6c6 [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
Walter Dörwald7fd94242003-05-18 00:47:47 +00005import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00006from test import support
sthaa3ecb82019-03-20 20:49:39 +01007from test.support import _2G
Alexandre Vassalottiad077152009-07-15 17:49:23 +00008import weakref
9import pickle
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +000010import operator
Alexandre Vassalottiad077152009-07-15 17:49:23 +000011import struct
Serhiy Storchaka43767632013-11-03 21:31:38 +020012import sys
Alexandre Vassalottiad077152009-07-15 17:49:23 +000013
14import array
15from array import _array_reconstructor as array_reconstructor
16
Victor Stinner29c00342013-03-08 02:33:06 +010017sizeof_wchar = array.array('u').itemsize
Victor Stinnerc472c5d2013-02-26 22:52:11 +010018
19
Raymond Hettingerb0900e62004-12-16 16:23:40 +000020class ArraySubclass(array.array):
21 pass
Guido van Rossumc9f8f141997-04-09 20:51:54 +000022
Thomas Woutersb2137042007-02-01 18:02:27 +000023class ArraySubclassWithKwargs(array.array):
24 def __init__(self, typecode, newarg=None):
Victor Stinner7a6a0092011-01-04 00:04:44 +000025 array.array.__init__(self)
Thomas Woutersb2137042007-02-01 18:02:27 +000026
orenmn964281a2017-03-09 11:35:28 +020027typecodes = 'ubBhHiIlLfdqQ'
Martin v. Löwis99866332002-03-01 10:27:01 +000028
Martin Panterbe8da9c2016-09-07 11:04:41 +000029class MiscTest(unittest.TestCase):
Martin v. Löwis99866332002-03-01 10:27:01 +000030
Martin Panterbe8da9c2016-09-07 11:04:41 +000031 def test_bad_constructor(self):
Walter Dörwald7fd94242003-05-18 00:47:47 +000032 self.assertRaises(TypeError, array.array)
33 self.assertRaises(TypeError, array.array, spam=42)
34 self.assertRaises(TypeError, array.array, 'xx')
35 self.assertRaises(ValueError, array.array, 'x')
Martin v. Löwis99866332002-03-01 10:27:01 +000036
Martin Panterbe8da9c2016-09-07 11:04:41 +000037 def test_empty(self):
38 # Exercise code for handling zero-length arrays
39 a = array.array('B')
40 a[:] = a
41 self.assertEqual(len(a), 0)
42 self.assertEqual(len(a + a), 0)
43 self.assertEqual(len(a * 3), 0)
44 a += a
45 self.assertEqual(len(a), 0)
46
Martin v. Löwis99866332002-03-01 10:27:01 +000047
Alexandre Vassalottiad077152009-07-15 17:49:23 +000048# Machine format codes.
49#
50# Search for "enum machine_format_code" in Modules/arraymodule.c to get the
51# authoritative values.
52UNKNOWN_FORMAT = -1
53UNSIGNED_INT8 = 0
54SIGNED_INT8 = 1
55UNSIGNED_INT16_LE = 2
56UNSIGNED_INT16_BE = 3
57SIGNED_INT16_LE = 4
58SIGNED_INT16_BE = 5
59UNSIGNED_INT32_LE = 6
60UNSIGNED_INT32_BE = 7
61SIGNED_INT32_LE = 8
62SIGNED_INT32_BE = 9
63UNSIGNED_INT64_LE = 10
64UNSIGNED_INT64_BE = 11
65SIGNED_INT64_LE = 12
66SIGNED_INT64_BE = 13
67IEEE_754_FLOAT_LE = 14
68IEEE_754_FLOAT_BE = 15
69IEEE_754_DOUBLE_LE = 16
70IEEE_754_DOUBLE_BE = 17
71UTF16_LE = 18
72UTF16_BE = 19
73UTF32_LE = 20
74UTF32_BE = 21
75
76class ArrayReconstructorTest(unittest.TestCase):
77
78 def test_error(self):
79 self.assertRaises(TypeError, array_reconstructor,
80 "", "b", 0, b"")
81 self.assertRaises(TypeError, array_reconstructor,
82 str, "b", 0, b"")
83 self.assertRaises(TypeError, array_reconstructor,
84 array.array, "b", '', b"")
85 self.assertRaises(TypeError, array_reconstructor,
86 array.array, "b", 0, "")
87 self.assertRaises(ValueError, array_reconstructor,
88 array.array, "?", 0, b"")
89 self.assertRaises(ValueError, array_reconstructor,
90 array.array, "b", UNKNOWN_FORMAT, b"")
91 self.assertRaises(ValueError, array_reconstructor,
92 array.array, "b", 22, b"")
93 self.assertRaises(ValueError, array_reconstructor,
94 array.array, "d", 16, b"a")
95
96 def test_numbers(self):
97 testcases = (
98 (['B', 'H', 'I', 'L'], UNSIGNED_INT8, '=BBBB',
99 [0x80, 0x7f, 0, 0xff]),
100 (['b', 'h', 'i', 'l'], SIGNED_INT8, '=bbb',
101 [-0x80, 0x7f, 0]),
102 (['H', 'I', 'L'], UNSIGNED_INT16_LE, '<HHHH',
103 [0x8000, 0x7fff, 0, 0xffff]),
104 (['H', 'I', 'L'], UNSIGNED_INT16_BE, '>HHHH',
105 [0x8000, 0x7fff, 0, 0xffff]),
106 (['h', 'i', 'l'], SIGNED_INT16_LE, '<hhh',
107 [-0x8000, 0x7fff, 0]),
108 (['h', 'i', 'l'], SIGNED_INT16_BE, '>hhh',
109 [-0x8000, 0x7fff, 0]),
110 (['I', 'L'], UNSIGNED_INT32_LE, '<IIII',
111 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
112 (['I', 'L'], UNSIGNED_INT32_BE, '>IIII',
113 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
114 (['i', 'l'], SIGNED_INT32_LE, '<iii',
115 [-1<<31, (1<<31)-1, 0]),
116 (['i', 'l'], SIGNED_INT32_BE, '>iii',
117 [-1<<31, (1<<31)-1, 0]),
118 (['L'], UNSIGNED_INT64_LE, '<QQQQ',
Alexandre Vassalotti0027d4b2009-07-15 20:53:55 +0000119 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
120 (['L'], UNSIGNED_INT64_BE, '>QQQQ',
121 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
122 (['l'], SIGNED_INT64_LE, '<qqq',
123 [-1<<31, (1<<31)-1, 0]),
124 (['l'], SIGNED_INT64_BE, '>qqq',
125 [-1<<31, (1<<31)-1, 0]),
126 # The following tests for INT64 will raise an OverflowError
127 # when run on a 32-bit machine. The tests are simply skipped
128 # in that case.
129 (['L'], UNSIGNED_INT64_LE, '<QQQQ',
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000130 [1<<63, (1<<63)-1, 0, (1<<64)-1]),
131 (['L'], UNSIGNED_INT64_BE, '>QQQQ',
132 [1<<63, (1<<63)-1, 0, (1<<64)-1]),
133 (['l'], SIGNED_INT64_LE, '<qqq',
134 [-1<<63, (1<<63)-1, 0]),
135 (['l'], SIGNED_INT64_BE, '>qqq',
136 [-1<<63, (1<<63)-1, 0]),
137 (['f'], IEEE_754_FLOAT_LE, '<ffff',
138 [16711938.0, float('inf'), float('-inf'), -0.0]),
139 (['f'], IEEE_754_FLOAT_BE, '>ffff',
140 [16711938.0, float('inf'), float('-inf'), -0.0]),
141 (['d'], IEEE_754_DOUBLE_LE, '<dddd',
142 [9006104071832581.0, float('inf'), float('-inf'), -0.0]),
143 (['d'], IEEE_754_DOUBLE_BE, '>dddd',
144 [9006104071832581.0, float('inf'), float('-inf'), -0.0])
145 )
146 for testcase in testcases:
147 valid_typecodes, mformat_code, struct_fmt, values = testcase
148 arraystr = struct.pack(struct_fmt, *values)
149 for typecode in valid_typecodes:
Alexandre Vassalotti0027d4b2009-07-15 20:53:55 +0000150 try:
151 a = array.array(typecode, values)
152 except OverflowError:
153 continue # Skip this test case.
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000154 b = array_reconstructor(
155 array.array, typecode, mformat_code, arraystr)
156 self.assertEqual(a, b,
157 msg="{0!r} != {1!r}; testcase={2!r}".format(a, b, testcase))
158
159 def test_unicode(self):
160 teststr = "Bonne Journ\xe9e \U0002030a\U00020347"
161 testcases = (
162 (UTF16_LE, "UTF-16-LE"),
163 (UTF16_BE, "UTF-16-BE"),
164 (UTF32_LE, "UTF-32-LE"),
165 (UTF32_BE, "UTF-32-BE")
166 )
167 for testcase in testcases:
168 mformat_code, encoding = testcase
169 a = array.array('u', teststr)
170 b = array_reconstructor(
171 array.array, 'u', mformat_code, teststr.encode(encoding))
172 self.assertEqual(a, b,
173 msg="{0!r} != {1!r}; testcase={2!r}".format(a, b, testcase))
174
175
Ezio Melotti1d3e96d2013-01-10 06:04:50 +0200176class BaseTest:
Walter Dörwald7fd94242003-05-18 00:47:47 +0000177 # Required class attributes (provided by subclasses
178 # typecode: the typecode to test
179 # example: an initializer usable in the constructor for this type
180 # smallerexample: the same length as example, but smaller
181 # biggerexample: the same length as example, but bigger
182 # outside: An entry that is not in example
183 # minitemsize: the minimum guaranteed itemsize
Martin v. Löwis99866332002-03-01 10:27:01 +0000184
Walter Dörwald7fd94242003-05-18 00:47:47 +0000185 def assertEntryEqual(self, entry1, entry2):
186 self.assertEqual(entry1, entry2)
Martin v. Löwis99866332002-03-01 10:27:01 +0000187
Walter Dörwald7fd94242003-05-18 00:47:47 +0000188 def badtypecode(self):
189 # Return a typecode that is different from our own
190 return typecodes[(typecodes.index(self.typecode)+1) % len(typecodes)]
Martin v. Löwis99866332002-03-01 10:27:01 +0000191
Walter Dörwald7fd94242003-05-18 00:47:47 +0000192 def test_constructor(self):
193 a = array.array(self.typecode)
194 self.assertEqual(a.typecode, self.typecode)
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200195 self.assertGreaterEqual(a.itemsize, self.minitemsize)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000196 self.assertRaises(TypeError, array.array, self.typecode, None)
Martin v. Löwis99866332002-03-01 10:27:01 +0000197
Walter Dörwald7fd94242003-05-18 00:47:47 +0000198 def test_len(self):
199 a = array.array(self.typecode)
200 a.append(self.example[0])
201 self.assertEqual(len(a), 1)
Martin v. Löwis99866332002-03-01 10:27:01 +0000202
Walter Dörwald7fd94242003-05-18 00:47:47 +0000203 a = array.array(self.typecode, self.example)
204 self.assertEqual(len(a), len(self.example))
Martin v. Löwis99866332002-03-01 10:27:01 +0000205
Walter Dörwald7fd94242003-05-18 00:47:47 +0000206 def test_buffer_info(self):
207 a = array.array(self.typecode, self.example)
208 self.assertRaises(TypeError, a.buffer_info, 42)
209 bi = a.buffer_info()
Ezio Melottie9615932010-01-24 19:26:24 +0000210 self.assertIsInstance(bi, tuple)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000211 self.assertEqual(len(bi), 2)
Ezio Melottie9615932010-01-24 19:26:24 +0000212 self.assertIsInstance(bi[0], int)
213 self.assertIsInstance(bi[1], int)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000214 self.assertEqual(bi[1], len(a))
Martin v. Löwis99866332002-03-01 10:27:01 +0000215
Walter Dörwald7fd94242003-05-18 00:47:47 +0000216 def test_byteswap(self):
Victor Stinner8dba4e02011-09-30 00:51:10 +0200217 if self.typecode == 'u':
218 example = '\U00100100'
219 else:
220 example = self.example
221 a = array.array(self.typecode, example)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000222 self.assertRaises(TypeError, a.byteswap, 42)
223 if a.itemsize in (1, 2, 4, 8):
Victor Stinner8dba4e02011-09-30 00:51:10 +0200224 b = array.array(self.typecode, example)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000225 b.byteswap()
226 if a.itemsize==1:
227 self.assertEqual(a, b)
228 else:
229 self.assertNotEqual(a, b)
230 b.byteswap()
231 self.assertEqual(a, b)
Martin v. Löwis99866332002-03-01 10:27:01 +0000232
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000233 def test_copy(self):
234 import copy
235 a = array.array(self.typecode, self.example)
236 b = copy.copy(a)
237 self.assertNotEqual(id(a), id(b))
238 self.assertEqual(a, b)
239
Thomas Wouters89f507f2006-12-13 04:49:30 +0000240 def test_deepcopy(self):
241 import copy
242 a = array.array(self.typecode, self.example)
243 b = copy.deepcopy(a)
244 self.assertNotEqual(id(a), id(b))
245 self.assertEqual(a, b)
246
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000247 def test_reduce_ex(self):
248 a = array.array(self.typecode, self.example)
249 for protocol in range(3):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000250 self.assertIs(a.__reduce_ex__(protocol)[0], array.array)
Zackery Spytzd1cbc6f2018-11-26 22:40:49 -0700251 for protocol in range(3, pickle.HIGHEST_PROTOCOL + 1):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000252 self.assertIs(a.__reduce_ex__(protocol)[0], array_reconstructor)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000253
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000254 def test_pickle(self):
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000255 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000256 a = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000257 b = pickle.loads(pickle.dumps(a, protocol))
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000258 self.assertNotEqual(id(a), id(b))
259 self.assertEqual(a, b)
260
261 a = ArraySubclass(self.typecode, self.example)
262 a.x = 10
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 self.assertEqual(a.x, b.x)
267 self.assertEqual(type(a), type(b))
268
Guido van Rossumd8faa362007-04-27 19:54:29 +0000269 def test_pickle_for_empty_array(self):
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000270 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossumd8faa362007-04-27 19:54:29 +0000271 a = array.array(self.typecode)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000272 b = pickle.loads(pickle.dumps(a, protocol))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000273 self.assertNotEqual(id(a), id(b))
274 self.assertEqual(a, b)
275
276 a = ArraySubclass(self.typecode)
277 a.x = 10
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 self.assertEqual(a.x, b.x)
282 self.assertEqual(type(a), type(b))
283
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000284 def test_iterator_pickle(self):
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200285 orig = array.array(self.typecode, self.example)
286 data = list(orig)
287 data2 = data[::-1]
Serhiy Storchakabad12572014-12-15 14:03:42 +0200288 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200289 # initial iterator
290 itorig = iter(orig)
291 d = pickle.dumps((itorig, orig), proto)
292 it, a = pickle.loads(d)
293 a.fromlist(data2)
294 self.assertEqual(type(it), type(itorig))
295 self.assertEqual(list(it), data + data2)
Serhiy Storchakabad12572014-12-15 14:03:42 +0200296
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200297 # running iterator
298 next(itorig)
299 d = pickle.dumps((itorig, orig), proto)
300 it, a = pickle.loads(d)
301 a.fromlist(data2)
302 self.assertEqual(type(it), type(itorig))
303 self.assertEqual(list(it), data[1:] + data2)
304
305 # empty iterator
306 for i in range(1, len(data)):
307 next(itorig)
308 d = pickle.dumps((itorig, orig), proto)
309 it, a = pickle.loads(d)
310 a.fromlist(data2)
311 self.assertEqual(type(it), type(itorig))
312 self.assertEqual(list(it), data2)
313
314 # exhausted iterator
315 self.assertRaises(StopIteration, next, itorig)
316 d = pickle.dumps((itorig, orig), proto)
317 it, a = pickle.loads(d)
318 a.fromlist(data2)
Serhiy Storchakaab0d1982016-03-30 21:11:16 +0300319 self.assertEqual(list(it), [])
320
321 def test_exhausted_iterator(self):
322 a = array.array(self.typecode, self.example)
323 self.assertEqual(list(a), list(self.example))
324 exhit = iter(a)
325 empit = iter(a)
326 for x in exhit: # exhaust the iterator
327 next(empit) # not exhausted
328 a.append(self.outside)
329 self.assertEqual(list(exhit), [])
330 self.assertEqual(list(empit), [self.outside])
331 self.assertEqual(list(a), list(self.example) + [self.outside])
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000332
Walter Dörwald7fd94242003-05-18 00:47:47 +0000333 def test_insert(self):
334 a = array.array(self.typecode, self.example)
335 a.insert(0, self.example[0])
336 self.assertEqual(len(a), 1+len(self.example))
337 self.assertEqual(a[0], a[1])
338 self.assertRaises(TypeError, a.insert)
339 self.assertRaises(TypeError, a.insert, None)
Walter Dörwaldba39d9c2003-05-18 01:56:25 +0000340 self.assertRaises(TypeError, a.insert, 0, None)
Martin v. Löwis99866332002-03-01 10:27:01 +0000341
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000342 a = array.array(self.typecode, self.example)
343 a.insert(-1, self.example[0])
344 self.assertEqual(
345 a,
346 array.array(
347 self.typecode,
348 self.example[:-1] + self.example[:1] + self.example[-1:]
349 )
350 )
351
352 a = array.array(self.typecode, self.example)
353 a.insert(-1000, self.example[0])
354 self.assertEqual(
355 a,
356 array.array(self.typecode, self.example[:1] + self.example)
357 )
358
359 a = array.array(self.typecode, self.example)
360 a.insert(1000, self.example[0])
361 self.assertEqual(
362 a,
363 array.array(self.typecode, self.example + self.example[:1])
364 )
365
Walter Dörwald7fd94242003-05-18 00:47:47 +0000366 def test_tofromfile(self):
367 a = array.array(self.typecode, 2*self.example)
368 self.assertRaises(TypeError, a.tofile)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000369 support.unlink(support.TESTFN)
370 f = open(support.TESTFN, 'wb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000371 try:
372 a.tofile(f)
373 f.close()
374 b = array.array(self.typecode)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000375 f = open(support.TESTFN, 'rb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000376 self.assertRaises(TypeError, b.fromfile)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000377 b.fromfile(f, len(self.example))
378 self.assertEqual(b, array.array(self.typecode, self.example))
379 self.assertNotEqual(a, b)
Hirokazu Yamamoto54d0df62009-03-06 03:04:07 +0000380 self.assertRaises(EOFError, b.fromfile, f, len(self.example)+1)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000381 self.assertEqual(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000382 f.close()
383 finally:
384 if not f.closed:
385 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000386 support.unlink(support.TESTFN)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000387
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000388 def test_fromfile_ioerror(self):
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200389 # Issue #5395: Check if fromfile raises a proper OSError
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000390 # instead of EOFError.
391 a = array.array(self.typecode)
392 f = open(support.TESTFN, 'wb')
393 try:
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200394 self.assertRaises(OSError, a.fromfile, f, len(self.example))
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000395 finally:
396 f.close()
397 support.unlink(support.TESTFN)
398
Frank Wierzbicki17683432009-08-16 20:30:12 +0000399 def test_filewrite(self):
400 a = array.array(self.typecode, 2*self.example)
401 f = open(support.TESTFN, 'wb')
402 try:
403 f.write(a)
404 f.close()
405 b = array.array(self.typecode)
406 f = open(support.TESTFN, 'rb')
407 b.fromfile(f, len(self.example))
408 self.assertEqual(b, array.array(self.typecode, self.example))
409 self.assertNotEqual(a, b)
410 b.fromfile(f, len(self.example))
411 self.assertEqual(a, b)
412 f.close()
413 finally:
414 if not f.closed:
415 f.close()
416 support.unlink(support.TESTFN)
417
Walter Dörwald7fd94242003-05-18 00:47:47 +0000418 def test_tofromlist(self):
419 a = array.array(self.typecode, 2*self.example)
420 b = array.array(self.typecode)
421 self.assertRaises(TypeError, a.tolist, 42)
422 self.assertRaises(TypeError, b.fromlist)
423 self.assertRaises(TypeError, b.fromlist, 42)
424 self.assertRaises(TypeError, b.fromlist, [None])
425 b.fromlist(a.tolist())
426 self.assertEqual(a, b)
Fred Drake78334472000-06-28 17:50:51 +0000427
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000428 def test_tofrombytes(self):
Walter Dörwald7fd94242003-05-18 00:47:47 +0000429 a = array.array(self.typecode, 2*self.example)
430 b = array.array(self.typecode)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000431 self.assertRaises(TypeError, a.tobytes, 42)
432 self.assertRaises(TypeError, b.frombytes)
433 self.assertRaises(TypeError, b.frombytes, 42)
434 b.frombytes(a.tobytes())
435 c = array.array(self.typecode, bytearray(a.tobytes()))
Walter Dörwald7fd94242003-05-18 00:47:47 +0000436 self.assertEqual(a, b)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000437 self.assertEqual(a, c)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000438 if a.itemsize>1:
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000439 self.assertRaises(ValueError, b.frombytes, b"x")
Fred Drake78334472000-06-28 17:50:51 +0000440
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +0000441 def test_fromarray(self):
442 a = array.array(self.typecode, self.example)
443 b = array.array(self.typecode, a)
444 self.assertEqual(a, b)
445
Walter Dörwald7fd94242003-05-18 00:47:47 +0000446 def test_repr(self):
447 a = array.array(self.typecode, 2*self.example)
448 self.assertEqual(a, eval(repr(a), {"array": array.array}))
Fred Drake78334472000-06-28 17:50:51 +0000449
Walter Dörwald7fd94242003-05-18 00:47:47 +0000450 a = array.array(self.typecode)
451 self.assertEqual(repr(a), "array('%s')" % self.typecode)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000452
Walter Dörwald7fd94242003-05-18 00:47:47 +0000453 def test_str(self):
454 a = array.array(self.typecode, 2*self.example)
455 str(a)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000456
Walter Dörwald7fd94242003-05-18 00:47:47 +0000457 def test_cmp(self):
458 a = array.array(self.typecode, self.example)
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200459 self.assertIs(a == 42, False)
460 self.assertIs(a != 42, True)
Tim Peterscc78e472000-11-14 21:36:07 +0000461
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200462 self.assertIs(a == a, True)
463 self.assertIs(a != a, False)
464 self.assertIs(a < a, False)
465 self.assertIs(a <= a, True)
466 self.assertIs(a > a, False)
467 self.assertIs(a >= a, True)
Tim Peterscc78e472000-11-14 21:36:07 +0000468
Neal Norwitzbd2835c2006-03-17 08:54:15 +0000469 al = array.array(self.typecode, self.smallerexample)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000470 ab = array.array(self.typecode, self.biggerexample)
Guido van Rossum7f1d3aa1998-07-16 15:31:43 +0000471
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200472 self.assertIs(a == 2*a, False)
473 self.assertIs(a != 2*a, True)
474 self.assertIs(a < 2*a, True)
475 self.assertIs(a <= 2*a, True)
476 self.assertIs(a > 2*a, False)
477 self.assertIs(a >= 2*a, False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000478
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200479 self.assertIs(a == al, False)
480 self.assertIs(a != al, True)
481 self.assertIs(a < al, False)
482 self.assertIs(a <= al, False)
483 self.assertIs(a > al, True)
484 self.assertIs(a >= al, True)
Martin v. Löwis99866332002-03-01 10:27:01 +0000485
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200486 self.assertIs(a == ab, False)
487 self.assertIs(a != ab, True)
488 self.assertIs(a < ab, True)
489 self.assertIs(a <= ab, True)
490 self.assertIs(a > ab, False)
491 self.assertIs(a >= ab, False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000492
Walter Dörwald7fd94242003-05-18 00:47:47 +0000493 def test_add(self):
494 a = array.array(self.typecode, self.example) \
495 + array.array(self.typecode, self.example[::-1])
496 self.assertEqual(
497 a,
498 array.array(self.typecode, self.example + self.example[::-1])
499 )
Martin v. Löwis99866332002-03-01 10:27:01 +0000500
Walter Dörwald7fd94242003-05-18 00:47:47 +0000501 b = array.array(self.badtypecode())
502 self.assertRaises(TypeError, a.__add__, b)
503
504 self.assertRaises(TypeError, a.__add__, "bad")
505
506 def test_iadd(self):
507 a = array.array(self.typecode, self.example[::-1])
508 b = a
509 a += array.array(self.typecode, 2*self.example)
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200510 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000511 self.assertEqual(
512 a,
513 array.array(self.typecode, self.example[::-1]+2*self.example)
514 )
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000515 a = array.array(self.typecode, self.example)
516 a += a
517 self.assertEqual(
518 a,
519 array.array(self.typecode, self.example + self.example)
520 )
Walter Dörwald7fd94242003-05-18 00:47:47 +0000521
522 b = array.array(self.badtypecode())
523 self.assertRaises(TypeError, a.__add__, b)
524
525 self.assertRaises(TypeError, a.__iadd__, "bad")
526
527 def test_mul(self):
528 a = 5*array.array(self.typecode, self.example)
529 self.assertEqual(
530 a,
531 array.array(self.typecode, 5*self.example)
532 )
533
534 a = array.array(self.typecode, self.example)*5
535 self.assertEqual(
536 a,
537 array.array(self.typecode, self.example*5)
538 )
539
540 a = 0*array.array(self.typecode, self.example)
541 self.assertEqual(
542 a,
543 array.array(self.typecode)
544 )
545
546 a = (-1)*array.array(self.typecode, self.example)
547 self.assertEqual(
548 a,
549 array.array(self.typecode)
550 )
551
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000552 a = 5 * array.array(self.typecode, self.example[:1])
553 self.assertEqual(
554 a,
555 array.array(self.typecode, [a[0]] * 5)
556 )
557
Walter Dörwald7fd94242003-05-18 00:47:47 +0000558 self.assertRaises(TypeError, a.__mul__, "bad")
559
560 def test_imul(self):
561 a = array.array(self.typecode, self.example)
562 b = a
563
564 a *= 5
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200565 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000566 self.assertEqual(
567 a,
568 array.array(self.typecode, 5*self.example)
569 )
570
571 a *= 0
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200572 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000573 self.assertEqual(a, array.array(self.typecode))
574
575 a *= 1000
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200576 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000577 self.assertEqual(a, array.array(self.typecode))
578
579 a *= -1
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200580 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000581 self.assertEqual(a, array.array(self.typecode))
582
583 a = array.array(self.typecode, self.example)
584 a *= -1
585 self.assertEqual(a, array.array(self.typecode))
586
587 self.assertRaises(TypeError, a.__imul__, "bad")
588
589 def test_getitem(self):
590 a = array.array(self.typecode, self.example)
591 self.assertEntryEqual(a[0], self.example[0])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000592 self.assertEntryEqual(a[0], self.example[0])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000593 self.assertEntryEqual(a[-1], self.example[-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000594 self.assertEntryEqual(a[-1], self.example[-1])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000595 self.assertEntryEqual(a[len(self.example)-1], self.example[-1])
596 self.assertEntryEqual(a[-len(self.example)], self.example[0])
597 self.assertRaises(TypeError, a.__getitem__)
598 self.assertRaises(IndexError, a.__getitem__, len(self.example))
599 self.assertRaises(IndexError, a.__getitem__, -len(self.example)-1)
600
601 def test_setitem(self):
602 a = array.array(self.typecode, self.example)
603 a[0] = a[-1]
604 self.assertEntryEqual(a[0], a[-1])
605
606 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000607 a[0] = a[-1]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000608 self.assertEntryEqual(a[0], a[-1])
609
610 a = array.array(self.typecode, self.example)
611 a[-1] = a[0]
612 self.assertEntryEqual(a[0], a[-1])
613
614 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000615 a[-1] = a[0]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000616 self.assertEntryEqual(a[0], a[-1])
617
618 a = array.array(self.typecode, self.example)
619 a[len(self.example)-1] = a[0]
620 self.assertEntryEqual(a[0], a[-1])
621
622 a = array.array(self.typecode, self.example)
623 a[-len(self.example)] = a[-1]
624 self.assertEntryEqual(a[0], a[-1])
625
626 self.assertRaises(TypeError, a.__setitem__)
627 self.assertRaises(TypeError, a.__setitem__, None)
628 self.assertRaises(TypeError, a.__setitem__, 0, None)
629 self.assertRaises(
630 IndexError,
631 a.__setitem__,
632 len(self.example), self.example[0]
633 )
634 self.assertRaises(
635 IndexError,
636 a.__setitem__,
637 -len(self.example)-1, self.example[0]
638 )
639
640 def test_delitem(self):
641 a = array.array(self.typecode, self.example)
642 del a[0]
643 self.assertEqual(
644 a,
645 array.array(self.typecode, self.example[1:])
646 )
647
648 a = array.array(self.typecode, self.example)
649 del a[-1]
650 self.assertEqual(
651 a,
652 array.array(self.typecode, self.example[:-1])
653 )
654
655 a = array.array(self.typecode, self.example)
656 del a[len(self.example)-1]
657 self.assertEqual(
658 a,
659 array.array(self.typecode, self.example[:-1])
660 )
661
662 a = array.array(self.typecode, self.example)
663 del a[-len(self.example)]
664 self.assertEqual(
665 a,
666 array.array(self.typecode, self.example[1:])
667 )
668
669 self.assertRaises(TypeError, a.__delitem__)
670 self.assertRaises(TypeError, a.__delitem__, None)
671 self.assertRaises(IndexError, a.__delitem__, len(self.example))
672 self.assertRaises(IndexError, a.__delitem__, -len(self.example)-1)
673
674 def test_getslice(self):
675 a = array.array(self.typecode, self.example)
676 self.assertEqual(a[:], a)
677
678 self.assertEqual(
679 a[1:],
680 array.array(self.typecode, self.example[1:])
681 )
682
683 self.assertEqual(
684 a[:1],
685 array.array(self.typecode, self.example[:1])
686 )
687
688 self.assertEqual(
689 a[:-1],
690 array.array(self.typecode, self.example[:-1])
691 )
692
693 self.assertEqual(
694 a[-1:],
695 array.array(self.typecode, self.example[-1:])
696 )
697
698 self.assertEqual(
699 a[-1:-1],
700 array.array(self.typecode)
701 )
702
703 self.assertEqual(
Walter Dörwald1083c242005-01-21 21:16:51 +0000704 a[2:1],
705 array.array(self.typecode)
706 )
707
708 self.assertEqual(
Walter Dörwald7fd94242003-05-18 00:47:47 +0000709 a[1000:],
710 array.array(self.typecode)
711 )
712 self.assertEqual(a[-1000:], a)
713 self.assertEqual(a[:1000], a)
714 self.assertEqual(
715 a[:-1000],
716 array.array(self.typecode)
717 )
718 self.assertEqual(a[-1000:1000], a)
719 self.assertEqual(
720 a[2000:1000],
721 array.array(self.typecode)
722 )
723
Thomas Woutersed03b412007-08-28 21:37:11 +0000724 def test_extended_getslice(self):
725 # Test extended slicing by comparing with list slicing
726 # (Assumes list conversion works correctly, too)
727 a = array.array(self.typecode, self.example)
Zackery Spytz14514d92019-05-17 01:13:03 -0600728 indices = (0, None, 1, 3, 19, 100, sys.maxsize, -1, -2, -31, -100)
Thomas Woutersed03b412007-08-28 21:37:11 +0000729 for start in indices:
730 for stop in indices:
731 # Everything except the initial 0 (invalid step)
732 for step in indices[1:]:
733 self.assertEqual(list(a[start:stop:step]),
734 list(a)[start:stop:step])
735
Walter Dörwald7fd94242003-05-18 00:47:47 +0000736 def test_setslice(self):
737 a = array.array(self.typecode, self.example)
738 a[:1] = a
739 self.assertEqual(
740 a,
741 array.array(self.typecode, self.example + self.example[1:])
742 )
743
744 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000745 a[:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000746 self.assertEqual(
747 a,
748 array.array(self.typecode, self.example + self.example[-1:])
749 )
750
751 a = array.array(self.typecode, self.example)
752 a[-1:] = a
753 self.assertEqual(
754 a,
755 array.array(self.typecode, self.example[:-1] + self.example)
756 )
757
758 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000759 a[1:] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000760 self.assertEqual(
761 a,
762 array.array(self.typecode, self.example[:1] + self.example)
763 )
764
765 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000766 a[1:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000767 self.assertEqual(
768 a,
769 array.array(
770 self.typecode,
771 self.example[:1] + self.example + self.example[-1:]
772 )
773 )
774
775 a = array.array(self.typecode, self.example)
776 a[1000:] = a
777 self.assertEqual(
778 a,
779 array.array(self.typecode, 2*self.example)
780 )
781
782 a = array.array(self.typecode, self.example)
783 a[-1000:] = a
784 self.assertEqual(
785 a,
786 array.array(self.typecode, self.example)
787 )
788
789 a = array.array(self.typecode, self.example)
790 a[:1000] = a
791 self.assertEqual(
792 a,
793 array.array(self.typecode, self.example)
794 )
795
796 a = array.array(self.typecode, self.example)
797 a[:-1000] = a
798 self.assertEqual(
799 a,
800 array.array(self.typecode, 2*self.example)
801 )
802
803 a = array.array(self.typecode, self.example)
804 a[1:0] = a
805 self.assertEqual(
806 a,
807 array.array(self.typecode, self.example[:1] + self.example + self.example[1:])
808 )
809
810 a = array.array(self.typecode, self.example)
811 a[2000:1000] = a
812 self.assertEqual(
813 a,
814 array.array(self.typecode, 2*self.example)
815 )
816
817 a = array.array(self.typecode, self.example)
Thomas Woutersed03b412007-08-28 21:37:11 +0000818 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), None)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000819 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), None)
820
821 b = array.array(self.badtypecode())
Thomas Woutersed03b412007-08-28 21:37:11 +0000822 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000823 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), b)
824
Thomas Woutersed03b412007-08-28 21:37:11 +0000825 def test_extended_set_del_slice(self):
Zackery Spytz14514d92019-05-17 01:13:03 -0600826 indices = (0, None, 1, 3, 19, 100, sys.maxsize, -1, -2, -31, -100)
Thomas Woutersed03b412007-08-28 21:37:11 +0000827 for start in indices:
828 for stop in indices:
829 # Everything except the initial 0 (invalid step)
830 for step in indices[1:]:
831 a = array.array(self.typecode, self.example)
832 L = list(a)
833 # Make sure we have a slice of exactly the right length,
834 # but with (hopefully) different data.
835 data = L[start:stop:step]
836 data.reverse()
837 L[start:stop:step] = data
838 a[start:stop:step] = array.array(self.typecode, data)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000839 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000840
841 del L[start:stop:step]
842 del a[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +0000843 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000844
Walter Dörwald7fd94242003-05-18 00:47:47 +0000845 def test_index(self):
846 example = 2*self.example
847 a = array.array(self.typecode, example)
848 self.assertRaises(TypeError, a.index)
849 for x in example:
850 self.assertEqual(a.index(x), example.index(x))
851 self.assertRaises(ValueError, a.index, None)
852 self.assertRaises(ValueError, a.index, self.outside)
853
854 def test_count(self):
855 example = 2*self.example
856 a = array.array(self.typecode, example)
857 self.assertRaises(TypeError, a.count)
858 for x in example:
859 self.assertEqual(a.count(x), example.count(x))
860 self.assertEqual(a.count(self.outside), 0)
861 self.assertEqual(a.count(None), 0)
862
863 def test_remove(self):
864 for x in self.example:
865 example = 2*self.example
866 a = array.array(self.typecode, example)
867 pos = example.index(x)
868 example2 = example[:pos] + example[pos+1:]
869 a.remove(x)
870 self.assertEqual(a, array.array(self.typecode, example2))
871
872 a = array.array(self.typecode, self.example)
873 self.assertRaises(ValueError, a.remove, self.outside)
874
875 self.assertRaises(ValueError, a.remove, None)
876
877 def test_pop(self):
878 a = array.array(self.typecode)
879 self.assertRaises(IndexError, a.pop)
880
881 a = array.array(self.typecode, 2*self.example)
882 self.assertRaises(TypeError, a.pop, 42, 42)
883 self.assertRaises(TypeError, a.pop, None)
884 self.assertRaises(IndexError, a.pop, len(a))
885 self.assertRaises(IndexError, a.pop, -len(a)-1)
886
887 self.assertEntryEqual(a.pop(0), self.example[0])
888 self.assertEqual(
889 a,
890 array.array(self.typecode, self.example[1:]+self.example)
891 )
892 self.assertEntryEqual(a.pop(1), self.example[2])
893 self.assertEqual(
894 a,
895 array.array(self.typecode, self.example[1:2]+self.example[3:]+self.example)
896 )
897 self.assertEntryEqual(a.pop(0), self.example[1])
898 self.assertEntryEqual(a.pop(), self.example[-1])
899 self.assertEqual(
900 a,
901 array.array(self.typecode, self.example[3:]+self.example[:-1])
902 )
903
904 def test_reverse(self):
905 a = array.array(self.typecode, self.example)
906 self.assertRaises(TypeError, a.reverse, 42)
Fred Drake004d5e62000-10-23 17:22:08 +0000907 a.reverse()
Walter Dörwald7fd94242003-05-18 00:47:47 +0000908 self.assertEqual(
909 a,
910 array.array(self.typecode, self.example[::-1])
911 )
912
913 def test_extend(self):
914 a = array.array(self.typecode, self.example)
915 self.assertRaises(TypeError, a.extend)
916 a.extend(array.array(self.typecode, self.example[::-1]))
917 self.assertEqual(
918 a,
919 array.array(self.typecode, self.example+self.example[::-1])
920 )
921
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000922 a = array.array(self.typecode, self.example)
923 a.extend(a)
924 self.assertEqual(
925 a,
926 array.array(self.typecode, self.example+self.example)
927 )
928
Walter Dörwald7fd94242003-05-18 00:47:47 +0000929 b = array.array(self.badtypecode())
930 self.assertRaises(TypeError, a.extend, b)
931
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000932 a = array.array(self.typecode, self.example)
933 a.extend(self.example[::-1])
934 self.assertEqual(
935 a,
936 array.array(self.typecode, self.example+self.example[::-1])
937 )
938
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +0000939 def test_constructor_with_iterable_argument(self):
940 a = array.array(self.typecode, iter(self.example))
941 b = array.array(self.typecode, self.example)
942 self.assertEqual(a, b)
943
944 # non-iterable argument
945 self.assertRaises(TypeError, array.array, self.typecode, 10)
946
947 # pass through errors raised in __iter__
948 class A:
949 def __iter__(self):
950 raise UnicodeError
951 self.assertRaises(UnicodeError, array.array, self.typecode, A())
952
953 # pass through errors raised in next()
954 def B():
955 raise UnicodeError
956 yield None
957 self.assertRaises(UnicodeError, array.array, self.typecode, B())
958
Walter Dörwald7fd94242003-05-18 00:47:47 +0000959 def test_coveritertraverse(self):
960 try:
961 import gc
962 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -0600963 self.skipTest('gc module not available')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000964 a = array.array(self.typecode)
965 l = [iter(a)]
966 l.append(l)
967 gc.collect()
968
969 def test_buffer(self):
970 a = array.array(self.typecode, self.example)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000971 m = memoryview(a)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000972 expected = m.tobytes()
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000973 self.assertEqual(a.tobytes(), expected)
974 self.assertEqual(a.tobytes()[0], expected[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000975 # Resizing is forbidden when there are buffer exports.
976 # For issue 4509, we also check after each error that
977 # the array was not modified.
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000978 self.assertRaises(BufferError, a.append, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000979 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000980 self.assertRaises(BufferError, a.extend, a[0:1])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000981 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000982 self.assertRaises(BufferError, a.remove, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000983 self.assertEqual(m.tobytes(), expected)
984 self.assertRaises(BufferError, a.pop, 0)
985 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000986 self.assertRaises(BufferError, a.fromlist, a.tolist())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000987 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000988 self.assertRaises(BufferError, a.frombytes, a.tobytes())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000989 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000990 if self.typecode == 'u':
991 self.assertRaises(BufferError, a.fromunicode, a.tounicode())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000992 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +0000993 self.assertRaises(BufferError, operator.imul, a, 2)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000994 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +0000995 self.assertRaises(BufferError, operator.imul, a, 0)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000996 self.assertEqual(m.tobytes(), expected)
997 self.assertRaises(BufferError, operator.setitem, a, slice(0, 0), a)
998 self.assertEqual(m.tobytes(), expected)
999 self.assertRaises(BufferError, operator.delitem, a, 0)
1000 self.assertEqual(m.tobytes(), expected)
1001 self.assertRaises(BufferError, operator.delitem, a, slice(0, 1))
1002 self.assertEqual(m.tobytes(), expected)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001003
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001004 def test_weakref(self):
1005 s = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001006 p = weakref.proxy(s)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001007 self.assertEqual(p.tobytes(), s.tobytes())
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001008 s = None
1009 self.assertRaises(ReferenceError, len, p)
1010
Serhiy Storchaka43767632013-11-03 21:31:38 +02001011 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
1012 'test needs sys.getrefcount()')
Skip Montanarod5cf0b82003-08-03 23:02:10 +00001013 def test_bug_782369(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +02001014 for i in range(10):
1015 b = array.array('B', range(64))
1016 rc = sys.getrefcount(10)
1017 for i in range(10):
1018 b = array.array('B', range(64))
1019 self.assertEqual(rc, sys.getrefcount(10))
Skip Montanarod5cf0b82003-08-03 23:02:10 +00001020
Thomas Woutersb2137042007-02-01 18:02:27 +00001021 def test_subclass_with_kwargs(self):
1022 # SF bug #1486663 -- this used to erroneously raise a TypeError
1023 ArraySubclassWithKwargs('b', newarg=1)
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001024
Guido van Rossum6b826ab2007-07-03 16:22:09 +00001025 def test_create_from_bytes(self):
Alexandre Vassalotti7e4f3212009-07-05 05:38:18 +00001026 # XXX This test probably needs to be moved in a subclass or
1027 # generalized to use self.typecode.
Guido van Rossum6b826ab2007-07-03 16:22:09 +00001028 a = array.array('H', b"1234")
1029 self.assertEqual(len(a) * a.itemsize, 4)
1030
Meador Inge03b4d502012-08-10 22:35:45 -05001031 @support.cpython_only
1032 def test_sizeof_with_buffer(self):
1033 a = array.array(self.typecode, self.example)
Meador Inge80dd1af2012-08-10 23:21:39 -05001034 basesize = support.calcvobjsize('Pn2Pi')
Meador Inge03b4d502012-08-10 22:35:45 -05001035 buffer_size = a.buffer_info()[1] * a.itemsize
1036 support.check_sizeof(self, a, basesize + buffer_size)
1037
1038 @support.cpython_only
1039 def test_sizeof_without_buffer(self):
1040 a = array.array(self.typecode)
Meador Inge80dd1af2012-08-10 23:21:39 -05001041 basesize = support.calcvobjsize('Pn2Pi')
Meador Inge03b4d502012-08-10 22:35:45 -05001042 support.check_sizeof(self, a, basesize)
1043
Alexandre Vassalotti9730e332013-11-29 20:47:15 -08001044 def test_initialize_with_unicode(self):
1045 if self.typecode != 'u':
1046 with self.assertRaises(TypeError) as cm:
1047 a = array.array(self.typecode, 'foo')
1048 self.assertIn("cannot use a str", str(cm.exception))
1049 with self.assertRaises(TypeError) as cm:
1050 a = array.array(self.typecode, array.array('u', 'foo'))
1051 self.assertIn("cannot use a unicode array", str(cm.exception))
1052 else:
1053 a = array.array(self.typecode, "foo")
1054 a = array.array(self.typecode, array.array('u', 'foo'))
1055
Stefan Krah650c1e82015-02-03 21:43:23 +01001056 @support.cpython_only
1057 def test_obsolete_write_lock(self):
1058 from _testcapi import getbuffer_with_null_view
1059 a = array.array('B', b"")
1060 self.assertRaises(BufferError, getbuffer_with_null_view, a)
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001061
Serhiy Storchakaab0d1982016-03-30 21:11:16 +03001062 def test_free_after_iterating(self):
1063 support.check_free_after_iterating(self, iter, array.array,
1064 (self.typecode,))
1065 support.check_free_after_iterating(self, reversed, array.array,
1066 (self.typecode,))
1067
Walter Dörwald7fd94242003-05-18 00:47:47 +00001068class StringTest(BaseTest):
1069
1070 def test_setitem(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001071 super().test_setitem()
Walter Dörwald7fd94242003-05-18 00:47:47 +00001072 a = array.array(self.typecode, self.example)
1073 self.assertRaises(TypeError, a.__setitem__, 0, self.example[:2])
1074
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001075class UnicodeTest(StringTest, unittest.TestCase):
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001076 typecode = 'u'
1077 example = '\x01\u263a\x00\ufeff'
1078 smallerexample = '\x01\u263a\x00\ufefe'
1079 biggerexample = '\x01\u263a\x01\ufeff'
1080 outside = str('\x33')
Victor Stinner8d4734f2012-08-08 20:09:21 +02001081 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001082
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001083 def test_unicode(self):
1084 self.assertRaises(TypeError, array.array, 'b', 'foo')
Walter Dörwald7fd94242003-05-18 00:47:47 +00001085
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001086 a = array.array('u', '\xa0\xc2\u1234')
1087 a.fromunicode(' ')
1088 a.fromunicode('')
1089 a.fromunicode('')
1090 a.fromunicode('\x11abc\xff\u1234')
1091 s = a.tounicode()
1092 self.assertEqual(s, '\xa0\xc2\u1234 \x11abc\xff\u1234')
Victor Stinner9d512ab2012-08-09 00:43:56 +02001093 self.assertEqual(a.itemsize, sizeof_wchar)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001094
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001095 s = '\x00="\'a\\b\x80\xff\u0000\u0001\u1234'
1096 a = array.array('u', s)
1097 self.assertEqual(
1098 repr(a),
Georg Brandl559e5d72008-06-11 18:37:52 +00001099 "array('u', '\\x00=\"\\'a\\\\b\\x80\xff\\x00\\x01\u1234')")
Walter Dörwald7fd94242003-05-18 00:47:47 +00001100
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001101 self.assertRaises(TypeError, a.fromunicode)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001102
Victor Stinner29ec5952013-02-26 00:27:38 +01001103 def test_issue17223(self):
1104 # this used to crash
Victor Stinnerc472c5d2013-02-26 22:52:11 +01001105 if sizeof_wchar == 4:
1106 # U+FFFFFFFF is an invalid code point in Unicode 6.0
1107 invalid_str = b'\xff\xff\xff\xff'
1108 else:
Victor Stinner29c00342013-03-08 02:33:06 +01001109 # PyUnicode_FromUnicode() cannot fail with 16-bit wchar_t
1110 self.skipTest("specific to 32-bit wchar_t")
Victor Stinnerc472c5d2013-02-26 22:52:11 +01001111 a = array.array('u', invalid_str)
Victor Stinner29ec5952013-02-26 00:27:38 +01001112 self.assertRaises(ValueError, a.tounicode)
1113 self.assertRaises(ValueError, str, a)
1114
Walter Dörwald7fd94242003-05-18 00:47:47 +00001115class NumberTest(BaseTest):
1116
1117 def test_extslice(self):
1118 a = array.array(self.typecode, range(5))
1119 self.assertEqual(a[::], a)
1120 self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
1121 self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
1122 self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
1123 self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
1124 self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
1125 self.assertEqual(a[-100:100:], a)
1126 self.assertEqual(a[100:-100:-1], a[::-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +00001127 self.assertEqual(a[-100:100:2], array.array(self.typecode, [0,2,4]))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001128 self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
1129 self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
1130
1131 def test_delslice(self):
1132 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001133 del a[::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001134 self.assertEqual(a, array.array(self.typecode, [1,3]))
1135 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001136 del a[1::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001137 self.assertEqual(a, array.array(self.typecode, [0,2,4]))
1138 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001139 del a[1::-2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001140 self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
1141 a = array.array(self.typecode, range(10))
Michael W. Hudson56796f62002-07-29 14:35:04 +00001142 del a[::1000]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001143 self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
Mark Dickinsonbc099642010-01-29 17:27:24 +00001144 # test issue7788
1145 a = array.array(self.typecode, range(10))
1146 del a[9::1<<333]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001147
1148 def test_assignment(self):
1149 a = array.array(self.typecode, range(10))
1150 a[::2] = array.array(self.typecode, [42]*5)
1151 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
1152 a = array.array(self.typecode, range(10))
1153 a[::-4] = array.array(self.typecode, [10]*3)
1154 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
1155 a = array.array(self.typecode, range(4))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001156 a[::-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +00001157 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
1158 a = array.array(self.typecode, range(10))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001159 b = a[:]
1160 c = a[:]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001161 ins = array.array(self.typecode, range(2))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001162 a[2:3] = ins
1163 b[slice(2,3)] = ins
1164 c[2:3:] = ins
Fred Drake004d5e62000-10-23 17:22:08 +00001165
Walter Dörwald7fd94242003-05-18 00:47:47 +00001166 def test_iterationcontains(self):
1167 a = array.array(self.typecode, range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +00001168 self.assertEqual(list(a), list(range(10)))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001169 b = array.array(self.typecode, [20])
1170 self.assertEqual(a[-1] in a, True)
1171 self.assertEqual(b[0] not in a, True)
1172
1173 def check_overflow(self, lower, upper):
1174 # method to be used by subclasses
1175
1176 # should not overflow assigning lower limit
1177 a = array.array(self.typecode, [lower])
1178 a[0] = lower
1179 # should overflow assigning less than lower limit
1180 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
1181 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
1182 # should not overflow assigning upper limit
1183 a = array.array(self.typecode, [upper])
1184 a[0] = upper
1185 # should overflow assigning more than upper limit
1186 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
1187 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
1188
1189 def test_subclassing(self):
1190 typecode = self.typecode
1191 class ExaggeratingArray(array.array):
1192 __slots__ = ['offset']
1193
1194 def __new__(cls, typecode, data, offset):
1195 return array.array.__new__(cls, typecode, data)
1196
1197 def __init__(self, typecode, data, offset):
1198 self.offset = offset
1199
1200 def __getitem__(self, i):
1201 return array.array.__getitem__(self, i) + self.offset
1202
1203 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
1204 self.assertEntryEqual(a[0], 7)
1205
1206 self.assertRaises(AttributeError, setattr, a, "color", "blue")
1207
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00001208 def test_frombytearray(self):
1209 a = array.array('b', range(10))
1210 b = array.array(self.typecode, a)
1211 self.assertEqual(a, b)
1212
orenmn964281a2017-03-09 11:35:28 +02001213class IntegerNumberTest(NumberTest):
1214 def test_type_error(self):
1215 a = array.array(self.typecode)
1216 a.append(42)
1217 with self.assertRaises(TypeError):
1218 a.append(42.0)
1219 with self.assertRaises(TypeError):
1220 a[0] = 42.0
1221
1222class Intable:
1223 def __init__(self, num):
1224 self._num = num
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +02001225 def __index__(self):
1226 return self._num
orenmn964281a2017-03-09 11:35:28 +02001227 def __int__(self):
1228 return self._num
1229 def __sub__(self, other):
1230 return Intable(int(self) - int(other))
1231 def __add__(self, other):
1232 return Intable(int(self) + int(other))
1233
1234class SignedNumberTest(IntegerNumberTest):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001235 example = [-1, 0, 1, 42, 0x7f]
1236 smallerexample = [-1, 0, 1, 42, 0x7e]
1237 biggerexample = [-1, 0, 1, 43, 0x7f]
1238 outside = 23
1239
1240 def test_overflow(self):
1241 a = array.array(self.typecode)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001242 lower = -1 * int(pow(2, a.itemsize * 8 - 1))
1243 upper = int(pow(2, a.itemsize * 8 - 1)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001244 self.check_overflow(lower, upper)
orenmn964281a2017-03-09 11:35:28 +02001245 self.check_overflow(Intable(lower), Intable(upper))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001246
orenmn964281a2017-03-09 11:35:28 +02001247class UnsignedNumberTest(IntegerNumberTest):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001248 example = [0, 1, 17, 23, 42, 0xff]
1249 smallerexample = [0, 1, 17, 23, 42, 0xfe]
1250 biggerexample = [0, 1, 17, 23, 43, 0xff]
1251 outside = 0xaa
1252
1253 def test_overflow(self):
1254 a = array.array(self.typecode)
1255 lower = 0
Guido van Rossume2a383d2007-01-15 16:59:06 +00001256 upper = int(pow(2, a.itemsize * 8)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001257 self.check_overflow(lower, upper)
orenmn964281a2017-03-09 11:35:28 +02001258 self.check_overflow(Intable(lower), Intable(upper))
Fred Drake004d5e62000-10-23 17:22:08 +00001259
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001260 def test_bytes_extend(self):
1261 s = bytes(self.example)
1262
1263 a = array.array(self.typecode, self.example)
1264 a.extend(s)
1265 self.assertEqual(
1266 a,
1267 array.array(self.typecode, self.example+self.example)
1268 )
1269
1270 a = array.array(self.typecode, self.example)
1271 a.extend(bytearray(reversed(s)))
1272 self.assertEqual(
1273 a,
1274 array.array(self.typecode, self.example+self.example[::-1])
1275 )
1276
Fred Drake004d5e62000-10-23 17:22:08 +00001277
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001278class ByteTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001279 typecode = 'b'
1280 minitemsize = 1
Fred Drake004d5e62000-10-23 17:22:08 +00001281
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001282class UnsignedByteTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001283 typecode = 'B'
1284 minitemsize = 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001285
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001286class ShortTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001287 typecode = 'h'
1288 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001289
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001290class UnsignedShortTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001291 typecode = 'H'
1292 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001293
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001294class IntTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001295 typecode = 'i'
1296 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001297
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001298class UnsignedIntTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001299 typecode = 'I'
1300 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001301
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001302class LongTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001303 typecode = 'l'
1304 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001305
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001306class UnsignedLongTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001307 typecode = 'L'
1308 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001309
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001310class LongLongTest(SignedNumberTest, unittest.TestCase):
Meador Inge1c9f0c92011-09-20 19:55:51 -05001311 typecode = 'q'
1312 minitemsize = 8
Meador Inge1c9f0c92011-09-20 19:55:51 -05001313
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001314class UnsignedLongLongTest(UnsignedNumberTest, unittest.TestCase):
Meador Inge1c9f0c92011-09-20 19:55:51 -05001315 typecode = 'Q'
1316 minitemsize = 8
Meador Inge1c9f0c92011-09-20 19:55:51 -05001317
Walter Dörwald7fd94242003-05-18 00:47:47 +00001318class FPTest(NumberTest):
1319 example = [-42.0, 0, 42, 1e5, -1e10]
1320 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
1321 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
1322 outside = 23
1323
1324 def assertEntryEqual(self, entry1, entry2):
1325 self.assertAlmostEqual(entry1, entry2)
1326
Adrian Wielgosik7c17e232017-08-17 12:46:06 +00001327 def test_nan(self):
1328 a = array.array(self.typecode, [float('nan')])
1329 b = array.array(self.typecode, [float('nan')])
1330 self.assertIs(a != b, True)
1331 self.assertIs(a == b, False)
1332 self.assertIs(a > b, False)
1333 self.assertIs(a >= b, False)
1334 self.assertIs(a < b, False)
1335 self.assertIs(a <= b, False)
1336
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001337 def test_byteswap(self):
1338 a = array.array(self.typecode, self.example)
1339 self.assertRaises(TypeError, a.byteswap, 42)
1340 if a.itemsize in (1, 2, 4, 8):
1341 b = array.array(self.typecode, self.example)
1342 b.byteswap()
1343 if a.itemsize==1:
1344 self.assertEqual(a, b)
1345 else:
1346 # On alphas treating the byte swapped bit patters as
1347 # floats/doubles results in floating point exceptions
1348 # => compare the 8bit string values instead
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001349 self.assertNotEqual(a.tobytes(), b.tobytes())
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001350 b.byteswap()
1351 self.assertEqual(a, b)
1352
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001353class FloatTest(FPTest, unittest.TestCase):
Neal Norwitz35c6cd02003-05-22 13:29:15 +00001354 typecode = 'f'
1355 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001356
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001357class DoubleTest(FPTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001358 typecode = 'd'
1359 minitemsize = 8
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001360
1361 def test_alloc_overflow(self):
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001362 from sys import maxsize
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001363 a = array.array('d', [-1]*65536)
1364 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001365 a *= maxsize//65536 + 1
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001366 except MemoryError:
1367 pass
1368 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001369 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001370 b = array.array('d', [ 2.71828183, 3.14159265, -1])
1371 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001372 b * (maxsize//3 + 1)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001373 except MemoryError:
1374 pass
1375 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001376 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001377
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001378
sthaa3ecb82019-03-20 20:49:39 +01001379class LargeArrayTest(unittest.TestCase):
1380 typecode = 'b'
1381
1382 def example(self, size):
1383 # We assess a base memuse of <=2.125 for constructing this array
1384 base = array.array(self.typecode, [0, 1, 2, 3, 4, 5, 6, 7]) * (size // 8)
1385 base += array.array(self.typecode, [99]*(size % 8) + [8, 9, 10, 11])
1386 return base
1387
1388 @support.bigmemtest(_2G, memuse=2.125)
1389 def test_example_data(self, size):
1390 example = self.example(size)
1391 self.assertEqual(len(example), size+4)
1392
1393 @support.bigmemtest(_2G, memuse=2.125)
1394 def test_access(self, size):
1395 example = self.example(size)
1396 self.assertEqual(example[0], 0)
1397 self.assertEqual(example[-(size+4)], 0)
1398 self.assertEqual(example[size], 8)
1399 self.assertEqual(example[-4], 8)
1400 self.assertEqual(example[size+3], 11)
1401 self.assertEqual(example[-1], 11)
1402
1403 @support.bigmemtest(_2G, memuse=2.125+1)
1404 def test_slice(self, size):
1405 example = self.example(size)
1406 self.assertEqual(list(example[:4]), [0, 1, 2, 3])
1407 self.assertEqual(list(example[-4:]), [8, 9, 10, 11])
1408 part = example[1:-1]
1409 self.assertEqual(len(part), size+2)
1410 self.assertEqual(part[0], 1)
1411 self.assertEqual(part[-1], 10)
1412 del part
1413 part = example[::2]
1414 self.assertEqual(len(part), (size+5)//2)
1415 self.assertEqual(list(part[:4]), [0, 2, 4, 6])
1416 if size % 2:
1417 self.assertEqual(list(part[-2:]), [9, 11])
1418 else:
1419 self.assertEqual(list(part[-2:]), [8, 10])
1420
1421 @support.bigmemtest(_2G, memuse=2.125)
1422 def test_count(self, size):
1423 example = self.example(size)
1424 self.assertEqual(example.count(0), size//8)
1425 self.assertEqual(example.count(11), 1)
1426
1427 @support.bigmemtest(_2G, memuse=2.125)
1428 def test_append(self, size):
1429 example = self.example(size)
1430 example.append(12)
1431 self.assertEqual(example[-1], 12)
1432
1433 @support.bigmemtest(_2G, memuse=2.125)
1434 def test_extend(self, size):
1435 example = self.example(size)
1436 example.extend(iter([12, 13, 14, 15]))
1437 self.assertEqual(len(example), size+8)
1438 self.assertEqual(list(example[-8:]), [8, 9, 10, 11, 12, 13, 14, 15])
1439
1440 @support.bigmemtest(_2G, memuse=2.125)
1441 def test_frombytes(self, size):
1442 example = self.example(size)
1443 example.frombytes(b'abcd')
1444 self.assertEqual(len(example), size+8)
1445 self.assertEqual(list(example[-8:]), [8, 9, 10, 11] + list(b'abcd'))
1446
1447 @support.bigmemtest(_2G, memuse=2.125)
1448 def test_fromlist(self, size):
1449 example = self.example(size)
1450 example.fromlist([12, 13, 14, 15])
1451 self.assertEqual(len(example), size+8)
1452 self.assertEqual(list(example[-8:]), [8, 9, 10, 11, 12, 13, 14, 15])
1453
1454 @support.bigmemtest(_2G, memuse=2.125)
1455 def test_index(self, size):
1456 example = self.example(size)
1457 self.assertEqual(example.index(0), 0)
1458 self.assertEqual(example.index(1), 1)
1459 self.assertEqual(example.index(7), 7)
1460 self.assertEqual(example.index(11), size+3)
1461
1462 @support.bigmemtest(_2G, memuse=2.125)
1463 def test_insert(self, size):
1464 example = self.example(size)
1465 example.insert(0, 12)
1466 example.insert(10, 13)
1467 example.insert(size+1, 14)
1468 self.assertEqual(len(example), size+7)
1469 self.assertEqual(example[0], 12)
1470 self.assertEqual(example[10], 13)
1471 self.assertEqual(example[size+1], 14)
1472
1473 @support.bigmemtest(_2G, memuse=2.125)
1474 def test_pop(self, size):
1475 example = self.example(size)
1476 self.assertEqual(example.pop(0), 0)
1477 self.assertEqual(example[0], 1)
1478 self.assertEqual(example.pop(size+1), 10)
1479 self.assertEqual(example[size+1], 11)
1480 self.assertEqual(example.pop(1), 2)
1481 self.assertEqual(example[1], 3)
1482 self.assertEqual(len(example), size+1)
1483 self.assertEqual(example.pop(), 11)
1484 self.assertEqual(len(example), size)
1485
1486 @support.bigmemtest(_2G, memuse=2.125)
1487 def test_remove(self, size):
1488 example = self.example(size)
1489 example.remove(0)
1490 self.assertEqual(len(example), size+3)
1491 self.assertEqual(example[0], 1)
1492 example.remove(10)
1493 self.assertEqual(len(example), size+2)
1494 self.assertEqual(example[size], 9)
1495 self.assertEqual(example[size+1], 11)
1496
1497 @support.bigmemtest(_2G, memuse=2.125)
1498 def test_reverse(self, size):
1499 example = self.example(size)
1500 example.reverse()
1501 self.assertEqual(len(example), size+4)
1502 self.assertEqual(example[0], 11)
1503 self.assertEqual(example[3], 8)
1504 self.assertEqual(example[-1], 0)
1505 example.reverse()
1506 self.assertEqual(len(example), size+4)
1507 self.assertEqual(list(example[:4]), [0, 1, 2, 3])
1508 self.assertEqual(list(example[-4:]), [8, 9, 10, 11])
1509
1510 # list takes about 9 bytes per element
1511 @support.bigmemtest(_2G, memuse=2.125+9)
1512 def test_tolist(self, size):
1513 example = self.example(size)
1514 ls = example.tolist()
1515 self.assertEqual(len(ls), len(example))
1516 self.assertEqual(ls[:8], list(example[:8]))
1517 self.assertEqual(ls[-8:], list(example[-8:]))
1518
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001519if __name__ == "__main__":
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001520 unittest.main()