|
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