diff --git a/Lib/test/test_enumerate.py b/Lib/test/test_enumerate.py index 18c2bb93966..0ed2b4c5c1f 100644 --- a/Lib/test/test_enumerate.py +++ b/Lib/test/test_enumerate.py @@ -145,6 +145,35 @@ class TestReversed(unittest.TestCase): # This is an implementation detail, not an interface requirement for s in ('hello', tuple('hello'), list('hello'), xrange(5)): self.assertEqual(len(reversed(s)), len(s)) + r = reversed(s) + list(r) + self.assertEqual(len(r), 0) + class SeqWithWeirdLen: + called = False + def __len__(self): + if not self.called: + self.called = True + return 10 + raise ZeroDivisionError + def __getitem__(self, index): + return index + r = reversed(SeqWithWeirdLen()) + self.assertRaises(ZeroDivisionError, len, r) + + + def test_gc(self): + class Seq: + def __len__(self): + return 10 + def __getitem__(self, index): + return index + s = Seq() + r = reversed(s) + s.r = r + + def test_args(self): + self.assertRaises(TypeError, reversed) + self.assertRaises(TypeError, reversed, [], 'extra') def test_main(verbose=None): testclasses = (EnumerateTestCase, SubclassTestCase, TestEmpty, TestBig, diff --git a/Lib/test/test_itertools.py b/Lib/test/test_itertools.py index 02f84b7e398..aa809105479 100644 --- a/Lib/test/test_itertools.py +++ b/Lib/test/test_itertools.py @@ -420,6 +420,14 @@ class TestGC(unittest.TestCase): a = [] self.makecycle(cycle([a]*2), a) + def test_dropwhile(self): + a = [] + self.makecycle(dropwhile(bool, [0, a, a]), a) + + def test_groupby(self): + a = [] + self.makecycle(groupby([a]*2, lambda x:x), a) + def test_ifilter(self): a = [] self.makecycle(ifilter(lambda x:True, [a]*2), a) @@ -440,10 +448,18 @@ class TestGC(unittest.TestCase): a = [] self.makecycle(islice([a]*2, None), a) + def test_repeat(self): + a = [] + self.makecycle(repeat(a), a) + def test_starmap(self): a = [] self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a) + def test_takewhile(self): + a = [] + self.makecycle(takewhile(bool, [1, 0, a, a]), a) + def R(seqn): 'Regular generator' for i in seqn: