2 """Test the arraymodule.
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
):
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)
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)
66 self
.assertIsInstance(bi
, tuple)
67 self
.assertEqual(len(bi
), 2)
68 self
.assertIsInstance(bi
[0], (int, long))
69 self
.assertIsInstance(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
)
79 self
.assertEqual(a
, b
)
81 self
.assertNotEqual(a
, b
)
83 self
.assertEqual(a
, b
)
87 a
= array
.array(self
.typecode
, self
.example
)
89 self
.assertNotEqual(id(a
), id(b
))
90 self
.assertEqual(a
, b
)
92 def test_deepcopy(self
):
94 a
= array
.array(self
.typecode
, self
.example
)
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
)
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
)
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])
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])
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])
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')
171 b
= array
.array(self
.typecode
)
172 f
= open(test_support
.TESTFN
, 'rb')
173 self
.assertRaises(TypeError, 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)
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')
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
)
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
)
229 self
.assertRaises(ValueError, b
.fromstring
, "x")
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
)
239 a
= array
.array(self
.typecode
, 2*self
.example
)
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)
279 a
= array
.array(self
.typecode
, self
.example
) \
280 + array
.array(self
.typecode
, self
.example
[::-1])
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")
292 a
= array
.array(self
.typecode
, self
.example
[::-1])
294 a
+= array
.array(self
.typecode
, 2*self
.example
)
295 self
.assertTrue(a
is b
)
298 array
.array(self
.typecode
, self
.example
[::-1]+2*self
.example
)
300 a
= array
.array(self
.typecode
, self
.example
)
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")
313 a
= 5*array
.array(self
.typecode
, self
.example
)
316 array
.array(self
.typecode
, 5*self
.example
)
319 a
= array
.array(self
.typecode
, self
.example
)*5
322 array
.array(self
.typecode
, self
.example
*5)
325 a
= 0*array
.array(self
.typecode
, self
.example
)
328 array
.array(self
.typecode
)
331 a
= (-1)*array
.array(self
.typecode
, self
.example
)
334 array
.array(self
.typecode
)
337 self
.assertRaises(TypeError, a
.__mul
__, "bad")
340 a
= array
.array(self
.typecode
, self
.example
)
344 self
.assertTrue(a
is b
)
347 array
.array(self
.typecode
, 5*self
.example
)
351 self
.assertTrue(a
is b
)
352 self
.assertEqual(a
, array
.array(self
.typecode
))
355 self
.assertTrue(a
is b
)
356 self
.assertEqual(a
, array
.array(self
.typecode
))
359 self
.assertTrue(a
is b
)
360 self
.assertEqual(a
, array
.array(self
.typecode
))
362 a
= array
.array(self
.typecode
, self
.example
)
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
)
383 self
.assertEntryEqual(a
[0], a
[-1])
385 a
= array
.array(self
.typecode
, self
.example
)
387 self
.assertEntryEqual(a
[0], a
[-1])
389 a
= array
.array(self
.typecode
, self
.example
)
391 self
.assertEntryEqual(a
[0], a
[-1])
393 a
= array
.array(self
.typecode
, self
.example
)
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)
411 len(self
.example
), self
.example
[0]
416 -len(self
.example
)-1, self
.example
[0]
419 def test_delitem(self
):
420 a
= array
.array(self
.typecode
, self
.example
)
424 array
.array(self
.typecode
, self
.example
[1:])
427 a
= array
.array(self
.typecode
, self
.example
)
431 array
.array(self
.typecode
, self
.example
[:-1])
434 a
= array
.array(self
.typecode
, self
.example
)
435 del a
[len(self
.example
)-1]
438 array
.array(self
.typecode
, self
.example
[:-1])
441 a
= array
.array(self
.typecode
, self
.example
)
442 del a
[-len(self
.example
)]
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
)
459 array
.array(self
.typecode
, self
.example
[1:])
464 array
.array(self
.typecode
, self
.example
[:1])
469 array
.array(self
.typecode
, self
.example
[:-1])
474 array
.array(self
.typecode
, self
.example
[-1:])
479 array
.array(self
.typecode
)
484 array
.array(self
.typecode
)
489 array
.array(self
.typecode
)
491 self
.assertEqual(a
[-1000:], a
)
492 self
.assertEqual(a
[:1000], a
)
495 array
.array(self
.typecode
)
497 self
.assertEqual(a
[-1000:1000], a
)
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
:
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
)
520 array
.array(self
.typecode
, self
.example
+ self
.example
[1:])
523 a
= array
.array(self
.typecode
, self
.example
)
527 array
.array(self
.typecode
, self
.example
+ self
.example
[-1:])
530 a
= array
.array(self
.typecode
, self
.example
)
534 array
.array(self
.typecode
, self
.example
[:-1] + self
.example
)
537 a
= array
.array(self
.typecode
, self
.example
)
541 array
.array(self
.typecode
, self
.example
[:1] + self
.example
)
544 a
= array
.array(self
.typecode
, self
.example
)
550 self
.example
[:1] + self
.example
+ self
.example
[-1:]
554 a
= array
.array(self
.typecode
, self
.example
)
558 array
.array(self
.typecode
, 2*self
.example
)
561 a
= array
.array(self
.typecode
, self
.example
)
565 array
.array(self
.typecode
, self
.example
)
568 a
= array
.array(self
.typecode
, self
.example
)
572 array
.array(self
.typecode
, self
.example
)
575 a
= array
.array(self
.typecode
, self
.example
)
579 array
.array(self
.typecode
, 2*self
.example
)
582 a
= array
.array(self
.typecode
, self
.example
)
586 array
.array(self
.typecode
, self
.example
[:1] + self
.example
+ self
.example
[1:])
589 a
= array
.array(self
.typecode
, self
.example
)
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
:
610 # Everything except the initial 0 (invalid step)
611 for step
in indices
[1:]:
612 a
= array
.array(self
.typecode
, self
.example
)
614 # Make sure we have a slice of exactly the right length,
615 # but with (hopefully) different data.
616 data
= L
[start
:stop
:step
]
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
)
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
)
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:]
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)
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])
671 array
.array(self
.typecode
, self
.example
[1:]+self
.example
)
673 self
.assertEntryEqual(a
.pop(1), self
.example
[2])
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])
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)
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]))
700 array
.array(self
.typecode
, self
.example
+self
.example
[::-1])
703 a
= array
.array(self
.typecode
, self
.example
)
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])
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__
732 self
.assertRaises(UnicodeError, array
.array
, self
.typecode
, A())
734 # pass through errors raised in next()
738 self
.assertRaises(UnicodeError, array
.array
, self
.typecode
, B())
740 def test_coveritertraverse(self
):
745 a
= array
.array(self
.typecode
)
750 def test_buffer(self
):
751 a
= array
.array(self
.typecode
, self
.example
)
752 with test_support
.check_py3k_warnings():
754 self
.assertEqual(b
[0], a
.tostring()[0])
756 def test_weakref(self
):
757 s
= array
.array(self
.typecode
, self
.example
)
759 self
.assertEqual(p
.tostring(), s
.tostring())
761 self
.assertRaises(ReferenceError, len, p
)
763 def test_bug_782369(self
):
765 if hasattr(sys
, "getrefcount"):
767 b
= array
.array('B', range(64))
768 rc
= sys
.getrefcount(10)
770 b
= array
.array('B', range(64))
771 self
.assertEqual(rc
, sys
.getrefcount(10))
773 def test_subclass_with_kwargs(self
):
774 # SF bug #1486663 -- this used to erroneously raise a TypeError
775 ArraySubclassWithKwargs('b', newarg
=1)
778 class StringTest(BaseTest
):
780 def test_setitem(self
):
781 super(StringTest
, self
).test_setitem()
782 a
= array
.array(self
.typecode
, self
.example
)
783 self
.assertRaises(TypeError, a
.__setitem
__, 0, self
.example
[:2])
785 class CharacterTest(StringTest
):
787 example
= '\x01azAZ\x00\xfe'
788 smallerexample
= '\x01azAY\x00\xfe'
789 biggerexample
= '\x01azAZ\x00\xff'
793 def test_subbclassing(self
):
794 class EditableString(array
.array
):
795 def __new__(cls
, s
, *args
, **kwargs
):
796 return array
.array
.__new
__(cls
, 'c', s
)
798 def __init__(self
, s
, color
='blue'):
802 self
[:] = array
.array('c', self
.tostring().strip())
805 return 'EditableString(%r)' % self
.tostring()
807 s
= EditableString("\ttest\r\n")
809 self
.assertEqual(s
.tostring(), "test")
811 self
.assertEqual(s
.color
, "blue")
813 self
.assertEqual(s
.color
, "red")
814 self
.assertEqual(s
.__dict
__.keys(), ["color"])
816 def test_nounicode(self
):
817 a
= array
.array(self
.typecode
, self
.example
)
818 self
.assertRaises(ValueError, a
.fromunicode
, unicode(''))
819 self
.assertRaises(ValueError, a
.tounicode
)
821 tests
.append(CharacterTest
)
823 if test_support
.have_unicode
:
824 class UnicodeTest(StringTest
):
826 example
= unicode(r
'\x01\u263a\x00\ufeff', 'unicode-escape')
827 smallerexample
= unicode(r
'\x01\u263a\x00\ufefe', 'unicode-escape')
828 biggerexample
= unicode(r
'\x01\u263a\x01\ufeff', 'unicode-escape')
829 outside
= unicode('\x33')
832 def test_unicode(self
):
833 self
.assertRaises(TypeError, array
.array
, 'b', unicode('foo', 'ascii'))
835 a
= array
.array('u', unicode(r
'\xa0\xc2\u1234', 'unicode-escape'))
836 a
.fromunicode(unicode(' ', 'ascii'))
837 a
.fromunicode(unicode('', 'ascii'))
838 a
.fromunicode(unicode('', 'ascii'))
839 a
.fromunicode(unicode(r
'\x11abc\xff\u1234', 'unicode-escape'))
843 unicode(r
'\xa0\xc2\u1234 \x11abc\xff\u1234', 'unicode-escape')
846 s
= unicode(r
'\x00="\'a
\\b
\x80\xff\u0000\u0001\u1234
', 'unicode-escape
')
847 a = array.array('u
', s)
850 r"""array('u
', u'\x00="\'a\\b\x80\xff\x00\x01\u1234')"""
853 self.assertRaises(TypeError, a.fromunicode)
855 tests.append(UnicodeTest)
857 class NumberTest(BaseTest):
859 def test_extslice(self):
860 a = array.array(self.typecode, range(5))
861 self.assertEqual(a[::], a)
862 self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
863 self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
864 self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
865 self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
866 self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
867 self.assertEqual(a[-100:100:], a)
868 self.assertEqual(a[100:-100:-1], a[::-1])
869 self.assertEqual(a[-100L:100L:2L], array.array(self.typecode, [0,2,4]))
870 self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
871 self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
873 def test_delslice(self):
874 a = array.array(self.typecode, range(5))
876 self.assertEqual(a, array.array(self.typecode, [1,3]))
877 a = array.array(self.typecode, range(5))
879 self.assertEqual(a, array.array(self.typecode, [0,2,4]))
880 a = array.array(self.typecode, range(5))
882 self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
883 a = array.array(self.typecode, range(10))
885 self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
887 a = array.array(self.typecode, range(10))
890 def test_assignment(self):
891 a = array.array(self.typecode, range(10))
892 a[::2] = array.array(self.typecode, [42]*5)
893 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
894 a = array.array(self.typecode, range(10))
895 a[::-4] = array.array(self.typecode, [10]*3)
896 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
897 a = array.array(self.typecode, range(4))
899 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
900 a = array.array(self.typecode, range(10))
903 ins = array.array(self.typecode, range(2))
908 def test_iterationcontains(self):
909 a = array.array(self.typecode, range(10))
910 self.assertEqual(list(a), range(10))
911 b = array.array(self.typecode, [20])
912 self.assertEqual(a[-1] in a, True)
913 self.assertEqual(b[0] not in a, True)
915 def check_overflow(self, lower, upper):
916 # method to be used by subclasses
918 # should not overflow assigning lower limit
919 a = array.array(self.typecode, [lower])
921 # should overflow assigning less than lower limit
922 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
923 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
924 # should not overflow assigning upper limit
925 a = array.array(self.typecode, [upper])
927 # should overflow assigning more than upper limit
928 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
929 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
931 def test_subclassing(self):
932 typecode = self.typecode
933 class ExaggeratingArray(array.array):
934 __slots__ = ['offset']
936 def __new__(cls, typecode, data, offset):
937 return array.array.__new__(cls, typecode, data)
939 def __init__(self, typecode, data, offset):
942 def __getitem__(self, i):
943 return array.array.__getitem__(self, i) + self.offset
945 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
946 self.assertEntryEqual(a[0], 7)
948 self.assertRaises(AttributeError, setattr, a, "color
", "blue
")
950 class SignedNumberTest(NumberTest):
951 example = [-1, 0, 1, 42, 0x7f]
952 smallerexample = [-1, 0, 1, 42, 0x7e]
953 biggerexample = [-1, 0, 1, 43, 0x7f]
956 def test_overflow(self):
957 a = array.array(self.typecode)
958 lower = -1 * long(pow(2, a.itemsize * 8 - 1))
959 upper = long(pow(2, a.itemsize * 8 - 1)) - 1L
960 self.check_overflow(lower, upper)
962 class UnsignedNumberTest(NumberTest):
963 example = [0, 1, 17, 23, 42, 0xff]
964 smallerexample = [0, 1, 17, 23, 42, 0xfe]
965 biggerexample = [0, 1, 17, 23, 43, 0xff]
968 def test_overflow(self):
969 a = array.array(self.typecode)
971 upper = long(pow(2, a.itemsize * 8)) - 1L
972 self.check_overflow(lower, upper)
975 class ByteTest(SignedNumberTest):
978 tests.append(ByteTest)
980 class UnsignedByteTest(UnsignedNumberTest):
983 tests.append(UnsignedByteTest)
985 class ShortTest(SignedNumberTest):
988 tests.append(ShortTest)
990 class UnsignedShortTest(UnsignedNumberTest):
993 tests.append(UnsignedShortTest)
995 class IntTest(SignedNumberTest):
998 tests.append(IntTest)
1000 class UnsignedIntTest(UnsignedNumberTest):
1003 tests.append(UnsignedIntTest)
1005 class LongTest(SignedNumberTest):
1008 tests.append(LongTest)
1010 class UnsignedLongTest(UnsignedNumberTest):
1013 tests.append(UnsignedLongTest)
1015 class FPTest(NumberTest):
1016 example = [-42.0, 0, 42, 1e5, -1e10]
1017 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
1018 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
1021 def assertEntryEqual(self, entry1, entry2):
1022 self.assertAlmostEqual(entry1, entry2)
1024 def test_byteswap(self):
1025 a = array.array(self.typecode, self.example)
1026 self.assertRaises(TypeError, a.byteswap, 42)
1027 if a.itemsize in (1, 2, 4, 8):
1028 b = array.array(self.typecode, self.example)
1031 self.assertEqual(a, b)
1033 # On alphas treating the byte swapped bit patters as
1034 # floats/doubles results in floating point exceptions
1035 # => compare the 8bit string values instead
1036 self.assertNotEqual(a.tostring(), b.tostring())
1038 self.assertEqual(a, b)
1040 class FloatTest(FPTest):
1043 tests.append(FloatTest)
1045 class DoubleTest(FPTest):
1049 def test_alloc_overflow(self):
1050 from sys import maxsize
1051 a = array.array('d', [-1]*65536)
1053 a *= maxsize//65536 + 1
1057 self.fail("Array of size
> maxsize created
- MemoryError expected
")
1058 b = array.array('d', [ 2.71828183, 3.14159265, -1])
1060 b * (maxsize//3 + 1)
1064 self.fail("Array of size
> maxsize created
- MemoryError expected
")
1066 tests.append(DoubleTest)
1068 def test_main(verbose=None):
1071 test_support.run_unittest(*tests)
1073 # verify reference counting
1074 if verbose and hasattr(sys, "gettotalrefcount
"):
1077 for i in xrange(len(counts)):
1078 test_support.run_unittest(*tests)
1080 counts[i] = sys.gettotalrefcount()
1083 if __name__ == "__main__
":
1084 test_main(verbose=True)