Skip to content

Commit 77fee35

Browse files
committed
Add some tests
1 parent bc054db commit 77fee35

File tree

1 file changed

+72
-0
lines changed

1 file changed

+72
-0
lines changed

Lib/test/test_free_threading/test_generators.py

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import concurrent.futures
22
import unittest
3+
import threading
34
from threading import Barrier
45
from unittest import TestCase
56
import random
@@ -49,3 +50,74 @@ def test_concurrent_write(self):
4950
self.concurrent_write_with_func(func=set_gen_name)
5051
with self.subTest(func=set_gen_qualname):
5152
self.concurrent_write_with_func(func=set_gen_qualname)
53+
54+
def test_concurrent_send(self):
55+
def gen():
56+
yield 1
57+
yield 2
58+
yield 3
59+
yield 4
60+
yield 5
61+
62+
def run_test(drive_generator):
63+
g = gen()
64+
values = []
65+
threading_helper.run_concurrently(drive_generator, self.NUM_THREADS, args=(g, values,))
66+
self.assertEqual(sorted(values), [1, 2, 3, 4, 5])
67+
68+
def call_next(g, values):
69+
while True:
70+
try:
71+
values.append(next(g))
72+
except ValueError:
73+
continue
74+
except StopIteration:
75+
break
76+
77+
with self.subTest(method='next'):
78+
run_test(call_next)
79+
80+
def call_send(g, values):
81+
while True:
82+
try:
83+
values.append(g.send(None))
84+
except ValueError:
85+
continue
86+
except StopIteration:
87+
break
88+
89+
with self.subTest(method='send'):
90+
run_test(call_send)
91+
92+
def for_iter_gen(g, values):
93+
while True:
94+
try:
95+
for value in g:
96+
values.append(value)
97+
else:
98+
break
99+
except ValueError:
100+
continue
101+
102+
with self.subTest(method='for'):
103+
run_test(for_iter_gen)
104+
105+
def test_concurrent_close(self):
106+
def gen():
107+
for i in range(10):
108+
yield i
109+
time.sleep(0.001)
110+
111+
def drive_generator(g):
112+
while True:
113+
try:
114+
for value in g:
115+
if value == 5:
116+
g.close()
117+
else:
118+
return
119+
except ValueError as e:
120+
self.assertEqual(e.args[0], "generator already executing")
121+
122+
g = gen()
123+
threading_helper.run_concurrently(drive_generator, self.NUM_THREADS, args=(g,))

0 commit comments

Comments
 (0)