Skip to content

Commit 9e19af7

Browse files
jgarzikclaude
andcommitted
Import test_generators.py (15 tests)
Tests basic generators, yield from, send, closures, recursive generators, generator expressions, fibonacci, and tuple unpacking in yields. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 5a20d8b commit 9e19af7

2 files changed

Lines changed: 132 additions & 0 deletions

File tree

Makefile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ gen-cpython-tests:
8888
@$(PYTHON) -m py_compile tests/cpython/test_decorators.py
8989
@echo "Compiling tests/cpython/test_scope.py..."
9090
@$(PYTHON) -m py_compile tests/cpython/test_scope.py
91+
@echo "Compiling tests/cpython/test_generators.py..."
92+
@$(PYTHON) -m py_compile tests/cpython/test_generators.py
9193
@echo "Done."
9294

9395
check-cpython: $(TARGET) gen-cpython-tests
@@ -123,3 +125,5 @@ check-cpython: $(TARGET) gen-cpython-tests
123125
@./apython tests/cpython/__pycache__/test_decorators.cpython-312.pyc
124126
@echo "Running CPython test_scope.py..."
125127
@./apython tests/cpython/__pycache__/test_scope.cpython-312.pyc
128+
@echo "Running CPython test_generators.py..."
129+
@./apython tests/cpython/__pycache__/test_generators.cpython-312.pyc

tests/cpython/test_generators.py

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
"""CPython test_generators.py adapted for apython."""
2+
import unittest
3+
4+
5+
class GeneratorTest(unittest.TestCase):
6+
7+
def test_basic_generator(self):
8+
def gen():
9+
yield 1
10+
yield 2
11+
yield 3
12+
g = gen()
13+
self.assertEqual(next(g), 1)
14+
self.assertEqual(next(g), 2)
15+
self.assertEqual(next(g), 3)
16+
try:
17+
next(g)
18+
self.fail("Expected StopIteration")
19+
except StopIteration:
20+
pass
21+
22+
def test_generator_list(self):
23+
def gen():
24+
yield 1
25+
yield 2
26+
yield 3
27+
self.assertEqual(list(gen()), [1, 2, 3])
28+
29+
def test_generator_for_loop(self):
30+
def gen(n):
31+
for i in range(n):
32+
yield i
33+
self.assertEqual(list(gen(5)), [0, 1, 2, 3, 4])
34+
self.assertEqual(list(gen(0)), [])
35+
36+
def test_generator_expression(self):
37+
g = (x * x for x in range(5))
38+
self.assertEqual(list(g), [0, 1, 4, 9, 16])
39+
40+
def test_generator_with_return(self):
41+
def gen():
42+
yield 1
43+
return
44+
self.assertEqual(list(gen()), [1])
45+
46+
def test_generator_send(self):
47+
def gen():
48+
x = yield 1
49+
yield x + 10
50+
g = gen()
51+
self.assertEqual(next(g), 1)
52+
self.assertEqual(g.send(5), 15)
53+
54+
def test_yield_from(self):
55+
def inner():
56+
yield 1
57+
yield 2
58+
def outer():
59+
yield from inner()
60+
yield 3
61+
self.assertEqual(list(outer()), [1, 2, 3])
62+
63+
def test_yield_from_list(self):
64+
def gen():
65+
yield from [1, 2, 3]
66+
self.assertEqual(list(gen()), [1, 2, 3])
67+
68+
def test_yield_from_range(self):
69+
def gen():
70+
yield from range(5)
71+
self.assertEqual(list(gen()), [0, 1, 2, 3, 4])
72+
73+
def test_recursive_generator(self):
74+
def flatten(lst):
75+
for item in lst:
76+
if isinstance(item, list):
77+
yield from flatten(item)
78+
else:
79+
yield item
80+
nested = [1, [2, 3], [4, [5, 6]], 7]
81+
self.assertEqual(list(flatten(nested)), [1, 2, 3, 4, 5, 6, 7])
82+
83+
def test_generator_closure(self):
84+
def make_gen(x):
85+
def gen():
86+
for i in range(x):
87+
yield i * x
88+
return gen
89+
g = make_gen(3)
90+
self.assertEqual(list(g()), [0, 3, 6])
91+
92+
def test_multiple_generators(self):
93+
def gen(n):
94+
for i in range(n):
95+
yield i
96+
g1 = gen(3)
97+
g2 = gen(5)
98+
self.assertEqual(next(g1), 0)
99+
self.assertEqual(next(g2), 0)
100+
self.assertEqual(next(g1), 1)
101+
self.assertEqual(list(g2), [1, 2, 3, 4])
102+
self.assertEqual(next(g1), 2)
103+
104+
def test_generator_filter(self):
105+
def evens(n):
106+
for i in range(n):
107+
if i % 2 == 0:
108+
yield i
109+
self.assertEqual(list(evens(10)), [0, 2, 4, 6, 8])
110+
111+
def test_fibonacci_generator(self):
112+
def fib(n):
113+
a, b = 0, 1
114+
for _ in range(n):
115+
yield a
116+
a, b = b, a + b
117+
self.assertEqual(list(fib(10)), [0, 1, 1, 2, 3, 5, 8, 13, 21, 34])
118+
119+
def test_generator_tuple_unpack(self):
120+
def gen():
121+
yield 1, 2
122+
yield 3, 4
123+
result = list(gen())
124+
self.assertEqual(result, [(1, 2), (3, 4)])
125+
126+
127+
if __name__ == "__main__":
128+
unittest.main()

0 commit comments

Comments
 (0)