]> granicus.if.org Git - python/commitdiff
Issue #26492: Added additional tests for exhausted iterators of mutable sequences.
authorSerhiy Storchaka <storchaka@gmail.com>
Wed, 30 Mar 2016 18:01:26 +0000 (21:01 +0300)
committerSerhiy Storchaka <storchaka@gmail.com>
Wed, 30 Mar 2016 18:01:26 +0000 (21:01 +0300)
Lib/test/list_tests.py
Lib/test/test_bytes.py
Lib/test/test_iter.py

index 1adfc75b77a0e90091bb49db065f0d0ec4b8a229..f20fdc0a5f0aa76e15f47148e928acd1a2990836 100644 (file)
@@ -593,3 +593,14 @@ class CommonTest(seq_tests.CommonTest):
             def __iter__(self):
                 raise KeyboardInterrupt
         self.assertRaises(KeyboardInterrupt, list, F())
+
+    def test_exhausted_iterator(self):
+        a = self.type2test([1, 2, 3])
+        exhit = iter(a)
+        empit = iter(a)
+        for x in exhit:  # exhaust the iterator
+            next(empit)  # not exhausted
+        a.append(9)
+        self.assertEqual(list(exhit), [])
+        self.assertEqual(list(empit), [9])
+        self.assertEqual(a, self.type2test([1, 2, 3, 9]))
index 1bd3a1ed9c4041e676fb0eb2fd57a03bcac3dcb2..01ba5e51c82e51dc402f8e6150b3b8c348b9e188 100644 (file)
@@ -17,6 +17,7 @@ import unittest
 import test.support
 import test.string_tests
 import test.buffer_tests
+import test.list_tests
 from test.support import bigaddrspacetest, MAX_Py_ssize_t
 
 
@@ -1323,6 +1324,7 @@ class ByteArrayTest(BaseBytesTest, unittest.TestCase):
             b[:] = data
             self.assertEqual(list(it), [])
 
+    test_exhausted_iterator = test.list_tests.CommonTest.test_exhausted_iterator
 
 class AssortedBytesTest(unittest.TestCase):
     #
index 54ddbaa5fdf49aa9445b5202ae1d656229228b64..a91670b4a11fba6902b13747d73bec906815782f 100644 (file)
@@ -190,6 +190,17 @@ class TestCase(unittest.TestCase):
             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):