Silence some py3k warnings claiming to affect _pyio
[python.git] / Lib / test / test_array.py
blob63f7083d337341c5827771f94021b5b40a4e2565
1 #! /usr/bin/env python
2 """Test the arraymodule.
3 Roger E. Masse
4 """
6 import unittest
7 from test import test_support
8 from weakref import proxy
9 import array, cStringIO
10 from cPickle import loads, dumps, HIGHEST_PROTOCOL
12 class ArraySubclass(array.array):
13 pass
15 class ArraySubclassWithKwargs(array.array):
16 def __init__(self, typecode, newarg=None):
17 array.array.__init__(typecode)
19 tests = [] # list to accumulate all tests
20 typecodes = "cubBhHiIlLfd"
22 class BadConstructorTest(unittest.TestCase):
24 def test_constructor(self):
25 self.assertRaises(TypeError, array.array)
26 self.assertRaises(TypeError, array.array, spam=42)
27 self.assertRaises(TypeError, array.array, 'xx')
28 self.assertRaises(ValueError, array.array, 'x')
30 tests.append(BadConstructorTest)
32 class BaseTest(unittest.TestCase):
33 # Required class attributes (provided by subclasses
34 # typecode: the typecode to test
35 # example: an initializer usable in the constructor for this type
36 # smallerexample: the same length as example, but smaller
37 # biggerexample: the same length as example, but bigger
38 # outside: An entry that is not in example
39 # minitemsize: the minimum guaranteed itemsize
41 def assertEntryEqual(self, entry1, entry2):
42 self.assertEqual(entry1, entry2)
44 def badtypecode(self):
45 # Return a typecode that is different from our own
46 return typecodes[(typecodes.index(self.typecode)+1) % len(typecodes)]
48 def test_constructor(self):
49 a = array.array(self.typecode)
50 self.assertEqual(a.typecode, self.typecode)
51 self.assertTrue(a.itemsize>=self.minitemsize)
52 self.assertRaises(TypeError, array.array, self.typecode, None)
54 def test_len(self):
55 a = array.array(self.typecode)
56 a.append(self.example[0])
57 self.assertEqual(len(a), 1)
59 a = array.array(self.typecode, self.example)
60 self.assertEqual(len(a), len(self.example))
62 def test_buffer_info(self):
63 a = array.array(self.typecode, self.example)
64 self.assertRaises(TypeError, a.buffer_info, 42)
65 bi = a.buffer_info()
66 self.assertTrue(isinstance(bi, tuple))
67 self.assertEqual(len(bi), 2)
68 self.assertTrue(isinstance(bi[0], (int, long)))
69 self.assertTrue(isinstance(bi[1], int))
70 self.assertEqual(bi[1], len(a))
72 def test_byteswap(self):
73 a = array.array(self.typecode, self.example)
74 self.assertRaises(TypeError, a.byteswap, 42)
75 if a.itemsize in (1, 2, 4, 8):
76 b = array.array(self.typecode, self.example)
77 b.byteswap()
78 if a.itemsize==1:
79 self.assertEqual(a, b)
80 else:
81 self.assertNotEqual(a, b)
82 b.byteswap()
83 self.assertEqual(a, b)
85 def test_copy(self):
86 import copy
87 a = array.array(self.typecode, self.example)
88 b = copy.copy(a)
89 self.assertNotEqual(id(a), id(b))
90 self.assertEqual(a, b)
92 def test_deepcopy(self):
93 import copy
94 a = array.array(self.typecode, self.example)
95 b = copy.deepcopy(a)
96 self.assertNotEqual(id(a), id(b))
97 self.assertEqual(a, b)
99 def test_pickle(self):
100 for protocol in range(HIGHEST_PROTOCOL + 1):
101 a = array.array(self.typecode, self.example)
102 b = loads(dumps(a, protocol))
103 self.assertNotEqual(id(a), id(b))
104 self.assertEqual(a, b)
106 a = ArraySubclass(self.typecode, self.example)
107 a.x = 10
108 b = loads(dumps(a, protocol))
109 self.assertNotEqual(id(a), id(b))
110 self.assertEqual(a, b)
111 self.assertEqual(a.x, b.x)
112 self.assertEqual(type(a), type(b))
114 def test_pickle_for_empty_array(self):
115 for protocol in range(HIGHEST_PROTOCOL + 1):
116 a = array.array(self.typecode)
117 b = loads(dumps(a, protocol))
118 self.assertNotEqual(id(a), id(b))
119 self.assertEqual(a, b)
121 a = ArraySubclass(self.typecode)
122 a.x = 10
123 b = loads(dumps(a, protocol))
124 self.assertNotEqual(id(a), id(b))
125 self.assertEqual(a, b)
126 self.assertEqual(a.x, b.x)
127 self.assertEqual(type(a), type(b))
129 def test_insert(self):
130 a = array.array(self.typecode, self.example)
131 a.insert(0, self.example[0])
132 self.assertEqual(len(a), 1+len(self.example))
133 self.assertEqual(a[0], a[1])
134 self.assertRaises(TypeError, a.insert)
135 self.assertRaises(TypeError, a.insert, None)
136 self.assertRaises(TypeError, a.insert, 0, None)
138 a = array.array(self.typecode, self.example)
139 a.insert(-1, self.example[0])
140 self.assertEqual(
142 array.array(
143 self.typecode,
144 self.example[:-1] + self.example[:1] + self.example[-1:]
148 a = array.array(self.typecode, self.example)
149 a.insert(-1000, self.example[0])
150 self.assertEqual(
152 array.array(self.typecode, self.example[:1] + self.example)
155 a = array.array(self.typecode, self.example)
156 a.insert(1000, self.example[0])
157 self.assertEqual(
159 array.array(self.typecode, self.example + self.example[:1])
162 def test_tofromfile(self):
163 a = array.array(self.typecode, 2*self.example)
164 self.assertRaises(TypeError, a.tofile)
165 self.assertRaises(TypeError, a.tofile, cStringIO.StringIO())
166 test_support.unlink(test_support.TESTFN)
167 f = open(test_support.TESTFN, 'wb')
168 try:
169 a.tofile(f)
170 f.close()
171 b = array.array(self.typecode)
172 f = open(test_support.TESTFN, 'rb')
173 self.assertRaises(TypeError, b.fromfile)
174 self.assertRaises(
175 TypeError,
176 b.fromfile,
177 cStringIO.StringIO(), len(self.example)
179 b.fromfile(f, len(self.example))
180 self.assertEqual(b, array.array(self.typecode, self.example))
181 self.assertNotEqual(a, b)
182 b.fromfile(f, len(self.example))
183 self.assertEqual(a, b)
184 self.assertRaises(EOFError, b.fromfile, f, 1)
185 f.close()
186 finally:
187 if not f.closed:
188 f.close()
189 test_support.unlink(test_support.TESTFN)
191 def test_filewrite(self):
192 a = array.array(self.typecode, 2*self.example)
193 f = open(test_support.TESTFN, 'wb')
194 try:
195 f.write(a)
196 f.close()
197 b = array.array(self.typecode)
198 f = open(test_support.TESTFN, 'rb')
199 b.fromfile(f, len(self.example))
200 self.assertEqual(b, array.array(self.typecode, self.example))
201 self.assertNotEqual(a, b)
202 b.fromfile(f, len(self.example))
203 self.assertEqual(a, b)
204 f.close()
205 finally:
206 if not f.closed:
207 f.close()
208 test_support.unlink(test_support.TESTFN)
210 def test_tofromlist(self):
211 a = array.array(self.typecode, 2*self.example)
212 b = array.array(self.typecode)
213 self.assertRaises(TypeError, a.tolist, 42)
214 self.assertRaises(TypeError, b.fromlist)
215 self.assertRaises(TypeError, b.fromlist, 42)
216 self.assertRaises(TypeError, b.fromlist, [None])
217 b.fromlist(a.tolist())
218 self.assertEqual(a, b)
220 def test_tofromstring(self):
221 a = array.array(self.typecode, 2*self.example)
222 b = array.array(self.typecode)
223 self.assertRaises(TypeError, a.tostring, 42)
224 self.assertRaises(TypeError, b.fromstring)
225 self.assertRaises(TypeError, b.fromstring, 42)
226 b.fromstring(a.tostring())
227 self.assertEqual(a, b)
228 if a.itemsize>1:
229 self.assertRaises(ValueError, b.fromstring, "x")
231 def test_repr(self):
232 a = array.array(self.typecode, 2*self.example)
233 self.assertEqual(a, eval(repr(a), {"array": array.array}))
235 a = array.array(self.typecode)
236 self.assertEqual(repr(a), "array('%s')" % self.typecode)
238 def test_str(self):
239 a = array.array(self.typecode, 2*self.example)
240 str(a)
242 def test_cmp(self):
243 a = array.array(self.typecode, self.example)
244 self.assertTrue((a == 42) is False)
245 self.assertTrue((a != 42) is True)
247 self.assertTrue((a == a) is True)
248 self.assertTrue((a != a) is False)
249 self.assertTrue((a < a) is False)
250 self.assertTrue((a <= a) is True)
251 self.assertTrue((a > a) is False)
252 self.assertTrue((a >= a) is True)
254 al = array.array(self.typecode, self.smallerexample)
255 ab = array.array(self.typecode, self.biggerexample)
257 self.assertTrue((a == 2*a) is False)
258 self.assertTrue((a != 2*a) is True)
259 self.assertTrue((a < 2*a) is True)
260 self.assertTrue((a <= 2*a) is True)
261 self.assertTrue((a > 2*a) is False)
262 self.assertTrue((a >= 2*a) is False)
264 self.assertTrue((a == al) is False)
265 self.assertTrue((a != al) is True)
266 self.assertTrue((a < al) is False)
267 self.assertTrue((a <= al) is False)
268 self.assertTrue((a > al) is True)
269 self.assertTrue((a >= al) is True)
271 self.assertTrue((a == ab) is False)
272 self.assertTrue((a != ab) is True)
273 self.assertTrue((a < ab) is True)
274 self.assertTrue((a <= ab) is True)
275 self.assertTrue((a > ab) is False)
276 self.assertTrue((a >= ab) is False)
278 def test_add(self):
279 a = array.array(self.typecode, self.example) \
280 + array.array(self.typecode, self.example[::-1])
281 self.assertEqual(
283 array.array(self.typecode, self.example + self.example[::-1])
286 b = array.array(self.badtypecode())
287 self.assertRaises(TypeError, a.__add__, b)
289 self.assertRaises(TypeError, a.__add__, "bad")
291 def test_iadd(self):
292 a = array.array(self.typecode, self.example[::-1])
293 b = a
294 a += array.array(self.typecode, 2*self.example)
295 self.assertTrue(a is b)
296 self.assertEqual(
298 array.array(self.typecode, self.example[::-1]+2*self.example)
300 a = array.array(self.typecode, self.example)
301 a += a
302 self.assertEqual(
304 array.array(self.typecode, self.example + self.example)
307 b = array.array(self.badtypecode())
308 self.assertRaises(TypeError, a.__add__, b)
310 self.assertRaises(TypeError, a.__iadd__, "bad")
312 def test_mul(self):
313 a = 5*array.array(self.typecode, self.example)
314 self.assertEqual(
316 array.array(self.typecode, 5*self.example)
319 a = array.array(self.typecode, self.example)*5
320 self.assertEqual(
322 array.array(self.typecode, self.example*5)
325 a = 0*array.array(self.typecode, self.example)
326 self.assertEqual(
328 array.array(self.typecode)
331 a = (-1)*array.array(self.typecode, self.example)
332 self.assertEqual(
334 array.array(self.typecode)
337 self.assertRaises(TypeError, a.__mul__, "bad")
339 def test_imul(self):
340 a = array.array(self.typecode, self.example)
341 b = a
343 a *= 5
344 self.assertTrue(a is b)
345 self.assertEqual(
347 array.array(self.typecode, 5*self.example)
350 a *= 0
351 self.assertTrue(a is b)
352 self.assertEqual(a, array.array(self.typecode))
354 a *= 1000
355 self.assertTrue(a is b)
356 self.assertEqual(a, array.array(self.typecode))
358 a *= -1
359 self.assertTrue(a is b)
360 self.assertEqual(a, array.array(self.typecode))
362 a = array.array(self.typecode, self.example)
363 a *= -1
364 self.assertEqual(a, array.array(self.typecode))
366 self.assertRaises(TypeError, a.__imul__, "bad")
368 def test_getitem(self):
369 a = array.array(self.typecode, self.example)
370 self.assertEntryEqual(a[0], self.example[0])
371 self.assertEntryEqual(a[0L], self.example[0])
372 self.assertEntryEqual(a[-1], self.example[-1])
373 self.assertEntryEqual(a[-1L], self.example[-1])
374 self.assertEntryEqual(a[len(self.example)-1], self.example[-1])
375 self.assertEntryEqual(a[-len(self.example)], self.example[0])
376 self.assertRaises(TypeError, a.__getitem__)
377 self.assertRaises(IndexError, a.__getitem__, len(self.example))
378 self.assertRaises(IndexError, a.__getitem__, -len(self.example)-1)
380 def test_setitem(self):
381 a = array.array(self.typecode, self.example)
382 a[0] = a[-1]
383 self.assertEntryEqual(a[0], a[-1])
385 a = array.array(self.typecode, self.example)
386 a[0L] = a[-1]
387 self.assertEntryEqual(a[0], a[-1])
389 a = array.array(self.typecode, self.example)
390 a[-1] = a[0]
391 self.assertEntryEqual(a[0], a[-1])
393 a = array.array(self.typecode, self.example)
394 a[-1L] = a[0]
395 self.assertEntryEqual(a[0], a[-1])
397 a = array.array(self.typecode, self.example)
398 a[len(self.example)-1] = a[0]
399 self.assertEntryEqual(a[0], a[-1])
401 a = array.array(self.typecode, self.example)
402 a[-len(self.example)] = a[-1]
403 self.assertEntryEqual(a[0], a[-1])
405 self.assertRaises(TypeError, a.__setitem__)
406 self.assertRaises(TypeError, a.__setitem__, None)
407 self.assertRaises(TypeError, a.__setitem__, 0, None)
408 self.assertRaises(
409 IndexError,
410 a.__setitem__,
411 len(self.example), self.example[0]
413 self.assertRaises(
414 IndexError,
415 a.__setitem__,
416 -len(self.example)-1, self.example[0]
419 def test_delitem(self):
420 a = array.array(self.typecode, self.example)
421 del a[0]
422 self.assertEqual(
424 array.array(self.typecode, self.example[1:])
427 a = array.array(self.typecode, self.example)
428 del a[-1]
429 self.assertEqual(
431 array.array(self.typecode, self.example[:-1])
434 a = array.array(self.typecode, self.example)
435 del a[len(self.example)-1]
436 self.assertEqual(
438 array.array(self.typecode, self.example[:-1])
441 a = array.array(self.typecode, self.example)
442 del a[-len(self.example)]
443 self.assertEqual(
445 array.array(self.typecode, self.example[1:])
448 self.assertRaises(TypeError, a.__delitem__)
449 self.assertRaises(TypeError, a.__delitem__, None)
450 self.assertRaises(IndexError, a.__delitem__, len(self.example))
451 self.assertRaises(IndexError, a.__delitem__, -len(self.example)-1)
453 def test_getslice(self):
454 a = array.array(self.typecode, self.example)
455 self.assertEqual(a[:], a)
457 self.assertEqual(
458 a[1:],
459 array.array(self.typecode, self.example[1:])
462 self.assertEqual(
463 a[:1],
464 array.array(self.typecode, self.example[:1])
467 self.assertEqual(
468 a[:-1],
469 array.array(self.typecode, self.example[:-1])
472 self.assertEqual(
473 a[-1:],
474 array.array(self.typecode, self.example[-1:])
477 self.assertEqual(
478 a[-1:-1],
479 array.array(self.typecode)
482 self.assertEqual(
483 a[2:1],
484 array.array(self.typecode)
487 self.assertEqual(
488 a[1000:],
489 array.array(self.typecode)
491 self.assertEqual(a[-1000:], a)
492 self.assertEqual(a[:1000], a)
493 self.assertEqual(
494 a[:-1000],
495 array.array(self.typecode)
497 self.assertEqual(a[-1000:1000], a)
498 self.assertEqual(
499 a[2000:1000],
500 array.array(self.typecode)
503 def test_extended_getslice(self):
504 # Test extended slicing by comparing with list slicing
505 # (Assumes list conversion works correctly, too)
506 a = array.array(self.typecode, self.example)
507 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
508 for start in indices:
509 for stop in indices:
510 # Everything except the initial 0 (invalid step)
511 for step in indices[1:]:
512 self.assertEqual(list(a[start:stop:step]),
513 list(a)[start:stop:step])
515 def test_setslice(self):
516 a = array.array(self.typecode, self.example)
517 a[:1] = a
518 self.assertEqual(
520 array.array(self.typecode, self.example + self.example[1:])
523 a = array.array(self.typecode, self.example)
524 a[:-1] = a
525 self.assertEqual(
527 array.array(self.typecode, self.example + self.example[-1:])
530 a = array.array(self.typecode, self.example)
531 a[-1:] = a
532 self.assertEqual(
534 array.array(self.typecode, self.example[:-1] + self.example)
537 a = array.array(self.typecode, self.example)
538 a[1:] = a
539 self.assertEqual(
541 array.array(self.typecode, self.example[:1] + self.example)
544 a = array.array(self.typecode, self.example)
545 a[1:-1] = a
546 self.assertEqual(
548 array.array(
549 self.typecode,
550 self.example[:1] + self.example + self.example[-1:]
554 a = array.array(self.typecode, self.example)
555 a[1000:] = a
556 self.assertEqual(
558 array.array(self.typecode, 2*self.example)
561 a = array.array(self.typecode, self.example)
562 a[-1000:] = a
563 self.assertEqual(
565 array.array(self.typecode, self.example)
568 a = array.array(self.typecode, self.example)
569 a[:1000] = a
570 self.assertEqual(
572 array.array(self.typecode, self.example)
575 a = array.array(self.typecode, self.example)
576 a[:-1000] = a
577 self.assertEqual(
579 array.array(self.typecode, 2*self.example)
582 a = array.array(self.typecode, self.example)
583 a[1:0] = a
584 self.assertEqual(
586 array.array(self.typecode, self.example[:1] + self.example + self.example[1:])
589 a = array.array(self.typecode, self.example)
590 a[2000:1000] = a
591 self.assertEqual(
593 array.array(self.typecode, 2*self.example)
596 a = array.array(self.typecode, self.example)
597 self.assertRaises(TypeError, a.__setslice__, 0, 0, None)
598 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), None)
599 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), None)
601 b = array.array(self.badtypecode())
602 self.assertRaises(TypeError, a.__setslice__, 0, 0, b)
603 self.assertRaises(TypeError, a.__setitem__, slice(0, 0), b)
604 self.assertRaises(TypeError, a.__setitem__, slice(0, 1), b)
606 def test_extended_set_del_slice(self):
607 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
608 for start in indices:
609 for stop in indices:
610 # Everything except the initial 0 (invalid step)
611 for step in indices[1:]:
612 a = array.array(self.typecode, self.example)
613 L = list(a)
614 # Make sure we have a slice of exactly the right length,
615 # but with (hopefully) different data.
616 data = L[start:stop:step]
617 data.reverse()
618 L[start:stop:step] = data
619 a[start:stop:step] = array.array(self.typecode, data)
620 self.assertEquals(a, array.array(self.typecode, L))
622 del L[start:stop:step]
623 del a[start:stop:step]
624 self.assertEquals(a, array.array(self.typecode, L))
626 def test_index(self):
627 example = 2*self.example
628 a = array.array(self.typecode, example)
629 self.assertRaises(TypeError, a.index)
630 for x in example:
631 self.assertEqual(a.index(x), example.index(x))
632 self.assertRaises(ValueError, a.index, None)
633 self.assertRaises(ValueError, a.index, self.outside)
635 def test_count(self):
636 example = 2*self.example
637 a = array.array(self.typecode, example)
638 self.assertRaises(TypeError, a.count)
639 for x in example:
640 self.assertEqual(a.count(x), example.count(x))
641 self.assertEqual(a.count(self.outside), 0)
642 self.assertEqual(a.count(None), 0)
644 def test_remove(self):
645 for x in self.example:
646 example = 2*self.example
647 a = array.array(self.typecode, example)
648 pos = example.index(x)
649 example2 = example[:pos] + example[pos+1:]
650 a.remove(x)
651 self.assertEqual(a, array.array(self.typecode, example2))
653 a = array.array(self.typecode, self.example)
654 self.assertRaises(ValueError, a.remove, self.outside)
656 self.assertRaises(ValueError, a.remove, None)
658 def test_pop(self):
659 a = array.array(self.typecode)
660 self.assertRaises(IndexError, a.pop)
662 a = array.array(self.typecode, 2*self.example)
663 self.assertRaises(TypeError, a.pop, 42, 42)
664 self.assertRaises(TypeError, a.pop, None)
665 self.assertRaises(IndexError, a.pop, len(a))
666 self.assertRaises(IndexError, a.pop, -len(a)-1)
668 self.assertEntryEqual(a.pop(0), self.example[0])
669 self.assertEqual(
671 array.array(self.typecode, self.example[1:]+self.example)
673 self.assertEntryEqual(a.pop(1), self.example[2])
674 self.assertEqual(
676 array.array(self.typecode, self.example[1:2]+self.example[3:]+self.example)
678 self.assertEntryEqual(a.pop(0), self.example[1])
679 self.assertEntryEqual(a.pop(), self.example[-1])
680 self.assertEqual(
682 array.array(self.typecode, self.example[3:]+self.example[:-1])
685 def test_reverse(self):
686 a = array.array(self.typecode, self.example)
687 self.assertRaises(TypeError, a.reverse, 42)
688 a.reverse()
689 self.assertEqual(
691 array.array(self.typecode, self.example[::-1])
694 def test_extend(self):
695 a = array.array(self.typecode, self.example)
696 self.assertRaises(TypeError, a.extend)
697 a.extend(array.array(self.typecode, self.example[::-1]))
698 self.assertEqual(
700 array.array(self.typecode, self.example+self.example[::-1])
703 a = array.array(self.typecode, self.example)
704 a.extend(a)
705 self.assertEqual(
707 array.array(self.typecode, self.example+self.example)
710 b = array.array(self.badtypecode())
711 self.assertRaises(TypeError, a.extend, b)
713 a = array.array(self.typecode, self.example)
714 a.extend(self.example[::-1])
715 self.assertEqual(
717 array.array(self.typecode, self.example+self.example[::-1])
720 def test_constructor_with_iterable_argument(self):
721 a = array.array(self.typecode, iter(self.example))
722 b = array.array(self.typecode, self.example)
723 self.assertEqual(a, b)
725 # non-iterable argument
726 self.assertRaises(TypeError, array.array, self.typecode, 10)
728 # pass through errors raised in __iter__
729 class A:
730 def __iter__(self):
731 raise UnicodeError
732 self.assertRaises(UnicodeError, array.array, self.typecode, A())
734 # pass through errors raised in next()
735 def B():
736 raise UnicodeError
737 yield None
738 self.assertRaises(UnicodeError, array.array, self.typecode, B())
740 def test_coveritertraverse(self):
741 try:
742 import gc
743 except ImportError:
744 return
745 a = array.array(self.typecode)
746 l = [iter(a)]
747 l.append(l)
748 gc.collect()
750 def test_buffer(self):
751 a = array.array(self.typecode, self.example)
752 b = buffer(a)
753 self.assertEqual(b[0], a.tostring()[0])
755 def test_weakref(self):
756 s = array.array(self.typecode, self.example)
757 p = proxy(s)
758 self.assertEqual(p.tostring(), s.tostring())
759 s = None
760 self.assertRaises(ReferenceError, len, p)
762 def test_bug_782369(self):
763 import sys
764 if hasattr(sys, "getrefcount"):
765 for i in range(10):
766 b = array.array('B', range(64))
767 rc = sys.getrefcount(10)
768 for i in range(10):
769 b = array.array('B', range(64))
770 self.assertEqual(rc, sys.getrefcount(10))
772 def test_subclass_with_kwargs(self):
773 # SF bug #1486663 -- this used to erroneously raise a TypeError
774 ArraySubclassWithKwargs('b', newarg=1)
777 class StringTest(BaseTest):
779 def test_setitem(self):
780 super(StringTest, self).test_setitem()
781 a = array.array(self.typecode, self.example)
782 self.assertRaises(TypeError, a.__setitem__, 0, self.example[:2])
784 class CharacterTest(StringTest):
785 typecode = 'c'
786 example = '\x01azAZ\x00\xfe'
787 smallerexample = '\x01azAY\x00\xfe'
788 biggerexample = '\x01azAZ\x00\xff'
789 outside = '\x33'
790 minitemsize = 1
792 def test_subbclassing(self):
793 class EditableString(array.array):
794 def __new__(cls, s, *args, **kwargs):
795 return array.array.__new__(cls, 'c', s)
797 def __init__(self, s, color='blue'):
798 self.color = color
800 def strip(self):
801 self[:] = array.array('c', self.tostring().strip())
803 def __repr__(self):
804 return 'EditableString(%r)' % self.tostring()
806 s = EditableString("\ttest\r\n")
807 s.strip()
808 self.assertEqual(s.tostring(), "test")
810 self.assertEqual(s.color, "blue")
811 s.color = "red"
812 self.assertEqual(s.color, "red")
813 self.assertEqual(s.__dict__.keys(), ["color"])
815 def test_nounicode(self):
816 a = array.array(self.typecode, self.example)
817 self.assertRaises(ValueError, a.fromunicode, unicode(''))
818 self.assertRaises(ValueError, a.tounicode)
820 tests.append(CharacterTest)
822 if test_support.have_unicode:
823 class UnicodeTest(StringTest):
824 typecode = 'u'
825 example = unicode(r'\x01\u263a\x00\ufeff', 'unicode-escape')
826 smallerexample = unicode(r'\x01\u263a\x00\ufefe', 'unicode-escape')
827 biggerexample = unicode(r'\x01\u263a\x01\ufeff', 'unicode-escape')
828 outside = unicode('\x33')
829 minitemsize = 2
831 def test_unicode(self):
832 self.assertRaises(TypeError, array.array, 'b', unicode('foo', 'ascii'))
834 a = array.array('u', unicode(r'\xa0\xc2\u1234', 'unicode-escape'))
835 a.fromunicode(unicode(' ', 'ascii'))
836 a.fromunicode(unicode('', 'ascii'))
837 a.fromunicode(unicode('', 'ascii'))
838 a.fromunicode(unicode(r'\x11abc\xff\u1234', 'unicode-escape'))
839 s = a.tounicode()
840 self.assertEqual(
842 unicode(r'\xa0\xc2\u1234 \x11abc\xff\u1234', 'unicode-escape')
845 s = unicode(r'\x00="\'a\\b\x80\xff\u0000\u0001\u1234', 'unicode-escape')
846 a = array.array('u', s)
847 self.assertEqual(
848 repr(a),
849 r"""array('u', u'\x00="\'a\\b\x80\xff\x00\x01\u1234')"""
852 self.assertRaises(TypeError, a.fromunicode)
854 tests.append(UnicodeTest)
856 class NumberTest(BaseTest):
858 def test_extslice(self):
859 a = array.array(self.typecode, range(5))
860 self.assertEqual(a[::], a)
861 self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
862 self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
863 self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
864 self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
865 self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
866 self.assertEqual(a[-100:100:], a)
867 self.assertEqual(a[100:-100:-1], a[::-1])
868 self.assertEqual(a[-100L:100L:2L], array.array(self.typecode, [0,2,4]))
869 self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
870 self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
872 def test_delslice(self):
873 a = array.array(self.typecode, range(5))
874 del a[::2]
875 self.assertEqual(a, array.array(self.typecode, [1,3]))
876 a = array.array(self.typecode, range(5))
877 del a[1::2]
878 self.assertEqual(a, array.array(self.typecode, [0,2,4]))
879 a = array.array(self.typecode, range(5))
880 del a[1::-2]
881 self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
882 a = array.array(self.typecode, range(10))
883 del a[::1000]
884 self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
886 def test_assignment(self):
887 a = array.array(self.typecode, range(10))
888 a[::2] = array.array(self.typecode, [42]*5)
889 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
890 a = array.array(self.typecode, range(10))
891 a[::-4] = array.array(self.typecode, [10]*3)
892 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
893 a = array.array(self.typecode, range(4))
894 a[::-1] = a
895 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
896 a = array.array(self.typecode, range(10))
897 b = a[:]
898 c = a[:]
899 ins = array.array(self.typecode, range(2))
900 a[2:3] = ins
901 b[slice(2,3)] = ins
902 c[2:3:] = ins
904 def test_iterationcontains(self):
905 a = array.array(self.typecode, range(10))
906 self.assertEqual(list(a), range(10))
907 b = array.array(self.typecode, [20])
908 self.assertEqual(a[-1] in a, True)
909 self.assertEqual(b[0] not in a, True)
911 def check_overflow(self, lower, upper):
912 # method to be used by subclasses
914 # should not overflow assigning lower limit
915 a = array.array(self.typecode, [lower])
916 a[0] = lower
917 # should overflow assigning less than lower limit
918 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
919 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
920 # should not overflow assigning upper limit
921 a = array.array(self.typecode, [upper])
922 a[0] = upper
923 # should overflow assigning more than upper limit
924 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
925 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
927 def test_subclassing(self):
928 typecode = self.typecode
929 class ExaggeratingArray(array.array):
930 __slots__ = ['offset']
932 def __new__(cls, typecode, data, offset):
933 return array.array.__new__(cls, typecode, data)
935 def __init__(self, typecode, data, offset):
936 self.offset = offset
938 def __getitem__(self, i):
939 return array.array.__getitem__(self, i) + self.offset
941 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
942 self.assertEntryEqual(a[0], 7)
944 self.assertRaises(AttributeError, setattr, a, "color", "blue")
946 class SignedNumberTest(NumberTest):
947 example = [-1, 0, 1, 42, 0x7f]
948 smallerexample = [-1, 0, 1, 42, 0x7e]
949 biggerexample = [-1, 0, 1, 43, 0x7f]
950 outside = 23
952 def test_overflow(self):
953 a = array.array(self.typecode)
954 lower = -1 * long(pow(2, a.itemsize * 8 - 1))
955 upper = long(pow(2, a.itemsize * 8 - 1)) - 1L
956 self.check_overflow(lower, upper)
958 class UnsignedNumberTest(NumberTest):
959 example = [0, 1, 17, 23, 42, 0xff]
960 smallerexample = [0, 1, 17, 23, 42, 0xfe]
961 biggerexample = [0, 1, 17, 23, 43, 0xff]
962 outside = 0xaa
964 def test_overflow(self):
965 a = array.array(self.typecode)
966 lower = 0
967 upper = long(pow(2, a.itemsize * 8)) - 1L
968 self.check_overflow(lower, upper)
971 class ByteTest(SignedNumberTest):
972 typecode = 'b'
973 minitemsize = 1
974 tests.append(ByteTest)
976 class UnsignedByteTest(UnsignedNumberTest):
977 typecode = 'B'
978 minitemsize = 1
979 tests.append(UnsignedByteTest)
981 class ShortTest(SignedNumberTest):
982 typecode = 'h'
983 minitemsize = 2
984 tests.append(ShortTest)
986 class UnsignedShortTest(UnsignedNumberTest):
987 typecode = 'H'
988 minitemsize = 2
989 tests.append(UnsignedShortTest)
991 class IntTest(SignedNumberTest):
992 typecode = 'i'
993 minitemsize = 2
994 tests.append(IntTest)
996 class UnsignedIntTest(UnsignedNumberTest):
997 typecode = 'I'
998 minitemsize = 2
999 tests.append(UnsignedIntTest)
1001 class LongTest(SignedNumberTest):
1002 typecode = 'l'
1003 minitemsize = 4
1004 tests.append(LongTest)
1006 class UnsignedLongTest(UnsignedNumberTest):
1007 typecode = 'L'
1008 minitemsize = 4
1009 tests.append(UnsignedLongTest)
1011 class FPTest(NumberTest):
1012 example = [-42.0, 0, 42, 1e5, -1e10]
1013 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
1014 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
1015 outside = 23
1017 def assertEntryEqual(self, entry1, entry2):
1018 self.assertAlmostEqual(entry1, entry2)
1020 def test_byteswap(self):
1021 a = array.array(self.typecode, self.example)
1022 self.assertRaises(TypeError, a.byteswap, 42)
1023 if a.itemsize in (1, 2, 4, 8):
1024 b = array.array(self.typecode, self.example)
1025 b.byteswap()
1026 if a.itemsize==1:
1027 self.assertEqual(a, b)
1028 else:
1029 # On alphas treating the byte swapped bit patters as
1030 # floats/doubles results in floating point exceptions
1031 # => compare the 8bit string values instead
1032 self.assertNotEqual(a.tostring(), b.tostring())
1033 b.byteswap()
1034 self.assertEqual(a, b)
1036 class FloatTest(FPTest):
1037 typecode = 'f'
1038 minitemsize = 4
1039 tests.append(FloatTest)
1041 class DoubleTest(FPTest):
1042 typecode = 'd'
1043 minitemsize = 8
1045 def test_alloc_overflow(self):
1046 from sys import maxsize
1047 a = array.array('d', [-1]*65536)
1048 try:
1049 a *= maxsize//65536 + 1
1050 except MemoryError:
1051 pass
1052 else:
1053 self.fail("Array of size > maxsize created - MemoryError expected")
1054 b = array.array('d', [ 2.71828183, 3.14159265, -1])
1055 try:
1056 b * (maxsize//3 + 1)
1057 except MemoryError:
1058 pass
1059 else:
1060 self.fail("Array of size > maxsize created - MemoryError expected")
1062 tests.append(DoubleTest)
1064 def test_main(verbose=None):
1065 import sys
1067 test_support.run_unittest(*tests)
1069 # verify reference counting
1070 if verbose and hasattr(sys, "gettotalrefcount"):
1071 import gc
1072 counts = [None] * 5
1073 for i in xrange(len(counts)):
1074 test_support.run_unittest(*tests)
1075 gc.collect()
1076 counts[i] = sys.gettotalrefcount()
1077 print counts
1079 if __name__ == "__main__":
1080 test_main(verbose=True)