]> granicus.if.org Git - python/commitdiff
Issue #26015: Added new tests for pickling iterators of mutable sequences.
authorSerhiy Storchaka <storchaka@gmail.com>
Sun, 6 Mar 2016 12:12:04 +0000 (14:12 +0200)
committerSerhiy Storchaka <storchaka@gmail.com>
Sun, 6 Mar 2016 12:12:04 +0000 (14:12 +0200)
1  2 
Lib/test/test_bytes.py
Lib/test/test_deque.py
Misc/NEWS

Simple merge
index 634d71fa86db3a8fc57308a8f8b348d35c6ab2e6,ec2be83d4254968e13d25d69a2b10f829de04d24..29b44f66410755ee365d819a426f0a4206fb47de
@@@ -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]
diff --cc Misc/NEWS
Simple merge