blob: e9218f3dd68cb230cf95165c11790ad1707bb67d [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
Alexandre Vassalottiad077152009-07-15 17:49:23 +00007import weakref
8import pickle
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00009import operator
Alexandre Vassalottiad077152009-07-15 17:49:23 +000010import struct
Serhiy Storchaka43767632013-11-03 21:31:38 +020011import sys
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +000012import warnings
Alexandre Vassalottiad077152009-07-15 17:49:23 +000013
14import array
15from array import _array_reconstructor as array_reconstructor
16
Victor Stinner29c00342013-03-08 02:33:06 +010017sizeof_wchar = array.array('u').itemsize
Victor Stinnerc472c5d2013-02-26 22:52:11 +010018
19
Raymond Hettingerb0900e62004-12-16 16:23:40 +000020class ArraySubclass(array.array):
21 pass
Guido van Rossumc9f8f141997-04-09 20:51:54 +000022
Thomas Woutersb2137042007-02-01 18:02:27 +000023class ArraySubclassWithKwargs(array.array):
24 def __init__(self, typecode, newarg=None):
Victor Stinner7a6a0092011-01-04 00:04:44 +000025 array.array.__init__(self)
Thomas Woutersb2137042007-02-01 18:02:27 +000026
orenmn964281a2017-03-09 11:35:28 +020027typecodes = 'ubBhHiIlLfdqQ'
Martin v. Löwis99866332002-03-01 10:27:01 +000028
Martin Panterbe8da9c2016-09-07 11:04:41 +000029class MiscTest(unittest.TestCase):
Martin v. Löwis99866332002-03-01 10:27:01 +000030
Martin Panterbe8da9c2016-09-07 11:04:41 +000031 def test_bad_constructor(self):
Walter Dörwald7fd94242003-05-18 00:47:47 +000032 self.assertRaises(TypeError, array.array)
33 self.assertRaises(TypeError, array.array, spam=42)
34 self.assertRaises(TypeError, array.array, 'xx')
35 self.assertRaises(ValueError, array.array, 'x')
Martin v. Löwis99866332002-03-01 10:27:01 +000036
Martin Panterbe8da9c2016-09-07 11:04:41 +000037 def test_empty(self):
38 # Exercise code for handling zero-length arrays
39 a = array.array('B')
40 a[:] = a
41 self.assertEqual(len(a), 0)
42 self.assertEqual(len(a + a), 0)
43 self.assertEqual(len(a * 3), 0)
44 a += a
45 self.assertEqual(len(a), 0)
46
Martin v. Löwis99866332002-03-01 10:27:01 +000047
Alexandre Vassalottiad077152009-07-15 17:49:23 +000048# Machine format codes.
49#
50# Search for "enum machine_format_code" in Modules/arraymodule.c to get the
51# authoritative values.
52UNKNOWN_FORMAT = -1
53UNSIGNED_INT8 = 0
54SIGNED_INT8 = 1
55UNSIGNED_INT16_LE = 2
56UNSIGNED_INT16_BE = 3
57SIGNED_INT16_LE = 4
58SIGNED_INT16_BE = 5
59UNSIGNED_INT32_LE = 6
60UNSIGNED_INT32_BE = 7
61SIGNED_INT32_LE = 8
62SIGNED_INT32_BE = 9
63UNSIGNED_INT64_LE = 10
64UNSIGNED_INT64_BE = 11
65SIGNED_INT64_LE = 12
66SIGNED_INT64_BE = 13
67IEEE_754_FLOAT_LE = 14
68IEEE_754_FLOAT_BE = 15
69IEEE_754_DOUBLE_LE = 16
70IEEE_754_DOUBLE_BE = 17
71UTF16_LE = 18
72UTF16_BE = 19
73UTF32_LE = 20
74UTF32_BE = 21
75
76class ArrayReconstructorTest(unittest.TestCase):
77
78 def test_error(self):
79 self.assertRaises(TypeError, array_reconstructor,
80 "", "b", 0, b"")
81 self.assertRaises(TypeError, array_reconstructor,
82 str, "b", 0, b"")
83 self.assertRaises(TypeError, array_reconstructor,
84 array.array, "b", '', b"")
85 self.assertRaises(TypeError, array_reconstructor,
86 array.array, "b", 0, "")
87 self.assertRaises(ValueError, array_reconstructor,
88 array.array, "?", 0, b"")
89 self.assertRaises(ValueError, array_reconstructor,
90 array.array, "b", UNKNOWN_FORMAT, b"")
91 self.assertRaises(ValueError, array_reconstructor,
92 array.array, "b", 22, b"")
93 self.assertRaises(ValueError, array_reconstructor,
94 array.array, "d", 16, b"a")
95
96 def test_numbers(self):
97 testcases = (
98 (['B', 'H', 'I', 'L'], UNSIGNED_INT8, '=BBBB',
99 [0x80, 0x7f, 0, 0xff]),
100 (['b', 'h', 'i', 'l'], SIGNED_INT8, '=bbb',
101 [-0x80, 0x7f, 0]),
102 (['H', 'I', 'L'], UNSIGNED_INT16_LE, '<HHHH',
103 [0x8000, 0x7fff, 0, 0xffff]),
104 (['H', 'I', 'L'], UNSIGNED_INT16_BE, '>HHHH',
105 [0x8000, 0x7fff, 0, 0xffff]),
106 (['h', 'i', 'l'], SIGNED_INT16_LE, '<hhh',
107 [-0x8000, 0x7fff, 0]),
108 (['h', 'i', 'l'], SIGNED_INT16_BE, '>hhh',
109 [-0x8000, 0x7fff, 0]),
110 (['I', 'L'], UNSIGNED_INT32_LE, '<IIII',
111 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
112 (['I', 'L'], UNSIGNED_INT32_BE, '>IIII',
113 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
114 (['i', 'l'], SIGNED_INT32_LE, '<iii',
115 [-1<<31, (1<<31)-1, 0]),
116 (['i', 'l'], SIGNED_INT32_BE, '>iii',
117 [-1<<31, (1<<31)-1, 0]),
118 (['L'], UNSIGNED_INT64_LE, '<QQQQ',
Alexandre Vassalotti0027d4b2009-07-15 20:53:55 +0000119 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
120 (['L'], UNSIGNED_INT64_BE, '>QQQQ',
121 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
122 (['l'], SIGNED_INT64_LE, '<qqq',
123 [-1<<31, (1<<31)-1, 0]),
124 (['l'], SIGNED_INT64_BE, '>qqq',
125 [-1<<31, (1<<31)-1, 0]),
126 # The following tests for INT64 will raise an OverflowError
127 # when run on a 32-bit machine. The tests are simply skipped
128 # in that case.
129 (['L'], UNSIGNED_INT64_LE, '<QQQQ',
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000130 [1<<63, (1<<63)-1, 0, (1<<64)-1]),
131 (['L'], UNSIGNED_INT64_BE, '>QQQQ',
132 [1<<63, (1<<63)-1, 0, (1<<64)-1]),
133 (['l'], SIGNED_INT64_LE, '<qqq',
134 [-1<<63, (1<<63)-1, 0]),
135 (['l'], SIGNED_INT64_BE, '>qqq',
136 [-1<<63, (1<<63)-1, 0]),
137 (['f'], IEEE_754_FLOAT_LE, '<ffff',
138 [16711938.0, float('inf'), float('-inf'), -0.0]),
139 (['f'], IEEE_754_FLOAT_BE, '>ffff',
140 [16711938.0, float('inf'), float('-inf'), -0.0]),
141 (['d'], IEEE_754_DOUBLE_LE, '<dddd',
142 [9006104071832581.0, float('inf'), float('-inf'), -0.0]),
143 (['d'], IEEE_754_DOUBLE_BE, '>dddd',
144 [9006104071832581.0, float('inf'), float('-inf'), -0.0])
145 )
146 for testcase in testcases:
147 valid_typecodes, mformat_code, struct_fmt, values = testcase
148 arraystr = struct.pack(struct_fmt, *values)
149 for typecode in valid_typecodes:
Alexandre Vassalotti0027d4b2009-07-15 20:53:55 +0000150 try:
151 a = array.array(typecode, values)
152 except OverflowError:
153 continue # Skip this test case.
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000154 b = array_reconstructor(
155 array.array, typecode, mformat_code, arraystr)
156 self.assertEqual(a, b,
157 msg="{0!r} != {1!r}; testcase={2!r}".format(a, b, testcase))
158
159 def test_unicode(self):
160 teststr = "Bonne Journ\xe9e \U0002030a\U00020347"
161 testcases = (
162 (UTF16_LE, "UTF-16-LE"),
163 (UTF16_BE, "UTF-16-BE"),
164 (UTF32_LE, "UTF-32-LE"),
165 (UTF32_BE, "UTF-32-BE")
166 )
167 for testcase in testcases:
168 mformat_code, encoding = testcase
169 a = array.array('u', teststr)
170 b = array_reconstructor(
171 array.array, 'u', mformat_code, teststr.encode(encoding))
172 self.assertEqual(a, b,
173 msg="{0!r} != {1!r}; testcase={2!r}".format(a, b, testcase))
174
175
Ezio Melotti1d3e96d2013-01-10 06:04:50 +0200176class BaseTest:
Walter Dörwald7fd94242003-05-18 00:47:47 +0000177 # Required class attributes (provided by subclasses
178 # typecode: the typecode to test
179 # example: an initializer usable in the constructor for this type
180 # smallerexample: the same length as example, but smaller
181 # biggerexample: the same length as example, but bigger
182 # outside: An entry that is not in example
183 # minitemsize: the minimum guaranteed itemsize
Martin v. Löwis99866332002-03-01 10:27:01 +0000184
Walter Dörwald7fd94242003-05-18 00:47:47 +0000185 def assertEntryEqual(self, entry1, entry2):
186 self.assertEqual(entry1, entry2)
Martin v. Löwis99866332002-03-01 10:27:01 +0000187
Walter Dörwald7fd94242003-05-18 00:47:47 +0000188 def badtypecode(self):
189 # Return a typecode that is different from our own
190 return typecodes[(typecodes.index(self.typecode)+1) % len(typecodes)]
Martin v. Löwis99866332002-03-01 10:27:01 +0000191
Walter Dörwald7fd94242003-05-18 00:47:47 +0000192 def test_constructor(self):
193 a = array.array(self.typecode)
194 self.assertEqual(a.typecode, self.typecode)
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200195 self.assertGreaterEqual(a.itemsize, self.minitemsize)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000196 self.assertRaises(TypeError, array.array, self.typecode, None)
Martin v. Löwis99866332002-03-01 10:27:01 +0000197
Walter Dörwald7fd94242003-05-18 00:47:47 +0000198 def test_len(self):
199 a = array.array(self.typecode)
200 a.append(self.example[0])
201 self.assertEqual(len(a), 1)
Martin v. Löwis99866332002-03-01 10:27:01 +0000202
Walter Dörwald7fd94242003-05-18 00:47:47 +0000203 a = array.array(self.typecode, self.example)
204 self.assertEqual(len(a), len(self.example))
Martin v. Löwis99866332002-03-01 10:27:01 +0000205
Walter Dörwald7fd94242003-05-18 00:47:47 +0000206 def test_buffer_info(self):
207 a = array.array(self.typecode, self.example)
208 self.assertRaises(TypeError, a.buffer_info, 42)
209 bi = a.buffer_info()
Ezio Melottie9615932010-01-24 19:26:24 +0000210 self.assertIsInstance(bi, tuple)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000211 self.assertEqual(len(bi), 2)
Ezio Melottie9615932010-01-24 19:26:24 +0000212 self.assertIsInstance(bi[0], int)
213 self.assertIsInstance(bi[1], int)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000214 self.assertEqual(bi[1], len(a))
Martin v. Löwis99866332002-03-01 10:27:01 +0000215
Walter Dörwald7fd94242003-05-18 00:47:47 +0000216 def test_byteswap(self):
Victor Stinner8dba4e02011-09-30 00:51:10 +0200217 if self.typecode == 'u':
218 example = '\U00100100'
219 else:
220 example = self.example
221 a = array.array(self.typecode, example)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000222 self.assertRaises(TypeError, a.byteswap, 42)
223 if a.itemsize in (1, 2, 4, 8):
Victor Stinner8dba4e02011-09-30 00:51:10 +0200224 b = array.array(self.typecode, example)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000225 b.byteswap()
226 if a.itemsize==1:
227 self.assertEqual(a, b)
228 else:
229 self.assertNotEqual(a, b)
230 b.byteswap()
231 self.assertEqual(a, b)
Martin v. Löwis99866332002-03-01 10:27:01 +0000232
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000233 def test_copy(self):
234 import copy
235 a = array.array(self.typecode, self.example)
236 b = copy.copy(a)
237 self.assertNotEqual(id(a), id(b))
238 self.assertEqual(a, b)
239
Thomas Wouters89f507f2006-12-13 04:49:30 +0000240 def test_deepcopy(self):
241 import copy
242 a = array.array(self.typecode, self.example)
243 b = copy.deepcopy(a)
244 self.assertNotEqual(id(a), id(b))
245 self.assertEqual(a, b)
246
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000247 def test_reduce_ex(self):
248 a = array.array(self.typecode, self.example)
249 for protocol in range(3):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000250 self.assertIs(a.__reduce_ex__(protocol)[0], array.array)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000251 for protocol in range(3, pickle.HIGHEST_PROTOCOL):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000252 self.assertIs(a.__reduce_ex__(protocol)[0], array_reconstructor)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000253
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000254 def test_pickle(self):
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000255 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000256 a = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000257 b = pickle.loads(pickle.dumps(a, protocol))
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000258 self.assertNotEqual(id(a), id(b))
259 self.assertEqual(a, b)
260
261 a = ArraySubclass(self.typecode, self.example)
262 a.x = 10
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000263 b = pickle.loads(pickle.dumps(a, protocol))
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000264 self.assertNotEqual(id(a), id(b))
265 self.assertEqual(a, b)
266 self.assertEqual(a.x, b.x)
267 self.assertEqual(type(a), type(b))
268
Guido van Rossumd8faa362007-04-27 19:54:29 +0000269 def test_pickle_for_empty_array(self):
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000270 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossumd8faa362007-04-27 19:54:29 +0000271 a = array.array(self.typecode)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000272 b = pickle.loads(pickle.dumps(a, protocol))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000273 self.assertNotEqual(id(a), id(b))
274 self.assertEqual(a, b)
275
276 a = ArraySubclass(self.typecode)
277 a.x = 10
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000278 b = pickle.loads(pickle.dumps(a, protocol))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000279 self.assertNotEqual(id(a), id(b))
280 self.assertEqual(a, b)
281 self.assertEqual(a.x, b.x)
282 self.assertEqual(type(a), type(b))
283
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000284 def test_iterator_pickle(self):
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200285 orig = array.array(self.typecode, self.example)
286 data = list(orig)
287 data2 = data[::-1]
Serhiy Storchakabad12572014-12-15 14:03:42 +0200288 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200289 # initial iterator
290 itorig = iter(orig)
291 d = pickle.dumps((itorig, orig), proto)
292 it, a = pickle.loads(d)
293 a.fromlist(data2)
294 self.assertEqual(type(it), type(itorig))
295 self.assertEqual(list(it), data + data2)
Serhiy Storchakabad12572014-12-15 14:03:42 +0200296
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200297 # running iterator
298 next(itorig)
299 d = pickle.dumps((itorig, orig), proto)
300 it, a = pickle.loads(d)
301 a.fromlist(data2)
302 self.assertEqual(type(it), type(itorig))
303 self.assertEqual(list(it), data[1:] + data2)
304
305 # empty iterator
306 for i in range(1, len(data)):
307 next(itorig)
308 d = pickle.dumps((itorig, orig), proto)
309 it, a = pickle.loads(d)
310 a.fromlist(data2)
311 self.assertEqual(type(it), type(itorig))
312 self.assertEqual(list(it), data2)
313
314 # exhausted iterator
315 self.assertRaises(StopIteration, next, itorig)
316 d = pickle.dumps((itorig, orig), proto)
317 it, a = pickle.loads(d)
318 a.fromlist(data2)
Serhiy Storchakaab0d1982016-03-30 21:11:16 +0300319 self.assertEqual(list(it), [])
320
321 def test_exhausted_iterator(self):
322 a = array.array(self.typecode, self.example)
323 self.assertEqual(list(a), list(self.example))
324 exhit = iter(a)
325 empit = iter(a)
326 for x in exhit: # exhaust the iterator
327 next(empit) # not exhausted
328 a.append(self.outside)
329 self.assertEqual(list(exhit), [])
330 self.assertEqual(list(empit), [self.outside])
331 self.assertEqual(list(a), list(self.example) + [self.outside])
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000332
Walter Dörwald7fd94242003-05-18 00:47:47 +0000333 def test_insert(self):
334 a = array.array(self.typecode, self.example)
335 a.insert(0, self.example[0])
336 self.assertEqual(len(a), 1+len(self.example))
337 self.assertEqual(a[0], a[1])
338 self.assertRaises(TypeError, a.insert)
339 self.assertRaises(TypeError, a.insert, None)
Walter Dörwaldba39d9c2003-05-18 01:56:25 +0000340 self.assertRaises(TypeError, a.insert, 0, None)
Martin v. Löwis99866332002-03-01 10:27:01 +0000341
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000342 a = array.array(self.typecode, self.example)
343 a.insert(-1, self.example[0])
344 self.assertEqual(
345 a,
346 array.array(
347 self.typecode,
348 self.example[:-1] + self.example[:1] + self.example[-1:]
349 )
350 )
351
352 a = array.array(self.typecode, self.example)
353 a.insert(-1000, self.example[0])
354 self.assertEqual(
355 a,
356 array.array(self.typecode, self.example[:1] + self.example)
357 )
358
359 a = array.array(self.typecode, self.example)
360 a.insert(1000, self.example[0])
361 self.assertEqual(
362 a,
363 array.array(self.typecode, self.example + self.example[:1])
364 )
365
Walter Dörwald7fd94242003-05-18 00:47:47 +0000366 def test_tofromfile(self):
367 a = array.array(self.typecode, 2*self.example)
368 self.assertRaises(TypeError, a.tofile)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000369 support.unlink(support.TESTFN)
370 f = open(support.TESTFN, 'wb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000371 try:
372 a.tofile(f)
373 f.close()
374 b = array.array(self.typecode)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000375 f = open(support.TESTFN, 'rb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000376 self.assertRaises(TypeError, b.fromfile)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000377 b.fromfile(f, len(self.example))
378 self.assertEqual(b, array.array(self.typecode, self.example))
379 self.assertNotEqual(a, b)
Hirokazu Yamamoto54d0df62009-03-06 03:04:07 +0000380 self.assertRaises(EOFError, b.fromfile, f, len(self.example)+1)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000381 self.assertEqual(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000382 f.close()
383 finally:
384 if not f.closed:
385 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000386 support.unlink(support.TESTFN)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000387
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000388 def test_fromfile_ioerror(self):
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200389 # Issue #5395: Check if fromfile raises a proper OSError
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000390 # instead of EOFError.
391 a = array.array(self.typecode)
392 f = open(support.TESTFN, 'wb')
393 try:
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200394 self.assertRaises(OSError, a.fromfile, f, len(self.example))
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000395 finally:
396 f.close()
397 support.unlink(support.TESTFN)
398
Frank Wierzbicki17683432009-08-16 20:30:12 +0000399 def test_filewrite(self):
400 a = array.array(self.typecode, 2*self.example)
401 f = open(support.TESTFN, 'wb')
402 try:
403 f.write(a)
404 f.close()
405 b = array.array(self.typecode)
406 f = open(support.TESTFN, 'rb')
407 b.fromfile(f, len(self.example))
408 self.assertEqual(b, array.array(self.typecode, self.example))
409 self.assertNotEqual(a, b)
410 b.fromfile(f, len(self.example))
411 self.assertEqual(a, b)
412 f.close()
413 finally:
414 if not f.closed:
415 f.close()
416 support.unlink(support.TESTFN)
417
Walter Dörwald7fd94242003-05-18 00:47:47 +0000418 def test_tofromlist(self):
419 a = array.array(self.typecode, 2*self.example)
420 b = array.array(self.typecode)
421 self.assertRaises(TypeError, a.tolist, 42)
422 self.assertRaises(TypeError, b.fromlist)
423 self.assertRaises(TypeError, b.fromlist, 42)
424 self.assertRaises(TypeError, b.fromlist, [None])
425 b.fromlist(a.tolist())
426 self.assertEqual(a, b)
Fred Drake78334472000-06-28 17:50:51 +0000427
Walter Dörwald7fd94242003-05-18 00:47:47 +0000428 def test_tofromstring(self):
Brett Cannon1eb32c22014-10-10 16:26:45 -0400429 # Warnings not raised when arguments are incorrect as Argument Clinic
430 # handles that before the warning can be raised.
431 nb_warnings = 2
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000432 with warnings.catch_warnings(record=True) as r:
433 warnings.filterwarnings("always",
434 message=r"(to|from)string\(\) is deprecated",
435 category=DeprecationWarning)
436 a = array.array(self.typecode, 2*self.example)
437 b = array.array(self.typecode)
438 self.assertRaises(TypeError, a.tostring, 42)
439 self.assertRaises(TypeError, b.fromstring)
440 self.assertRaises(TypeError, b.fromstring, 42)
441 b.fromstring(a.tostring())
442 self.assertEqual(a, b)
443 if a.itemsize>1:
444 self.assertRaises(ValueError, b.fromstring, "x")
445 nb_warnings += 1
446 self.assertEqual(len(r), nb_warnings)
447
448 def test_tofrombytes(self):
Walter Dörwald7fd94242003-05-18 00:47:47 +0000449 a = array.array(self.typecode, 2*self.example)
450 b = array.array(self.typecode)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000451 self.assertRaises(TypeError, a.tobytes, 42)
452 self.assertRaises(TypeError, b.frombytes)
453 self.assertRaises(TypeError, b.frombytes, 42)
454 b.frombytes(a.tobytes())
455 c = array.array(self.typecode, bytearray(a.tobytes()))
Walter Dörwald7fd94242003-05-18 00:47:47 +0000456 self.assertEqual(a, b)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000457 self.assertEqual(a, c)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000458 if a.itemsize>1:
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000459 self.assertRaises(ValueError, b.frombytes, b"x")
Fred Drake78334472000-06-28 17:50:51 +0000460
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +0000461 def test_fromarray(self):
462 a = array.array(self.typecode, self.example)
463 b = array.array(self.typecode, a)
464 self.assertEqual(a, b)
465
Walter Dörwald7fd94242003-05-18 00:47:47 +0000466 def test_repr(self):
467 a = array.array(self.typecode, 2*self.example)
468 self.assertEqual(a, eval(repr(a), {"array": array.array}))
Fred Drake78334472000-06-28 17:50:51 +0000469
Walter Dörwald7fd94242003-05-18 00:47:47 +0000470 a = array.array(self.typecode)
471 self.assertEqual(repr(a), "array('%s')" % self.typecode)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000472
Walter Dörwald7fd94242003-05-18 00:47:47 +0000473 def test_str(self):
474 a = array.array(self.typecode, 2*self.example)
475 str(a)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000476
Walter Dörwald7fd94242003-05-18 00:47:47 +0000477 def test_cmp(self):
478 a = array.array(self.typecode, self.example)
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200479 self.assertIs(a == 42, False)
480 self.assertIs(a != 42, True)
Tim Peterscc78e472000-11-14 21:36:07 +0000481
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200482 self.assertIs(a == a, True)
483 self.assertIs(a != a, False)
484 self.assertIs(a < a, False)
485 self.assertIs(a <= a, True)
486 self.assertIs(a > a, False)
487 self.assertIs(a >= a, True)
Tim Peterscc78e472000-11-14 21:36:07 +0000488
Neal Norwitzbd2835c2006-03-17 08:54:15 +0000489 al = array.array(self.typecode, self.smallerexample)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000490 ab = array.array(self.typecode, self.biggerexample)
Guido van Rossum7f1d3aa1998-07-16 15:31:43 +0000491
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200492 self.assertIs(a == 2*a, False)
493 self.assertIs(a != 2*a, True)
494 self.assertIs(a < 2*a, True)
495 self.assertIs(a <= 2*a, True)
496 self.assertIs(a > 2*a, False)
497 self.assertIs(a >= 2*a, False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000498
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200499 self.assertIs(a == al, False)
500 self.assertIs(a != al, True)
501 self.assertIs(a < al, False)
502 self.assertIs(a <= al, False)
503 self.assertIs(a > al, True)
504 self.assertIs(a >= al, True)
Martin v. Löwis99866332002-03-01 10:27:01 +0000505
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200506 self.assertIs(a == ab, False)
507 self.assertIs(a != ab, True)
508 self.assertIs(a < ab, True)
509 self.assertIs(a <= ab, True)
510 self.assertIs(a > ab, False)
511 self.assertIs(a >= ab, False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000512
Walter Dörwald7fd94242003-05-18 00:47:47 +0000513 def test_add(self):
514 a = array.array(self.typecode, self.example) \
515 + array.array(self.typecode, self.example[::-1])
516 self.assertEqual(
517 a,
518 array.array(self.typecode, self.example + self.example[::-1])
519 )
Martin v. Löwis99866332002-03-01 10:27:01 +0000520
Walter Dörwald7fd94242003-05-18 00:47:47 +0000521 b = array.array(self.badtypecode())
522 self.assertRaises(TypeError, a.__add__, b)
523
524 self.assertRaises(TypeError, a.__add__, "bad")
525
526 def test_iadd(self):
527 a = array.array(self.typecode, self.example[::-1])
528 b = a
529 a += array.array(self.typecode, 2*self.example)
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200530 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000531 self.assertEqual(
532 a,
533 array.array(self.typecode, self.example[::-1]+2*self.example)
534 )
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000535 a = array.array(self.typecode, self.example)
536 a += a
537 self.assertEqual(
538 a,
539 array.array(self.typecode, self.example + self.example)
540 )
Walter Dörwald7fd94242003-05-18 00:47:47 +0000541
542 b = array.array(self.badtypecode())
543 self.assertRaises(TypeError, a.__add__, b)
544
545 self.assertRaises(TypeError, a.__iadd__, "bad")
546
547 def test_mul(self):
548 a = 5*array.array(self.typecode, self.example)
549 self.assertEqual(
550 a,
551 array.array(self.typecode, 5*self.example)
552 )
553
554 a = array.array(self.typecode, self.example)*5
555 self.assertEqual(
556 a,
557 array.array(self.typecode, self.example*5)
558 )
559
560 a = 0*array.array(self.typecode, self.example)
561 self.assertEqual(
562 a,
563 array.array(self.typecode)
564 )
565
566 a = (-1)*array.array(self.typecode, self.example)
567 self.assertEqual(
568 a,
569 array.array(self.typecode)
570 )
571
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000572 a = 5 * array.array(self.typecode, self.example[:1])
573 self.assertEqual(
574 a,
575 array.array(self.typecode, [a[0]] * 5)
576 )
577
Walter Dörwald7fd94242003-05-18 00:47:47 +0000578 self.assertRaises(TypeError, a.__mul__, "bad")
579
580 def test_imul(self):
581 a = array.array(self.typecode, self.example)
582 b = a
583
584 a *= 5
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200585 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000586 self.assertEqual(
587 a,
588 array.array(self.typecode, 5*self.example)
589 )
590
591 a *= 0
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200592 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000593 self.assertEqual(a, array.array(self.typecode))
594
595 a *= 1000
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200596 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000597 self.assertEqual(a, array.array(self.typecode))
598
599 a *= -1
Serhiy Storchaka91b3e772013-11-17 00:45:17 +0200600 self.assertIs(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000601 self.assertEqual(a, array.array(self.typecode))
602
603 a = array.array(self.typecode, self.example)
604 a *= -1
605 self.assertEqual(a, array.array(self.typecode))
606
607 self.assertRaises(TypeError, a.__imul__, "bad")
608
609 def test_getitem(self):
610 a = array.array(self.typecode, self.example)
611 self.assertEntryEqual(a[0], self.example[0])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000612 self.assertEntryEqual(a[0], self.example[0])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000613 self.assertEntryEqual(a[-1], self.example[-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000614 self.assertEntryEqual(a[-1], self.example[-1])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000615 self.assertEntryEqual(a[len(self.example)-1], self.example[-1])
616 self.assertEntryEqual(a[-len(self.example)], self.example[0])
617 self.assertRaises(TypeError, a.__getitem__)
618 self.assertRaises(IndexError, a.__getitem__, len(self.example))
619 self.assertRaises(IndexError, a.__getitem__, -len(self.example)-1)
620
621 def test_setitem(self):
622 a = array.array(self.typecode, self.example)
623 a[0] = a[-1]
624 self.assertEntryEqual(a[0], a[-1])
625
626 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000627 a[0] = a[-1]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000628 self.assertEntryEqual(a[0], a[-1])
629
630 a = array.array(self.typecode, self.example)
631 a[-1] = a[0]
632 self.assertEntryEqual(a[0], a[-1])
633
634 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000635 a[-1] = a[0]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000636 self.assertEntryEqual(a[0], a[-1])
637
638 a = array.array(self.typecode, self.example)
639 a[len(self.example)-1] = a[0]
640 self.assertEntryEqual(a[0], a[-1])
641
642 a = array.array(self.typecode, self.example)
643 a[-len(self.example)] = a[-1]
644 self.assertEntryEqual(a[0], a[-1])
645
646 self.assertRaises(TypeError, a.__setitem__)
647 self.assertRaises(TypeError, a.__setitem__, None)
648 self.assertRaises(TypeError, a.__setitem__, 0, None)
649 self.assertRaises(
650 IndexError,
651 a.__setitem__,
652 len(self.example), self.example[0]
653 )
654 self.assertRaises(
655 IndexError,
656 a.__setitem__,
657 -len(self.example)-1, self.example[0]
658 )
659
660 def test_delitem(self):
661 a = array.array(self.typecode, self.example)
662 del a[0]
663 self.assertEqual(
664 a,
665 array.array(self.typecode, self.example[1:])
666 )
667
668 a = array.array(self.typecode, self.example)
669 del a[-1]
670 self.assertEqual(
671 a,
672 array.array(self.typecode, self.example[:-1])
673 )
674
675 a = array.array(self.typecode, self.example)
676 del a[len(self.example)-1]
677 self.assertEqual(
678 a,
679 array.array(self.typecode, self.example[:-1])
680 )
681
682 a = array.array(self.typecode, self.example)
683 del a[-len(self.example)]
684 self.assertEqual(
685 a,
686 array.array(self.typecode, self.example[1:])
687 )
688
689 self.assertRaises(TypeError, a.__delitem__)
690 self.assertRaises(TypeError, a.__delitem__, None)
691 self.assertRaises(IndexError, a.__delitem__, len(self.example))
692 self.assertRaises(IndexError, a.__delitem__, -len(self.example)-1)
693
694 def test_getslice(self):
695 a = array.array(self.typecode, self.example)
696 self.assertEqual(a[:], a)
697
698 self.assertEqual(
699 a[1:],
700 array.array(self.typecode, self.example[1:])
701 )
702
703 self.assertEqual(
704 a[:1],
705 array.array(self.typecode, self.example[:1])
706 )
707
708 self.assertEqual(
709 a[:-1],
710 array.array(self.typecode, self.example[:-1])
711 )
712
713 self.assertEqual(
714 a[-1:],
715 array.array(self.typecode, self.example[-1:])
716 )
717
718 self.assertEqual(
719 a[-1:-1],
720 array.array(self.typecode)
721 )
722
723 self.assertEqual(
Walter Dörwald1083c242005-01-21 21:16:51 +0000724 a[2:1],
725 array.array(self.typecode)
726 )
727
728 self.assertEqual(
Walter Dörwald7fd94242003-05-18 00:47:47 +0000729 a[1000:],
730 array.array(self.typecode)
731 )
732 self.assertEqual(a[-1000:], a)
733 self.assertEqual(a[:1000], a)
734 self.assertEqual(
735 a[:-1000],
736 array.array(self.typecode)
737 )
738 self.assertEqual(a[-1000:1000], a)
739 self.assertEqual(
740 a[2000:1000],
741 array.array(self.typecode)
742 )
743
Thomas Woutersed03b412007-08-28 21:37:11 +0000744 def test_extended_getslice(self):
745 # Test extended slicing by comparing with list slicing
746 # (Assumes list conversion works correctly, too)
747 a = array.array(self.typecode, self.example)
748 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
749 for start in indices:
750 for stop in indices:
751 # Everything except the initial 0 (invalid step)
752 for step in indices[1:]:
753 self.assertEqual(list(a[start:stop:step]),
754 list(a)[start:stop:step])
755
Walter Dörwald7fd94242003-05-18 00:47:47 +0000756 def test_setslice(self):
757 a = array.array(self.typecode, self.example)
758 a[:1] = a
759 self.assertEqual(
760 a,
761 array.array(self.typecode, self.example + self.example[1:])
762 )
763
764 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000765 a[:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000766 self.assertEqual(
767 a,
768 array.array(self.typecode, self.example + self.example[-1:])
769 )
770
771 a = array.array(self.typecode, self.example)
772 a[-1:] = a
773 self.assertEqual(
774 a,
775 array.array(self.typecode, self.example[:-1] + self.example)
776 )
777
778 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000779 a[1:] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000780 self.assertEqual(
781 a,
782 array.array(self.typecode, self.example[:1] + self.example)
783 )
784
785 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000786 a[1:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000787 self.assertEqual(
788 a,
789 array.array(
790 self.typecode,
791 self.example[:1] + self.example + self.example[-1:]
792 )
793 )
794
795 a = array.array(self.typecode, self.example)
796 a[1000:] = a
797 self.assertEqual(
798 a,
799 array.array(self.typecode, 2*self.example)
800 )
801
802 a = array.array(self.typecode, self.example)
803 a[-1000:] = a
804 self.assertEqual(
805 a,
806 array.array(self.typecode, self.example)
807 )
808
809 a = array.array(self.typecode, self.example)
810 a[:1000] = a
811 self.assertEqual(
812 a,
813 array.array(self.typecode, self.example)
814 )
815
816 a = array.array(self.typecode, self.example)
817 a[:-1000] = a
818 self.assertEqual(
819 a,
820 array.array(self.typecode, 2*self.example)
821 )
822
823 a = array.array(self.typecode, self.example)
824 a[1:0] = a
825 self.assertEqual(
826 a,
827 array.array(self.typecode, self.example[:1] + self.example + self.example[1:])
828 )
829
830 a = array.array(self.typecode, self.example)
831 a[2000:1000] = a
832 self.assertEqual(
833 a,
834 array.array(self.typecode, 2*self.example)
835 )
836
837 a = array.array(self.typecode, self.example)
Thomas Woutersed03b412007-08-28 21:37:11 +0000838 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), None)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000839 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), None)
840
841 b = array.array(self.badtypecode())
Thomas Woutersed03b412007-08-28 21:37:11 +0000842 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000843 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), b)
844
Thomas Woutersed03b412007-08-28 21:37:11 +0000845 def test_extended_set_del_slice(self):
846 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
847 for start in indices:
848 for stop in indices:
849 # Everything except the initial 0 (invalid step)
850 for step in indices[1:]:
851 a = array.array(self.typecode, self.example)
852 L = list(a)
853 # Make sure we have a slice of exactly the right length,
854 # but with (hopefully) different data.
855 data = L[start:stop:step]
856 data.reverse()
857 L[start:stop:step] = data
858 a[start:stop:step] = array.array(self.typecode, data)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000859 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000860
861 del L[start:stop:step]
862 del a[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +0000863 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000864
Walter Dörwald7fd94242003-05-18 00:47:47 +0000865 def test_index(self):
866 example = 2*self.example
867 a = array.array(self.typecode, example)
868 self.assertRaises(TypeError, a.index)
869 for x in example:
870 self.assertEqual(a.index(x), example.index(x))
871 self.assertRaises(ValueError, a.index, None)
872 self.assertRaises(ValueError, a.index, self.outside)
873
874 def test_count(self):
875 example = 2*self.example
876 a = array.array(self.typecode, example)
877 self.assertRaises(TypeError, a.count)
878 for x in example:
879 self.assertEqual(a.count(x), example.count(x))
880 self.assertEqual(a.count(self.outside), 0)
881 self.assertEqual(a.count(None), 0)
882
883 def test_remove(self):
884 for x in self.example:
885 example = 2*self.example
886 a = array.array(self.typecode, example)
887 pos = example.index(x)
888 example2 = example[:pos] + example[pos+1:]
889 a.remove(x)
890 self.assertEqual(a, array.array(self.typecode, example2))
891
892 a = array.array(self.typecode, self.example)
893 self.assertRaises(ValueError, a.remove, self.outside)
894
895 self.assertRaises(ValueError, a.remove, None)
896
897 def test_pop(self):
898 a = array.array(self.typecode)
899 self.assertRaises(IndexError, a.pop)
900
901 a = array.array(self.typecode, 2*self.example)
902 self.assertRaises(TypeError, a.pop, 42, 42)
903 self.assertRaises(TypeError, a.pop, None)
904 self.assertRaises(IndexError, a.pop, len(a))
905 self.assertRaises(IndexError, a.pop, -len(a)-1)
906
907 self.assertEntryEqual(a.pop(0), self.example[0])
908 self.assertEqual(
909 a,
910 array.array(self.typecode, self.example[1:]+self.example)
911 )
912 self.assertEntryEqual(a.pop(1), self.example[2])
913 self.assertEqual(
914 a,
915 array.array(self.typecode, self.example[1:2]+self.example[3:]+self.example)
916 )
917 self.assertEntryEqual(a.pop(0), self.example[1])
918 self.assertEntryEqual(a.pop(), self.example[-1])
919 self.assertEqual(
920 a,
921 array.array(self.typecode, self.example[3:]+self.example[:-1])
922 )
923
924 def test_reverse(self):
925 a = array.array(self.typecode, self.example)
926 self.assertRaises(TypeError, a.reverse, 42)
Fred Drake004d5e62000-10-23 17:22:08 +0000927 a.reverse()
Walter Dörwald7fd94242003-05-18 00:47:47 +0000928 self.assertEqual(
929 a,
930 array.array(self.typecode, self.example[::-1])
931 )
932
933 def test_extend(self):
934 a = array.array(self.typecode, self.example)
935 self.assertRaises(TypeError, a.extend)
936 a.extend(array.array(self.typecode, self.example[::-1]))
937 self.assertEqual(
938 a,
939 array.array(self.typecode, self.example+self.example[::-1])
940 )
941
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000942 a = array.array(self.typecode, self.example)
943 a.extend(a)
944 self.assertEqual(
945 a,
946 array.array(self.typecode, self.example+self.example)
947 )
948
Walter Dörwald7fd94242003-05-18 00:47:47 +0000949 b = array.array(self.badtypecode())
950 self.assertRaises(TypeError, a.extend, b)
951
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000952 a = array.array(self.typecode, self.example)
953 a.extend(self.example[::-1])
954 self.assertEqual(
955 a,
956 array.array(self.typecode, self.example+self.example[::-1])
957 )
958
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +0000959 def test_constructor_with_iterable_argument(self):
960 a = array.array(self.typecode, iter(self.example))
961 b = array.array(self.typecode, self.example)
962 self.assertEqual(a, b)
963
964 # non-iterable argument
965 self.assertRaises(TypeError, array.array, self.typecode, 10)
966
967 # pass through errors raised in __iter__
968 class A:
969 def __iter__(self):
970 raise UnicodeError
971 self.assertRaises(UnicodeError, array.array, self.typecode, A())
972
973 # pass through errors raised in next()
974 def B():
975 raise UnicodeError
976 yield None
977 self.assertRaises(UnicodeError, array.array, self.typecode, B())
978
Walter Dörwald7fd94242003-05-18 00:47:47 +0000979 def test_coveritertraverse(self):
980 try:
981 import gc
982 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -0600983 self.skipTest('gc module not available')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000984 a = array.array(self.typecode)
985 l = [iter(a)]
986 l.append(l)
987 gc.collect()
988
989 def test_buffer(self):
990 a = array.array(self.typecode, self.example)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000991 m = memoryview(a)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000992 expected = m.tobytes()
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000993 self.assertEqual(a.tobytes(), expected)
994 self.assertEqual(a.tobytes()[0], expected[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000995 # Resizing is forbidden when there are buffer exports.
996 # For issue 4509, we also check after each error that
997 # the array was not modified.
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000998 self.assertRaises(BufferError, a.append, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000999 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001000 self.assertRaises(BufferError, a.extend, a[0:1])
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001001 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001002 self.assertRaises(BufferError, a.remove, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001003 self.assertEqual(m.tobytes(), expected)
1004 self.assertRaises(BufferError, a.pop, 0)
1005 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001006 self.assertRaises(BufferError, a.fromlist, a.tolist())
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001007 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001008 self.assertRaises(BufferError, a.frombytes, a.tobytes())
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001009 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001010 if self.typecode == 'u':
1011 self.assertRaises(BufferError, a.fromunicode, a.tounicode())
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001012 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +00001013 self.assertRaises(BufferError, operator.imul, a, 2)
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001014 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +00001015 self.assertRaises(BufferError, operator.imul, a, 0)
Alexandre Vassalotti47137252009-07-05 19:57:00 +00001016 self.assertEqual(m.tobytes(), expected)
1017 self.assertRaises(BufferError, operator.setitem, a, slice(0, 0), a)
1018 self.assertEqual(m.tobytes(), expected)
1019 self.assertRaises(BufferError, operator.delitem, a, 0)
1020 self.assertEqual(m.tobytes(), expected)
1021 self.assertRaises(BufferError, operator.delitem, a, slice(0, 1))
1022 self.assertEqual(m.tobytes(), expected)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001023
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001024 def test_weakref(self):
1025 s = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001026 p = weakref.proxy(s)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001027 self.assertEqual(p.tobytes(), s.tobytes())
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001028 s = None
1029 self.assertRaises(ReferenceError, len, p)
1030
Serhiy Storchaka43767632013-11-03 21:31:38 +02001031 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
1032 'test needs sys.getrefcount()')
Skip Montanarod5cf0b82003-08-03 23:02:10 +00001033 def test_bug_782369(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +02001034 for i in range(10):
1035 b = array.array('B', range(64))
1036 rc = sys.getrefcount(10)
1037 for i in range(10):
1038 b = array.array('B', range(64))
1039 self.assertEqual(rc, sys.getrefcount(10))
Skip Montanarod5cf0b82003-08-03 23:02:10 +00001040
Thomas Woutersb2137042007-02-01 18:02:27 +00001041 def test_subclass_with_kwargs(self):
1042 # SF bug #1486663 -- this used to erroneously raise a TypeError
1043 ArraySubclassWithKwargs('b', newarg=1)
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001044
Guido van Rossum6b826ab2007-07-03 16:22:09 +00001045 def test_create_from_bytes(self):
Alexandre Vassalotti7e4f3212009-07-05 05:38:18 +00001046 # XXX This test probably needs to be moved in a subclass or
1047 # generalized to use self.typecode.
Guido van Rossum6b826ab2007-07-03 16:22:09 +00001048 a = array.array('H', b"1234")
1049 self.assertEqual(len(a) * a.itemsize, 4)
1050
Meador Inge03b4d502012-08-10 22:35:45 -05001051 @support.cpython_only
1052 def test_sizeof_with_buffer(self):
1053 a = array.array(self.typecode, self.example)
Meador Inge80dd1af2012-08-10 23:21:39 -05001054 basesize = support.calcvobjsize('Pn2Pi')
Meador Inge03b4d502012-08-10 22:35:45 -05001055 buffer_size = a.buffer_info()[1] * a.itemsize
1056 support.check_sizeof(self, a, basesize + buffer_size)
1057
1058 @support.cpython_only
1059 def test_sizeof_without_buffer(self):
1060 a = array.array(self.typecode)
Meador Inge80dd1af2012-08-10 23:21:39 -05001061 basesize = support.calcvobjsize('Pn2Pi')
Meador Inge03b4d502012-08-10 22:35:45 -05001062 support.check_sizeof(self, a, basesize)
1063
Alexandre Vassalotti9730e332013-11-29 20:47:15 -08001064 def test_initialize_with_unicode(self):
1065 if self.typecode != 'u':
1066 with self.assertRaises(TypeError) as cm:
1067 a = array.array(self.typecode, 'foo')
1068 self.assertIn("cannot use a str", str(cm.exception))
1069 with self.assertRaises(TypeError) as cm:
1070 a = array.array(self.typecode, array.array('u', 'foo'))
1071 self.assertIn("cannot use a unicode array", str(cm.exception))
1072 else:
1073 a = array.array(self.typecode, "foo")
1074 a = array.array(self.typecode, array.array('u', 'foo'))
1075
Stefan Krah650c1e82015-02-03 21:43:23 +01001076 @support.cpython_only
1077 def test_obsolete_write_lock(self):
1078 from _testcapi import getbuffer_with_null_view
1079 a = array.array('B', b"")
1080 self.assertRaises(BufferError, getbuffer_with_null_view, a)
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001081
Serhiy Storchakaab0d1982016-03-30 21:11:16 +03001082 def test_free_after_iterating(self):
1083 support.check_free_after_iterating(self, iter, array.array,
1084 (self.typecode,))
1085 support.check_free_after_iterating(self, reversed, array.array,
1086 (self.typecode,))
1087
Walter Dörwald7fd94242003-05-18 00:47:47 +00001088class StringTest(BaseTest):
1089
1090 def test_setitem(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001091 super().test_setitem()
Walter Dörwald7fd94242003-05-18 00:47:47 +00001092 a = array.array(self.typecode, self.example)
1093 self.assertRaises(TypeError, a.__setitem__, 0, self.example[:2])
1094
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001095class UnicodeTest(StringTest, unittest.TestCase):
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001096 typecode = 'u'
1097 example = '\x01\u263a\x00\ufeff'
1098 smallerexample = '\x01\u263a\x00\ufefe'
1099 biggerexample = '\x01\u263a\x01\ufeff'
1100 outside = str('\x33')
Victor Stinner8d4734f2012-08-08 20:09:21 +02001101 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001102
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001103 def test_unicode(self):
1104 self.assertRaises(TypeError, array.array, 'b', 'foo')
Walter Dörwald7fd94242003-05-18 00:47:47 +00001105
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001106 a = array.array('u', '\xa0\xc2\u1234')
1107 a.fromunicode(' ')
1108 a.fromunicode('')
1109 a.fromunicode('')
1110 a.fromunicode('\x11abc\xff\u1234')
1111 s = a.tounicode()
1112 self.assertEqual(s, '\xa0\xc2\u1234 \x11abc\xff\u1234')
Victor Stinner9d512ab2012-08-09 00:43:56 +02001113 self.assertEqual(a.itemsize, sizeof_wchar)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001114
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001115 s = '\x00="\'a\\b\x80\xff\u0000\u0001\u1234'
1116 a = array.array('u', s)
1117 self.assertEqual(
1118 repr(a),
Georg Brandl559e5d72008-06-11 18:37:52 +00001119 "array('u', '\\x00=\"\\'a\\\\b\\x80\xff\\x00\\x01\u1234')")
Walter Dörwald7fd94242003-05-18 00:47:47 +00001120
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001121 self.assertRaises(TypeError, a.fromunicode)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001122
Victor Stinner29ec5952013-02-26 00:27:38 +01001123 def test_issue17223(self):
1124 # this used to crash
Victor Stinnerc472c5d2013-02-26 22:52:11 +01001125 if sizeof_wchar == 4:
1126 # U+FFFFFFFF is an invalid code point in Unicode 6.0
1127 invalid_str = b'\xff\xff\xff\xff'
1128 else:
Victor Stinner29c00342013-03-08 02:33:06 +01001129 # PyUnicode_FromUnicode() cannot fail with 16-bit wchar_t
1130 self.skipTest("specific to 32-bit wchar_t")
Victor Stinnerc472c5d2013-02-26 22:52:11 +01001131 a = array.array('u', invalid_str)
Victor Stinner29ec5952013-02-26 00:27:38 +01001132 self.assertRaises(ValueError, a.tounicode)
1133 self.assertRaises(ValueError, str, a)
1134
Walter Dörwald7fd94242003-05-18 00:47:47 +00001135class NumberTest(BaseTest):
1136
1137 def test_extslice(self):
1138 a = array.array(self.typecode, range(5))
1139 self.assertEqual(a[::], a)
1140 self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
1141 self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
1142 self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
1143 self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
1144 self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
1145 self.assertEqual(a[-100:100:], a)
1146 self.assertEqual(a[100:-100:-1], a[::-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +00001147 self.assertEqual(a[-100:100:2], array.array(self.typecode, [0,2,4]))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001148 self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
1149 self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
1150
1151 def test_delslice(self):
1152 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001153 del a[::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001154 self.assertEqual(a, array.array(self.typecode, [1,3]))
1155 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001156 del a[1::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001157 self.assertEqual(a, array.array(self.typecode, [0,2,4]))
1158 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001159 del a[1::-2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001160 self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
1161 a = array.array(self.typecode, range(10))
Michael W. Hudson56796f62002-07-29 14:35:04 +00001162 del a[::1000]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001163 self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
Mark Dickinsonbc099642010-01-29 17:27:24 +00001164 # test issue7788
1165 a = array.array(self.typecode, range(10))
1166 del a[9::1<<333]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001167
1168 def test_assignment(self):
1169 a = array.array(self.typecode, range(10))
1170 a[::2] = array.array(self.typecode, [42]*5)
1171 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
1172 a = array.array(self.typecode, range(10))
1173 a[::-4] = array.array(self.typecode, [10]*3)
1174 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
1175 a = array.array(self.typecode, range(4))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001176 a[::-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +00001177 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
1178 a = array.array(self.typecode, range(10))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001179 b = a[:]
1180 c = a[:]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001181 ins = array.array(self.typecode, range(2))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001182 a[2:3] = ins
1183 b[slice(2,3)] = ins
1184 c[2:3:] = ins
Fred Drake004d5e62000-10-23 17:22:08 +00001185
Walter Dörwald7fd94242003-05-18 00:47:47 +00001186 def test_iterationcontains(self):
1187 a = array.array(self.typecode, range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +00001188 self.assertEqual(list(a), list(range(10)))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001189 b = array.array(self.typecode, [20])
1190 self.assertEqual(a[-1] in a, True)
1191 self.assertEqual(b[0] not in a, True)
1192
1193 def check_overflow(self, lower, upper):
1194 # method to be used by subclasses
1195
1196 # should not overflow assigning lower limit
1197 a = array.array(self.typecode, [lower])
1198 a[0] = lower
1199 # should overflow assigning less than lower limit
1200 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
1201 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
1202 # should not overflow assigning upper limit
1203 a = array.array(self.typecode, [upper])
1204 a[0] = upper
1205 # should overflow assigning more than upper limit
1206 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
1207 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
1208
1209 def test_subclassing(self):
1210 typecode = self.typecode
1211 class ExaggeratingArray(array.array):
1212 __slots__ = ['offset']
1213
1214 def __new__(cls, typecode, data, offset):
1215 return array.array.__new__(cls, typecode, data)
1216
1217 def __init__(self, typecode, data, offset):
1218 self.offset = offset
1219
1220 def __getitem__(self, i):
1221 return array.array.__getitem__(self, i) + self.offset
1222
1223 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
1224 self.assertEntryEqual(a[0], 7)
1225
1226 self.assertRaises(AttributeError, setattr, a, "color", "blue")
1227
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00001228 def test_frombytearray(self):
1229 a = array.array('b', range(10))
1230 b = array.array(self.typecode, a)
1231 self.assertEqual(a, b)
1232
orenmn964281a2017-03-09 11:35:28 +02001233class IntegerNumberTest(NumberTest):
1234 def test_type_error(self):
1235 a = array.array(self.typecode)
1236 a.append(42)
1237 with self.assertRaises(TypeError):
1238 a.append(42.0)
1239 with self.assertRaises(TypeError):
1240 a[0] = 42.0
1241
1242class Intable:
1243 def __init__(self, num):
1244 self._num = num
1245 def __int__(self):
1246 return self._num
1247 def __sub__(self, other):
1248 return Intable(int(self) - int(other))
1249 def __add__(self, other):
1250 return Intable(int(self) + int(other))
1251
1252class SignedNumberTest(IntegerNumberTest):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001253 example = [-1, 0, 1, 42, 0x7f]
1254 smallerexample = [-1, 0, 1, 42, 0x7e]
1255 biggerexample = [-1, 0, 1, 43, 0x7f]
1256 outside = 23
1257
1258 def test_overflow(self):
1259 a = array.array(self.typecode)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001260 lower = -1 * int(pow(2, a.itemsize * 8 - 1))
1261 upper = int(pow(2, a.itemsize * 8 - 1)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001262 self.check_overflow(lower, upper)
orenmn964281a2017-03-09 11:35:28 +02001263 self.check_overflow(Intable(lower), Intable(upper))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001264
orenmn964281a2017-03-09 11:35:28 +02001265class UnsignedNumberTest(IntegerNumberTest):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001266 example = [0, 1, 17, 23, 42, 0xff]
1267 smallerexample = [0, 1, 17, 23, 42, 0xfe]
1268 biggerexample = [0, 1, 17, 23, 43, 0xff]
1269 outside = 0xaa
1270
1271 def test_overflow(self):
1272 a = array.array(self.typecode)
1273 lower = 0
Guido van Rossume2a383d2007-01-15 16:59:06 +00001274 upper = int(pow(2, a.itemsize * 8)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001275 self.check_overflow(lower, upper)
orenmn964281a2017-03-09 11:35:28 +02001276 self.check_overflow(Intable(lower), Intable(upper))
Fred Drake004d5e62000-10-23 17:22:08 +00001277
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001278 def test_bytes_extend(self):
1279 s = bytes(self.example)
1280
1281 a = array.array(self.typecode, self.example)
1282 a.extend(s)
1283 self.assertEqual(
1284 a,
1285 array.array(self.typecode, self.example+self.example)
1286 )
1287
1288 a = array.array(self.typecode, self.example)
1289 a.extend(bytearray(reversed(s)))
1290 self.assertEqual(
1291 a,
1292 array.array(self.typecode, self.example+self.example[::-1])
1293 )
1294
Fred Drake004d5e62000-10-23 17:22:08 +00001295
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001296class ByteTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001297 typecode = 'b'
1298 minitemsize = 1
Fred Drake004d5e62000-10-23 17:22:08 +00001299
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001300class UnsignedByteTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001301 typecode = 'B'
1302 minitemsize = 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001303
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001304class ShortTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001305 typecode = 'h'
1306 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001307
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001308class UnsignedShortTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001309 typecode = 'H'
1310 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001311
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001312class IntTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001313 typecode = 'i'
1314 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001315
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001316class UnsignedIntTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001317 typecode = 'I'
1318 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001319
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001320class LongTest(SignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001321 typecode = 'l'
1322 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001323
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001324class UnsignedLongTest(UnsignedNumberTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001325 typecode = 'L'
1326 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001327
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001328class LongLongTest(SignedNumberTest, unittest.TestCase):
Meador Inge1c9f0c92011-09-20 19:55:51 -05001329 typecode = 'q'
1330 minitemsize = 8
Meador Inge1c9f0c92011-09-20 19:55:51 -05001331
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001332class UnsignedLongLongTest(UnsignedNumberTest, unittest.TestCase):
Meador Inge1c9f0c92011-09-20 19:55:51 -05001333 typecode = 'Q'
1334 minitemsize = 8
Meador Inge1c9f0c92011-09-20 19:55:51 -05001335
Walter Dörwald7fd94242003-05-18 00:47:47 +00001336class FPTest(NumberTest):
1337 example = [-42.0, 0, 42, 1e5, -1e10]
1338 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
1339 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
1340 outside = 23
1341
1342 def assertEntryEqual(self, entry1, entry2):
1343 self.assertAlmostEqual(entry1, entry2)
1344
Adrian Wielgosik7c17e232017-08-17 12:46:06 +00001345 def test_nan(self):
1346 a = array.array(self.typecode, [float('nan')])
1347 b = array.array(self.typecode, [float('nan')])
1348 self.assertIs(a != b, True)
1349 self.assertIs(a == b, False)
1350 self.assertIs(a > b, False)
1351 self.assertIs(a >= b, False)
1352 self.assertIs(a < b, False)
1353 self.assertIs(a <= b, False)
1354
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001355 def test_byteswap(self):
1356 a = array.array(self.typecode, self.example)
1357 self.assertRaises(TypeError, a.byteswap, 42)
1358 if a.itemsize in (1, 2, 4, 8):
1359 b = array.array(self.typecode, self.example)
1360 b.byteswap()
1361 if a.itemsize==1:
1362 self.assertEqual(a, b)
1363 else:
1364 # On alphas treating the byte swapped bit patters as
1365 # floats/doubles results in floating point exceptions
1366 # => compare the 8bit string values instead
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001367 self.assertNotEqual(a.tobytes(), b.tobytes())
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001368 b.byteswap()
1369 self.assertEqual(a, b)
1370
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001371class FloatTest(FPTest, unittest.TestCase):
Neal Norwitz35c6cd02003-05-22 13:29:15 +00001372 typecode = 'f'
1373 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001374
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001375class DoubleTest(FPTest, unittest.TestCase):
Walter Dörwald7fd94242003-05-18 00:47:47 +00001376 typecode = 'd'
1377 minitemsize = 8
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001378
1379 def test_alloc_overflow(self):
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001380 from sys import maxsize
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001381 a = array.array('d', [-1]*65536)
1382 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001383 a *= maxsize//65536 + 1
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001384 except MemoryError:
1385 pass
1386 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001387 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001388 b = array.array('d', [ 2.71828183, 3.14159265, -1])
1389 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001390 b * (maxsize//3 + 1)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001391 except MemoryError:
1392 pass
1393 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001394 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001395
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001396
1397if __name__ == "__main__":
Ezio Melotti1d3e96d2013-01-10 06:04:50 +02001398 unittest.main()