blob: 6af90dfb871d7985f1b269acc918c8134ae1ca72 [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
Hai Shif7ba40b2020-06-25 18:38:51 +08007from test.support import os_helper
sthaa3ecb82019-03-20 20:49:39 +01008from test.support import _2G
Alexandre Vassalottiad077152009-07-15 17:49:23 +00009import weakref
10import pickle
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +000011import operator
Alexandre Vassalottiad077152009-07-15 17:49:23 +000012import struct
Serhiy Storchaka43767632013-11-03 21:31:38 +020013import sys
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)
Hai Shif7ba40b2020-06-25 18:38:51 +0800370 os_helper.unlink(os_helper.TESTFN)
371 f = open(os_helper.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)
Hai Shif7ba40b2020-06-25 18:38:51 +0800376 f = open(os_helper.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()
Hai Shif7ba40b2020-06-25 18:38:51 +0800387 os_helper.unlink(os_helper.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)
Hai Shif7ba40b2020-06-25 18:38:51 +0800393 f = open(os_helper.TESTFN, 'wb')
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000394 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()
Hai Shif7ba40b2020-06-25 18:38:51 +0800398 os_helper.unlink(os_helper.TESTFN)
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000399
Frank Wierzbicki17683432009-08-16 20:30:12 +0000400 def test_filewrite(self):
401 a = array.array(self.typecode, 2*self.example)
Hai Shif7ba40b2020-06-25 18:38:51 +0800402 f = open(os_helper.TESTFN, 'wb')
Frank Wierzbicki17683432009-08-16 20:30:12 +0000403 try:
404 f.write(a)
405 f.close()
406 b = array.array(self.typecode)
Hai Shif7ba40b2020-06-25 18:38:51 +0800407 f = open(os_helper.TESTFN, 'rb')
Frank Wierzbicki17683432009-08-16 20:30:12 +0000408 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()
Hai Shif7ba40b2020-06-25 18:38:51 +0800417 os_helper.unlink(os_helper.TESTFN)
Frank Wierzbicki17683432009-08-16 20:30:12 +0000418
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
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000429 def test_tofrombytes(self):
Walter Dörwald7fd94242003-05-18 00:47:47 +0000430 a = array.array(self.typecode, 2*self.example)
431 b = array.array(self.typecode)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000432 self.assertRaises(TypeError, a.tobytes, 42)
433 self.assertRaises(TypeError, b.frombytes)
434 self.assertRaises(TypeError, b.frombytes, 42)
435 b.frombytes(a.tobytes())
436 c = array.array(self.typecode, bytearray(a.tobytes()))
Walter Dörwald7fd94242003-05-18 00:47:47 +0000437 self.assertEqual(a, b)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000438 self.assertEqual(a, c)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000439 if a.itemsize>1:
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000440 self.assertRaises(ValueError, b.frombytes, b"x")
Fred Drake78334472000-06-28 17:50:51 +0000441
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +0000442 def test_fromarray(self):
443 a = array.array(self.typecode, self.example)
444 b = array.array(self.typecode, a)
445 self.assertEqual(a, b)
446
Walter Dörwald7fd94242003-05-18 00:47:47 +0000447 def test_repr(self):
448 a = array.array(self.typecode, 2*self.example)
449 self.assertEqual(a, eval(repr(a), {"array": array.array}))
Fred Drake78334472000-06-28 17:50:51 +0000450
Walter Dörwald7fd94242003-05-18 00:47:47 +0000451 a = array.array(self.typecode)
452 self.assertEqual(repr(a), "array('%s')" % self.typecode)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000453
Walter Dörwald7fd94242003-05-18 00:47:47 +0000454 def test_str(self):
455 a = array.array(self.typecode, 2*self.example)
456 str(a)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000457
Walter Dörwald7fd94242003-05-18 00:47:47 +0000458 def test_cmp(self):
459 a = array.array(self.typecode, self.example)
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200460 self.assertIs(a == 42, False)
461 self.assertIs(a != 42, True)
Tim Peterscc78e472000-11-14 21:36:07 +0000462
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200463 self.assertIs(a == a, True)
464 self.assertIs(a != a, False)
465 self.assertIs(a < a, False)
466 self.assertIs(a <= a, True)
467 self.assertIs(a > a, False)
468 self.assertIs(a >= a, True)
Tim Peterscc78e472000-11-14 21:36:07 +0000469
Neal Norwitzbd2835c2006-03-17 08:54:15 +0000470 al = array.array(self.typecode, self.smallerexample)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000471 ab = array.array(self.typecode, self.biggerexample)
Guido van Rossum7f1d3aa1998-07-16 15:31:43 +0000472
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200473 self.assertIs(a == 2*a, False)
474 self.assertIs(a != 2*a, True)
475 self.assertIs(a < 2*a, True)
476 self.assertIs(a <= 2*a, True)
477 self.assertIs(a > 2*a, False)
478 self.assertIs(a >= 2*a, False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000479
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200480 self.assertIs(a == al, False)
481 self.assertIs(a != al, True)
482 self.assertIs(a < al, False)
483 self.assertIs(a <= al, False)
484 self.assertIs(a > al, True)
485 self.assertIs(a >= al, True)
Martin v. Löwis99866332002-03-01 10:27:01 +0000486
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200487 self.assertIs(a == ab, False)
488 self.assertIs(a != ab, True)
489 self.assertIs(a < ab, True)
490 self.assertIs(a <= ab, True)
491 self.assertIs(a > ab, False)
492 self.assertIs(a >= ab, False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000493
Walter Dörwald7fd94242003-05-18 00:47:47 +0000494 def test_add(self):
495 a = array.array(self.typecode, self.example) \
496 + array.array(self.typecode, self.example[::-1])
497 self.assertEqual(
498 a,
499 array.array(self.typecode, self.example + self.example[::-1])
500 )
Martin v. Löwis99866332002-03-01 10:27:01 +0000501
Walter Dörwald7fd94242003-05-18 00:47:47 +0000502 b = array.array(self.badtypecode())
503 self.assertRaises(TypeError, a.__add__, b)
504
505 self.assertRaises(TypeError, a.__add__, "bad")
506
507 def test_iadd(self):
508 a = array.array(self.typecode, self.example[::-1])
509 b = a
510 a += array.array(self.typecode, 2*self.example)
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200511 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000512 self.assertEqual(
513 a,
514 array.array(self.typecode, self.example[::-1]+2*self.example)
515 )
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000516 a = array.array(self.typecode, self.example)
517 a += a
518 self.assertEqual(
519 a,
520 array.array(self.typecode, self.example + self.example)
521 )
Walter Dörwald7fd94242003-05-18 00:47:47 +0000522
523 b = array.array(self.badtypecode())
524 self.assertRaises(TypeError, a.__add__, b)
525
526 self.assertRaises(TypeError, a.__iadd__, "bad")
527
528 def test_mul(self):
529 a = 5*array.array(self.typecode, self.example)
530 self.assertEqual(
531 a,
532 array.array(self.typecode, 5*self.example)
533 )
534
535 a = array.array(self.typecode, self.example)*5
536 self.assertEqual(
537 a,
538 array.array(self.typecode, self.example*5)
539 )
540
541 a = 0*array.array(self.typecode, self.example)
542 self.assertEqual(
543 a,
544 array.array(self.typecode)
545 )
546
547 a = (-1)*array.array(self.typecode, self.example)
548 self.assertEqual(
549 a,
550 array.array(self.typecode)
551 )
552
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000553 a = 5 * array.array(self.typecode, self.example[:1])
554 self.assertEqual(
555 a,
556 array.array(self.typecode, [a[0]] * 5)
557 )
558
Walter Dörwald7fd94242003-05-18 00:47:47 +0000559 self.assertRaises(TypeError, a.__mul__, "bad")
560
561 def test_imul(self):
562 a = array.array(self.typecode, self.example)
563 b = a
564
565 a *= 5
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200566 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000567 self.assertEqual(
568 a,
569 array.array(self.typecode, 5*self.example)
570 )
571
572 a *= 0
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200573 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000574 self.assertEqual(a, array.array(self.typecode))
575
576 a *= 1000
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200577 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000578 self.assertEqual(a, array.array(self.typecode))
579
580 a *= -1
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200581 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000582 self.assertEqual(a, array.array(self.typecode))
583
584 a = array.array(self.typecode, self.example)
585 a *= -1
586 self.assertEqual(a, array.array(self.typecode))
587
588 self.assertRaises(TypeError, a.__imul__, "bad")
589
590 def test_getitem(self):
591 a = array.array(self.typecode, self.example)
592 self.assertEntryEqual(a[0], self.example[0])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000593 self.assertEntryEqual(a[0], self.example[0])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000594 self.assertEntryEqual(a[-1], self.example[-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000595 self.assertEntryEqual(a[-1], self.example[-1])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000596 self.assertEntryEqual(a[len(self.example)-1], self.example[-1])
597 self.assertEntryEqual(a[-len(self.example)], self.example[0])
598 self.assertRaises(TypeError, a.__getitem__)
599 self.assertRaises(IndexError, a.__getitem__, len(self.example))
600 self.assertRaises(IndexError, a.__getitem__, -len(self.example)-1)
601
602 def test_setitem(self):
603 a = array.array(self.typecode, self.example)
604 a[0] = a[-1]
605 self.assertEntryEqual(a[0], a[-1])
606
607 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000608 a[0] = a[-1]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000609 self.assertEntryEqual(a[0], a[-1])
610
611 a = array.array(self.typecode, self.example)
612 a[-1] = a[0]
613 self.assertEntryEqual(a[0], a[-1])
614
615 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000616 a[-1] = a[0]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000617 self.assertEntryEqual(a[0], a[-1])
618
619 a = array.array(self.typecode, self.example)
620 a[len(self.example)-1] = a[0]
621 self.assertEntryEqual(a[0], a[-1])
622
623 a = array.array(self.typecode, self.example)
624 a[-len(self.example)] = a[-1]
625 self.assertEntryEqual(a[0], a[-1])
626
627 self.assertRaises(TypeError, a.__setitem__)
628 self.assertRaises(TypeError, a.__setitem__, None)
629 self.assertRaises(TypeError, a.__setitem__, 0, None)
630 self.assertRaises(
631 IndexError,
632 a.__setitem__,
633 len(self.example), self.example[0]
634 )
635 self.assertRaises(
636 IndexError,
637 a.__setitem__,
638 -len(self.example)-1, self.example[0]
639 )
640
641 def test_delitem(self):
642 a = array.array(self.typecode, self.example)
643 del a[0]
644 self.assertEqual(
645 a,
646 array.array(self.typecode, self.example[1:])
647 )
648
649 a = array.array(self.typecode, self.example)
650 del a[-1]
651 self.assertEqual(
652 a,
653 array.array(self.typecode, self.example[:-1])
654 )
655
656 a = array.array(self.typecode, self.example)
657 del a[len(self.example)-1]
658 self.assertEqual(
659 a,
660 array.array(self.typecode, self.example[:-1])
661 )
662
663 a = array.array(self.typecode, self.example)
664 del a[-len(self.example)]
665 self.assertEqual(
666 a,
667 array.array(self.typecode, self.example[1:])
668 )
669
670 self.assertRaises(TypeError, a.__delitem__)
671 self.assertRaises(TypeError, a.__delitem__, None)
672 self.assertRaises(IndexError, a.__delitem__, len(self.example))
673 self.assertRaises(IndexError, a.__delitem__, -len(self.example)-1)
674
675 def test_getslice(self):
676 a = array.array(self.typecode, self.example)
677 self.assertEqual(a[:], a)
678
679 self.assertEqual(
680 a[1:],
681 array.array(self.typecode, self.example[1:])
682 )
683
684 self.assertEqual(
685 a[:1],
686 array.array(self.typecode, self.example[:1])
687 )
688
689 self.assertEqual(
690 a[:-1],
691 array.array(self.typecode, self.example[:-1])
692 )
693
694 self.assertEqual(
695 a[-1:],
696 array.array(self.typecode, self.example[-1:])
697 )
698
699 self.assertEqual(
700 a[-1:-1],
701 array.array(self.typecode)
702 )
703
704 self.assertEqual(
Walter Dörwald1083c242005-01-21 21:16:51 +0000705 a[2:1],
706 array.array(self.typecode)
707 )
708
709 self.assertEqual(
Walter Dörwald7fd94242003-05-18 00:47:47 +0000710 a[1000:],
711 array.array(self.typecode)
712 )
713 self.assertEqual(a[-1000:], a)
714 self.assertEqual(a[:1000], a)
715 self.assertEqual(
716 a[:-1000],
717 array.array(self.typecode)
718 )
719 self.assertEqual(a[-1000:1000], a)
720 self.assertEqual(
721 a[2000:1000],
722 array.array(self.typecode)
723 )
724
Thomas Woutersed03b412007-08-28 21:37:11 +0000725 def test_extended_getslice(self):
726 # Test extended slicing by comparing with list slicing
727 # (Assumes list conversion works correctly, too)
728 a = array.array(self.typecode, self.example)
Zackery Spytz14514d92019-05-17 01:13:03 -0600729 indices = (0, None, 1, 3, 19, 100, sys.maxsize, -1, -2, -31, -100)
Thomas Woutersed03b412007-08-28 21:37:11 +0000730 for start in indices:
731 for stop in indices:
732 # Everything except the initial 0 (invalid step)
733 for step in indices[1:]:
734 self.assertEqual(list(a[start:stop:step]),
735 list(a)[start:stop:step])
736
Walter Dörwald7fd94242003-05-18 00:47:47 +0000737 def test_setslice(self):
738 a = array.array(self.typecode, self.example)
739 a[:1] = a
740 self.assertEqual(
741 a,
742 array.array(self.typecode, self.example + self.example[1:])
743 )
744
745 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000746 a[:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000747 self.assertEqual(
748 a,
749 array.array(self.typecode, self.example + self.example[-1:])
750 )
751
752 a = array.array(self.typecode, self.example)
753 a[-1:] = a
754 self.assertEqual(
755 a,
756 array.array(self.typecode, self.example[:-1] + self.example)
757 )
758
759 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000760 a[1:] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000761 self.assertEqual(
762 a,
763 array.array(self.typecode, self.example[:1] + self.example)
764 )
765
766 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000767 a[1:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000768 self.assertEqual(
769 a,
770 array.array(
771 self.typecode,
772 self.example[:1] + self.example + self.example[-1:]
773 )
774 )
775
776 a = array.array(self.typecode, self.example)
777 a[1000:] = a
778 self.assertEqual(
779 a,
780 array.array(self.typecode, 2*self.example)
781 )
782
783 a = array.array(self.typecode, self.example)
784 a[-1000:] = a
785 self.assertEqual(
786 a,
787 array.array(self.typecode, self.example)
788 )
789
790 a = array.array(self.typecode, self.example)
791 a[:1000] = a
792 self.assertEqual(
793 a,
794 array.array(self.typecode, self.example)
795 )
796
797 a = array.array(self.typecode, self.example)
798 a[:-1000] = a
799 self.assertEqual(
800 a,
801 array.array(self.typecode, 2*self.example)
802 )
803
804 a = array.array(self.typecode, self.example)
805 a[1:0] = a
806 self.assertEqual(
807 a,
808 array.array(self.typecode, self.example[:1] + self.example + self.example[1:])
809 )
810
811 a = array.array(self.typecode, self.example)
812 a[2000:1000] = a
813 self.assertEqual(
814 a,
815 array.array(self.typecode, 2*self.example)
816 )
817
818 a = array.array(self.typecode, self.example)
Thomas Woutersed03b412007-08-28 21:37:11 +0000819 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), None)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000820 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), None)
821
822 b = array.array(self.badtypecode())
Thomas Woutersed03b412007-08-28 21:37:11 +0000823 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000824 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), b)
825
Thomas Woutersed03b412007-08-28 21:37:11 +0000826 def test_extended_set_del_slice(self):
Zackery Spytz14514d92019-05-17 01:13:03 -0600827 indices = (0, None, 1, 3, 19, 100, sys.maxsize, -1, -2, -31, -100)
Thomas Woutersed03b412007-08-28 21:37:11 +0000828 for start in indices:
829 for stop in indices:
830 # Everything except the initial 0 (invalid step)
831 for step in indices[1:]:
832 a = array.array(self.typecode, self.example)
833 L = list(a)
834 # Make sure we have a slice of exactly the right length,
835 # but with (hopefully) different data.
836 data = L[start:stop:step]
837 data.reverse()
838 L[start:stop:step] = data
839 a[start:stop:step] = array.array(self.typecode, data)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000840 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000841
842 del L[start:stop:step]
843 del a[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +0000844 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000845
Walter Dörwald7fd94242003-05-18 00:47:47 +0000846 def test_index(self):
847 example = 2*self.example
848 a = array.array(self.typecode, example)
849 self.assertRaises(TypeError, a.index)
850 for x in example:
851 self.assertEqual(a.index(x), example.index(x))
852 self.assertRaises(ValueError, a.index, None)
853 self.assertRaises(ValueError, a.index, self.outside)
854
855 def test_count(self):
856 example = 2*self.example
857 a = array.array(self.typecode, example)
858 self.assertRaises(TypeError, a.count)
859 for x in example:
860 self.assertEqual(a.count(x), example.count(x))
861 self.assertEqual(a.count(self.outside), 0)
862 self.assertEqual(a.count(None), 0)
863
864 def test_remove(self):
865 for x in self.example:
866 example = 2*self.example
867 a = array.array(self.typecode, example)
868 pos = example.index(x)
869 example2 = example[:pos] + example[pos+1:]
870 a.remove(x)
871 self.assertEqual(a, array.array(self.typecode, example2))
872
873 a = array.array(self.typecode, self.example)
874 self.assertRaises(ValueError, a.remove, self.outside)
875
876 self.assertRaises(ValueError, a.remove, None)
877
878 def test_pop(self):
879 a = array.array(self.typecode)
880 self.assertRaises(IndexError, a.pop)
881
882 a = array.array(self.typecode, 2*self.example)
883 self.assertRaises(TypeError, a.pop, 42, 42)
884 self.assertRaises(TypeError, a.pop, None)
885 self.assertRaises(IndexError, a.pop, len(a))
886 self.assertRaises(IndexError, a.pop, -len(a)-1)
887
888 self.assertEntryEqual(a.pop(0), self.example[0])
889 self.assertEqual(
890 a,
891 array.array(self.typecode, self.example[1:]+self.example)
892 )
893 self.assertEntryEqual(a.pop(1), self.example[2])
894 self.assertEqual(
895 a,
896 array.array(self.typecode, self.example[1:2]+self.example[3:]+self.example)
897 )
898 self.assertEntryEqual(a.pop(0), self.example[1])
899 self.assertEntryEqual(a.pop(), self.example[-1])
900 self.assertEqual(
901 a,
902 array.array(self.typecode, self.example[3:]+self.example[:-1])
903 )
904
905 def test_reverse(self):
906 a = array.array(self.typecode, self.example)
907 self.assertRaises(TypeError, a.reverse, 42)
Fred Drake004d5e62000-10-23 17:22:08 +0000908 a.reverse()
Walter Dörwald7fd94242003-05-18 00:47:47 +0000909 self.assertEqual(
910 a,
911 array.array(self.typecode, self.example[::-1])
912 )
913
914 def test_extend(self):
915 a = array.array(self.typecode, self.example)
916 self.assertRaises(TypeError, a.extend)
917 a.extend(array.array(self.typecode, self.example[::-1]))
918 self.assertEqual(
919 a,
920 array.array(self.typecode, self.example+self.example[::-1])
921 )
922
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000923 a = array.array(self.typecode, self.example)
924 a.extend(a)
925 self.assertEqual(
926 a,
927 array.array(self.typecode, self.example+self.example)
928 )
929
Walter Dörwald7fd94242003-05-18 00:47:47 +0000930 b = array.array(self.badtypecode())
931 self.assertRaises(TypeError, a.extend, b)
932
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000933 a = array.array(self.typecode, self.example)
934 a.extend(self.example[::-1])
935 self.assertEqual(
936 a,
937 array.array(self.typecode, self.example+self.example[::-1])
938 )
939
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +0000940 def test_constructor_with_iterable_argument(self):
941 a = array.array(self.typecode, iter(self.example))
942 b = array.array(self.typecode, self.example)
943 self.assertEqual(a, b)
944
945 # non-iterable argument
946 self.assertRaises(TypeError, array.array, self.typecode, 10)
947
948 # pass through errors raised in __iter__
949 class A:
950 def __iter__(self):
951 raise UnicodeError
952 self.assertRaises(UnicodeError, array.array, self.typecode, A())
953
954 # pass through errors raised in next()
955 def B():
956 raise UnicodeError
957 yield None
958 self.assertRaises(UnicodeError, array.array, self.typecode, B())
959
Walter Dörwald7fd94242003-05-18 00:47:47 +0000960 def test_coveritertraverse(self):
961 try:
962 import gc
963 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -0600964 self.skipTest('gc module not available')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000965 a = array.array(self.typecode)
966 l = [iter(a)]
967 l.append(l)
968 gc.collect()
969
970 def test_buffer(self):
971 a = array.array(self.typecode, self.example)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000972 m = memoryview(a)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000973 expected = m.tobytes()
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000974 self.assertEqual(a.tobytes(), expected)
975 self.assertEqual(a.tobytes()[0], expected[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000976 # Resizing is forbidden when there are buffer exports.
977 # For issue 4509, we also check after each error that
978 # the array was not modified.
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000979 self.assertRaises(BufferError, a.append, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000980 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000981 self.assertRaises(BufferError, a.extend, a[0:1])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000982 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000983 self.assertRaises(BufferError, a.remove, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000984 self.assertEqual(m.tobytes(), expected)
985 self.assertRaises(BufferError, a.pop, 0)
986 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000987 self.assertRaises(BufferError, a.fromlist, a.tolist())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000988 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000989 self.assertRaises(BufferError, a.frombytes, a.tobytes())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000990 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000991 if self.typecode == 'u':
992 self.assertRaises(BufferError, a.fromunicode, a.tounicode())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000993 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +0000994 self.assertRaises(BufferError, operator.imul, a, 2)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000995 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +0000996 self.assertRaises(BufferError, operator.imul, a, 0)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000997 self.assertEqual(m.tobytes(), expected)
998 self.assertRaises(BufferError, operator.setitem, a, slice(0, 0), a)
999 self.assertEqual(m.tobytes(), expected)
1000 self.assertRaises(BufferError, operator.delitem, a, 0)
1001 self.assertEqual(m.tobytes(), expected)
1002 self.assertRaises(BufferError, operator.delitem, a, slice(0, 1))
1003 self.assertEqual(m.tobytes(), expected)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001004
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001005 def test_weakref(self):
1006 s = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001007 p = weakref.proxy(s)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001008 self.assertEqual(p.tobytes(), s.tobytes())
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001009 s = None
1010 self.assertRaises(ReferenceError, len, p)
1011
Serhiy Storchaka43767632013-11-03 21:31:38 +02001012 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
1013 'test needs sys.getrefcount()')
Skip Montanarod5cf0b82003-08-03 23:02:10 +00001014 def test_bug_782369(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +02001015 for i in range(10):
1016 b = array.array('B', range(64))
1017 rc = sys.getrefcount(10)
1018 for i in range(10):
1019 b = array.array('B', range(64))
1020 self.assertEqual(rc, sys.getrefcount(10))
Skip Montanarod5cf0b82003-08-03 23:02:10 +00001021
Thomas Woutersb2137042007-02-01 18:02:27 +00001022 def test_subclass_with_kwargs(self):
1023 # SF bug #1486663 -- this used to erroneously raise a TypeError
1024 ArraySubclassWithKwargs('b', newarg=1)
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001025
Guido van Rossum6b826ab2007-07-03 16:22:09 +00001026 def test_create_from_bytes(self):
Alexandre Vassalotti7e4f3212009-07-05 05:38:18 +00001027 # XXX This test probably needs to be moved in a subclass or
1028 # generalized to use self.typecode.
Guido van Rossum6b826ab2007-07-03 16:22:09 +00001029 a = array.array('H', b"1234")
1030 self.assertEqual(len(a) * a.itemsize, 4)
1031
Meador Inge03b4d502012-08-10 22:35:45 -05001032 @support.cpython_only
1033 def test_sizeof_with_buffer(self):
1034 a = array.array(self.typecode, self.example)
Meador Inge80dd1af2012-08-10 23:21:39 -05001035 basesize = support.calcvobjsize('Pn2Pi')
Meador Inge03b4d502012-08-10 22:35:45 -05001036 buffer_size = a.buffer_info()[1] * a.itemsize
1037 support.check_sizeof(self, a, basesize + buffer_size)
1038
1039 @support.cpython_only
1040 def test_sizeof_without_buffer(self):
1041 a = array.array(self.typecode)
Meador Inge80dd1af2012-08-10 23:21:39 -05001042 basesize = support.calcvobjsize('Pn2Pi')
Meador Inge03b4d502012-08-10 22:35:45 -05001043 support.check_sizeof(self, a, basesize)
1044
Alexandre Vassalotti9730e332013-11-29 20:47:15 -08001045 def test_initialize_with_unicode(self):
1046 if self.typecode != 'u':
1047 with self.assertRaises(TypeError) as cm:
1048 a = array.array(self.typecode, 'foo')
1049 self.assertIn("cannot use a str", str(cm.exception))
1050 with self.assertRaises(TypeError) as cm:
1051 a = array.array(self.typecode, array.array('u', 'foo'))
1052 self.assertIn("cannot use a unicode array", str(cm.exception))
1053 else:
1054 a = array.array(self.typecode, "foo")
1055 a = array.array(self.typecode, array.array('u', 'foo'))
1056
Stefan Krah650c1e82015-02-03 21:43:23 +01001057 @support.cpython_only
1058 def test_obsolete_write_lock(self):
1059 from _testcapi import getbuffer_with_null_view
1060 a = array.array('B', b"")
1061 self.assertRaises(BufferError, getbuffer_with_null_view, a)
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001062
Serhiy Storchakaab0d1982016-03-30 21:11:16 +03001063 def test_free_after_iterating(self):
1064 support.check_free_after_iterating(self, iter, array.array,
1065 (self.typecode,))
1066 support.check_free_after_iterating(self, reversed, array.array,
1067 (self.typecode,))
1068
Walter Dörwald7fd94242003-05-18 00:47:47 +00001069class StringTest(BaseTest):
1070
1071 def test_setitem(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001072 super().test_setitem()
Walter Dörwald7fd94242003-05-18 00:47:47 +00001073 a = array.array(self.typecode, self.example)
1074 self.assertRaises(TypeError, a.__setitem__, 0, self.example[:2])
1075
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001076class UnicodeTest(StringTest, unittest.TestCase):
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001077 typecode = 'u'
1078 example = '\x01\u263a\x00\ufeff'
1079 smallerexample = '\x01\u263a\x00\ufefe'
1080 biggerexample = '\x01\u263a\x01\ufeff'
1081 outside = str('\x33')
Victor Stinner8d4734f2012-08-08 20:09:21 +02001082 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001083
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001084 def test_unicode(self):
1085 self.assertRaises(TypeError, array.array, 'b', 'foo')
Walter Dörwald7fd94242003-05-18 00:47:47 +00001086
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001087 a = array.array('u', '\xa0\xc2\u1234')
1088 a.fromunicode(' ')
1089 a.fromunicode('')
1090 a.fromunicode('')
1091 a.fromunicode('\x11abc\xff\u1234')
1092 s = a.tounicode()
1093 self.assertEqual(s, '\xa0\xc2\u1234 \x11abc\xff\u1234')
Victor Stinner9d512ab2012-08-09 00:43:56 +02001094 self.assertEqual(a.itemsize, sizeof_wchar)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001095
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001096 s = '\x00="\'a\\b\x80\xff\u0000\u0001\u1234'
1097 a = array.array('u', s)
1098 self.assertEqual(
1099 repr(a),
Georg Brandl559e5d72008-06-11 18:37:52 +00001100 "array('u', '\\x00=\"\\'a\\\\b\\x80\xff\\x00\\x01\u1234')")
Walter Dörwald7fd94242003-05-18 00:47:47 +00001101
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001102 self.assertRaises(TypeError, a.fromunicode)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001103
Victor Stinner29ec5952013-02-26 00:27:38 +01001104 def test_issue17223(self):
1105 # this used to crash
Victor Stinnerc472c5d2013-02-26 22:52:11 +01001106 if sizeof_wchar == 4:
1107 # U+FFFFFFFF is an invalid code point in Unicode 6.0
1108 invalid_str = b'\xff\xff\xff\xff'
1109 else:
Victor Stinner29c00342013-03-08 02:33:06 +01001110 # PyUnicode_FromUnicode() cannot fail with 16-bit wchar_t
1111 self.skipTest("specific to 32-bit wchar_t")
Victor Stinnerc472c5d2013-02-26 22:52:11 +01001112 a = array.array('u', invalid_str)
Victor Stinner29ec5952013-02-26 00:27:38 +01001113 self.assertRaises(ValueError, a.tounicode)
1114 self.assertRaises(ValueError, str, a)
1115
Walter Dörwald7fd94242003-05-18 00:47:47 +00001116class NumberTest(BaseTest):
1117
1118 def test_extslice(self):
1119 a = array.array(self.typecode, range(5))
1120 self.assertEqual(a[::], a)
1121 self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
1122 self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
1123 self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
1124 self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
1125 self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
1126 self.assertEqual(a[-100:100:], a)
1127 self.assertEqual(a[100:-100:-1], a[::-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +00001128 self.assertEqual(a[-100:100:2], array.array(self.typecode, [0,2,4]))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001129 self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
1130 self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
1131
1132 def test_delslice(self):
1133 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001134 del a[::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001135 self.assertEqual(a, array.array(self.typecode, [1,3]))
1136 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001137 del a[1::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001138 self.assertEqual(a, array.array(self.typecode, [0,2,4]))
1139 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001140 del a[1::-2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001141 self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
1142 a = array.array(self.typecode, range(10))
Michael W. Hudson56796f62002-07-29 14:35:04 +00001143 del a[::1000]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001144 self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
Mark Dickinsonbc099642010-01-29 17:27:24 +00001145 # test issue7788
1146 a = array.array(self.typecode, range(10))
1147 del a[9::1<<333]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001148
1149 def test_assignment(self):
1150 a = array.array(self.typecode, range(10))
1151 a[::2] = array.array(self.typecode, [42]*5)
1152 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
1153 a = array.array(self.typecode, range(10))
1154 a[::-4] = array.array(self.typecode, [10]*3)
1155 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
1156 a = array.array(self.typecode, range(4))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001157 a[::-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +00001158 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
1159 a = array.array(self.typecode, range(10))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001160 b = a[:]
1161 c = a[:]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001162 ins = array.array(self.typecode, range(2))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001163 a[2:3] = ins
1164 b[slice(2,3)] = ins
1165 c[2:3:] = ins
Fred Drake004d5e62000-10-23 17:22:08 +00001166
Walter Dörwald7fd94242003-05-18 00:47:47 +00001167 def test_iterationcontains(self):
1168 a = array.array(self.typecode, range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +00001169 self.assertEqual(list(a), list(range(10)))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001170 b = array.array(self.typecode, [20])
1171 self.assertEqual(a[-1] in a, True)
1172 self.assertEqual(b[0] not in a, True)
1173
1174 def check_overflow(self, lower, upper):
1175 # method to be used by subclasses
1176
1177 # should not overflow assigning lower limit
1178 a = array.array(self.typecode, [lower])
1179 a[0] = lower
1180 # should overflow assigning less than lower limit
1181 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
1182 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
1183 # should not overflow assigning upper limit
1184 a = array.array(self.typecode, [upper])
1185 a[0] = upper
1186 # should overflow assigning more than upper limit
1187 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
1188 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
1189
1190 def test_subclassing(self):
1191 typecode = self.typecode
1192 class ExaggeratingArray(array.array):
1193 __slots__ = ['offset']
1194
1195 def __new__(cls, typecode, data, offset):
1196 return array.array.__new__(cls, typecode, data)
1197
1198 def __init__(self, typecode, data, offset):
1199 self.offset = offset
1200
1201 def __getitem__(self, i):
1202 return array.array.__getitem__(self, i) + self.offset
1203
1204 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
1205 self.assertEntryEqual(a[0], 7)
1206
1207 self.assertRaises(AttributeError, setattr, a, "color", "blue")
1208
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00001209 def test_frombytearray(self):
1210 a = array.array('b', range(10))
1211 b = array.array(self.typecode, a)
1212 self.assertEqual(a, b)
1213
orenmn964281a2017-03-09 11:35:28 +02001214class IntegerNumberTest(NumberTest):
1215 def test_type_error(self):
1216 a = array.array(self.typecode)
1217 a.append(42)
1218 with self.assertRaises(TypeError):
1219 a.append(42.0)
1220 with self.assertRaises(TypeError):
1221 a[0] = 42.0
1222
1223class Intable:
1224 def __init__(self, num):
1225 self._num = num
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +02001226 def __index__(self):
1227 return self._num
orenmn964281a2017-03-09 11:35:28 +02001228 def __int__(self):
1229 return self._num
1230 def __sub__(self, other):
1231 return Intable(int(self) - int(other))
1232 def __add__(self, other):
1233 return Intable(int(self) + int(other))
1234
1235class SignedNumberTest(IntegerNumberTest):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001236 example = [-1, 0, 1, 42, 0x7f]
1237 smallerexample = [-1, 0, 1, 42, 0x7e]
1238 biggerexample = [-1, 0, 1, 43, 0x7f]
1239 outside = 23
1240
1241 def test_overflow(self):
1242 a = array.array(self.typecode)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001243 lower = -1 * int(pow(2, a.itemsize * 8 - 1))
1244 upper = int(pow(2, a.itemsize * 8 - 1)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001245 self.check_overflow(lower, upper)
orenmn964281a2017-03-09 11:35:28 +02001246 self.check_overflow(Intable(lower), Intable(upper))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001247
orenmn964281a2017-03-09 11:35:28 +02001248class UnsignedNumberTest(IntegerNumberTest):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001249 example = [0, 1, 17, 23, 42, 0xff]
1250 smallerexample = [0, 1, 17, 23, 42, 0xfe]
1251 biggerexample = [0, 1, 17, 23, 43, 0xff]
1252 outside = 0xaa
1253
1254 def test_overflow(self):
1255 a = array.array(self.typecode)
1256 lower = 0
Guido van Rossume2a383d2007-01-15 16:59:06 +00001257 upper = int(pow(2, a.itemsize * 8)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001258 self.check_overflow(lower, upper)
orenmn964281a2017-03-09 11:35:28 +02001259 self.check_overflow(Intable(lower), Intable(upper))
Fred Drake004d5e62000-10-23 17:22:08 +00001260
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001261 def test_bytes_extend(self):
1262 s = bytes(self.example)
1263
1264 a = array.array(self.typecode, self.example)
1265 a.extend(s)
1266 self.assertEqual(
1267 a,
1268 array.array(self.typecode, self.example+self.example)
1269 )
1270
1271 a = array.array(self.typecode, self.example)
1272 a.extend(bytearray(reversed(s)))
1273 self.assertEqual(
1274 a,
1275 array.array(self.typecode, self.example+self.example[::-1])
1276 )
1277
Fred Drake004d5e62000-10-23 17:22:08 +00001278
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001279class ByteTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001280 typecode = 'b'
1281 minitemsize = 1
Fred Drake004d5e62000-10-23 17:22:08 +00001282
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001283class UnsignedByteTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001284 typecode = 'B'
1285 minitemsize = 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001286
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001287class ShortTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001288 typecode = 'h'
1289 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001290
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001291class UnsignedShortTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001292 typecode = 'H'
1293 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001294
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001295class IntTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001296 typecode = 'i'
1297 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001298
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001299class UnsignedIntTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001300 typecode = 'I'
1301 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001302
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001303class LongTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001304 typecode = 'l'
1305 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001306
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001307class UnsignedLongTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001308 typecode = 'L'
1309 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001310
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001311class LongLongTest(SignedNumberTest, unittest.TestCase):
Meador Inge1c9f0c92011-09-20 19:55:51 -05001312 typecode = 'q'
1313 minitemsize = 8
Meador Inge1c9f0c92011-09-20 19:55:51 -05001314
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001315class UnsignedLongLongTest(UnsignedNumberTest, unittest.TestCase):
Meador Inge1c9f0c92011-09-20 19:55:51 -05001316 typecode = 'Q'
1317 minitemsize = 8
Meador Inge1c9f0c92011-09-20 19:55:51 -05001318
Walter Dörwald7fd94242003-05-18 00:47:47 +00001319class FPTest(NumberTest):
1320 example = [-42.0, 0, 42, 1e5, -1e10]
1321 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
1322 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
1323 outside = 23
1324
1325 def assertEntryEqual(self, entry1, entry2):
1326 self.assertAlmostEqual(entry1, entry2)
1327
Adrian Wielgosik7c17e232017-08-17 12:46:06 +00001328 def test_nan(self):
1329 a = array.array(self.typecode, [float('nan')])
1330 b = array.array(self.typecode, [float('nan')])
1331 self.assertIs(a != b, True)
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 self.assertIs(a <= b, False)
1337
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001338 def test_byteswap(self):
1339 a = array.array(self.typecode, self.example)
1340 self.assertRaises(TypeError, a.byteswap, 42)
1341 if a.itemsize in (1, 2, 4, 8):
1342 b = array.array(self.typecode, self.example)
1343 b.byteswap()
1344 if a.itemsize==1:
1345 self.assertEqual(a, b)
1346 else:
1347 # On alphas treating the byte swapped bit patters as
1348 # floats/doubles results in floating point exceptions
1349 # => compare the 8bit string values instead
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001350 self.assertNotEqual(a.tobytes(), b.tobytes())
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001351 b.byteswap()
1352 self.assertEqual(a, b)
1353
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001354class FloatTest(FPTest, unittest.TestCase):
Neal Norwitz35c6cd02003-05-22 13:29:15 +00001355 typecode = 'f'
1356 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001357
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001358class DoubleTest(FPTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001359 typecode = 'd'
1360 minitemsize = 8
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001361
1362 def test_alloc_overflow(self):
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001363 from sys import maxsize
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001364 a = array.array('d', [-1]*65536)
1365 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001366 a *= maxsize//65536 + 1
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001367 except MemoryError:
1368 pass
1369 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001370 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001371 b = array.array('d', [ 2.71828183, 3.14159265, -1])
1372 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001373 b * (maxsize//3 + 1)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001374 except MemoryError:
1375 pass
1376 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001377 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001378
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001379
sthaa3ecb82019-03-20 20:49:39 +01001380class LargeArrayTest(unittest.TestCase):
1381 typecode = 'b'
1382
1383 def example(self, size):
1384 # We assess a base memuse of <=2.125 for constructing this array
1385 base = array.array(self.typecode, [0, 1, 2, 3, 4, 5, 6, 7]) * (size // 8)
1386 base += array.array(self.typecode, [99]*(size % 8) + [8, 9, 10, 11])
1387 return base
1388
1389 @support.bigmemtest(_2G, memuse=2.125)
1390 def test_example_data(self, size):
1391 example = self.example(size)
1392 self.assertEqual(len(example), size+4)
1393
1394 @support.bigmemtest(_2G, memuse=2.125)
1395 def test_access(self, size):
1396 example = self.example(size)
1397 self.assertEqual(example[0], 0)
1398 self.assertEqual(example[-(size+4)], 0)
1399 self.assertEqual(example[size], 8)
1400 self.assertEqual(example[-4], 8)
1401 self.assertEqual(example[size+3], 11)
1402 self.assertEqual(example[-1], 11)
1403
1404 @support.bigmemtest(_2G, memuse=2.125+1)
1405 def test_slice(self, size):
1406 example = self.example(size)
1407 self.assertEqual(list(example[:4]), [0, 1, 2, 3])
1408 self.assertEqual(list(example[-4:]), [8, 9, 10, 11])
1409 part = example[1:-1]
1410 self.assertEqual(len(part), size+2)
1411 self.assertEqual(part[0], 1)
1412 self.assertEqual(part[-1], 10)
1413 del part
1414 part = example[::2]
1415 self.assertEqual(len(part), (size+5)//2)
1416 self.assertEqual(list(part[:4]), [0, 2, 4, 6])
1417 if size % 2:
1418 self.assertEqual(list(part[-2:]), [9, 11])
1419 else:
1420 self.assertEqual(list(part[-2:]), [8, 10])
1421
1422 @support.bigmemtest(_2G, memuse=2.125)
1423 def test_count(self, size):
1424 example = self.example(size)
1425 self.assertEqual(example.count(0), size//8)
1426 self.assertEqual(example.count(11), 1)
1427
1428 @support.bigmemtest(_2G, memuse=2.125)
1429 def test_append(self, size):
1430 example = self.example(size)
1431 example.append(12)
1432 self.assertEqual(example[-1], 12)
1433
1434 @support.bigmemtest(_2G, memuse=2.125)
1435 def test_extend(self, size):
1436 example = self.example(size)
1437 example.extend(iter([12, 13, 14, 15]))
1438 self.assertEqual(len(example), size+8)
1439 self.assertEqual(list(example[-8:]), [8, 9, 10, 11, 12, 13, 14, 15])
1440
1441 @support.bigmemtest(_2G, memuse=2.125)
1442 def test_frombytes(self, size):
1443 example = self.example(size)
1444 example.frombytes(b'abcd')
1445 self.assertEqual(len(example), size+8)
1446 self.assertEqual(list(example[-8:]), [8, 9, 10, 11] + list(b'abcd'))
1447
1448 @support.bigmemtest(_2G, memuse=2.125)
1449 def test_fromlist(self, size):
1450 example = self.example(size)
1451 example.fromlist([12, 13, 14, 15])
1452 self.assertEqual(len(example), size+8)
1453 self.assertEqual(list(example[-8:]), [8, 9, 10, 11, 12, 13, 14, 15])
1454
1455 @support.bigmemtest(_2G, memuse=2.125)
1456 def test_index(self, size):
1457 example = self.example(size)
1458 self.assertEqual(example.index(0), 0)
1459 self.assertEqual(example.index(1), 1)
1460 self.assertEqual(example.index(7), 7)
1461 self.assertEqual(example.index(11), size+3)
1462
1463 @support.bigmemtest(_2G, memuse=2.125)
1464 def test_insert(self, size):
1465 example = self.example(size)
1466 example.insert(0, 12)
1467 example.insert(10, 13)
1468 example.insert(size+1, 14)
1469 self.assertEqual(len(example), size+7)
1470 self.assertEqual(example[0], 12)
1471 self.assertEqual(example[10], 13)
1472 self.assertEqual(example[size+1], 14)
1473
1474 @support.bigmemtest(_2G, memuse=2.125)
1475 def test_pop(self, size):
1476 example = self.example(size)
1477 self.assertEqual(example.pop(0), 0)
1478 self.assertEqual(example[0], 1)
1479 self.assertEqual(example.pop(size+1), 10)
1480 self.assertEqual(example[size+1], 11)
1481 self.assertEqual(example.pop(1), 2)
1482 self.assertEqual(example[1], 3)
1483 self.assertEqual(len(example), size+1)
1484 self.assertEqual(example.pop(), 11)
1485 self.assertEqual(len(example), size)
1486
1487 @support.bigmemtest(_2G, memuse=2.125)
1488 def test_remove(self, size):
1489 example = self.example(size)
1490 example.remove(0)
1491 self.assertEqual(len(example), size+3)
1492 self.assertEqual(example[0], 1)
1493 example.remove(10)
1494 self.assertEqual(len(example), size+2)
1495 self.assertEqual(example[size], 9)
1496 self.assertEqual(example[size+1], 11)
1497
1498 @support.bigmemtest(_2G, memuse=2.125)
1499 def test_reverse(self, size):
1500 example = self.example(size)
1501 example.reverse()
1502 self.assertEqual(len(example), size+4)
1503 self.assertEqual(example[0], 11)
1504 self.assertEqual(example[3], 8)
1505 self.assertEqual(example[-1], 0)
1506 example.reverse()
1507 self.assertEqual(len(example), size+4)
1508 self.assertEqual(list(example[:4]), [0, 1, 2, 3])
1509 self.assertEqual(list(example[-4:]), [8, 9, 10, 11])
1510
1511 # list takes about 9 bytes per element
1512 @support.bigmemtest(_2G, memuse=2.125+9)
1513 def test_tolist(self, size):
1514 example = self.example(size)
1515 ls = example.tolist()
1516 self.assertEqual(len(ls), len(example))
1517 self.assertEqual(ls[:8], list(example[:8]))
1518 self.assertEqual(ls[-8:], list(example[-8:]))
1519
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001520if __name__ == "__main__":
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001521 unittest.main()