]>
git.proxmox.com Git - mirror_edk2.git/blob - AppPkg/Applications/Python/Python-2.7.2/Lib/test/test_array.py
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
__(self
, 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_fromfile_ioerror(self
):
192 # Issue #5395: Check if fromfile raises a proper IOError
193 # instead of EOFError.
194 a
= array
.array(self
.typecode
)
195 f
= open(test_support
.TESTFN
, 'wb')
197 self
.assertRaises(IOError, a
.fromfile
, f
, len(self
.example
))
200 test_support
.unlink(test_support
.TESTFN
)
202 def test_filewrite(self
):
203 a
= array
.array(self
.typecode
, 2*self
.example
)
204 f
= open(test_support
.TESTFN
, 'wb')
208 b
= array
.array(self
.typecode
)
209 f
= open(test_support
.TESTFN
, 'rb')
210 b
.fromfile(f
, len(self
.example
))
211 self
.assertEqual(b
, array
.array(self
.typecode
, self
.example
))
212 self
.assertNotEqual(a
, b
)
213 b
.fromfile(f
, len(self
.example
))
214 self
.assertEqual(a
, b
)
219 test_support
.unlink(test_support
.TESTFN
)
221 def test_tofromlist(self
):
222 a
= array
.array(self
.typecode
, 2*self
.example
)
223 b
= array
.array(self
.typecode
)
224 self
.assertRaises(TypeError, a
.tolist
, 42)
225 self
.assertRaises(TypeError, b
.fromlist
)
226 self
.assertRaises(TypeError, b
.fromlist
, 42)
227 self
.assertRaises(TypeError, b
.fromlist
, [None])
228 b
.fromlist(a
.tolist())
229 self
.assertEqual(a
, b
)
231 def test_tofromstring(self
):
232 a
= array
.array(self
.typecode
, 2*self
.example
)
233 b
= array
.array(self
.typecode
)
234 self
.assertRaises(TypeError, a
.tostring
, 42)
235 self
.assertRaises(TypeError, b
.fromstring
)
236 self
.assertRaises(TypeError, b
.fromstring
, 42)
237 b
.fromstring(a
.tostring())
238 self
.assertEqual(a
, b
)
240 self
.assertRaises(ValueError, b
.fromstring
, "x")
243 a
= array
.array(self
.typecode
, 2*self
.example
)
244 self
.assertEqual(a
, eval(repr(a
), {"array": array
.array
}))
246 a
= array
.array(self
.typecode
)
247 self
.assertEqual(repr(a
), "array('%s')" % self
.typecode
)
250 a
= array
.array(self
.typecode
, 2*self
.example
)
254 a
= array
.array(self
.typecode
, self
.example
)
255 self
.assertTrue((a
== 42) is False)
256 self
.assertTrue((a
!= 42) is True)
258 self
.assertTrue((a
== a
) is True)
259 self
.assertTrue((a
!= a
) is False)
260 self
.assertTrue((a
< a
) is False)
261 self
.assertTrue((a
<= a
) is True)
262 self
.assertTrue((a
> a
) is False)
263 self
.assertTrue((a
>= a
) is True)
265 al
= array
.array(self
.typecode
, self
.smallerexample
)
266 ab
= array
.array(self
.typecode
, self
.biggerexample
)
268 self
.assertTrue((a
== 2*a
) is False)
269 self
.assertTrue((a
!= 2*a
) is True)
270 self
.assertTrue((a
< 2*a
) is True)
271 self
.assertTrue((a
<= 2*a
) is True)
272 self
.assertTrue((a
> 2*a
) is False)
273 self
.assertTrue((a
>= 2*a
) is False)
275 self
.assertTrue((a
== al
) is False)
276 self
.assertTrue((a
!= al
) is True)
277 self
.assertTrue((a
< al
) is False)
278 self
.assertTrue((a
<= al
) is False)
279 self
.assertTrue((a
> al
) is True)
280 self
.assertTrue((a
>= al
) is True)
282 self
.assertTrue((a
== ab
) is False)
283 self
.assertTrue((a
!= ab
) is True)
284 self
.assertTrue((a
< ab
) is True)
285 self
.assertTrue((a
<= ab
) is True)
286 self
.assertTrue((a
> ab
) is False)
287 self
.assertTrue((a
>= ab
) is False)
290 a
= array
.array(self
.typecode
, self
.example
) \
291 + array
.array(self
.typecode
, self
.example
[::-1])
294 array
.array(self
.typecode
, self
.example
+ self
.example
[::-1])
297 b
= array
.array(self
.badtypecode())
298 self
.assertRaises(TypeError, a
.__add
__, b
)
300 self
.assertRaises(TypeError, a
.__add
__, "bad")
303 a
= array
.array(self
.typecode
, self
.example
[::-1])
305 a
+= array
.array(self
.typecode
, 2*self
.example
)
306 self
.assertTrue(a
is b
)
309 array
.array(self
.typecode
, self
.example
[::-1]+2*self
.example
)
311 a
= array
.array(self
.typecode
, self
.example
)
315 array
.array(self
.typecode
, self
.example
+ self
.example
)
318 b
= array
.array(self
.badtypecode())
319 self
.assertRaises(TypeError, a
.__add
__, b
)
321 self
.assertRaises(TypeError, a
.__iadd
__, "bad")
324 a
= 5*array
.array(self
.typecode
, self
.example
)
327 array
.array(self
.typecode
, 5*self
.example
)
330 a
= array
.array(self
.typecode
, self
.example
)*5
333 array
.array(self
.typecode
, self
.example
*5)
336 a
= 0*array
.array(self
.typecode
, self
.example
)
339 array
.array(self
.typecode
)
342 a
= (-1)*array
.array(self
.typecode
, self
.example
)
345 array
.array(self
.typecode
)
348 self
.assertRaises(TypeError, a
.__mul
__, "bad")
351 a
= array
.array(self
.typecode
, self
.example
)
355 self
.assertTrue(a
is b
)
358 array
.array(self
.typecode
, 5*self
.example
)
362 self
.assertTrue(a
is b
)
363 self
.assertEqual(a
, array
.array(self
.typecode
))
366 self
.assertTrue(a
is b
)
367 self
.assertEqual(a
, array
.array(self
.typecode
))
370 self
.assertTrue(a
is b
)
371 self
.assertEqual(a
, array
.array(self
.typecode
))
373 a
= array
.array(self
.typecode
, self
.example
)
375 self
.assertEqual(a
, array
.array(self
.typecode
))
377 self
.assertRaises(TypeError, a
.__imul
__, "bad")
379 def test_getitem(self
):
380 a
= array
.array(self
.typecode
, self
.example
)
381 self
.assertEntryEqual(a
[0], self
.example
[0])
382 self
.assertEntryEqual(a
[0L], self
.example
[0])
383 self
.assertEntryEqual(a
[-1], self
.example
[-1])
384 self
.assertEntryEqual(a
[-1L], self
.example
[-1])
385 self
.assertEntryEqual(a
[len(self
.example
)-1], self
.example
[-1])
386 self
.assertEntryEqual(a
[-len(self
.example
)], self
.example
[0])
387 self
.assertRaises(TypeError, a
.__getitem
__)
388 self
.assertRaises(IndexError, a
.__getitem
__, len(self
.example
))
389 self
.assertRaises(IndexError, a
.__getitem
__, -len(self
.example
)-1)
391 def test_setitem(self
):
392 a
= array
.array(self
.typecode
, self
.example
)
394 self
.assertEntryEqual(a
[0], a
[-1])
396 a
= array
.array(self
.typecode
, self
.example
)
398 self
.assertEntryEqual(a
[0], a
[-1])
400 a
= array
.array(self
.typecode
, self
.example
)
402 self
.assertEntryEqual(a
[0], a
[-1])
404 a
= array
.array(self
.typecode
, self
.example
)
406 self
.assertEntryEqual(a
[0], a
[-1])
408 a
= array
.array(self
.typecode
, self
.example
)
409 a
[len(self
.example
)-1] = a
[0]
410 self
.assertEntryEqual(a
[0], a
[-1])
412 a
= array
.array(self
.typecode
, self
.example
)
413 a
[-len(self
.example
)] = a
[-1]
414 self
.assertEntryEqual(a
[0], a
[-1])
416 self
.assertRaises(TypeError, a
.__setitem
__)
417 self
.assertRaises(TypeError, a
.__setitem
__, None)
418 self
.assertRaises(TypeError, a
.__setitem
__, 0, None)
422 len(self
.example
), self
.example
[0]
427 -len(self
.example
)-1, self
.example
[0]
430 def test_delitem(self
):
431 a
= array
.array(self
.typecode
, self
.example
)
435 array
.array(self
.typecode
, self
.example
[1:])
438 a
= array
.array(self
.typecode
, self
.example
)
442 array
.array(self
.typecode
, self
.example
[:-1])
445 a
= array
.array(self
.typecode
, self
.example
)
446 del a
[len(self
.example
)-1]
449 array
.array(self
.typecode
, self
.example
[:-1])
452 a
= array
.array(self
.typecode
, self
.example
)
453 del a
[-len(self
.example
)]
456 array
.array(self
.typecode
, self
.example
[1:])
459 self
.assertRaises(TypeError, a
.__delitem
__)
460 self
.assertRaises(TypeError, a
.__delitem
__, None)
461 self
.assertRaises(IndexError, a
.__delitem
__, len(self
.example
))
462 self
.assertRaises(IndexError, a
.__delitem
__, -len(self
.example
)-1)
464 def test_getslice(self
):
465 a
= array
.array(self
.typecode
, self
.example
)
466 self
.assertEqual(a
[:], a
)
470 array
.array(self
.typecode
, self
.example
[1:])
475 array
.array(self
.typecode
, self
.example
[:1])
480 array
.array(self
.typecode
, self
.example
[:-1])
485 array
.array(self
.typecode
, self
.example
[-1:])
490 array
.array(self
.typecode
)
495 array
.array(self
.typecode
)
500 array
.array(self
.typecode
)
502 self
.assertEqual(a
[-1000:], a
)
503 self
.assertEqual(a
[:1000], a
)
506 array
.array(self
.typecode
)
508 self
.assertEqual(a
[-1000:1000], a
)
511 array
.array(self
.typecode
)
514 def test_extended_getslice(self
):
515 # Test extended slicing by comparing with list slicing
516 # (Assumes list conversion works correctly, too)
517 a
= array
.array(self
.typecode
, self
.example
)
518 indices
= (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
519 for start
in indices
:
521 # Everything except the initial 0 (invalid step)
522 for step
in indices
[1:]:
523 self
.assertEqual(list(a
[start
:stop
:step
]),
524 list(a
)[start
:stop
:step
])
526 def test_setslice(self
):
527 a
= array
.array(self
.typecode
, self
.example
)
531 array
.array(self
.typecode
, self
.example
+ self
.example
[1:])
534 a
= array
.array(self
.typecode
, self
.example
)
538 array
.array(self
.typecode
, self
.example
+ self
.example
[-1:])
541 a
= array
.array(self
.typecode
, self
.example
)
545 array
.array(self
.typecode
, self
.example
[:-1] + self
.example
)
548 a
= array
.array(self
.typecode
, self
.example
)
552 array
.array(self
.typecode
, self
.example
[:1] + self
.example
)
555 a
= array
.array(self
.typecode
, self
.example
)
561 self
.example
[:1] + self
.example
+ self
.example
[-1:]
565 a
= array
.array(self
.typecode
, self
.example
)
569 array
.array(self
.typecode
, 2*self
.example
)
572 a
= array
.array(self
.typecode
, self
.example
)
576 array
.array(self
.typecode
, self
.example
)
579 a
= array
.array(self
.typecode
, self
.example
)
583 array
.array(self
.typecode
, self
.example
)
586 a
= array
.array(self
.typecode
, self
.example
)
590 array
.array(self
.typecode
, 2*self
.example
)
593 a
= array
.array(self
.typecode
, self
.example
)
597 array
.array(self
.typecode
, self
.example
[:1] + self
.example
+ self
.example
[1:])
600 a
= array
.array(self
.typecode
, self
.example
)
604 array
.array(self
.typecode
, 2*self
.example
)
607 a
= array
.array(self
.typecode
, self
.example
)
608 self
.assertRaises(TypeError, a
.__setslice
__, 0, 0, None)
609 self
.assertRaises(TypeError, a
.__setitem
__, slice(0, 0), None)
610 self
.assertRaises(TypeError, a
.__setitem
__, slice(0, 1), None)
612 b
= array
.array(self
.badtypecode())
613 self
.assertRaises(TypeError, a
.__setslice
__, 0, 0, b
)
614 self
.assertRaises(TypeError, a
.__setitem
__, slice(0, 0), b
)
615 self
.assertRaises(TypeError, a
.__setitem
__, slice(0, 1), b
)
617 def test_extended_set_del_slice(self
):
618 indices
= (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
619 for start
in indices
:
621 # Everything except the initial 0 (invalid step)
622 for step
in indices
[1:]:
623 a
= array
.array(self
.typecode
, self
.example
)
625 # Make sure we have a slice of exactly the right length,
626 # but with (hopefully) different data.
627 data
= L
[start
:stop
:step
]
629 L
[start
:stop
:step
] = data
630 a
[start
:stop
:step
] = array
.array(self
.typecode
, data
)
631 self
.assertEqual(a
, array
.array(self
.typecode
, L
))
633 del L
[start
:stop
:step
]
634 del a
[start
:stop
:step
]
635 self
.assertEqual(a
, array
.array(self
.typecode
, L
))
637 def test_index(self
):
638 example
= 2*self
.example
639 a
= array
.array(self
.typecode
, example
)
640 self
.assertRaises(TypeError, a
.index
)
642 self
.assertEqual(a
.index(x
), example
.index(x
))
643 self
.assertRaises(ValueError, a
.index
, None)
644 self
.assertRaises(ValueError, a
.index
, self
.outside
)
646 def test_count(self
):
647 example
= 2*self
.example
648 a
= array
.array(self
.typecode
, example
)
649 self
.assertRaises(TypeError, a
.count
)
651 self
.assertEqual(a
.count(x
), example
.count(x
))
652 self
.assertEqual(a
.count(self
.outside
), 0)
653 self
.assertEqual(a
.count(None), 0)
655 def test_remove(self
):
656 for x
in self
.example
:
657 example
= 2*self
.example
658 a
= array
.array(self
.typecode
, example
)
659 pos
= example
.index(x
)
660 example2
= example
[:pos
] + example
[pos
+1:]
662 self
.assertEqual(a
, array
.array(self
.typecode
, example2
))
664 a
= array
.array(self
.typecode
, self
.example
)
665 self
.assertRaises(ValueError, a
.remove
, self
.outside
)
667 self
.assertRaises(ValueError, a
.remove
, None)
670 a
= array
.array(self
.typecode
)
671 self
.assertRaises(IndexError, a
.pop
)
673 a
= array
.array(self
.typecode
, 2*self
.example
)
674 self
.assertRaises(TypeError, a
.pop
, 42, 42)
675 self
.assertRaises(TypeError, a
.pop
, None)
676 self
.assertRaises(IndexError, a
.pop
, len(a
))
677 self
.assertRaises(IndexError, a
.pop
, -len(a
)-1)
679 self
.assertEntryEqual(a
.pop(0), self
.example
[0])
682 array
.array(self
.typecode
, self
.example
[1:]+self
.example
)
684 self
.assertEntryEqual(a
.pop(1), self
.example
[2])
687 array
.array(self
.typecode
, self
.example
[1:2]+self
.example
[3:]+self
.example
)
689 self
.assertEntryEqual(a
.pop(0), self
.example
[1])
690 self
.assertEntryEqual(a
.pop(), self
.example
[-1])
693 array
.array(self
.typecode
, self
.example
[3:]+self
.example
[:-1])
696 def test_reverse(self
):
697 a
= array
.array(self
.typecode
, self
.example
)
698 self
.assertRaises(TypeError, a
.reverse
, 42)
702 array
.array(self
.typecode
, self
.example
[::-1])
705 def test_extend(self
):
706 a
= array
.array(self
.typecode
, self
.example
)
707 self
.assertRaises(TypeError, a
.extend
)
708 a
.extend(array
.array(self
.typecode
, self
.example
[::-1]))
711 array
.array(self
.typecode
, self
.example
+self
.example
[::-1])
714 a
= array
.array(self
.typecode
, self
.example
)
718 array
.array(self
.typecode
, self
.example
+self
.example
)
721 b
= array
.array(self
.badtypecode())
722 self
.assertRaises(TypeError, a
.extend
, b
)
724 a
= array
.array(self
.typecode
, self
.example
)
725 a
.extend(self
.example
[::-1])
728 array
.array(self
.typecode
, self
.example
+self
.example
[::-1])
731 def test_constructor_with_iterable_argument(self
):
732 a
= array
.array(self
.typecode
, iter(self
.example
))
733 b
= array
.array(self
.typecode
, self
.example
)
734 self
.assertEqual(a
, b
)
736 # non-iterable argument
737 self
.assertRaises(TypeError, array
.array
, self
.typecode
, 10)
739 # pass through errors raised in __iter__
743 self
.assertRaises(UnicodeError, array
.array
, self
.typecode
, A())
745 # pass through errors raised in next()
749 self
.assertRaises(UnicodeError, array
.array
, self
.typecode
, B())
751 def test_coveritertraverse(self
):
756 a
= array
.array(self
.typecode
)
761 def test_buffer(self
):
762 a
= array
.array(self
.typecode
, self
.example
)
763 with test_support
.check_py3k_warnings():
765 self
.assertEqual(b
[0], a
.tostring()[0])
767 def test_weakref(self
):
768 s
= array
.array(self
.typecode
, self
.example
)
770 self
.assertEqual(p
.tostring(), s
.tostring())
772 self
.assertRaises(ReferenceError, len, p
)
774 def test_bug_782369(self
):
776 if hasattr(sys
, "getrefcount"):
778 b
= array
.array('B', range(64))
779 rc
= sys
.getrefcount(10)
781 b
= array
.array('B', range(64))
782 self
.assertEqual(rc
, sys
.getrefcount(10))
784 def test_subclass_with_kwargs(self
):
785 # SF bug #1486663 -- this used to erroneously raise a TypeError
786 ArraySubclassWithKwargs('b', newarg
=1)
789 class StringTest(BaseTest
):
791 def test_setitem(self
):
792 super(StringTest
, self
).test_setitem()
793 a
= array
.array(self
.typecode
, self
.example
)
794 self
.assertRaises(TypeError, a
.__setitem
__, 0, self
.example
[:2])
796 class CharacterTest(StringTest
):
798 example
= '\x01azAZ\x00\xfe'
799 smallerexample
= '\x01azAY\x00\xfe'
800 biggerexample
= '\x01azAZ\x00\xff'
804 def test_subbclassing(self
):
805 class EditableString(array
.array
):
806 def __new__(cls
, s
, *args
, **kwargs
):
807 return array
.array
.__new
__(cls
, 'c', s
)
809 def __init__(self
, s
, color
='blue'):
813 self
[:] = array
.array('c', self
.tostring().strip())
816 return 'EditableString(%r)' % self
.tostring()
818 s
= EditableString("\ttest\r\n")
820 self
.assertEqual(s
.tostring(), "test")
822 self
.assertEqual(s
.color
, "blue")
824 self
.assertEqual(s
.color
, "red")
825 self
.assertEqual(s
.__dict
__.keys(), ["color"])
827 def test_nounicode(self
):
828 a
= array
.array(self
.typecode
, self
.example
)
829 self
.assertRaises(ValueError, a
.fromunicode
, unicode(''))
830 self
.assertRaises(ValueError, a
.tounicode
)
832 tests
.append(CharacterTest
)
834 if test_support
.have_unicode
:
835 class UnicodeTest(StringTest
):
837 example
= unicode(r
'\x01\u263a\x00\ufeff', 'unicode-escape')
838 smallerexample
= unicode(r
'\x01\u263a\x00\ufefe', 'unicode-escape')
839 biggerexample
= unicode(r
'\x01\u263a\x01\ufeff', 'unicode-escape')
840 outside
= unicode('\x33')
843 def test_unicode(self
):
844 self
.assertRaises(TypeError, array
.array
, 'b', unicode('foo', 'ascii'))
846 a
= array
.array('u', unicode(r
'\xa0\xc2\u1234', 'unicode-escape'))
847 a
.fromunicode(unicode(' ', 'ascii'))
848 a
.fromunicode(unicode('', 'ascii'))
849 a
.fromunicode(unicode('', 'ascii'))
850 a
.fromunicode(unicode(r
'\x11abc\xff\u1234', 'unicode-escape'))
854 unicode(r
'\xa0\xc2\u1234 \x11abc\xff\u1234', 'unicode-escape')
857 s
= unicode(r
'\x00="\'a
\\b
\x80\xff\u0000\u0001\u1234
', 'unicode-escape
')
858 a = array.array('u
', s)
861 r"""array('u
', u'\x00="\'a\\b\x80\xff\x00\x01\u1234')"""
864 self.assertRaises(TypeError, a.fromunicode)
866 tests.append(UnicodeTest)
868 class NumberTest(BaseTest):
870 def test_extslice(self):
871 a = array.array(self.typecode, range(5))
872 self.assertEqual(a[::], a)
873 self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
874 self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
875 self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
876 self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
877 self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
878 self.assertEqual(a[-100:100:], a)
879 self.assertEqual(a[100:-100:-1], a[::-1])
880 self.assertEqual(a[-100L:100L:2L], array.array(self.typecode, [0,2,4]))
881 self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
882 self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
884 def test_delslice(self):
885 a = array.array(self.typecode, range(5))
887 self.assertEqual(a, array.array(self.typecode, [1,3]))
888 a = array.array(self.typecode, range(5))
890 self.assertEqual(a, array.array(self.typecode, [0,2,4]))
891 a = array.array(self.typecode, range(5))
893 self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
894 a = array.array(self.typecode, range(10))
896 self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
898 a = array.array(self.typecode, range(10))
901 def test_assignment(self):
902 a = array.array(self.typecode, range(10))
903 a[::2] = array.array(self.typecode, [42]*5)
904 self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
905 a = array.array(self.typecode, range(10))
906 a[::-4] = array.array(self.typecode, [10]*3)
907 self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
908 a = array.array(self.typecode, range(4))
910 self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
911 a = array.array(self.typecode, range(10))
914 ins = array.array(self.typecode, range(2))
919 def test_iterationcontains(self):
920 a = array.array(self.typecode, range(10))
921 self.assertEqual(list(a), range(10))
922 b = array.array(self.typecode, [20])
923 self.assertEqual(a[-1] in a, True)
924 self.assertEqual(b[0] not in a, True)
926 def check_overflow(self, lower, upper):
927 # method to be used by subclasses
929 # should not overflow assigning lower limit
930 a = array.array(self.typecode, [lower])
932 # should overflow assigning less than lower limit
933 self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
934 self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
935 # should not overflow assigning upper limit
936 a = array.array(self.typecode, [upper])
938 # should overflow assigning more than upper limit
939 self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
940 self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
942 def test_subclassing(self):
943 typecode = self.typecode
944 class ExaggeratingArray(array.array):
945 __slots__ = ['offset']
947 def __new__(cls, typecode, data, offset):
948 return array.array.__new__(cls, typecode, data)
950 def __init__(self, typecode, data, offset):
953 def __getitem__(self, i):
954 return array.array.__getitem__(self, i) + self.offset
956 a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
957 self.assertEntryEqual(a[0], 7)
959 self.assertRaises(AttributeError, setattr, a, "color
", "blue
")
961 class SignedNumberTest(NumberTest):
962 example = [-1, 0, 1, 42, 0x7f]
963 smallerexample = [-1, 0, 1, 42, 0x7e]
964 biggerexample = [-1, 0, 1, 43, 0x7f]
967 def test_overflow(self):
968 a = array.array(self.typecode)
969 lower = -1 * long(pow(2, a.itemsize * 8 - 1))
970 upper = long(pow(2, a.itemsize * 8 - 1)) - 1L
971 self.check_overflow(lower, upper)
973 class UnsignedNumberTest(NumberTest):
974 example = [0, 1, 17, 23, 42, 0xff]
975 smallerexample = [0, 1, 17, 23, 42, 0xfe]
976 biggerexample = [0, 1, 17, 23, 43, 0xff]
979 def test_overflow(self):
980 a = array.array(self.typecode)
982 upper = long(pow(2, a.itemsize * 8)) - 1L
983 self.check_overflow(lower, upper)
986 class ByteTest(SignedNumberTest):
989 tests.append(ByteTest)
991 class UnsignedByteTest(UnsignedNumberTest):
994 tests.append(UnsignedByteTest)
996 class ShortTest(SignedNumberTest):
999 tests.append(ShortTest)
1001 class UnsignedShortTest(UnsignedNumberTest):
1004 tests.append(UnsignedShortTest)
1006 class IntTest(SignedNumberTest):
1009 tests.append(IntTest)
1011 class UnsignedIntTest(UnsignedNumberTest):
1014 tests.append(UnsignedIntTest)
1016 class LongTest(SignedNumberTest):
1019 tests.append(LongTest)
1021 class UnsignedLongTest(UnsignedNumberTest):
1024 tests.append(UnsignedLongTest)
1026 class FPTest(NumberTest):
1027 example = [-42.0, 0, 42, 1e5, -1e10]
1028 smallerexample = [-42.0, 0, 42, 1e5, -2e10]
1029 biggerexample = [-42.0, 0, 42, 1e5, 1e10]
1032 def assertEntryEqual(self, entry1, entry2):
1033 self.assertAlmostEqual(entry1, entry2)
1035 def test_byteswap(self):
1036 a = array.array(self.typecode, self.example)
1037 self.assertRaises(TypeError, a.byteswap, 42)
1038 if a.itemsize in (1, 2, 4, 8):
1039 b = array.array(self.typecode, self.example)
1042 self.assertEqual(a, b)
1044 # On alphas treating the byte swapped bit patters as
1045 # floats/doubles results in floating point exceptions
1046 # => compare the 8bit string values instead
1047 self.assertNotEqual(a.tostring(), b.tostring())
1049 self.assertEqual(a, b)
1051 class FloatTest(FPTest):
1054 tests.append(FloatTest)
1056 class DoubleTest(FPTest):
1060 def test_alloc_overflow(self):
1061 from sys import maxsize
1062 a = array.array('d', [-1]*65536)
1064 a *= maxsize//65536 + 1
1068 self.fail("Array of size
> maxsize created
- MemoryError expected
")
1069 b = array.array('d', [ 2.71828183, 3.14159265, -1])
1071 b * (maxsize//3 + 1)
1075 self.fail("Array of size
> maxsize created
- MemoryError expected
")
1077 tests.append(DoubleTest)
1079 def test_main(verbose=None):
1082 test_support.run_unittest(*tests)
1084 # verify reference counting
1085 if verbose and hasattr(sys, "gettotalrefcount
"):
1088 for i in xrange(len(counts)):
1089 test_support.run_unittest(*tests)
1091 counts[i] = sys.gettotalrefcount()
1094 if __name__ == "__main__
":
1095 test_main(verbose=True)