blob: 5de562f19e5a47805b4506e82fe2f9504b786d23 [file] [log] [blame]
Benjamin Peterson90f5ba52010-03-11 22:53:45 +00001#! /usr/bin/env python3
Roger E. Masse8db1b071996-12-09 20:09:16 +00002"""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()
Ezio Melottie9615932010-01-24 19:26:24 +0000204 self.assertIsInstance(bi, tuple)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000205 self.assertEqual(len(bi), 2)
Ezio Melottie9615932010-01-24 19:26:24 +0000206 self.assertIsInstance(bi[0], int)
207 self.assertIsInstance(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]))
Mark Dickinsonbc099642010-01-29 17:27:24 +00001014 # test issue7788
1015 a = array.array(self.typecode, range(10))
1016 del a[9::1<<333]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001017
1018 def test_assignment(self):
1019 a = array.array(self.typecode, range(10))
1020 a[::2] = array.array(self.typecode, [42]*5)
1021 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
1022 a = array.array(self.typecode, range(10))
1023 a[::-4] = array.array(self.typecode, [10]*3)
1024 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
1025 a = array.array(self.typecode, range(4))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001026 a[::-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +00001027 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
1028 a = array.array(self.typecode, range(10))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001029 b = a[:]
1030 c = a[:]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001031 ins = array.array(self.typecode, range(2))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001032 a[2:3] = ins
1033 b[slice(2,3)] = ins
1034 c[2:3:] = ins
Fred Drake004d5e62000-10-23 17:22:08 +00001035
Walter Dörwald7fd94242003-05-18 00:47:47 +00001036 def test_iterationcontains(self):
1037 a = array.array(self.typecode, range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +00001038 self.assertEqual(list(a), list(range(10)))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001039 b = array.array(self.typecode, [20])
1040 self.assertEqual(a[-1] in a, True)
1041 self.assertEqual(b[0] not in a, True)
1042
1043 def check_overflow(self, lower, upper):
1044 # method to be used by subclasses
1045
1046 # should not overflow assigning lower limit
1047 a = array.array(self.typecode, [lower])
1048 a[0] = lower
1049 # should overflow assigning less than lower limit
1050 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
1051 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
1052 # should not overflow assigning upper limit
1053 a = array.array(self.typecode, [upper])
1054 a[0] = upper
1055 # should overflow assigning more than upper limit
1056 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
1057 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
1058
1059 def test_subclassing(self):
1060 typecode = self.typecode
1061 class ExaggeratingArray(array.array):
1062 __slots__ = ['offset']
1063
1064 def __new__(cls, typecode, data, offset):
1065 return array.array.__new__(cls, typecode, data)
1066
1067 def __init__(self, typecode, data, offset):
1068 self.offset = offset
1069
1070 def __getitem__(self, i):
1071 return array.array.__getitem__(self, i) + self.offset
1072
1073 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
1074 self.assertEntryEqual(a[0], 7)
1075
1076 self.assertRaises(AttributeError, setattr, a, "color", "blue")
1077
1078class SignedNumberTest(NumberTest):
1079 example = [-1, 0, 1, 42, 0x7f]
1080 smallerexample = [-1, 0, 1, 42, 0x7e]
1081 biggerexample = [-1, 0, 1, 43, 0x7f]
1082 outside = 23
1083
1084 def test_overflow(self):
1085 a = array.array(self.typecode)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001086 lower = -1 * int(pow(2, a.itemsize * 8 - 1))
1087 upper = int(pow(2, a.itemsize * 8 - 1)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001088 self.check_overflow(lower, upper)
1089
1090class UnsignedNumberTest(NumberTest):
1091 example = [0, 1, 17, 23, 42, 0xff]
1092 smallerexample = [0, 1, 17, 23, 42, 0xfe]
1093 biggerexample = [0, 1, 17, 23, 43, 0xff]
1094 outside = 0xaa
1095
1096 def test_overflow(self):
1097 a = array.array(self.typecode)
1098 lower = 0
Guido van Rossume2a383d2007-01-15 16:59:06 +00001099 upper = int(pow(2, a.itemsize * 8)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001100 self.check_overflow(lower, upper)
Fred Drake004d5e62000-10-23 17:22:08 +00001101
1102
Walter Dörwald7fd94242003-05-18 00:47:47 +00001103class ByteTest(SignedNumberTest):
1104 typecode = 'b'
1105 minitemsize = 1
1106tests.append(ByteTest)
Fred Drake004d5e62000-10-23 17:22:08 +00001107
Walter Dörwald7fd94242003-05-18 00:47:47 +00001108class UnsignedByteTest(UnsignedNumberTest):
1109 typecode = 'B'
1110 minitemsize = 1
1111tests.append(UnsignedByteTest)
1112
1113class ShortTest(SignedNumberTest):
1114 typecode = 'h'
1115 minitemsize = 2
1116tests.append(ShortTest)
1117
1118class UnsignedShortTest(UnsignedNumberTest):
1119 typecode = 'H'
1120 minitemsize = 2
1121tests.append(UnsignedShortTest)
1122
1123class IntTest(SignedNumberTest):
1124 typecode = 'i'
1125 minitemsize = 2
1126tests.append(IntTest)
1127
1128class UnsignedIntTest(UnsignedNumberTest):
1129 typecode = 'I'
1130 minitemsize = 2
1131tests.append(UnsignedIntTest)
1132
1133class LongTest(SignedNumberTest):
1134 typecode = 'l'
1135 minitemsize = 4
1136tests.append(LongTest)
1137
1138class UnsignedLongTest(UnsignedNumberTest):
1139 typecode = 'L'
1140 minitemsize = 4
1141tests.append(UnsignedLongTest)
1142
1143class FPTest(NumberTest):
1144 example = [-42.0, 0, 42, 1e5, -1e10]
1145 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
1146 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
1147 outside = 23
1148
1149 def assertEntryEqual(self, entry1, entry2):
1150 self.assertAlmostEqual(entry1, entry2)
1151
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001152 def test_byteswap(self):
1153 a = array.array(self.typecode, self.example)
1154 self.assertRaises(TypeError, a.byteswap, 42)
1155 if a.itemsize in (1, 2, 4, 8):
1156 b = array.array(self.typecode, self.example)
1157 b.byteswap()
1158 if a.itemsize==1:
1159 self.assertEqual(a, b)
1160 else:
1161 # On alphas treating the byte swapped bit patters as
1162 # floats/doubles results in floating point exceptions
1163 # => compare the 8bit string values instead
1164 self.assertNotEqual(a.tostring(), b.tostring())
1165 b.byteswap()
1166 self.assertEqual(a, b)
1167
Neal Norwitz35c6cd02003-05-22 13:29:15 +00001168class FloatTest(FPTest):
1169 typecode = 'f'
1170 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001171tests.append(FloatTest)
1172
1173class DoubleTest(FPTest):
1174 typecode = 'd'
1175 minitemsize = 8
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001176
1177 def test_alloc_overflow(self):
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001178 from sys import maxsize
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001179 a = array.array('d', [-1]*65536)
1180 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001181 a *= maxsize//65536 + 1
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001182 except MemoryError:
1183 pass
1184 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001185 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001186 b = array.array('d', [ 2.71828183, 3.14159265, -1])
1187 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001188 b * (maxsize//3 + 1)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001189 except MemoryError:
1190 pass
1191 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001192 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001193
Walter Dörwald7fd94242003-05-18 00:47:47 +00001194tests.append(DoubleTest)
1195
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001196def test_main(verbose=None):
1197 import sys
1198
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001199 support.run_unittest(*tests)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001200
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001201 # verify reference counting
1202 if verbose and hasattr(sys, "gettotalrefcount"):
1203 import gc
1204 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001205 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001206 support.run_unittest(*tests)
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001207 gc.collect()
1208 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001209 print(counts)
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001210
1211if __name__ == "__main__":
1212 test_main(verbose=True)