From: Serhiy Storchaka Date: Sun, 6 Mar 2016 12:12:04 +0000 (+0200) Subject: Issue #26015: Added new tests for pickling iterators of mutable sequences. X-Git-Tag: v3.6.0a1~526 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=de128e19e2c6186408692a37f563550df13a390c;p=thirdparty%2FPython%2Fcpython.git Issue #26015: Added new tests for pickling iterators of mutable sequences. --- de128e19e2c6186408692a37f563550df13a390c diff --cc Lib/test/test_deque.py index 634d71fa86db,ec2be83d4254..29b44f664107 --- a/Lib/test/test_deque.py +++ b/Lib/test/test_deque.py @@@ -622,36 -622,61 +622,63 @@@ class TestBasic(unittest.TestCase) self.assertEqual(list(d), list(e)) def test_pickle(self): - d = deque(range(200)) - for i in range(pickle.HIGHEST_PROTOCOL + 1): - s = pickle.dumps(d, i) - e = pickle.loads(s) - self.assertNotEqual(id(d), id(e)) - self.assertEqual(list(d), list(e)) - -## def test_pickle_recursive(self): -## d = deque('abc') -## d.append(d) -## for i in range(pickle.HIGHEST_PROTOCOL + 1): -## e = pickle.loads(pickle.dumps(d, i)) -## self.assertNotEqual(id(d), id(e)) -## self.assertEqual(id(e), id(e[-1])) + for d in deque(range(200)), deque(range(200), 100): + for i in range(pickle.HIGHEST_PROTOCOL + 1): + s = pickle.dumps(d, i) + e = pickle.loads(s) + self.assertNotEqual(id(e), id(d)) + self.assertEqual(list(e), list(d)) + self.assertEqual(e.maxlen, d.maxlen) + + def test_pickle_recursive(self): + for d in deque('abc'), deque('abc', 3): + d.append(d) + for i in range(pickle.HIGHEST_PROTOCOL + 1): + e = pickle.loads(pickle.dumps(d, i)) + self.assertNotEqual(id(e), id(d)) + self.assertEqual(id(e[-1]), id(e)) + self.assertEqual(e.maxlen, d.maxlen) def test_iterator_pickle(self): - data = deque(range(200)) + orig = deque(range(200)) + data = [i*1.01 for i in orig] 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(list(it), list(data)) - - it = pickle.loads(d) - next(it) - d = pickle.dumps(it, proto) - self.assertEqual(list(it), list(data)[1:]) + # initial iterator + itorg = iter(orig) + dump = pickle.dumps((itorg, orig), proto) + it, d = pickle.loads(dump) + for i, x in enumerate(data): + d[i] = x + self.assertEqual(type(it), type(itorg)) + self.assertEqual(list(it), data) + + # running iterator + next(itorg) + dump = pickle.dumps((itorg, orig), proto) + it, d = pickle.loads(dump) + for i, x in enumerate(data): + d[i] = x + self.assertEqual(type(it), type(itorg)) + self.assertEqual(list(it), data[1:]) + + # empty iterator + for i in range(1, len(data)): + next(itorg) + dump = pickle.dumps((itorg, orig), proto) + it, d = pickle.loads(dump) + for i, x in enumerate(data): + d[i] = x + self.assertEqual(type(it), type(itorg)) + self.assertEqual(list(it), []) + + # exhausted iterator + self.assertRaises(StopIteration, next, itorg) + dump = pickle.dumps((itorg, orig), proto) + it, d = pickle.loads(dump) + for i, x in enumerate(data): + d[i] = x + self.assertEqual(type(it), type(itorg)) + self.assertEqual(list(it), []) def test_deepcopy(self): mut = [10]