Home | History | Annotate | Download | only in test
      1 #! /usr/bin/env python

      2 """Test the arraymodule.
      3    Roger E. Masse
      4 """
      5 
      6 import unittest
      7 from test import test_support
      8 from weakref import proxy
      9 import array, cStringIO
     10 from cPickle import loads, dumps, HIGHEST_PROTOCOL
     11 
     12 class ArraySubclass(array.array):
     13     pass
     14 
     15 class ArraySubclassWithKwargs(array.array):
     16     def __init__(self, typecode, newarg=None):
     17         array.array.__init__(self, typecode)
     18 
     19 tests = [] # list to accumulate all tests

     20 typecodes = "cubBhHiIlLfd"
     21 
     22 class BadConstructorTest(unittest.TestCase):
     23 
     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')
     29 
     30 tests.append(BadConstructorTest)
     31 
     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

     40 
     41     def assertEntryEqual(self, entry1, entry2):
     42         self.assertEqual(entry1, entry2)
     43 
     44     def badtypecode(self):
     45         # Return a typecode that is different from our own

     46         return typecodes[(typecodes.index(self.typecode)+1) % len(typecodes)]
     47 
     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)
     53 
     54     def test_len(self):
     55         a = array.array(self.typecode)
     56         a.append(self.example[0])
     57         self.assertEqual(len(a), 1)
     58 
     59         a = array.array(self.typecode, self.example)
     60         self.assertEqual(len(a), len(self.example))
     61 
     62     def test_buffer_info(self):
     63         a = array.array(self.typecode, self.example)
     64         self.assertRaises(TypeError, a.buffer_info, 42)
     65         bi = a.buffer_info()
     66         self.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))
     71 
     72     def test_byteswap(self):
     73         a = array.array(self.typecode, self.example)
     74         self.assertRaises(TypeError, a.byteswap, 42)
     75         if a.itemsize in (1, 2, 4, 8):
     76             b = array.array(self.typecode, self.example)
     77             b.byteswap()
     78             if a.itemsize==1:
     79                 self.assertEqual(a, b)
     80             else:
     81                 self.assertNotEqual(a, b)
     82             b.byteswap()
     83             self.assertEqual(a, b)
     84 
     85     def test_copy(self):
     86         import copy
     87         a = array.array(self.typecode, self.example)
     88         b = copy.copy(a)
     89         self.assertNotEqual(id(a), id(b))
     90         self.assertEqual(a, b)
     91 
     92     def test_deepcopy(self):
     93         import copy
     94         a = array.array(self.typecode, self.example)
     95         b = copy.deepcopy(a)
     96         self.assertNotEqual(id(a), id(b))
     97         self.assertEqual(a, b)
     98 
     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)
    105 
    106             a = ArraySubclass(self.typecode, self.example)
    107             a.x = 10
    108             b = loads(dumps(a, protocol))
    109             self.assertNotEqual(id(a), id(b))
    110             self.assertEqual(a, b)
    111             self.assertEqual(a.x, b.x)
    112             self.assertEqual(type(a), type(b))
    113 
    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)
    120 
    121             a = ArraySubclass(self.typecode)
    122             a.x = 10
    123             b = loads(dumps(a, protocol))
    124             self.assertNotEqual(id(a), id(b))
    125             self.assertEqual(a, b)
    126             self.assertEqual(a.x, b.x)
    127             self.assertEqual(type(a), type(b))
    128 
    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)
    137 
    138         a = array.array(self.typecode, self.example)
    139         a.insert(-1, self.example[0])
    140         self.assertEqual(
    141             a,
    142             array.array(
    143                 self.typecode,
    144                 self.example[:-1] + self.example[:1] + self.example[-1:]
    145             )
    146         )
    147 
    148         a = array.array(self.typecode, self.example)
    149         a.insert(-1000, self.example[0])
    150         self.assertEqual(
    151             a,
    152             array.array(self.typecode, self.example[:1] + self.example)
    153         )
    154 
    155         a = array.array(self.typecode, self.example)
    156         a.insert(1000, self.example[0])
    157         self.assertEqual(
    158             a,
    159             array.array(self.typecode, self.example + self.example[:1])
    160         )
    161 
    162     def test_tofromfile(self):
    163         a = array.array(self.typecode, 2*self.example)
    164         self.assertRaises(TypeError, a.tofile)
    165         self.assertRaises(TypeError, a.tofile, cStringIO.StringIO())
    166         test_support.unlink(test_support.TESTFN)
    167         f = open(test_support.TESTFN, 'wb')
    168         try:
    169             a.tofile(f)
    170             f.close()
    171             b = array.array(self.typecode)
    172             f = open(test_support.TESTFN, 'rb')
    173             self.assertRaises(TypeError, b.fromfile)
    174             self.assertRaises(
    175                 TypeError,
    176                 b.fromfile,
    177                 cStringIO.StringIO(), len(self.example)
    178             )
    179             b.fromfile(f, len(self.example))
    180             self.assertEqual(b, array.array(self.typecode, self.example))
    181             self.assertNotEqual(a, b)
    182             b.fromfile(f, len(self.example))
    183             self.assertEqual(a, b)
    184             self.assertRaises(EOFError, b.fromfile, f, 1)
    185             f.close()
    186         finally:
    187             if not f.closed:
    188                 f.close()
    189             test_support.unlink(test_support.TESTFN)
    190 
    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')
    196         try:
    197             self.assertRaises(IOError, a.fromfile, f, len(self.example))
    198         finally:
    199             f.close()
    200             test_support.unlink(test_support.TESTFN)
    201 
    202     def test_filewrite(self):
    203         a = array.array(self.typecode, 2*self.example)
    204         f = open(test_support.TESTFN, 'wb')
    205         try:
    206             f.write(a)
    207             f.close()
    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)
    215             f.close()
    216         finally:
    217             if not f.closed:
    218                 f.close()
    219             test_support.unlink(test_support.TESTFN)
    220 
    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)
    230 
    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)
    239         if a.itemsize>1:
    240             self.assertRaises(ValueError, b.fromstring, "x")
    241 
    242     def test_repr(self):
    243         a = array.array(self.typecode, 2*self.example)
    244         self.assertEqual(a, eval(repr(a), {"array": array.array}))
    245 
    246         a = array.array(self.typecode)
    247         self.assertEqual(repr(a), "array('%s')" % self.typecode)
    248 
    249     def test_str(self):
    250         a = array.array(self.typecode, 2*self.example)
    251         str(a)
    252 
    253     def test_cmp(self):
    254         a = array.array(self.typecode, self.example)
    255         self.assertTrue((a == 42) is False)
    256         self.assertTrue((a != 42) is True)
    257 
    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)
    264 
    265         al = array.array(self.typecode, self.smallerexample)
    266         ab = array.array(self.typecode, self.biggerexample)
    267 
    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)
    274 
    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)
    281 
    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)
    288 
    289     def test_add(self):
    290         a = array.array(self.typecode, self.example) \
    291             + array.array(self.typecode, self.example[::-1])
    292         self.assertEqual(
    293             a,
    294             array.array(self.typecode, self.example + self.example[::-1])
    295         )
    296 
    297         b = array.array(self.badtypecode())
    298         self.assertRaises(TypeError, a.__add__, b)
    299 
    300         self.assertRaises(TypeError, a.__add__, "bad")
    301 
    302     def test_iadd(self):
    303         a = array.array(self.typecode, self.example[::-1])
    304         b = a
    305         a += array.array(self.typecode, 2*self.example)
    306         self.assertTrue(a is b)
    307         self.assertEqual(
    308             a,
    309             array.array(self.typecode, self.example[::-1]+2*self.example)
    310         )
    311         a = array.array(self.typecode, self.example)
    312         a += a
    313         self.assertEqual(
    314             a,
    315             array.array(self.typecode, self.example + self.example)
    316         )
    317 
    318         b = array.array(self.badtypecode())
    319         self.assertRaises(TypeError, a.__add__, b)
    320 
    321         self.assertRaises(TypeError, a.__iadd__, "bad")
    322 
    323     def test_mul(self):
    324         a = 5*array.array(self.typecode, self.example)
    325         self.assertEqual(
    326             a,
    327             array.array(self.typecode, 5*self.example)
    328         )
    329 
    330         a = array.array(self.typecode, self.example)*5
    331         self.assertEqual(
    332             a,
    333             array.array(self.typecode, self.example*5)
    334         )
    335 
    336         a = 0*array.array(self.typecode, self.example)
    337         self.assertEqual(
    338             a,
    339             array.array(self.typecode)
    340         )
    341 
    342         a = (-1)*array.array(self.typecode, self.example)
    343         self.assertEqual(
    344             a,
    345             array.array(self.typecode)
    346         )
    347 
    348         self.assertRaises(TypeError, a.__mul__, "bad")
    349 
    350     def test_imul(self):
    351         a = array.array(self.typecode, self.example)
    352         b = a
    353 
    354         a *= 5
    355         self.assertTrue(a is b)
    356         self.assertEqual(
    357             a,
    358             array.array(self.typecode, 5*self.example)
    359         )
    360 
    361         a *= 0
    362         self.assertTrue(a is b)
    363         self.assertEqual(a, array.array(self.typecode))
    364 
    365         a *= 1000
    366         self.assertTrue(a is b)
    367         self.assertEqual(a, array.array(self.typecode))
    368 
    369         a *= -1
    370         self.assertTrue(a is b)
    371         self.assertEqual(a, array.array(self.typecode))
    372 
    373         a = array.array(self.typecode, self.example)
    374         a *= -1
    375         self.assertEqual(a, array.array(self.typecode))
    376 
    377         self.assertRaises(TypeError, a.__imul__, "bad")
    378 
    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)
    390 
    391     def test_setitem(self):
    392         a = array.array(self.typecode, self.example)
    393         a[0] = a[-1]
    394         self.assertEntryEqual(a[0], a[-1])
    395 
    396         a = array.array(self.typecode, self.example)
    397         a[0L] = a[-1]
    398         self.assertEntryEqual(a[0], a[-1])
    399 
    400         a = array.array(self.typecode, self.example)
    401         a[-1] = a[0]
    402         self.assertEntryEqual(a[0], a[-1])
    403 
    404         a = array.array(self.typecode, self.example)
    405         a[-1L] = a[0]
    406         self.assertEntryEqual(a[0], a[-1])
    407 
    408         a = array.array(self.typecode, self.example)
    409         a[len(self.example)-1] = a[0]
    410         self.assertEntryEqual(a[0], a[-1])
    411 
    412         a = array.array(self.typecode, self.example)
    413         a[-len(self.example)] = a[-1]
    414         self.assertEntryEqual(a[0], a[-1])
    415 
    416         self.assertRaises(TypeError, a.__setitem__)
    417         self.assertRaises(TypeError, a.__setitem__, None)
    418         self.assertRaises(TypeError, a.__setitem__, 0, None)
    419         self.assertRaises(
    420             IndexError,
    421             a.__setitem__,
    422             len(self.example), self.example[0]
    423         )
    424         self.assertRaises(
    425             IndexError,
    426             a.__setitem__,
    427             -len(self.example)-1, self.example[0]
    428         )
    429 
    430     def test_delitem(self):
    431         a = array.array(self.typecode, self.example)
    432         del a[0]
    433         self.assertEqual(
    434             a,
    435             array.array(self.typecode, self.example[1:])
    436         )
    437 
    438         a = array.array(self.typecode, self.example)
    439         del a[-1]
    440         self.assertEqual(
    441             a,
    442             array.array(self.typecode, self.example[:-1])
    443         )
    444 
    445         a = array.array(self.typecode, self.example)
    446         del a[len(self.example)-1]
    447         self.assertEqual(
    448             a,
    449             array.array(self.typecode, self.example[:-1])
    450         )
    451 
    452         a = array.array(self.typecode, self.example)
    453         del a[-len(self.example)]
    454         self.assertEqual(
    455             a,
    456             array.array(self.typecode, self.example[1:])
    457         )
    458 
    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)
    463 
    464     def test_getslice(self):
    465         a = array.array(self.typecode, self.example)
    466         self.assertEqual(a[:], a)
    467 
    468         self.assertEqual(
    469             a[1:],
    470             array.array(self.typecode, self.example[1:])
    471         )
    472 
    473         self.assertEqual(
    474             a[:1],
    475             array.array(self.typecode, self.example[:1])
    476         )
    477 
    478         self.assertEqual(
    479             a[:-1],
    480             array.array(self.typecode, self.example[:-1])
    481         )
    482 
    483         self.assertEqual(
    484             a[-1:],
    485             array.array(self.typecode, self.example[-1:])
    486         )
    487 
    488         self.assertEqual(
    489             a[-1:-1],
    490             array.array(self.typecode)
    491         )
    492 
    493         self.assertEqual(
    494             a[2:1],
    495             array.array(self.typecode)
    496         )
    497 
    498         self.assertEqual(
    499             a[1000:],
    500             array.array(self.typecode)
    501         )
    502         self.assertEqual(a[-1000:], a)
    503         self.assertEqual(a[:1000], a)
    504         self.assertEqual(
    505             a[:-1000],
    506             array.array(self.typecode)
    507         )
    508         self.assertEqual(a[-1000:1000], a)
    509         self.assertEqual(
    510             a[2000:1000],
    511             array.array(self.typecode)
    512         )
    513 
    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:
    520             for stop 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])
    525 
    526     def test_setslice(self):
    527         a = array.array(self.typecode, self.example)
    528         a[:1] = a
    529         self.assertEqual(
    530             a,
    531             array.array(self.typecode, self.example + self.example[1:])
    532         )
    533 
    534         a = array.array(self.typecode, self.example)
    535         a[:-1] = a
    536         self.assertEqual(
    537             a,
    538             array.array(self.typecode, self.example + self.example[-1:])
    539         )
    540 
    541         a = array.array(self.typecode, self.example)
    542         a[-1:] = a
    543         self.assertEqual(
    544             a,
    545             array.array(self.typecode, self.example[:-1] + self.example)
    546         )
    547 
    548         a = array.array(self.typecode, self.example)
    549         a[1:] = a
    550         self.assertEqual(
    551             a,
    552             array.array(self.typecode, self.example[:1] + self.example)
    553         )
    554 
    555         a = array.array(self.typecode, self.example)
    556         a[1:-1] = a
    557         self.assertEqual(
    558             a,
    559             array.array(
    560                 self.typecode,
    561                 self.example[:1] + self.example + self.example[-1:]
    562             )
    563         )
    564 
    565         a = array.array(self.typecode, self.example)
    566         a[1000:] = a
    567         self.assertEqual(
    568             a,
    569             array.array(self.typecode, 2*self.example)
    570         )
    571 
    572         a = array.array(self.typecode, self.example)
    573         a[-1000:] = a
    574         self.assertEqual(
    575             a,
    576             array.array(self.typecode, self.example)
    577         )
    578 
    579         a = array.array(self.typecode, self.example)
    580         a[:1000] = a
    581         self.assertEqual(
    582             a,
    583             array.array(self.typecode, self.example)
    584         )
    585 
    586         a = array.array(self.typecode, self.example)
    587         a[:-1000] = a
    588         self.assertEqual(
    589             a,
    590             array.array(self.typecode, 2*self.example)
    591         )
    592 
    593         a = array.array(self.typecode, self.example)
    594         a[1:0] = a
    595         self.assertEqual(
    596             a,
    597             array.array(self.typecode, self.example[:1] + self.example + self.example[1:])
    598         )
    599 
    600         a = array.array(self.typecode, self.example)
    601         a[2000:1000] = a
    602         self.assertEqual(
    603             a,
    604             array.array(self.typecode, 2*self.example)
    605         )
    606 
    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)
    611 
    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)
    616 
    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:
    620             for stop in indices:
    621                 # Everything except the initial 0 (invalid step)

    622                 for step in indices[1:]:
    623                     a = array.array(self.typecode, self.example)
    624                     L = list(a)
    625                     # Make sure we have a slice of exactly the right length,

    626                     # but with (hopefully) different data.

    627                     data = L[start:stop:step]
    628                     data.reverse()
    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))
    632 
    633                     del L[start:stop:step]
    634                     del a[start:stop:step]
    635                     self.assertEqual(a, array.array(self.typecode, L))
    636 
    637     def test_index(self):
    638         example = 2*self.example
    639         a = array.array(self.typecode, example)
    640         self.assertRaises(TypeError, a.index)
    641         for x in example:
    642             self.assertEqual(a.index(x), example.index(x))
    643         self.assertRaises(ValueError, a.index, None)
    644         self.assertRaises(ValueError, a.index, self.outside)
    645 
    646     def test_count(self):
    647         example = 2*self.example
    648         a = array.array(self.typecode, example)
    649         self.assertRaises(TypeError, a.count)
    650         for x in example:
    651             self.assertEqual(a.count(x), example.count(x))
    652         self.assertEqual(a.count(self.outside), 0)
    653         self.assertEqual(a.count(None), 0)
    654 
    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:]
    661             a.remove(x)
    662             self.assertEqual(a, array.array(self.typecode, example2))
    663 
    664         a = array.array(self.typecode, self.example)
    665         self.assertRaises(ValueError, a.remove, self.outside)
    666 
    667         self.assertRaises(ValueError, a.remove, None)
    668 
    669     def test_pop(self):
    670         a = array.array(self.typecode)
    671         self.assertRaises(IndexError, a.pop)
    672 
    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)
    678 
    679         self.assertEntryEqual(a.pop(0), self.example[0])
    680         self.assertEqual(
    681             a,
    682             array.array(self.typecode, self.example[1:]+self.example)
    683         )
    684         self.assertEntryEqual(a.pop(1), self.example[2])
    685         self.assertEqual(
    686             a,
    687             array.array(self.typecode, self.example[1:2]+self.example[3:]+self.example)
    688         )
    689         self.assertEntryEqual(a.pop(0), self.example[1])
    690         self.assertEntryEqual(a.pop(), self.example[-1])
    691         self.assertEqual(
    692             a,
    693             array.array(self.typecode, self.example[3:]+self.example[:-1])
    694         )
    695 
    696     def test_reverse(self):
    697         a = array.array(self.typecode, self.example)
    698         self.assertRaises(TypeError, a.reverse, 42)
    699         a.reverse()
    700         self.assertEqual(
    701             a,
    702             array.array(self.typecode, self.example[::-1])
    703         )
    704 
    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]))
    709         self.assertEqual(
    710             a,
    711             array.array(self.typecode, self.example+self.example[::-1])
    712         )
    713 
    714         a = array.array(self.typecode, self.example)
    715         a.extend(a)
    716         self.assertEqual(
    717             a,
    718             array.array(self.typecode, self.example+self.example)
    719         )
    720 
    721         b = array.array(self.badtypecode())
    722         self.assertRaises(TypeError, a.extend, b)
    723 
    724         a = array.array(self.typecode, self.example)
    725         a.extend(self.example[::-1])
    726         self.assertEqual(
    727             a,
    728             array.array(self.typecode, self.example+self.example[::-1])
    729         )
    730 
    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)
    735 
    736         # non-iterable argument

    737         self.assertRaises(TypeError, array.array, self.typecode, 10)
    738 
    739         # pass through errors raised in __iter__

    740         class A:
    741             def __iter__(self):
    742                 raise UnicodeError
    743         self.assertRaises(UnicodeError, array.array, self.typecode, A())
    744 
    745         # pass through errors raised in next()

    746         def B():
    747             raise UnicodeError
    748             yield None
    749         self.assertRaises(UnicodeError, array.array, self.typecode, B())
    750 
    751     def test_coveritertraverse(self):
    752         try:
    753             import gc
    754         except ImportError:
    755             return
    756         a = array.array(self.typecode)
    757         l = [iter(a)]
    758         l.append(l)
    759         gc.collect()
    760 
    761     def test_buffer(self):
    762         a = array.array(self.typecode, self.example)
    763         with test_support.check_py3k_warnings():
    764             b = buffer(a)
    765         self.assertEqual(b[0], a.tostring()[0])
    766 
    767     def test_weakref(self):
    768         s = array.array(self.typecode, self.example)
    769         p = proxy(s)
    770         self.assertEqual(p.tostring(), s.tostring())
    771         s = None
    772         self.assertRaises(ReferenceError, len, p)
    773 
    774     def test_bug_782369(self):
    775         import sys
    776         if hasattr(sys, "getrefcount"):
    777             for i in range(10):
    778                 b = array.array('B', range(64))
    779             rc = sys.getrefcount(10)
    780             for i in range(10):
    781                 b = array.array('B', range(64))
    782             self.assertEqual(rc, sys.getrefcount(10))
    783 
    784     def test_subclass_with_kwargs(self):
    785         # SF bug #1486663 -- this used to erroneously raise a TypeError

    786         ArraySubclassWithKwargs('b', newarg=1)
    787 
    788 
    789 class StringTest(BaseTest):
    790 
    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])
    795 
    796 class CharacterTest(StringTest):
    797     typecode = 'c'
    798     example = '\x01azAZ\x00\xfe'
    799     smallerexample = '\x01azAY\x00\xfe'
    800     biggerexample = '\x01azAZ\x00\xff'
    801     outside = '\x33'
    802     minitemsize = 1
    803 
    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)
    808 
    809             def __init__(self, s, color='blue'):
    810                 self.color = color
    811 
    812             def strip(self):
    813                 self[:] = array.array('c', self.tostring().strip())
    814 
    815             def __repr__(self):
    816                 return 'EditableString(%r)' % self.tostring()
    817 
    818         s = EditableString("\ttest\r\n")
    819         s.strip()
    820         self.assertEqual(s.tostring(), "test")
    821 
    822         self.assertEqual(s.color, "blue")
    823         s.color = "red"
    824         self.assertEqual(s.color, "red")
    825         self.assertEqual(s.__dict__.keys(), ["color"])
    826 
    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)
    831 
    832 tests.append(CharacterTest)
    833 
    834 if test_support.have_unicode:
    835     class UnicodeTest(StringTest):
    836         typecode = 'u'
    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')
    841         minitemsize = 2
    842 
    843         def test_unicode(self):
    844             self.assertRaises(TypeError, array.array, 'b', unicode('foo', 'ascii'))
    845 
    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'))
    851             s = a.tounicode()
    852             self.assertEqual(
    853                 s,
    854                 unicode(r'\xa0\xc2\u1234 \x11abc\xff\u1234', 'unicode-escape')
    855             )
    856 
    857             s = unicode(r'\x00="\'a\\b\x80\xff\u0000\u0001\u1234', 'unicode-escape')
    858             a = array.array('u', s)
    859             self.assertEqual(
    860                 repr(a),
    861                 r"""array('u', u'\x00="\'a\\b\x80\xff\x00\x01\u1234')"""
    862             )
    863 
    864             self.assertRaises(TypeError, a.fromunicode)
    865 
    866     tests.append(UnicodeTest)
    867 
    868 class NumberTest(BaseTest):
    869 
    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, []))
    883 
    884     def test_delslice(self):
    885         a = array.array(self.typecode, range(5))
    886         del a[::2]
    887         self.assertEqual(a, array.array(self.typecode, [1,3]))
    888         a = array.array(self.typecode, range(5))
    889         del a[1::2]
    890         self.assertEqual(a, array.array(self.typecode, [0,2,4]))
    891         a = array.array(self.typecode, range(5))
    892         del a[1::-2]
    893         self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
    894         a = array.array(self.typecode, range(10))
    895         del a[::1000]
    896         self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
    897         # test issue7788
    898         a = array.array(self.typecode, range(10))
    899         del a[9::1<<333]
    900 
    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))
    909         a[::-1] = a
    910         self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
    911         a = array.array(self.typecode, range(10))
    912         b = a[:]
    913         c = a[:]
    914         ins = array.array(self.typecode, range(2))
    915         a[2:3] = ins
    916         b[slice(2,3)] = ins
    917         c[2:3:] = ins
    918 
    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)
    925 
    926     def check_overflow(self, lower, upper):
    927         # method to be used by subclasses
    928 
    929         # should not overflow assigning lower limit
    930         a = array.array(self.typecode, [lower])
    931         a[0] = 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])
    937         a[0] = 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)
    941 
    942     def test_subclassing(self):
    943         typecode = self.typecode
    944         class ExaggeratingArray(array.array):
    945             __slots__ = ['offset']
    946 
    947             def __new__(cls, typecode, data, offset):
    948                 return array.array.__new__(cls, typecode, data)
    949 
    950             def __init__(self, typecode, data, offset):
    951                 self.offset = offset
    952 
    953             def __getitem__(self, i):
    954                 return array.array.__getitem__(self, i) + self.offset
    955 
    956         a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
    957         self.assertEntryEqual(a[0], 7)
    958 
    959         self.assertRaises(AttributeError, setattr, a, "color", "blue")
    960 
    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]
    965     outside = 23
    966 
    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)
    972 
    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]
    977     outside = 0xaa
    978 
    979     def test_overflow(self):
    980         a = array.array(self.typecode)
    981         lower = 0
    982         upper = long(pow(2, a.itemsize * 8)) - 1L
    983         self.check_overflow(lower, upper)
    984 
    985 
    986 class ByteTest(SignedNumberTest):
    987     typecode = 'b'
    988     minitemsize = 1
    989 tests.append(ByteTest)
    990 
    991 class UnsignedByteTest(UnsignedNumberTest):
    992     typecode = 'B'
    993     minitemsize = 1
    994 tests.append(UnsignedByteTest)
    995 
    996 class ShortTest(SignedNumberTest):
    997     typecode = 'h'
    998     minitemsize = 2
    999 tests.append(ShortTest)
   1000 
   1001 class UnsignedShortTest(UnsignedNumberTest):
   1002     typecode = 'H'
   1003     minitemsize = 2
   1004 tests.append(UnsignedShortTest)
   1005 
   1006 class IntTest(SignedNumberTest):
   1007     typecode = 'i'
   1008     minitemsize = 2
   1009 tests.append(IntTest)
   1010 
   1011 class UnsignedIntTest(UnsignedNumberTest):
   1012     typecode = 'I'
   1013     minitemsize = 2
   1014 tests.append(UnsignedIntTest)
   1015 
   1016 class LongTest(SignedNumberTest):
   1017     typecode = 'l'
   1018     minitemsize = 4
   1019 tests.append(LongTest)
   1020 
   1021 class UnsignedLongTest(UnsignedNumberTest):
   1022     typecode = 'L'
   1023     minitemsize = 4
   1024 tests.append(UnsignedLongTest)
   1025 
   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]
   1030     outside = 23
   1031 
   1032     def assertEntryEqual(self, entry1, entry2):
   1033         self.assertAlmostEqual(entry1, entry2)
   1034 
   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)
   1040             b.byteswap()
   1041             if a.itemsize==1:
   1042                 self.assertEqual(a, b)
   1043             else:
   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())
   1048             b.byteswap()
   1049             self.assertEqual(a, b)
   1050 
   1051 class FloatTest(FPTest):
   1052     typecode = 'f'
   1053     minitemsize = 4
   1054 tests.append(FloatTest)
   1055 
   1056 class DoubleTest(FPTest):
   1057     typecode = 'd'
   1058     minitemsize = 8
   1059 
   1060     def test_alloc_overflow(self):
   1061         from sys import maxsize
   1062         a = array.array('d', [-1]*65536)
   1063         try:
   1064             a *= maxsize//65536 + 1
   1065         except MemoryError:
   1066             pass
   1067         else:
   1068             self.fail("Array of size > maxsize created - MemoryError expected")
   1069         b = array.array('d', [ 2.71828183, 3.14159265, -1])
   1070         try:
   1071             b * (maxsize//3 + 1)
   1072         except MemoryError:
   1073             pass
   1074         else:
   1075             self.fail("Array of size > maxsize created - MemoryError expected")
   1076 
   1077 tests.append(DoubleTest)
   1078 
   1079 def test_main(verbose=None):
   1080     import sys
   1081 
   1082     test_support.run_unittest(*tests)
   1083 
   1084     # verify reference counting
   1085     if verbose and hasattr(sys, "gettotalrefcount"):
   1086         import gc
   1087         counts = [None] * 5
   1088         for i in xrange(len(counts)):
   1089             test_support.run_unittest(*tests)
   1090             gc.collect()
   1091             counts[i] = sys.gettotalrefcount()
   1092         print counts
   1093 
   1094 if __name__ == "__main__":
   1095     test_main(verbose=True)
   1096