blob: d94883c32f6bd4458cb25f906f4de400ac9b6f7d [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',
110 [1<<63, (1<<63)-1, 0, (1<<64)-1]),
111 (['L'], UNSIGNED_INT64_BE, '>QQQQ',
112 [1<<63, (1<<63)-1, 0, (1<<64)-1]),
113 (['l'], SIGNED_INT64_LE, '<qqq',
114 [-1<<63, (1<<63)-1, 0]),
115 (['l'], SIGNED_INT64_BE, '>qqq',
116 [-1<<63, (1<<63)-1, 0]),
117 (['f'], IEEE_754_FLOAT_LE, '<ffff',
118 [16711938.0, float('inf'), float('-inf'), -0.0]),
119 (['f'], IEEE_754_FLOAT_BE, '>ffff',
120 [16711938.0, float('inf'), float('-inf'), -0.0]),
121 (['d'], IEEE_754_DOUBLE_LE, '<dddd',
122 [9006104071832581.0, float('inf'), float('-inf'), -0.0]),
123 (['d'], IEEE_754_DOUBLE_BE, '>dddd',
124 [9006104071832581.0, float('inf'), float('-inf'), -0.0])
125 )
126 for testcase in testcases:
127 valid_typecodes, mformat_code, struct_fmt, values = testcase
128 arraystr = struct.pack(struct_fmt, *values)
129 for typecode in valid_typecodes:
130 a = array.array(typecode, values)
131 b = array_reconstructor(
132 array.array, typecode, mformat_code, arraystr)
133 self.assertEqual(a, b,
134 msg="{0!r} != {1!r}; testcase={2!r}".format(a, b, testcase))
135
136 def test_unicode(self):
137 teststr = "Bonne Journ\xe9e \U0002030a\U00020347"
138 testcases = (
139 (UTF16_LE, "UTF-16-LE"),
140 (UTF16_BE, "UTF-16-BE"),
141 (UTF32_LE, "UTF-32-LE"),
142 (UTF32_BE, "UTF-32-BE")
143 )
144 for testcase in testcases:
145 mformat_code, encoding = testcase
146 a = array.array('u', teststr)
147 b = array_reconstructor(
148 array.array, 'u', mformat_code, teststr.encode(encoding))
149 self.assertEqual(a, b,
150 msg="{0!r} != {1!r}; testcase={2!r}".format(a, b, testcase))
151
152
153tests.append(ArrayReconstructorTest)
154
155
Walter Dörwald7fd94242003-05-18 00:47:47 +0000156class BaseTest(unittest.TestCase):
157 # Required class attributes (provided by subclasses
158 # typecode: the typecode to test
159 # example: an initializer usable in the constructor for this type
160 # smallerexample: the same length as example, but smaller
161 # biggerexample: the same length as example, but bigger
162 # outside: An entry that is not in example
163 # minitemsize: the minimum guaranteed itemsize
Martin v. Löwis99866332002-03-01 10:27:01 +0000164
Walter Dörwald7fd94242003-05-18 00:47:47 +0000165 def assertEntryEqual(self, entry1, entry2):
166 self.assertEqual(entry1, entry2)
Martin v. Löwis99866332002-03-01 10:27:01 +0000167
Walter Dörwald7fd94242003-05-18 00:47:47 +0000168 def badtypecode(self):
169 # Return a typecode that is different from our own
170 return typecodes[(typecodes.index(self.typecode)+1) % len(typecodes)]
Martin v. Löwis99866332002-03-01 10:27:01 +0000171
Walter Dörwald7fd94242003-05-18 00:47:47 +0000172 def test_constructor(self):
173 a = array.array(self.typecode)
174 self.assertEqual(a.typecode, self.typecode)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000175 self.assertTrue(a.itemsize>=self.minitemsize)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000176 self.assertRaises(TypeError, array.array, self.typecode, None)
Martin v. Löwis99866332002-03-01 10:27:01 +0000177
Walter Dörwald7fd94242003-05-18 00:47:47 +0000178 def test_len(self):
179 a = array.array(self.typecode)
180 a.append(self.example[0])
181 self.assertEqual(len(a), 1)
Martin v. Löwis99866332002-03-01 10:27:01 +0000182
Walter Dörwald7fd94242003-05-18 00:47:47 +0000183 a = array.array(self.typecode, self.example)
184 self.assertEqual(len(a), len(self.example))
Martin v. Löwis99866332002-03-01 10:27:01 +0000185
Walter Dörwald7fd94242003-05-18 00:47:47 +0000186 def test_buffer_info(self):
187 a = array.array(self.typecode, self.example)
188 self.assertRaises(TypeError, a.buffer_info, 42)
189 bi = a.buffer_info()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000190 self.assertTrue(isinstance(bi, tuple))
Walter Dörwald7fd94242003-05-18 00:47:47 +0000191 self.assertEqual(len(bi), 2)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000192 self.assertTrue(isinstance(bi[0], int))
193 self.assertTrue(isinstance(bi[1], int))
Walter Dörwald7fd94242003-05-18 00:47:47 +0000194 self.assertEqual(bi[1], len(a))
Martin v. Löwis99866332002-03-01 10:27:01 +0000195
Walter Dörwald7fd94242003-05-18 00:47:47 +0000196 def test_byteswap(self):
197 a = array.array(self.typecode, self.example)
198 self.assertRaises(TypeError, a.byteswap, 42)
199 if a.itemsize in (1, 2, 4, 8):
200 b = array.array(self.typecode, self.example)
201 b.byteswap()
202 if a.itemsize==1:
203 self.assertEqual(a, b)
204 else:
205 self.assertNotEqual(a, b)
206 b.byteswap()
207 self.assertEqual(a, b)
Martin v. Löwis99866332002-03-01 10:27:01 +0000208
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000209 def test_copy(self):
210 import copy
211 a = array.array(self.typecode, self.example)
212 b = copy.copy(a)
213 self.assertNotEqual(id(a), id(b))
214 self.assertEqual(a, b)
215
Thomas Wouters89f507f2006-12-13 04:49:30 +0000216 def test_deepcopy(self):
217 import copy
218 a = array.array(self.typecode, self.example)
219 b = copy.deepcopy(a)
220 self.assertNotEqual(id(a), id(b))
221 self.assertEqual(a, b)
222
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000223 def test_reduce_ex(self):
224 a = array.array(self.typecode, self.example)
225 for protocol in range(3):
226 self.assert_(a.__reduce_ex__(protocol)[0] is array.array)
227 for protocol in range(3, pickle.HIGHEST_PROTOCOL):
228 self.assert_(a.__reduce_ex__(protocol)[0] is array_reconstructor)
229
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000230 def test_pickle(self):
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000231 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000232 a = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000233 b = pickle.loads(pickle.dumps(a, protocol))
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000234 self.assertNotEqual(id(a), id(b))
235 self.assertEqual(a, b)
236
237 a = ArraySubclass(self.typecode, self.example)
238 a.x = 10
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000239 b = pickle.loads(pickle.dumps(a, protocol))
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000240 self.assertNotEqual(id(a), id(b))
241 self.assertEqual(a, b)
242 self.assertEqual(a.x, b.x)
243 self.assertEqual(type(a), type(b))
244
Guido van Rossumd8faa362007-04-27 19:54:29 +0000245 def test_pickle_for_empty_array(self):
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000246 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossumd8faa362007-04-27 19:54:29 +0000247 a = array.array(self.typecode)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000248 b = pickle.loads(pickle.dumps(a, protocol))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000249 self.assertNotEqual(id(a), id(b))
250 self.assertEqual(a, b)
251
252 a = ArraySubclass(self.typecode)
253 a.x = 10
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000254 b = pickle.loads(pickle.dumps(a, protocol))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000255 self.assertNotEqual(id(a), id(b))
256 self.assertEqual(a, b)
257 self.assertEqual(a.x, b.x)
258 self.assertEqual(type(a), type(b))
259
Walter Dörwald7fd94242003-05-18 00:47:47 +0000260 def test_insert(self):
261 a = array.array(self.typecode, self.example)
262 a.insert(0, self.example[0])
263 self.assertEqual(len(a), 1+len(self.example))
264 self.assertEqual(a[0], a[1])
265 self.assertRaises(TypeError, a.insert)
266 self.assertRaises(TypeError, a.insert, None)
Walter Dörwaldba39d9c2003-05-18 01:56:25 +0000267 self.assertRaises(TypeError, a.insert, 0, None)
Martin v. Löwis99866332002-03-01 10:27:01 +0000268
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000269 a = array.array(self.typecode, self.example)
270 a.insert(-1, self.example[0])
271 self.assertEqual(
272 a,
273 array.array(
274 self.typecode,
275 self.example[:-1] + self.example[:1] + self.example[-1:]
276 )
277 )
278
279 a = array.array(self.typecode, self.example)
280 a.insert(-1000, self.example[0])
281 self.assertEqual(
282 a,
283 array.array(self.typecode, self.example[:1] + self.example)
284 )
285
286 a = array.array(self.typecode, self.example)
287 a.insert(1000, self.example[0])
288 self.assertEqual(
289 a,
290 array.array(self.typecode, self.example + self.example[:1])
291 )
292
Walter Dörwald7fd94242003-05-18 00:47:47 +0000293 def test_tofromfile(self):
294 a = array.array(self.typecode, 2*self.example)
295 self.assertRaises(TypeError, a.tofile)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000296 support.unlink(support.TESTFN)
297 f = open(support.TESTFN, 'wb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000298 try:
299 a.tofile(f)
300 f.close()
301 b = array.array(self.typecode)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000302 f = open(support.TESTFN, 'rb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000303 self.assertRaises(TypeError, b.fromfile)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000304 b.fromfile(f, len(self.example))
305 self.assertEqual(b, array.array(self.typecode, self.example))
306 self.assertNotEqual(a, b)
Hirokazu Yamamoto54d0df62009-03-06 03:04:07 +0000307 self.assertRaises(EOFError, b.fromfile, f, len(self.example)+1)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000308 self.assertEqual(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000309 f.close()
310 finally:
311 if not f.closed:
312 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000313 support.unlink(support.TESTFN)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000314
Walter Dörwald7fd94242003-05-18 00:47:47 +0000315 def test_tofromlist(self):
316 a = array.array(self.typecode, 2*self.example)
317 b = array.array(self.typecode)
318 self.assertRaises(TypeError, a.tolist, 42)
319 self.assertRaises(TypeError, b.fromlist)
320 self.assertRaises(TypeError, b.fromlist, 42)
321 self.assertRaises(TypeError, b.fromlist, [None])
322 b.fromlist(a.tolist())
323 self.assertEqual(a, b)
Fred Drake78334472000-06-28 17:50:51 +0000324
Walter Dörwald7fd94242003-05-18 00:47:47 +0000325 def test_tofromstring(self):
326 a = array.array(self.typecode, 2*self.example)
327 b = array.array(self.typecode)
328 self.assertRaises(TypeError, a.tostring, 42)
329 self.assertRaises(TypeError, b.fromstring)
330 self.assertRaises(TypeError, b.fromstring, 42)
331 b.fromstring(a.tostring())
332 self.assertEqual(a, b)
333 if a.itemsize>1:
334 self.assertRaises(ValueError, b.fromstring, "x")
Fred Drake78334472000-06-28 17:50:51 +0000335
Walter Dörwald7fd94242003-05-18 00:47:47 +0000336 def test_repr(self):
337 a = array.array(self.typecode, 2*self.example)
338 self.assertEqual(a, eval(repr(a), {"array": array.array}))
Fred Drake78334472000-06-28 17:50:51 +0000339
Walter Dörwald7fd94242003-05-18 00:47:47 +0000340 a = array.array(self.typecode)
341 self.assertEqual(repr(a), "array('%s')" % self.typecode)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000342
Walter Dörwald7fd94242003-05-18 00:47:47 +0000343 def test_str(self):
344 a = array.array(self.typecode, 2*self.example)
345 str(a)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000346
Walter Dörwald7fd94242003-05-18 00:47:47 +0000347 def test_cmp(self):
348 a = array.array(self.typecode, self.example)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000349 self.assertTrue((a == 42) is False)
350 self.assertTrue((a != 42) is True)
Tim Peterscc78e472000-11-14 21:36:07 +0000351
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000352 self.assertTrue((a == a) is True)
353 self.assertTrue((a != a) is False)
354 self.assertTrue((a < a) is False)
355 self.assertTrue((a <= a) is True)
356 self.assertTrue((a > a) is False)
357 self.assertTrue((a >= a) is True)
Tim Peterscc78e472000-11-14 21:36:07 +0000358
Neal Norwitzbd2835c2006-03-17 08:54:15 +0000359 al = array.array(self.typecode, self.smallerexample)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000360 ab = array.array(self.typecode, self.biggerexample)
Guido van Rossum7f1d3aa1998-07-16 15:31:43 +0000361
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000362 self.assertTrue((a == 2*a) is False)
363 self.assertTrue((a != 2*a) is True)
364 self.assertTrue((a < 2*a) is True)
365 self.assertTrue((a <= 2*a) is True)
366 self.assertTrue((a > 2*a) is False)
367 self.assertTrue((a >= 2*a) is False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000368
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000369 self.assertTrue((a == al) is False)
370 self.assertTrue((a != al) is True)
371 self.assertTrue((a < al) is False)
372 self.assertTrue((a <= al) is False)
373 self.assertTrue((a > al) is True)
374 self.assertTrue((a >= al) is True)
Martin v. Löwis99866332002-03-01 10:27:01 +0000375
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000376 self.assertTrue((a == ab) is False)
377 self.assertTrue((a != ab) is True)
378 self.assertTrue((a < ab) is True)
379 self.assertTrue((a <= ab) is True)
380 self.assertTrue((a > ab) is False)
381 self.assertTrue((a >= ab) is False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000382
Walter Dörwald7fd94242003-05-18 00:47:47 +0000383 def test_add(self):
384 a = array.array(self.typecode, self.example) \
385 + array.array(self.typecode, self.example[::-1])
386 self.assertEqual(
387 a,
388 array.array(self.typecode, self.example + self.example[::-1])
389 )
Martin v. Löwis99866332002-03-01 10:27:01 +0000390
Walter Dörwald7fd94242003-05-18 00:47:47 +0000391 b = array.array(self.badtypecode())
392 self.assertRaises(TypeError, a.__add__, b)
393
394 self.assertRaises(TypeError, a.__add__, "bad")
395
396 def test_iadd(self):
397 a = array.array(self.typecode, self.example[::-1])
398 b = a
399 a += array.array(self.typecode, 2*self.example)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000400 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000401 self.assertEqual(
402 a,
403 array.array(self.typecode, self.example[::-1]+2*self.example)
404 )
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000405 a = array.array(self.typecode, self.example)
406 a += a
407 self.assertEqual(
408 a,
409 array.array(self.typecode, self.example + self.example)
410 )
Walter Dörwald7fd94242003-05-18 00:47:47 +0000411
412 b = array.array(self.badtypecode())
413 self.assertRaises(TypeError, a.__add__, b)
414
415 self.assertRaises(TypeError, a.__iadd__, "bad")
416
417 def test_mul(self):
418 a = 5*array.array(self.typecode, self.example)
419 self.assertEqual(
420 a,
421 array.array(self.typecode, 5*self.example)
422 )
423
424 a = array.array(self.typecode, self.example)*5
425 self.assertEqual(
426 a,
427 array.array(self.typecode, self.example*5)
428 )
429
430 a = 0*array.array(self.typecode, self.example)
431 self.assertEqual(
432 a,
433 array.array(self.typecode)
434 )
435
436 a = (-1)*array.array(self.typecode, self.example)
437 self.assertEqual(
438 a,
439 array.array(self.typecode)
440 )
441
442 self.assertRaises(TypeError, a.__mul__, "bad")
443
444 def test_imul(self):
445 a = array.array(self.typecode, self.example)
446 b = a
447
448 a *= 5
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000449 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000450 self.assertEqual(
451 a,
452 array.array(self.typecode, 5*self.example)
453 )
454
455 a *= 0
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000456 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000457 self.assertEqual(a, array.array(self.typecode))
458
459 a *= 1000
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000460 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000461 self.assertEqual(a, array.array(self.typecode))
462
463 a *= -1
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000464 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000465 self.assertEqual(a, array.array(self.typecode))
466
467 a = array.array(self.typecode, self.example)
468 a *= -1
469 self.assertEqual(a, array.array(self.typecode))
470
471 self.assertRaises(TypeError, a.__imul__, "bad")
472
473 def test_getitem(self):
474 a = array.array(self.typecode, self.example)
475 self.assertEntryEqual(a[0], self.example[0])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000476 self.assertEntryEqual(a[0], self.example[0])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000477 self.assertEntryEqual(a[-1], self.example[-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000478 self.assertEntryEqual(a[-1], self.example[-1])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000479 self.assertEntryEqual(a[len(self.example)-1], self.example[-1])
480 self.assertEntryEqual(a[-len(self.example)], self.example[0])
481 self.assertRaises(TypeError, a.__getitem__)
482 self.assertRaises(IndexError, a.__getitem__, len(self.example))
483 self.assertRaises(IndexError, a.__getitem__, -len(self.example)-1)
484
485 def test_setitem(self):
486 a = array.array(self.typecode, self.example)
487 a[0] = a[-1]
488 self.assertEntryEqual(a[0], a[-1])
489
490 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000491 a[0] = a[-1]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000492 self.assertEntryEqual(a[0], a[-1])
493
494 a = array.array(self.typecode, self.example)
495 a[-1] = a[0]
496 self.assertEntryEqual(a[0], a[-1])
497
498 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000499 a[-1] = a[0]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000500 self.assertEntryEqual(a[0], a[-1])
501
502 a = array.array(self.typecode, self.example)
503 a[len(self.example)-1] = a[0]
504 self.assertEntryEqual(a[0], a[-1])
505
506 a = array.array(self.typecode, self.example)
507 a[-len(self.example)] = a[-1]
508 self.assertEntryEqual(a[0], a[-1])
509
510 self.assertRaises(TypeError, a.__setitem__)
511 self.assertRaises(TypeError, a.__setitem__, None)
512 self.assertRaises(TypeError, a.__setitem__, 0, None)
513 self.assertRaises(
514 IndexError,
515 a.__setitem__,
516 len(self.example), self.example[0]
517 )
518 self.assertRaises(
519 IndexError,
520 a.__setitem__,
521 -len(self.example)-1, self.example[0]
522 )
523
524 def test_delitem(self):
525 a = array.array(self.typecode, self.example)
526 del a[0]
527 self.assertEqual(
528 a,
529 array.array(self.typecode, self.example[1:])
530 )
531
532 a = array.array(self.typecode, self.example)
533 del a[-1]
534 self.assertEqual(
535 a,
536 array.array(self.typecode, self.example[:-1])
537 )
538
539 a = array.array(self.typecode, self.example)
540 del a[len(self.example)-1]
541 self.assertEqual(
542 a,
543 array.array(self.typecode, self.example[:-1])
544 )
545
546 a = array.array(self.typecode, self.example)
547 del a[-len(self.example)]
548 self.assertEqual(
549 a,
550 array.array(self.typecode, self.example[1:])
551 )
552
553 self.assertRaises(TypeError, a.__delitem__)
554 self.assertRaises(TypeError, a.__delitem__, None)
555 self.assertRaises(IndexError, a.__delitem__, len(self.example))
556 self.assertRaises(IndexError, a.__delitem__, -len(self.example)-1)
557
558 def test_getslice(self):
559 a = array.array(self.typecode, self.example)
560 self.assertEqual(a[:], a)
561
562 self.assertEqual(
563 a[1:],
564 array.array(self.typecode, self.example[1:])
565 )
566
567 self.assertEqual(
568 a[:1],
569 array.array(self.typecode, self.example[:1])
570 )
571
572 self.assertEqual(
573 a[:-1],
574 array.array(self.typecode, self.example[:-1])
575 )
576
577 self.assertEqual(
578 a[-1:],
579 array.array(self.typecode, self.example[-1:])
580 )
581
582 self.assertEqual(
583 a[-1:-1],
584 array.array(self.typecode)
585 )
586
587 self.assertEqual(
Walter Dörwald1083c242005-01-21 21:16:51 +0000588 a[2:1],
589 array.array(self.typecode)
590 )
591
592 self.assertEqual(
Walter Dörwald7fd94242003-05-18 00:47:47 +0000593 a[1000:],
594 array.array(self.typecode)
595 )
596 self.assertEqual(a[-1000:], a)
597 self.assertEqual(a[:1000], a)
598 self.assertEqual(
599 a[:-1000],
600 array.array(self.typecode)
601 )
602 self.assertEqual(a[-1000:1000], a)
603 self.assertEqual(
604 a[2000:1000],
605 array.array(self.typecode)
606 )
607
Thomas Woutersed03b412007-08-28 21:37:11 +0000608 def test_extended_getslice(self):
609 # Test extended slicing by comparing with list slicing
610 # (Assumes list conversion works correctly, too)
611 a = array.array(self.typecode, self.example)
612 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
613 for start in indices:
614 for stop in indices:
615 # Everything except the initial 0 (invalid step)
616 for step in indices[1:]:
617 self.assertEqual(list(a[start:stop:step]),
618 list(a)[start:stop:step])
619
Walter Dörwald7fd94242003-05-18 00:47:47 +0000620 def test_setslice(self):
621 a = array.array(self.typecode, self.example)
622 a[:1] = a
623 self.assertEqual(
624 a,
625 array.array(self.typecode, self.example + self.example[1:])
626 )
627
628 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000629 a[:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000630 self.assertEqual(
631 a,
632 array.array(self.typecode, self.example + self.example[-1:])
633 )
634
635 a = array.array(self.typecode, self.example)
636 a[-1:] = a
637 self.assertEqual(
638 a,
639 array.array(self.typecode, self.example[:-1] + self.example)
640 )
641
642 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000643 a[1:] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000644 self.assertEqual(
645 a,
646 array.array(self.typecode, self.example[:1] + self.example)
647 )
648
649 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000650 a[1:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000651 self.assertEqual(
652 a,
653 array.array(
654 self.typecode,
655 self.example[:1] + self.example + self.example[-1:]
656 )
657 )
658
659 a = array.array(self.typecode, self.example)
660 a[1000:] = a
661 self.assertEqual(
662 a,
663 array.array(self.typecode, 2*self.example)
664 )
665
666 a = array.array(self.typecode, self.example)
667 a[-1000:] = a
668 self.assertEqual(
669 a,
670 array.array(self.typecode, self.example)
671 )
672
673 a = array.array(self.typecode, self.example)
674 a[:1000] = a
675 self.assertEqual(
676 a,
677 array.array(self.typecode, self.example)
678 )
679
680 a = array.array(self.typecode, self.example)
681 a[:-1000] = a
682 self.assertEqual(
683 a,
684 array.array(self.typecode, 2*self.example)
685 )
686
687 a = array.array(self.typecode, self.example)
688 a[1:0] = a
689 self.assertEqual(
690 a,
691 array.array(self.typecode, self.example[:1] + self.example + self.example[1:])
692 )
693
694 a = array.array(self.typecode, self.example)
695 a[2000:1000] = a
696 self.assertEqual(
697 a,
698 array.array(self.typecode, 2*self.example)
699 )
700
701 a = array.array(self.typecode, self.example)
Thomas Woutersed03b412007-08-28 21:37:11 +0000702 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), None)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000703 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), None)
704
705 b = array.array(self.badtypecode())
Thomas Woutersed03b412007-08-28 21:37:11 +0000706 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000707 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), b)
708
Thomas Woutersed03b412007-08-28 21:37:11 +0000709 def test_extended_set_del_slice(self):
710 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
711 for start in indices:
712 for stop in indices:
713 # Everything except the initial 0 (invalid step)
714 for step in indices[1:]:
715 a = array.array(self.typecode, self.example)
716 L = list(a)
717 # Make sure we have a slice of exactly the right length,
718 # but with (hopefully) different data.
719 data = L[start:stop:step]
720 data.reverse()
721 L[start:stop:step] = data
722 a[start:stop:step] = array.array(self.typecode, data)
723 self.assertEquals(a, array.array(self.typecode, L))
724
725 del L[start:stop:step]
726 del a[start:stop:step]
727 self.assertEquals(a, array.array(self.typecode, L))
728
Walter Dörwald7fd94242003-05-18 00:47:47 +0000729 def test_index(self):
730 example = 2*self.example
731 a = array.array(self.typecode, example)
732 self.assertRaises(TypeError, a.index)
733 for x in example:
734 self.assertEqual(a.index(x), example.index(x))
735 self.assertRaises(ValueError, a.index, None)
736 self.assertRaises(ValueError, a.index, self.outside)
737
738 def test_count(self):
739 example = 2*self.example
740 a = array.array(self.typecode, example)
741 self.assertRaises(TypeError, a.count)
742 for x in example:
743 self.assertEqual(a.count(x), example.count(x))
744 self.assertEqual(a.count(self.outside), 0)
745 self.assertEqual(a.count(None), 0)
746
747 def test_remove(self):
748 for x in self.example:
749 example = 2*self.example
750 a = array.array(self.typecode, example)
751 pos = example.index(x)
752 example2 = example[:pos] + example[pos+1:]
753 a.remove(x)
754 self.assertEqual(a, array.array(self.typecode, example2))
755
756 a = array.array(self.typecode, self.example)
757 self.assertRaises(ValueError, a.remove, self.outside)
758
759 self.assertRaises(ValueError, a.remove, None)
760
761 def test_pop(self):
762 a = array.array(self.typecode)
763 self.assertRaises(IndexError, a.pop)
764
765 a = array.array(self.typecode, 2*self.example)
766 self.assertRaises(TypeError, a.pop, 42, 42)
767 self.assertRaises(TypeError, a.pop, None)
768 self.assertRaises(IndexError, a.pop, len(a))
769 self.assertRaises(IndexError, a.pop, -len(a)-1)
770
771 self.assertEntryEqual(a.pop(0), self.example[0])
772 self.assertEqual(
773 a,
774 array.array(self.typecode, self.example[1:]+self.example)
775 )
776 self.assertEntryEqual(a.pop(1), self.example[2])
777 self.assertEqual(
778 a,
779 array.array(self.typecode, self.example[1:2]+self.example[3:]+self.example)
780 )
781 self.assertEntryEqual(a.pop(0), self.example[1])
782 self.assertEntryEqual(a.pop(), self.example[-1])
783 self.assertEqual(
784 a,
785 array.array(self.typecode, self.example[3:]+self.example[:-1])
786 )
787
788 def test_reverse(self):
789 a = array.array(self.typecode, self.example)
790 self.assertRaises(TypeError, a.reverse, 42)
Fred Drake004d5e62000-10-23 17:22:08 +0000791 a.reverse()
Walter Dörwald7fd94242003-05-18 00:47:47 +0000792 self.assertEqual(
793 a,
794 array.array(self.typecode, self.example[::-1])
795 )
796
797 def test_extend(self):
798 a = array.array(self.typecode, self.example)
799 self.assertRaises(TypeError, a.extend)
800 a.extend(array.array(self.typecode, self.example[::-1]))
801 self.assertEqual(
802 a,
803 array.array(self.typecode, self.example+self.example[::-1])
804 )
805
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000806 a = array.array(self.typecode, self.example)
807 a.extend(a)
808 self.assertEqual(
809 a,
810 array.array(self.typecode, self.example+self.example)
811 )
812
Walter Dörwald7fd94242003-05-18 00:47:47 +0000813 b = array.array(self.badtypecode())
814 self.assertRaises(TypeError, a.extend, b)
815
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000816 a = array.array(self.typecode, self.example)
817 a.extend(self.example[::-1])
818 self.assertEqual(
819 a,
820 array.array(self.typecode, self.example+self.example[::-1])
821 )
822
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +0000823 def test_constructor_with_iterable_argument(self):
824 a = array.array(self.typecode, iter(self.example))
825 b = array.array(self.typecode, self.example)
826 self.assertEqual(a, b)
827
828 # non-iterable argument
829 self.assertRaises(TypeError, array.array, self.typecode, 10)
830
831 # pass through errors raised in __iter__
832 class A:
833 def __iter__(self):
834 raise UnicodeError
835 self.assertRaises(UnicodeError, array.array, self.typecode, A())
836
837 # pass through errors raised in next()
838 def B():
839 raise UnicodeError
840 yield None
841 self.assertRaises(UnicodeError, array.array, self.typecode, B())
842
Walter Dörwald7fd94242003-05-18 00:47:47 +0000843 def test_coveritertraverse(self):
844 try:
845 import gc
846 except ImportError:
847 return
848 a = array.array(self.typecode)
849 l = [iter(a)]
850 l.append(l)
851 gc.collect()
852
853 def test_buffer(self):
854 a = array.array(self.typecode, self.example)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000855 m = memoryview(a)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000856 expected = m.tobytes()
857 self.assertEqual(a.tostring(), expected)
858 self.assertEqual(a.tostring()[0], expected[0])
859 # Resizing is forbidden when there are buffer exports.
860 # For issue 4509, we also check after each error that
861 # the array was not modified.
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000862 self.assertRaises(BufferError, a.append, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000863 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000864 self.assertRaises(BufferError, a.extend, a[0:1])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000865 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000866 self.assertRaises(BufferError, a.remove, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000867 self.assertEqual(m.tobytes(), expected)
868 self.assertRaises(BufferError, a.pop, 0)
869 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000870 self.assertRaises(BufferError, a.fromlist, a.tolist())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000871 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000872 self.assertRaises(BufferError, a.fromstring, a.tostring())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000873 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000874 if self.typecode == 'u':
875 self.assertRaises(BufferError, a.fromunicode, a.tounicode())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000876 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +0000877 self.assertRaises(BufferError, operator.imul, a, 2)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000878 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +0000879 self.assertRaises(BufferError, operator.imul, a, 0)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000880 self.assertEqual(m.tobytes(), expected)
881 self.assertRaises(BufferError, operator.setitem, a, slice(0, 0), a)
882 self.assertEqual(m.tobytes(), expected)
883 self.assertRaises(BufferError, operator.delitem, a, 0)
884 self.assertEqual(m.tobytes(), expected)
885 self.assertRaises(BufferError, operator.delitem, a, slice(0, 1))
886 self.assertEqual(m.tobytes(), expected)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000887
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000888 def test_weakref(self):
889 s = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000890 p = weakref.proxy(s)
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000891 self.assertEqual(p.tostring(), s.tostring())
892 s = None
893 self.assertRaises(ReferenceError, len, p)
894
Skip Montanarod5cf0b82003-08-03 23:02:10 +0000895 def test_bug_782369(self):
896 import sys
Skip Montanaroed9bf122003-08-03 23:30:40 +0000897 if hasattr(sys, "getrefcount"):
898 for i in range(10):
899 b = array.array('B', range(64))
900 rc = sys.getrefcount(10)
901 for i in range(10):
902 b = array.array('B', range(64))
903 self.assertEqual(rc, sys.getrefcount(10))
Skip Montanarod5cf0b82003-08-03 23:02:10 +0000904
Thomas Woutersb2137042007-02-01 18:02:27 +0000905 def test_subclass_with_kwargs(self):
906 # SF bug #1486663 -- this used to erroneously raise a TypeError
907 ArraySubclassWithKwargs('b', newarg=1)
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000908
Guido van Rossum6b826ab2007-07-03 16:22:09 +0000909 def test_create_from_bytes(self):
Alexandre Vassalotti7e4f3212009-07-05 05:38:18 +0000910 # XXX This test probably needs to be moved in a subclass or
911 # generalized to use self.typecode.
Guido van Rossum6b826ab2007-07-03 16:22:09 +0000912 a = array.array('H', b"1234")
913 self.assertEqual(len(a) * a.itemsize, 4)
914
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000915
Walter Dörwald7fd94242003-05-18 00:47:47 +0000916class StringTest(BaseTest):
917
918 def test_setitem(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000919 super().test_setitem()
Walter Dörwald7fd94242003-05-18 00:47:47 +0000920 a = array.array(self.typecode, self.example)
921 self.assertRaises(TypeError, a.__setitem__, 0, self.example[:2])
922
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000923class UnicodeTest(StringTest):
924 typecode = 'u'
925 example = '\x01\u263a\x00\ufeff'
926 smallerexample = '\x01\u263a\x00\ufefe'
927 biggerexample = '\x01\u263a\x01\ufeff'
928 outside = str('\x33')
929 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +0000930
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000931 def test_unicode(self):
932 self.assertRaises(TypeError, array.array, 'b', 'foo')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000933
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000934 a = array.array('u', '\xa0\xc2\u1234')
935 a.fromunicode(' ')
936 a.fromunicode('')
937 a.fromunicode('')
938 a.fromunicode('\x11abc\xff\u1234')
939 s = a.tounicode()
940 self.assertEqual(s, '\xa0\xc2\u1234 \x11abc\xff\u1234')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000941
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000942 s = '\x00="\'a\\b\x80\xff\u0000\u0001\u1234'
943 a = array.array('u', s)
944 self.assertEqual(
945 repr(a),
Georg Brandl559e5d72008-06-11 18:37:52 +0000946 "array('u', '\\x00=\"\\'a\\\\b\\x80\xff\\x00\\x01\u1234')")
Walter Dörwald7fd94242003-05-18 00:47:47 +0000947
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000948 self.assertRaises(TypeError, a.fromunicode)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000949
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000950tests.append(UnicodeTest)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000951
952class NumberTest(BaseTest):
953
954 def test_extslice(self):
955 a = array.array(self.typecode, range(5))
956 self.assertEqual(a[::], a)
957 self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
958 self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
959 self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
960 self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
961 self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
962 self.assertEqual(a[-100:100:], a)
963 self.assertEqual(a[100:-100:-1], a[::-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000964 self.assertEqual(a[-100:100:2], array.array(self.typecode, [0,2,4]))
Walter Dörwald7fd94242003-05-18 00:47:47 +0000965 self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
966 self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
967
968 def test_delslice(self):
969 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +0000970 del a[::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000971 self.assertEqual(a, array.array(self.typecode, [1,3]))
972 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +0000973 del a[1::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000974 self.assertEqual(a, array.array(self.typecode, [0,2,4]))
975 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +0000976 del a[1::-2]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000977 self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
978 a = array.array(self.typecode, range(10))
Michael W. Hudson56796f62002-07-29 14:35:04 +0000979 del a[::1000]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000980 self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
981
982 def test_assignment(self):
983 a = array.array(self.typecode, range(10))
984 a[::2] = array.array(self.typecode, [42]*5)
985 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
986 a = array.array(self.typecode, range(10))
987 a[::-4] = array.array(self.typecode, [10]*3)
988 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
989 a = array.array(self.typecode, range(4))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +0000990 a[::-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000991 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
992 a = array.array(self.typecode, range(10))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +0000993 b = a[:]
994 c = a[:]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000995 ins = array.array(self.typecode, range(2))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +0000996 a[2:3] = ins
997 b[slice(2,3)] = ins
998 c[2:3:] = ins
Fred Drake004d5e62000-10-23 17:22:08 +0000999
Walter Dörwald7fd94242003-05-18 00:47:47 +00001000 def test_iterationcontains(self):
1001 a = array.array(self.typecode, range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +00001002 self.assertEqual(list(a), list(range(10)))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001003 b = array.array(self.typecode, [20])
1004 self.assertEqual(a[-1] in a, True)
1005 self.assertEqual(b[0] not in a, True)
1006
1007 def check_overflow(self, lower, upper):
1008 # method to be used by subclasses
1009
1010 # should not overflow assigning lower limit
1011 a = array.array(self.typecode, [lower])
1012 a[0] = lower
1013 # should overflow assigning less than lower limit
1014 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
1015 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
1016 # should not overflow assigning upper limit
1017 a = array.array(self.typecode, [upper])
1018 a[0] = upper
1019 # should overflow assigning more than upper limit
1020 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
1021 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
1022
1023 def test_subclassing(self):
1024 typecode = self.typecode
1025 class ExaggeratingArray(array.array):
1026 __slots__ = ['offset']
1027
1028 def __new__(cls, typecode, data, offset):
1029 return array.array.__new__(cls, typecode, data)
1030
1031 def __init__(self, typecode, data, offset):
1032 self.offset = offset
1033
1034 def __getitem__(self, i):
1035 return array.array.__getitem__(self, i) + self.offset
1036
1037 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
1038 self.assertEntryEqual(a[0], 7)
1039
1040 self.assertRaises(AttributeError, setattr, a, "color", "blue")
1041
1042class SignedNumberTest(NumberTest):
1043 example = [-1, 0, 1, 42, 0x7f]
1044 smallerexample = [-1, 0, 1, 42, 0x7e]
1045 biggerexample = [-1, 0, 1, 43, 0x7f]
1046 outside = 23
1047
1048 def test_overflow(self):
1049 a = array.array(self.typecode)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001050 lower = -1 * int(pow(2, a.itemsize * 8 - 1))
1051 upper = int(pow(2, a.itemsize * 8 - 1)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001052 self.check_overflow(lower, upper)
1053
1054class UnsignedNumberTest(NumberTest):
1055 example = [0, 1, 17, 23, 42, 0xff]
1056 smallerexample = [0, 1, 17, 23, 42, 0xfe]
1057 biggerexample = [0, 1, 17, 23, 43, 0xff]
1058 outside = 0xaa
1059
1060 def test_overflow(self):
1061 a = array.array(self.typecode)
1062 lower = 0
Guido van Rossume2a383d2007-01-15 16:59:06 +00001063 upper = int(pow(2, a.itemsize * 8)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001064 self.check_overflow(lower, upper)
Fred Drake004d5e62000-10-23 17:22:08 +00001065
1066
Walter Dörwald7fd94242003-05-18 00:47:47 +00001067class ByteTest(SignedNumberTest):
1068 typecode = 'b'
1069 minitemsize = 1
1070tests.append(ByteTest)
Fred Drake004d5e62000-10-23 17:22:08 +00001071
Walter Dörwald7fd94242003-05-18 00:47:47 +00001072class UnsignedByteTest(UnsignedNumberTest):
1073 typecode = 'B'
1074 minitemsize = 1
1075tests.append(UnsignedByteTest)
1076
1077class ShortTest(SignedNumberTest):
1078 typecode = 'h'
1079 minitemsize = 2
1080tests.append(ShortTest)
1081
1082class UnsignedShortTest(UnsignedNumberTest):
1083 typecode = 'H'
1084 minitemsize = 2
1085tests.append(UnsignedShortTest)
1086
1087class IntTest(SignedNumberTest):
1088 typecode = 'i'
1089 minitemsize = 2
1090tests.append(IntTest)
1091
1092class UnsignedIntTest(UnsignedNumberTest):
1093 typecode = 'I'
1094 minitemsize = 2
1095tests.append(UnsignedIntTest)
1096
1097class LongTest(SignedNumberTest):
1098 typecode = 'l'
1099 minitemsize = 4
1100tests.append(LongTest)
1101
1102class UnsignedLongTest(UnsignedNumberTest):
1103 typecode = 'L'
1104 minitemsize = 4
1105tests.append(UnsignedLongTest)
1106
1107class FPTest(NumberTest):
1108 example = [-42.0, 0, 42, 1e5, -1e10]
1109 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
1110 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
1111 outside = 23
1112
1113 def assertEntryEqual(self, entry1, entry2):
1114 self.assertAlmostEqual(entry1, entry2)
1115
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001116 def test_byteswap(self):
1117 a = array.array(self.typecode, self.example)
1118 self.assertRaises(TypeError, a.byteswap, 42)
1119 if a.itemsize in (1, 2, 4, 8):
1120 b = array.array(self.typecode, self.example)
1121 b.byteswap()
1122 if a.itemsize==1:
1123 self.assertEqual(a, b)
1124 else:
1125 # On alphas treating the byte swapped bit patters as
1126 # floats/doubles results in floating point exceptions
1127 # => compare the 8bit string values instead
1128 self.assertNotEqual(a.tostring(), b.tostring())
1129 b.byteswap()
1130 self.assertEqual(a, b)
1131
Neal Norwitz35c6cd02003-05-22 13:29:15 +00001132class FloatTest(FPTest):
1133 typecode = 'f'
1134 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001135tests.append(FloatTest)
1136
1137class DoubleTest(FPTest):
1138 typecode = 'd'
1139 minitemsize = 8
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001140
1141 def test_alloc_overflow(self):
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001142 from sys import maxsize
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001143 a = array.array('d', [-1]*65536)
1144 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001145 a *= maxsize//65536 + 1
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001146 except MemoryError:
1147 pass
1148 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001149 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001150 b = array.array('d', [ 2.71828183, 3.14159265, -1])
1151 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001152 b * (maxsize//3 + 1)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001153 except MemoryError:
1154 pass
1155 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001156 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001157
Walter Dörwald7fd94242003-05-18 00:47:47 +00001158tests.append(DoubleTest)
1159
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001160def test_main(verbose=None):
1161 import sys
1162
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001163 support.run_unittest(*tests)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001164
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001165 # verify reference counting
1166 if verbose and hasattr(sys, "gettotalrefcount"):
1167 import gc
1168 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001169 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001170 support.run_unittest(*tests)
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001171 gc.collect()
1172 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001173 print(counts)
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001174
1175if __name__ == "__main__":
1176 test_main(verbose=True)