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
.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
)
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_tofromlist(self
):
192 a
= array
.array(self
.typecode
, 2*self
.example
)
193 b
= array
.array(self
.typecode
)
194 self
.assertRaises(TypeError, a
.tolist
, 42)
195 self
.assertRaises(TypeError, b
.fromlist
)
196 self
.assertRaises(TypeError, b
.fromlist
, 42)
197 self
.assertRaises(TypeError, b
.fromlist
, [None])
198 b
.fromlist(a
.tolist())
199 self
.assertEqual(a
, b
)
201 def test_tofromstring(self
):
202 a
= array
.array(self
.typecode
, 2*self
.example
)
203 b
= array
.array(self
.typecode
)
204 self
.assertRaises(TypeError, a
.tostring
, 42)
205 self
.assertRaises(TypeError, b
.fromstring
)
206 self
.assertRaises(TypeError, b
.fromstring
, 42)
207 b
.fromstring(a
.tostring())
208 self
.assertEqual(a
, b
)
210 self
.assertRaises(ValueError, b
.fromstring
, "x")
213 a
= array
.array(self
.typecode
, 2*self
.example
)
214 self
.assertEqual(a
, eval(repr(a
), {"array": array
.array
}))
216 a
= array
.array(self
.typecode
)
217 self
.assertEqual(repr(a
), "array('%s')" % self
.typecode
)
220 a
= array
.array(self
.typecode
, 2*self
.example
)
224 a
= array
.array(self
.typecode
, self
.example
)
225 self
.assertTrue((a
== 42) is False)
226 self
.assertTrue((a
!= 42) is True)
228 self
.assertTrue((a
== a
) is True)
229 self
.assertTrue((a
!= a
) is False)
230 self
.assertTrue((a
< a
) is False)
231 self
.assertTrue((a
<= a
) is True)
232 self
.assertTrue((a
> a
) is False)
233 self
.assertTrue((a
>= a
) is True)
235 al
= array
.array(self
.typecode
, self
.smallerexample
)
236 ab
= array
.array(self
.typecode
, self
.biggerexample
)
238 self
.assertTrue((a
== 2*a
) is False)
239 self
.assertTrue((a
!= 2*a
) is True)
240 self
.assertTrue((a
< 2*a
) is True)
241 self
.assertTrue((a
<= 2*a
) is True)
242 self
.assertTrue((a
> 2*a
) is False)
243 self
.assertTrue((a
>= 2*a
) is False)
245 self
.assertTrue((a
== al
) is False)
246 self
.assertTrue((a
!= al
) is True)
247 self
.assertTrue((a
< al
) is False)
248 self
.assertTrue((a
<= al
) is False)
249 self
.assertTrue((a
> al
) is True)
250 self
.assertTrue((a
>= al
) is True)
252 self
.assertTrue((a
== ab
) is False)
253 self
.assertTrue((a
!= ab
) is True)
254 self
.assertTrue((a
< ab
) is True)
255 self
.assertTrue((a
<= ab
) is True)
256 self
.assertTrue((a
> ab
) is False)
257 self
.assertTrue((a
>= ab
) is False)
260 a
= array
.array(self
.typecode
, self
.example
) \
261 + array
.array(self
.typecode
, self
.example
[::-1])
264 array
.array(self
.typecode
, self
.example
+ self
.example
[::-1])
267 b
= array
.array(self
.badtypecode())
268 self
.assertRaises(TypeError, a
.__add
__, b
)
270 self
.assertRaises(TypeError, a
.__add
__, "bad")
273 a
= array
.array(self
.typecode
, self
.example
[::-1])
275 a
+= array
.array(self
.typecode
, 2*self
.example
)
276 self
.assertTrue(a
is b
)
279 array
.array(self
.typecode
, self
.example
[::-1]+2*self
.example
)
282 b
= array
.array(self
.badtypecode())
283 self
.assertRaises(TypeError, a
.__add
__, b
)
285 self
.assertRaises(TypeError, a
.__iadd
__, "bad")
288 a
= 5*array
.array(self
.typecode
, self
.example
)
291 array
.array(self
.typecode
, 5*self
.example
)
294 a
= array
.array(self
.typecode
, self
.example
)*5
297 array
.array(self
.typecode
, self
.example
*5)
300 a
= 0*array
.array(self
.typecode
, self
.example
)
303 array
.array(self
.typecode
)
306 a
= (-1)*array
.array(self
.typecode
, self
.example
)
309 array
.array(self
.typecode
)
312 self
.assertRaises(TypeError, a
.__mul
__, "bad")
315 a
= array
.array(self
.typecode
, self
.example
)
319 self
.assertTrue(a
is b
)
322 array
.array(self
.typecode
, 5*self
.example
)
326 self
.assertTrue(a
is b
)
327 self
.assertEqual(a
, array
.array(self
.typecode
))
330 self
.assertTrue(a
is b
)
331 self
.assertEqual(a
, array
.array(self
.typecode
))
334 self
.assertTrue(a
is b
)
335 self
.assertEqual(a
, array
.array(self
.typecode
))
337 a
= array
.array(self
.typecode
, self
.example
)
339 self
.assertEqual(a
, array
.array(self
.typecode
))
341 self
.assertRaises(TypeError, a
.__imul
__, "bad")
343 def test_getitem(self
):
344 a
= array
.array(self
.typecode
, self
.example
)
345 self
.assertEntryEqual(a
[0], self
.example
[0])
346 self
.assertEntryEqual(a
[0L], self
.example
[0])
347 self
.assertEntryEqual(a
[-1], self
.example
[-1])
348 self
.assertEntryEqual(a
[-1L], self
.example
[-1])
349 self
.assertEntryEqual(a
[len(self
.example
)-1], self
.example
[-1])
350 self
.assertEntryEqual(a
[-len(self
.example
)], self
.example
[0])
351 self
.assertRaises(TypeError, a
.__getitem
__)
352 self
.assertRaises(IndexError, a
.__getitem
__, len(self
.example
))
353 self
.assertRaises(IndexError, a
.__getitem
__, -len(self
.example
)-1)
355 def test_setitem(self
):
356 a
= array
.array(self
.typecode
, self
.example
)
358 self
.assertEntryEqual(a
[0], a
[-1])
360 a
= array
.array(self
.typecode
, self
.example
)
362 self
.assertEntryEqual(a
[0], a
[-1])
364 a
= array
.array(self
.typecode
, self
.example
)
366 self
.assertEntryEqual(a
[0], a
[-1])
368 a
= array
.array(self
.typecode
, self
.example
)
370 self
.assertEntryEqual(a
[0], a
[-1])
372 a
= array
.array(self
.typecode
, self
.example
)
373 a
[len(self
.example
)-1] = a
[0]
374 self
.assertEntryEqual(a
[0], a
[-1])
376 a
= array
.array(self
.typecode
, self
.example
)
377 a
[-len(self
.example
)] = a
[-1]
378 self
.assertEntryEqual(a
[0], a
[-1])
380 self
.assertRaises(TypeError, a
.__setitem
__)
381 self
.assertRaises(TypeError, a
.__setitem
__, None)
382 self
.assertRaises(TypeError, a
.__setitem
__, 0, None)
386 len(self
.example
), self
.example
[0]
391 -len(self
.example
)-1, self
.example
[0]
394 def test_delitem(self
):
395 a
= array
.array(self
.typecode
, self
.example
)
399 array
.array(self
.typecode
, self
.example
[1:])
402 a
= array
.array(self
.typecode
, self
.example
)
406 array
.array(self
.typecode
, self
.example
[:-1])
409 a
= array
.array(self
.typecode
, self
.example
)
410 del a
[len(self
.example
)-1]
413 array
.array(self
.typecode
, self
.example
[:-1])
416 a
= array
.array(self
.typecode
, self
.example
)
417 del a
[-len(self
.example
)]
420 array
.array(self
.typecode
, self
.example
[1:])
423 self
.assertRaises(TypeError, a
.__delitem
__)
424 self
.assertRaises(TypeError, a
.__delitem
__, None)
425 self
.assertRaises(IndexError, a
.__delitem
__, len(self
.example
))
426 self
.assertRaises(IndexError, a
.__delitem
__, -len(self
.example
)-1)
428 def test_getslice(self
):
429 a
= array
.array(self
.typecode
, self
.example
)
430 self
.assertEqual(a
[:], a
)
434 array
.array(self
.typecode
, self
.example
[1:])
439 array
.array(self
.typecode
, self
.example
[:1])
444 array
.array(self
.typecode
, self
.example
[:-1])
449 array
.array(self
.typecode
, self
.example
[-1:])
454 array
.array(self
.typecode
)
459 array
.array(self
.typecode
)
464 array
.array(self
.typecode
)
466 self
.assertEqual(a
[-1000:], a
)
467 self
.assertEqual(a
[:1000], a
)
470 array
.array(self
.typecode
)
472 self
.assertEqual(a
[-1000:1000], a
)
475 array
.array(self
.typecode
)
478 def test_extended_getslice(self
):
479 # Test extended slicing by comparing with list slicing
480 # (Assumes list conversion works correctly, too)
481 a
= array
.array(self
.typecode
, self
.example
)
482 indices
= (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
483 for start
in indices
:
485 # Everything except the initial 0 (invalid step)
486 for step
in indices
[1:]:
487 self
.assertEqual(list(a
[start
:stop
:step
]),
488 list(a
)[start
:stop
:step
])
490 def test_setslice(self
):
491 a
= array
.array(self
.typecode
, self
.example
)
495 array
.array(self
.typecode
, self
.example
+ self
.example
[1:])
498 a
= array
.array(self
.typecode
, self
.example
)
502 array
.array(self
.typecode
, self
.example
+ self
.example
[-1:])
505 a
= array
.array(self
.typecode
, self
.example
)
509 array
.array(self
.typecode
, self
.example
[:-1] + self
.example
)
512 a
= array
.array(self
.typecode
, self
.example
)
516 array
.array(self
.typecode
, self
.example
[:1] + self
.example
)
519 a
= array
.array(self
.typecode
, self
.example
)
525 self
.example
[:1] + self
.example
+ self
.example
[-1:]
529 a
= array
.array(self
.typecode
, self
.example
)
533 array
.array(self
.typecode
, 2*self
.example
)
536 a
= array
.array(self
.typecode
, self
.example
)
540 array
.array(self
.typecode
, self
.example
)
543 a
= array
.array(self
.typecode
, self
.example
)
547 array
.array(self
.typecode
, self
.example
)
550 a
= array
.array(self
.typecode
, self
.example
)
554 array
.array(self
.typecode
, 2*self
.example
)
557 a
= array
.array(self
.typecode
, self
.example
)
561 array
.array(self
.typecode
, self
.example
[:1] + self
.example
+ self
.example
[1:])
564 a
= array
.array(self
.typecode
, self
.example
)
568 array
.array(self
.typecode
, 2*self
.example
)
571 a
= array
.array(self
.typecode
, self
.example
)
572 self
.assertRaises(TypeError, a
.__setslice
__, 0, 0, None)
573 self
.assertRaises(TypeError, a
.__setitem
__, slice(0, 0), None)
574 self
.assertRaises(TypeError, a
.__setitem
__, slice(0, 1), None)
576 b
= array
.array(self
.badtypecode())
577 self
.assertRaises(TypeError, a
.__setslice
__, 0, 0, b
)
578 self
.assertRaises(TypeError, a
.__setitem
__, slice(0, 0), b
)
579 self
.assertRaises(TypeError, a
.__setitem
__, slice(0, 1), b
)
581 def test_extended_set_del_slice(self
):
582 indices
= (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
583 for start
in indices
:
585 # Everything except the initial 0 (invalid step)
586 for step
in indices
[1:]:
587 a
= array
.array(self
.typecode
, self
.example
)
589 # Make sure we have a slice of exactly the right length,
590 # but with (hopefully) different data.
591 data
= L
[start
:stop
:step
]
593 L
[start
:stop
:step
] = data
594 a
[start
:stop
:step
] = array
.array(self
.typecode
, data
)
595 self
.assertEquals(a
, array
.array(self
.typecode
, L
))
597 del L
[start
:stop
:step
]
598 del a
[start
:stop
:step
]
599 self
.assertEquals(a
, array
.array(self
.typecode
, L
))
601 def test_index(self
):
602 example
= 2*self
.example
603 a
= array
.array(self
.typecode
, example
)
604 self
.assertRaises(TypeError, a
.index
)
606 self
.assertEqual(a
.index(x
), example
.index(x
))
607 self
.assertRaises(ValueError, a
.index
, None)
608 self
.assertRaises(ValueError, a
.index
, self
.outside
)
610 def test_count(self
):
611 example
= 2*self
.example
612 a
= array
.array(self
.typecode
, example
)
613 self
.assertRaises(TypeError, a
.count
)
615 self
.assertEqual(a
.count(x
), example
.count(x
))
616 self
.assertEqual(a
.count(self
.outside
), 0)
617 self
.assertEqual(a
.count(None), 0)
619 def test_remove(self
):
620 for x
in self
.example
:
621 example
= 2*self
.example
622 a
= array
.array(self
.typecode
, example
)
623 pos
= example
.index(x
)
624 example2
= example
[:pos
] + example
[pos
+1:]
626 self
.assertEqual(a
, array
.array(self
.typecode
, example2
))
628 a
= array
.array(self
.typecode
, self
.example
)
629 self
.assertRaises(ValueError, a
.remove
, self
.outside
)
631 self
.assertRaises(ValueError, a
.remove
, None)
634 a
= array
.array(self
.typecode
)
635 self
.assertRaises(IndexError, a
.pop
)
637 a
= array
.array(self
.typecode
, 2*self
.example
)
638 self
.assertRaises(TypeError, a
.pop
, 42, 42)
639 self
.assertRaises(TypeError, a
.pop
, None)
640 self
.assertRaises(IndexError, a
.pop
, len(a
))
641 self
.assertRaises(IndexError, a
.pop
, -len(a
)-1)
643 self
.assertEntryEqual(a
.pop(0), self
.example
[0])
646 array
.array(self
.typecode
, self
.example
[1:]+self
.example
)
648 self
.assertEntryEqual(a
.pop(1), self
.example
[2])
651 array
.array(self
.typecode
, self
.example
[1:2]+self
.example
[3:]+self
.example
)
653 self
.assertEntryEqual(a
.pop(0), self
.example
[1])
654 self
.assertEntryEqual(a
.pop(), self
.example
[-1])
657 array
.array(self
.typecode
, self
.example
[3:]+self
.example
[:-1])
660 def test_reverse(self
):
661 a
= array
.array(self
.typecode
, self
.example
)
662 self
.assertRaises(TypeError, a
.reverse
, 42)
666 array
.array(self
.typecode
, self
.example
[::-1])
669 def test_extend(self
):
670 a
= array
.array(self
.typecode
, self
.example
)
671 self
.assertRaises(TypeError, a
.extend
)
672 a
.extend(array
.array(self
.typecode
, self
.example
[::-1]))
675 array
.array(self
.typecode
, self
.example
+self
.example
[::-1])
678 b
= array
.array(self
.badtypecode())
679 self
.assertRaises(TypeError, a
.extend
, b
)
681 a
= array
.array(self
.typecode
, self
.example
)
682 a
.extend(self
.example
[::-1])
685 array
.array(self
.typecode
, self
.example
+self
.example
[::-1])
688 def test_constructor_with_iterable_argument(self
):
689 a
= array
.array(self
.typecode
, iter(self
.example
))
690 b
= array
.array(self
.typecode
, self
.example
)
691 self
.assertEqual(a
, b
)
693 # non-iterable argument
694 self
.assertRaises(TypeError, array
.array
, self
.typecode
, 10)
696 # pass through errors raised in __iter__
700 self
.assertRaises(UnicodeError, array
.array
, self
.typecode
, A())
702 # pass through errors raised in next()
706 self
.assertRaises(UnicodeError, array
.array
, self
.typecode
, B())
708 def test_coveritertraverse(self
):
713 a
= array
.array(self
.typecode
)
718 def test_buffer(self
):
719 a
= array
.array(self
.typecode
, self
.example
)
721 self
.assertEqual(b
[0], a
.tostring()[0])
723 def test_weakref(self
):
724 s
= array
.array(self
.typecode
, self
.example
)
726 self
.assertEqual(p
.tostring(), s
.tostring())
728 self
.assertRaises(ReferenceError, len, p
)
730 def test_bug_782369(self
):
732 if hasattr(sys
, "getrefcount"):
734 b
= array
.array('B', range(64))
735 rc
= sys
.getrefcount(10)
737 b
= array
.array('B', range(64))
738 self
.assertEqual(rc
, sys
.getrefcount(10))
740 def test_subclass_with_kwargs(self
):
741 # SF bug #1486663 -- this used to erroneously raise a TypeError
742 ArraySubclassWithKwargs('b', newarg
=1)
745 class StringTest(BaseTest
):
747 def test_setitem(self
):
748 super(StringTest
, self
).test_setitem()
749 a
= array
.array(self
.typecode
, self
.example
)
750 self
.assertRaises(TypeError, a
.__setitem
__, 0, self
.example
[:2])
752 class CharacterTest(StringTest
):
754 example
= '\x01azAZ\x00\xfe'
755 smallerexample
= '\x01azAY\x00\xfe'
756 biggerexample
= '\x01azAZ\x00\xff'
760 def test_subbclassing(self
):
761 class EditableString(array
.array
):
762 def __new__(cls
, s
, *args
, **kwargs
):
763 return array
.array
.__new
__(cls
, 'c', s
)
765 def __init__(self
, s
, color
='blue'):
769 self
[:] = array
.array('c', self
.tostring().strip())
772 return 'EditableString(%r)' % self
.tostring()
774 s
= EditableString("\ttest\r\n")
776 self
.assertEqual(s
.tostring(), "test")
778 self
.assertEqual(s
.color
, "blue")
780 self
.assertEqual(s
.color
, "red")
781 self
.assertEqual(s
.__dict
__.keys(), ["color"])
783 def test_nounicode(self
):
784 a
= array
.array(self
.typecode
, self
.example
)
785 self
.assertRaises(ValueError, a
.fromunicode
, unicode(''))
786 self
.assertRaises(ValueError, a
.tounicode
)
788 tests
.append(CharacterTest
)
790 if test_support
.have_unicode
:
791 class UnicodeTest(StringTest
):
793 example
= unicode(r
'\x01\u263a\x00\ufeff', 'unicode-escape')
794 smallerexample
= unicode(r
'\x01\u263a\x00\ufefe', 'unicode-escape')
795 biggerexample
= unicode(r
'\x01\u263a\x01\ufeff', 'unicode-escape')
796 outside
= unicode('\x33')
799 def test_unicode(self
):
800 self
.assertRaises(TypeError, array
.array
, 'b', unicode('foo', 'ascii'))
802 a
= array
.array('u', unicode(r
'\xa0\xc2\u1234', 'unicode-escape'))
803 a
.fromunicode(unicode(' ', 'ascii'))
804 a
.fromunicode(unicode('', 'ascii'))
805 a
.fromunicode(unicode('', 'ascii'))
806 a
.fromunicode(unicode(r
'\x11abc\xff\u1234', 'unicode-escape'))
810 unicode(r
'\xa0\xc2\u1234 \x11abc\xff\u1234', 'unicode-escape')
813 s
= unicode(r
'\x00="\'a
\\b
\x80\xff\u0000\u0001\u1234
', 'unicode-escape
')
814 a = array.array('u
', s)
817 r"""array('u
', u'\x00="\'a\\b\x80\xff\x00\x01\u1234')"""
820 self.assertRaises(TypeError, a.fromunicode)
822 tests.append(UnicodeTest)
824 class NumberTest(BaseTest):
826 def test_extslice(self):
827 a = array.array(self.typecode, range(5))
828 self.assertEqual(a[::], a)
829 self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
830 self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
831 self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
832 self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
833 self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
834 self.assertEqual(a[-100:100:], a)
835 self.assertEqual(a[100:-100:-1], a[::-1])
836 self.assertEqual(a[-100L:100L:2L], array.array(self.typecode, [0,2,4]))
837 self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
838 self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
840 def test_delslice(self):
841 a = array.array(self.typecode, range(5))
843 self.assertEqual(a, array.array(self.typecode, [1,3]))
844 a = array.array(self.typecode, range(5))
846 self.assertEqual(a, array.array(self.typecode, [0,2,4]))
847 a = array.array(self.typecode, range(5))
849 self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
850 a = array.array(self.typecode, range(10))
852 self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
854 def test_assignment(self):
855 a = array.array(self.typecode, range(10))
856 a[::2] = array.array(self.typecode, [42]*5)
857 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
858 a = array.array(self.typecode, range(10))
859 a[::-4] = array.array(self.typecode, [10]*3)
860 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
861 a = array.array(self.typecode, range(4))
863 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
864 a = array.array(self.typecode, range(10))
867 ins = array.array(self.typecode, range(2))
872 def test_iterationcontains(self):
873 a = array.array(self.typecode, range(10))
874 self.assertEqual(list(a), range(10))
875 b = array.array(self.typecode, [20])
876 self.assertEqual(a[-1] in a, True)
877 self.assertEqual(b[0] not in a, True)
879 def check_overflow(self, lower, upper):
880 # method to be used by subclasses
882 # should not overflow assigning lower limit
883 a = array.array(self.typecode, [lower])
885 # should overflow assigning less than lower limit
886 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
887 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
888 # should not overflow assigning upper limit
889 a = array.array(self.typecode, [upper])
891 # should overflow assigning more than upper limit
892 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
893 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
895 def test_subclassing(self):
896 typecode = self.typecode
897 class ExaggeratingArray(array.array):
898 __slots__ = ['offset']
900 def __new__(cls, typecode, data, offset):
901 return array.array.__new__(cls, typecode, data)
903 def __init__(self, typecode, data, offset):
906 def __getitem__(self, i):
907 return array.array.__getitem__(self, i) + self.offset
909 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
910 self.assertEntryEqual(a[0], 7)
912 self.assertRaises(AttributeError, setattr, a, "color
", "blue
")
914 class SignedNumberTest(NumberTest):
915 example = [-1, 0, 1, 42, 0x7f]
916 smallerexample = [-1, 0, 1, 42, 0x7e]
917 biggerexample = [-1, 0, 1, 43, 0x7f]
920 def test_overflow(self):
921 a = array.array(self.typecode)
922 lower = -1 * long(pow(2, a.itemsize * 8 - 1))
923 upper = long(pow(2, a.itemsize * 8 - 1)) - 1L
924 self.check_overflow(lower, upper)
926 class UnsignedNumberTest(NumberTest):
927 example = [0, 1, 17, 23, 42, 0xff]
928 smallerexample = [0, 1, 17, 23, 42, 0xfe]
929 biggerexample = [0, 1, 17, 23, 43, 0xff]
932 def test_overflow(self):
933 a = array.array(self.typecode)
935 upper = long(pow(2, a.itemsize * 8)) - 1L
936 self.check_overflow(lower, upper)
939 class ByteTest(SignedNumberTest):
942 tests.append(ByteTest)
944 class UnsignedByteTest(UnsignedNumberTest):
947 tests.append(UnsignedByteTest)
949 class ShortTest(SignedNumberTest):
952 tests.append(ShortTest)
954 class UnsignedShortTest(UnsignedNumberTest):
957 tests.append(UnsignedShortTest)
959 class IntTest(SignedNumberTest):
962 tests.append(IntTest)
964 class UnsignedIntTest(UnsignedNumberTest):
967 tests.append(UnsignedIntTest)
969 class LongTest(SignedNumberTest):
972 tests.append(LongTest)
974 class UnsignedLongTest(UnsignedNumberTest):
977 tests.append(UnsignedLongTest)
979 class FPTest(NumberTest):
980 example = [-42.0, 0, 42, 1e5, -1e10]
981 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
982 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
985 def assertEntryEqual(self, entry1, entry2):
986 self.assertAlmostEqual(entry1, entry2)
988 def test_byteswap(self):
989 a = array.array(self.typecode, self.example)
990 self.assertRaises(TypeError, a.byteswap, 42)
991 if a.itemsize in (1, 2, 4, 8):
992 b = array.array(self.typecode, self.example)
995 self.assertEqual(a, b)
997 # On alphas treating the byte swapped bit patters as
998 # floats/doubles results in floating point exceptions
999 # => compare the 8bit string values instead
1000 self.assertNotEqual(a.tostring(), b.tostring())
1002 self.assertEqual(a, b)
1004 class FloatTest(FPTest):
1007 tests.append(FloatTest)
1009 class DoubleTest(FPTest):
1013 def test_alloc_overflow(self):
1014 from sys import maxsize
1015 a = array.array('d', [-1]*65536)
1017 a *= maxsize//65536 + 1
1021 self.fail("Array of size
> maxsize created
- MemoryError expected
")
1022 b = array.array('d', [ 2.71828183, 3.14159265, -1])
1024 b * (maxsize//3 + 1)
1028 self.fail("Array of size
> maxsize created
- MemoryError expected
")
1030 tests.append(DoubleTest)
1032 def test_main(verbose=None):
1035 test_support.run_unittest(*tests)
1037 # verify reference counting
1038 if verbose and hasattr(sys, "gettotalrefcount
"):
1041 for i in xrange(len(counts)):
1042 test_support.run_unittest(*tests)
1044 counts[i] = sys.gettotalrefcount()
1047 if __name__ == "__main__
":
1048 test_main(verbose=True)