blob: 5e3e0e094727f6a2df9b9492bb3833e033a0fc94 [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
Frank Wierzbicki17683432009-08-16 20:30:12 +0000329 def test_filewrite(self):
330 a = array.array(self.typecode, 2*self.example)
331 f = open(support.TESTFN, 'wb')
332 try:
333 f.write(a)
334 f.close()
335 b = array.array(self.typecode)
336 f = open(support.TESTFN, 'rb')
337 b.fromfile(f, len(self.example))
338 self.assertEqual(b, array.array(self.typecode, self.example))
339 self.assertNotEqual(a, b)
340 b.fromfile(f, len(self.example))
341 self.assertEqual(a, b)
342 f.close()
343 finally:
344 if not f.closed:
345 f.close()
346 support.unlink(support.TESTFN)
347
Walter Dörwald7fd94242003-05-18 00:47:47 +0000348 def test_tofromlist(self):
349 a = array.array(self.typecode, 2*self.example)
350 b = array.array(self.typecode)
351 self.assertRaises(TypeError, a.tolist, 42)
352 self.assertRaises(TypeError, b.fromlist)
353 self.assertRaises(TypeError, b.fromlist, 42)
354 self.assertRaises(TypeError, b.fromlist, [None])
355 b.fromlist(a.tolist())
356 self.assertEqual(a, b)
Fred Drake78334472000-06-28 17:50:51 +0000357
Walter Dörwald7fd94242003-05-18 00:47:47 +0000358 def test_tofromstring(self):
359 a = array.array(self.typecode, 2*self.example)
360 b = array.array(self.typecode)
361 self.assertRaises(TypeError, a.tostring, 42)
362 self.assertRaises(TypeError, b.fromstring)
363 self.assertRaises(TypeError, b.fromstring, 42)
364 b.fromstring(a.tostring())
365 self.assertEqual(a, b)
366 if a.itemsize>1:
367 self.assertRaises(ValueError, b.fromstring, "x")
Fred Drake78334472000-06-28 17:50:51 +0000368
Walter Dörwald7fd94242003-05-18 00:47:47 +0000369 def test_repr(self):
370 a = array.array(self.typecode, 2*self.example)
371 self.assertEqual(a, eval(repr(a), {"array": array.array}))
Fred Drake78334472000-06-28 17:50:51 +0000372
Walter Dörwald7fd94242003-05-18 00:47:47 +0000373 a = array.array(self.typecode)
374 self.assertEqual(repr(a), "array('%s')" % self.typecode)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000375
Walter Dörwald7fd94242003-05-18 00:47:47 +0000376 def test_str(self):
377 a = array.array(self.typecode, 2*self.example)
378 str(a)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000379
Walter Dörwald7fd94242003-05-18 00:47:47 +0000380 def test_cmp(self):
381 a = array.array(self.typecode, self.example)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000382 self.assertTrue((a == 42) is False)
383 self.assertTrue((a != 42) is True)
Tim Peterscc78e472000-11-14 21:36:07 +0000384
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000385 self.assertTrue((a == a) is True)
386 self.assertTrue((a != a) is False)
387 self.assertTrue((a < a) is False)
388 self.assertTrue((a <= a) is True)
389 self.assertTrue((a > a) is False)
390 self.assertTrue((a >= a) is True)
Tim Peterscc78e472000-11-14 21:36:07 +0000391
Neal Norwitzbd2835c2006-03-17 08:54:15 +0000392 al = array.array(self.typecode, self.smallerexample)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000393 ab = array.array(self.typecode, self.biggerexample)
Guido van Rossum7f1d3aa1998-07-16 15:31:43 +0000394
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000395 self.assertTrue((a == 2*a) is False)
396 self.assertTrue((a != 2*a) is True)
397 self.assertTrue((a < 2*a) is True)
398 self.assertTrue((a <= 2*a) is True)
399 self.assertTrue((a > 2*a) is False)
400 self.assertTrue((a >= 2*a) is False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000401
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000402 self.assertTrue((a == al) is False)
403 self.assertTrue((a != al) is True)
404 self.assertTrue((a < al) is False)
405 self.assertTrue((a <= al) is False)
406 self.assertTrue((a > al) is True)
407 self.assertTrue((a >= al) is True)
Martin v. Löwis99866332002-03-01 10:27:01 +0000408
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000409 self.assertTrue((a == ab) is False)
410 self.assertTrue((a != ab) is True)
411 self.assertTrue((a < ab) is True)
412 self.assertTrue((a <= ab) is True)
413 self.assertTrue((a > ab) is False)
414 self.assertTrue((a >= ab) is False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000415
Walter Dörwald7fd94242003-05-18 00:47:47 +0000416 def test_add(self):
417 a = array.array(self.typecode, self.example) \
418 + array.array(self.typecode, self.example[::-1])
419 self.assertEqual(
420 a,
421 array.array(self.typecode, self.example + self.example[::-1])
422 )
Martin v. Löwis99866332002-03-01 10:27:01 +0000423
Walter Dörwald7fd94242003-05-18 00:47:47 +0000424 b = array.array(self.badtypecode())
425 self.assertRaises(TypeError, a.__add__, b)
426
427 self.assertRaises(TypeError, a.__add__, "bad")
428
429 def test_iadd(self):
430 a = array.array(self.typecode, self.example[::-1])
431 b = a
432 a += array.array(self.typecode, 2*self.example)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000433 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000434 self.assertEqual(
435 a,
436 array.array(self.typecode, self.example[::-1]+2*self.example)
437 )
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000438 a = array.array(self.typecode, self.example)
439 a += a
440 self.assertEqual(
441 a,
442 array.array(self.typecode, self.example + self.example)
443 )
Walter Dörwald7fd94242003-05-18 00:47:47 +0000444
445 b = array.array(self.badtypecode())
446 self.assertRaises(TypeError, a.__add__, b)
447
448 self.assertRaises(TypeError, a.__iadd__, "bad")
449
450 def test_mul(self):
451 a = 5*array.array(self.typecode, self.example)
452 self.assertEqual(
453 a,
454 array.array(self.typecode, 5*self.example)
455 )
456
457 a = array.array(self.typecode, self.example)*5
458 self.assertEqual(
459 a,
460 array.array(self.typecode, self.example*5)
461 )
462
463 a = 0*array.array(self.typecode, self.example)
464 self.assertEqual(
465 a,
466 array.array(self.typecode)
467 )
468
469 a = (-1)*array.array(self.typecode, self.example)
470 self.assertEqual(
471 a,
472 array.array(self.typecode)
473 )
474
475 self.assertRaises(TypeError, a.__mul__, "bad")
476
477 def test_imul(self):
478 a = array.array(self.typecode, self.example)
479 b = a
480
481 a *= 5
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000482 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000483 self.assertEqual(
484 a,
485 array.array(self.typecode, 5*self.example)
486 )
487
488 a *= 0
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000489 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000490 self.assertEqual(a, array.array(self.typecode))
491
492 a *= 1000
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000493 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000494 self.assertEqual(a, array.array(self.typecode))
495
496 a *= -1
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000497 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000498 self.assertEqual(a, array.array(self.typecode))
499
500 a = array.array(self.typecode, self.example)
501 a *= -1
502 self.assertEqual(a, array.array(self.typecode))
503
504 self.assertRaises(TypeError, a.__imul__, "bad")
505
506 def test_getitem(self):
507 a = array.array(self.typecode, self.example)
508 self.assertEntryEqual(a[0], self.example[0])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000509 self.assertEntryEqual(a[0], self.example[0])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000510 self.assertEntryEqual(a[-1], self.example[-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000511 self.assertEntryEqual(a[-1], self.example[-1])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000512 self.assertEntryEqual(a[len(self.example)-1], self.example[-1])
513 self.assertEntryEqual(a[-len(self.example)], self.example[0])
514 self.assertRaises(TypeError, a.__getitem__)
515 self.assertRaises(IndexError, a.__getitem__, len(self.example))
516 self.assertRaises(IndexError, a.__getitem__, -len(self.example)-1)
517
518 def test_setitem(self):
519 a = array.array(self.typecode, self.example)
520 a[0] = a[-1]
521 self.assertEntryEqual(a[0], a[-1])
522
523 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000524 a[0] = a[-1]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000525 self.assertEntryEqual(a[0], a[-1])
526
527 a = array.array(self.typecode, self.example)
528 a[-1] = a[0]
529 self.assertEntryEqual(a[0], a[-1])
530
531 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000532 a[-1] = a[0]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000533 self.assertEntryEqual(a[0], a[-1])
534
535 a = array.array(self.typecode, self.example)
536 a[len(self.example)-1] = a[0]
537 self.assertEntryEqual(a[0], a[-1])
538
539 a = array.array(self.typecode, self.example)
540 a[-len(self.example)] = a[-1]
541 self.assertEntryEqual(a[0], a[-1])
542
543 self.assertRaises(TypeError, a.__setitem__)
544 self.assertRaises(TypeError, a.__setitem__, None)
545 self.assertRaises(TypeError, a.__setitem__, 0, None)
546 self.assertRaises(
547 IndexError,
548 a.__setitem__,
549 len(self.example), self.example[0]
550 )
551 self.assertRaises(
552 IndexError,
553 a.__setitem__,
554 -len(self.example)-1, self.example[0]
555 )
556
557 def test_delitem(self):
558 a = array.array(self.typecode, self.example)
559 del a[0]
560 self.assertEqual(
561 a,
562 array.array(self.typecode, self.example[1:])
563 )
564
565 a = array.array(self.typecode, self.example)
566 del a[-1]
567 self.assertEqual(
568 a,
569 array.array(self.typecode, self.example[:-1])
570 )
571
572 a = array.array(self.typecode, self.example)
573 del a[len(self.example)-1]
574 self.assertEqual(
575 a,
576 array.array(self.typecode, self.example[:-1])
577 )
578
579 a = array.array(self.typecode, self.example)
580 del a[-len(self.example)]
581 self.assertEqual(
582 a,
583 array.array(self.typecode, self.example[1:])
584 )
585
586 self.assertRaises(TypeError, a.__delitem__)
587 self.assertRaises(TypeError, a.__delitem__, None)
588 self.assertRaises(IndexError, a.__delitem__, len(self.example))
589 self.assertRaises(IndexError, a.__delitem__, -len(self.example)-1)
590
591 def test_getslice(self):
592 a = array.array(self.typecode, self.example)
593 self.assertEqual(a[:], a)
594
595 self.assertEqual(
596 a[1:],
597 array.array(self.typecode, self.example[1:])
598 )
599
600 self.assertEqual(
601 a[:1],
602 array.array(self.typecode, self.example[:1])
603 )
604
605 self.assertEqual(
606 a[:-1],
607 array.array(self.typecode, self.example[:-1])
608 )
609
610 self.assertEqual(
611 a[-1:],
612 array.array(self.typecode, self.example[-1:])
613 )
614
615 self.assertEqual(
616 a[-1:-1],
617 array.array(self.typecode)
618 )
619
620 self.assertEqual(
Walter Dörwald1083c242005-01-21 21:16:51 +0000621 a[2:1],
622 array.array(self.typecode)
623 )
624
625 self.assertEqual(
Walter Dörwald7fd94242003-05-18 00:47:47 +0000626 a[1000:],
627 array.array(self.typecode)
628 )
629 self.assertEqual(a[-1000:], a)
630 self.assertEqual(a[:1000], a)
631 self.assertEqual(
632 a[:-1000],
633 array.array(self.typecode)
634 )
635 self.assertEqual(a[-1000:1000], a)
636 self.assertEqual(
637 a[2000:1000],
638 array.array(self.typecode)
639 )
640
Thomas Woutersed03b412007-08-28 21:37:11 +0000641 def test_extended_getslice(self):
642 # Test extended slicing by comparing with list slicing
643 # (Assumes list conversion works correctly, too)
644 a = array.array(self.typecode, self.example)
645 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
646 for start in indices:
647 for stop in indices:
648 # Everything except the initial 0 (invalid step)
649 for step in indices[1:]:
650 self.assertEqual(list(a[start:stop:step]),
651 list(a)[start:stop:step])
652
Walter Dörwald7fd94242003-05-18 00:47:47 +0000653 def test_setslice(self):
654 a = array.array(self.typecode, self.example)
655 a[:1] = a
656 self.assertEqual(
657 a,
658 array.array(self.typecode, self.example + self.example[1:])
659 )
660
661 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000662 a[:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000663 self.assertEqual(
664 a,
665 array.array(self.typecode, self.example + self.example[-1:])
666 )
667
668 a = array.array(self.typecode, self.example)
669 a[-1:] = a
670 self.assertEqual(
671 a,
672 array.array(self.typecode, self.example[:-1] + self.example)
673 )
674
675 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000676 a[1:] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000677 self.assertEqual(
678 a,
679 array.array(self.typecode, self.example[:1] + self.example)
680 )
681
682 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000683 a[1:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000684 self.assertEqual(
685 a,
686 array.array(
687 self.typecode,
688 self.example[:1] + self.example + self.example[-1:]
689 )
690 )
691
692 a = array.array(self.typecode, self.example)
693 a[1000:] = a
694 self.assertEqual(
695 a,
696 array.array(self.typecode, 2*self.example)
697 )
698
699 a = array.array(self.typecode, self.example)
700 a[-1000:] = a
701 self.assertEqual(
702 a,
703 array.array(self.typecode, self.example)
704 )
705
706 a = array.array(self.typecode, self.example)
707 a[:1000] = a
708 self.assertEqual(
709 a,
710 array.array(self.typecode, self.example)
711 )
712
713 a = array.array(self.typecode, self.example)
714 a[:-1000] = a
715 self.assertEqual(
716 a,
717 array.array(self.typecode, 2*self.example)
718 )
719
720 a = array.array(self.typecode, self.example)
721 a[1:0] = a
722 self.assertEqual(
723 a,
724 array.array(self.typecode, self.example[:1] + self.example + self.example[1:])
725 )
726
727 a = array.array(self.typecode, self.example)
728 a[2000:1000] = a
729 self.assertEqual(
730 a,
731 array.array(self.typecode, 2*self.example)
732 )
733
734 a = array.array(self.typecode, self.example)
Thomas Woutersed03b412007-08-28 21:37:11 +0000735 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), None)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000736 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), None)
737
738 b = array.array(self.badtypecode())
Thomas Woutersed03b412007-08-28 21:37:11 +0000739 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000740 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), b)
741
Thomas Woutersed03b412007-08-28 21:37:11 +0000742 def test_extended_set_del_slice(self):
743 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
744 for start in indices:
745 for stop in indices:
746 # Everything except the initial 0 (invalid step)
747 for step in indices[1:]:
748 a = array.array(self.typecode, self.example)
749 L = list(a)
750 # Make sure we have a slice of exactly the right length,
751 # but with (hopefully) different data.
752 data = L[start:stop:step]
753 data.reverse()
754 L[start:stop:step] = data
755 a[start:stop:step] = array.array(self.typecode, data)
756 self.assertEquals(a, array.array(self.typecode, L))
757
758 del L[start:stop:step]
759 del a[start:stop:step]
760 self.assertEquals(a, array.array(self.typecode, L))
761
Walter Dörwald7fd94242003-05-18 00:47:47 +0000762 def test_index(self):
763 example = 2*self.example
764 a = array.array(self.typecode, example)
765 self.assertRaises(TypeError, a.index)
766 for x in example:
767 self.assertEqual(a.index(x), example.index(x))
768 self.assertRaises(ValueError, a.index, None)
769 self.assertRaises(ValueError, a.index, self.outside)
770
771 def test_count(self):
772 example = 2*self.example
773 a = array.array(self.typecode, example)
774 self.assertRaises(TypeError, a.count)
775 for x in example:
776 self.assertEqual(a.count(x), example.count(x))
777 self.assertEqual(a.count(self.outside), 0)
778 self.assertEqual(a.count(None), 0)
779
780 def test_remove(self):
781 for x in self.example:
782 example = 2*self.example
783 a = array.array(self.typecode, example)
784 pos = example.index(x)
785 example2 = example[:pos] + example[pos+1:]
786 a.remove(x)
787 self.assertEqual(a, array.array(self.typecode, example2))
788
789 a = array.array(self.typecode, self.example)
790 self.assertRaises(ValueError, a.remove, self.outside)
791
792 self.assertRaises(ValueError, a.remove, None)
793
794 def test_pop(self):
795 a = array.array(self.typecode)
796 self.assertRaises(IndexError, a.pop)
797
798 a = array.array(self.typecode, 2*self.example)
799 self.assertRaises(TypeError, a.pop, 42, 42)
800 self.assertRaises(TypeError, a.pop, None)
801 self.assertRaises(IndexError, a.pop, len(a))
802 self.assertRaises(IndexError, a.pop, -len(a)-1)
803
804 self.assertEntryEqual(a.pop(0), self.example[0])
805 self.assertEqual(
806 a,
807 array.array(self.typecode, self.example[1:]+self.example)
808 )
809 self.assertEntryEqual(a.pop(1), self.example[2])
810 self.assertEqual(
811 a,
812 array.array(self.typecode, self.example[1:2]+self.example[3:]+self.example)
813 )
814 self.assertEntryEqual(a.pop(0), self.example[1])
815 self.assertEntryEqual(a.pop(), self.example[-1])
816 self.assertEqual(
817 a,
818 array.array(self.typecode, self.example[3:]+self.example[:-1])
819 )
820
821 def test_reverse(self):
822 a = array.array(self.typecode, self.example)
823 self.assertRaises(TypeError, a.reverse, 42)
Fred Drake004d5e62000-10-23 17:22:08 +0000824 a.reverse()
Walter Dörwald7fd94242003-05-18 00:47:47 +0000825 self.assertEqual(
826 a,
827 array.array(self.typecode, self.example[::-1])
828 )
829
830 def test_extend(self):
831 a = array.array(self.typecode, self.example)
832 self.assertRaises(TypeError, a.extend)
833 a.extend(array.array(self.typecode, self.example[::-1]))
834 self.assertEqual(
835 a,
836 array.array(self.typecode, self.example+self.example[::-1])
837 )
838
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000839 a = array.array(self.typecode, self.example)
840 a.extend(a)
841 self.assertEqual(
842 a,
843 array.array(self.typecode, self.example+self.example)
844 )
845
Walter Dörwald7fd94242003-05-18 00:47:47 +0000846 b = array.array(self.badtypecode())
847 self.assertRaises(TypeError, a.extend, b)
848
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000849 a = array.array(self.typecode, self.example)
850 a.extend(self.example[::-1])
851 self.assertEqual(
852 a,
853 array.array(self.typecode, self.example+self.example[::-1])
854 )
855
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +0000856 def test_constructor_with_iterable_argument(self):
857 a = array.array(self.typecode, iter(self.example))
858 b = array.array(self.typecode, self.example)
859 self.assertEqual(a, b)
860
861 # non-iterable argument
862 self.assertRaises(TypeError, array.array, self.typecode, 10)
863
864 # pass through errors raised in __iter__
865 class A:
866 def __iter__(self):
867 raise UnicodeError
868 self.assertRaises(UnicodeError, array.array, self.typecode, A())
869
870 # pass through errors raised in next()
871 def B():
872 raise UnicodeError
873 yield None
874 self.assertRaises(UnicodeError, array.array, self.typecode, B())
875
Walter Dörwald7fd94242003-05-18 00:47:47 +0000876 def test_coveritertraverse(self):
877 try:
878 import gc
879 except ImportError:
880 return
881 a = array.array(self.typecode)
882 l = [iter(a)]
883 l.append(l)
884 gc.collect()
885
886 def test_buffer(self):
887 a = array.array(self.typecode, self.example)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000888 m = memoryview(a)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000889 expected = m.tobytes()
890 self.assertEqual(a.tostring(), expected)
891 self.assertEqual(a.tostring()[0], expected[0])
892 # Resizing is forbidden when there are buffer exports.
893 # For issue 4509, we also check after each error that
894 # the array was not modified.
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000895 self.assertRaises(BufferError, a.append, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000896 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000897 self.assertRaises(BufferError, a.extend, a[0:1])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000898 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000899 self.assertRaises(BufferError, a.remove, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000900 self.assertEqual(m.tobytes(), expected)
901 self.assertRaises(BufferError, a.pop, 0)
902 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000903 self.assertRaises(BufferError, a.fromlist, a.tolist())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000904 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000905 self.assertRaises(BufferError, a.fromstring, a.tostring())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000906 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000907 if self.typecode == 'u':
908 self.assertRaises(BufferError, a.fromunicode, a.tounicode())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000909 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +0000910 self.assertRaises(BufferError, operator.imul, a, 2)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000911 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +0000912 self.assertRaises(BufferError, operator.imul, a, 0)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000913 self.assertEqual(m.tobytes(), expected)
914 self.assertRaises(BufferError, operator.setitem, a, slice(0, 0), a)
915 self.assertEqual(m.tobytes(), expected)
916 self.assertRaises(BufferError, operator.delitem, a, 0)
917 self.assertEqual(m.tobytes(), expected)
918 self.assertRaises(BufferError, operator.delitem, a, slice(0, 1))
919 self.assertEqual(m.tobytes(), expected)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000920
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000921 def test_weakref(self):
922 s = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000923 p = weakref.proxy(s)
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000924 self.assertEqual(p.tostring(), s.tostring())
925 s = None
926 self.assertRaises(ReferenceError, len, p)
927
Skip Montanarod5cf0b82003-08-03 23:02:10 +0000928 def test_bug_782369(self):
929 import sys
Skip Montanaroed9bf122003-08-03 23:30:40 +0000930 if hasattr(sys, "getrefcount"):
931 for i in range(10):
932 b = array.array('B', range(64))
933 rc = sys.getrefcount(10)
934 for i in range(10):
935 b = array.array('B', range(64))
936 self.assertEqual(rc, sys.getrefcount(10))
Skip Montanarod5cf0b82003-08-03 23:02:10 +0000937
Thomas Woutersb2137042007-02-01 18:02:27 +0000938 def test_subclass_with_kwargs(self):
939 # SF bug #1486663 -- this used to erroneously raise a TypeError
940 ArraySubclassWithKwargs('b', newarg=1)
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000941
Guido van Rossum6b826ab2007-07-03 16:22:09 +0000942 def test_create_from_bytes(self):
Alexandre Vassalotti7e4f3212009-07-05 05:38:18 +0000943 # XXX This test probably needs to be moved in a subclass or
944 # generalized to use self.typecode.
Guido van Rossum6b826ab2007-07-03 16:22:09 +0000945 a = array.array('H', b"1234")
946 self.assertEqual(len(a) * a.itemsize, 4)
947
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000948
Walter Dörwald7fd94242003-05-18 00:47:47 +0000949class StringTest(BaseTest):
950
951 def test_setitem(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000952 super().test_setitem()
Walter Dörwald7fd94242003-05-18 00:47:47 +0000953 a = array.array(self.typecode, self.example)
954 self.assertRaises(TypeError, a.__setitem__, 0, self.example[:2])
955
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000956class UnicodeTest(StringTest):
957 typecode = 'u'
958 example = '\x01\u263a\x00\ufeff'
959 smallerexample = '\x01\u263a\x00\ufefe'
960 biggerexample = '\x01\u263a\x01\ufeff'
961 outside = str('\x33')
962 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +0000963
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000964 def test_unicode(self):
965 self.assertRaises(TypeError, array.array, 'b', 'foo')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000966
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000967 a = array.array('u', '\xa0\xc2\u1234')
968 a.fromunicode(' ')
969 a.fromunicode('')
970 a.fromunicode('')
971 a.fromunicode('\x11abc\xff\u1234')
972 s = a.tounicode()
973 self.assertEqual(s, '\xa0\xc2\u1234 \x11abc\xff\u1234')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000974
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000975 s = '\x00="\'a\\b\x80\xff\u0000\u0001\u1234'
976 a = array.array('u', s)
977 self.assertEqual(
978 repr(a),
Georg Brandl559e5d72008-06-11 18:37:52 +0000979 "array('u', '\\x00=\"\\'a\\\\b\\x80\xff\\x00\\x01\u1234')")
Walter Dörwald7fd94242003-05-18 00:47:47 +0000980
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000981 self.assertRaises(TypeError, a.fromunicode)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000982
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000983tests.append(UnicodeTest)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000984
985class NumberTest(BaseTest):
986
987 def test_extslice(self):
988 a = array.array(self.typecode, range(5))
989 self.assertEqual(a[::], a)
990 self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
991 self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
992 self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
993 self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
994 self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
995 self.assertEqual(a[-100:100:], a)
996 self.assertEqual(a[100:-100:-1], a[::-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000997 self.assertEqual(a[-100:100:2], array.array(self.typecode, [0,2,4]))
Walter Dörwald7fd94242003-05-18 00:47:47 +0000998 self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
999 self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
1000
1001 def test_delslice(self):
1002 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001003 del a[::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001004 self.assertEqual(a, array.array(self.typecode, [1,3]))
1005 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001006 del a[1::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001007 self.assertEqual(a, array.array(self.typecode, [0,2,4]))
1008 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001009 del a[1::-2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001010 self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
1011 a = array.array(self.typecode, range(10))
Michael W. Hudson56796f62002-07-29 14:35:04 +00001012 del a[::1000]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001013 self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
1014
1015 def test_assignment(self):
1016 a = array.array(self.typecode, range(10))
1017 a[::2] = array.array(self.typecode, [42]*5)
1018 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
1019 a = array.array(self.typecode, range(10))
1020 a[::-4] = array.array(self.typecode, [10]*3)
1021 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
1022 a = array.array(self.typecode, range(4))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001023 a[::-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +00001024 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
1025 a = array.array(self.typecode, range(10))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001026 b = a[:]
1027 c = a[:]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001028 ins = array.array(self.typecode, range(2))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001029 a[2:3] = ins
1030 b[slice(2,3)] = ins
1031 c[2:3:] = ins
Fred Drake004d5e62000-10-23 17:22:08 +00001032
Walter Dörwald7fd94242003-05-18 00:47:47 +00001033 def test_iterationcontains(self):
1034 a = array.array(self.typecode, range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +00001035 self.assertEqual(list(a), list(range(10)))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001036 b = array.array(self.typecode, [20])
1037 self.assertEqual(a[-1] in a, True)
1038 self.assertEqual(b[0] not in a, True)
1039
1040 def check_overflow(self, lower, upper):
1041 # method to be used by subclasses
1042
1043 # should not overflow assigning lower limit
1044 a = array.array(self.typecode, [lower])
1045 a[0] = lower
1046 # should overflow assigning less than lower limit
1047 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
1048 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
1049 # should not overflow assigning upper limit
1050 a = array.array(self.typecode, [upper])
1051 a[0] = upper
1052 # should overflow assigning more than upper limit
1053 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
1054 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
1055
1056 def test_subclassing(self):
1057 typecode = self.typecode
1058 class ExaggeratingArray(array.array):
1059 __slots__ = ['offset']
1060
1061 def __new__(cls, typecode, data, offset):
1062 return array.array.__new__(cls, typecode, data)
1063
1064 def __init__(self, typecode, data, offset):
1065 self.offset = offset
1066
1067 def __getitem__(self, i):
1068 return array.array.__getitem__(self, i) + self.offset
1069
1070 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
1071 self.assertEntryEqual(a[0], 7)
1072
1073 self.assertRaises(AttributeError, setattr, a, "color", "blue")
1074
1075class SignedNumberTest(NumberTest):
1076 example = [-1, 0, 1, 42, 0x7f]
1077 smallerexample = [-1, 0, 1, 42, 0x7e]
1078 biggerexample = [-1, 0, 1, 43, 0x7f]
1079 outside = 23
1080
1081 def test_overflow(self):
1082 a = array.array(self.typecode)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001083 lower = -1 * int(pow(2, a.itemsize * 8 - 1))
1084 upper = int(pow(2, a.itemsize * 8 - 1)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001085 self.check_overflow(lower, upper)
1086
1087class UnsignedNumberTest(NumberTest):
1088 example = [0, 1, 17, 23, 42, 0xff]
1089 smallerexample = [0, 1, 17, 23, 42, 0xfe]
1090 biggerexample = [0, 1, 17, 23, 43, 0xff]
1091 outside = 0xaa
1092
1093 def test_overflow(self):
1094 a = array.array(self.typecode)
1095 lower = 0
Guido van Rossume2a383d2007-01-15 16:59:06 +00001096 upper = int(pow(2, a.itemsize * 8)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001097 self.check_overflow(lower, upper)
Fred Drake004d5e62000-10-23 17:22:08 +00001098
1099
Walter Dörwald7fd94242003-05-18 00:47:47 +00001100class ByteTest(SignedNumberTest):
1101 typecode = 'b'
1102 minitemsize = 1
1103tests.append(ByteTest)
Fred Drake004d5e62000-10-23 17:22:08 +00001104
Walter Dörwald7fd94242003-05-18 00:47:47 +00001105class UnsignedByteTest(UnsignedNumberTest):
1106 typecode = 'B'
1107 minitemsize = 1
1108tests.append(UnsignedByteTest)
1109
1110class ShortTest(SignedNumberTest):
1111 typecode = 'h'
1112 minitemsize = 2
1113tests.append(ShortTest)
1114
1115class UnsignedShortTest(UnsignedNumberTest):
1116 typecode = 'H'
1117 minitemsize = 2
1118tests.append(UnsignedShortTest)
1119
1120class IntTest(SignedNumberTest):
1121 typecode = 'i'
1122 minitemsize = 2
1123tests.append(IntTest)
1124
1125class UnsignedIntTest(UnsignedNumberTest):
1126 typecode = 'I'
1127 minitemsize = 2
1128tests.append(UnsignedIntTest)
1129
1130class LongTest(SignedNumberTest):
1131 typecode = 'l'
1132 minitemsize = 4
1133tests.append(LongTest)
1134
1135class UnsignedLongTest(UnsignedNumberTest):
1136 typecode = 'L'
1137 minitemsize = 4
1138tests.append(UnsignedLongTest)
1139
1140class FPTest(NumberTest):
1141 example = [-42.0, 0, 42, 1e5, -1e10]
1142 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
1143 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
1144 outside = 23
1145
1146 def assertEntryEqual(self, entry1, entry2):
1147 self.assertAlmostEqual(entry1, entry2)
1148
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001149 def test_byteswap(self):
1150 a = array.array(self.typecode, self.example)
1151 self.assertRaises(TypeError, a.byteswap, 42)
1152 if a.itemsize in (1, 2, 4, 8):
1153 b = array.array(self.typecode, self.example)
1154 b.byteswap()
1155 if a.itemsize==1:
1156 self.assertEqual(a, b)
1157 else:
1158 # On alphas treating the byte swapped bit patters as
1159 # floats/doubles results in floating point exceptions
1160 # => compare the 8bit string values instead
1161 self.assertNotEqual(a.tostring(), b.tostring())
1162 b.byteswap()
1163 self.assertEqual(a, b)
1164
Neal Norwitz35c6cd02003-05-22 13:29:15 +00001165class FloatTest(FPTest):
1166 typecode = 'f'
1167 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001168tests.append(FloatTest)
1169
1170class DoubleTest(FPTest):
1171 typecode = 'd'
1172 minitemsize = 8
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001173
1174 def test_alloc_overflow(self):
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001175 from sys import maxsize
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001176 a = array.array('d', [-1]*65536)
1177 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001178 a *= maxsize//65536 + 1
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001179 except MemoryError:
1180 pass
1181 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001182 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001183 b = array.array('d', [ 2.71828183, 3.14159265, -1])
1184 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001185 b * (maxsize//3 + 1)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001186 except MemoryError:
1187 pass
1188 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001189 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001190
Walter Dörwald7fd94242003-05-18 00:47:47 +00001191tests.append(DoubleTest)
1192
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001193def test_main(verbose=None):
1194 import sys
1195
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001196 support.run_unittest(*tests)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001197
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001198 # verify reference counting
1199 if verbose and hasattr(sys, "gettotalrefcount"):
1200 import gc
1201 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001202 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001203 support.run_unittest(*tests)
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001204 gc.collect()
1205 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001206 print(counts)
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001207
1208if __name__ == "__main__":
1209 test_main(verbose=True)