blob: c2439579e8ee5b456cd13b628e330b2d56749a90 [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
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +000013import warnings
Alexandre Vassalottiad077152009-07-15 17:49:23 +000014
15import array
16from array import _array_reconstructor as array_reconstructor
17
Victor Stinner29c00342013-03-08 02:33:06 +010018sizeof_wchar = array.array('u').itemsize
Victor Stinnerc472c5d2013-02-26 22:52:11 +010019
20
Raymond Hettingerb0900e62004-12-16 16:23:40 +000021class ArraySubclass(array.array):
22 pass
Guido van Rossumc9f8f141997-04-09 20:51:54 +000023
Thomas Woutersb2137042007-02-01 18:02:27 +000024class ArraySubclassWithKwargs(array.array):
25 def __init__(self, typecode, newarg=None):
Victor Stinner7a6a0092011-01-04 00:04:44 +000026 array.array.__init__(self)
Thomas Woutersb2137042007-02-01 18:02:27 +000027
orenmn964281a2017-03-09 11:35:28 +020028typecodes = 'ubBhHiIlLfdqQ'
Martin v. Löwis99866332002-03-01 10:27:01 +000029
Martin Panterbe8da9c2016-09-07 11:04:41 +000030class MiscTest(unittest.TestCase):
Martin v. Löwis99866332002-03-01 10:27:01 +000031
Martin Panterbe8da9c2016-09-07 11:04:41 +000032 def test_bad_constructor(self):
Walter Dörwald7fd94242003-05-18 00:47:47 +000033 self.assertRaises(TypeError, array.array)
34 self.assertRaises(TypeError, array.array, spam=42)
35 self.assertRaises(TypeError, array.array, 'xx')
36 self.assertRaises(ValueError, array.array, 'x')
Martin v. Löwis99866332002-03-01 10:27:01 +000037
Martin Panterbe8da9c2016-09-07 11:04:41 +000038 def test_empty(self):
39 # Exercise code for handling zero-length arrays
40 a = array.array('B')
41 a[:] = a
42 self.assertEqual(len(a), 0)
43 self.assertEqual(len(a + a), 0)
44 self.assertEqual(len(a * 3), 0)
45 a += a
46 self.assertEqual(len(a), 0)
47
Martin v. Löwis99866332002-03-01 10:27:01 +000048
Alexandre Vassalottiad077152009-07-15 17:49:23 +000049# Machine format codes.
50#
51# Search for "enum machine_format_code" in Modules/arraymodule.c to get the
52# authoritative values.
53UNKNOWN_FORMAT = -1
54UNSIGNED_INT8 = 0
55SIGNED_INT8 = 1
56UNSIGNED_INT16_LE = 2
57UNSIGNED_INT16_BE = 3
58SIGNED_INT16_LE = 4
59SIGNED_INT16_BE = 5
60UNSIGNED_INT32_LE = 6
61UNSIGNED_INT32_BE = 7
62SIGNED_INT32_LE = 8
63SIGNED_INT32_BE = 9
64UNSIGNED_INT64_LE = 10
65UNSIGNED_INT64_BE = 11
66SIGNED_INT64_LE = 12
67SIGNED_INT64_BE = 13
68IEEE_754_FLOAT_LE = 14
69IEEE_754_FLOAT_BE = 15
70IEEE_754_DOUBLE_LE = 16
71IEEE_754_DOUBLE_BE = 17
72UTF16_LE = 18
73UTF16_BE = 19
74UTF32_LE = 20
75UTF32_BE = 21
76
77class ArrayReconstructorTest(unittest.TestCase):
78
79 def test_error(self):
80 self.assertRaises(TypeError, array_reconstructor,
81 "", "b", 0, b"")
82 self.assertRaises(TypeError, array_reconstructor,
83 str, "b", 0, b"")
84 self.assertRaises(TypeError, array_reconstructor,
85 array.array, "b", '', b"")
86 self.assertRaises(TypeError, array_reconstructor,
87 array.array, "b", 0, "")
88 self.assertRaises(ValueError, array_reconstructor,
89 array.array, "?", 0, b"")
90 self.assertRaises(ValueError, array_reconstructor,
91 array.array, "b", UNKNOWN_FORMAT, b"")
92 self.assertRaises(ValueError, array_reconstructor,
93 array.array, "b", 22, b"")
94 self.assertRaises(ValueError, array_reconstructor,
95 array.array, "d", 16, b"a")
96
97 def test_numbers(self):
98 testcases = (
99 (['B', 'H', 'I', 'L'], UNSIGNED_INT8, '=BBBB',
100 [0x80, 0x7f, 0, 0xff]),
101 (['b', 'h', 'i', 'l'], SIGNED_INT8, '=bbb',
102 [-0x80, 0x7f, 0]),
103 (['H', 'I', 'L'], UNSIGNED_INT16_LE, '<HHHH',
104 [0x8000, 0x7fff, 0, 0xffff]),
105 (['H', 'I', 'L'], UNSIGNED_INT16_BE, '>HHHH',
106 [0x8000, 0x7fff, 0, 0xffff]),
107 (['h', 'i', 'l'], SIGNED_INT16_LE, '<hhh',
108 [-0x8000, 0x7fff, 0]),
109 (['h', 'i', 'l'], SIGNED_INT16_BE, '>hhh',
110 [-0x8000, 0x7fff, 0]),
111 (['I', 'L'], UNSIGNED_INT32_LE, '<IIII',
112 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
113 (['I', 'L'], UNSIGNED_INT32_BE, '>IIII',
114 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
115 (['i', 'l'], SIGNED_INT32_LE, '<iii',
116 [-1<<31, (1<<31)-1, 0]),
117 (['i', 'l'], SIGNED_INT32_BE, '>iii',
118 [-1<<31, (1<<31)-1, 0]),
119 (['L'], UNSIGNED_INT64_LE, '<QQQQ',
Alexandre Vassalotti0027d4b2009-07-15 20:53:55 +0000120 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
121 (['L'], UNSIGNED_INT64_BE, '>QQQQ',
122 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
123 (['l'], SIGNED_INT64_LE, '<qqq',
124 [-1<<31, (1<<31)-1, 0]),
125 (['l'], SIGNED_INT64_BE, '>qqq',
126 [-1<<31, (1<<31)-1, 0]),
127 # The following tests for INT64 will raise an OverflowError
128 # when run on a 32-bit machine. The tests are simply skipped
129 # in that case.
130 (['L'], UNSIGNED_INT64_LE, '<QQQQ',
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000131 [1<<63, (1<<63)-1, 0, (1<<64)-1]),
132 (['L'], UNSIGNED_INT64_BE, '>QQQQ',
133 [1<<63, (1<<63)-1, 0, (1<<64)-1]),
134 (['l'], SIGNED_INT64_LE, '<qqq',
135 [-1<<63, (1<<63)-1, 0]),
136 (['l'], SIGNED_INT64_BE, '>qqq',
137 [-1<<63, (1<<63)-1, 0]),
138 (['f'], IEEE_754_FLOAT_LE, '<ffff',
139 [16711938.0, float('inf'), float('-inf'), -0.0]),
140 (['f'], IEEE_754_FLOAT_BE, '>ffff',
141 [16711938.0, float('inf'), float('-inf'), -0.0]),
142 (['d'], IEEE_754_DOUBLE_LE, '<dddd',
143 [9006104071832581.0, float('inf'), float('-inf'), -0.0]),
144 (['d'], IEEE_754_DOUBLE_BE, '>dddd',
145 [9006104071832581.0, float('inf'), float('-inf'), -0.0])
146 )
147 for testcase in testcases:
148 valid_typecodes, mformat_code, struct_fmt, values = testcase
149 arraystr = struct.pack(struct_fmt, *values)
150 for typecode in valid_typecodes:
Alexandre Vassalotti0027d4b2009-07-15 20:53:55 +0000151 try:
152 a = array.array(typecode, values)
153 except OverflowError:
154 continue # Skip this test case.
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000155 b = array_reconstructor(
156 array.array, typecode, mformat_code, arraystr)
157 self.assertEqual(a, b,
158 msg="{0!r} != {1!r}; testcase={2!r}".format(a, b, testcase))
159
160 def test_unicode(self):
161 teststr = "Bonne Journ\xe9e \U0002030a\U00020347"
162 testcases = (
163 (UTF16_LE, "UTF-16-LE"),
164 (UTF16_BE, "UTF-16-BE"),
165 (UTF32_LE, "UTF-32-LE"),
166 (UTF32_BE, "UTF-32-BE")
167 )
168 for testcase in testcases:
169 mformat_code, encoding = testcase
170 a = array.array('u', teststr)
171 b = array_reconstructor(
172 array.array, 'u', mformat_code, teststr.encode(encoding))
173 self.assertEqual(a, b,
174 msg="{0!r} != {1!r}; testcase={2!r}".format(a, b, testcase))
175
176
Ezio Melotti1d3e96d2013-01-10 06:04:50 +0200177class BaseTest:
Walter Dörwald7fd94242003-05-18 00:47:47 +0000178 # Required class attributes (provided by subclasses
179 # typecode: the typecode to test
180 # example: an initializer usable in the constructor for this type
181 # smallerexample: the same length as example, but smaller
182 # biggerexample: the same length as example, but bigger
183 # outside: An entry that is not in example
184 # minitemsize: the minimum guaranteed itemsize
Martin v. Löwis99866332002-03-01 10:27:01 +0000185
Walter Dörwald7fd94242003-05-18 00:47:47 +0000186 def assertEntryEqual(self, entry1, entry2):
187 self.assertEqual(entry1, entry2)
Martin v. Löwis99866332002-03-01 10:27:01 +0000188
Walter Dörwald7fd94242003-05-18 00:47:47 +0000189 def badtypecode(self):
190 # Return a typecode that is different from our own
191 return typecodes[(typecodes.index(self.typecode)+1) % len(typecodes)]
Martin v. Löwis99866332002-03-01 10:27:01 +0000192
Walter Dörwald7fd94242003-05-18 00:47:47 +0000193 def test_constructor(self):
194 a = array.array(self.typecode)
195 self.assertEqual(a.typecode, self.typecode)
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200196 self.assertGreaterEqual(a.itemsize, self.minitemsize)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000197 self.assertRaises(TypeError, array.array, self.typecode, None)
Martin v. Löwis99866332002-03-01 10:27:01 +0000198
Walter Dörwald7fd94242003-05-18 00:47:47 +0000199 def test_len(self):
200 a = array.array(self.typecode)
201 a.append(self.example[0])
202 self.assertEqual(len(a), 1)
Martin v. Löwis99866332002-03-01 10:27:01 +0000203
Walter Dörwald7fd94242003-05-18 00:47:47 +0000204 a = array.array(self.typecode, self.example)
205 self.assertEqual(len(a), len(self.example))
Martin v. Löwis99866332002-03-01 10:27:01 +0000206
Walter Dörwald7fd94242003-05-18 00:47:47 +0000207 def test_buffer_info(self):
208 a = array.array(self.typecode, self.example)
209 self.assertRaises(TypeError, a.buffer_info, 42)
210 bi = a.buffer_info()
Ezio Melottie9615932010-01-24 19:26:24 +0000211 self.assertIsInstance(bi, tuple)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000212 self.assertEqual(len(bi), 2)
Ezio Melottie9615932010-01-24 19:26:24 +0000213 self.assertIsInstance(bi[0], int)
214 self.assertIsInstance(bi[1], int)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000215 self.assertEqual(bi[1], len(a))
Martin v. Löwis99866332002-03-01 10:27:01 +0000216
Walter Dörwald7fd94242003-05-18 00:47:47 +0000217 def test_byteswap(self):
Victor Stinner8dba4e02011-09-30 00:51:10 +0200218 if self.typecode == 'u':
219 example = '\U00100100'
220 else:
221 example = self.example
222 a = array.array(self.typecode, example)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000223 self.assertRaises(TypeError, a.byteswap, 42)
224 if a.itemsize in (1, 2, 4, 8):
Victor Stinner8dba4e02011-09-30 00:51:10 +0200225 b = array.array(self.typecode, example)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000226 b.byteswap()
227 if a.itemsize==1:
228 self.assertEqual(a, b)
229 else:
230 self.assertNotEqual(a, b)
231 b.byteswap()
232 self.assertEqual(a, b)
Martin v. Löwis99866332002-03-01 10:27:01 +0000233
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000234 def test_copy(self):
235 import copy
236 a = array.array(self.typecode, self.example)
237 b = copy.copy(a)
238 self.assertNotEqual(id(a), id(b))
239 self.assertEqual(a, b)
240
Thomas Wouters89f507f2006-12-13 04:49:30 +0000241 def test_deepcopy(self):
242 import copy
243 a = array.array(self.typecode, self.example)
244 b = copy.deepcopy(a)
245 self.assertNotEqual(id(a), id(b))
246 self.assertEqual(a, b)
247
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000248 def test_reduce_ex(self):
249 a = array.array(self.typecode, self.example)
250 for protocol in range(3):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000251 self.assertIs(a.__reduce_ex__(protocol)[0], array.array)
Zackery Spytzd1cbc6f2018-11-26 22:40:49 -0700252 for protocol in range(3, pickle.HIGHEST_PROTOCOL + 1):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000253 self.assertIs(a.__reduce_ex__(protocol)[0], array_reconstructor)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000254
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000255 def test_pickle(self):
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000256 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000257 a = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000258 b = pickle.loads(pickle.dumps(a, protocol))
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000259 self.assertNotEqual(id(a), id(b))
260 self.assertEqual(a, b)
261
262 a = ArraySubclass(self.typecode, self.example)
263 a.x = 10
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000264 b = pickle.loads(pickle.dumps(a, protocol))
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000265 self.assertNotEqual(id(a), id(b))
266 self.assertEqual(a, b)
267 self.assertEqual(a.x, b.x)
268 self.assertEqual(type(a), type(b))
269
Guido van Rossumd8faa362007-04-27 19:54:29 +0000270 def test_pickle_for_empty_array(self):
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000271 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossumd8faa362007-04-27 19:54:29 +0000272 a = array.array(self.typecode)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000273 b = pickle.loads(pickle.dumps(a, protocol))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000274 self.assertNotEqual(id(a), id(b))
275 self.assertEqual(a, b)
276
277 a = ArraySubclass(self.typecode)
278 a.x = 10
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000279 b = pickle.loads(pickle.dumps(a, protocol))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000280 self.assertNotEqual(id(a), id(b))
281 self.assertEqual(a, b)
282 self.assertEqual(a.x, b.x)
283 self.assertEqual(type(a), type(b))
284
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000285 def test_iterator_pickle(self):
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200286 orig = array.array(self.typecode, self.example)
287 data = list(orig)
288 data2 = data[::-1]
Serhiy Storchakabad12572014-12-15 14:03:42 +0200289 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200290 # initial iterator
291 itorig = iter(orig)
292 d = pickle.dumps((itorig, orig), proto)
293 it, a = pickle.loads(d)
294 a.fromlist(data2)
295 self.assertEqual(type(it), type(itorig))
296 self.assertEqual(list(it), data + data2)
Serhiy Storchakabad12572014-12-15 14:03:42 +0200297
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200298 # running iterator
299 next(itorig)
300 d = pickle.dumps((itorig, orig), proto)
301 it, a = pickle.loads(d)
302 a.fromlist(data2)
303 self.assertEqual(type(it), type(itorig))
304 self.assertEqual(list(it), data[1:] + data2)
305
306 # empty iterator
307 for i in range(1, len(data)):
308 next(itorig)
309 d = pickle.dumps((itorig, orig), proto)
310 it, a = pickle.loads(d)
311 a.fromlist(data2)
312 self.assertEqual(type(it), type(itorig))
313 self.assertEqual(list(it), data2)
314
315 # exhausted iterator
316 self.assertRaises(StopIteration, next, itorig)
317 d = pickle.dumps((itorig, orig), proto)
318 it, a = pickle.loads(d)
319 a.fromlist(data2)
Serhiy Storchakaab0d1982016-03-30 21:11:16 +0300320 self.assertEqual(list(it), [])
321
322 def test_exhausted_iterator(self):
323 a = array.array(self.typecode, self.example)
324 self.assertEqual(list(a), list(self.example))
325 exhit = iter(a)
326 empit = iter(a)
327 for x in exhit: # exhaust the iterator
328 next(empit) # not exhausted
329 a.append(self.outside)
330 self.assertEqual(list(exhit), [])
331 self.assertEqual(list(empit), [self.outside])
332 self.assertEqual(list(a), list(self.example) + [self.outside])
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000333
Walter Dörwald7fd94242003-05-18 00:47:47 +0000334 def test_insert(self):
335 a = array.array(self.typecode, self.example)
336 a.insert(0, self.example[0])
337 self.assertEqual(len(a), 1+len(self.example))
338 self.assertEqual(a[0], a[1])
339 self.assertRaises(TypeError, a.insert)
340 self.assertRaises(TypeError, a.insert, None)
Walter Dörwaldba39d9c2003-05-18 01:56:25 +0000341 self.assertRaises(TypeError, a.insert, 0, None)
Martin v. Löwis99866332002-03-01 10:27:01 +0000342
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000343 a = array.array(self.typecode, self.example)
344 a.insert(-1, self.example[0])
345 self.assertEqual(
346 a,
347 array.array(
348 self.typecode,
349 self.example[:-1] + self.example[:1] + self.example[-1:]
350 )
351 )
352
353 a = array.array(self.typecode, self.example)
354 a.insert(-1000, self.example[0])
355 self.assertEqual(
356 a,
357 array.array(self.typecode, self.example[:1] + self.example)
358 )
359
360 a = array.array(self.typecode, self.example)
361 a.insert(1000, self.example[0])
362 self.assertEqual(
363 a,
364 array.array(self.typecode, self.example + self.example[:1])
365 )
366
Walter Dörwald7fd94242003-05-18 00:47:47 +0000367 def test_tofromfile(self):
368 a = array.array(self.typecode, 2*self.example)
369 self.assertRaises(TypeError, a.tofile)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000370 support.unlink(support.TESTFN)
371 f = open(support.TESTFN, 'wb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000372 try:
373 a.tofile(f)
374 f.close()
375 b = array.array(self.typecode)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000376 f = open(support.TESTFN, 'rb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000377 self.assertRaises(TypeError, b.fromfile)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000378 b.fromfile(f, len(self.example))
379 self.assertEqual(b, array.array(self.typecode, self.example))
380 self.assertNotEqual(a, b)
Hirokazu Yamamoto54d0df62009-03-06 03:04:07 +0000381 self.assertRaises(EOFError, b.fromfile, f, len(self.example)+1)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000382 self.assertEqual(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000383 f.close()
384 finally:
385 if not f.closed:
386 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000387 support.unlink(support.TESTFN)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000388
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000389 def test_fromfile_ioerror(self):
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200390 # Issue #5395: Check if fromfile raises a proper OSError
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000391 # instead of EOFError.
392 a = array.array(self.typecode)
393 f = open(support.TESTFN, 'wb')
394 try:
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200395 self.assertRaises(OSError, a.fromfile, f, len(self.example))
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000396 finally:
397 f.close()
398 support.unlink(support.TESTFN)
399
Frank Wierzbicki17683432009-08-16 20:30:12 +0000400 def test_filewrite(self):
401 a = array.array(self.typecode, 2*self.example)
402 f = open(support.TESTFN, 'wb')
403 try:
404 f.write(a)
405 f.close()
406 b = array.array(self.typecode)
407 f = open(support.TESTFN, 'rb')
408 b.fromfile(f, len(self.example))
409 self.assertEqual(b, array.array(self.typecode, self.example))
410 self.assertNotEqual(a, b)
411 b.fromfile(f, len(self.example))
412 self.assertEqual(a, b)
413 f.close()
414 finally:
415 if not f.closed:
416 f.close()
417 support.unlink(support.TESTFN)
418
Walter Dörwald7fd94242003-05-18 00:47:47 +0000419 def test_tofromlist(self):
420 a = array.array(self.typecode, 2*self.example)
421 b = array.array(self.typecode)
422 self.assertRaises(TypeError, a.tolist, 42)
423 self.assertRaises(TypeError, b.fromlist)
424 self.assertRaises(TypeError, b.fromlist, 42)
425 self.assertRaises(TypeError, b.fromlist, [None])
426 b.fromlist(a.tolist())
427 self.assertEqual(a, b)
Fred Drake78334472000-06-28 17:50:51 +0000428
Walter Dörwald7fd94242003-05-18 00:47:47 +0000429 def test_tofromstring(self):
Brett Cannon1eb32c22014-10-10 16:26:45 -0400430 # Warnings not raised when arguments are incorrect as Argument Clinic
431 # handles that before the warning can be raised.
432 nb_warnings = 2
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000433 with warnings.catch_warnings(record=True) as r:
434 warnings.filterwarnings("always",
435 message=r"(to|from)string\(\) is deprecated",
436 category=DeprecationWarning)
437 a = array.array(self.typecode, 2*self.example)
438 b = array.array(self.typecode)
439 self.assertRaises(TypeError, a.tostring, 42)
440 self.assertRaises(TypeError, b.fromstring)
441 self.assertRaises(TypeError, b.fromstring, 42)
442 b.fromstring(a.tostring())
443 self.assertEqual(a, b)
444 if a.itemsize>1:
445 self.assertRaises(ValueError, b.fromstring, "x")
446 nb_warnings += 1
447 self.assertEqual(len(r), nb_warnings)
448
449 def test_tofrombytes(self):
Walter Dörwald7fd94242003-05-18 00:47:47 +0000450 a = array.array(self.typecode, 2*self.example)
451 b = array.array(self.typecode)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000452 self.assertRaises(TypeError, a.tobytes, 42)
453 self.assertRaises(TypeError, b.frombytes)
454 self.assertRaises(TypeError, b.frombytes, 42)
455 b.frombytes(a.tobytes())
456 c = array.array(self.typecode, bytearray(a.tobytes()))
Walter Dörwald7fd94242003-05-18 00:47:47 +0000457 self.assertEqual(a, b)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000458 self.assertEqual(a, c)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000459 if a.itemsize>1:
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000460 self.assertRaises(ValueError, b.frombytes, b"x")
Fred Drake78334472000-06-28 17:50:51 +0000461
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +0000462 def test_fromarray(self):
463 a = array.array(self.typecode, self.example)
464 b = array.array(self.typecode, a)
465 self.assertEqual(a, b)
466
Walter Dörwald7fd94242003-05-18 00:47:47 +0000467 def test_repr(self):
468 a = array.array(self.typecode, 2*self.example)
469 self.assertEqual(a, eval(repr(a), {"array": array.array}))
Fred Drake78334472000-06-28 17:50:51 +0000470
Walter Dörwald7fd94242003-05-18 00:47:47 +0000471 a = array.array(self.typecode)
472 self.assertEqual(repr(a), "array('%s')" % self.typecode)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000473
Walter Dörwald7fd94242003-05-18 00:47:47 +0000474 def test_str(self):
475 a = array.array(self.typecode, 2*self.example)
476 str(a)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000477
Walter Dörwald7fd94242003-05-18 00:47:47 +0000478 def test_cmp(self):
479 a = array.array(self.typecode, self.example)
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200480 self.assertIs(a == 42, False)
481 self.assertIs(a != 42, True)
Tim Peterscc78e472000-11-14 21:36:07 +0000482
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200483 self.assertIs(a == a, True)
484 self.assertIs(a != a, False)
485 self.assertIs(a < a, False)
486 self.assertIs(a <= a, True)
487 self.assertIs(a > a, False)
488 self.assertIs(a >= a, True)
Tim Peterscc78e472000-11-14 21:36:07 +0000489
Neal Norwitzbd2835c2006-03-17 08:54:15 +0000490 al = array.array(self.typecode, self.smallerexample)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000491 ab = array.array(self.typecode, self.biggerexample)
Guido van Rossum7f1d3aa1998-07-16 15:31:43 +0000492
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200493 self.assertIs(a == 2*a, False)
494 self.assertIs(a != 2*a, True)
495 self.assertIs(a < 2*a, True)
496 self.assertIs(a <= 2*a, True)
497 self.assertIs(a > 2*a, False)
498 self.assertIs(a >= 2*a, False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000499
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200500 self.assertIs(a == al, False)
501 self.assertIs(a != al, True)
502 self.assertIs(a < al, False)
503 self.assertIs(a <= al, False)
504 self.assertIs(a > al, True)
505 self.assertIs(a >= al, True)
Martin v. Löwis99866332002-03-01 10:27:01 +0000506
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200507 self.assertIs(a == ab, False)
508 self.assertIs(a != ab, True)
509 self.assertIs(a < ab, True)
510 self.assertIs(a <= ab, True)
511 self.assertIs(a > ab, False)
512 self.assertIs(a >= ab, False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000513
Walter Dörwald7fd94242003-05-18 00:47:47 +0000514 def test_add(self):
515 a = array.array(self.typecode, self.example) \
516 + array.array(self.typecode, self.example[::-1])
517 self.assertEqual(
518 a,
519 array.array(self.typecode, self.example + self.example[::-1])
520 )
Martin v. Löwis99866332002-03-01 10:27:01 +0000521
Walter Dörwald7fd94242003-05-18 00:47:47 +0000522 b = array.array(self.badtypecode())
523 self.assertRaises(TypeError, a.__add__, b)
524
525 self.assertRaises(TypeError, a.__add__, "bad")
526
527 def test_iadd(self):
528 a = array.array(self.typecode, self.example[::-1])
529 b = a
530 a += array.array(self.typecode, 2*self.example)
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200531 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000532 self.assertEqual(
533 a,
534 array.array(self.typecode, self.example[::-1]+2*self.example)
535 )
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000536 a = array.array(self.typecode, self.example)
537 a += a
538 self.assertEqual(
539 a,
540 array.array(self.typecode, self.example + self.example)
541 )
Walter Dörwald7fd94242003-05-18 00:47:47 +0000542
543 b = array.array(self.badtypecode())
544 self.assertRaises(TypeError, a.__add__, b)
545
546 self.assertRaises(TypeError, a.__iadd__, "bad")
547
548 def test_mul(self):
549 a = 5*array.array(self.typecode, self.example)
550 self.assertEqual(
551 a,
552 array.array(self.typecode, 5*self.example)
553 )
554
555 a = array.array(self.typecode, self.example)*5
556 self.assertEqual(
557 a,
558 array.array(self.typecode, self.example*5)
559 )
560
561 a = 0*array.array(self.typecode, self.example)
562 self.assertEqual(
563 a,
564 array.array(self.typecode)
565 )
566
567 a = (-1)*array.array(self.typecode, self.example)
568 self.assertEqual(
569 a,
570 array.array(self.typecode)
571 )
572
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000573 a = 5 * array.array(self.typecode, self.example[:1])
574 self.assertEqual(
575 a,
576 array.array(self.typecode, [a[0]] * 5)
577 )
578
Walter Dörwald7fd94242003-05-18 00:47:47 +0000579 self.assertRaises(TypeError, a.__mul__, "bad")
580
581 def test_imul(self):
582 a = array.array(self.typecode, self.example)
583 b = a
584
585 a *= 5
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200586 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000587 self.assertEqual(
588 a,
589 array.array(self.typecode, 5*self.example)
590 )
591
592 a *= 0
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200593 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000594 self.assertEqual(a, array.array(self.typecode))
595
596 a *= 1000
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200597 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000598 self.assertEqual(a, array.array(self.typecode))
599
600 a *= -1
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200601 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000602 self.assertEqual(a, array.array(self.typecode))
603
604 a = array.array(self.typecode, self.example)
605 a *= -1
606 self.assertEqual(a, array.array(self.typecode))
607
608 self.assertRaises(TypeError, a.__imul__, "bad")
609
610 def test_getitem(self):
611 a = array.array(self.typecode, self.example)
612 self.assertEntryEqual(a[0], self.example[0])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000613 self.assertEntryEqual(a[0], self.example[0])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000614 self.assertEntryEqual(a[-1], self.example[-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000615 self.assertEntryEqual(a[-1], self.example[-1])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000616 self.assertEntryEqual(a[len(self.example)-1], self.example[-1])
617 self.assertEntryEqual(a[-len(self.example)], self.example[0])
618 self.assertRaises(TypeError, a.__getitem__)
619 self.assertRaises(IndexError, a.__getitem__, len(self.example))
620 self.assertRaises(IndexError, a.__getitem__, -len(self.example)-1)
621
622 def test_setitem(self):
623 a = array.array(self.typecode, self.example)
624 a[0] = a[-1]
625 self.assertEntryEqual(a[0], a[-1])
626
627 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000628 a[0] = a[-1]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000629 self.assertEntryEqual(a[0], a[-1])
630
631 a = array.array(self.typecode, self.example)
632 a[-1] = a[0]
633 self.assertEntryEqual(a[0], a[-1])
634
635 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000636 a[-1] = a[0]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000637 self.assertEntryEqual(a[0], a[-1])
638
639 a = array.array(self.typecode, self.example)
640 a[len(self.example)-1] = a[0]
641 self.assertEntryEqual(a[0], a[-1])
642
643 a = array.array(self.typecode, self.example)
644 a[-len(self.example)] = a[-1]
645 self.assertEntryEqual(a[0], a[-1])
646
647 self.assertRaises(TypeError, a.__setitem__)
648 self.assertRaises(TypeError, a.__setitem__, None)
649 self.assertRaises(TypeError, a.__setitem__, 0, None)
650 self.assertRaises(
651 IndexError,
652 a.__setitem__,
653 len(self.example), self.example[0]
654 )
655 self.assertRaises(
656 IndexError,
657 a.__setitem__,
658 -len(self.example)-1, self.example[0]
659 )
660
661 def test_delitem(self):
662 a = array.array(self.typecode, self.example)
663 del a[0]
664 self.assertEqual(
665 a,
666 array.array(self.typecode, self.example[1:])
667 )
668
669 a = array.array(self.typecode, self.example)
670 del a[-1]
671 self.assertEqual(
672 a,
673 array.array(self.typecode, self.example[:-1])
674 )
675
676 a = array.array(self.typecode, self.example)
677 del a[len(self.example)-1]
678 self.assertEqual(
679 a,
680 array.array(self.typecode, self.example[:-1])
681 )
682
683 a = array.array(self.typecode, self.example)
684 del a[-len(self.example)]
685 self.assertEqual(
686 a,
687 array.array(self.typecode, self.example[1:])
688 )
689
690 self.assertRaises(TypeError, a.__delitem__)
691 self.assertRaises(TypeError, a.__delitem__, None)
692 self.assertRaises(IndexError, a.__delitem__, len(self.example))
693 self.assertRaises(IndexError, a.__delitem__, -len(self.example)-1)
694
695 def test_getslice(self):
696 a = array.array(self.typecode, self.example)
697 self.assertEqual(a[:], a)
698
699 self.assertEqual(
700 a[1:],
701 array.array(self.typecode, self.example[1:])
702 )
703
704 self.assertEqual(
705 a[:1],
706 array.array(self.typecode, self.example[:1])
707 )
708
709 self.assertEqual(
710 a[:-1],
711 array.array(self.typecode, self.example[:-1])
712 )
713
714 self.assertEqual(
715 a[-1:],
716 array.array(self.typecode, self.example[-1:])
717 )
718
719 self.assertEqual(
720 a[-1:-1],
721 array.array(self.typecode)
722 )
723
724 self.assertEqual(
Walter Dörwald1083c242005-01-21 21:16:51 +0000725 a[2:1],
726 array.array(self.typecode)
727 )
728
729 self.assertEqual(
Walter Dörwald7fd94242003-05-18 00:47:47 +0000730 a[1000:],
731 array.array(self.typecode)
732 )
733 self.assertEqual(a[-1000:], a)
734 self.assertEqual(a[:1000], a)
735 self.assertEqual(
736 a[:-1000],
737 array.array(self.typecode)
738 )
739 self.assertEqual(a[-1000:1000], a)
740 self.assertEqual(
741 a[2000:1000],
742 array.array(self.typecode)
743 )
744
Thomas Woutersed03b412007-08-28 21:37:11 +0000745 def test_extended_getslice(self):
746 # Test extended slicing by comparing with list slicing
747 # (Assumes list conversion works correctly, too)
748 a = array.array(self.typecode, self.example)
Zackery Spytz14514d92019-05-17 01:13:03 -0600749 indices = (0, None, 1, 3, 19, 100, sys.maxsize, -1, -2, -31, -100)
Thomas Woutersed03b412007-08-28 21:37:11 +0000750 for start in indices:
751 for stop in indices:
752 # Everything except the initial 0 (invalid step)
753 for step in indices[1:]:
754 self.assertEqual(list(a[start:stop:step]),
755 list(a)[start:stop:step])
756
Walter Dörwald7fd94242003-05-18 00:47:47 +0000757 def test_setslice(self):
758 a = array.array(self.typecode, self.example)
759 a[:1] = a
760 self.assertEqual(
761 a,
762 array.array(self.typecode, self.example + self.example[1:])
763 )
764
765 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000766 a[:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000767 self.assertEqual(
768 a,
769 array.array(self.typecode, self.example + self.example[-1:])
770 )
771
772 a = array.array(self.typecode, self.example)
773 a[-1:] = a
774 self.assertEqual(
775 a,
776 array.array(self.typecode, self.example[:-1] + self.example)
777 )
778
779 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000780 a[1:] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000781 self.assertEqual(
782 a,
783 array.array(self.typecode, self.example[:1] + self.example)
784 )
785
786 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000787 a[1:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000788 self.assertEqual(
789 a,
790 array.array(
791 self.typecode,
792 self.example[:1] + self.example + self.example[-1:]
793 )
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[-1000:] = a
805 self.assertEqual(
806 a,
807 array.array(self.typecode, self.example)
808 )
809
810 a = array.array(self.typecode, self.example)
811 a[:1000] = a
812 self.assertEqual(
813 a,
814 array.array(self.typecode, self.example)
815 )
816
817 a = array.array(self.typecode, self.example)
818 a[:-1000] = a
819 self.assertEqual(
820 a,
821 array.array(self.typecode, 2*self.example)
822 )
823
824 a = array.array(self.typecode, self.example)
825 a[1:0] = a
826 self.assertEqual(
827 a,
828 array.array(self.typecode, self.example[:1] + self.example + self.example[1:])
829 )
830
831 a = array.array(self.typecode, self.example)
832 a[2000:1000] = a
833 self.assertEqual(
834 a,
835 array.array(self.typecode, 2*self.example)
836 )
837
838 a = array.array(self.typecode, self.example)
Thomas Woutersed03b412007-08-28 21:37:11 +0000839 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), None)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000840 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), None)
841
842 b = array.array(self.badtypecode())
Thomas Woutersed03b412007-08-28 21:37:11 +0000843 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000844 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), b)
845
Thomas Woutersed03b412007-08-28 21:37:11 +0000846 def test_extended_set_del_slice(self):
Zackery Spytz14514d92019-05-17 01:13:03 -0600847 indices = (0, None, 1, 3, 19, 100, sys.maxsize, -1, -2, -31, -100)
Thomas Woutersed03b412007-08-28 21:37:11 +0000848 for start in indices:
849 for stop in indices:
850 # Everything except the initial 0 (invalid step)
851 for step in indices[1:]:
852 a = array.array(self.typecode, self.example)
853 L = list(a)
854 # Make sure we have a slice of exactly the right length,
855 # but with (hopefully) different data.
856 data = L[start:stop:step]
857 data.reverse()
858 L[start:stop:step] = data
859 a[start:stop:step] = array.array(self.typecode, data)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000860 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000861
862 del L[start:stop:step]
863 del a[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +0000864 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000865
Walter Dörwald7fd94242003-05-18 00:47:47 +0000866 def test_index(self):
867 example = 2*self.example
868 a = array.array(self.typecode, example)
869 self.assertRaises(TypeError, a.index)
870 for x in example:
871 self.assertEqual(a.index(x), example.index(x))
872 self.assertRaises(ValueError, a.index, None)
873 self.assertRaises(ValueError, a.index, self.outside)
874
875 def test_count(self):
876 example = 2*self.example
877 a = array.array(self.typecode, example)
878 self.assertRaises(TypeError, a.count)
879 for x in example:
880 self.assertEqual(a.count(x), example.count(x))
881 self.assertEqual(a.count(self.outside), 0)
882 self.assertEqual(a.count(None), 0)
883
884 def test_remove(self):
885 for x in self.example:
886 example = 2*self.example
887 a = array.array(self.typecode, example)
888 pos = example.index(x)
889 example2 = example[:pos] + example[pos+1:]
890 a.remove(x)
891 self.assertEqual(a, array.array(self.typecode, example2))
892
893 a = array.array(self.typecode, self.example)
894 self.assertRaises(ValueError, a.remove, self.outside)
895
896 self.assertRaises(ValueError, a.remove, None)
897
898 def test_pop(self):
899 a = array.array(self.typecode)
900 self.assertRaises(IndexError, a.pop)
901
902 a = array.array(self.typecode, 2*self.example)
903 self.assertRaises(TypeError, a.pop, 42, 42)
904 self.assertRaises(TypeError, a.pop, None)
905 self.assertRaises(IndexError, a.pop, len(a))
906 self.assertRaises(IndexError, a.pop, -len(a)-1)
907
908 self.assertEntryEqual(a.pop(0), self.example[0])
909 self.assertEqual(
910 a,
911 array.array(self.typecode, self.example[1:]+self.example)
912 )
913 self.assertEntryEqual(a.pop(1), self.example[2])
914 self.assertEqual(
915 a,
916 array.array(self.typecode, self.example[1:2]+self.example[3:]+self.example)
917 )
918 self.assertEntryEqual(a.pop(0), self.example[1])
919 self.assertEntryEqual(a.pop(), self.example[-1])
920 self.assertEqual(
921 a,
922 array.array(self.typecode, self.example[3:]+self.example[:-1])
923 )
924
925 def test_reverse(self):
926 a = array.array(self.typecode, self.example)
927 self.assertRaises(TypeError, a.reverse, 42)
Fred Drake004d5e62000-10-23 17:22:08 +0000928 a.reverse()
Walter Dörwald7fd94242003-05-18 00:47:47 +0000929 self.assertEqual(
930 a,
931 array.array(self.typecode, self.example[::-1])
932 )
933
934 def test_extend(self):
935 a = array.array(self.typecode, self.example)
936 self.assertRaises(TypeError, a.extend)
937 a.extend(array.array(self.typecode, self.example[::-1]))
938 self.assertEqual(
939 a,
940 array.array(self.typecode, self.example+self.example[::-1])
941 )
942
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000943 a = array.array(self.typecode, self.example)
944 a.extend(a)
945 self.assertEqual(
946 a,
947 array.array(self.typecode, self.example+self.example)
948 )
949
Walter Dörwald7fd94242003-05-18 00:47:47 +0000950 b = array.array(self.badtypecode())
951 self.assertRaises(TypeError, a.extend, b)
952
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000953 a = array.array(self.typecode, self.example)
954 a.extend(self.example[::-1])
955 self.assertEqual(
956 a,
957 array.array(self.typecode, self.example+self.example[::-1])
958 )
959
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +0000960 def test_constructor_with_iterable_argument(self):
961 a = array.array(self.typecode, iter(self.example))
962 b = array.array(self.typecode, self.example)
963 self.assertEqual(a, b)
964
965 # non-iterable argument
966 self.assertRaises(TypeError, array.array, self.typecode, 10)
967
968 # pass through errors raised in __iter__
969 class A:
970 def __iter__(self):
971 raise UnicodeError
972 self.assertRaises(UnicodeError, array.array, self.typecode, A())
973
974 # pass through errors raised in next()
975 def B():
976 raise UnicodeError
977 yield None
978 self.assertRaises(UnicodeError, array.array, self.typecode, B())
979
Walter Dörwald7fd94242003-05-18 00:47:47 +0000980 def test_coveritertraverse(self):
981 try:
982 import gc
983 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -0600984 self.skipTest('gc module not available')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000985 a = array.array(self.typecode)
986 l = [iter(a)]
987 l.append(l)
988 gc.collect()
989
990 def test_buffer(self):
991 a = array.array(self.typecode, self.example)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000992 m = memoryview(a)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000993 expected = m.tobytes()
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000994 self.assertEqual(a.tobytes(), expected)
995 self.assertEqual(a.tobytes()[0], expected[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000996 # Resizing is forbidden when there are buffer exports.
997 # For issue 4509, we also check after each error that
998 # the array was not modified.
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000999 self.assertRaises(BufferError, a.append, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001000 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001001 self.assertRaises(BufferError, a.extend, a[0:1])
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001002 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001003 self.assertRaises(BufferError, a.remove, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001004 self.assertEqual(m.tobytes(), expected)
1005 self.assertRaises(BufferError, a.pop, 0)
1006 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001007 self.assertRaises(BufferError, a.fromlist, a.tolist())
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001008 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001009 self.assertRaises(BufferError, a.frombytes, a.tobytes())
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001010 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001011 if self.typecode == 'u':
1012 self.assertRaises(BufferError, a.fromunicode, a.tounicode())
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001013 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +00001014 self.assertRaises(BufferError, operator.imul, a, 2)
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001015 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +00001016 self.assertRaises(BufferError, operator.imul, a, 0)
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001017 self.assertEqual(m.tobytes(), expected)
1018 self.assertRaises(BufferError, operator.setitem, a, slice(0, 0), a)
1019 self.assertEqual(m.tobytes(), expected)
1020 self.assertRaises(BufferError, operator.delitem, a, 0)
1021 self.assertEqual(m.tobytes(), expected)
1022 self.assertRaises(BufferError, operator.delitem, a, slice(0, 1))
1023 self.assertEqual(m.tobytes(), expected)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001024
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001025 def test_weakref(self):
1026 s = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001027 p = weakref.proxy(s)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001028 self.assertEqual(p.tobytes(), s.tobytes())
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001029 s = None
1030 self.assertRaises(ReferenceError, len, p)
1031
Serhiy Storchaka43767632013-11-03 21:31:38 +02001032 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
1033 'test needs sys.getrefcount()')
Skip Montanarod5cf0b82003-08-03 23:02:10 +00001034 def test_bug_782369(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +02001035 for i in range(10):
1036 b = array.array('B', range(64))
1037 rc = sys.getrefcount(10)
1038 for i in range(10):
1039 b = array.array('B', range(64))
1040 self.assertEqual(rc, sys.getrefcount(10))
Skip Montanarod5cf0b82003-08-03 23:02:10 +00001041
Thomas Woutersb2137042007-02-01 18:02:27 +00001042 def test_subclass_with_kwargs(self):
1043 # SF bug #1486663 -- this used to erroneously raise a TypeError
1044 ArraySubclassWithKwargs('b', newarg=1)
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001045
Guido van Rossum6b826ab2007-07-03 16:22:09 +00001046 def test_create_from_bytes(self):
Alexandre Vassalotti7e4f3212009-07-05 05:38:18 +00001047 # XXX This test probably needs to be moved in a subclass or
1048 # generalized to use self.typecode.
Guido van Rossum6b826ab2007-07-03 16:22:09 +00001049 a = array.array('H', b"1234")
1050 self.assertEqual(len(a) * a.itemsize, 4)
1051
Meador Inge03b4d502012-08-10 22:35:45 -05001052 @support.cpython_only
1053 def test_sizeof_with_buffer(self):
1054 a = array.array(self.typecode, self.example)
Meador Inge80dd1af2012-08-10 23:21:39 -05001055 basesize = support.calcvobjsize('Pn2Pi')
Meador Inge03b4d502012-08-10 22:35:45 -05001056 buffer_size = a.buffer_info()[1] * a.itemsize
1057 support.check_sizeof(self, a, basesize + buffer_size)
1058
1059 @support.cpython_only
1060 def test_sizeof_without_buffer(self):
1061 a = array.array(self.typecode)
Meador Inge80dd1af2012-08-10 23:21:39 -05001062 basesize = support.calcvobjsize('Pn2Pi')
Meador Inge03b4d502012-08-10 22:35:45 -05001063 support.check_sizeof(self, a, basesize)
1064
Alexandre Vassalotti9730e332013-11-29 20:47:15 -08001065 def test_initialize_with_unicode(self):
1066 if self.typecode != 'u':
1067 with self.assertRaises(TypeError) as cm:
1068 a = array.array(self.typecode, 'foo')
1069 self.assertIn("cannot use a str", str(cm.exception))
1070 with self.assertRaises(TypeError) as cm:
1071 a = array.array(self.typecode, array.array('u', 'foo'))
1072 self.assertIn("cannot use a unicode array", str(cm.exception))
1073 else:
1074 a = array.array(self.typecode, "foo")
1075 a = array.array(self.typecode, array.array('u', 'foo'))
1076
Stefan Krah650c1e82015-02-03 21:43:23 +01001077 @support.cpython_only
1078 def test_obsolete_write_lock(self):
1079 from _testcapi import getbuffer_with_null_view
1080 a = array.array('B', b"")
1081 self.assertRaises(BufferError, getbuffer_with_null_view, a)
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001082
Serhiy Storchakaab0d1982016-03-30 21:11:16 +03001083 def test_free_after_iterating(self):
1084 support.check_free_after_iterating(self, iter, array.array,
1085 (self.typecode,))
1086 support.check_free_after_iterating(self, reversed, array.array,
1087 (self.typecode,))
1088
Walter Dörwald7fd94242003-05-18 00:47:47 +00001089class StringTest(BaseTest):
1090
1091 def test_setitem(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001092 super().test_setitem()
Walter Dörwald7fd94242003-05-18 00:47:47 +00001093 a = array.array(self.typecode, self.example)
1094 self.assertRaises(TypeError, a.__setitem__, 0, self.example[:2])
1095
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001096class UnicodeTest(StringTest, unittest.TestCase):
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001097 typecode = 'u'
1098 example = '\x01\u263a\x00\ufeff'
1099 smallerexample = '\x01\u263a\x00\ufefe'
1100 biggerexample = '\x01\u263a\x01\ufeff'
1101 outside = str('\x33')
Victor Stinner8d4734f2012-08-08 20:09:21 +02001102 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001103
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001104 def test_unicode(self):
1105 self.assertRaises(TypeError, array.array, 'b', 'foo')
Walter Dörwald7fd94242003-05-18 00:47:47 +00001106
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001107 a = array.array('u', '\xa0\xc2\u1234')
1108 a.fromunicode(' ')
1109 a.fromunicode('')
1110 a.fromunicode('')
1111 a.fromunicode('\x11abc\xff\u1234')
1112 s = a.tounicode()
1113 self.assertEqual(s, '\xa0\xc2\u1234 \x11abc\xff\u1234')
Victor Stinner9d512ab2012-08-09 00:43:56 +02001114 self.assertEqual(a.itemsize, sizeof_wchar)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001115
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001116 s = '\x00="\'a\\b\x80\xff\u0000\u0001\u1234'
1117 a = array.array('u', s)
1118 self.assertEqual(
1119 repr(a),
Georg Brandl559e5d72008-06-11 18:37:52 +00001120 "array('u', '\\x00=\"\\'a\\\\b\\x80\xff\\x00\\x01\u1234')")
Walter Dörwald7fd94242003-05-18 00:47:47 +00001121
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001122 self.assertRaises(TypeError, a.fromunicode)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001123
Victor Stinner29ec5952013-02-26 00:27:38 +01001124 def test_issue17223(self):
1125 # this used to crash
Victor Stinnerc472c5d2013-02-26 22:52:11 +01001126 if sizeof_wchar == 4:
1127 # U+FFFFFFFF is an invalid code point in Unicode 6.0
1128 invalid_str = b'\xff\xff\xff\xff'
1129 else:
Victor Stinner29c00342013-03-08 02:33:06 +01001130 # PyUnicode_FromUnicode() cannot fail with 16-bit wchar_t
1131 self.skipTest("specific to 32-bit wchar_t")
Victor Stinnerc472c5d2013-02-26 22:52:11 +01001132 a = array.array('u', invalid_str)
Victor Stinner29ec5952013-02-26 00:27:38 +01001133 self.assertRaises(ValueError, a.tounicode)
1134 self.assertRaises(ValueError, str, a)
1135
Walter Dörwald7fd94242003-05-18 00:47:47 +00001136class NumberTest(BaseTest):
1137
1138 def test_extslice(self):
1139 a = array.array(self.typecode, range(5))
1140 self.assertEqual(a[::], a)
1141 self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
1142 self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
1143 self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
1144 self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
1145 self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
1146 self.assertEqual(a[-100:100:], a)
1147 self.assertEqual(a[100:-100:-1], a[::-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +00001148 self.assertEqual(a[-100:100:2], array.array(self.typecode, [0,2,4]))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001149 self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
1150 self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
1151
1152 def test_delslice(self):
1153 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001154 del a[::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001155 self.assertEqual(a, array.array(self.typecode, [1,3]))
1156 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001157 del a[1::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001158 self.assertEqual(a, array.array(self.typecode, [0,2,4]))
1159 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001160 del a[1::-2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001161 self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
1162 a = array.array(self.typecode, range(10))
Michael W. Hudson56796f62002-07-29 14:35:04 +00001163 del a[::1000]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001164 self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
Mark Dickinsonbc099642010-01-29 17:27:24 +00001165 # test issue7788
1166 a = array.array(self.typecode, range(10))
1167 del a[9::1<<333]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001168
1169 def test_assignment(self):
1170 a = array.array(self.typecode, range(10))
1171 a[::2] = array.array(self.typecode, [42]*5)
1172 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
1173 a = array.array(self.typecode, range(10))
1174 a[::-4] = array.array(self.typecode, [10]*3)
1175 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
1176 a = array.array(self.typecode, range(4))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001177 a[::-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +00001178 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
1179 a = array.array(self.typecode, range(10))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001180 b = a[:]
1181 c = a[:]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001182 ins = array.array(self.typecode, range(2))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001183 a[2:3] = ins
1184 b[slice(2,3)] = ins
1185 c[2:3:] = ins
Fred Drake004d5e62000-10-23 17:22:08 +00001186
Walter Dörwald7fd94242003-05-18 00:47:47 +00001187 def test_iterationcontains(self):
1188 a = array.array(self.typecode, range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +00001189 self.assertEqual(list(a), list(range(10)))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001190 b = array.array(self.typecode, [20])
1191 self.assertEqual(a[-1] in a, True)
1192 self.assertEqual(b[0] not in a, True)
1193
1194 def check_overflow(self, lower, upper):
1195 # method to be used by subclasses
1196
1197 # should not overflow assigning lower limit
1198 a = array.array(self.typecode, [lower])
1199 a[0] = lower
1200 # should overflow assigning less than lower limit
1201 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
1202 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
1203 # should not overflow assigning upper limit
1204 a = array.array(self.typecode, [upper])
1205 a[0] = upper
1206 # should overflow assigning more than upper limit
1207 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
1208 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
1209
1210 def test_subclassing(self):
1211 typecode = self.typecode
1212 class ExaggeratingArray(array.array):
1213 __slots__ = ['offset']
1214
1215 def __new__(cls, typecode, data, offset):
1216 return array.array.__new__(cls, typecode, data)
1217
1218 def __init__(self, typecode, data, offset):
1219 self.offset = offset
1220
1221 def __getitem__(self, i):
1222 return array.array.__getitem__(self, i) + self.offset
1223
1224 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
1225 self.assertEntryEqual(a[0], 7)
1226
1227 self.assertRaises(AttributeError, setattr, a, "color", "blue")
1228
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00001229 def test_frombytearray(self):
1230 a = array.array('b', range(10))
1231 b = array.array(self.typecode, a)
1232 self.assertEqual(a, b)
1233
orenmn964281a2017-03-09 11:35:28 +02001234class IntegerNumberTest(NumberTest):
1235 def test_type_error(self):
1236 a = array.array(self.typecode)
1237 a.append(42)
1238 with self.assertRaises(TypeError):
1239 a.append(42.0)
1240 with self.assertRaises(TypeError):
1241 a[0] = 42.0
1242
1243class Intable:
1244 def __init__(self, num):
1245 self._num = num
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +02001246 def __index__(self):
1247 return self._num
orenmn964281a2017-03-09 11:35:28 +02001248 def __int__(self):
1249 return self._num
1250 def __sub__(self, other):
1251 return Intable(int(self) - int(other))
1252 def __add__(self, other):
1253 return Intable(int(self) + int(other))
1254
1255class SignedNumberTest(IntegerNumberTest):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001256 example = [-1, 0, 1, 42, 0x7f]
1257 smallerexample = [-1, 0, 1, 42, 0x7e]
1258 biggerexample = [-1, 0, 1, 43, 0x7f]
1259 outside = 23
1260
1261 def test_overflow(self):
1262 a = array.array(self.typecode)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001263 lower = -1 * int(pow(2, a.itemsize * 8 - 1))
1264 upper = int(pow(2, a.itemsize * 8 - 1)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001265 self.check_overflow(lower, upper)
orenmn964281a2017-03-09 11:35:28 +02001266 self.check_overflow(Intable(lower), Intable(upper))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001267
orenmn964281a2017-03-09 11:35:28 +02001268class UnsignedNumberTest(IntegerNumberTest):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001269 example = [0, 1, 17, 23, 42, 0xff]
1270 smallerexample = [0, 1, 17, 23, 42, 0xfe]
1271 biggerexample = [0, 1, 17, 23, 43, 0xff]
1272 outside = 0xaa
1273
1274 def test_overflow(self):
1275 a = array.array(self.typecode)
1276 lower = 0
Guido van Rossume2a383d2007-01-15 16:59:06 +00001277 upper = int(pow(2, a.itemsize * 8)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001278 self.check_overflow(lower, upper)
orenmn964281a2017-03-09 11:35:28 +02001279 self.check_overflow(Intable(lower), Intable(upper))
Fred Drake004d5e62000-10-23 17:22:08 +00001280
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001281 def test_bytes_extend(self):
1282 s = bytes(self.example)
1283
1284 a = array.array(self.typecode, self.example)
1285 a.extend(s)
1286 self.assertEqual(
1287 a,
1288 array.array(self.typecode, self.example+self.example)
1289 )
1290
1291 a = array.array(self.typecode, self.example)
1292 a.extend(bytearray(reversed(s)))
1293 self.assertEqual(
1294 a,
1295 array.array(self.typecode, self.example+self.example[::-1])
1296 )
1297
Fred Drake004d5e62000-10-23 17:22:08 +00001298
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001299class ByteTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001300 typecode = 'b'
1301 minitemsize = 1
Fred Drake004d5e62000-10-23 17:22:08 +00001302
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001303class UnsignedByteTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001304 typecode = 'B'
1305 minitemsize = 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001306
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001307class ShortTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001308 typecode = 'h'
1309 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001310
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001311class UnsignedShortTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001312 typecode = 'H'
1313 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001314
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001315class IntTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001316 typecode = 'i'
1317 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001318
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001319class UnsignedIntTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001320 typecode = 'I'
1321 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001322
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001323class LongTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001324 typecode = 'l'
1325 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001326
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001327class UnsignedLongTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001328 typecode = 'L'
1329 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001330
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001331class LongLongTest(SignedNumberTest, unittest.TestCase):
Meador Inge1c9f0c92011-09-20 19:55:51 -05001332 typecode = 'q'
1333 minitemsize = 8
Meador Inge1c9f0c92011-09-20 19:55:51 -05001334
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001335class UnsignedLongLongTest(UnsignedNumberTest, unittest.TestCase):
Meador Inge1c9f0c92011-09-20 19:55:51 -05001336 typecode = 'Q'
1337 minitemsize = 8
Meador Inge1c9f0c92011-09-20 19:55:51 -05001338
Walter Dörwald7fd94242003-05-18 00:47:47 +00001339class FPTest(NumberTest):
1340 example = [-42.0, 0, 42, 1e5, -1e10]
1341 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
1342 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
1343 outside = 23
1344
1345 def assertEntryEqual(self, entry1, entry2):
1346 self.assertAlmostEqual(entry1, entry2)
1347
Adrian Wielgosik7c17e232017-08-17 12:46:06 +00001348 def test_nan(self):
1349 a = array.array(self.typecode, [float('nan')])
1350 b = array.array(self.typecode, [float('nan')])
1351 self.assertIs(a != b, True)
1352 self.assertIs(a == b, False)
1353 self.assertIs(a > b, False)
1354 self.assertIs(a >= b, False)
1355 self.assertIs(a < b, False)
1356 self.assertIs(a <= b, False)
1357
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001358 def test_byteswap(self):
1359 a = array.array(self.typecode, self.example)
1360 self.assertRaises(TypeError, a.byteswap, 42)
1361 if a.itemsize in (1, 2, 4, 8):
1362 b = array.array(self.typecode, self.example)
1363 b.byteswap()
1364 if a.itemsize==1:
1365 self.assertEqual(a, b)
1366 else:
1367 # On alphas treating the byte swapped bit patters as
1368 # floats/doubles results in floating point exceptions
1369 # => compare the 8bit string values instead
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001370 self.assertNotEqual(a.tobytes(), b.tobytes())
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001371 b.byteswap()
1372 self.assertEqual(a, b)
1373
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001374class FloatTest(FPTest, unittest.TestCase):
Neal Norwitz35c6cd02003-05-22 13:29:15 +00001375 typecode = 'f'
1376 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001377
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001378class DoubleTest(FPTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001379 typecode = 'd'
1380 minitemsize = 8
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001381
1382 def test_alloc_overflow(self):
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001383 from sys import maxsize
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001384 a = array.array('d', [-1]*65536)
1385 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001386 a *= maxsize//65536 + 1
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001387 except MemoryError:
1388 pass
1389 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001390 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001391 b = array.array('d', [ 2.71828183, 3.14159265, -1])
1392 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001393 b * (maxsize//3 + 1)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001394 except MemoryError:
1395 pass
1396 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001397 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001398
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001399
sthaa3ecb82019-03-20 20:49:39 +01001400class LargeArrayTest(unittest.TestCase):
1401 typecode = 'b'
1402
1403 def example(self, size):
1404 # We assess a base memuse of <=2.125 for constructing this array
1405 base = array.array(self.typecode, [0, 1, 2, 3, 4, 5, 6, 7]) * (size // 8)
1406 base += array.array(self.typecode, [99]*(size % 8) + [8, 9, 10, 11])
1407 return base
1408
1409 @support.bigmemtest(_2G, memuse=2.125)
1410 def test_example_data(self, size):
1411 example = self.example(size)
1412 self.assertEqual(len(example), size+4)
1413
1414 @support.bigmemtest(_2G, memuse=2.125)
1415 def test_access(self, size):
1416 example = self.example(size)
1417 self.assertEqual(example[0], 0)
1418 self.assertEqual(example[-(size+4)], 0)
1419 self.assertEqual(example[size], 8)
1420 self.assertEqual(example[-4], 8)
1421 self.assertEqual(example[size+3], 11)
1422 self.assertEqual(example[-1], 11)
1423
1424 @support.bigmemtest(_2G, memuse=2.125+1)
1425 def test_slice(self, size):
1426 example = self.example(size)
1427 self.assertEqual(list(example[:4]), [0, 1, 2, 3])
1428 self.assertEqual(list(example[-4:]), [8, 9, 10, 11])
1429 part = example[1:-1]
1430 self.assertEqual(len(part), size+2)
1431 self.assertEqual(part[0], 1)
1432 self.assertEqual(part[-1], 10)
1433 del part
1434 part = example[::2]
1435 self.assertEqual(len(part), (size+5)//2)
1436 self.assertEqual(list(part[:4]), [0, 2, 4, 6])
1437 if size % 2:
1438 self.assertEqual(list(part[-2:]), [9, 11])
1439 else:
1440 self.assertEqual(list(part[-2:]), [8, 10])
1441
1442 @support.bigmemtest(_2G, memuse=2.125)
1443 def test_count(self, size):
1444 example = self.example(size)
1445 self.assertEqual(example.count(0), size//8)
1446 self.assertEqual(example.count(11), 1)
1447
1448 @support.bigmemtest(_2G, memuse=2.125)
1449 def test_append(self, size):
1450 example = self.example(size)
1451 example.append(12)
1452 self.assertEqual(example[-1], 12)
1453
1454 @support.bigmemtest(_2G, memuse=2.125)
1455 def test_extend(self, size):
1456 example = self.example(size)
1457 example.extend(iter([12, 13, 14, 15]))
1458 self.assertEqual(len(example), size+8)
1459 self.assertEqual(list(example[-8:]), [8, 9, 10, 11, 12, 13, 14, 15])
1460
1461 @support.bigmemtest(_2G, memuse=2.125)
1462 def test_frombytes(self, size):
1463 example = self.example(size)
1464 example.frombytes(b'abcd')
1465 self.assertEqual(len(example), size+8)
1466 self.assertEqual(list(example[-8:]), [8, 9, 10, 11] + list(b'abcd'))
1467
1468 @support.bigmemtest(_2G, memuse=2.125)
1469 def test_fromlist(self, size):
1470 example = self.example(size)
1471 example.fromlist([12, 13, 14, 15])
1472 self.assertEqual(len(example), size+8)
1473 self.assertEqual(list(example[-8:]), [8, 9, 10, 11, 12, 13, 14, 15])
1474
1475 @support.bigmemtest(_2G, memuse=2.125)
1476 def test_index(self, size):
1477 example = self.example(size)
1478 self.assertEqual(example.index(0), 0)
1479 self.assertEqual(example.index(1), 1)
1480 self.assertEqual(example.index(7), 7)
1481 self.assertEqual(example.index(11), size+3)
1482
1483 @support.bigmemtest(_2G, memuse=2.125)
1484 def test_insert(self, size):
1485 example = self.example(size)
1486 example.insert(0, 12)
1487 example.insert(10, 13)
1488 example.insert(size+1, 14)
1489 self.assertEqual(len(example), size+7)
1490 self.assertEqual(example[0], 12)
1491 self.assertEqual(example[10], 13)
1492 self.assertEqual(example[size+1], 14)
1493
1494 @support.bigmemtest(_2G, memuse=2.125)
1495 def test_pop(self, size):
1496 example = self.example(size)
1497 self.assertEqual(example.pop(0), 0)
1498 self.assertEqual(example[0], 1)
1499 self.assertEqual(example.pop(size+1), 10)
1500 self.assertEqual(example[size+1], 11)
1501 self.assertEqual(example.pop(1), 2)
1502 self.assertEqual(example[1], 3)
1503 self.assertEqual(len(example), size+1)
1504 self.assertEqual(example.pop(), 11)
1505 self.assertEqual(len(example), size)
1506
1507 @support.bigmemtest(_2G, memuse=2.125)
1508 def test_remove(self, size):
1509 example = self.example(size)
1510 example.remove(0)
1511 self.assertEqual(len(example), size+3)
1512 self.assertEqual(example[0], 1)
1513 example.remove(10)
1514 self.assertEqual(len(example), size+2)
1515 self.assertEqual(example[size], 9)
1516 self.assertEqual(example[size+1], 11)
1517
1518 @support.bigmemtest(_2G, memuse=2.125)
1519 def test_reverse(self, size):
1520 example = self.example(size)
1521 example.reverse()
1522 self.assertEqual(len(example), size+4)
1523 self.assertEqual(example[0], 11)
1524 self.assertEqual(example[3], 8)
1525 self.assertEqual(example[-1], 0)
1526 example.reverse()
1527 self.assertEqual(len(example), size+4)
1528 self.assertEqual(list(example[:4]), [0, 1, 2, 3])
1529 self.assertEqual(list(example[-4:]), [8, 9, 10, 11])
1530
1531 # list takes about 9 bytes per element
1532 @support.bigmemtest(_2G, memuse=2.125+9)
1533 def test_tolist(self, size):
1534 example = self.example(size)
1535 ls = example.tolist()
1536 self.assertEqual(len(ls), len(example))
1537 self.assertEqual(ls[:8], list(example[:8]))
1538 self.assertEqual(ls[-8:], list(example[-8:]))
1539
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001540if __name__ == "__main__":
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001541 unittest.main()