blob: ba1165671f3ea7886378b537c3b53103a67b13c8 [file] [log] [blame]
Roger E. Masse8db1b071996-12-09 20:09:16 +00001#! /usr/bin/env python
2"""Test the arraymodule.
Roger E. Massefab8ab81996-12-20 22:36:52 +00003 Roger E. Masse
Roger E. Masse8db1b071996-12-09 20:09:16 +00004"""
Roger E. Massefab8ab81996-12-20 22:36:52 +00005
Walter Dörwald7fd94242003-05-18 00:47:47 +00006import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00007from test import support
Alexandre Vassalottiad077152009-07-15 17:49:23 +00008import weakref
9import pickle
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +000010import operator
Alexandre Vassalottiad077152009-07-15 17:49:23 +000011import io
12import math
13import struct
14
15import array
16from array import _array_reconstructor as array_reconstructor
17
Raymond Hettingerb0900e62004-12-16 16:23:40 +000018
19class ArraySubclass(array.array):
20 pass
Guido van Rossumc9f8f141997-04-09 20:51:54 +000021
Thomas Woutersb2137042007-02-01 18:02:27 +000022class ArraySubclassWithKwargs(array.array):
23 def __init__(self, typecode, newarg=None):
24 array.array.__init__(typecode)
25
Walter Dörwald7fd94242003-05-18 00:47:47 +000026tests = [] # list to accumulate all tests
Guido van Rossum31f72d72007-06-18 18:44:28 +000027typecodes = "ubBhHiIlLfd"
Martin v. Löwis99866332002-03-01 10:27:01 +000028
Walter Dörwald7fd94242003-05-18 00:47:47 +000029class BadConstructorTest(unittest.TestCase):
Martin v. Löwis99866332002-03-01 10:27:01 +000030
Walter Dörwald7fd94242003-05-18 00:47:47 +000031 def test_constructor(self):
32 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
Walter Dörwald7fd94242003-05-18 00:47:47 +000037tests.append(BadConstructorTest)
Martin v. Löwis99866332002-03-01 10:27:01 +000038
Alexandre Vassalottiad077152009-07-15 17:49:23 +000039# Machine format codes.
40#
41# Search for "enum machine_format_code" in Modules/arraymodule.c to get the
42# authoritative values.
43UNKNOWN_FORMAT = -1
44UNSIGNED_INT8 = 0
45SIGNED_INT8 = 1
46UNSIGNED_INT16_LE = 2
47UNSIGNED_INT16_BE = 3
48SIGNED_INT16_LE = 4
49SIGNED_INT16_BE = 5
50UNSIGNED_INT32_LE = 6
51UNSIGNED_INT32_BE = 7
52SIGNED_INT32_LE = 8
53SIGNED_INT32_BE = 9
54UNSIGNED_INT64_LE = 10
55UNSIGNED_INT64_BE = 11
56SIGNED_INT64_LE = 12
57SIGNED_INT64_BE = 13
58IEEE_754_FLOAT_LE = 14
59IEEE_754_FLOAT_BE = 15
60IEEE_754_DOUBLE_LE = 16
61IEEE_754_DOUBLE_BE = 17
62UTF16_LE = 18
63UTF16_BE = 19
64UTF32_LE = 20
65UTF32_BE = 21
66
67class ArrayReconstructorTest(unittest.TestCase):
68
69 def test_error(self):
70 self.assertRaises(TypeError, array_reconstructor,
71 "", "b", 0, b"")
72 self.assertRaises(TypeError, array_reconstructor,
73 str, "b", 0, b"")
74 self.assertRaises(TypeError, array_reconstructor,
75 array.array, "b", '', b"")
76 self.assertRaises(TypeError, array_reconstructor,
77 array.array, "b", 0, "")
78 self.assertRaises(ValueError, array_reconstructor,
79 array.array, "?", 0, b"")
80 self.assertRaises(ValueError, array_reconstructor,
81 array.array, "b", UNKNOWN_FORMAT, b"")
82 self.assertRaises(ValueError, array_reconstructor,
83 array.array, "b", 22, b"")
84 self.assertRaises(ValueError, array_reconstructor,
85 array.array, "d", 16, b"a")
86
87 def test_numbers(self):
88 testcases = (
89 (['B', 'H', 'I', 'L'], UNSIGNED_INT8, '=BBBB',
90 [0x80, 0x7f, 0, 0xff]),
91 (['b', 'h', 'i', 'l'], SIGNED_INT8, '=bbb',
92 [-0x80, 0x7f, 0]),
93 (['H', 'I', 'L'], UNSIGNED_INT16_LE, '<HHHH',
94 [0x8000, 0x7fff, 0, 0xffff]),
95 (['H', 'I', 'L'], UNSIGNED_INT16_BE, '>HHHH',
96 [0x8000, 0x7fff, 0, 0xffff]),
97 (['h', 'i', 'l'], SIGNED_INT16_LE, '<hhh',
98 [-0x8000, 0x7fff, 0]),
99 (['h', 'i', 'l'], SIGNED_INT16_BE, '>hhh',
100 [-0x8000, 0x7fff, 0]),
101 (['I', 'L'], UNSIGNED_INT32_LE, '<IIII',
102 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
103 (['I', 'L'], UNSIGNED_INT32_BE, '>IIII',
104 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
105 (['i', 'l'], SIGNED_INT32_LE, '<iii',
106 [-1<<31, (1<<31)-1, 0]),
107 (['i', 'l'], SIGNED_INT32_BE, '>iii',
108 [-1<<31, (1<<31)-1, 0]),
109 (['L'], UNSIGNED_INT64_LE, '<QQQQ',
Alexandre Vassalotti0027d4b2009-07-15 20:53:55 +0000110 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
111 (['L'], UNSIGNED_INT64_BE, '>QQQQ',
112 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
113 (['l'], SIGNED_INT64_LE, '<qqq',
114 [-1<<31, (1<<31)-1, 0]),
115 (['l'], SIGNED_INT64_BE, '>qqq',
116 [-1<<31, (1<<31)-1, 0]),
117 # The following tests for INT64 will raise an OverflowError
118 # when run on a 32-bit machine. The tests are simply skipped
119 # in that case.
120 (['L'], UNSIGNED_INT64_LE, '<QQQQ',
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000121 [1<<63, (1<<63)-1, 0, (1<<64)-1]),
122 (['L'], UNSIGNED_INT64_BE, '>QQQQ',
123 [1<<63, (1<<63)-1, 0, (1<<64)-1]),
124 (['l'], SIGNED_INT64_LE, '<qqq',
125 [-1<<63, (1<<63)-1, 0]),
126 (['l'], SIGNED_INT64_BE, '>qqq',
127 [-1<<63, (1<<63)-1, 0]),
128 (['f'], IEEE_754_FLOAT_LE, '<ffff',
129 [16711938.0, float('inf'), float('-inf'), -0.0]),
130 (['f'], IEEE_754_FLOAT_BE, '>ffff',
131 [16711938.0, float('inf'), float('-inf'), -0.0]),
132 (['d'], IEEE_754_DOUBLE_LE, '<dddd',
133 [9006104071832581.0, float('inf'), float('-inf'), -0.0]),
134 (['d'], IEEE_754_DOUBLE_BE, '>dddd',
135 [9006104071832581.0, float('inf'), float('-inf'), -0.0])
136 )
137 for testcase in testcases:
138 valid_typecodes, mformat_code, struct_fmt, values = testcase
139 arraystr = struct.pack(struct_fmt, *values)
140 for typecode in valid_typecodes:
Alexandre Vassalotti0027d4b2009-07-15 20:53:55 +0000141 try:
142 a = array.array(typecode, values)
143 except OverflowError:
144 continue # Skip this test case.
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000145 b = array_reconstructor(
146 array.array, typecode, mformat_code, arraystr)
147 self.assertEqual(a, b,
148 msg="{0!r} != {1!r}; testcase={2!r}".format(a, b, testcase))
149
150 def test_unicode(self):
151 teststr = "Bonne Journ\xe9e \U0002030a\U00020347"
152 testcases = (
153 (UTF16_LE, "UTF-16-LE"),
154 (UTF16_BE, "UTF-16-BE"),
155 (UTF32_LE, "UTF-32-LE"),
156 (UTF32_BE, "UTF-32-BE")
157 )
158 for testcase in testcases:
159 mformat_code, encoding = testcase
160 a = array.array('u', teststr)
161 b = array_reconstructor(
162 array.array, 'u', mformat_code, teststr.encode(encoding))
163 self.assertEqual(a, b,
164 msg="{0!r} != {1!r}; testcase={2!r}".format(a, b, testcase))
165
166
167tests.append(ArrayReconstructorTest)
168
169
Walter Dörwald7fd94242003-05-18 00:47:47 +0000170class BaseTest(unittest.TestCase):
171 # Required class attributes (provided by subclasses
172 # typecode: the typecode to test
173 # example: an initializer usable in the constructor for this type
174 # smallerexample: the same length as example, but smaller
175 # biggerexample: the same length as example, but bigger
176 # outside: An entry that is not in example
177 # minitemsize: the minimum guaranteed itemsize
Martin v. Löwis99866332002-03-01 10:27:01 +0000178
Walter Dörwald7fd94242003-05-18 00:47:47 +0000179 def assertEntryEqual(self, entry1, entry2):
180 self.assertEqual(entry1, entry2)
Martin v. Löwis99866332002-03-01 10:27:01 +0000181
Walter Dörwald7fd94242003-05-18 00:47:47 +0000182 def badtypecode(self):
183 # Return a typecode that is different from our own
184 return typecodes[(typecodes.index(self.typecode)+1) % len(typecodes)]
Martin v. Löwis99866332002-03-01 10:27:01 +0000185
Walter Dörwald7fd94242003-05-18 00:47:47 +0000186 def test_constructor(self):
187 a = array.array(self.typecode)
188 self.assertEqual(a.typecode, self.typecode)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000189 self.assertTrue(a.itemsize>=self.minitemsize)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000190 self.assertRaises(TypeError, array.array, self.typecode, None)
Martin v. Löwis99866332002-03-01 10:27:01 +0000191
Walter Dörwald7fd94242003-05-18 00:47:47 +0000192 def test_len(self):
193 a = array.array(self.typecode)
194 a.append(self.example[0])
195 self.assertEqual(len(a), 1)
Martin v. Löwis99866332002-03-01 10:27:01 +0000196
Walter Dörwald7fd94242003-05-18 00:47:47 +0000197 a = array.array(self.typecode, self.example)
198 self.assertEqual(len(a), len(self.example))
Martin v. Löwis99866332002-03-01 10:27:01 +0000199
Walter Dörwald7fd94242003-05-18 00:47:47 +0000200 def test_buffer_info(self):
201 a = array.array(self.typecode, self.example)
202 self.assertRaises(TypeError, a.buffer_info, 42)
203 bi = a.buffer_info()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000204 self.assertTrue(isinstance(bi, tuple))
Walter Dörwald7fd94242003-05-18 00:47:47 +0000205 self.assertEqual(len(bi), 2)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000206 self.assertTrue(isinstance(bi[0], int))
207 self.assertTrue(isinstance(bi[1], int))
Walter Dörwald7fd94242003-05-18 00:47:47 +0000208 self.assertEqual(bi[1], len(a))
Martin v. Löwis99866332002-03-01 10:27:01 +0000209
Walter Dörwald7fd94242003-05-18 00:47:47 +0000210 def test_byteswap(self):
211 a = array.array(self.typecode, self.example)
212 self.assertRaises(TypeError, a.byteswap, 42)
213 if a.itemsize in (1, 2, 4, 8):
214 b = array.array(self.typecode, self.example)
215 b.byteswap()
216 if a.itemsize==1:
217 self.assertEqual(a, b)
218 else:
219 self.assertNotEqual(a, b)
220 b.byteswap()
221 self.assertEqual(a, b)
Martin v. Löwis99866332002-03-01 10:27:01 +0000222
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000223 def test_copy(self):
224 import copy
225 a = array.array(self.typecode, self.example)
226 b = copy.copy(a)
227 self.assertNotEqual(id(a), id(b))
228 self.assertEqual(a, b)
229
Thomas Wouters89f507f2006-12-13 04:49:30 +0000230 def test_deepcopy(self):
231 import copy
232 a = array.array(self.typecode, self.example)
233 b = copy.deepcopy(a)
234 self.assertNotEqual(id(a), id(b))
235 self.assertEqual(a, b)
236
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000237 def test_reduce_ex(self):
238 a = array.array(self.typecode, self.example)
239 for protocol in range(3):
240 self.assert_(a.__reduce_ex__(protocol)[0] is array.array)
241 for protocol in range(3, pickle.HIGHEST_PROTOCOL):
242 self.assert_(a.__reduce_ex__(protocol)[0] is array_reconstructor)
243
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000244 def test_pickle(self):
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000245 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000246 a = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000247 b = pickle.loads(pickle.dumps(a, protocol))
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000248 self.assertNotEqual(id(a), id(b))
249 self.assertEqual(a, b)
250
251 a = ArraySubclass(self.typecode, self.example)
252 a.x = 10
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000253 b = pickle.loads(pickle.dumps(a, protocol))
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000254 self.assertNotEqual(id(a), id(b))
255 self.assertEqual(a, b)
256 self.assertEqual(a.x, b.x)
257 self.assertEqual(type(a), type(b))
258
Guido van Rossumd8faa362007-04-27 19:54:29 +0000259 def test_pickle_for_empty_array(self):
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000260 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossumd8faa362007-04-27 19:54:29 +0000261 a = array.array(self.typecode)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000262 b = pickle.loads(pickle.dumps(a, protocol))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000263 self.assertNotEqual(id(a), id(b))
264 self.assertEqual(a, b)
265
266 a = ArraySubclass(self.typecode)
267 a.x = 10
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000268 b = pickle.loads(pickle.dumps(a, protocol))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000269 self.assertNotEqual(id(a), id(b))
270 self.assertEqual(a, b)
271 self.assertEqual(a.x, b.x)
272 self.assertEqual(type(a), type(b))
273
Walter Dörwald7fd94242003-05-18 00:47:47 +0000274 def test_insert(self):
275 a = array.array(self.typecode, self.example)
276 a.insert(0, self.example[0])
277 self.assertEqual(len(a), 1+len(self.example))
278 self.assertEqual(a[0], a[1])
279 self.assertRaises(TypeError, a.insert)
280 self.assertRaises(TypeError, a.insert, None)
Walter Dörwaldba39d9c2003-05-18 01:56:25 +0000281 self.assertRaises(TypeError, a.insert, 0, None)
Martin v. Löwis99866332002-03-01 10:27:01 +0000282
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000283 a = array.array(self.typecode, self.example)
284 a.insert(-1, self.example[0])
285 self.assertEqual(
286 a,
287 array.array(
288 self.typecode,
289 self.example[:-1] + self.example[:1] + self.example[-1:]
290 )
291 )
292
293 a = array.array(self.typecode, self.example)
294 a.insert(-1000, self.example[0])
295 self.assertEqual(
296 a,
297 array.array(self.typecode, self.example[:1] + self.example)
298 )
299
300 a = array.array(self.typecode, self.example)
301 a.insert(1000, self.example[0])
302 self.assertEqual(
303 a,
304 array.array(self.typecode, self.example + self.example[:1])
305 )
306
Walter Dörwald7fd94242003-05-18 00:47:47 +0000307 def test_tofromfile(self):
308 a = array.array(self.typecode, 2*self.example)
309 self.assertRaises(TypeError, a.tofile)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000310 support.unlink(support.TESTFN)
311 f = open(support.TESTFN, 'wb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000312 try:
313 a.tofile(f)
314 f.close()
315 b = array.array(self.typecode)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000316 f = open(support.TESTFN, 'rb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000317 self.assertRaises(TypeError, b.fromfile)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000318 b.fromfile(f, len(self.example))
319 self.assertEqual(b, array.array(self.typecode, self.example))
320 self.assertNotEqual(a, b)
Hirokazu Yamamoto54d0df62009-03-06 03:04:07 +0000321 self.assertRaises(EOFError, b.fromfile, f, len(self.example)+1)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000322 self.assertEqual(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000323 f.close()
324 finally:
325 if not f.closed:
326 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000327 support.unlink(support.TESTFN)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000328
Walter Dörwald7fd94242003-05-18 00:47:47 +0000329 def test_tofromlist(self):
330 a = array.array(self.typecode, 2*self.example)
331 b = array.array(self.typecode)
332 self.assertRaises(TypeError, a.tolist, 42)
333 self.assertRaises(TypeError, b.fromlist)
334 self.assertRaises(TypeError, b.fromlist, 42)
335 self.assertRaises(TypeError, b.fromlist, [None])
336 b.fromlist(a.tolist())
337 self.assertEqual(a, b)
Fred Drake78334472000-06-28 17:50:51 +0000338
Walter Dörwald7fd94242003-05-18 00:47:47 +0000339 def test_tofromstring(self):
340 a = array.array(self.typecode, 2*self.example)
341 b = array.array(self.typecode)
342 self.assertRaises(TypeError, a.tostring, 42)
343 self.assertRaises(TypeError, b.fromstring)
344 self.assertRaises(TypeError, b.fromstring, 42)
345 b.fromstring(a.tostring())
346 self.assertEqual(a, b)
347 if a.itemsize>1:
348 self.assertRaises(ValueError, b.fromstring, "x")
Fred Drake78334472000-06-28 17:50:51 +0000349
Walter Dörwald7fd94242003-05-18 00:47:47 +0000350 def test_repr(self):
351 a = array.array(self.typecode, 2*self.example)
352 self.assertEqual(a, eval(repr(a), {"array": array.array}))
Fred Drake78334472000-06-28 17:50:51 +0000353
Walter Dörwald7fd94242003-05-18 00:47:47 +0000354 a = array.array(self.typecode)
355 self.assertEqual(repr(a), "array('%s')" % self.typecode)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000356
Walter Dörwald7fd94242003-05-18 00:47:47 +0000357 def test_str(self):
358 a = array.array(self.typecode, 2*self.example)
359 str(a)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000360
Walter Dörwald7fd94242003-05-18 00:47:47 +0000361 def test_cmp(self):
362 a = array.array(self.typecode, self.example)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000363 self.assertTrue((a == 42) is False)
364 self.assertTrue((a != 42) is True)
Tim Peterscc78e472000-11-14 21:36:07 +0000365
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000366 self.assertTrue((a == a) is True)
367 self.assertTrue((a != a) is False)
368 self.assertTrue((a < a) is False)
369 self.assertTrue((a <= a) is True)
370 self.assertTrue((a > a) is False)
371 self.assertTrue((a >= a) is True)
Tim Peterscc78e472000-11-14 21:36:07 +0000372
Neal Norwitzbd2835c2006-03-17 08:54:15 +0000373 al = array.array(self.typecode, self.smallerexample)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000374 ab = array.array(self.typecode, self.biggerexample)
Guido van Rossum7f1d3aa1998-07-16 15:31:43 +0000375
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000376 self.assertTrue((a == 2*a) is False)
377 self.assertTrue((a != 2*a) is True)
378 self.assertTrue((a < 2*a) is True)
379 self.assertTrue((a <= 2*a) is True)
380 self.assertTrue((a > 2*a) is False)
381 self.assertTrue((a >= 2*a) is False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000382
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000383 self.assertTrue((a == al) is False)
384 self.assertTrue((a != al) is True)
385 self.assertTrue((a < al) is False)
386 self.assertTrue((a <= al) is False)
387 self.assertTrue((a > al) is True)
388 self.assertTrue((a >= al) is True)
Martin v. Löwis99866332002-03-01 10:27:01 +0000389
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000390 self.assertTrue((a == ab) is False)
391 self.assertTrue((a != ab) is True)
392 self.assertTrue((a < ab) is True)
393 self.assertTrue((a <= ab) is True)
394 self.assertTrue((a > ab) is False)
395 self.assertTrue((a >= ab) is False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000396
Walter Dörwald7fd94242003-05-18 00:47:47 +0000397 def test_add(self):
398 a = array.array(self.typecode, self.example) \
399 + array.array(self.typecode, self.example[::-1])
400 self.assertEqual(
401 a,
402 array.array(self.typecode, self.example + self.example[::-1])
403 )
Martin v. Löwis99866332002-03-01 10:27:01 +0000404
Walter Dörwald7fd94242003-05-18 00:47:47 +0000405 b = array.array(self.badtypecode())
406 self.assertRaises(TypeError, a.__add__, b)
407
408 self.assertRaises(TypeError, a.__add__, "bad")
409
410 def test_iadd(self):
411 a = array.array(self.typecode, self.example[::-1])
412 b = a
413 a += array.array(self.typecode, 2*self.example)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000414 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000415 self.assertEqual(
416 a,
417 array.array(self.typecode, self.example[::-1]+2*self.example)
418 )
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000419 a = array.array(self.typecode, self.example)
420 a += a
421 self.assertEqual(
422 a,
423 array.array(self.typecode, self.example + self.example)
424 )
Walter Dörwald7fd94242003-05-18 00:47:47 +0000425
426 b = array.array(self.badtypecode())
427 self.assertRaises(TypeError, a.__add__, b)
428
429 self.assertRaises(TypeError, a.__iadd__, "bad")
430
431 def test_mul(self):
432 a = 5*array.array(self.typecode, self.example)
433 self.assertEqual(
434 a,
435 array.array(self.typecode, 5*self.example)
436 )
437
438 a = array.array(self.typecode, self.example)*5
439 self.assertEqual(
440 a,
441 array.array(self.typecode, self.example*5)
442 )
443
444 a = 0*array.array(self.typecode, self.example)
445 self.assertEqual(
446 a,
447 array.array(self.typecode)
448 )
449
450 a = (-1)*array.array(self.typecode, self.example)
451 self.assertEqual(
452 a,
453 array.array(self.typecode)
454 )
455
456 self.assertRaises(TypeError, a.__mul__, "bad")
457
458 def test_imul(self):
459 a = array.array(self.typecode, self.example)
460 b = a
461
462 a *= 5
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000463 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000464 self.assertEqual(
465 a,
466 array.array(self.typecode, 5*self.example)
467 )
468
469 a *= 0
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000470 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000471 self.assertEqual(a, array.array(self.typecode))
472
473 a *= 1000
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000474 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000475 self.assertEqual(a, array.array(self.typecode))
476
477 a *= -1
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000478 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000479 self.assertEqual(a, array.array(self.typecode))
480
481 a = array.array(self.typecode, self.example)
482 a *= -1
483 self.assertEqual(a, array.array(self.typecode))
484
485 self.assertRaises(TypeError, a.__imul__, "bad")
486
487 def test_getitem(self):
488 a = array.array(self.typecode, self.example)
489 self.assertEntryEqual(a[0], self.example[0])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000490 self.assertEntryEqual(a[0], self.example[0])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000491 self.assertEntryEqual(a[-1], self.example[-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000492 self.assertEntryEqual(a[-1], self.example[-1])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000493 self.assertEntryEqual(a[len(self.example)-1], self.example[-1])
494 self.assertEntryEqual(a[-len(self.example)], self.example[0])
495 self.assertRaises(TypeError, a.__getitem__)
496 self.assertRaises(IndexError, a.__getitem__, len(self.example))
497 self.assertRaises(IndexError, a.__getitem__, -len(self.example)-1)
498
499 def test_setitem(self):
500 a = array.array(self.typecode, self.example)
501 a[0] = a[-1]
502 self.assertEntryEqual(a[0], a[-1])
503
504 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000505 a[0] = a[-1]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000506 self.assertEntryEqual(a[0], a[-1])
507
508 a = array.array(self.typecode, self.example)
509 a[-1] = a[0]
510 self.assertEntryEqual(a[0], a[-1])
511
512 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000513 a[-1] = a[0]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000514 self.assertEntryEqual(a[0], a[-1])
515
516 a = array.array(self.typecode, self.example)
517 a[len(self.example)-1] = a[0]
518 self.assertEntryEqual(a[0], a[-1])
519
520 a = array.array(self.typecode, self.example)
521 a[-len(self.example)] = a[-1]
522 self.assertEntryEqual(a[0], a[-1])
523
524 self.assertRaises(TypeError, a.__setitem__)
525 self.assertRaises(TypeError, a.__setitem__, None)
526 self.assertRaises(TypeError, a.__setitem__, 0, None)
527 self.assertRaises(
528 IndexError,
529 a.__setitem__,
530 len(self.example), self.example[0]
531 )
532 self.assertRaises(
533 IndexError,
534 a.__setitem__,
535 -len(self.example)-1, self.example[0]
536 )
537
538 def test_delitem(self):
539 a = array.array(self.typecode, self.example)
540 del a[0]
541 self.assertEqual(
542 a,
543 array.array(self.typecode, self.example[1:])
544 )
545
546 a = array.array(self.typecode, self.example)
547 del a[-1]
548 self.assertEqual(
549 a,
550 array.array(self.typecode, self.example[:-1])
551 )
552
553 a = array.array(self.typecode, self.example)
554 del a[len(self.example)-1]
555 self.assertEqual(
556 a,
557 array.array(self.typecode, self.example[:-1])
558 )
559
560 a = array.array(self.typecode, self.example)
561 del a[-len(self.example)]
562 self.assertEqual(
563 a,
564 array.array(self.typecode, self.example[1:])
565 )
566
567 self.assertRaises(TypeError, a.__delitem__)
568 self.assertRaises(TypeError, a.__delitem__, None)
569 self.assertRaises(IndexError, a.__delitem__, len(self.example))
570 self.assertRaises(IndexError, a.__delitem__, -len(self.example)-1)
571
572 def test_getslice(self):
573 a = array.array(self.typecode, self.example)
574 self.assertEqual(a[:], a)
575
576 self.assertEqual(
577 a[1:],
578 array.array(self.typecode, self.example[1:])
579 )
580
581 self.assertEqual(
582 a[:1],
583 array.array(self.typecode, self.example[:1])
584 )
585
586 self.assertEqual(
587 a[:-1],
588 array.array(self.typecode, self.example[:-1])
589 )
590
591 self.assertEqual(
592 a[-1:],
593 array.array(self.typecode, self.example[-1:])
594 )
595
596 self.assertEqual(
597 a[-1:-1],
598 array.array(self.typecode)
599 )
600
601 self.assertEqual(
Walter Dörwald1083c242005-01-21 21:16:51 +0000602 a[2:1],
603 array.array(self.typecode)
604 )
605
606 self.assertEqual(
Walter Dörwald7fd94242003-05-18 00:47:47 +0000607 a[1000:],
608 array.array(self.typecode)
609 )
610 self.assertEqual(a[-1000:], a)
611 self.assertEqual(a[:1000], a)
612 self.assertEqual(
613 a[:-1000],
614 array.array(self.typecode)
615 )
616 self.assertEqual(a[-1000:1000], a)
617 self.assertEqual(
618 a[2000:1000],
619 array.array(self.typecode)
620 )
621
Thomas Woutersed03b412007-08-28 21:37:11 +0000622 def test_extended_getslice(self):
623 # Test extended slicing by comparing with list slicing
624 # (Assumes list conversion works correctly, too)
625 a = array.array(self.typecode, self.example)
626 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
627 for start in indices:
628 for stop in indices:
629 # Everything except the initial 0 (invalid step)
630 for step in indices[1:]:
631 self.assertEqual(list(a[start:stop:step]),
632 list(a)[start:stop:step])
633
Walter Dörwald7fd94242003-05-18 00:47:47 +0000634 def test_setslice(self):
635 a = array.array(self.typecode, self.example)
636 a[:1] = a
637 self.assertEqual(
638 a,
639 array.array(self.typecode, self.example + self.example[1:])
640 )
641
642 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000643 a[:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000644 self.assertEqual(
645 a,
646 array.array(self.typecode, self.example + self.example[-1:])
647 )
648
649 a = array.array(self.typecode, self.example)
650 a[-1:] = a
651 self.assertEqual(
652 a,
653 array.array(self.typecode, self.example[:-1] + self.example)
654 )
655
656 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000657 a[1:] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000658 self.assertEqual(
659 a,
660 array.array(self.typecode, self.example[:1] + self.example)
661 )
662
663 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000664 a[1:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000665 self.assertEqual(
666 a,
667 array.array(
668 self.typecode,
669 self.example[:1] + self.example + self.example[-1:]
670 )
671 )
672
673 a = array.array(self.typecode, self.example)
674 a[1000:] = a
675 self.assertEqual(
676 a,
677 array.array(self.typecode, 2*self.example)
678 )
679
680 a = array.array(self.typecode, self.example)
681 a[-1000:] = a
682 self.assertEqual(
683 a,
684 array.array(self.typecode, self.example)
685 )
686
687 a = array.array(self.typecode, self.example)
688 a[:1000] = a
689 self.assertEqual(
690 a,
691 array.array(self.typecode, self.example)
692 )
693
694 a = array.array(self.typecode, self.example)
695 a[:-1000] = a
696 self.assertEqual(
697 a,
698 array.array(self.typecode, 2*self.example)
699 )
700
701 a = array.array(self.typecode, self.example)
702 a[1:0] = a
703 self.assertEqual(
704 a,
705 array.array(self.typecode, self.example[:1] + self.example + self.example[1:])
706 )
707
708 a = array.array(self.typecode, self.example)
709 a[2000:1000] = a
710 self.assertEqual(
711 a,
712 array.array(self.typecode, 2*self.example)
713 )
714
715 a = array.array(self.typecode, self.example)
Thomas Woutersed03b412007-08-28 21:37:11 +0000716 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), None)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000717 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), None)
718
719 b = array.array(self.badtypecode())
Thomas Woutersed03b412007-08-28 21:37:11 +0000720 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000721 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), b)
722
Thomas Woutersed03b412007-08-28 21:37:11 +0000723 def test_extended_set_del_slice(self):
724 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
725 for start in indices:
726 for stop in indices:
727 # Everything except the initial 0 (invalid step)
728 for step in indices[1:]:
729 a = array.array(self.typecode, self.example)
730 L = list(a)
731 # Make sure we have a slice of exactly the right length,
732 # but with (hopefully) different data.
733 data = L[start:stop:step]
734 data.reverse()
735 L[start:stop:step] = data
736 a[start:stop:step] = array.array(self.typecode, data)
737 self.assertEquals(a, array.array(self.typecode, L))
738
739 del L[start:stop:step]
740 del a[start:stop:step]
741 self.assertEquals(a, array.array(self.typecode, L))
742
Walter Dörwald7fd94242003-05-18 00:47:47 +0000743 def test_index(self):
744 example = 2*self.example
745 a = array.array(self.typecode, example)
746 self.assertRaises(TypeError, a.index)
747 for x in example:
748 self.assertEqual(a.index(x), example.index(x))
749 self.assertRaises(ValueError, a.index, None)
750 self.assertRaises(ValueError, a.index, self.outside)
751
752 def test_count(self):
753 example = 2*self.example
754 a = array.array(self.typecode, example)
755 self.assertRaises(TypeError, a.count)
756 for x in example:
757 self.assertEqual(a.count(x), example.count(x))
758 self.assertEqual(a.count(self.outside), 0)
759 self.assertEqual(a.count(None), 0)
760
761 def test_remove(self):
762 for x in self.example:
763 example = 2*self.example
764 a = array.array(self.typecode, example)
765 pos = example.index(x)
766 example2 = example[:pos] + example[pos+1:]
767 a.remove(x)
768 self.assertEqual(a, array.array(self.typecode, example2))
769
770 a = array.array(self.typecode, self.example)
771 self.assertRaises(ValueError, a.remove, self.outside)
772
773 self.assertRaises(ValueError, a.remove, None)
774
775 def test_pop(self):
776 a = array.array(self.typecode)
777 self.assertRaises(IndexError, a.pop)
778
779 a = array.array(self.typecode, 2*self.example)
780 self.assertRaises(TypeError, a.pop, 42, 42)
781 self.assertRaises(TypeError, a.pop, None)
782 self.assertRaises(IndexError, a.pop, len(a))
783 self.assertRaises(IndexError, a.pop, -len(a)-1)
784
785 self.assertEntryEqual(a.pop(0), self.example[0])
786 self.assertEqual(
787 a,
788 array.array(self.typecode, self.example[1:]+self.example)
789 )
790 self.assertEntryEqual(a.pop(1), self.example[2])
791 self.assertEqual(
792 a,
793 array.array(self.typecode, self.example[1:2]+self.example[3:]+self.example)
794 )
795 self.assertEntryEqual(a.pop(0), self.example[1])
796 self.assertEntryEqual(a.pop(), self.example[-1])
797 self.assertEqual(
798 a,
799 array.array(self.typecode, self.example[3:]+self.example[:-1])
800 )
801
802 def test_reverse(self):
803 a = array.array(self.typecode, self.example)
804 self.assertRaises(TypeError, a.reverse, 42)
Fred Drake004d5e62000-10-23 17:22:08 +0000805 a.reverse()
Walter Dörwald7fd94242003-05-18 00:47:47 +0000806 self.assertEqual(
807 a,
808 array.array(self.typecode, self.example[::-1])
809 )
810
811 def test_extend(self):
812 a = array.array(self.typecode, self.example)
813 self.assertRaises(TypeError, a.extend)
814 a.extend(array.array(self.typecode, self.example[::-1]))
815 self.assertEqual(
816 a,
817 array.array(self.typecode, self.example+self.example[::-1])
818 )
819
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000820 a = array.array(self.typecode, self.example)
821 a.extend(a)
822 self.assertEqual(
823 a,
824 array.array(self.typecode, self.example+self.example)
825 )
826
Walter Dörwald7fd94242003-05-18 00:47:47 +0000827 b = array.array(self.badtypecode())
828 self.assertRaises(TypeError, a.extend, b)
829
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000830 a = array.array(self.typecode, self.example)
831 a.extend(self.example[::-1])
832 self.assertEqual(
833 a,
834 array.array(self.typecode, self.example+self.example[::-1])
835 )
836
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +0000837 def test_constructor_with_iterable_argument(self):
838 a = array.array(self.typecode, iter(self.example))
839 b = array.array(self.typecode, self.example)
840 self.assertEqual(a, b)
841
842 # non-iterable argument
843 self.assertRaises(TypeError, array.array, self.typecode, 10)
844
845 # pass through errors raised in __iter__
846 class A:
847 def __iter__(self):
848 raise UnicodeError
849 self.assertRaises(UnicodeError, array.array, self.typecode, A())
850
851 # pass through errors raised in next()
852 def B():
853 raise UnicodeError
854 yield None
855 self.assertRaises(UnicodeError, array.array, self.typecode, B())
856
Walter Dörwald7fd94242003-05-18 00:47:47 +0000857 def test_coveritertraverse(self):
858 try:
859 import gc
860 except ImportError:
861 return
862 a = array.array(self.typecode)
863 l = [iter(a)]
864 l.append(l)
865 gc.collect()
866
867 def test_buffer(self):
868 a = array.array(self.typecode, self.example)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000869 m = memoryview(a)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000870 expected = m.tobytes()
871 self.assertEqual(a.tostring(), expected)
872 self.assertEqual(a.tostring()[0], expected[0])
873 # Resizing is forbidden when there are buffer exports.
874 # For issue 4509, we also check after each error that
875 # the array was not modified.
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000876 self.assertRaises(BufferError, a.append, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000877 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000878 self.assertRaises(BufferError, a.extend, a[0:1])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000879 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000880 self.assertRaises(BufferError, a.remove, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000881 self.assertEqual(m.tobytes(), expected)
882 self.assertRaises(BufferError, a.pop, 0)
883 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000884 self.assertRaises(BufferError, a.fromlist, a.tolist())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000885 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000886 self.assertRaises(BufferError, a.fromstring, a.tostring())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000887 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000888 if self.typecode == 'u':
889 self.assertRaises(BufferError, a.fromunicode, a.tounicode())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000890 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +0000891 self.assertRaises(BufferError, operator.imul, a, 2)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000892 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +0000893 self.assertRaises(BufferError, operator.imul, a, 0)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000894 self.assertEqual(m.tobytes(), expected)
895 self.assertRaises(BufferError, operator.setitem, a, slice(0, 0), a)
896 self.assertEqual(m.tobytes(), expected)
897 self.assertRaises(BufferError, operator.delitem, a, 0)
898 self.assertEqual(m.tobytes(), expected)
899 self.assertRaises(BufferError, operator.delitem, a, slice(0, 1))
900 self.assertEqual(m.tobytes(), expected)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000901
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000902 def test_weakref(self):
903 s = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000904 p = weakref.proxy(s)
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000905 self.assertEqual(p.tostring(), s.tostring())
906 s = None
907 self.assertRaises(ReferenceError, len, p)
908
Skip Montanarod5cf0b82003-08-03 23:02:10 +0000909 def test_bug_782369(self):
910 import sys
Skip Montanaroed9bf122003-08-03 23:30:40 +0000911 if hasattr(sys, "getrefcount"):
912 for i in range(10):
913 b = array.array('B', range(64))
914 rc = sys.getrefcount(10)
915 for i in range(10):
916 b = array.array('B', range(64))
917 self.assertEqual(rc, sys.getrefcount(10))
Skip Montanarod5cf0b82003-08-03 23:02:10 +0000918
Thomas Woutersb2137042007-02-01 18:02:27 +0000919 def test_subclass_with_kwargs(self):
920 # SF bug #1486663 -- this used to erroneously raise a TypeError
921 ArraySubclassWithKwargs('b', newarg=1)
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000922
Guido van Rossum6b826ab2007-07-03 16:22:09 +0000923 def test_create_from_bytes(self):
Alexandre Vassalotti7e4f3212009-07-05 05:38:18 +0000924 # XXX This test probably needs to be moved in a subclass or
925 # generalized to use self.typecode.
Guido van Rossum6b826ab2007-07-03 16:22:09 +0000926 a = array.array('H', b"1234")
927 self.assertEqual(len(a) * a.itemsize, 4)
928
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000929
Walter Dörwald7fd94242003-05-18 00:47:47 +0000930class StringTest(BaseTest):
931
932 def test_setitem(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000933 super().test_setitem()
Walter Dörwald7fd94242003-05-18 00:47:47 +0000934 a = array.array(self.typecode, self.example)
935 self.assertRaises(TypeError, a.__setitem__, 0, self.example[:2])
936
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000937class UnicodeTest(StringTest):
938 typecode = 'u'
939 example = '\x01\u263a\x00\ufeff'
940 smallerexample = '\x01\u263a\x00\ufefe'
941 biggerexample = '\x01\u263a\x01\ufeff'
942 outside = str('\x33')
943 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +0000944
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000945 def test_unicode(self):
946 self.assertRaises(TypeError, array.array, 'b', 'foo')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000947
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000948 a = array.array('u', '\xa0\xc2\u1234')
949 a.fromunicode(' ')
950 a.fromunicode('')
951 a.fromunicode('')
952 a.fromunicode('\x11abc\xff\u1234')
953 s = a.tounicode()
954 self.assertEqual(s, '\xa0\xc2\u1234 \x11abc\xff\u1234')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000955
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000956 s = '\x00="\'a\\b\x80\xff\u0000\u0001\u1234'
957 a = array.array('u', s)
958 self.assertEqual(
959 repr(a),
Georg Brandl559e5d72008-06-11 18:37:52 +0000960 "array('u', '\\x00=\"\\'a\\\\b\\x80\xff\\x00\\x01\u1234')")
Walter Dörwald7fd94242003-05-18 00:47:47 +0000961
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000962 self.assertRaises(TypeError, a.fromunicode)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000963
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000964tests.append(UnicodeTest)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000965
966class NumberTest(BaseTest):
967
968 def test_extslice(self):
969 a = array.array(self.typecode, range(5))
970 self.assertEqual(a[::], a)
971 self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
972 self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
973 self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
974 self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
975 self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
976 self.assertEqual(a[-100:100:], a)
977 self.assertEqual(a[100:-100:-1], a[::-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000978 self.assertEqual(a[-100:100:2], array.array(self.typecode, [0,2,4]))
Walter Dörwald7fd94242003-05-18 00:47:47 +0000979 self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
980 self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
981
982 def test_delslice(self):
983 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +0000984 del a[::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000985 self.assertEqual(a, array.array(self.typecode, [1,3]))
986 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +0000987 del a[1::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000988 self.assertEqual(a, array.array(self.typecode, [0,2,4]))
989 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +0000990 del a[1::-2]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000991 self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
992 a = array.array(self.typecode, range(10))
Michael W. Hudson56796f62002-07-29 14:35:04 +0000993 del a[::1000]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000994 self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
995
996 def test_assignment(self):
997 a = array.array(self.typecode, range(10))
998 a[::2] = array.array(self.typecode, [42]*5)
999 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
1000 a = array.array(self.typecode, range(10))
1001 a[::-4] = array.array(self.typecode, [10]*3)
1002 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
1003 a = array.array(self.typecode, range(4))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001004 a[::-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +00001005 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
1006 a = array.array(self.typecode, range(10))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001007 b = a[:]
1008 c = a[:]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001009 ins = array.array(self.typecode, range(2))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001010 a[2:3] = ins
1011 b[slice(2,3)] = ins
1012 c[2:3:] = ins
Fred Drake004d5e62000-10-23 17:22:08 +00001013
Walter Dörwald7fd94242003-05-18 00:47:47 +00001014 def test_iterationcontains(self):
1015 a = array.array(self.typecode, range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +00001016 self.assertEqual(list(a), list(range(10)))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001017 b = array.array(self.typecode, [20])
1018 self.assertEqual(a[-1] in a, True)
1019 self.assertEqual(b[0] not in a, True)
1020
1021 def check_overflow(self, lower, upper):
1022 # method to be used by subclasses
1023
1024 # should not overflow assigning lower limit
1025 a = array.array(self.typecode, [lower])
1026 a[0] = lower
1027 # should overflow assigning less than lower limit
1028 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
1029 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
1030 # should not overflow assigning upper limit
1031 a = array.array(self.typecode, [upper])
1032 a[0] = upper
1033 # should overflow assigning more than upper limit
1034 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
1035 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
1036
1037 def test_subclassing(self):
1038 typecode = self.typecode
1039 class ExaggeratingArray(array.array):
1040 __slots__ = ['offset']
1041
1042 def __new__(cls, typecode, data, offset):
1043 return array.array.__new__(cls, typecode, data)
1044
1045 def __init__(self, typecode, data, offset):
1046 self.offset = offset
1047
1048 def __getitem__(self, i):
1049 return array.array.__getitem__(self, i) + self.offset
1050
1051 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
1052 self.assertEntryEqual(a[0], 7)
1053
1054 self.assertRaises(AttributeError, setattr, a, "color", "blue")
1055
1056class SignedNumberTest(NumberTest):
1057 example = [-1, 0, 1, 42, 0x7f]
1058 smallerexample = [-1, 0, 1, 42, 0x7e]
1059 biggerexample = [-1, 0, 1, 43, 0x7f]
1060 outside = 23
1061
1062 def test_overflow(self):
1063 a = array.array(self.typecode)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001064 lower = -1 * int(pow(2, a.itemsize * 8 - 1))
1065 upper = int(pow(2, a.itemsize * 8 - 1)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001066 self.check_overflow(lower, upper)
1067
1068class UnsignedNumberTest(NumberTest):
1069 example = [0, 1, 17, 23, 42, 0xff]
1070 smallerexample = [0, 1, 17, 23, 42, 0xfe]
1071 biggerexample = [0, 1, 17, 23, 43, 0xff]
1072 outside = 0xaa
1073
1074 def test_overflow(self):
1075 a = array.array(self.typecode)
1076 lower = 0
Guido van Rossume2a383d2007-01-15 16:59:06 +00001077 upper = int(pow(2, a.itemsize * 8)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001078 self.check_overflow(lower, upper)
Fred Drake004d5e62000-10-23 17:22:08 +00001079
1080
Walter Dörwald7fd94242003-05-18 00:47:47 +00001081class ByteTest(SignedNumberTest):
1082 typecode = 'b'
1083 minitemsize = 1
1084tests.append(ByteTest)
Fred Drake004d5e62000-10-23 17:22:08 +00001085
Walter Dörwald7fd94242003-05-18 00:47:47 +00001086class UnsignedByteTest(UnsignedNumberTest):
1087 typecode = 'B'
1088 minitemsize = 1
1089tests.append(UnsignedByteTest)
1090
1091class ShortTest(SignedNumberTest):
1092 typecode = 'h'
1093 minitemsize = 2
1094tests.append(ShortTest)
1095
1096class UnsignedShortTest(UnsignedNumberTest):
1097 typecode = 'H'
1098 minitemsize = 2
1099tests.append(UnsignedShortTest)
1100
1101class IntTest(SignedNumberTest):
1102 typecode = 'i'
1103 minitemsize = 2
1104tests.append(IntTest)
1105
1106class UnsignedIntTest(UnsignedNumberTest):
1107 typecode = 'I'
1108 minitemsize = 2
1109tests.append(UnsignedIntTest)
1110
1111class LongTest(SignedNumberTest):
1112 typecode = 'l'
1113 minitemsize = 4
1114tests.append(LongTest)
1115
1116class UnsignedLongTest(UnsignedNumberTest):
1117 typecode = 'L'
1118 minitemsize = 4
1119tests.append(UnsignedLongTest)
1120
1121class FPTest(NumberTest):
1122 example = [-42.0, 0, 42, 1e5, -1e10]
1123 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
1124 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
1125 outside = 23
1126
1127 def assertEntryEqual(self, entry1, entry2):
1128 self.assertAlmostEqual(entry1, entry2)
1129
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001130 def test_byteswap(self):
1131 a = array.array(self.typecode, self.example)
1132 self.assertRaises(TypeError, a.byteswap, 42)
1133 if a.itemsize in (1, 2, 4, 8):
1134 b = array.array(self.typecode, self.example)
1135 b.byteswap()
1136 if a.itemsize==1:
1137 self.assertEqual(a, b)
1138 else:
1139 # On alphas treating the byte swapped bit patters as
1140 # floats/doubles results in floating point exceptions
1141 # => compare the 8bit string values instead
1142 self.assertNotEqual(a.tostring(), b.tostring())
1143 b.byteswap()
1144 self.assertEqual(a, b)
1145
Neal Norwitz35c6cd02003-05-22 13:29:15 +00001146class FloatTest(FPTest):
1147 typecode = 'f'
1148 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001149tests.append(FloatTest)
1150
1151class DoubleTest(FPTest):
1152 typecode = 'd'
1153 minitemsize = 8
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001154
1155 def test_alloc_overflow(self):
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001156 from sys import maxsize
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001157 a = array.array('d', [-1]*65536)
1158 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001159 a *= maxsize//65536 + 1
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001160 except MemoryError:
1161 pass
1162 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001163 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001164 b = array.array('d', [ 2.71828183, 3.14159265, -1])
1165 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001166 b * (maxsize//3 + 1)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001167 except MemoryError:
1168 pass
1169 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001170 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001171
Walter Dörwald7fd94242003-05-18 00:47:47 +00001172tests.append(DoubleTest)
1173
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001174def test_main(verbose=None):
1175 import sys
1176
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001177 support.run_unittest(*tests)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001178
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001179 # verify reference counting
1180 if verbose and hasattr(sys, "gettotalrefcount"):
1181 import gc
1182 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001183 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001184 support.run_unittest(*tests)
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001185 gc.collect()
1186 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001187 print(counts)
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001188
1189if __name__ == "__main__":
1190 test_main(verbose=True)