2
"""Test the arraymodule.
7
from test import support
8
from weakref import proxy
10
from pickle import loads, dumps, HIGHEST_PROTOCOL
13
class ArraySubclass(array.array):
16
class ArraySubclassWithKwargs(array.array):
17
def __init__(self, typecode, newarg=None):
18
array.array.__init__(typecode)
20
tests = [] # list to accumulate all tests
21
typecodes = "ubBhHiIlLfd"
23
class BadConstructorTest(unittest.TestCase):
25
def test_constructor(self):
26
self.assertRaises(TypeError, array.array)
27
self.assertRaises(TypeError, array.array, spam=42)
28
self.assertRaises(TypeError, array.array, 'xx')
29
self.assertRaises(ValueError, array.array, 'x')
31
tests.append(BadConstructorTest)
33
class BaseTest(unittest.TestCase):
34
# Required class attributes (provided by subclasses
35
# typecode: the typecode to test
36
# example: an initializer usable in the constructor for this type
37
# smallerexample: the same length as example, but smaller
38
# biggerexample: the same length as example, but bigger
39
# outside: An entry that is not in example
40
# minitemsize: the minimum guaranteed itemsize
42
def assertEntryEqual(self, entry1, entry2):
43
self.assertEqual(entry1, entry2)
45
def badtypecode(self):
46
# Return a typecode that is different from our own
47
return typecodes[(typecodes.index(self.typecode)+1) % len(typecodes)]
49
def test_constructor(self):
50
a = array.array(self.typecode)
51
self.assertEqual(a.typecode, self.typecode)
52
self.assert_(a.itemsize>=self.minitemsize)
53
self.assertRaises(TypeError, array.array, self.typecode, None)
56
a = array.array(self.typecode)
57
a.append(self.example[0])
58
self.assertEqual(len(a), 1)
60
a = array.array(self.typecode, self.example)
61
self.assertEqual(len(a), len(self.example))
63
def test_buffer_info(self):
64
a = array.array(self.typecode, self.example)
65
self.assertRaises(TypeError, a.buffer_info, 42)
67
self.assert_(isinstance(bi, tuple))
68
self.assertEqual(len(bi), 2)
69
self.assert_(isinstance(bi[0], int))
70
self.assert_(isinstance(bi[1], int))
71
self.assertEqual(bi[1], len(a))
73
def test_byteswap(self):
74
a = array.array(self.typecode, self.example)
75
self.assertRaises(TypeError, a.byteswap, 42)
76
if a.itemsize in (1, 2, 4, 8):
77
b = array.array(self.typecode, self.example)
80
self.assertEqual(a, b)
82
self.assertNotEqual(a, b)
84
self.assertEqual(a, b)
88
a = array.array(self.typecode, self.example)
90
self.assertNotEqual(id(a), id(b))
91
self.assertEqual(a, b)
93
def test_deepcopy(self):
95
a = array.array(self.typecode, self.example)
97
self.assertNotEqual(id(a), id(b))
98
self.assertEqual(a, b)
100
def test_pickle(self):
101
for protocol in range(HIGHEST_PROTOCOL + 1):
102
a = array.array(self.typecode, self.example)
103
b = loads(dumps(a, protocol))
104
self.assertNotEqual(id(a), id(b))
105
self.assertEqual(a, b)
107
a = ArraySubclass(self.typecode, self.example)
109
b = loads(dumps(a, protocol))
110
self.assertNotEqual(id(a), id(b))
111
self.assertEqual(a, b)
112
self.assertEqual(a.x, b.x)
113
self.assertEqual(type(a), type(b))
115
def test_pickle_for_empty_array(self):
116
for protocol in range(HIGHEST_PROTOCOL + 1):
117
a = array.array(self.typecode)
118
b = loads(dumps(a, protocol))
119
self.assertNotEqual(id(a), id(b))
120
self.assertEqual(a, b)
122
a = ArraySubclass(self.typecode)
124
b = loads(dumps(a, protocol))
125
self.assertNotEqual(id(a), id(b))
126
self.assertEqual(a, b)
127
self.assertEqual(a.x, b.x)
128
self.assertEqual(type(a), type(b))
130
def test_insert(self):
131
a = array.array(self.typecode, self.example)
132
a.insert(0, self.example[0])
133
self.assertEqual(len(a), 1+len(self.example))
134
self.assertEqual(a[0], a[1])
135
self.assertRaises(TypeError, a.insert)
136
self.assertRaises(TypeError, a.insert, None)
137
self.assertRaises(TypeError, a.insert, 0, None)
139
a = array.array(self.typecode, self.example)
140
a.insert(-1, self.example[0])
145
self.example[:-1] + self.example[:1] + self.example[-1:]
149
a = array.array(self.typecode, self.example)
150
a.insert(-1000, self.example[0])
153
array.array(self.typecode, self.example[:1] + self.example)
156
a = array.array(self.typecode, self.example)
157
a.insert(1000, self.example[0])
160
array.array(self.typecode, self.example + self.example[:1])
163
def test_tofromfile(self):
164
a = array.array(self.typecode, 2*self.example)
165
self.assertRaises(TypeError, a.tofile)
166
support.unlink(support.TESTFN)
167
f = open(support.TESTFN, 'wb')
171
b = array.array(self.typecode)
172
f = open(support.TESTFN, 'rb')
173
self.assertRaises(TypeError, b.fromfile)
174
b.fromfile(f, len(self.example))
175
self.assertEqual(b, array.array(self.typecode, self.example))
176
self.assertNotEqual(a, b)
177
self.assertRaises(EOFError, b.fromfile, f, len(self.example)+1)
178
self.assertEqual(a, b)
183
support.unlink(support.TESTFN)
185
def test_tofromlist(self):
186
a = array.array(self.typecode, 2*self.example)
187
b = array.array(self.typecode)
188
self.assertRaises(TypeError, a.tolist, 42)
189
self.assertRaises(TypeError, b.fromlist)
190
self.assertRaises(TypeError, b.fromlist, 42)
191
self.assertRaises(TypeError, b.fromlist, [None])
192
b.fromlist(a.tolist())
193
self.assertEqual(a, b)
195
def test_tofromstring(self):
196
a = array.array(self.typecode, 2*self.example)
197
b = array.array(self.typecode)
198
self.assertRaises(TypeError, a.tostring, 42)
199
self.assertRaises(TypeError, b.fromstring)
200
self.assertRaises(TypeError, b.fromstring, 42)
201
b.fromstring(a.tostring())
202
self.assertEqual(a, b)
204
self.assertRaises(ValueError, b.fromstring, "x")
207
a = array.array(self.typecode, 2*self.example)
208
self.assertEqual(a, eval(repr(a), {"array": array.array}))
210
a = array.array(self.typecode)
211
self.assertEqual(repr(a), "array('%s')" % self.typecode)
214
a = array.array(self.typecode, 2*self.example)
218
a = array.array(self.typecode, self.example)
219
self.assert_((a == 42) is False)
220
self.assert_((a != 42) is True)
222
self.assert_((a == a) is True)
223
self.assert_((a != a) is False)
224
self.assert_((a < a) is False)
225
self.assert_((a <= a) is True)
226
self.assert_((a > a) is False)
227
self.assert_((a >= a) is True)
229
al = array.array(self.typecode, self.smallerexample)
230
ab = array.array(self.typecode, self.biggerexample)
232
self.assert_((a == 2*a) is False)
233
self.assert_((a != 2*a) is True)
234
self.assert_((a < 2*a) is True)
235
self.assert_((a <= 2*a) is True)
236
self.assert_((a > 2*a) is False)
237
self.assert_((a >= 2*a) is False)
239
self.assert_((a == al) is False)
240
self.assert_((a != al) is True)
241
self.assert_((a < al) is False)
242
self.assert_((a <= al) is False)
243
self.assert_((a > al) is True)
244
self.assert_((a >= al) is True)
246
self.assert_((a == ab) is False)
247
self.assert_((a != ab) is True)
248
self.assert_((a < ab) is True)
249
self.assert_((a <= ab) is True)
250
self.assert_((a > ab) is False)
251
self.assert_((a >= ab) is False)
254
a = array.array(self.typecode, self.example) \
255
+ array.array(self.typecode, self.example[::-1])
258
array.array(self.typecode, self.example + self.example[::-1])
261
b = array.array(self.badtypecode())
262
self.assertRaises(TypeError, a.__add__, b)
264
self.assertRaises(TypeError, a.__add__, "bad")
267
a = array.array(self.typecode, self.example[::-1])
269
a += array.array(self.typecode, 2*self.example)
273
array.array(self.typecode, self.example[::-1]+2*self.example)
276
b = array.array(self.badtypecode())
277
self.assertRaises(TypeError, a.__add__, b)
279
self.assertRaises(TypeError, a.__iadd__, "bad")
282
a = 5*array.array(self.typecode, self.example)
285
array.array(self.typecode, 5*self.example)
288
a = array.array(self.typecode, self.example)*5
291
array.array(self.typecode, self.example*5)
294
a = 0*array.array(self.typecode, self.example)
297
array.array(self.typecode)
300
a = (-1)*array.array(self.typecode, self.example)
303
array.array(self.typecode)
306
self.assertRaises(TypeError, a.__mul__, "bad")
309
a = array.array(self.typecode, self.example)
316
array.array(self.typecode, 5*self.example)
321
self.assertEqual(a, array.array(self.typecode))
325
self.assertEqual(a, array.array(self.typecode))
329
self.assertEqual(a, array.array(self.typecode))
331
a = array.array(self.typecode, self.example)
333
self.assertEqual(a, array.array(self.typecode))
335
self.assertRaises(TypeError, a.__imul__, "bad")
337
def test_getitem(self):
338
a = array.array(self.typecode, self.example)
339
self.assertEntryEqual(a[0], self.example[0])
340
self.assertEntryEqual(a[0], self.example[0])
341
self.assertEntryEqual(a[-1], self.example[-1])
342
self.assertEntryEqual(a[-1], self.example[-1])
343
self.assertEntryEqual(a[len(self.example)-1], self.example[-1])
344
self.assertEntryEqual(a[-len(self.example)], self.example[0])
345
self.assertRaises(TypeError, a.__getitem__)
346
self.assertRaises(IndexError, a.__getitem__, len(self.example))
347
self.assertRaises(IndexError, a.__getitem__, -len(self.example)-1)
349
def test_setitem(self):
350
a = array.array(self.typecode, self.example)
352
self.assertEntryEqual(a[0], a[-1])
354
a = array.array(self.typecode, self.example)
356
self.assertEntryEqual(a[0], a[-1])
358
a = array.array(self.typecode, self.example)
360
self.assertEntryEqual(a[0], a[-1])
362
a = array.array(self.typecode, self.example)
364
self.assertEntryEqual(a[0], a[-1])
366
a = array.array(self.typecode, self.example)
367
a[len(self.example)-1] = a[0]
368
self.assertEntryEqual(a[0], a[-1])
370
a = array.array(self.typecode, self.example)
371
a[-len(self.example)] = a[-1]
372
self.assertEntryEqual(a[0], a[-1])
374
self.assertRaises(TypeError, a.__setitem__)
375
self.assertRaises(TypeError, a.__setitem__, None)
376
self.assertRaises(TypeError, a.__setitem__, 0, None)
380
len(self.example), self.example[0]
385
-len(self.example)-1, self.example[0]
388
def test_delitem(self):
389
a = array.array(self.typecode, self.example)
393
array.array(self.typecode, self.example[1:])
396
a = array.array(self.typecode, self.example)
400
array.array(self.typecode, self.example[:-1])
403
a = array.array(self.typecode, self.example)
404
del a[len(self.example)-1]
407
array.array(self.typecode, self.example[:-1])
410
a = array.array(self.typecode, self.example)
411
del a[-len(self.example)]
414
array.array(self.typecode, self.example[1:])
417
self.assertRaises(TypeError, a.__delitem__)
418
self.assertRaises(TypeError, a.__delitem__, None)
419
self.assertRaises(IndexError, a.__delitem__, len(self.example))
420
self.assertRaises(IndexError, a.__delitem__, -len(self.example)-1)
422
def test_getslice(self):
423
a = array.array(self.typecode, self.example)
424
self.assertEqual(a[:], a)
428
array.array(self.typecode, self.example[1:])
433
array.array(self.typecode, self.example[:1])
438
array.array(self.typecode, self.example[:-1])
443
array.array(self.typecode, self.example[-1:])
448
array.array(self.typecode)
453
array.array(self.typecode)
458
array.array(self.typecode)
460
self.assertEqual(a[-1000:], a)
461
self.assertEqual(a[:1000], a)
464
array.array(self.typecode)
466
self.assertEqual(a[-1000:1000], a)
469
array.array(self.typecode)
472
def test_extended_getslice(self):
473
# Test extended slicing by comparing with list slicing
474
# (Assumes list conversion works correctly, too)
475
a = array.array(self.typecode, self.example)
476
indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
477
for start in indices:
479
# Everything except the initial 0 (invalid step)
480
for step in indices[1:]:
481
self.assertEqual(list(a[start:stop:step]),
482
list(a)[start:stop:step])
484
def test_setslice(self):
485
a = array.array(self.typecode, self.example)
489
array.array(self.typecode, self.example + self.example[1:])
492
a = array.array(self.typecode, self.example)
496
array.array(self.typecode, self.example + self.example[-1:])
499
a = array.array(self.typecode, self.example)
503
array.array(self.typecode, self.example[:-1] + self.example)
506
a = array.array(self.typecode, self.example)
510
array.array(self.typecode, self.example[:1] + self.example)
513
a = array.array(self.typecode, self.example)
519
self.example[:1] + self.example + self.example[-1:]
523
a = array.array(self.typecode, self.example)
527
array.array(self.typecode, 2*self.example)
530
a = array.array(self.typecode, self.example)
534
array.array(self.typecode, self.example)
537
a = array.array(self.typecode, self.example)
541
array.array(self.typecode, self.example)
544
a = array.array(self.typecode, self.example)
548
array.array(self.typecode, 2*self.example)
551
a = array.array(self.typecode, self.example)
555
array.array(self.typecode, self.example[:1] + self.example + self.example[1:])
558
a = array.array(self.typecode, self.example)
562
array.array(self.typecode, 2*self.example)
565
a = array.array(self.typecode, self.example)
566
self.assertRaises(TypeError, a.__setitem__, slice(0, 0), None)
567
self.assertRaises(TypeError, a.__setitem__, slice(0, 1), None)
569
b = array.array(self.badtypecode())
570
self.assertRaises(TypeError, a.__setitem__, slice(0, 0), b)
571
self.assertRaises(TypeError, a.__setitem__, slice(0, 1), b)
573
def test_extended_set_del_slice(self):
574
indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
575
for start in indices:
577
# Everything except the initial 0 (invalid step)
578
for step in indices[1:]:
579
a = array.array(self.typecode, self.example)
581
# Make sure we have a slice of exactly the right length,
582
# but with (hopefully) different data.
583
data = L[start:stop:step]
585
L[start:stop:step] = data
586
a[start:stop:step] = array.array(self.typecode, data)
587
self.assertEquals(a, array.array(self.typecode, L))
589
del L[start:stop:step]
590
del a[start:stop:step]
591
self.assertEquals(a, array.array(self.typecode, L))
593
def test_index(self):
594
example = 2*self.example
595
a = array.array(self.typecode, example)
596
self.assertRaises(TypeError, a.index)
598
self.assertEqual(a.index(x), example.index(x))
599
self.assertRaises(ValueError, a.index, None)
600
self.assertRaises(ValueError, a.index, self.outside)
602
def test_count(self):
603
example = 2*self.example
604
a = array.array(self.typecode, example)
605
self.assertRaises(TypeError, a.count)
607
self.assertEqual(a.count(x), example.count(x))
608
self.assertEqual(a.count(self.outside), 0)
609
self.assertEqual(a.count(None), 0)
611
def test_remove(self):
612
for x in self.example:
613
example = 2*self.example
614
a = array.array(self.typecode, example)
615
pos = example.index(x)
616
example2 = example[:pos] + example[pos+1:]
618
self.assertEqual(a, array.array(self.typecode, example2))
620
a = array.array(self.typecode, self.example)
621
self.assertRaises(ValueError, a.remove, self.outside)
623
self.assertRaises(ValueError, a.remove, None)
626
a = array.array(self.typecode)
627
self.assertRaises(IndexError, a.pop)
629
a = array.array(self.typecode, 2*self.example)
630
self.assertRaises(TypeError, a.pop, 42, 42)
631
self.assertRaises(TypeError, a.pop, None)
632
self.assertRaises(IndexError, a.pop, len(a))
633
self.assertRaises(IndexError, a.pop, -len(a)-1)
635
self.assertEntryEqual(a.pop(0), self.example[0])
638
array.array(self.typecode, self.example[1:]+self.example)
640
self.assertEntryEqual(a.pop(1), self.example[2])
643
array.array(self.typecode, self.example[1:2]+self.example[3:]+self.example)
645
self.assertEntryEqual(a.pop(0), self.example[1])
646
self.assertEntryEqual(a.pop(), self.example[-1])
649
array.array(self.typecode, self.example[3:]+self.example[:-1])
652
def test_reverse(self):
653
a = array.array(self.typecode, self.example)
654
self.assertRaises(TypeError, a.reverse, 42)
658
array.array(self.typecode, self.example[::-1])
661
def test_extend(self):
662
a = array.array(self.typecode, self.example)
663
self.assertRaises(TypeError, a.extend)
664
a.extend(array.array(self.typecode, self.example[::-1]))
667
array.array(self.typecode, self.example+self.example[::-1])
670
b = array.array(self.badtypecode())
671
self.assertRaises(TypeError, a.extend, b)
673
a = array.array(self.typecode, self.example)
674
a.extend(self.example[::-1])
677
array.array(self.typecode, self.example+self.example[::-1])
680
def test_constructor_with_iterable_argument(self):
681
a = array.array(self.typecode, iter(self.example))
682
b = array.array(self.typecode, self.example)
683
self.assertEqual(a, b)
685
# non-iterable argument
686
self.assertRaises(TypeError, array.array, self.typecode, 10)
688
# pass through errors raised in __iter__
692
self.assertRaises(UnicodeError, array.array, self.typecode, A())
694
# pass through errors raised in next()
698
self.assertRaises(UnicodeError, array.array, self.typecode, B())
700
def test_coveritertraverse(self):
705
a = array.array(self.typecode)
710
def test_buffer(self):
711
a = array.array(self.typecode, self.example)
714
self.assertEqual(b, a.tostring())
715
self.assertEqual(b[0], a.tostring()[0])
716
# Resizing is forbidden when there are buffer exports
717
self.assertRaises(BufferError, a.append, a[0])
718
self.assertRaises(BufferError, a.extend, a[0:1])
719
self.assertRaises(BufferError, a.remove, a[0])
720
self.assertRaises(BufferError, a.fromlist, a.tolist())
721
self.assertRaises(BufferError, a.fromstring, a.tostring())
722
if self.typecode == 'u':
723
self.assertRaises(BufferError, a.fromunicode, a.tounicode())
724
self.assertRaises(BufferError, operator.setitem, a, slice(0, 0), a)
725
self.assertRaises(BufferError, operator.delitem, a, 0)
726
self.assertRaises(BufferError, operator.delitem, a, slice(0, 1))
727
self.assertRaises(BufferError, operator.imul, a, 2)
728
self.assertRaises(BufferError, operator.imul, a, 0)
730
def test_weakref(self):
731
s = array.array(self.typecode, self.example)
733
self.assertEqual(p.tostring(), s.tostring())
735
self.assertRaises(ReferenceError, len, p)
737
def test_bug_782369(self):
739
if hasattr(sys, "getrefcount"):
741
b = array.array('B', range(64))
742
rc = sys.getrefcount(10)
744
b = array.array('B', range(64))
745
self.assertEqual(rc, sys.getrefcount(10))
747
def test_subclass_with_kwargs(self):
748
# SF bug #1486663 -- this used to erroneously raise a TypeError
749
ArraySubclassWithKwargs('b', newarg=1)
751
def test_create_from_bytes(self):
752
a = array.array('H', b"1234")
753
self.assertEqual(len(a) * a.itemsize, 4)
756
class StringTest(BaseTest):
758
def test_setitem(self):
759
super().test_setitem()
760
a = array.array(self.typecode, self.example)
761
self.assertRaises(TypeError, a.__setitem__, 0, self.example[:2])
763
class UnicodeTest(StringTest):
765
example = '\x01\u263a\x00\ufeff'
766
smallerexample = '\x01\u263a\x00\ufefe'
767
biggerexample = '\x01\u263a\x01\ufeff'
768
outside = str('\x33')
771
def test_unicode(self):
772
self.assertRaises(TypeError, array.array, 'b', 'foo')
774
a = array.array('u', '\xa0\xc2\u1234')
778
a.fromunicode('\x11abc\xff\u1234')
780
self.assertEqual(s, '\xa0\xc2\u1234 \x11abc\xff\u1234')
782
s = '\x00="\'a\\b\x80\xff\u0000\u0001\u1234'
783
a = array.array('u', s)
786
"array('u', '\\x00=\"\\'a\\\\b\\x80\xff\\x00\\x01\u1234')")
788
self.assertRaises(TypeError, a.fromunicode)
790
tests.append(UnicodeTest)
792
class NumberTest(BaseTest):
794
def test_extslice(self):
795
a = array.array(self.typecode, range(5))
796
self.assertEqual(a[::], a)
797
self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
798
self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
799
self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
800
self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
801
self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
802
self.assertEqual(a[-100:100:], a)
803
self.assertEqual(a[100:-100:-1], a[::-1])
804
self.assertEqual(a[-100:100:2], array.array(self.typecode, [0,2,4]))
805
self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
806
self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
808
def test_delslice(self):
809
a = array.array(self.typecode, range(5))
811
self.assertEqual(a, array.array(self.typecode, [1,3]))
812
a = array.array(self.typecode, range(5))
814
self.assertEqual(a, array.array(self.typecode, [0,2,4]))
815
a = array.array(self.typecode, range(5))
817
self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
818
a = array.array(self.typecode, range(10))
820
self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
822
def test_assignment(self):
823
a = array.array(self.typecode, range(10))
824
a[::2] = array.array(self.typecode, [42]*5)
825
self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
826
a = array.array(self.typecode, range(10))
827
a[::-4] = array.array(self.typecode, [10]*3)
828
self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
829
a = array.array(self.typecode, range(4))
831
self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
832
a = array.array(self.typecode, range(10))
835
ins = array.array(self.typecode, range(2))
840
def test_iterationcontains(self):
841
a = array.array(self.typecode, range(10))
842
self.assertEqual(list(a), list(range(10)))
843
b = array.array(self.typecode, [20])
844
self.assertEqual(a[-1] in a, True)
845
self.assertEqual(b[0] not in a, True)
847
def check_overflow(self, lower, upper):
848
# method to be used by subclasses
850
# should not overflow assigning lower limit
851
a = array.array(self.typecode, [lower])
853
# should overflow assigning less than lower limit
854
self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
855
self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
856
# should not overflow assigning upper limit
857
a = array.array(self.typecode, [upper])
859
# should overflow assigning more than upper limit
860
self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
861
self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
863
def test_subclassing(self):
864
typecode = self.typecode
865
class ExaggeratingArray(array.array):
866
__slots__ = ['offset']
868
def __new__(cls, typecode, data, offset):
869
return array.array.__new__(cls, typecode, data)
871
def __init__(self, typecode, data, offset):
874
def __getitem__(self, i):
875
return array.array.__getitem__(self, i) + self.offset
877
a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
878
self.assertEntryEqual(a[0], 7)
880
self.assertRaises(AttributeError, setattr, a, "color", "blue")
882
class SignedNumberTest(NumberTest):
883
example = [-1, 0, 1, 42, 0x7f]
884
smallerexample = [-1, 0, 1, 42, 0x7e]
885
biggerexample = [-1, 0, 1, 43, 0x7f]
888
def test_overflow(self):
889
a = array.array(self.typecode)
890
lower = -1 * int(pow(2, a.itemsize * 8 - 1))
891
upper = int(pow(2, a.itemsize * 8 - 1)) - 1
892
self.check_overflow(lower, upper)
894
class UnsignedNumberTest(NumberTest):
895
example = [0, 1, 17, 23, 42, 0xff]
896
smallerexample = [0, 1, 17, 23, 42, 0xfe]
897
biggerexample = [0, 1, 17, 23, 43, 0xff]
900
def test_overflow(self):
901
a = array.array(self.typecode)
903
upper = int(pow(2, a.itemsize * 8)) - 1
904
self.check_overflow(lower, upper)
907
class ByteTest(SignedNumberTest):
910
tests.append(ByteTest)
912
class UnsignedByteTest(UnsignedNumberTest):
915
tests.append(UnsignedByteTest)
917
class ShortTest(SignedNumberTest):
920
tests.append(ShortTest)
922
class UnsignedShortTest(UnsignedNumberTest):
925
tests.append(UnsignedShortTest)
927
class IntTest(SignedNumberTest):
930
tests.append(IntTest)
932
class UnsignedIntTest(UnsignedNumberTest):
935
tests.append(UnsignedIntTest)
937
class LongTest(SignedNumberTest):
940
tests.append(LongTest)
942
class UnsignedLongTest(UnsignedNumberTest):
945
tests.append(UnsignedLongTest)
947
class FPTest(NumberTest):
948
example = [-42.0, 0, 42, 1e5, -1e10]
949
smallerexample = [-42.0, 0, 42, 1e5, -2e10]
950
biggerexample = [-42.0, 0, 42, 1e5, 1e10]
953
def assertEntryEqual(self, entry1, entry2):
954
self.assertAlmostEqual(entry1, entry2)
956
def test_byteswap(self):
957
a = array.array(self.typecode, self.example)
958
self.assertRaises(TypeError, a.byteswap, 42)
959
if a.itemsize in (1, 2, 4, 8):
960
b = array.array(self.typecode, self.example)
963
self.assertEqual(a, b)
965
# On alphas treating the byte swapped bit patters as
966
# floats/doubles results in floating point exceptions
967
# => compare the 8bit string values instead
968
self.assertNotEqual(a.tostring(), b.tostring())
970
self.assertEqual(a, b)
972
class FloatTest(FPTest):
975
tests.append(FloatTest)
977
class DoubleTest(FPTest):
981
def test_alloc_overflow(self):
982
from sys import maxsize
983
a = array.array('d', [-1]*65536)
985
a *= maxsize//65536 + 1
989
self.fail("Array of size > maxsize created - MemoryError expected")
990
b = array.array('d', [ 2.71828183, 3.14159265, -1])
996
self.fail("Array of size > maxsize created - MemoryError expected")
998
tests.append(DoubleTest)
1000
def test_main(verbose=None):
1003
support.run_unittest(*tests)
1005
# verify reference counting
1006
if verbose and hasattr(sys, "gettotalrefcount"):
1009
for i in range(len(counts)):
1010
support.run_unittest(*tests)
1012
counts[i] = sys.gettotalrefcount()
1015
if __name__ == "__main__":
1016
test_main(verbose=True)