blob: 5190c357ea949c803144df10be91289a254d0bfa [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
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000991
Walter Dörwald7fd94242003-05-18 00:47:47 +0000992class StringTest(BaseTest):
993
994 def test_setitem(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000995 super().test_setitem()
Walter Dörwald7fd94242003-05-18 00:47:47 +0000996 a = array.array(self.typecode, self.example)
997 self.assertRaises(TypeError, a.__setitem__, 0, self.example[:2])
998
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000999class UnicodeTest(StringTest):
1000 typecode = 'u'
1001 example = '\x01\u263a\x00\ufeff'
1002 smallerexample = '\x01\u263a\x00\ufefe'
1003 biggerexample = '\x01\u263a\x01\ufeff'
1004 outside = str('\x33')
1005 minitemsize = 2
Walter Dörwald7fd94242003-05-18 00:47:47 +00001006
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001007 def test_unicode(self):
1008 self.assertRaises(TypeError, array.array, 'b', 'foo')
Walter Dörwald7fd94242003-05-18 00:47:47 +00001009
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001010 a = array.array('u', '\xa0\xc2\u1234')
1011 a.fromunicode(' ')
1012 a.fromunicode('')
1013 a.fromunicode('')
1014 a.fromunicode('\x11abc\xff\u1234')
1015 s = a.tounicode()
1016 self.assertEqual(s, '\xa0\xc2\u1234 \x11abc\xff\u1234')
Walter Dörwald7fd94242003-05-18 00:47:47 +00001017
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001018 s = '\x00="\'a\\b\x80\xff\u0000\u0001\u1234'
1019 a = array.array('u', s)
1020 self.assertEqual(
1021 repr(a),
Georg Brandl559e5d72008-06-11 18:37:52 +00001022 "array('u', '\\x00=\"\\'a\\\\b\\x80\xff\\x00\\x01\u1234')")
Walter Dörwald7fd94242003-05-18 00:47:47 +00001023
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001024 self.assertRaises(TypeError, a.fromunicode)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001025
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001026tests.append(UnicodeTest)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001027
1028class NumberTest(BaseTest):
1029
1030 def test_extslice(self):
1031 a = array.array(self.typecode, range(5))
1032 self.assertEqual(a[::], a)
1033 self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
1034 self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
1035 self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
1036 self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
1037 self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
1038 self.assertEqual(a[-100:100:], a)
1039 self.assertEqual(a[100:-100:-1], a[::-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +00001040 self.assertEqual(a[-100:100:2], array.array(self.typecode, [0,2,4]))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001041 self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
1042 self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
1043
1044 def test_delslice(self):
1045 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001046 del a[::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001047 self.assertEqual(a, array.array(self.typecode, [1,3]))
1048 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001049 del a[1::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001050 self.assertEqual(a, array.array(self.typecode, [0,2,4]))
1051 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001052 del a[1::-2]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001053 self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
1054 a = array.array(self.typecode, range(10))
Michael W. Hudson56796f62002-07-29 14:35:04 +00001055 del a[::1000]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001056 self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
Mark Dickinsonbc099642010-01-29 17:27:24 +00001057 # test issue7788
1058 a = array.array(self.typecode, range(10))
1059 del a[9::1<<333]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001060
1061 def test_assignment(self):
1062 a = array.array(self.typecode, range(10))
1063 a[::2] = array.array(self.typecode, [42]*5)
1064 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
1065 a = array.array(self.typecode, range(10))
1066 a[::-4] = array.array(self.typecode, [10]*3)
1067 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
1068 a = array.array(self.typecode, range(4))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001069 a[::-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +00001070 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
1071 a = array.array(self.typecode, range(10))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001072 b = a[:]
1073 c = a[:]
Walter Dörwald7fd94242003-05-18 00:47:47 +00001074 ins = array.array(self.typecode, range(2))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001075 a[2:3] = ins
1076 b[slice(2,3)] = ins
1077 c[2:3:] = ins
Fred Drake004d5e62000-10-23 17:22:08 +00001078
Walter Dörwald7fd94242003-05-18 00:47:47 +00001079 def test_iterationcontains(self):
1080 a = array.array(self.typecode, range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +00001081 self.assertEqual(list(a), list(range(10)))
Walter Dörwald7fd94242003-05-18 00:47:47 +00001082 b = array.array(self.typecode, [20])
1083 self.assertEqual(a[-1] in a, True)
1084 self.assertEqual(b[0] not in a, True)
1085
1086 def check_overflow(self, lower, upper):
1087 # method to be used by subclasses
1088
1089 # should not overflow assigning lower limit
1090 a = array.array(self.typecode, [lower])
1091 a[0] = lower
1092 # should overflow assigning less than lower limit
1093 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
1094 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
1095 # should not overflow assigning upper limit
1096 a = array.array(self.typecode, [upper])
1097 a[0] = upper
1098 # should overflow assigning more than upper limit
1099 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
1100 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
1101
1102 def test_subclassing(self):
1103 typecode = self.typecode
1104 class ExaggeratingArray(array.array):
1105 __slots__ = ['offset']
1106
1107 def __new__(cls, typecode, data, offset):
1108 return array.array.__new__(cls, typecode, data)
1109
1110 def __init__(self, typecode, data, offset):
1111 self.offset = offset
1112
1113 def __getitem__(self, i):
1114 return array.array.__getitem__(self, i) + self.offset
1115
1116 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
1117 self.assertEntryEqual(a[0], 7)
1118
1119 self.assertRaises(AttributeError, setattr, a, "color", "blue")
1120
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00001121 def test_frombytearray(self):
1122 a = array.array('b', range(10))
1123 b = array.array(self.typecode, a)
1124 self.assertEqual(a, b)
1125
Walter Dörwald7fd94242003-05-18 00:47:47 +00001126class SignedNumberTest(NumberTest):
1127 example = [-1, 0, 1, 42, 0x7f]
1128 smallerexample = [-1, 0, 1, 42, 0x7e]
1129 biggerexample = [-1, 0, 1, 43, 0x7f]
1130 outside = 23
1131
1132 def test_overflow(self):
1133 a = array.array(self.typecode)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001134 lower = -1 * int(pow(2, a.itemsize * 8 - 1))
1135 upper = int(pow(2, a.itemsize * 8 - 1)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001136 self.check_overflow(lower, upper)
1137
1138class UnsignedNumberTest(NumberTest):
1139 example = [0, 1, 17, 23, 42, 0xff]
1140 smallerexample = [0, 1, 17, 23, 42, 0xfe]
1141 biggerexample = [0, 1, 17, 23, 43, 0xff]
1142 outside = 0xaa
1143
1144 def test_overflow(self):
1145 a = array.array(self.typecode)
1146 lower = 0
Guido van Rossume2a383d2007-01-15 16:59:06 +00001147 upper = int(pow(2, a.itemsize * 8)) - 1
Walter Dörwald7fd94242003-05-18 00:47:47 +00001148 self.check_overflow(lower, upper)
Fred Drake004d5e62000-10-23 17:22:08 +00001149
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001150 def test_bytes_extend(self):
1151 s = bytes(self.example)
1152
1153 a = array.array(self.typecode, self.example)
1154 a.extend(s)
1155 self.assertEqual(
1156 a,
1157 array.array(self.typecode, self.example+self.example)
1158 )
1159
1160 a = array.array(self.typecode, self.example)
1161 a.extend(bytearray(reversed(s)))
1162 self.assertEqual(
1163 a,
1164 array.array(self.typecode, self.example+self.example[::-1])
1165 )
1166
Fred Drake004d5e62000-10-23 17:22:08 +00001167
Walter Dörwald7fd94242003-05-18 00:47:47 +00001168class ByteTest(SignedNumberTest):
1169 typecode = 'b'
1170 minitemsize = 1
1171tests.append(ByteTest)
Fred Drake004d5e62000-10-23 17:22:08 +00001172
Walter Dörwald7fd94242003-05-18 00:47:47 +00001173class UnsignedByteTest(UnsignedNumberTest):
1174 typecode = 'B'
1175 minitemsize = 1
1176tests.append(UnsignedByteTest)
1177
1178class ShortTest(SignedNumberTest):
1179 typecode = 'h'
1180 minitemsize = 2
1181tests.append(ShortTest)
1182
1183class UnsignedShortTest(UnsignedNumberTest):
1184 typecode = 'H'
1185 minitemsize = 2
1186tests.append(UnsignedShortTest)
1187
1188class IntTest(SignedNumberTest):
1189 typecode = 'i'
1190 minitemsize = 2
1191tests.append(IntTest)
1192
1193class UnsignedIntTest(UnsignedNumberTest):
1194 typecode = 'I'
1195 minitemsize = 2
1196tests.append(UnsignedIntTest)
1197
1198class LongTest(SignedNumberTest):
1199 typecode = 'l'
1200 minitemsize = 4
1201tests.append(LongTest)
1202
1203class UnsignedLongTest(UnsignedNumberTest):
1204 typecode = 'L'
1205 minitemsize = 4
1206tests.append(UnsignedLongTest)
1207
1208class FPTest(NumberTest):
1209 example = [-42.0, 0, 42, 1e5, -1e10]
1210 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
1211 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
1212 outside = 23
1213
1214 def assertEntryEqual(self, entry1, entry2):
1215 self.assertAlmostEqual(entry1, entry2)
1216
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001217 def test_byteswap(self):
1218 a = array.array(self.typecode, self.example)
1219 self.assertRaises(TypeError, a.byteswap, 42)
1220 if a.itemsize in (1, 2, 4, 8):
1221 b = array.array(self.typecode, self.example)
1222 b.byteswap()
1223 if a.itemsize==1:
1224 self.assertEqual(a, b)
1225 else:
1226 # On alphas treating the byte swapped bit patters as
1227 # floats/doubles results in floating point exceptions
1228 # => compare the 8bit string values instead
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001229 self.assertNotEqual(a.tobytes(), b.tobytes())
Walter Dörwaldcf99b0a2003-05-22 13:15:31 +00001230 b.byteswap()
1231 self.assertEqual(a, b)
1232
Neal Norwitz35c6cd02003-05-22 13:29:15 +00001233class FloatTest(FPTest):
1234 typecode = 'f'
1235 minitemsize = 4
Walter Dörwald7fd94242003-05-18 00:47:47 +00001236tests.append(FloatTest)
1237
1238class DoubleTest(FPTest):
1239 typecode = 'd'
1240 minitemsize = 8
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001241
1242 def test_alloc_overflow(self):
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001243 from sys import maxsize
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001244 a = array.array('d', [-1]*65536)
1245 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001246 a *= maxsize//65536 + 1
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001247 except MemoryError:
1248 pass
1249 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001250 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001251 b = array.array('d', [ 2.71828183, 3.14159265, -1])
1252 try:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001253 b * (maxsize//3 + 1)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001254 except MemoryError:
1255 pass
1256 else:
Benjamin Petersonbcd8ac32008-10-10 22:20:52 +00001257 self.fail("Array of size > maxsize created - MemoryError expected")
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001258
Walter Dörwald7fd94242003-05-18 00:47:47 +00001259tests.append(DoubleTest)
1260
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001261def test_main(verbose=None):
1262 import sys
1263
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001264 support.run_unittest(*tests)
Walter Dörwald7fd94242003-05-18 00:47:47 +00001265
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001266 # verify reference counting
1267 if verbose and hasattr(sys, "gettotalrefcount"):
1268 import gc
1269 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001270 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001271 support.run_unittest(*tests)
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001272 gc.collect()
1273 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001274 print(counts)
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001275
1276if __name__ == "__main__":
1277 test_main(verbose=True)