|  | 
| 2 | 2 |    Roger E. Masse | 
| 3 | 3 | """ | 
| 4 | 4 | 
 | 
|  | 5 | +import collections.abc | 
| 5 | 6 | import unittest | 
| 6 | 7 | from test import support | 
| 7 | 8 | from test.support import os_helper | 
| @@ -29,6 +30,10 @@ def __init__(self, typecode, newarg=None): | 
| 29 | 30 | 
 | 
| 30 | 31 | class MiscTest(unittest.TestCase): | 
| 31 | 32 | 
 | 
|  | 33 | +    def test_array_is_sequence(self): | 
|  | 34 | +        self.assertIsInstance(array.array("B"), collections.abc.MutableSequence) | 
|  | 35 | +        self.assertIsInstance(array.array("B"), collections.abc.Reversible) | 
|  | 36 | + | 
| 32 | 37 |     def test_bad_constructor(self): | 
| 33 | 38 |         self.assertRaises(TypeError, array.array) | 
| 34 | 39 |         self.assertRaises(TypeError, array.array, spam=42) | 
| @@ -331,6 +336,67 @@ def test_exhausted_iterator(self): | 
| 331 | 336 |         self.assertEqual(list(empit), [self.outside]) | 
| 332 | 337 |         self.assertEqual(list(a), list(self.example) + [self.outside]) | 
| 333 | 338 | 
 | 
|  | 339 | +    def test_reverse_iterator(self): | 
|  | 340 | +        a = array.array(self.typecode, self.example) | 
|  | 341 | +        self.assertEqual(list(a), list(self.example)) | 
|  | 342 | +        self.assertEqual(list(reversed(a)), list(iter(a))[::-1]) | 
|  | 343 | + | 
|  | 344 | +    def test_reverse_iterator_picking(self): | 
|  | 345 | +        orig = array.array(self.typecode, self.example) | 
|  | 346 | +        data = list(orig) | 
|  | 347 | +        data2 = [self.outside] + data | 
|  | 348 | +        rev_data = data[len(data)-2::-1] + [self.outside] | 
|  | 349 | +        for proto in range(pickle.HIGHEST_PROTOCOL + 1): | 
|  | 350 | +            # initial iterator | 
|  | 351 | +            itorig = reversed(orig) | 
|  | 352 | +            d = pickle.dumps((itorig, orig), proto) | 
|  | 353 | +            it, a = pickle.loads(d) | 
|  | 354 | +            a.insert(0, self.outside) | 
|  | 355 | +            self.assertEqual(type(it), type(itorig)) | 
|  | 356 | +            self.assertEqual(list(it), rev_data) | 
|  | 357 | +            self.assertEqual(list(a), data2) | 
|  | 358 | + | 
|  | 359 | +            # running iterator | 
|  | 360 | +            next(itorig) | 
|  | 361 | +            d = pickle.dumps((itorig, orig), proto) | 
|  | 362 | +            it, a = pickle.loads(d) | 
|  | 363 | +            a.insert(0, self.outside) | 
|  | 364 | +            self.assertEqual(type(it), type(itorig)) | 
|  | 365 | +            self.assertEqual(list(it), rev_data[1:]) | 
|  | 366 | +            self.assertEqual(list(a), data2) | 
|  | 367 | + | 
|  | 368 | +            # empty iterator | 
|  | 369 | +            for i in range(1, len(data)): | 
|  | 370 | +                next(itorig) | 
|  | 371 | +            d = pickle.dumps((itorig, orig), proto) | 
|  | 372 | +            it, a = pickle.loads(d) | 
|  | 373 | +            a.insert(0, self.outside) | 
|  | 374 | +            self.assertEqual(type(it), type(itorig)) | 
|  | 375 | +            self.assertEqual(list(it), []) | 
|  | 376 | +            self.assertEqual(list(a), data2) | 
|  | 377 | + | 
|  | 378 | +            # exhausted iterator | 
|  | 379 | +            self.assertRaises(StopIteration, next, itorig) | 
|  | 380 | +            d = pickle.dumps((itorig, orig), proto) | 
|  | 381 | +            it, a = pickle.loads(d) | 
|  | 382 | +            a.insert(0, self.outside) | 
|  | 383 | +            self.assertEqual(list(it), []) | 
|  | 384 | +            self.assertEqual(list(a), data2) | 
|  | 385 | + | 
|  | 386 | +    def test_exhausted_reverse_iterator(self): | 
|  | 387 | +        a = array.array(self.typecode, self.example) | 
|  | 388 | +        self.assertEqual(list(a), list(self.example)) | 
|  | 389 | +        exhit = reversed(a) | 
|  | 390 | +        empit = reversed(a) | 
|  | 391 | +        for x in exhit:  # exhaust the iterator | 
|  | 392 | +            next(empit)  # Pointing past the 0th position. | 
|  | 393 | +        a.insert(0, self.outside) | 
|  | 394 | +        self.assertEqual(list(exhit), []) | 
|  | 395 | +        # The iterator index points past the 0th position so inserting | 
|  | 396 | +        # an element in the beggining does not make it appear. | 
|  | 397 | +        self.assertEqual(list(empit), []) | 
|  | 398 | +        self.assertEqual(list(a), [self.outside] + list(self.example)) | 
|  | 399 | + | 
| 334 | 400 |     def test_insert(self): | 
| 335 | 401 |         a = array.array(self.typecode, self.example) | 
| 336 | 402 |         a.insert(0, self.example[0]) | 
|  | 
0 commit comments