blob: 68f2787295fec0fbebbcf0053c8c26da00af0fef [file] [log] [blame]
Roger E. Masse8db1b071996-12-09 20:09:16 +00001#! /usr/bin/env python
2"""Test the arraymodule.
Roger E. Massefab8ab81996-12-20 22:36:52 +00003 Roger E. Masse
Roger E. Masse8db1b071996-12-09 20:09:16 +00004"""
Roger E. Massefab8ab81996-12-20 22:36:52 +00005
Walter Dörwald7fd94242003-05-18 00:47:47 +00006import unittest
7from test import test_support
8import array, cStringIO, math
Guido van Rossumc9f8f141997-04-09 20:51:54 +00009
Walter Dörwald7fd94242003-05-18 00:47:47 +000010tests = [] # list to accumulate all tests
11typecodes = "cubBhHiIlLfd"
Martin v. Löwis99866332002-03-01 10:27:01 +000012
Walter Dörwald7fd94242003-05-18 00:47:47 +000013class BadConstructorTest(unittest.TestCase):
Martin v. Löwis99866332002-03-01 10:27:01 +000014
Walter Dörwald7fd94242003-05-18 00:47:47 +000015 def test_constructor(self):
16 self.assertRaises(TypeError, array.array)
17 self.assertRaises(TypeError, array.array, spam=42)
18 self.assertRaises(TypeError, array.array, 'xx')
19 self.assertRaises(ValueError, array.array, 'x')
Martin v. Löwis99866332002-03-01 10:27:01 +000020
Walter Dörwald7fd94242003-05-18 00:47:47 +000021tests.append(BadConstructorTest)
Martin v. Löwis99866332002-03-01 10:27:01 +000022
Walter Dörwald7fd94242003-05-18 00:47:47 +000023class BaseTest(unittest.TestCase):
24 # Required class attributes (provided by subclasses
25 # typecode: the typecode to test
26 # example: an initializer usable in the constructor for this type
27 # smallerexample: the same length as example, but smaller
28 # biggerexample: the same length as example, but bigger
29 # outside: An entry that is not in example
30 # minitemsize: the minimum guaranteed itemsize
Martin v. Löwis99866332002-03-01 10:27:01 +000031
Walter Dörwald7fd94242003-05-18 00:47:47 +000032 def assertEntryEqual(self, entry1, entry2):
33 self.assertEqual(entry1, entry2)
Martin v. Löwis99866332002-03-01 10:27:01 +000034
Walter Dörwald7fd94242003-05-18 00:47:47 +000035 def badtypecode(self):
36 # Return a typecode that is different from our own
37 return typecodes[(typecodes.index(self.typecode)+1) % len(typecodes)]
Martin v. Löwis99866332002-03-01 10:27:01 +000038
Walter Dörwald7fd94242003-05-18 00:47:47 +000039 def test_constructor(self):
40 a = array.array(self.typecode)
41 self.assertEqual(a.typecode, self.typecode)
42 self.assert_(a.itemsize>=self.minitemsize)
43 self.assertRaises(TypeError, array.array, self.typecode, None)
Martin v. Löwis99866332002-03-01 10:27:01 +000044
Walter Dörwald7fd94242003-05-18 00:47:47 +000045 def test_len(self):
46 a = array.array(self.typecode)
47 a.append(self.example[0])
48 self.assertEqual(len(a), 1)
Martin v. Löwis99866332002-03-01 10:27:01 +000049
Walter Dörwald7fd94242003-05-18 00:47:47 +000050 a = array.array(self.typecode, self.example)
51 self.assertEqual(len(a), len(self.example))
Martin v. Löwis99866332002-03-01 10:27:01 +000052
Walter Dörwald7fd94242003-05-18 00:47:47 +000053 def test_buffer_info(self):
54 a = array.array(self.typecode, self.example)
55 self.assertRaises(TypeError, a.buffer_info, 42)
56 bi = a.buffer_info()
57 self.assert_(isinstance(bi, tuple))
58 self.assertEqual(len(bi), 2)
59 self.assert_(isinstance(bi[0], int))
60 self.assert_(isinstance(bi[1], int))
61 self.assertEqual(bi[1], len(a))
Martin v. Löwis99866332002-03-01 10:27:01 +000062
Walter Dörwald7fd94242003-05-18 00:47:47 +000063 def test_byteswap(self):
64 a = array.array(self.typecode, self.example)
65 self.assertRaises(TypeError, a.byteswap, 42)
66 if a.itemsize in (1, 2, 4, 8):
67 b = array.array(self.typecode, self.example)
68 b.byteswap()
69 if a.itemsize==1:
70 self.assertEqual(a, b)
71 else:
72 self.assertNotEqual(a, b)
73 b.byteswap()
74 self.assertEqual(a, b)
Martin v. Löwis99866332002-03-01 10:27:01 +000075
Walter Dörwald7fd94242003-05-18 00:47:47 +000076 def test_insert(self):
77 a = array.array(self.typecode, self.example)
78 a.insert(0, self.example[0])
79 self.assertEqual(len(a), 1+len(self.example))
80 self.assertEqual(a[0], a[1])
81 self.assertRaises(TypeError, a.insert)
82 self.assertRaises(TypeError, a.insert, None)
Martin v. Löwis99866332002-03-01 10:27:01 +000083
Walter Dörwald7fd94242003-05-18 00:47:47 +000084 def test_tofromfile(self):
85 a = array.array(self.typecode, 2*self.example)
86 self.assertRaises(TypeError, a.tofile)
87 self.assertRaises(TypeError, a.tofile, cStringIO.StringIO())
88 f = open(test_support.TESTFN, 'wb')
89 try:
90 a.tofile(f)
91 f.close()
92 b = array.array(self.typecode)
93 f = open(test_support.TESTFN, 'rb')
94 self.assertRaises(TypeError, b.fromfile)
95 self.assertRaises(
96 TypeError,
97 b.fromfile,
98 cStringIO.StringIO(), len(self.example)
99 )
100 b.fromfile(f, len(self.example))
101 self.assertEqual(b, array.array(self.typecode, self.example))
102 self.assertNotEqual(a, b)
103 b.fromfile(f, len(self.example))
104 self.assertEqual(a, b)
105 self.assertRaises(EOFError, b.fromfile, f, 1)
106 f.close()
107 finally:
108 if not f.closed:
109 f.close()
110 test_support.unlink(test_support.TESTFN)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000111
Walter Dörwald7fd94242003-05-18 00:47:47 +0000112 def test_tofromlist(self):
113 a = array.array(self.typecode, 2*self.example)
114 b = array.array(self.typecode)
115 self.assertRaises(TypeError, a.tolist, 42)
116 self.assertRaises(TypeError, b.fromlist)
117 self.assertRaises(TypeError, b.fromlist, 42)
118 self.assertRaises(TypeError, b.fromlist, [None])
119 b.fromlist(a.tolist())
120 self.assertEqual(a, b)
Fred Drake78334472000-06-28 17:50:51 +0000121
Walter Dörwald7fd94242003-05-18 00:47:47 +0000122 def test_tofromstring(self):
123 a = array.array(self.typecode, 2*self.example)
124 b = array.array(self.typecode)
125 self.assertRaises(TypeError, a.tostring, 42)
126 self.assertRaises(TypeError, b.fromstring)
127 self.assertRaises(TypeError, b.fromstring, 42)
128 b.fromstring(a.tostring())
129 self.assertEqual(a, b)
130 if a.itemsize>1:
131 self.assertRaises(ValueError, b.fromstring, "x")
Fred Drake78334472000-06-28 17:50:51 +0000132
Walter Dörwald7fd94242003-05-18 00:47:47 +0000133 def test_repr(self):
134 a = array.array(self.typecode, 2*self.example)
135 self.assertEqual(a, eval(repr(a), {"array": array.array}))
Fred Drake78334472000-06-28 17:50:51 +0000136
Walter Dörwald7fd94242003-05-18 00:47:47 +0000137 a = array.array(self.typecode)
138 self.assertEqual(repr(a), "array('%s')" % self.typecode)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000139
Walter Dörwald7fd94242003-05-18 00:47:47 +0000140 def test_str(self):
141 a = array.array(self.typecode, 2*self.example)
142 str(a)
Roger E. Masse8db1b071996-12-09 20:09:16 +0000143
Walter Dörwald7fd94242003-05-18 00:47:47 +0000144 def test_cmp(self):
145 a = array.array(self.typecode, self.example)
146 self.assert_((a == 42) is False)
147 self.assert_((a != 42) is True)
Tim Peterscc78e472000-11-14 21:36:07 +0000148
Walter Dörwald7fd94242003-05-18 00:47:47 +0000149 self.assert_((a == a) is True)
150 self.assert_((a != a) is False)
151 self.assert_((a < a) is False)
152 self.assert_((a <= a) is True)
153 self.assert_((a > a) is False)
154 self.assert_((a >= a) is True)
Tim Peterscc78e472000-11-14 21:36:07 +0000155
Walter Dörwald7fd94242003-05-18 00:47:47 +0000156 as = array.array(self.typecode, self.smallerexample)
157 ab = array.array(self.typecode, self.biggerexample)
Guido van Rossum7f1d3aa1998-07-16 15:31:43 +0000158
Walter Dörwald7fd94242003-05-18 00:47:47 +0000159 self.assert_((a == 2*a) is False)
160 self.assert_((a != 2*a) is True)
161 self.assert_((a < 2*a) is True)
162 self.assert_((a <= 2*a) is True)
163 self.assert_((a > 2*a) is False)
164 self.assert_((a >= 2*a) is False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000165
Walter Dörwald7fd94242003-05-18 00:47:47 +0000166 self.assert_((a == as) is False)
167 self.assert_((a != as) is True)
168 self.assert_((a < as) is False)
169 self.assert_((a <= as) is False)
170 self.assert_((a > as) is True)
171 self.assert_((a >= as) is True)
Martin v. Löwis99866332002-03-01 10:27:01 +0000172
Walter Dörwald7fd94242003-05-18 00:47:47 +0000173 self.assert_((a == ab) is False)
174 self.assert_((a != ab) is True)
175 self.assert_((a < ab) is True)
176 self.assert_((a <= ab) is True)
177 self.assert_((a > ab) is False)
178 self.assert_((a >= ab) is False)
Martin v. Löwis99866332002-03-01 10:27:01 +0000179
Walter Dörwald7fd94242003-05-18 00:47:47 +0000180 def test_add(self):
181 a = array.array(self.typecode, self.example) \
182 + array.array(self.typecode, self.example[::-1])
183 self.assertEqual(
184 a,
185 array.array(self.typecode, self.example + self.example[::-1])
186 )
Martin v. Löwis99866332002-03-01 10:27:01 +0000187
Walter Dörwald7fd94242003-05-18 00:47:47 +0000188 b = array.array(self.badtypecode())
189 self.assertRaises(TypeError, a.__add__, b)
190
191 self.assertRaises(TypeError, a.__add__, "bad")
192
193 def test_iadd(self):
194 a = array.array(self.typecode, self.example[::-1])
195 b = a
196 a += array.array(self.typecode, 2*self.example)
197 self.assert_(a is b)
198 self.assertEqual(
199 a,
200 array.array(self.typecode, self.example[::-1]+2*self.example)
201 )
202
203 b = array.array(self.badtypecode())
204 self.assertRaises(TypeError, a.__add__, b)
205
206 self.assertRaises(TypeError, a.__iadd__, "bad")
207
208 def test_mul(self):
209 a = 5*array.array(self.typecode, self.example)
210 self.assertEqual(
211 a,
212 array.array(self.typecode, 5*self.example)
213 )
214
215 a = array.array(self.typecode, self.example)*5
216 self.assertEqual(
217 a,
218 array.array(self.typecode, self.example*5)
219 )
220
221 a = 0*array.array(self.typecode, self.example)
222 self.assertEqual(
223 a,
224 array.array(self.typecode)
225 )
226
227 a = (-1)*array.array(self.typecode, self.example)
228 self.assertEqual(
229 a,
230 array.array(self.typecode)
231 )
232
233 self.assertRaises(TypeError, a.__mul__, "bad")
234
235 def test_imul(self):
236 a = array.array(self.typecode, self.example)
237 b = a
238
239 a *= 5
240 self.assert_(a is b)
241 self.assertEqual(
242 a,
243 array.array(self.typecode, 5*self.example)
244 )
245
246 a *= 0
247 self.assert_(a is b)
248 self.assertEqual(a, array.array(self.typecode))
249
250 a *= 1000
251 self.assert_(a is b)
252 self.assertEqual(a, array.array(self.typecode))
253
254 a *= -1
255 self.assert_(a is b)
256 self.assertEqual(a, array.array(self.typecode))
257
258 a = array.array(self.typecode, self.example)
259 a *= -1
260 self.assertEqual(a, array.array(self.typecode))
261
262 self.assertRaises(TypeError, a.__imul__, "bad")
263
264 def test_getitem(self):
265 a = array.array(self.typecode, self.example)
266 self.assertEntryEqual(a[0], self.example[0])
267 self.assertEntryEqual(a[0L], self.example[0])
268 self.assertEntryEqual(a[-1], self.example[-1])
269 self.assertEntryEqual(a[-1L], self.example[-1])
270 self.assertEntryEqual(a[len(self.example)-1], self.example[-1])
271 self.assertEntryEqual(a[-len(self.example)], self.example[0])
272 self.assertRaises(TypeError, a.__getitem__)
273 self.assertRaises(IndexError, a.__getitem__, len(self.example))
274 self.assertRaises(IndexError, a.__getitem__, -len(self.example)-1)
275
276 def test_setitem(self):
277 a = array.array(self.typecode, self.example)
278 a[0] = a[-1]
279 self.assertEntryEqual(a[0], a[-1])
280
281 a = array.array(self.typecode, self.example)
282 a[0L] = a[-1]
283 self.assertEntryEqual(a[0], a[-1])
284
285 a = array.array(self.typecode, self.example)
286 a[-1] = a[0]
287 self.assertEntryEqual(a[0], a[-1])
288
289 a = array.array(self.typecode, self.example)
290 a[-1L] = a[0]
291 self.assertEntryEqual(a[0], a[-1])
292
293 a = array.array(self.typecode, self.example)
294 a[len(self.example)-1] = a[0]
295 self.assertEntryEqual(a[0], a[-1])
296
297 a = array.array(self.typecode, self.example)
298 a[-len(self.example)] = a[-1]
299 self.assertEntryEqual(a[0], a[-1])
300
301 self.assertRaises(TypeError, a.__setitem__)
302 self.assertRaises(TypeError, a.__setitem__, None)
303 self.assertRaises(TypeError, a.__setitem__, 0, None)
304 self.assertRaises(
305 IndexError,
306 a.__setitem__,
307 len(self.example), self.example[0]
308 )
309 self.assertRaises(
310 IndexError,
311 a.__setitem__,
312 -len(self.example)-1, self.example[0]
313 )
314
315 def test_delitem(self):
316 a = array.array(self.typecode, self.example)
317 del a[0]
318 self.assertEqual(
319 a,
320 array.array(self.typecode, self.example[1:])
321 )
322
323 a = array.array(self.typecode, self.example)
324 del a[-1]
325 self.assertEqual(
326 a,
327 array.array(self.typecode, self.example[:-1])
328 )
329
330 a = array.array(self.typecode, self.example)
331 del a[len(self.example)-1]
332 self.assertEqual(
333 a,
334 array.array(self.typecode, self.example[:-1])
335 )
336
337 a = array.array(self.typecode, self.example)
338 del a[-len(self.example)]
339 self.assertEqual(
340 a,
341 array.array(self.typecode, self.example[1:])
342 )
343
344 self.assertRaises(TypeError, a.__delitem__)
345 self.assertRaises(TypeError, a.__delitem__, None)
346 self.assertRaises(IndexError, a.__delitem__, len(self.example))
347 self.assertRaises(IndexError, a.__delitem__, -len(self.example)-1)
348
349 def test_getslice(self):
350 a = array.array(self.typecode, self.example)
351 self.assertEqual(a[:], a)
352
353 self.assertEqual(
354 a[1:],
355 array.array(self.typecode, self.example[1:])
356 )
357
358 self.assertEqual(
359 a[:1],
360 array.array(self.typecode, self.example[:1])
361 )
362
363 self.assertEqual(
364 a[:-1],
365 array.array(self.typecode, self.example[:-1])
366 )
367
368 self.assertEqual(
369 a[-1:],
370 array.array(self.typecode, self.example[-1:])
371 )
372
373 self.assertEqual(
374 a[-1:-1],
375 array.array(self.typecode)
376 )
377
378 self.assertEqual(
379 a[1000:],
380 array.array(self.typecode)
381 )
382 self.assertEqual(a[-1000:], a)
383 self.assertEqual(a[:1000], a)
384 self.assertEqual(
385 a[:-1000],
386 array.array(self.typecode)
387 )
388 self.assertEqual(a[-1000:1000], a)
389 self.assertEqual(
390 a[2000:1000],
391 array.array(self.typecode)
392 )
393
394 def test_setslice(self):
395 a = array.array(self.typecode, self.example)
396 a[:1] = a
397 self.assertEqual(
398 a,
399 array.array(self.typecode, self.example + self.example[1:])
400 )
401
402 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000403 a[:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000404 self.assertEqual(
405 a,
406 array.array(self.typecode, self.example + self.example[-1:])
407 )
408
409 a = array.array(self.typecode, self.example)
410 a[-1:] = a
411 self.assertEqual(
412 a,
413 array.array(self.typecode, self.example[:-1] + self.example)
414 )
415
416 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000417 a[1:] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000418 self.assertEqual(
419 a,
420 array.array(self.typecode, self.example[:1] + self.example)
421 )
422
423 a = array.array(self.typecode, self.example)
Fred Drake004d5e62000-10-23 17:22:08 +0000424 a[1:-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000425 self.assertEqual(
426 a,
427 array.array(
428 self.typecode,
429 self.example[:1] + self.example + self.example[-1:]
430 )
431 )
432
433 a = array.array(self.typecode, self.example)
434 a[1000:] = a
435 self.assertEqual(
436 a,
437 array.array(self.typecode, 2*self.example)
438 )
439
440 a = array.array(self.typecode, self.example)
441 a[-1000:] = a
442 self.assertEqual(
443 a,
444 array.array(self.typecode, self.example)
445 )
446
447 a = array.array(self.typecode, self.example)
448 a[:1000] = a
449 self.assertEqual(
450 a,
451 array.array(self.typecode, self.example)
452 )
453
454 a = array.array(self.typecode, self.example)
455 a[:-1000] = a
456 self.assertEqual(
457 a,
458 array.array(self.typecode, 2*self.example)
459 )
460
461 a = array.array(self.typecode, self.example)
462 a[1:0] = a
463 self.assertEqual(
464 a,
465 array.array(self.typecode, self.example[:1] + self.example + self.example[1:])
466 )
467
468 a = array.array(self.typecode, self.example)
469 a[2000:1000] = a
470 self.assertEqual(
471 a,
472 array.array(self.typecode, 2*self.example)
473 )
474
475 a = array.array(self.typecode, self.example)
476 self.assertRaises(TypeError, a.__setslice__, 0, 0, None)
477 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), None)
478
479 b = array.array(self.badtypecode())
480 self.assertRaises(TypeError, a.__setslice__, 0, 0, b)
481 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), b)
482
483 def test_index(self):
484 example = 2*self.example
485 a = array.array(self.typecode, example)
486 self.assertRaises(TypeError, a.index)
487 for x in example:
488 self.assertEqual(a.index(x), example.index(x))
489 self.assertRaises(ValueError, a.index, None)
490 self.assertRaises(ValueError, a.index, self.outside)
491
492 def test_count(self):
493 example = 2*self.example
494 a = array.array(self.typecode, example)
495 self.assertRaises(TypeError, a.count)
496 for x in example:
497 self.assertEqual(a.count(x), example.count(x))
498 self.assertEqual(a.count(self.outside), 0)
499 self.assertEqual(a.count(None), 0)
500
501 def test_remove(self):
502 for x in self.example:
503 example = 2*self.example
504 a = array.array(self.typecode, example)
505 pos = example.index(x)
506 example2 = example[:pos] + example[pos+1:]
507 a.remove(x)
508 self.assertEqual(a, array.array(self.typecode, example2))
509
510 a = array.array(self.typecode, self.example)
511 self.assertRaises(ValueError, a.remove, self.outside)
512
513 self.assertRaises(ValueError, a.remove, None)
514
515 def test_pop(self):
516 a = array.array(self.typecode)
517 self.assertRaises(IndexError, a.pop)
518
519 a = array.array(self.typecode, 2*self.example)
520 self.assertRaises(TypeError, a.pop, 42, 42)
521 self.assertRaises(TypeError, a.pop, None)
522 self.assertRaises(IndexError, a.pop, len(a))
523 self.assertRaises(IndexError, a.pop, -len(a)-1)
524
525 self.assertEntryEqual(a.pop(0), self.example[0])
526 self.assertEqual(
527 a,
528 array.array(self.typecode, self.example[1:]+self.example)
529 )
530 self.assertEntryEqual(a.pop(1), self.example[2])
531 self.assertEqual(
532 a,
533 array.array(self.typecode, self.example[1:2]+self.example[3:]+self.example)
534 )
535 self.assertEntryEqual(a.pop(0), self.example[1])
536 self.assertEntryEqual(a.pop(), self.example[-1])
537 self.assertEqual(
538 a,
539 array.array(self.typecode, self.example[3:]+self.example[:-1])
540 )
541
542 def test_reverse(self):
543 a = array.array(self.typecode, self.example)
544 self.assertRaises(TypeError, a.reverse, 42)
Fred Drake004d5e62000-10-23 17:22:08 +0000545 a.reverse()
Walter Dörwald7fd94242003-05-18 00:47:47 +0000546 self.assertEqual(
547 a,
548 array.array(self.typecode, self.example[::-1])
549 )
550
551 def test_extend(self):
552 a = array.array(self.typecode, self.example)
553 self.assertRaises(TypeError, a.extend)
554 a.extend(array.array(self.typecode, self.example[::-1]))
555 self.assertEqual(
556 a,
557 array.array(self.typecode, self.example+self.example[::-1])
558 )
559
560 b = array.array(self.badtypecode())
561 self.assertRaises(TypeError, a.extend, b)
562
563 def test_coveritertraverse(self):
564 try:
565 import gc
566 except ImportError:
567 return
568 a = array.array(self.typecode)
569 l = [iter(a)]
570 l.append(l)
571 gc.collect()
572
573 def test_buffer(self):
574 a = array.array(self.typecode, self.example)
575 b = buffer(a)
576 self.assertEqual(b[0], a.tostring()[0])
577
578class StringTest(BaseTest):
579
580 def test_setitem(self):
581 super(StringTest, self).test_setitem()
582 a = array.array(self.typecode, self.example)
583 self.assertRaises(TypeError, a.__setitem__, 0, self.example[:2])
584
585class CharacterTest(StringTest):
586 typecode = 'c'
587 example = '\x01azAZ\x00\xfe'
588 smallerexample = '\x01azAY\x00\xfe'
589 biggerexample = '\x01azAZ\x00\xff'
590 outside = '\x33'
591 minitemsize = 1
592
593 def test_subbclassing(self):
594 class EditableString(array.array):
595 def __new__(cls, s, *args, **kwargs):
596 return array.array.__new__(cls, 'c', s)
597
598 def __init__(self, s, color='blue'):
599 array.array.__init__(self, 'c', s)
600 self.color = color
601
602 def strip(self):
603 self[:] = array.array('c', self.tostring().strip())
604
605 def __repr__(self):
606 return 'EditableString(%r)' % self.tostring()
607
608 s = EditableString("\ttest\r\n")
609 s.strip()
610 self.assertEqual(s.tostring(), "test")
611
612 self.assertEqual(s.color, "blue")
613 s.color = "red"
614 self.assertEqual(s.color, "red")
615 self.assertEqual(s.__dict__.keys(), ["color"])
616
617 def test_nounicode(self):
618 a = array.array(self.typecode, self.example)
619 self.assertRaises(ValueError, a.fromunicode, unicode(''))
620 self.assertRaises(ValueError, a.tounicode)
621
622tests.append(CharacterTest)
623
624if test_support.have_unicode:
625 class UnicodeTest(StringTest):
626 typecode = 'u'
627 example = unicode(r'\x01\u263a\x00\ufeff', 'unicode-escape')
628 smallerexample = unicode(r'\x01\u263a\x00\ufefe', 'unicode-escape')
629 biggerexample = unicode(r'\x01\u263a\x01\ufeff', 'unicode-escape')
630 outside = unicode('\x33')
631 minitemsize = 2
632
633 def test_unicode(self):
634 self.assertRaises(TypeError, array.array, 'b', unicode('foo', 'ascii'))
635
636 a = array.array('u', unicode(r'\xa0\xc2\u1234', 'unicode-escape'))
637 a.fromunicode(unicode(' ', 'ascii'))
638 a.fromunicode(unicode('', 'ascii'))
639 a.fromunicode(unicode('', 'ascii'))
640 a.fromunicode(unicode(r'\x11abc\xff\u1234', 'unicode-escape'))
641 s = a.tounicode()
642 self.assertEqual(
643 s,
644 unicode(r'\xa0\xc2\u1234 \x11abc\xff\u1234', 'unicode-escape')
645 )
646
647 s = unicode(r'\x00="\'a\\b\x80\xff\u0000\u0001\u1234', 'unicode-escape')
648 a = array.array('u', s)
649 self.assertEqual(
650 repr(a),
651 r"""array('u', u'\x00="\'a\\b\x80\xff\x00\x01\u1234')"""
652 )
653
654 self.assertRaises(TypeError, a.fromunicode)
655
656 tests.append(UnicodeTest)
657
658class NumberTest(BaseTest):
659
660 def test_extslice(self):
661 a = array.array(self.typecode, range(5))
662 self.assertEqual(a[::], a)
663 self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
664 self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
665 self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
666 self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
667 self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
668 self.assertEqual(a[-100:100:], a)
669 self.assertEqual(a[100:-100:-1], a[::-1])
670 self.assertEqual(a[-100L:100L:2L], array.array(self.typecode, [0,2,4]))
671 self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
672 self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
673
674 def test_delslice(self):
675 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +0000676 del a[::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000677 self.assertEqual(a, array.array(self.typecode, [1,3]))
678 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +0000679 del a[1::2]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000680 self.assertEqual(a, array.array(self.typecode, [0,2,4]))
681 a = array.array(self.typecode, range(5))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +0000682 del a[1::-2]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000683 self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
684 a = array.array(self.typecode, range(10))
Michael W. Hudson56796f62002-07-29 14:35:04 +0000685 del a[::1000]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000686 self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
687
688 def test_assignment(self):
689 a = array.array(self.typecode, range(10))
690 a[::2] = array.array(self.typecode, [42]*5)
691 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
692 a = array.array(self.typecode, range(10))
693 a[::-4] = array.array(self.typecode, [10]*3)
694 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
695 a = array.array(self.typecode, range(4))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +0000696 a[::-1] = a
Walter Dörwald7fd94242003-05-18 00:47:47 +0000697 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
698 a = array.array(self.typecode, range(10))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +0000699 b = a[:]
700 c = a[:]
Walter Dörwald7fd94242003-05-18 00:47:47 +0000701 ins = array.array(self.typecode, range(2))
Michael W. Hudson9c14bad2002-06-19 15:44:15 +0000702 a[2:3] = ins
703 b[slice(2,3)] = ins
704 c[2:3:] = ins
Fred Drake004d5e62000-10-23 17:22:08 +0000705
Walter Dörwald7fd94242003-05-18 00:47:47 +0000706 def test_iterationcontains(self):
707 a = array.array(self.typecode, range(10))
708 self.assertEqual(list(a), range(10))
709 b = array.array(self.typecode, [20])
710 self.assertEqual(a[-1] in a, True)
711 self.assertEqual(b[0] not in a, True)
712
713 def check_overflow(self, lower, upper):
714 # method to be used by subclasses
715
716 # should not overflow assigning lower limit
717 a = array.array(self.typecode, [lower])
718 a[0] = lower
719 # should overflow assigning less than lower limit
720 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
721 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
722 # should not overflow assigning upper limit
723 a = array.array(self.typecode, [upper])
724 a[0] = upper
725 # should overflow assigning more than upper limit
726 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
727 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
728
729 def test_subclassing(self):
730 typecode = self.typecode
731 class ExaggeratingArray(array.array):
732 __slots__ = ['offset']
733
734 def __new__(cls, typecode, data, offset):
735 return array.array.__new__(cls, typecode, data)
736
737 def __init__(self, typecode, data, offset):
738 self.offset = offset
739
740 def __getitem__(self, i):
741 return array.array.__getitem__(self, i) + self.offset
742
743 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
744 self.assertEntryEqual(a[0], 7)
745
746 self.assertRaises(AttributeError, setattr, a, "color", "blue")
747
748class SignedNumberTest(NumberTest):
749 example = [-1, 0, 1, 42, 0x7f]
750 smallerexample = [-1, 0, 1, 42, 0x7e]
751 biggerexample = [-1, 0, 1, 43, 0x7f]
752 outside = 23
753
754 def test_overflow(self):
755 a = array.array(self.typecode)
756 lower = -1 * long(pow(2, a.itemsize * 8 - 1))
757 upper = long(pow(2, a.itemsize * 8 - 1)) - 1L
758 self.check_overflow(lower, upper)
759
760class UnsignedNumberTest(NumberTest):
761 example = [0, 1, 17, 23, 42, 0xff]
762 smallerexample = [0, 1, 17, 23, 42, 0xfe]
763 biggerexample = [0, 1, 17, 23, 43, 0xff]
764 outside = 0xaa
765
766 def test_overflow(self):
767 a = array.array(self.typecode)
768 lower = 0
769 upper = long(pow(2, a.itemsize * 8)) - 1L
770 self.check_overflow(lower, upper)
Fred Drake004d5e62000-10-23 17:22:08 +0000771
772
Walter Dörwald7fd94242003-05-18 00:47:47 +0000773class ByteTest(SignedNumberTest):
774 typecode = 'b'
775 minitemsize = 1
776tests.append(ByteTest)
Fred Drake004d5e62000-10-23 17:22:08 +0000777
Walter Dörwald7fd94242003-05-18 00:47:47 +0000778class UnsignedByteTest(UnsignedNumberTest):
779 typecode = 'B'
780 minitemsize = 1
781tests.append(UnsignedByteTest)
782
783class ShortTest(SignedNumberTest):
784 typecode = 'h'
785 minitemsize = 2
786tests.append(ShortTest)
787
788class UnsignedShortTest(UnsignedNumberTest):
789 typecode = 'H'
790 minitemsize = 2
791tests.append(UnsignedShortTest)
792
793class IntTest(SignedNumberTest):
794 typecode = 'i'
795 minitemsize = 2
796tests.append(IntTest)
797
798class UnsignedIntTest(UnsignedNumberTest):
799 typecode = 'I'
800 minitemsize = 2
801tests.append(UnsignedIntTest)
802
803class LongTest(SignedNumberTest):
804 typecode = 'l'
805 minitemsize = 4
806tests.append(LongTest)
807
808class UnsignedLongTest(UnsignedNumberTest):
809 typecode = 'L'
810 minitemsize = 4
811tests.append(UnsignedLongTest)
812
813class FPTest(NumberTest):
814 example = [-42.0, 0, 42, 1e5, -1e10]
815 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
816 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
817 outside = 23
818
819 def assertEntryEqual(self, entry1, entry2):
820 self.assertAlmostEqual(entry1, entry2)
821
822class FloatTest(FPTest):
823 typecode = 'f'
824 minitemsize = 4
825tests.append(FloatTest)
826
827class DoubleTest(FPTest):
828 typecode = 'd'
829 minitemsize = 8
830tests.append(DoubleTest)
831
832def test_main():
833 test_support.run_unittest(*tests)
834
835if __name__=="__main__":
836 test_main()
837
838
839#main()