diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2016-03-06 12:12:04 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2016-03-06 12:12:04 (GMT) |
commit | de128e19e2c6186408692a37f563550df13a390c (patch) | |
tree | 30902cbc57725b33359163cee5bb30582cccf831 /Lib/test/test_list.py | |
parent | 5608411a964f7fd5a35eda04b297e0d77de9958d (diff) | |
parent | aabafe7bc293b377629ff97c3e955956eaf6350a (diff) | |
download | cpython-de128e19e2c6186408692a37f563550df13a390c.zip cpython-de128e19e2c6186408692a37f563550df13a390c.tar.gz cpython-de128e19e2c6186408692a37f563550df13a390c.tar.bz2 |
Issue #26015: Added new tests for pickling iterators of mutable sequences.
Diffstat (limited to 'Lib/test/test_list.py')
-rw-r--r-- | Lib/test/test_list.py | 90 |
1 files changed, 66 insertions, 24 deletions
diff --git a/Lib/test/test_list.py b/Lib/test/test_list.py index 750d6cf..8f82ab5 100644 --- a/Lib/test/test_list.py +++ b/Lib/test/test_list.py @@ -72,34 +72,76 @@ class ListTest(list_tests.CommonTest): check(1000000) def test_iterator_pickle(self): - # Userlist iterators don't support pickling yet since - # they are based on generators. - data = self.type2test([4, 5, 6, 7]) + orig = self.type2test([4, 5, 6, 7]) + data = [10, 11, 12, 13, 14, 15] for proto in range(pickle.HIGHEST_PROTOCOL + 1): - it = itorg = iter(data) - d = pickle.dumps(it, proto) - it = pickle.loads(d) - self.assertEqual(type(itorg), type(it)) - self.assertEqual(self.type2test(it), self.type2test(data)) - - it = pickle.loads(d) - next(it) - d = pickle.dumps(it, proto) - self.assertEqual(self.type2test(it), self.type2test(data)[1:]) + # initial iterator + itorig = iter(orig) + d = pickle.dumps((itorig, orig), proto) + it, a = pickle.loads(d) + a[:] = data + self.assertEqual(type(it), type(itorig)) + self.assertEqual(list(it), data) + + # running iterator + next(itorig) + d = pickle.dumps((itorig, orig), proto) + it, a = pickle.loads(d) + a[:] = data + self.assertEqual(type(it), type(itorig)) + self.assertEqual(list(it), data[1:]) + + # empty iterator + for i in range(1, len(orig)): + next(itorig) + d = pickle.dumps((itorig, orig), proto) + it, a = pickle.loads(d) + a[:] = data + self.assertEqual(type(it), type(itorig)) + self.assertEqual(list(it), data[len(orig):]) + + # exhausted iterator + self.assertRaises(StopIteration, next, itorig) + d = pickle.dumps((itorig, orig), proto) + it, a = pickle.loads(d) + a[:] = data + self.assertEqual(list(it), []) def test_reversed_pickle(self): - data = self.type2test([4, 5, 6, 7]) + orig = self.type2test([4, 5, 6, 7]) + data = [10, 11, 12, 13, 14, 15] for proto in range(pickle.HIGHEST_PROTOCOL + 1): - it = itorg = reversed(data) - d = pickle.dumps(it, proto) - it = pickle.loads(d) - self.assertEqual(type(itorg), type(it)) - self.assertEqual(self.type2test(it), self.type2test(reversed(data))) - - it = pickle.loads(d) - next(it) - d = pickle.dumps(it, proto) - self.assertEqual(self.type2test(it), self.type2test(reversed(data))[1:]) + # initial iterator + itorig = reversed(orig) + d = pickle.dumps((itorig, orig), proto) + it, a = pickle.loads(d) + a[:] = data + self.assertEqual(type(it), type(itorig)) + self.assertEqual(list(it), data[len(orig)-1::-1]) + + # running iterator + next(itorig) + d = pickle.dumps((itorig, orig), proto) + it, a = pickle.loads(d) + a[:] = data + self.assertEqual(type(it), type(itorig)) + self.assertEqual(list(it), data[len(orig)-2::-1]) + + # empty iterator + for i in range(1, len(orig)): + next(itorig) + d = pickle.dumps((itorig, orig), proto) + it, a = pickle.loads(d) + a[:] = data + self.assertEqual(type(it), type(itorig)) + self.assertEqual(list(it), []) + + # exhausted iterator + self.assertRaises(StopIteration, next, itorig) + d = pickle.dumps((itorig, orig), proto) + it, a = pickle.loads(d) + a[:] = data + self.assertEqual(list(it), []) def test_no_comdat_folding(self): # Issue 8847: In the PGO build, the MSVC linker's COMDAT folding |