blob: d8d4ea79c5c3263d300622e3109bfea1ebf42f53 [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
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000329 def test_fromfile_ioerror(self):
330 # Issue #5395: Check if fromfile raises a proper IOError
331 # instead of EOFError.
332 a = array.array(self.typecode)
333 f = open(support.TESTFN, 'wb')
334 try:
335 self.assertRaises(IOError, a.fromfile, f, len(self.example))
336 finally:
337 f.close()
338 support.unlink(support.TESTFN)
339
Frank Wierzbicki17683432009-08-16 20:30:12 +0000340 def test_filewrite(self):
341 a = array.array(self.typecode, 2*self.example)
342 f = open(support.TESTFN, 'wb')
343 try:
344 f.write(a)
345 f.close()
346 b = array.array(self.typecode)
347 f = open(support.TESTFN, 'rb')
348 b.fromfile(f, len(self.example))
349 self.assertEqual(b, array.array(self.typecode, self.example))
350 self.assertNotEqual(a, b)
351 b.fromfile(f, len(self.example))
352 self.assertEqual(a, b)
353 f.close()
354 finally:
355 if not f.closed:
356 f.close()
357 support.unlink(support.TESTFN)
358
Walter Dörwald7fd94242003-05-18 00:47:47 +0000359 def test_tofromlist(self):
360 a = array.array(self.typecode, 2*self.example)
361 b = array.array(self.typecode)
362 self.assertRaises(TypeError, a.tolist, 42)
363 self.assertRaises(TypeError, b.fromlist)
364 self.assertRaises(TypeError, b.fromlist, 42)
365 self.assertRaises(TypeError, b.fromlist, [None])
366 b.fromlist(a.tolist())
367 self.assertEqual(a, b)
Fred Drake78334472000-06-28 17:50:51 +0000368
Walter Dörwald7fd94242003-05-18 00:47:47 +0000369 def test_tofromstring(self):
370 a = array.array(self.typecode, 2*self.example)
371 b = array.array(self.typecode)
372 self.assertRaises(TypeError, a.tostring, 42)
373 self.assertRaises(TypeError, b.fromstring)
374 self.assertRaises(TypeError, b.fromstring, 42)
375 b.fromstring(a.tostring())
376 self.assertEqual(a, b)
377 if a.itemsize>1:
378 self.assertRaises(ValueError, b.fromstring, "x")
Fred Drake78334472000-06-28 17:50:51 +0000379
Walter Dörwald7fd94242003-05-18 00:47:47 +0000380 def test_repr(self):
381 a = array.array(self.typecode, 2*self.example)
382 self.assertEqual(a, eval(repr(a), {"array": array.array}))
Fred Drake78334472000-06-28 17:50:51 +0000383
Walter Dörwald7fd94242003-05-18 00:47:47 +0000384 a = array.array(self.typecode)
385 self.assertEqual(repr(a), "array('%s')" % self.typecode)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000386
Walter Dörwald7fd94242003-05-18 00:47:47 +0000387 def test_str(self):
388 a = array.array(self.typecode, 2*self.example)
389 str(a)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000390
Walter Dörwald7fd94242003-05-18 00:47:47 +0000391 def test_cmp(self):
392 a = array.array(self.typecode, self.example)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000393 self.assertTrue((a == 42) is False)
394 self.assertTrue((a != 42) is True)
Tim Peterscc78e472000-11-14 21:36:07 +0000395
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000396 self.assertTrue((a == a) is True)
397 self.assertTrue((a != a) is False)
398 self.assertTrue((a < a) is False)
399 self.assertTrue((a <= a) is True)
400 self.assertTrue((a > a) is False)
401 self.assertTrue((a >= a) is True)
Tim Peterscc78e472000-11-14 21:36:07 +0000402
Neal Norwitzbd2835c2006-03-17 08:54:15 +0000403 al = array.array(self.typecode, self.smallerexample)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000404 ab = array.array(self.typecode, self.biggerexample)
Guido van Rossum7f1d3aa1998-07-16 15:31:43 +0000405
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000406 self.assertTrue((a == 2*a) is False)
407 self.assertTrue((a != 2*a) is True)
408 self.assertTrue((a < 2*a) is True)
409 self.assertTrue((a <= 2*a) is True)
410 self.assertTrue((a > 2*a) is False)
411 self.assertTrue((a >= 2*a) is False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000412
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000413 self.assertTrue((a == al) is False)
414 self.assertTrue((a != al) is True)
415 self.assertTrue((a < al) is False)
416 self.assertTrue((a <= al) is False)
417 self.assertTrue((a > al) is True)
418 self.assertTrue((a >= al) is True)
Martin v. Löwis99866332002-03-01 10:27:01 +0000419
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000420 self.assertTrue((a == ab) is False)
421 self.assertTrue((a != ab) is True)
422 self.assertTrue((a < ab) is True)
423 self.assertTrue((a <= ab) is True)
424 self.assertTrue((a > ab) is False)
425 self.assertTrue((a >= ab) is False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000426
Walter Dörwald7fd94242003-05-18 00:47:47 +0000427 def test_add(self):
428 a = array.array(self.typecode, self.example) \
429 + array.array(self.typecode, self.example[::-1])
430 self.assertEqual(
431 a,
432 array.array(self.typecode, self.example + self.example[::-1])
433 )
Martin v. Löwis99866332002-03-01 10:27:01 +0000434
Walter Dörwald7fd94242003-05-18 00:47:47 +0000435 b = array.array(self.badtypecode())
436 self.assertRaises(TypeError, a.__add__, b)
437
438 self.assertRaises(TypeError, a.__add__, "bad")
439
440 def test_iadd(self):
441 a = array.array(self.typecode, self.example[::-1])
442 b = a
443 a += array.array(self.typecode, 2*self.example)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000444 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000445 self.assertEqual(
446 a,
447 array.array(self.typecode, self.example[::-1]+2*self.example)
448 )
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000449 a = array.array(self.typecode, self.example)
450 a += a
451 self.assertEqual(
452 a,
453 array.array(self.typecode, self.example + self.example)
454 )
Walter Dörwald7fd94242003-05-18 00:47:47 +0000455
456 b = array.array(self.badtypecode())
457 self.assertRaises(TypeError, a.__add__, b)
458
459 self.assertRaises(TypeError, a.__iadd__, "bad")
460
461 def test_mul(self):
462 a = 5*array.array(self.typecode, self.example)
463 self.assertEqual(
464 a,
465 array.array(self.typecode, 5*self.example)
466 )
467
468 a = array.array(self.typecode, self.example)*5
469 self.assertEqual(
470 a,
471 array.array(self.typecode, self.example*5)
472 )
473
474 a = 0*array.array(self.typecode, self.example)
475 self.assertEqual(
476 a,
477 array.array(self.typecode)
478 )
479
480 a = (-1)*array.array(self.typecode, self.example)
481 self.assertEqual(
482 a,
483 array.array(self.typecode)
484 )
485
486 self.assertRaises(TypeError, a.__mul__, "bad")
487
488 def test_imul(self):
489 a = array.array(self.typecode, self.example)
490 b = a
491
492 a *= 5
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000493 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000494 self.assertEqual(
495 a,
496 array.array(self.typecode, 5*self.example)
497 )
498
499 a *= 0
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000500 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000501 self.assertEqual(a, array.array(self.typecode))
502
503 a *= 1000
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000504 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000505 self.assertEqual(a, array.array(self.typecode))
506
507 a *= -1
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000508 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000509 self.assertEqual(a, array.array(self.typecode))
510
511 a = array.array(self.typecode, self.example)
512 a *= -1
513 self.assertEqual(a, array.array(self.typecode))
514
515 self.assertRaises(TypeError, a.__imul__, "bad")
516
517 def test_getitem(self):
518 a = array.array(self.typecode, self.example)
519 self.assertEntryEqual(a[0], self.example[0])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000520 self.assertEntryEqual(a[0], self.example[0])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000521 self.assertEntryEqual(a[-1], self.example[-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000522 self.assertEntryEqual(a[-1], self.example[-1])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000523 self.assertEntryEqual(a[len(self.example)-1], self.example[-1])
524 self.assertEntryEqual(a[-len(self.example)], self.example[0])
525 self.assertRaises(TypeError, a.__getitem__)
526 self.assertRaises(IndexError, a.__getitem__, len(self.example))
527 self.assertRaises(IndexError, a.__getitem__, -len(self.example)-1)
528
529 def test_setitem(self):
530 a = array.array(self.typecode, self.example)
531 a[0] = a[-1]
532 self.assertEntryEqual(a[0], a[-1])
533
534 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000535 a[0] = a[-1]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000536 self.assertEntryEqual(a[0], a[-1])
537
538 a = array.array(self.typecode, self.example)
539 a[-1] = a[0]
540 self.assertEntryEqual(a[0], a[-1])
541
542 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000543 a[-1] = a[0]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000544 self.assertEntryEqual(a[0], a[-1])
545
546 a = array.array(self.typecode, self.example)
547 a[len(self.example)-1] = a[0]
548 self.assertEntryEqual(a[0], a[-1])
549
550 a = array.array(self.typecode, self.example)
551 a[-len(self.example)] = a[-1]
552 self.assertEntryEqual(a[0], a[-1])
553
554 self.assertRaises(TypeError, a.__setitem__)
555 self.assertRaises(TypeError, a.__setitem__, None)
556 self.assertRaises(TypeError, a.__setitem__, 0, None)
557 self.assertRaises(
558 IndexError,
559 a.__setitem__,
560 len(self.example), self.example[0]
561 )
562 self.assertRaises(
563 IndexError,
564 a.__setitem__,
565 -len(self.example)-1, self.example[0]
566 )
567
568 def test_delitem(self):
569 a = array.array(self.typecode, self.example)
570 del a[0]
571 self.assertEqual(
572 a,
573 array.array(self.typecode, self.example[1:])
574 )
575
576 a = array.array(self.typecode, self.example)
577 del a[-1]
578 self.assertEqual(
579 a,
580 array.array(self.typecode, self.example[:-1])
581 )
582
583 a = array.array(self.typecode, self.example)
584 del a[len(self.example)-1]
585 self.assertEqual(
586 a,
587 array.array(self.typecode, self.example[:-1])
588 )
589
590 a = array.array(self.typecode, self.example)
591 del a[-len(self.example)]
592 self.assertEqual(
593 a,
594 array.array(self.typecode, self.example[1:])
595 )
596
597 self.assertRaises(TypeError, a.__delitem__)
598 self.assertRaises(TypeError, a.__delitem__, None)
599 self.assertRaises(IndexError, a.__delitem__, len(self.example))
600 self.assertRaises(IndexError, a.__delitem__, -len(self.example)-1)
601
602 def test_getslice(self):
603 a = array.array(self.typecode, self.example)
604 self.assertEqual(a[:], a)
605
606 self.assertEqual(
607 a[1:],
608 array.array(self.typecode, self.example[1:])
609 )
610
611 self.assertEqual(
612 a[:1],
613 array.array(self.typecode, self.example[:1])
614 )
615
616 self.assertEqual(
617 a[:-1],
618 array.array(self.typecode, self.example[:-1])
619 )
620
621 self.assertEqual(
622 a[-1:],
623 array.array(self.typecode, self.example[-1:])
624 )
625
626 self.assertEqual(
627 a[-1:-1],
628 array.array(self.typecode)
629 )
630
631 self.assertEqual(
Walter Dörwald1083c242005-01-21 21:16:51 +0000632 a[2:1],
633 array.array(self.typecode)
634 )
635
636 self.assertEqual(
Walter Dörwald7fd94242003-05-18 00:47:47 +0000637 a[1000:],
638 array.array(self.typecode)
639 )
640 self.assertEqual(a[-1000:], a)
641 self.assertEqual(a[:1000], a)
642 self.assertEqual(
643 a[:-1000],
644 array.array(self.typecode)
645 )
646 self.assertEqual(a[-1000:1000], a)
647 self.assertEqual(
648 a[2000:1000],
649 array.array(self.typecode)
650 )
651
Thomas Woutersed03b412007-08-28 21:37:11 +0000652 def test_extended_getslice(self):
653 # Test extended slicing by comparing with list slicing
654 # (Assumes list conversion works correctly, too)
655 a = array.array(self.typecode, self.example)
656 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
657 for start in indices:
658 for stop in indices:
659 # Everything except the initial 0 (invalid step)
660 for step in indices[1:]:
661 self.assertEqual(list(a[start:stop:step]),
662 list(a)[start:stop:step])
663
Walter Dörwald7fd94242003-05-18 00:47:47 +0000664 def test_setslice(self):
665 a = array.array(self.typecode, self.example)
666 a[:1] = a
667 self.assertEqual(
668 a,
669 array.array(self.typecode, self.example + self.example[1:])
670 )
671
672 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000673 a[:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000674 self.assertEqual(
675 a,
676 array.array(self.typecode, self.example + self.example[-1:])
677 )
678
679 a = array.array(self.typecode, self.example)
680 a[-1:] = a
681 self.assertEqual(
682 a,
683 array.array(self.typecode, self.example[:-1] + self.example)
684 )
685
686 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000687 a[1:] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000688 self.assertEqual(
689 a,
690 array.array(self.typecode, self.example[:1] + self.example)
691 )
692
693 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000694 a[1:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000695 self.assertEqual(
696 a,
697 array.array(
698 self.typecode,
699 self.example[:1] + self.example + self.example[-1:]
700 )
701 )
702
703 a = array.array(self.typecode, self.example)
704 a[1000:] = a
705 self.assertEqual(
706 a,
707 array.array(self.typecode, 2*self.example)
708 )
709
710 a = array.array(self.typecode, self.example)
711 a[-1000:] = a
712 self.assertEqual(
713 a,
714 array.array(self.typecode, self.example)
715 )
716
717 a = array.array(self.typecode, self.example)
718 a[:1000] = a
719 self.assertEqual(
720 a,
721 array.array(self.typecode, self.example)
722 )
723
724 a = array.array(self.typecode, self.example)
725 a[:-1000] = a
726 self.assertEqual(
727 a,
728 array.array(self.typecode, 2*self.example)
729 )
730
731 a = array.array(self.typecode, self.example)
732 a[1:0] = a
733 self.assertEqual(
734 a,
735 array.array(self.typecode, self.example[:1] + self.example + self.example[1:])
736 )
737
738 a = array.array(self.typecode, self.example)
739 a[2000:1000] = a
740 self.assertEqual(
741 a,
742 array.array(self.typecode, 2*self.example)
743 )
744
745 a = array.array(self.typecode, self.example)
Thomas Woutersed03b412007-08-28 21:37:11 +0000746 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), None)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000747 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), None)
748
749 b = array.array(self.badtypecode())
Thomas Woutersed03b412007-08-28 21:37:11 +0000750 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000751 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), b)
752
Thomas Woutersed03b412007-08-28 21:37:11 +0000753 def test_extended_set_del_slice(self):
754 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
755 for start in indices:
756 for stop in indices:
757 # Everything except the initial 0 (invalid step)
758 for step in indices[1:]:
759 a = array.array(self.typecode, self.example)
760 L = list(a)
761 # Make sure we have a slice of exactly the right length,
762 # but with (hopefully) different data.
763 data = L[start:stop:step]
764 data.reverse()
765 L[start:stop:step] = data
766 a[start:stop:step] = array.array(self.typecode, data)
767 self.assertEquals(a, array.array(self.typecode, L))
768
769 del L[start:stop:step]
770 del a[start:stop:step]
771 self.assertEquals(a, array.array(self.typecode, L))
772
Walter Dörwald7fd94242003-05-18 00:47:47 +0000773 def test_index(self):
774 example = 2*self.example
775 a = array.array(self.typecode, example)
776 self.assertRaises(TypeError, a.index)
777 for x in example:
778 self.assertEqual(a.index(x), example.index(x))
779 self.assertRaises(ValueError, a.index, None)
780 self.assertRaises(ValueError, a.index, self.outside)
781
782 def test_count(self):
783 example = 2*self.example
784 a = array.array(self.typecode, example)
785 self.assertRaises(TypeError, a.count)
786 for x in example:
787 self.assertEqual(a.count(x), example.count(x))
788 self.assertEqual(a.count(self.outside), 0)
789 self.assertEqual(a.count(None), 0)
790
791 def test_remove(self):
792 for x in self.example:
793 example = 2*self.example
794 a = array.array(self.typecode, example)
795 pos = example.index(x)
796 example2 = example[:pos] + example[pos+1:]
797 a.remove(x)
798 self.assertEqual(a, array.array(self.typecode, example2))
799
800 a = array.array(self.typecode, self.example)
801 self.assertRaises(ValueError, a.remove, self.outside)
802
803 self.assertRaises(ValueError, a.remove, None)
804
805 def test_pop(self):
806 a = array.array(self.typecode)
807 self.assertRaises(IndexError, a.pop)
808
809 a = array.array(self.typecode, 2*self.example)
810 self.assertRaises(TypeError, a.pop, 42, 42)
811 self.assertRaises(TypeError, a.pop, None)
812 self.assertRaises(IndexError, a.pop, len(a))
813 self.assertRaises(IndexError, a.pop, -len(a)-1)
814
815 self.assertEntryEqual(a.pop(0), self.example[0])
816 self.assertEqual(
817 a,
818 array.array(self.typecode, self.example[1:]+self.example)
819 )
820 self.assertEntryEqual(a.pop(1), self.example[2])
821 self.assertEqual(
822 a,
823 array.array(self.typecode, self.example[1:2]+self.example[3:]+self.example)
824 )
825 self.assertEntryEqual(a.pop(0), self.example[1])
826 self.assertEntryEqual(a.pop(), self.example[-1])
827 self.assertEqual(
828 a,
829 array.array(self.typecode, self.example[3:]+self.example[:-1])
830 )
831
832 def test_reverse(self):
833 a = array.array(self.typecode, self.example)
834 self.assertRaises(TypeError, a.reverse, 42)
Fred Drake004d5e62000-10-23 17:22:08 +0000835 a.reverse()
Walter Dörwald7fd94242003-05-18 00:47:47 +0000836 self.assertEqual(
837 a,
838 array.array(self.typecode, self.example[::-1])
839 )
840
841 def test_extend(self):
842 a = array.array(self.typecode, self.example)
843 self.assertRaises(TypeError, a.extend)
844 a.extend(array.array(self.typecode, self.example[::-1]))
845 self.assertEqual(
846 a,
847 array.array(self.typecode, self.example+self.example[::-1])
848 )
849
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000850 a = array.array(self.typecode, self.example)
851 a.extend(a)
852 self.assertEqual(
853 a,
854 array.array(self.typecode, self.example+self.example)
855 )
856
Walter Dörwald7fd94242003-05-18 00:47:47 +0000857 b = array.array(self.badtypecode())
858 self.assertRaises(TypeError, a.extend, b)
859
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000860 a = array.array(self.typecode, self.example)
861 a.extend(self.example[::-1])
862 self.assertEqual(
863 a,
864 array.array(self.typecode, self.example+self.example[::-1])
865 )
866
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +0000867 def test_constructor_with_iterable_argument(self):
868 a = array.array(self.typecode, iter(self.example))
869 b = array.array(self.typecode, self.example)
870 self.assertEqual(a, b)
871
872 # non-iterable argument
873 self.assertRaises(TypeError, array.array, self.typecode, 10)
874
875 # pass through errors raised in __iter__
876 class A:
877 def __iter__(self):
878 raise UnicodeError
879 self.assertRaises(UnicodeError, array.array, self.typecode, A())
880
881 # pass through errors raised in next()
882 def B():
883 raise UnicodeError
884 yield None
885 self.assertRaises(UnicodeError, array.array, self.typecode, B())
886
Walter Dörwald7fd94242003-05-18 00:47:47 +0000887 def test_coveritertraverse(self):
888 try:
889 import gc
890 except ImportError:
891 return
892 a = array.array(self.typecode)
893 l = [iter(a)]
894 l.append(l)
895 gc.collect()
896
897 def test_buffer(self):
898 a = array.array(self.typecode, self.example)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000899 m = memoryview(a)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000900 expected = m.tobytes()
901 self.assertEqual(a.tostring(), expected)
902 self.assertEqual(a.tostring()[0], expected[0])
903 # Resizing is forbidden when there are buffer exports.
904 # For issue 4509, we also check after each error that
905 # the array was not modified.
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000906 self.assertRaises(BufferError, a.append, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000907 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000908 self.assertRaises(BufferError, a.extend, a[0:1])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000909 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000910 self.assertRaises(BufferError, a.remove, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000911 self.assertEqual(m.tobytes(), expected)
912 self.assertRaises(BufferError, a.pop, 0)
913 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000914 self.assertRaises(BufferError, a.fromlist, a.tolist())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000915 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000916 self.assertRaises(BufferError, a.fromstring, a.tostring())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000917 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000918 if self.typecode == 'u':
919 self.assertRaises(BufferError, a.fromunicode, a.tounicode())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000920 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +0000921 self.assertRaises(BufferError, operator.imul, a, 2)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000922 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +0000923 self.assertRaises(BufferError, operator.imul, a, 0)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000924 self.assertEqual(m.tobytes(), expected)
925 self.assertRaises(BufferError, operator.setitem, a, slice(0, 0), a)
926 self.assertEqual(m.tobytes(), expected)
927 self.assertRaises(BufferError, operator.delitem, a, 0)
928 self.assertEqual(m.tobytes(), expected)
929 self.assertRaises(BufferError, operator.delitem, a, slice(0, 1))
930 self.assertEqual(m.tobytes(), expected)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000931
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000932 def test_weakref(self):
933 s = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000934 p = weakref.proxy(s)
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000935 self.assertEqual(p.tostring(), s.tostring())
936 s = None
937 self.assertRaises(ReferenceError, len, p)
938
Skip Montanarod5cf0b82003-08-03 23:02:10 +0000939 def test_bug_782369(self):
940 import sys
Skip Montanaroed9bf122003-08-03 23:30:40 +0000941 if hasattr(sys, "getrefcount"):
942 for i in range(10):
943 b = array.array('B', range(64))
944 rc = sys.getrefcount(10)
945 for i in range(10):
946 b = array.array('B', range(64))
947 self.assertEqual(rc, sys.getrefcount(10))
Skip Montanarod5cf0b82003-08-03 23:02:10 +0000948
Thomas Woutersb2137042007-02-01 18:02:27 +0000949 def test_subclass_with_kwargs(self):
950 # SF bug #1486663 -- this used to erroneously raise a TypeError
951 ArraySubclassWithKwargs('b', newarg=1)
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000952
Guido van Rossum6b826ab2007-07-03 16:22:09 +0000953 def test_create_from_bytes(self):
Alexandre Vassalotti7e4f3212009-07-05 05:38:18 +0000954 # XXX This test probably needs to be moved in a subclass or
955 # generalized to use self.typecode.
Guido van Rossum6b826ab2007-07-03 16:22:09 +0000956 a = array.array('H', b"1234")
957 self.assertEqual(len(a) * a.itemsize, 4)
958
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000959
Walter Dörwald7fd94242003-05-18 00:47:47 +0000960class StringTest(BaseTest):
961
962 def test_setitem(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000963 super().test_setitem()
Walter Dörwald7fd94242003-05-18 00:47:47 +0000964 a = array.array(self.typecode, self.example)
965 self.assertRaises(TypeError, a.__setitem__, 0, self.example[:2])
966
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000967class UnicodeTest(StringTest):
968 typecode = 'u'
969 example = '\x01\u263a\x00\ufeff'
970 smallerexample = '\x01\u263a\x00\ufefe'
971 biggerexample = '\x01\u263a\x01\ufeff'
972 outside = str('\x33')
973 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +0000974
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000975 def test_unicode(self):
976 self.assertRaises(TypeError, array.array, 'b', 'foo')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000977
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000978 a = array.array('u', '\xa0\xc2\u1234')
979 a.fromunicode(' ')
980 a.fromunicode('')
981 a.fromunicode('')
982 a.fromunicode('\x11abc\xff\u1234')
983 s = a.tounicode()
984 self.assertEqual(s, '\xa0\xc2\u1234 \x11abc\xff\u1234')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000985
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000986 s = '\x00="\'a\\b\x80\xff\u0000\u0001\u1234'
987 a = array.array('u', s)
988 self.assertEqual(
989 repr(a),
Georg Brandl559e5d72008-06-11 18:37:52 +0000990 "array('u', '\\x00=\"\\'a\\\\b\\x80\xff\\x00\\x01\u1234')")
Walter Dörwald7fd94242003-05-18 00:47:47 +0000991
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000992 self.assertRaises(TypeError, a.fromunicode)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000993
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000994tests.append(UnicodeTest)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000995
996class NumberTest(BaseTest):
997
998 def test_extslice(self):
999 a = array.array(self.typecode, range(5))
1000 self.assertEqual(a[::], a)
1001 self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
1002 self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
1003 self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
1004 self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
1005 self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
1006 self.assertEqual(a[-100:100:], a)
1007 self.assertEqual(a[100:-100:-1], a[::-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +00001008 self.assertEqual(a[-100:100:2], array.array(self.typecode, [0,2,4]))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001009 self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
1010 self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
1011
1012 def test_delslice(self):
1013 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001014 del a[::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001015 self.assertEqual(a, array.array(self.typecode, [1,3]))
1016 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001017 del a[1::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001018 self.assertEqual(a, array.array(self.typecode, [0,2,4]))
1019 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001020 del a[1::-2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001021 self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
1022 a = array.array(self.typecode, range(10))
Michael W. Hudson56796f62002-07-29 14:35:04 +00001023 del a[::1000]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001024 self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
Mark Dickinsonbc099642010-01-29 17:27:24 +00001025 # test issue7788
1026 a = array.array(self.typecode, range(10))
1027 del a[9::1<<333]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001028
1029 def test_assignment(self):
1030 a = array.array(self.typecode, range(10))
1031 a[::2] = array.array(self.typecode, [42]*5)
1032 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
1033 a = array.array(self.typecode, range(10))
1034 a[::-4] = array.array(self.typecode, [10]*3)
1035 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
1036 a = array.array(self.typecode, range(4))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001037 a[::-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +00001038 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
1039 a = array.array(self.typecode, range(10))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001040 b = a[:]
1041 c = a[:]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001042 ins = array.array(self.typecode, range(2))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001043 a[2:3] = ins
1044 b[slice(2,3)] = ins
1045 c[2:3:] = ins
Fred Drake004d5e62000-10-23 17:22:08 +00001046
Walter Dörwald7fd94242003-05-18 00:47:47 +00001047 def test_iterationcontains(self):
1048 a = array.array(self.typecode, range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +00001049 self.assertEqual(list(a), list(range(10)))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001050 b = array.array(self.typecode, [20])
1051 self.assertEqual(a[-1] in a, True)
1052 self.assertEqual(b[0] not in a, True)
1053
1054 def check_overflow(self, lower, upper):
1055 # method to be used by subclasses
1056
1057 # should not overflow assigning lower limit
1058 a = array.array(self.typecode, [lower])
1059 a[0] = lower
1060 # should overflow assigning less than lower limit
1061 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
1062 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
1063 # should not overflow assigning upper limit
1064 a = array.array(self.typecode, [upper])
1065 a[0] = upper
1066 # should overflow assigning more than upper limit
1067 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
1068 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
1069
1070 def test_subclassing(self):
1071 typecode = self.typecode
1072 class ExaggeratingArray(array.array):
1073 __slots__ = ['offset']
1074
1075 def __new__(cls, typecode, data, offset):
1076 return array.array.__new__(cls, typecode, data)
1077
1078 def __init__(self, typecode, data, offset):
1079 self.offset = offset
1080
1081 def __getitem__(self, i):
1082 return array.array.__getitem__(self, i) + self.offset
1083
1084 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
1085 self.assertEntryEqual(a[0], 7)
1086
1087 self.assertRaises(AttributeError, setattr, a, "color", "blue")
1088
1089class SignedNumberTest(NumberTest):
1090 example = [-1, 0, 1, 42, 0x7f]
1091 smallerexample = [-1, 0, 1, 42, 0x7e]
1092 biggerexample = [-1, 0, 1, 43, 0x7f]
1093 outside = 23
1094
1095 def test_overflow(self):
1096 a = array.array(self.typecode)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001097 lower = -1 * int(pow(2, a.itemsize * 8 - 1))
1098 upper = int(pow(2, a.itemsize * 8 - 1)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001099 self.check_overflow(lower, upper)
1100
1101class UnsignedNumberTest(NumberTest):
1102 example = [0, 1, 17, 23, 42, 0xff]
1103 smallerexample = [0, 1, 17, 23, 42, 0xfe]
1104 biggerexample = [0, 1, 17, 23, 43, 0xff]
1105 outside = 0xaa
1106
1107 def test_overflow(self):
1108 a = array.array(self.typecode)
1109 lower = 0
Guido van Rossume2a383d2007-01-15 16:59:06 +00001110 upper = int(pow(2, a.itemsize * 8)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001111 self.check_overflow(lower, upper)
Fred Drake004d5e62000-10-23 17:22:08 +00001112
1113
Walter Dörwald7fd94242003-05-18 00:47:47 +00001114class ByteTest(SignedNumberTest):
1115 typecode = 'b'
1116 minitemsize = 1
1117tests.append(ByteTest)
Fred Drake004d5e62000-10-23 17:22:08 +00001118
Walter Dörwald7fd94242003-05-18 00:47:47 +00001119class UnsignedByteTest(UnsignedNumberTest):
1120 typecode = 'B'
1121 minitemsize = 1
1122tests.append(UnsignedByteTest)
1123
1124class ShortTest(SignedNumberTest):
1125 typecode = 'h'
1126 minitemsize = 2
1127tests.append(ShortTest)
1128
1129class UnsignedShortTest(UnsignedNumberTest):
1130 typecode = 'H'
1131 minitemsize = 2
1132tests.append(UnsignedShortTest)
1133
1134class IntTest(SignedNumberTest):
1135 typecode = 'i'
1136 minitemsize = 2
1137tests.append(IntTest)
1138
1139class UnsignedIntTest(UnsignedNumberTest):
1140 typecode = 'I'
1141 minitemsize = 2
1142tests.append(UnsignedIntTest)
1143
1144class LongTest(SignedNumberTest):
1145 typecode = 'l'
1146 minitemsize = 4
1147tests.append(LongTest)
1148
1149class UnsignedLongTest(UnsignedNumberTest):
1150 typecode = 'L'
1151 minitemsize = 4
1152tests.append(UnsignedLongTest)
1153
1154class FPTest(NumberTest):
1155 example = [-42.0, 0, 42, 1e5, -1e10]
1156 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
1157 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
1158 outside = 23
1159
1160 def assertEntryEqual(self, entry1, entry2):
1161 self.assertAlmostEqual(entry1, entry2)
1162
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001163 def test_byteswap(self):
1164 a = array.array(self.typecode, self.example)
1165 self.assertRaises(TypeError, a.byteswap, 42)
1166 if a.itemsize in (1, 2, 4, 8):
1167 b = array.array(self.typecode, self.example)
1168 b.byteswap()
1169 if a.itemsize==1:
1170 self.assertEqual(a, b)
1171 else:
1172 # On alphas treating the byte swapped bit patters as
1173 # floats/doubles results in floating point exceptions
1174 # => compare the 8bit string values instead
1175 self.assertNotEqual(a.tostring(), b.tostring())
1176 b.byteswap()
1177 self.assertEqual(a, b)
1178
Neal Norwitz35c6cd02003-05-22 13:29:15 +00001179class FloatTest(FPTest):
1180 typecode = 'f'
1181 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001182tests.append(FloatTest)
1183
1184class DoubleTest(FPTest):
1185 typecode = 'd'
1186 minitemsize = 8
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001187
1188 def test_alloc_overflow(self):
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001189 from sys import maxsize
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001190 a = array.array('d', [-1]*65536)
1191 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001192 a *= maxsize//65536 + 1
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001193 except MemoryError:
1194 pass
1195 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001196 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001197 b = array.array('d', [ 2.71828183, 3.14159265, -1])
1198 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001199 b * (maxsize//3 + 1)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001200 except MemoryError:
1201 pass
1202 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001203 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001204
Walter Dörwald7fd94242003-05-18 00:47:47 +00001205tests.append(DoubleTest)
1206
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001207def test_main(verbose=None):
1208 import sys
1209
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001210 support.run_unittest(*tests)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001211
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001212 # verify reference counting
1213 if verbose and hasattr(sys, "gettotalrefcount"):
1214 import gc
1215 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001216 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001217 support.run_unittest(*tests)
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001218 gc.collect()
1219 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001220 print(counts)
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001221
1222if __name__ == "__main__":
1223 test_main(verbose=True)