blob: e26e9add0559340636133b1546da3a0cff484214 [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
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +0000401 def test_fromarray(self):
402 a = array.array(self.typecode, self.example)
403 b = array.array(self.typecode, a)
404 self.assertEqual(a, b)
405
Walter Dörwald7fd94242003-05-18 00:47:47 +0000406 def test_repr(self):
407 a = array.array(self.typecode, 2*self.example)
408 self.assertEqual(a, eval(repr(a), {"array": array.array}))
Fred Drake78334472000-06-28 17:50:51 +0000409
Walter Dörwald7fd94242003-05-18 00:47:47 +0000410 a = array.array(self.typecode)
411 self.assertEqual(repr(a), "array('%s')" % self.typecode)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000412
Walter Dörwald7fd94242003-05-18 00:47:47 +0000413 def test_str(self):
414 a = array.array(self.typecode, 2*self.example)
415 str(a)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000416
Walter Dörwald7fd94242003-05-18 00:47:47 +0000417 def test_cmp(self):
418 a = array.array(self.typecode, self.example)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000419 self.assertTrue((a == 42) is False)
420 self.assertTrue((a != 42) is True)
Tim Peterscc78e472000-11-14 21:36:07 +0000421
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000422 self.assertTrue((a == a) is True)
423 self.assertTrue((a != a) is False)
424 self.assertTrue((a < a) is False)
425 self.assertTrue((a <= a) is True)
426 self.assertTrue((a > a) is False)
427 self.assertTrue((a >= a) is True)
Tim Peterscc78e472000-11-14 21:36:07 +0000428
Neal Norwitzbd2835c2006-03-17 08:54:15 +0000429 al = array.array(self.typecode, self.smallerexample)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000430 ab = array.array(self.typecode, self.biggerexample)
Guido van Rossum7f1d3aa1998-07-16 15:31:43 +0000431
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000432 self.assertTrue((a == 2*a) is False)
433 self.assertTrue((a != 2*a) is True)
434 self.assertTrue((a < 2*a) is True)
435 self.assertTrue((a <= 2*a) is True)
436 self.assertTrue((a > 2*a) is False)
437 self.assertTrue((a >= 2*a) is False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000438
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000439 self.assertTrue((a == al) is False)
440 self.assertTrue((a != al) is True)
441 self.assertTrue((a < al) is False)
442 self.assertTrue((a <= al) is False)
443 self.assertTrue((a > al) is True)
444 self.assertTrue((a >= al) is True)
Martin v. Löwis99866332002-03-01 10:27:01 +0000445
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000446 self.assertTrue((a == ab) is False)
447 self.assertTrue((a != ab) is True)
448 self.assertTrue((a < ab) is True)
449 self.assertTrue((a <= ab) is True)
450 self.assertTrue((a > ab) is False)
451 self.assertTrue((a >= ab) is False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000452
Walter Dörwald7fd94242003-05-18 00:47:47 +0000453 def test_add(self):
454 a = array.array(self.typecode, self.example) \
455 + array.array(self.typecode, self.example[::-1])
456 self.assertEqual(
457 a,
458 array.array(self.typecode, self.example + self.example[::-1])
459 )
Martin v. Löwis99866332002-03-01 10:27:01 +0000460
Walter Dörwald7fd94242003-05-18 00:47:47 +0000461 b = array.array(self.badtypecode())
462 self.assertRaises(TypeError, a.__add__, b)
463
464 self.assertRaises(TypeError, a.__add__, "bad")
465
466 def test_iadd(self):
467 a = array.array(self.typecode, self.example[::-1])
468 b = a
469 a += array.array(self.typecode, 2*self.example)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000470 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000471 self.assertEqual(
472 a,
473 array.array(self.typecode, self.example[::-1]+2*self.example)
474 )
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000475 a = array.array(self.typecode, self.example)
476 a += a
477 self.assertEqual(
478 a,
479 array.array(self.typecode, self.example + self.example)
480 )
Walter Dörwald7fd94242003-05-18 00:47:47 +0000481
482 b = array.array(self.badtypecode())
483 self.assertRaises(TypeError, a.__add__, b)
484
485 self.assertRaises(TypeError, a.__iadd__, "bad")
486
487 def test_mul(self):
488 a = 5*array.array(self.typecode, self.example)
489 self.assertEqual(
490 a,
491 array.array(self.typecode, 5*self.example)
492 )
493
494 a = array.array(self.typecode, self.example)*5
495 self.assertEqual(
496 a,
497 array.array(self.typecode, self.example*5)
498 )
499
500 a = 0*array.array(self.typecode, self.example)
501 self.assertEqual(
502 a,
503 array.array(self.typecode)
504 )
505
506 a = (-1)*array.array(self.typecode, self.example)
507 self.assertEqual(
508 a,
509 array.array(self.typecode)
510 )
511
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000512 a = 5 * array.array(self.typecode, self.example[:1])
513 self.assertEqual(
514 a,
515 array.array(self.typecode, [a[0]] * 5)
516 )
517
Walter Dörwald7fd94242003-05-18 00:47:47 +0000518 self.assertRaises(TypeError, a.__mul__, "bad")
519
520 def test_imul(self):
521 a = array.array(self.typecode, self.example)
522 b = a
523
524 a *= 5
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000525 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000526 self.assertEqual(
527 a,
528 array.array(self.typecode, 5*self.example)
529 )
530
531 a *= 0
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000532 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000533 self.assertEqual(a, array.array(self.typecode))
534
535 a *= 1000
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000536 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000537 self.assertEqual(a, array.array(self.typecode))
538
539 a *= -1
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000540 self.assertTrue(a is b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000541 self.assertEqual(a, array.array(self.typecode))
542
543 a = array.array(self.typecode, self.example)
544 a *= -1
545 self.assertEqual(a, array.array(self.typecode))
546
547 self.assertRaises(TypeError, a.__imul__, "bad")
548
549 def test_getitem(self):
550 a = array.array(self.typecode, self.example)
551 self.assertEntryEqual(a[0], self.example[0])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000552 self.assertEntryEqual(a[0], self.example[0])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000553 self.assertEntryEqual(a[-1], self.example[-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000554 self.assertEntryEqual(a[-1], self.example[-1])
Walter Dörwald7fd94242003-05-18 00:47:47 +0000555 self.assertEntryEqual(a[len(self.example)-1], self.example[-1])
556 self.assertEntryEqual(a[-len(self.example)], self.example[0])
557 self.assertRaises(TypeError, a.__getitem__)
558 self.assertRaises(IndexError, a.__getitem__, len(self.example))
559 self.assertRaises(IndexError, a.__getitem__, -len(self.example)-1)
560
561 def test_setitem(self):
562 a = array.array(self.typecode, self.example)
563 a[0] = a[-1]
564 self.assertEntryEqual(a[0], a[-1])
565
566 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000567 a[0] = a[-1]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000568 self.assertEntryEqual(a[0], a[-1])
569
570 a = array.array(self.typecode, self.example)
571 a[-1] = a[0]
572 self.assertEntryEqual(a[0], a[-1])
573
574 a = array.array(self.typecode, self.example)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000575 a[-1] = a[0]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000576 self.assertEntryEqual(a[0], a[-1])
577
578 a = array.array(self.typecode, self.example)
579 a[len(self.example)-1] = a[0]
580 self.assertEntryEqual(a[0], a[-1])
581
582 a = array.array(self.typecode, self.example)
583 a[-len(self.example)] = a[-1]
584 self.assertEntryEqual(a[0], a[-1])
585
586 self.assertRaises(TypeError, a.__setitem__)
587 self.assertRaises(TypeError, a.__setitem__, None)
588 self.assertRaises(TypeError, a.__setitem__, 0, None)
589 self.assertRaises(
590 IndexError,
591 a.__setitem__,
592 len(self.example), self.example[0]
593 )
594 self.assertRaises(
595 IndexError,
596 a.__setitem__,
597 -len(self.example)-1, self.example[0]
598 )
599
600 def test_delitem(self):
601 a = array.array(self.typecode, self.example)
602 del a[0]
603 self.assertEqual(
604 a,
605 array.array(self.typecode, self.example[1:])
606 )
607
608 a = array.array(self.typecode, self.example)
609 del a[-1]
610 self.assertEqual(
611 a,
612 array.array(self.typecode, self.example[:-1])
613 )
614
615 a = array.array(self.typecode, self.example)
616 del a[len(self.example)-1]
617 self.assertEqual(
618 a,
619 array.array(self.typecode, self.example[:-1])
620 )
621
622 a = array.array(self.typecode, self.example)
623 del a[-len(self.example)]
624 self.assertEqual(
625 a,
626 array.array(self.typecode, self.example[1:])
627 )
628
629 self.assertRaises(TypeError, a.__delitem__)
630 self.assertRaises(TypeError, a.__delitem__, None)
631 self.assertRaises(IndexError, a.__delitem__, len(self.example))
632 self.assertRaises(IndexError, a.__delitem__, -len(self.example)-1)
633
634 def test_getslice(self):
635 a = array.array(self.typecode, self.example)
636 self.assertEqual(a[:], a)
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:],
655 array.array(self.typecode, self.example[-1:])
656 )
657
658 self.assertEqual(
659 a[-1:-1],
660 array.array(self.typecode)
661 )
662
663 self.assertEqual(
Walter Dörwald1083c242005-01-21 21:16:51 +0000664 a[2:1],
665 array.array(self.typecode)
666 )
667
668 self.assertEqual(
Walter Dörwald7fd94242003-05-18 00:47:47 +0000669 a[1000:],
670 array.array(self.typecode)
671 )
672 self.assertEqual(a[-1000:], a)
673 self.assertEqual(a[:1000], a)
674 self.assertEqual(
675 a[:-1000],
676 array.array(self.typecode)
677 )
678 self.assertEqual(a[-1000:1000], a)
679 self.assertEqual(
680 a[2000:1000],
681 array.array(self.typecode)
682 )
683
Thomas Woutersed03b412007-08-28 21:37:11 +0000684 def test_extended_getslice(self):
685 # Test extended slicing by comparing with list slicing
686 # (Assumes list conversion works correctly, too)
687 a = array.array(self.typecode, self.example)
688 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
689 for start in indices:
690 for stop in indices:
691 # Everything except the initial 0 (invalid step)
692 for step in indices[1:]:
693 self.assertEqual(list(a[start:stop:step]),
694 list(a)[start:stop:step])
695
Walter Dörwald7fd94242003-05-18 00:47:47 +0000696 def test_setslice(self):
697 a = array.array(self.typecode, self.example)
698 a[:1] = a
699 self.assertEqual(
700 a,
701 array.array(self.typecode, self.example + self.example[1:])
702 )
703
704 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000705 a[:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000706 self.assertEqual(
707 a,
708 array.array(self.typecode, self.example + self.example[-1:])
709 )
710
711 a = array.array(self.typecode, self.example)
712 a[-1:] = a
713 self.assertEqual(
714 a,
715 array.array(self.typecode, self.example[:-1] + self.example)
716 )
717
718 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000719 a[1:] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000720 self.assertEqual(
721 a,
722 array.array(self.typecode, self.example[:1] + self.example)
723 )
724
725 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000726 a[1:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000727 self.assertEqual(
728 a,
729 array.array(
730 self.typecode,
731 self.example[:1] + self.example + self.example[-1:]
732 )
733 )
734
735 a = array.array(self.typecode, self.example)
736 a[1000:] = a
737 self.assertEqual(
738 a,
739 array.array(self.typecode, 2*self.example)
740 )
741
742 a = array.array(self.typecode, self.example)
743 a[-1000:] = a
744 self.assertEqual(
745 a,
746 array.array(self.typecode, self.example)
747 )
748
749 a = array.array(self.typecode, self.example)
750 a[:1000] = a
751 self.assertEqual(
752 a,
753 array.array(self.typecode, self.example)
754 )
755
756 a = array.array(self.typecode, self.example)
757 a[:-1000] = a
758 self.assertEqual(
759 a,
760 array.array(self.typecode, 2*self.example)
761 )
762
763 a = array.array(self.typecode, self.example)
764 a[1:0] = a
765 self.assertEqual(
766 a,
767 array.array(self.typecode, self.example[:1] + self.example + self.example[1:])
768 )
769
770 a = array.array(self.typecode, self.example)
771 a[2000:1000] = a
772 self.assertEqual(
773 a,
774 array.array(self.typecode, 2*self.example)
775 )
776
777 a = array.array(self.typecode, self.example)
Thomas Woutersed03b412007-08-28 21:37:11 +0000778 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), None)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000779 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), None)
780
781 b = array.array(self.badtypecode())
Thomas Woutersed03b412007-08-28 21:37:11 +0000782 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), b)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000783 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), b)
784
Thomas Woutersed03b412007-08-28 21:37:11 +0000785 def test_extended_set_del_slice(self):
786 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
787 for start in indices:
788 for stop in indices:
789 # Everything except the initial 0 (invalid step)
790 for step in indices[1:]:
791 a = array.array(self.typecode, self.example)
792 L = list(a)
793 # Make sure we have a slice of exactly the right length,
794 # but with (hopefully) different data.
795 data = L[start:stop:step]
796 data.reverse()
797 L[start:stop:step] = data
798 a[start:stop:step] = array.array(self.typecode, data)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000799 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000800
801 del L[start:stop:step]
802 del a[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +0000803 self.assertEqual(a, array.array(self.typecode, L))
Thomas Woutersed03b412007-08-28 21:37:11 +0000804
Walter Dörwald7fd94242003-05-18 00:47:47 +0000805 def test_index(self):
806 example = 2*self.example
807 a = array.array(self.typecode, example)
808 self.assertRaises(TypeError, a.index)
809 for x in example:
810 self.assertEqual(a.index(x), example.index(x))
811 self.assertRaises(ValueError, a.index, None)
812 self.assertRaises(ValueError, a.index, self.outside)
813
814 def test_count(self):
815 example = 2*self.example
816 a = array.array(self.typecode, example)
817 self.assertRaises(TypeError, a.count)
818 for x in example:
819 self.assertEqual(a.count(x), example.count(x))
820 self.assertEqual(a.count(self.outside), 0)
821 self.assertEqual(a.count(None), 0)
822
823 def test_remove(self):
824 for x in self.example:
825 example = 2*self.example
826 a = array.array(self.typecode, example)
827 pos = example.index(x)
828 example2 = example[:pos] + example[pos+1:]
829 a.remove(x)
830 self.assertEqual(a, array.array(self.typecode, example2))
831
832 a = array.array(self.typecode, self.example)
833 self.assertRaises(ValueError, a.remove, self.outside)
834
835 self.assertRaises(ValueError, a.remove, None)
836
837 def test_pop(self):
838 a = array.array(self.typecode)
839 self.assertRaises(IndexError, a.pop)
840
841 a = array.array(self.typecode, 2*self.example)
842 self.assertRaises(TypeError, a.pop, 42, 42)
843 self.assertRaises(TypeError, a.pop, None)
844 self.assertRaises(IndexError, a.pop, len(a))
845 self.assertRaises(IndexError, a.pop, -len(a)-1)
846
847 self.assertEntryEqual(a.pop(0), self.example[0])
848 self.assertEqual(
849 a,
850 array.array(self.typecode, self.example[1:]+self.example)
851 )
852 self.assertEntryEqual(a.pop(1), self.example[2])
853 self.assertEqual(
854 a,
855 array.array(self.typecode, self.example[1:2]+self.example[3:]+self.example)
856 )
857 self.assertEntryEqual(a.pop(0), self.example[1])
858 self.assertEntryEqual(a.pop(), self.example[-1])
859 self.assertEqual(
860 a,
861 array.array(self.typecode, self.example[3:]+self.example[:-1])
862 )
863
864 def test_reverse(self):
865 a = array.array(self.typecode, self.example)
866 self.assertRaises(TypeError, a.reverse, 42)
Fred Drake004d5e62000-10-23 17:22:08 +0000867 a.reverse()
Walter Dörwald7fd94242003-05-18 00:47:47 +0000868 self.assertEqual(
869 a,
870 array.array(self.typecode, self.example[::-1])
871 )
872
873 def test_extend(self):
874 a = array.array(self.typecode, self.example)
875 self.assertRaises(TypeError, a.extend)
876 a.extend(array.array(self.typecode, self.example[::-1]))
877 self.assertEqual(
878 a,
879 array.array(self.typecode, self.example+self.example[::-1])
880 )
881
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000882 a = array.array(self.typecode, self.example)
883 a.extend(a)
884 self.assertEqual(
885 a,
886 array.array(self.typecode, self.example+self.example)
887 )
888
Walter Dörwald7fd94242003-05-18 00:47:47 +0000889 b = array.array(self.badtypecode())
890 self.assertRaises(TypeError, a.extend, b)
891
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000892 a = array.array(self.typecode, self.example)
893 a.extend(self.example[::-1])
894 self.assertEqual(
895 a,
896 array.array(self.typecode, self.example+self.example[::-1])
897 )
898
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +0000899 def test_constructor_with_iterable_argument(self):
900 a = array.array(self.typecode, iter(self.example))
901 b = array.array(self.typecode, self.example)
902 self.assertEqual(a, b)
903
904 # non-iterable argument
905 self.assertRaises(TypeError, array.array, self.typecode, 10)
906
907 # pass through errors raised in __iter__
908 class A:
909 def __iter__(self):
910 raise UnicodeError
911 self.assertRaises(UnicodeError, array.array, self.typecode, A())
912
913 # pass through errors raised in next()
914 def B():
915 raise UnicodeError
916 yield None
917 self.assertRaises(UnicodeError, array.array, self.typecode, B())
918
Walter Dörwald7fd94242003-05-18 00:47:47 +0000919 def test_coveritertraverse(self):
920 try:
921 import gc
922 except ImportError:
923 return
924 a = array.array(self.typecode)
925 l = [iter(a)]
926 l.append(l)
927 gc.collect()
928
929 def test_buffer(self):
930 a = array.array(self.typecode, self.example)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000931 m = memoryview(a)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000932 expected = m.tobytes()
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000933 self.assertEqual(a.tobytes(), expected)
934 self.assertEqual(a.tobytes()[0], expected[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000935 # Resizing is forbidden when there are buffer exports.
936 # For issue 4509, we also check after each error that
937 # the array was not modified.
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000938 self.assertRaises(BufferError, a.append, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000939 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000940 self.assertRaises(BufferError, a.extend, a[0:1])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000941 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000942 self.assertRaises(BufferError, a.remove, a[0])
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000943 self.assertEqual(m.tobytes(), expected)
944 self.assertRaises(BufferError, a.pop, 0)
945 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000946 self.assertRaises(BufferError, a.fromlist, a.tolist())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000947 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000948 self.assertRaises(BufferError, a.frombytes, a.tobytes())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000949 self.assertEqual(m.tobytes(), expected)
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000950 if self.typecode == 'u':
951 self.assertRaises(BufferError, a.fromunicode, a.tounicode())
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000952 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +0000953 self.assertRaises(BufferError, operator.imul, a, 2)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000954 self.assertEqual(m.tobytes(), expected)
Raymond Hettinger3471b1c2009-01-27 11:06:40 +0000955 self.assertRaises(BufferError, operator.imul, a, 0)
Alexandre Vassalotti47137252009-07-05 19:57:00 +0000956 self.assertEqual(m.tobytes(), expected)
957 self.assertRaises(BufferError, operator.setitem, a, slice(0, 0), a)
958 self.assertEqual(m.tobytes(), expected)
959 self.assertRaises(BufferError, operator.delitem, a, 0)
960 self.assertEqual(m.tobytes(), expected)
961 self.assertRaises(BufferError, operator.delitem, a, slice(0, 1))
962 self.assertEqual(m.tobytes(), expected)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000963
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000964 def test_weakref(self):
965 s = array.array(self.typecode, self.example)
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000966 p = weakref.proxy(s)
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +0000967 self.assertEqual(p.tobytes(), s.tobytes())
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000968 s = None
969 self.assertRaises(ReferenceError, len, p)
970
Skip Montanarod5cf0b82003-08-03 23:02:10 +0000971 def test_bug_782369(self):
972 import sys
Skip Montanaroed9bf122003-08-03 23:30:40 +0000973 if hasattr(sys, "getrefcount"):
974 for i in range(10):
975 b = array.array('B', range(64))
976 rc = sys.getrefcount(10)
977 for i in range(10):
978 b = array.array('B', range(64))
979 self.assertEqual(rc, sys.getrefcount(10))
Skip Montanarod5cf0b82003-08-03 23:02:10 +0000980
Thomas Woutersb2137042007-02-01 18:02:27 +0000981 def test_subclass_with_kwargs(self):
982 # SF bug #1486663 -- this used to erroneously raise a TypeError
983 ArraySubclassWithKwargs('b', newarg=1)
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000984
Guido van Rossum6b826ab2007-07-03 16:22:09 +0000985 def test_create_from_bytes(self):
Alexandre Vassalotti7e4f3212009-07-05 05:38:18 +0000986 # XXX This test probably needs to be moved in a subclass or
987 # generalized to use self.typecode.
Guido van Rossum6b826ab2007-07-03 16:22:09 +0000988 a = array.array('H', b"1234")
989 self.assertEqual(len(a) * a.itemsize, 4)
990
Meador Inge03b4d502012-08-10 22:35:45 -0500991 @support.cpython_only
992 def test_sizeof_with_buffer(self):
993 a = array.array(self.typecode, self.example)
994 basesize = support.calcvobjsize('4Pi')
995 buffer_size = a.buffer_info()[1] * a.itemsize
996 support.check_sizeof(self, a, basesize + buffer_size)
997
998 @support.cpython_only
999 def test_sizeof_without_buffer(self):
1000 a = array.array(self.typecode)
1001 basesize = support.calcvobjsize('4Pi')
1002 support.check_sizeof(self, a, basesize)
1003
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001004
Walter Dörwald7fd94242003-05-18 00:47:47 +00001005class StringTest(BaseTest):
1006
1007 def test_setitem(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001008 super().test_setitem()
Walter Dörwald7fd94242003-05-18 00:47:47 +00001009 a = array.array(self.typecode, self.example)
1010 self.assertRaises(TypeError, a.__setitem__, 0, self.example[:2])
1011
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001012class UnicodeTest(StringTest):
1013 typecode = 'u'
1014 example = '\x01\u263a\x00\ufeff'
1015 smallerexample = '\x01\u263a\x00\ufefe'
1016 biggerexample = '\x01\u263a\x01\ufeff'
1017 outside = str('\x33')
1018 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001019
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001020 def test_unicode(self):
1021 self.assertRaises(TypeError, array.array, 'b', 'foo')
Walter Dörwald7fd94242003-05-18 00:47:47 +00001022
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001023 a = array.array('u', '\xa0\xc2\u1234')
1024 a.fromunicode(' ')
1025 a.fromunicode('')
1026 a.fromunicode('')
1027 a.fromunicode('\x11abc\xff\u1234')
1028 s = a.tounicode()
1029 self.assertEqual(s, '\xa0\xc2\u1234 \x11abc\xff\u1234')
Walter Dörwald7fd94242003-05-18 00:47:47 +00001030
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001031 s = '\x00="\'a\\b\x80\xff\u0000\u0001\u1234'
1032 a = array.array('u', s)
1033 self.assertEqual(
1034 repr(a),
Georg Brandl559e5d72008-06-11 18:37:52 +00001035 "array('u', '\\x00=\"\\'a\\\\b\\x80\xff\\x00\\x01\u1234')")
Walter Dörwald7fd94242003-05-18 00:47:47 +00001036
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001037 self.assertRaises(TypeError, a.fromunicode)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001038
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001039tests.append(UnicodeTest)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001040
1041class NumberTest(BaseTest):
1042
1043 def test_extslice(self):
1044 a = array.array(self.typecode, range(5))
1045 self.assertEqual(a[::], a)
1046 self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
1047 self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
1048 self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
1049 self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
1050 self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
1051 self.assertEqual(a[-100:100:], a)
1052 self.assertEqual(a[100:-100:-1], a[::-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +00001053 self.assertEqual(a[-100:100:2], array.array(self.typecode, [0,2,4]))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001054 self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
1055 self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
1056
1057 def test_delslice(self):
1058 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001059 del a[::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001060 self.assertEqual(a, array.array(self.typecode, [1,3]))
1061 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001062 del a[1::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001063 self.assertEqual(a, array.array(self.typecode, [0,2,4]))
1064 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001065 del a[1::-2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001066 self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
1067 a = array.array(self.typecode, range(10))
Michael W. Hudson56796f62002-07-29 14:35:04 +00001068 del a[::1000]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001069 self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
Mark Dickinsonbc099642010-01-29 17:27:24 +00001070 # test issue7788
1071 a = array.array(self.typecode, range(10))
1072 del a[9::1<<333]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001073
1074 def test_assignment(self):
1075 a = array.array(self.typecode, range(10))
1076 a[::2] = array.array(self.typecode, [42]*5)
1077 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
1078 a = array.array(self.typecode, range(10))
1079 a[::-4] = array.array(self.typecode, [10]*3)
1080 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
1081 a = array.array(self.typecode, range(4))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001082 a[::-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +00001083 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
1084 a = array.array(self.typecode, range(10))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001085 b = a[:]
1086 c = a[:]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001087 ins = array.array(self.typecode, range(2))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001088 a[2:3] = ins
1089 b[slice(2,3)] = ins
1090 c[2:3:] = ins
Fred Drake004d5e62000-10-23 17:22:08 +00001091
Walter Dörwald7fd94242003-05-18 00:47:47 +00001092 def test_iterationcontains(self):
1093 a = array.array(self.typecode, range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +00001094 self.assertEqual(list(a), list(range(10)))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001095 b = array.array(self.typecode, [20])
1096 self.assertEqual(a[-1] in a, True)
1097 self.assertEqual(b[0] not in a, True)
1098
1099 def check_overflow(self, lower, upper):
1100 # method to be used by subclasses
1101
1102 # should not overflow assigning lower limit
1103 a = array.array(self.typecode, [lower])
1104 a[0] = lower
1105 # should overflow assigning less than lower limit
1106 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
1107 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
1108 # should not overflow assigning upper limit
1109 a = array.array(self.typecode, [upper])
1110 a[0] = upper
1111 # should overflow assigning more than upper limit
1112 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
1113 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
1114
1115 def test_subclassing(self):
1116 typecode = self.typecode
1117 class ExaggeratingArray(array.array):
1118 __slots__ = ['offset']
1119
1120 def __new__(cls, typecode, data, offset):
1121 return array.array.__new__(cls, typecode, data)
1122
1123 def __init__(self, typecode, data, offset):
1124 self.offset = offset
1125
1126 def __getitem__(self, i):
1127 return array.array.__getitem__(self, i) + self.offset
1128
1129 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
1130 self.assertEntryEqual(a[0], 7)
1131
1132 self.assertRaises(AttributeError, setattr, a, "color", "blue")
1133
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00001134 def test_frombytearray(self):
1135 a = array.array('b', range(10))
1136 b = array.array(self.typecode, a)
1137 self.assertEqual(a, b)
1138
Walter Dörwald7fd94242003-05-18 00:47:47 +00001139class SignedNumberTest(NumberTest):
1140 example = [-1, 0, 1, 42, 0x7f]
1141 smallerexample = [-1, 0, 1, 42, 0x7e]
1142 biggerexample = [-1, 0, 1, 43, 0x7f]
1143 outside = 23
1144
1145 def test_overflow(self):
1146 a = array.array(self.typecode)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001147 lower = -1 * int(pow(2, a.itemsize * 8 - 1))
1148 upper = int(pow(2, a.itemsize * 8 - 1)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001149 self.check_overflow(lower, upper)
1150
1151class UnsignedNumberTest(NumberTest):
1152 example = [0, 1, 17, 23, 42, 0xff]
1153 smallerexample = [0, 1, 17, 23, 42, 0xfe]
1154 biggerexample = [0, 1, 17, 23, 43, 0xff]
1155 outside = 0xaa
1156
1157 def test_overflow(self):
1158 a = array.array(self.typecode)
1159 lower = 0
Guido van Rossume2a383d2007-01-15 16:59:06 +00001160 upper = int(pow(2, a.itemsize * 8)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001161 self.check_overflow(lower, upper)
Fred Drake004d5e62000-10-23 17:22:08 +00001162
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001163 def test_bytes_extend(self):
1164 s = bytes(self.example)
1165
1166 a = array.array(self.typecode, self.example)
1167 a.extend(s)
1168 self.assertEqual(
1169 a,
1170 array.array(self.typecode, self.example+self.example)
1171 )
1172
1173 a = array.array(self.typecode, self.example)
1174 a.extend(bytearray(reversed(s)))
1175 self.assertEqual(
1176 a,
1177 array.array(self.typecode, self.example+self.example[::-1])
1178 )
1179
Fred Drake004d5e62000-10-23 17:22:08 +00001180
Walter Dörwald7fd94242003-05-18 00:47:47 +00001181class ByteTest(SignedNumberTest):
1182 typecode = 'b'
1183 minitemsize = 1
1184tests.append(ByteTest)
Fred Drake004d5e62000-10-23 17:22:08 +00001185
Walter Dörwald7fd94242003-05-18 00:47:47 +00001186class UnsignedByteTest(UnsignedNumberTest):
1187 typecode = 'B'
1188 minitemsize = 1
1189tests.append(UnsignedByteTest)
1190
1191class ShortTest(SignedNumberTest):
1192 typecode = 'h'
1193 minitemsize = 2
1194tests.append(ShortTest)
1195
1196class UnsignedShortTest(UnsignedNumberTest):
1197 typecode = 'H'
1198 minitemsize = 2
1199tests.append(UnsignedShortTest)
1200
1201class IntTest(SignedNumberTest):
1202 typecode = 'i'
1203 minitemsize = 2
1204tests.append(IntTest)
1205
1206class UnsignedIntTest(UnsignedNumberTest):
1207 typecode = 'I'
1208 minitemsize = 2
1209tests.append(UnsignedIntTest)
1210
1211class LongTest(SignedNumberTest):
1212 typecode = 'l'
1213 minitemsize = 4
1214tests.append(LongTest)
1215
1216class UnsignedLongTest(UnsignedNumberTest):
1217 typecode = 'L'
1218 minitemsize = 4
1219tests.append(UnsignedLongTest)
1220
1221class FPTest(NumberTest):
1222 example = [-42.0, 0, 42, 1e5, -1e10]
1223 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
1224 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
1225 outside = 23
1226
1227 def assertEntryEqual(self, entry1, entry2):
1228 self.assertAlmostEqual(entry1, entry2)
1229
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001230 def test_byteswap(self):
1231 a = array.array(self.typecode, self.example)
1232 self.assertRaises(TypeError, a.byteswap, 42)
1233 if a.itemsize in (1, 2, 4, 8):
1234 b = array.array(self.typecode, self.example)
1235 b.byteswap()
1236 if a.itemsize==1:
1237 self.assertEqual(a, b)
1238 else:
1239 # On alphas treating the byte swapped bit patters as
1240 # floats/doubles results in floating point exceptions
1241 # => compare the 8bit string values instead
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001242 self.assertNotEqual(a.tobytes(), b.tobytes())
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001243 b.byteswap()
1244 self.assertEqual(a, b)
1245
Neal Norwitz35c6cd02003-05-22 13:29:15 +00001246class FloatTest(FPTest):
1247 typecode = 'f'
1248 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001249tests.append(FloatTest)
1250
1251class DoubleTest(FPTest):
1252 typecode = 'd'
1253 minitemsize = 8
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001254
1255 def test_alloc_overflow(self):
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001256 from sys import maxsize
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001257 a = array.array('d', [-1]*65536)
1258 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001259 a *= maxsize//65536 + 1
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001260 except MemoryError:
1261 pass
1262 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001263 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001264 b = array.array('d', [ 2.71828183, 3.14159265, -1])
1265 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001266 b * (maxsize//3 + 1)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001267 except MemoryError:
1268 pass
1269 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001270 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001271
Walter Dörwald7fd94242003-05-18 00:47:47 +00001272tests.append(DoubleTest)
1273
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001274def test_main(verbose=None):
1275 import sys
1276
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001277 support.run_unittest(*tests)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001278
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001279 # verify reference counting
1280 if verbose and hasattr(sys, "gettotalrefcount"):
1281 import gc
1282 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001283 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001284 support.run_unittest(*tests)
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001285 gc.collect()
1286 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001287 print(counts)
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001288
1289if __name__ == "__main__":
1290 test_main(verbose=True)