diff options
Diffstat (limited to 'Lib/test/test_iter.py')
| -rw-r--r-- | Lib/test/test_iter.py | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/Lib/test/test_iter.py b/Lib/test/test_iter.py index abc408f..a91670b 100644 --- a/Lib/test/test_iter.py +++ b/Lib/test/test_iter.py @@ -3,6 +3,7 @@ import sys import unittest from test.support import run_unittest, TESTFN, unlink, cpython_only +from test.support import check_free_after_iterating import pickle import collections.abc @@ -153,6 +154,53 @@ class TestCase(unittest.TestCase): def test_seq_class_iter(self): self.check_iterator(iter(SequenceClass(10)), list(range(10))) + def test_mutating_seq_class_iter_pickle(self): + orig = SequenceClass(5) + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + # initial iterator + itorig = iter(orig) + d = pickle.dumps((itorig, orig), proto) + it, seq = pickle.loads(d) + seq.n = 7 + self.assertIs(type(it), type(itorig)) + self.assertEqual(list(it), list(range(7))) + + # running iterator + next(itorig) + d = pickle.dumps((itorig, orig), proto) + it, seq = pickle.loads(d) + seq.n = 7 + self.assertIs(type(it), type(itorig)) + self.assertEqual(list(it), list(range(1, 7))) + + # empty iterator + for i in range(1, 5): + next(itorig) + d = pickle.dumps((itorig, orig), proto) + it, seq = pickle.loads(d) + seq.n = 7 + self.assertIs(type(it), type(itorig)) + self.assertEqual(list(it), list(range(5, 7))) + + # exhausted iterator + self.assertRaises(StopIteration, next, itorig) + d = pickle.dumps((itorig, orig), proto) + it, seq = pickle.loads(d) + seq.n = 7 + self.assertTrue(isinstance(it, collections.abc.Iterator)) + self.assertEqual(list(it), []) + + def test_mutating_seq_class_exhausted_iter(self): + a = SequenceClass(5) + exhit = iter(a) + empit = iter(a) + for x in exhit: # exhaust the iterator + next(empit) # not exhausted + a.n = 7 + self.assertEqual(list(exhit), []) + self.assertEqual(list(empit), [5, 6]) + self.assertEqual(list(a), [0, 1, 2, 3, 4, 5, 6]) + # Test a new_style class with __iter__ but no next() method def test_new_style_iter_class(self): class IterClass(object): @@ -944,6 +992,9 @@ class TestCase(unittest.TestCase): self.assertEqual(next(it), 0) self.assertEqual(next(it), 1) + def test_free_after_iterating(self): + check_free_after_iterating(self, iter, SequenceClass, (0,)) + def test_main(): run_unittest(TestCase) |
