blob: 33fb244534fd0ca1dde600376cf156dc7ab151ee [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
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +000014import warnings
Alexandre Vassalottiad077152009-07-15 17:49:23 +000015
16import array
17from array import _array_reconstructor as array_reconstructor
18
Raymond Hettingerb0900e62004-12-16 16:23:40 +000019
20class ArraySubclass(array.array):
21 pass
Guido van Rossumc9f8f141997-04-09 20:51:54 +000022
Thomas Woutersb2137042007-02-01 18:02:27 +000023class ArraySubclassWithKwargs(array.array):
24 def __init__(self, typecode, newarg=None):
Victor Stinner7a6a0092011-01-04 00:04:44 +000025 array.array.__init__(self)
Thomas Woutersb2137042007-02-01 18:02:27 +000026
Walter Dörwald7fd94242003-05-18 00:47:47 +000027tests = [] # list to accumulate all tests
Guido van Rossum31f72d72007-06-18 18:44:28 +000028typecodes = "ubBhHiIlLfd"
Martin v. Löwis99866332002-03-01 10:27:01 +000029
Walter Dörwald7fd94242003-05-18 00:47:47 +000030class BadConstructorTest(unittest.TestCase):
Martin v. Löwis99866332002-03-01 10:27:01 +000031
Walter Dörwald7fd94242003-05-18 00:47:47 +000032 def test_constructor(self):
33 self.assertRaises(TypeError, array.array)
34 self.assertRaises(TypeError, array.array, spam=42)
35 self.assertRaises(TypeError, array.array, 'xx')
36 self.assertRaises(ValueError, array.array, 'x')
Martin v. Löwis99866332002-03-01 10:27:01 +000037
Walter Dörwald7fd94242003-05-18 00:47:47 +000038tests.append(BadConstructorTest)
Martin v. Löwis99866332002-03-01 10:27:01 +000039
Alexandre Vassalottiad077152009-07-15 17:49:23 +000040# Machine format codes.
41#
42# Search for "enum machine_format_code" in Modules/arraymodule.c to get the
43# authoritative values.
44UNKNOWN_FORMAT = -1
45UNSIGNED_INT8 = 0
46SIGNED_INT8 = 1
47UNSIGNED_INT16_LE = 2
48UNSIGNED_INT16_BE = 3
49SIGNED_INT16_LE = 4
50SIGNED_INT16_BE = 5
51UNSIGNED_INT32_LE = 6
52UNSIGNED_INT32_BE = 7
53SIGNED_INT32_LE = 8
54SIGNED_INT32_BE = 9
55UNSIGNED_INT64_LE = 10
56UNSIGNED_INT64_BE = 11
57SIGNED_INT64_LE = 12
58SIGNED_INT64_BE = 13
59IEEE_754_FLOAT_LE = 14
60IEEE_754_FLOAT_BE = 15
61IEEE_754_DOUBLE_LE = 16
62IEEE_754_DOUBLE_BE = 17
63UTF16_LE = 18
64UTF16_BE = 19
65UTF32_LE = 20
66UTF32_BE = 21
67
68class ArrayReconstructorTest(unittest.TestCase):
69
70 def test_error(self):
71 self.assertRaises(TypeError, array_reconstructor,
72 "", "b", 0, b"")
73 self.assertRaises(TypeError, array_reconstructor,
74 str, "b", 0, b"")
75 self.assertRaises(TypeError, array_reconstructor,
76 array.array, "b", '', b"")
77 self.assertRaises(TypeError, array_reconstructor,
78 array.array, "b", 0, "")
79 self.assertRaises(ValueError, array_reconstructor,
80 array.array, "?", 0, b"")
81 self.assertRaises(ValueError, array_reconstructor,
82 array.array, "b", UNKNOWN_FORMAT, b"")
83 self.assertRaises(ValueError, array_reconstructor,
84 array.array, "b", 22, b"")
85 self.assertRaises(ValueError, array_reconstructor,
86 array.array, "d", 16, b"a")
87
88 def test_numbers(self):
89 testcases = (
90 (['B', 'H', 'I', 'L'], UNSIGNED_INT8, '=BBBB',
91 [0x80, 0x7f, 0, 0xff]),
92 (['b', 'h', 'i', 'l'], SIGNED_INT8, '=bbb',
93 [-0x80, 0x7f, 0]),
94 (['H', 'I', 'L'], UNSIGNED_INT16_LE, '<HHHH',
95 [0x8000, 0x7fff, 0, 0xffff]),
96 (['H', 'I', 'L'], UNSIGNED_INT16_BE, '>HHHH',
97 [0x8000, 0x7fff, 0, 0xffff]),
98 (['h', 'i', 'l'], SIGNED_INT16_LE, '<hhh',
99 [-0x8000, 0x7fff, 0]),
100 (['h', 'i', 'l'], SIGNED_INT16_BE, '>hhh',
101 [-0x8000, 0x7fff, 0]),
102 (['I', 'L'], UNSIGNED_INT32_LE, '<IIII',
103 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
104 (['I', 'L'], UNSIGNED_INT32_BE, '>IIII',
105 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
106 (['i', 'l'], SIGNED_INT32_LE, '<iii',
107 [-1<<31, (1<<31)-1, 0]),
108 (['i', 'l'], SIGNED_INT32_BE, '>iii',
109 [-1<<31, (1<<31)-1, 0]),
110 (['L'], UNSIGNED_INT64_LE, '<QQQQ',
Alexandre Vassalotti0027d4b2009-07-15 20:53:55 +0000111 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
112 (['L'], UNSIGNED_INT64_BE, '>QQQQ',
113 [1<<31, (1<<31)-1, 0, (1<<32)-1]),
114 (['l'], SIGNED_INT64_LE, '<qqq',
115 [-1<<31, (1<<31)-1, 0]),
116 (['l'], SIGNED_INT64_BE, '>qqq',
117 [-1<<31, (1<<31)-1, 0]),
118 # The following tests for INT64 will raise an OverflowError
119 # when run on a 32-bit machine. The tests are simply skipped
120 # in that case.
121 (['L'], UNSIGNED_INT64_LE, '<QQQQ',
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000122 [1<<63, (1<<63)-1, 0, (1<<64)-1]),
123 (['L'], UNSIGNED_INT64_BE, '>QQQQ',
124 [1<<63, (1<<63)-1, 0, (1<<64)-1]),
125 (['l'], SIGNED_INT64_LE, '<qqq',
126 [-1<<63, (1<<63)-1, 0]),
127 (['l'], SIGNED_INT64_BE, '>qqq',
128 [-1<<63, (1<<63)-1, 0]),
129 (['f'], IEEE_754_FLOAT_LE, '<ffff',
130 [16711938.0, float('inf'), float('-inf'), -0.0]),
131 (['f'], IEEE_754_FLOAT_BE, '>ffff',
132 [16711938.0, float('inf'), float('-inf'), -0.0]),
133 (['d'], IEEE_754_DOUBLE_LE, '<dddd',
134 [9006104071832581.0, float('inf'), float('-inf'), -0.0]),
135 (['d'], IEEE_754_DOUBLE_BE, '>dddd',
136 [9006104071832581.0, float('inf'), float('-inf'), -0.0])
137 )
138 for testcase in testcases:
139 valid_typecodes, mformat_code, struct_fmt, values = testcase
140 arraystr = struct.pack(struct_fmt, *values)
141 for typecode in valid_typecodes:
Alexandre Vassalotti0027d4b2009-07-15 20:53:55 +0000142 try:
143 a = array.array(typecode, values)
144 except OverflowError:
145 continue # Skip this test case.
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000146 b = array_reconstructor(
147 array.array, typecode, mformat_code, arraystr)
148 self.assertEqual(a, b,
149 msg="{0!r} != {1!r}; testcase={2!r}".format(a, b, testcase))
150
151 def test_unicode(self):
152 teststr = "Bonne Journ\xe9e \U0002030a\U00020347"
153 testcases = (
154 (UTF16_LE, "UTF-16-LE"),
155 (UTF16_BE, "UTF-16-BE"),
156 (UTF32_LE, "UTF-32-LE"),
157 (UTF32_BE, "UTF-32-BE")
158 )
159 for testcase in testcases:
160 mformat_code, encoding = testcase
161 a = array.array('u', teststr)
162 b = array_reconstructor(
163 array.array, 'u', mformat_code, teststr.encode(encoding))
164 self.assertEqual(a, b,
165 msg="{0!r} != {1!r}; testcase={2!r}".format(a, b, testcase))
166
167
168tests.append(ArrayReconstructorTest)
169
170
Walter Dörwald7fd94242003-05-18 00:47:47 +0000171class BaseTest(unittest.TestCase):
172 # Required class attributes (provided by subclasses
173 # typecode: the typecode to test
174 # example: an initializer usable in the constructor for this type
175 # smallerexample: the same length as example, but smaller
176 # biggerexample: the same length as example, but bigger
177 # outside: An entry that is not in example
178 # minitemsize: the minimum guaranteed itemsize
Martin v. Löwis99866332002-03-01 10:27:01 +0000179
Walter Dörwald7fd94242003-05-18 00:47:47 +0000180 def assertEntryEqual(self, entry1, entry2):
181 self.assertEqual(entry1, entry2)
Martin v. Löwis99866332002-03-01 10:27:01 +0000182
Walter Dörwald7fd94242003-05-18 00:47:47 +0000183 def badtypecode(self):
184 # Return a typecode that is different from our own
185 return typecodes[(typecodes.index(self.typecode)+1) % len(typecodes)]
Martin v. Löwis99866332002-03-01 10:27:01 +0000186
Walter Dörwald7fd94242003-05-18 00:47:47 +0000187 def test_constructor(self):
188 a = array.array(self.typecode)
189 self.assertEqual(a.typecode, self.typecode)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000190 self.assertTrue(a.itemsize>=self.minitemsize)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000191 self.assertRaises(TypeError, array.array, self.typecode, None)
Martin v. Löwis99866332002-03-01 10:27:01 +0000192
Walter Dörwald7fd94242003-05-18 00:47:47 +0000193 def test_len(self):
194 a = array.array(self.typecode)
195 a.append(self.example[0])
196 self.assertEqual(len(a), 1)
Martin v. Löwis99866332002-03-01 10:27:01 +0000197
Walter Dörwald7fd94242003-05-18 00:47:47 +0000198 a = array.array(self.typecode, self.example)
199 self.assertEqual(len(a), len(self.example))
Martin v. Löwis99866332002-03-01 10:27:01 +0000200
Walter Dörwald7fd94242003-05-18 00:47:47 +0000201 def test_buffer_info(self):
202 a = array.array(self.typecode, self.example)
203 self.assertRaises(TypeError, a.buffer_info, 42)
204 bi = a.buffer_info()
Ezio Melottie9615932010-01-24 19:26:24 +0000205 self.assertIsInstance(bi, tuple)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000206 self.assertEqual(len(bi), 2)
Ezio Melottie9615932010-01-24 19:26:24 +0000207 self.assertIsInstance(bi[0], int)
208 self.assertIsInstance(bi[1], int)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000209 self.assertEqual(bi[1], len(a))
Martin v. Löwis99866332002-03-01 10:27:01 +0000210
Walter Dörwald7fd94242003-05-18 00:47:47 +0000211 def test_byteswap(self):
212 a = array.array(self.typecode, self.example)
213 self.assertRaises(TypeError, a.byteswap, 42)
214 if a.itemsize in (1, 2, 4, 8):
215 b = array.array(self.typecode, self.example)
216 b.byteswap()
217 if a.itemsize==1:
218 self.assertEqual(a, b)
219 else:
220 self.assertNotEqual(a, b)
221 b.byteswap()
222 self.assertEqual(a, b)
Martin v. Löwis99866332002-03-01 10:27:01 +0000223
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000224 def test_copy(self):
225 import copy
226 a = array.array(self.typecode, self.example)
227 b = copy.copy(a)
228 self.assertNotEqual(id(a), id(b))
229 self.assertEqual(a, b)
230
Thomas Wouters89f507f2006-12-13 04:49:30 +0000231 def test_deepcopy(self):
232 import copy
233 a = array.array(self.typecode, self.example)
234 b = copy.deepcopy(a)
235 self.assertNotEqual(id(a), id(b))
236 self.assertEqual(a, b)
237
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000238 def test_reduce_ex(self):
239 a = array.array(self.typecode, self.example)
240 for protocol in range(3):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000241 self.assertIs(a.__reduce_ex__(protocol)[0], array.array)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000242 for protocol in range(3, pickle.HIGHEST_PROTOCOL):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000243 self.assertIs(a.__reduce_ex__(protocol)[0], array_reconstructor)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000244
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000245 def test_pickle(self):
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000246 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000247 a = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000248 b = pickle.loads(pickle.dumps(a, protocol))
Raymond Hettingerb0900e62004-12-16 16:23:40 +0000249 self.assertNotEqual(id(a), id(b))
250 self.assertEqual(a, b)
251
252 a = ArraySubclass(self.typecode, self.example)
253 a.x = 10
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000254 b = pickle.loads(pickle.dumps(a, protocol))
Raymond Hettingerb0900e62004-12-16 16:23:40 +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
Guido van Rossumd8faa362007-04-27 19:54:29 +0000260 def test_pickle_for_empty_array(self):
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000261 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossumd8faa362007-04-27 19:54:29 +0000262 a = array.array(self.typecode)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000263 b = pickle.loads(pickle.dumps(a, protocol))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000264 self.assertNotEqual(id(a), id(b))
265 self.assertEqual(a, b)
266
267 a = ArraySubclass(self.typecode)
268 a.x = 10
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000269 b = pickle.loads(pickle.dumps(a, protocol))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000270 self.assertNotEqual(id(a), id(b))
271 self.assertEqual(a, b)
272 self.assertEqual(a.x, b.x)
273 self.assertEqual(type(a), type(b))
274
Walter Dörwald7fd94242003-05-18 00:47:47 +0000275 def test_insert(self):
276 a = array.array(self.typecode, self.example)
277 a.insert(0, self.example[0])
278 self.assertEqual(len(a), 1+len(self.example))
279 self.assertEqual(a[0], a[1])
280 self.assertRaises(TypeError, a.insert)
281 self.assertRaises(TypeError, a.insert, None)
Walter Dörwaldba39d9c2003-05-18 01:56:25 +0000282 self.assertRaises(TypeError, a.insert, 0, None)
Martin v. Löwis99866332002-03-01 10:27:01 +0000283
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000284 a = array.array(self.typecode, self.example)
285 a.insert(-1, self.example[0])
286 self.assertEqual(
287 a,
288 array.array(
289 self.typecode,
290 self.example[:-1] + self.example[:1] + self.example[-1:]
291 )
292 )
293
294 a = array.array(self.typecode, self.example)
295 a.insert(-1000, self.example[0])
296 self.assertEqual(
297 a,
298 array.array(self.typecode, self.example[:1] + self.example)
299 )
300
301 a = array.array(self.typecode, self.example)
302 a.insert(1000, self.example[0])
303 self.assertEqual(
304 a,
305 array.array(self.typecode, self.example + self.example[:1])
306 )
307
Walter Dörwald7fd94242003-05-18 00:47:47 +0000308 def test_tofromfile(self):
309 a = array.array(self.typecode, 2*self.example)
310 self.assertRaises(TypeError, a.tofile)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000311 support.unlink(support.TESTFN)
312 f = open(support.TESTFN, 'wb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000313 try:
314 a.tofile(f)
315 f.close()
316 b = array.array(self.typecode)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000317 f = open(support.TESTFN, 'rb')
Walter Dörwald7fd94242003-05-18 00:47:47 +0000318 self.assertRaises(TypeError, b.fromfile)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000319 b.fromfile(f, len(self.example))
320 self.assertEqual(b, array.array(self.typecode, self.example))
321 self.assertNotEqual(a, b)
Hirokazu Yamamoto54d0df62009-03-06 03:04:07 +0000322 self.assertRaises(EOFError, b.fromfile, f, len(self.example)+1)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000323 self.assertEqual(a, b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000324 f.close()
325 finally:
326 if not f.closed:
327 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000328 support.unlink(support.TESTFN)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000329
Antoine Pitrou8cb6dbf2010-07-21 16:41:31 +0000330 def test_fromfile_ioerror(self):
331 # Issue #5395: Check if fromfile raises a proper IOError
332 # instead of EOFError.
333 a = array.array(self.typecode)
334 f = open(support.TESTFN, 'wb')
335 try:
336 self.assertRaises(IOError, a.fromfile, f, len(self.example))
337 finally:
338 f.close()
339 support.unlink(support.TESTFN)
340
Frank Wierzbicki17683432009-08-16 20:30:12 +0000341 def test_filewrite(self):
342 a = array.array(self.typecode, 2*self.example)
343 f = open(support.TESTFN, 'wb')
344 try:
345 f.write(a)
346 f.close()
347 b = array.array(self.typecode)
348 f = open(support.TESTFN, 'rb')
349 b.fromfile(f, len(self.example))
350 self.assertEqual(b, array.array(self.typecode, self.example))
351 self.assertNotEqual(a, b)
352 b.fromfile(f, len(self.example))
353 self.assertEqual(a, b)
354 f.close()
355 finally:
356 if not f.closed:
357 f.close()
358 support.unlink(support.TESTFN)
359
Walter Dörwald7fd94242003-05-18 00:47:47 +0000360 def test_tofromlist(self):
361 a = array.array(self.typecode, 2*self.example)
362 b = array.array(self.typecode)
363 self.assertRaises(TypeError, a.tolist, 42)
364 self.assertRaises(TypeError, b.fromlist)
365 self.assertRaises(TypeError, b.fromlist, 42)
366 self.assertRaises(TypeError, b.fromlist, [None])
367 b.fromlist(a.tolist())
368 self.assertEqual(a, b)
Fred Drake78334472000-06-28 17:50:51 +0000369
Walter Dörwald7fd94242003-05-18 00:47:47 +0000370 def test_tofromstring(self):
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000371 nb_warnings = 4
372 with warnings.catch_warnings(record=True) as r:
373 warnings.filterwarnings("always",
374 message=r"(to|from)string\(\) is deprecated",
375 category=DeprecationWarning)
376 a = array.array(self.typecode, 2*self.example)
377 b = array.array(self.typecode)
378 self.assertRaises(TypeError, a.tostring, 42)
379 self.assertRaises(TypeError, b.fromstring)
380 self.assertRaises(TypeError, b.fromstring, 42)
381 b.fromstring(a.tostring())
382 self.assertEqual(a, b)
383 if a.itemsize>1:
384 self.assertRaises(ValueError, b.fromstring, "x")
385 nb_warnings += 1
386 self.assertEqual(len(r), nb_warnings)
387
388 def test_tofrombytes(self):
Walter Dörwald7fd94242003-05-18 00:47:47 +0000389 a = array.array(self.typecode, 2*self.example)
390 b = array.array(self.typecode)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000391 self.assertRaises(TypeError, a.tobytes, 42)
392 self.assertRaises(TypeError, b.frombytes)
393 self.assertRaises(TypeError, b.frombytes, 42)
394 b.frombytes(a.tobytes())
395 c = array.array(self.typecode, bytearray(a.tobytes()))
Walter Dörwald7fd94242003-05-18 00:47:47 +0000396 self.assertEqual(a, b)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000397 self.assertEqual(a, c)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000398 if a.itemsize>1:
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000399 self.assertRaises(ValueError, b.frombytes, b"x")
Fred Drake78334472000-06-28 17:50:51 +0000400
Walter Dörwald7fd94242003-05-18 00:47:47 +0000401 def test_repr(self):
402 a = array.array(self.typecode, 2*self.example)
403 self.assertEqual(a, eval(repr(a), {"array": array.array}))
Fred Drake78334472000-06-28 17:50:51 +0000404
Walter Dörwald7fd94242003-05-18 00:47:47 +0000405 a = array.array(self.typecode)
406 self.assertEqual(repr(a), "array('%s')" % self.typecode)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000407
Walter Dörwald7fd94242003-05-18 00:47:47 +0000408 def test_str(self):
409 a = array.array(self.typecode, 2*self.example)
410 str(a)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000411
Walter Dörwald7fd94242003-05-18 00:47:47 +0000412 def test_cmp(self):
413 a = array.array(self.typecode, self.example)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000414 self.assertTrue((a == 42) is False)
415 self.assertTrue((a != 42) is True)
Tim Peterscc78e472000-11-14 21:36:07 +0000416
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000417 self.assertTrue((a == a) is True)
418 self.assertTrue((a != a) is False)
419 self.assertTrue((a < a) is False)
420 self.assertTrue((a <= a) is True)
421 self.assertTrue((a > a) is False)
422 self.assertTrue((a >= a) is True)
Tim Peterscc78e472000-11-14 21:36:07 +0000423
Neal Norwitzbd2835c2006-03-17 08:54:15 +0000424 al = array.array(self.typecode, self.smallerexample)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000425 ab = array.array(self.typecode, self.biggerexample)
Guido van Rossum7f1d3aa1998-07-16 15:31:43 +0000426
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000427 self.assertTrue((a == 2*a) is False)
428 self.assertTrue((a != 2*a) is True)
429 self.assertTrue((a < 2*a) is True)
430 self.assertTrue((a <= 2*a) is True)
431 self.assertTrue((a > 2*a) is False)
432 self.assertTrue((a >= 2*a) is False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000433
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000434 self.assertTrue((a == al) is False)
435 self.assertTrue((a != al) is True)
436 self.assertTrue((a < al) is False)
437 self.assertTrue((a <= al) is False)
438 self.assertTrue((a > al) is True)
439 self.assertTrue((a >= al) is True)
Martin v. Löwis99866332002-03-01 10:27:01 +0000440
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000441 self.assertTrue((a == ab) is False)
442 self.assertTrue((a != ab) is True)
443 self.assertTrue((a < ab) is True)
444 self.assertTrue((a <= ab) is True)
445 self.assertTrue((a > ab) is False)
446 self.assertTrue((a >= ab) is False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000447
Walter Dörwald7fd94242003-05-18 00:47:47 +0000448 def test_add(self):
449 a = array.array(self.typecode, self.example) \
450 + array.array(self.typecode, self.example[::-1])
451 self.assertEqual(
452 a,
453 array.array(self.typecode, self.example + self.example[::-1])
454 )
Martin v. Löwis99866332002-03-01 10:27:01 +0000455
Walter Dörwald7fd94242003-05-18 00:47:47 +0000456 b = array.array(self.badtypecode())
457 self.assertRaises(TypeError, a.__add__, b)
458
459 self.assertRaises(TypeError, a.__add__, "bad")
460
461 def test_iadd(self):
462 a = array.array(self.typecode, self.example[::-1])
463 b = a
464 a += array.array(self.typecode, 2*self.example)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000465 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000466 self.assertEqual(
467 a,
468 array.array(self.typecode, self.example[::-1]+2*self.example)
469 )
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000470 a = array.array(self.typecode, self.example)
471 a += a
472 self.assertEqual(
473 a,
474 array.array(self.typecode, self.example + self.example)
475 )
Walter Dörwald7fd94242003-05-18 00:47:47 +0000476
477 b = array.array(self.badtypecode())
478 self.assertRaises(TypeError, a.__add__, b)
479
480 self.assertRaises(TypeError, a.__iadd__, "bad")
481
482 def test_mul(self):
483 a = 5*array.array(self.typecode, self.example)
484 self.assertEqual(
485 a,
486 array.array(self.typecode, 5*self.example)
487 )
488
489 a = array.array(self.typecode, self.example)*5
490 self.assertEqual(
491 a,
492 array.array(self.typecode, self.example*5)
493 )
494
495 a = 0*array.array(self.typecode, self.example)
496 self.assertEqual(
497 a,
498 array.array(self.typecode)
499 )
500
501 a = (-1)*array.array(self.typecode, self.example)
502 self.assertEqual(
503 a,
504 array.array(self.typecode)
505 )
506
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000507 a = 5 * array.array(self.typecode, self.example[:1])
508 self.assertEqual(
509 a,
510 array.array(self.typecode, [a[0]] * 5)
511 )
512
Walter Dörwald7fd94242003-05-18 00:47:47 +0000513 self.assertRaises(TypeError, a.__mul__, "bad")
514
515 def test_imul(self):
516 a = array.array(self.typecode, self.example)
517 b = a
518
519 a *= 5
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000520 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000521 self.assertEqual(
522 a,
523 array.array(self.typecode, 5*self.example)
524 )
525
526 a *= 0
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000527 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000528 self.assertEqual(a, array.array(self.typecode))
529
530 a *= 1000
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000531 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000532 self.assertEqual(a, array.array(self.typecode))
533
534 a *= -1
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000535 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000536 self.assertEqual(a, array.array(self.typecode))
537
538 a = array.array(self.typecode, self.example)
539 a *= -1
540 self.assertEqual(a, array.array(self.typecode))
541
542 self.assertRaises(TypeError, a.__imul__, "bad")
543
544 def test_getitem(self):
545 a = array.array(self.typecode, self.example)
546 self.assertEntryEqual(a[0], self.example[0])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000547 self.assertEntryEqual(a[0], self.example[0])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000548 self.assertEntryEqual(a[-1], self.example[-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000549 self.assertEntryEqual(a[-1], self.example[-1])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000550 self.assertEntryEqual(a[len(self.example)-1], self.example[-1])
551 self.assertEntryEqual(a[-len(self.example)], self.example[0])
552 self.assertRaises(TypeError, a.__getitem__)
553 self.assertRaises(IndexError, a.__getitem__, len(self.example))
554 self.assertRaises(IndexError, a.__getitem__, -len(self.example)-1)
555
556 def test_setitem(self):
557 a = array.array(self.typecode, self.example)
558 a[0] = a[-1]
559 self.assertEntryEqual(a[0], a[-1])
560
561 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000562 a[0] = a[-1]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000563 self.assertEntryEqual(a[0], a[-1])
564
565 a = array.array(self.typecode, self.example)
566 a[-1] = a[0]
567 self.assertEntryEqual(a[0], a[-1])
568
569 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000570 a[-1] = a[0]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000571 self.assertEntryEqual(a[0], a[-1])
572
573 a = array.array(self.typecode, self.example)
574 a[len(self.example)-1] = a[0]
575 self.assertEntryEqual(a[0], a[-1])
576
577 a = array.array(self.typecode, self.example)
578 a[-len(self.example)] = a[-1]
579 self.assertEntryEqual(a[0], a[-1])
580
581 self.assertRaises(TypeError, a.__setitem__)
582 self.assertRaises(TypeError, a.__setitem__, None)
583 self.assertRaises(TypeError, a.__setitem__, 0, None)
584 self.assertRaises(
585 IndexError,
586 a.__setitem__,
587 len(self.example), self.example[0]
588 )
589 self.assertRaises(
590 IndexError,
591 a.__setitem__,
592 -len(self.example)-1, self.example[0]
593 )
594
595 def test_delitem(self):
596 a = array.array(self.typecode, self.example)
597 del a[0]
598 self.assertEqual(
599 a,
600 array.array(self.typecode, self.example[1:])
601 )
602
603 a = array.array(self.typecode, self.example)
604 del a[-1]
605 self.assertEqual(
606 a,
607 array.array(self.typecode, self.example[:-1])
608 )
609
610 a = array.array(self.typecode, self.example)
611 del a[len(self.example)-1]
612 self.assertEqual(
613 a,
614 array.array(self.typecode, self.example[:-1])
615 )
616
617 a = array.array(self.typecode, self.example)
618 del a[-len(self.example)]
619 self.assertEqual(
620 a,
621 array.array(self.typecode, self.example[1:])
622 )
623
624 self.assertRaises(TypeError, a.__delitem__)
625 self.assertRaises(TypeError, a.__delitem__, None)
626 self.assertRaises(IndexError, a.__delitem__, len(self.example))
627 self.assertRaises(IndexError, a.__delitem__, -len(self.example)-1)
628
629 def test_getslice(self):
630 a = array.array(self.typecode, self.example)
631 self.assertEqual(a[:], a)
632
633 self.assertEqual(
634 a[1:],
635 array.array(self.typecode, self.example[1:])
636 )
637
638 self.assertEqual(
639 a[:1],
640 array.array(self.typecode, self.example[:1])
641 )
642
643 self.assertEqual(
644 a[:-1],
645 array.array(self.typecode, self.example[:-1])
646 )
647
648 self.assertEqual(
649 a[-1:],
650 array.array(self.typecode, self.example[-1:])
651 )
652
653 self.assertEqual(
654 a[-1:-1],
655 array.array(self.typecode)
656 )
657
658 self.assertEqual(
Walter Dörwald1083c242005-01-21 21:16:51 +0000659 a[2:1],
660 array.array(self.typecode)
661 )
662
663 self.assertEqual(
Walter Dörwald7fd94242003-05-18 00:47:47 +0000664 a[1000:],
665 array.array(self.typecode)
666 )
667 self.assertEqual(a[-1000:], a)
668 self.assertEqual(a[:1000], a)
669 self.assertEqual(
670 a[:-1000],
671 array.array(self.typecode)
672 )
673 self.assertEqual(a[-1000:1000], a)
674 self.assertEqual(
675 a[2000:1000],
676 array.array(self.typecode)
677 )
678
Thomas Woutersed03b412007-08-28 21:37:11 +0000679 def test_extended_getslice(self):
680 # Test extended slicing by comparing with list slicing
681 # (Assumes list conversion works correctly, too)
682 a = array.array(self.typecode, self.example)
683 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
684 for start in indices:
685 for stop in indices:
686 # Everything except the initial 0 (invalid step)
687 for step in indices[1:]:
688 self.assertEqual(list(a[start:stop:step]),
689 list(a)[start:stop:step])
690
Walter Dörwald7fd94242003-05-18 00:47:47 +0000691 def test_setslice(self):
692 a = array.array(self.typecode, self.example)
693 a[:1] = a
694 self.assertEqual(
695 a,
696 array.array(self.typecode, self.example + self.example[1:])
697 )
698
699 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000700 a[:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000701 self.assertEqual(
702 a,
703 array.array(self.typecode, self.example + self.example[-1:])
704 )
705
706 a = array.array(self.typecode, self.example)
707 a[-1:] = a
708 self.assertEqual(
709 a,
710 array.array(self.typecode, self.example[:-1] + self.example)
711 )
712
713 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000714 a[1:] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000715 self.assertEqual(
716 a,
717 array.array(self.typecode, self.example[:1] + self.example)
718 )
719
720 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000721 a[1:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000722 self.assertEqual(
723 a,
724 array.array(
725 self.typecode,
726 self.example[:1] + self.example + self.example[-1:]
727 )
728 )
729
730 a = array.array(self.typecode, self.example)
731 a[1000:] = a
732 self.assertEqual(
733 a,
734 array.array(self.typecode, 2*self.example)
735 )
736
737 a = array.array(self.typecode, self.example)
738 a[-1000:] = a
739 self.assertEqual(
740 a,
741 array.array(self.typecode, self.example)
742 )
743
744 a = array.array(self.typecode, self.example)
745 a[:1000] = a
746 self.assertEqual(
747 a,
748 array.array(self.typecode, self.example)
749 )
750
751 a = array.array(self.typecode, self.example)
752 a[:-1000] = a
753 self.assertEqual(
754 a,
755 array.array(self.typecode, 2*self.example)
756 )
757
758 a = array.array(self.typecode, self.example)
759 a[1:0] = a
760 self.assertEqual(
761 a,
762 array.array(self.typecode, self.example[:1] + self.example + self.example[1:])
763 )
764
765 a = array.array(self.typecode, self.example)
766 a[2000:1000] = a
767 self.assertEqual(
768 a,
769 array.array(self.typecode, 2*self.example)
770 )
771
772 a = array.array(self.typecode, self.example)
Thomas Woutersed03b412007-08-28 21:37:11 +0000773 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), None)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000774 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), None)
775
776 b = array.array(self.badtypecode())
Thomas Woutersed03b412007-08-28 21:37:11 +0000777 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000778 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), b)
779
Thomas Woutersed03b412007-08-28 21:37:11 +0000780 def test_extended_set_del_slice(self):
781 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
782 for start in indices:
783 for stop in indices:
784 # Everything except the initial 0 (invalid step)
785 for step in indices[1:]:
786 a = array.array(self.typecode, self.example)
787 L = list(a)
788 # Make sure we have a slice of exactly the right length,
789 # but with (hopefully) different data.
790 data = L[start:stop:step]
791 data.reverse()
792 L[start:stop:step] = data
793 a[start:stop:step] = array.array(self.typecode, data)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000794 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000795
796 del L[start:stop:step]
797 del a[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +0000798 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000799
Walter Dörwald7fd94242003-05-18 00:47:47 +0000800 def test_index(self):
801 example = 2*self.example
802 a = array.array(self.typecode, example)
803 self.assertRaises(TypeError, a.index)
804 for x in example:
805 self.assertEqual(a.index(x), example.index(x))
806 self.assertRaises(ValueError, a.index, None)
807 self.assertRaises(ValueError, a.index, self.outside)
808
809 def test_count(self):
810 example = 2*self.example
811 a = array.array(self.typecode, example)
812 self.assertRaises(TypeError, a.count)
813 for x in example:
814 self.assertEqual(a.count(x), example.count(x))
815 self.assertEqual(a.count(self.outside), 0)
816 self.assertEqual(a.count(None), 0)
817
818 def test_remove(self):
819 for x in self.example:
820 example = 2*self.example
821 a = array.array(self.typecode, example)
822 pos = example.index(x)
823 example2 = example[:pos] + example[pos+1:]
824 a.remove(x)
825 self.assertEqual(a, array.array(self.typecode, example2))
826
827 a = array.array(self.typecode, self.example)
828 self.assertRaises(ValueError, a.remove, self.outside)
829
830 self.assertRaises(ValueError, a.remove, None)
831
832 def test_pop(self):
833 a = array.array(self.typecode)
834 self.assertRaises(IndexError, a.pop)
835
836 a = array.array(self.typecode, 2*self.example)
837 self.assertRaises(TypeError, a.pop, 42, 42)
838 self.assertRaises(TypeError, a.pop, None)
839 self.assertRaises(IndexError, a.pop, len(a))
840 self.assertRaises(IndexError, a.pop, -len(a)-1)
841
842 self.assertEntryEqual(a.pop(0), self.example[0])
843 self.assertEqual(
844 a,
845 array.array(self.typecode, self.example[1:]+self.example)
846 )
847 self.assertEntryEqual(a.pop(1), self.example[2])
848 self.assertEqual(
849 a,
850 array.array(self.typecode, self.example[1:2]+self.example[3:]+self.example)
851 )
852 self.assertEntryEqual(a.pop(0), self.example[1])
853 self.assertEntryEqual(a.pop(), self.example[-1])
854 self.assertEqual(
855 a,
856 array.array(self.typecode, self.example[3:]+self.example[:-1])
857 )
858
859 def test_reverse(self):
860 a = array.array(self.typecode, self.example)
861 self.assertRaises(TypeError, a.reverse, 42)
Fred Drake004d5e62000-10-23 17:22:08 +0000862 a.reverse()
Walter Dörwald7fd94242003-05-18 00:47:47 +0000863 self.assertEqual(
864 a,
865 array.array(self.typecode, self.example[::-1])
866 )
867
868 def test_extend(self):
869 a = array.array(self.typecode, self.example)
870 self.assertRaises(TypeError, a.extend)
871 a.extend(array.array(self.typecode, self.example[::-1]))
872 self.assertEqual(
873 a,
874 array.array(self.typecode, self.example+self.example[::-1])
875 )
876
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000877 a = array.array(self.typecode, self.example)
878 a.extend(a)
879 self.assertEqual(
880 a,
881 array.array(self.typecode, self.example+self.example)
882 )
883
Walter Dörwald7fd94242003-05-18 00:47:47 +0000884 b = array.array(self.badtypecode())
885 self.assertRaises(TypeError, a.extend, b)
886
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000887 a = array.array(self.typecode, self.example)
888 a.extend(self.example[::-1])
889 self.assertEqual(
890 a,
891 array.array(self.typecode, self.example+self.example[::-1])
892 )
893
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +0000894 def test_constructor_with_iterable_argument(self):
895 a = array.array(self.typecode, iter(self.example))
896 b = array.array(self.typecode, self.example)
897 self.assertEqual(a, b)
898
899 # non-iterable argument
900 self.assertRaises(TypeError, array.array, self.typecode, 10)
901
902 # pass through errors raised in __iter__
903 class A:
904 def __iter__(self):
905 raise UnicodeError
906 self.assertRaises(UnicodeError, array.array, self.typecode, A())
907
908 # pass through errors raised in next()
909 def B():
910 raise UnicodeError
911 yield None
912 self.assertRaises(UnicodeError, array.array, self.typecode, B())
913
Walter Dörwald7fd94242003-05-18 00:47:47 +0000914 def test_coveritertraverse(self):
915 try:
916 import gc
917 except ImportError:
918 return
919 a = array.array(self.typecode)
920 l = [iter(a)]
921 l.append(l)
922 gc.collect()
923
924 def test_buffer(self):
925 a = array.array(self.typecode, self.example)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000926 m = memoryview(a)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000927 expected = m.tobytes()
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000928 self.assertEqual(a.tobytes(), expected)
929 self.assertEqual(a.tobytes()[0], expected[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000930 # Resizing is forbidden when there are buffer exports.
931 # For issue 4509, we also check after each error that
932 # the array was not modified.
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000933 self.assertRaises(BufferError, a.append, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000934 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000935 self.assertRaises(BufferError, a.extend, a[0:1])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000936 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000937 self.assertRaises(BufferError, a.remove, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000938 self.assertEqual(m.tobytes(), expected)
939 self.assertRaises(BufferError, a.pop, 0)
940 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000941 self.assertRaises(BufferError, a.fromlist, a.tolist())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000942 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000943 self.assertRaises(BufferError, a.frombytes, a.tobytes())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000944 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000945 if self.typecode == 'u':
946 self.assertRaises(BufferError, a.fromunicode, a.tounicode())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000947 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +0000948 self.assertRaises(BufferError, operator.imul, a, 2)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000949 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +0000950 self.assertRaises(BufferError, operator.imul, a, 0)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000951 self.assertEqual(m.tobytes(), expected)
952 self.assertRaises(BufferError, operator.setitem, a, slice(0, 0), a)
953 self.assertEqual(m.tobytes(), expected)
954 self.assertRaises(BufferError, operator.delitem, a, 0)
955 self.assertEqual(m.tobytes(), expected)
956 self.assertRaises(BufferError, operator.delitem, a, slice(0, 1))
957 self.assertEqual(m.tobytes(), expected)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000958
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000959 def test_weakref(self):
960 s = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000961 p = weakref.proxy(s)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000962 self.assertEqual(p.tobytes(), s.tobytes())
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000963 s = None
964 self.assertRaises(ReferenceError, len, p)
965
Skip Montanarod5cf0b82003-08-03 23:02:10 +0000966 def test_bug_782369(self):
967 import sys
Skip Montanaroed9bf122003-08-03 23:30:40 +0000968 if hasattr(sys, "getrefcount"):
969 for i in range(10):
970 b = array.array('B', range(64))
971 rc = sys.getrefcount(10)
972 for i in range(10):
973 b = array.array('B', range(64))
974 self.assertEqual(rc, sys.getrefcount(10))
Skip Montanarod5cf0b82003-08-03 23:02:10 +0000975
Thomas Woutersb2137042007-02-01 18:02:27 +0000976 def test_subclass_with_kwargs(self):
977 # SF bug #1486663 -- this used to erroneously raise a TypeError
978 ArraySubclassWithKwargs('b', newarg=1)
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000979
Guido van Rossum6b826ab2007-07-03 16:22:09 +0000980 def test_create_from_bytes(self):
Alexandre Vassalotti7e4f3212009-07-05 05:38:18 +0000981 # XXX This test probably needs to be moved in a subclass or
982 # generalized to use self.typecode.
Guido van Rossum6b826ab2007-07-03 16:22:09 +0000983 a = array.array('H', b"1234")
984 self.assertEqual(len(a) * a.itemsize, 4)
985
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000986
Walter Dörwald7fd94242003-05-18 00:47:47 +0000987class StringTest(BaseTest):
988
989 def test_setitem(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000990 super().test_setitem()
Walter Dörwald7fd94242003-05-18 00:47:47 +0000991 a = array.array(self.typecode, self.example)
992 self.assertRaises(TypeError, a.__setitem__, 0, self.example[:2])
993
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000994class UnicodeTest(StringTest):
995 typecode = 'u'
996 example = '\x01\u263a\x00\ufeff'
997 smallerexample = '\x01\u263a\x00\ufefe'
998 biggerexample = '\x01\u263a\x01\ufeff'
999 outside = str('\x33')
1000 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001001
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001002 def test_unicode(self):
1003 self.assertRaises(TypeError, array.array, 'b', 'foo')
Walter Dörwald7fd94242003-05-18 00:47:47 +00001004
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001005 a = array.array('u', '\xa0\xc2\u1234')
1006 a.fromunicode(' ')
1007 a.fromunicode('')
1008 a.fromunicode('')
1009 a.fromunicode('\x11abc\xff\u1234')
1010 s = a.tounicode()
1011 self.assertEqual(s, '\xa0\xc2\u1234 \x11abc\xff\u1234')
Walter Dörwald7fd94242003-05-18 00:47:47 +00001012
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001013 s = '\x00="\'a\\b\x80\xff\u0000\u0001\u1234'
1014 a = array.array('u', s)
1015 self.assertEqual(
1016 repr(a),
Georg Brandl559e5d72008-06-11 18:37:52 +00001017 "array('u', '\\x00=\"\\'a\\\\b\\x80\xff\\x00\\x01\u1234')")
Walter Dörwald7fd94242003-05-18 00:47:47 +00001018
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001019 self.assertRaises(TypeError, a.fromunicode)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001020
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001021tests.append(UnicodeTest)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001022
1023class NumberTest(BaseTest):
1024
1025 def test_extslice(self):
1026 a = array.array(self.typecode, range(5))
1027 self.assertEqual(a[::], a)
1028 self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
1029 self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
1030 self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
1031 self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
1032 self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
1033 self.assertEqual(a[-100:100:], a)
1034 self.assertEqual(a[100:-100:-1], a[::-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +00001035 self.assertEqual(a[-100:100:2], array.array(self.typecode, [0,2,4]))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001036 self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
1037 self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
1038
1039 def test_delslice(self):
1040 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001041 del a[::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001042 self.assertEqual(a, array.array(self.typecode, [1,3]))
1043 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001044 del a[1::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001045 self.assertEqual(a, array.array(self.typecode, [0,2,4]))
1046 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001047 del a[1::-2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001048 self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
1049 a = array.array(self.typecode, range(10))
Michael W. Hudson56796f62002-07-29 14:35:04 +00001050 del a[::1000]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001051 self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
Mark Dickinsonbc099642010-01-29 17:27:24 +00001052 # test issue7788
1053 a = array.array(self.typecode, range(10))
1054 del a[9::1<<333]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001055
1056 def test_assignment(self):
1057 a = array.array(self.typecode, range(10))
1058 a[::2] = array.array(self.typecode, [42]*5)
1059 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
1060 a = array.array(self.typecode, range(10))
1061 a[::-4] = array.array(self.typecode, [10]*3)
1062 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
1063 a = array.array(self.typecode, range(4))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001064 a[::-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +00001065 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
1066 a = array.array(self.typecode, range(10))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001067 b = a[:]
1068 c = a[:]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001069 ins = array.array(self.typecode, range(2))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001070 a[2:3] = ins
1071 b[slice(2,3)] = ins
1072 c[2:3:] = ins
Fred Drake004d5e62000-10-23 17:22:08 +00001073
Walter Dörwald7fd94242003-05-18 00:47:47 +00001074 def test_iterationcontains(self):
1075 a = array.array(self.typecode, range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +00001076 self.assertEqual(list(a), list(range(10)))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001077 b = array.array(self.typecode, [20])
1078 self.assertEqual(a[-1] in a, True)
1079 self.assertEqual(b[0] not in a, True)
1080
1081 def check_overflow(self, lower, upper):
1082 # method to be used by subclasses
1083
1084 # should not overflow assigning lower limit
1085 a = array.array(self.typecode, [lower])
1086 a[0] = lower
1087 # should overflow assigning less than lower limit
1088 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
1089 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
1090 # should not overflow assigning upper limit
1091 a = array.array(self.typecode, [upper])
1092 a[0] = upper
1093 # should overflow assigning more than upper limit
1094 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
1095 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
1096
1097 def test_subclassing(self):
1098 typecode = self.typecode
1099 class ExaggeratingArray(array.array):
1100 __slots__ = ['offset']
1101
1102 def __new__(cls, typecode, data, offset):
1103 return array.array.__new__(cls, typecode, data)
1104
1105 def __init__(self, typecode, data, offset):
1106 self.offset = offset
1107
1108 def __getitem__(self, i):
1109 return array.array.__getitem__(self, i) + self.offset
1110
1111 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
1112 self.assertEntryEqual(a[0], 7)
1113
1114 self.assertRaises(AttributeError, setattr, a, "color", "blue")
1115
1116class SignedNumberTest(NumberTest):
1117 example = [-1, 0, 1, 42, 0x7f]
1118 smallerexample = [-1, 0, 1, 42, 0x7e]
1119 biggerexample = [-1, 0, 1, 43, 0x7f]
1120 outside = 23
1121
1122 def test_overflow(self):
1123 a = array.array(self.typecode)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001124 lower = -1 * int(pow(2, a.itemsize * 8 - 1))
1125 upper = int(pow(2, a.itemsize * 8 - 1)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001126 self.check_overflow(lower, upper)
1127
1128class UnsignedNumberTest(NumberTest):
1129 example = [0, 1, 17, 23, 42, 0xff]
1130 smallerexample = [0, 1, 17, 23, 42, 0xfe]
1131 biggerexample = [0, 1, 17, 23, 43, 0xff]
1132 outside = 0xaa
1133
1134 def test_overflow(self):
1135 a = array.array(self.typecode)
1136 lower = 0
Guido van Rossume2a383d2007-01-15 16:59:06 +00001137 upper = int(pow(2, a.itemsize * 8)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001138 self.check_overflow(lower, upper)
Fred Drake004d5e62000-10-23 17:22:08 +00001139
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001140 def test_bytes_extend(self):
1141 s = bytes(self.example)
1142
1143 a = array.array(self.typecode, self.example)
1144 a.extend(s)
1145 self.assertEqual(
1146 a,
1147 array.array(self.typecode, self.example+self.example)
1148 )
1149
1150 a = array.array(self.typecode, self.example)
1151 a.extend(bytearray(reversed(s)))
1152 self.assertEqual(
1153 a,
1154 array.array(self.typecode, self.example+self.example[::-1])
1155 )
1156
Fred Drake004d5e62000-10-23 17:22:08 +00001157
Walter Dörwald7fd94242003-05-18 00:47:47 +00001158class ByteTest(SignedNumberTest):
1159 typecode = 'b'
1160 minitemsize = 1
1161tests.append(ByteTest)
Fred Drake004d5e62000-10-23 17:22:08 +00001162
Walter Dörwald7fd94242003-05-18 00:47:47 +00001163class UnsignedByteTest(UnsignedNumberTest):
1164 typecode = 'B'
1165 minitemsize = 1
1166tests.append(UnsignedByteTest)
1167
1168class ShortTest(SignedNumberTest):
1169 typecode = 'h'
1170 minitemsize = 2
1171tests.append(ShortTest)
1172
1173class UnsignedShortTest(UnsignedNumberTest):
1174 typecode = 'H'
1175 minitemsize = 2
1176tests.append(UnsignedShortTest)
1177
1178class IntTest(SignedNumberTest):
1179 typecode = 'i'
1180 minitemsize = 2
1181tests.append(IntTest)
1182
1183class UnsignedIntTest(UnsignedNumberTest):
1184 typecode = 'I'
1185 minitemsize = 2
1186tests.append(UnsignedIntTest)
1187
1188class LongTest(SignedNumberTest):
1189 typecode = 'l'
1190 minitemsize = 4
1191tests.append(LongTest)
1192
1193class UnsignedLongTest(UnsignedNumberTest):
1194 typecode = 'L'
1195 minitemsize = 4
1196tests.append(UnsignedLongTest)
1197
1198class FPTest(NumberTest):
1199 example = [-42.0, 0, 42, 1e5, -1e10]
1200 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
1201 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
1202 outside = 23
1203
1204 def assertEntryEqual(self, entry1, entry2):
1205 self.assertAlmostEqual(entry1, entry2)
1206
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001207 def test_byteswap(self):
1208 a = array.array(self.typecode, self.example)
1209 self.assertRaises(TypeError, a.byteswap, 42)
1210 if a.itemsize in (1, 2, 4, 8):
1211 b = array.array(self.typecode, self.example)
1212 b.byteswap()
1213 if a.itemsize==1:
1214 self.assertEqual(a, b)
1215 else:
1216 # On alphas treating the byte swapped bit patters as
1217 # floats/doubles results in floating point exceptions
1218 # => compare the 8bit string values instead
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001219 self.assertNotEqual(a.tobytes(), b.tobytes())
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001220 b.byteswap()
1221 self.assertEqual(a, b)
1222
Neal Norwitz35c6cd02003-05-22 13:29:15 +00001223class FloatTest(FPTest):
1224 typecode = 'f'
1225 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001226tests.append(FloatTest)
1227
1228class DoubleTest(FPTest):
1229 typecode = 'd'
1230 minitemsize = 8
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001231
1232 def test_alloc_overflow(self):
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001233 from sys import maxsize
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001234 a = array.array('d', [-1]*65536)
1235 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001236 a *= maxsize//65536 + 1
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001237 except MemoryError:
1238 pass
1239 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001240 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001241 b = array.array('d', [ 2.71828183, 3.14159265, -1])
1242 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001243 b * (maxsize//3 + 1)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001244 except MemoryError:
1245 pass
1246 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001247 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001248
Walter Dörwald7fd94242003-05-18 00:47:47 +00001249tests.append(DoubleTest)
1250
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001251def test_main(verbose=None):
1252 import sys
1253
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001254 support.run_unittest(*tests)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001255
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001256 # verify reference counting
1257 if verbose and hasattr(sys, "gettotalrefcount"):
1258 import gc
1259 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001260 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001261 support.run_unittest(*tests)
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001262 gc.collect()
1263 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001264 print(counts)
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001265
1266if __name__ == "__main__":
1267 test_main(verbose=True)