8000 gh-125038: Changes in tests on generator modifying · efimov-mikhail/cpython@233f6b6 · GitHub
[go: up one dir, main page]

Skip to content

Commit 233f6b6

Browse files
pythongh-125038: Changes in tests on generator modifying
New tests are moved back to test_generators.py. Tests on generator creation via FunctionType from gi_code are added.
1 parent 9665d13 commit 233f6b6

File tree

2 files changed

+78
-55
lines changed

2 files changed

+78
-55
lines changed

Lib/test/test_frame.py

Lines changed: 0 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -515,61 +515,6 @@ def make_frame():
515515
with self.assertRaises(TypeError):
516516
FrameLocalsProxy(frame=sys._getframe()) # no keyword arguments
517517

518-
def test_generator_f_locals(self):
519-
def get_generator_genexpr(new_value):
520-
g = (x for x in range(10))
521-
g.gi_frame.f_locals['.0'] = new_value
522-
return g
523-
524-
def get_generator_fn_call(new_value):
525-
def gen(it):
526-
for x in it:
527-
yield x
528-
529-
g = gen(range(10))
530-
g.gi_frame.f_locals['it'] = new_value
531-
return g
532-
533-
err_msg_pattern_genexpr = "'%s' object is not an iterator"
534-
err_msg_pattern_fn_call = "'%s' object is not iterable"
535-
536-
sequences = [
537-
range(0),
538-
range(20),
539-
[1, 2, 3],
540-
(2,),
541-
set((13, 48, 211)),
542-
frozenset((15, 8, 6)),
543-
dict([(1, 2), (3, 4)]),
544-
]
545-
546-
for seq in sequences:
547-
err_msg_genexpr = err_msg_pattern_genexpr % type(seq).__name__
548-
with self.assertRaisesRegex(TypeError, err_msg_genexpr):
549-
list(get_generator_genexpr(seq))
550-
self.assertListEqual(list(get_generator_genexpr(iter(seq))),
551-
list(seq))
552-
553-
self.assertListEqual(list(get_generator_fn_call(seq)),
554-
list(seq))
555-
self.assertListEqual(list(get_generator_fn_call(iter(seq))),
556-
list(seq))
557-
558-
non_sequences = [
559-
None,
560-
42,
561-
3.0,
562-
2j,
563-
]
564-
565-
for obj in non_sequences:
566-
err_msg_genexpr = err_msg_pattern_genexpr % type(obj).__name__
567-
with self.assertRaisesRegex(TypeError, err_msg_genexpr):
568-
list(get_generator_genexpr(obj))
569-
err_msg_fn_call = err_msg_pattern_fn_call % type(obj).__name__
570-
with self.assertRaisesRegex(TypeError, err_msg_fn_call):
571-
list(get_generator_fn_call(obj))
572-
573518

574519
class FrameLocalsProxyMappingTests(mapping_tests.TestHashMappingProtocol):
575520
"""Test that FrameLocalsProxy behaves like a Mapping (with exceptions)"""

Lib/test/test_generators.py

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,84 @@ def loop():
268268
#This should not raise
269269
loop()
270270

271+
272+
class ModifyTest(unittest.TestCase):
273+
sequences = [
274+
range(0),
275+
range(20),
276+
[1, 2, 3],
277+
(2,),
278+
set((13, 48, 211)),
279+
frozenset((15, 8, 6)),
280+
dict([(1, 2), (3, 4)]),
281+
]
282+
283+
non_sequences = [
284+
None,
285+
42,
286+
3.0,
287+
2j,
288+
]
289+
290+
def modify_f_locals(self, g, local, new_iter):
291+
g.gi_frame.f_locals[local] = new_iter
292+
return g
293+
294+
def new_gen_from_gi_code(self, g, new_iter):
295+
generator_func = types.FunctionType(g.gi_code, {})
296+
return generator_func(new_iter)
297+
298+
def test_modify_genexpr(self):
299+
def genexpr():
300+
return (x for x in range(10))
301+
302+
def get_genexpr_f_locals(self, new_iter):
303+
return self.modify_f_locals(genexpr(), '.0', new_iter)
304+
305+
def get_genexpr_gi_code(self, new_iter):
306+
return self.new_gen_from_gi_code(genexpr(), new_iter)
307+
308+
err_msg_pattern_genexpr = "'%s' object is not an iterator"
309+
310+
for get_genexpr in [get_genexpr_f_locals, get_genexpr_gi_code]:
311+
for seq in self.sequences:
312+
err_msg_genexpr = err_msg_pattern_genexpr % type(seq).__name__
313+
with self.assertRaisesRegex(TypeError, err_msg_genexpr):
314+
list(get_genexpr(self, seq))
315+
self.assertListEqual(list(get_genexpr(self, iter(seq))),
316+
list(seq))
317+
for obj in self.non_sequences:
318+
err_msg_genexpr = err_msg_pattern_genexpr % type(obj).__name__
319+
with self B41A .assertRaisesRegex(TypeError, err_msg_genexpr):
320+
list(get_genexpr(self, obj))
321+
322+
def test_modify_genfunc(self):
323+
def genfunc():
324+
def gen(it):
325+
for x in it:
326+
yield x
327+
return gen(range(10))
328+
329+
def get_genfunc_f_locals(self, new_iter):
330+
return self.modify_f_locals(genfunc(), 'it', new_iter)
331+
332+
def get_genfunc_gi_code(self, new_iter):
333+
return self.new_gen_from_gi_code(genfunc(), new_iter)
334+
335+
err_msg_pattern_fn_call = "'%s' object is not iterable"
336+
337+
for get_genfunc in [get_genfunc_f_locals, get_genfunc_gi_code]:
338+
for seq in self.sequences:
339+
self.assertListEqual(list(get_genfunc(self, seq)),
340+
list(seq))
341+
self.assertListEqual(list(get_genfunc(self, iter(seq))),
342+
list(seq))
343+
for obj in self.non_sequences:
344+
err_msg_fn_call = err_msg_pattern_fn_call % type(obj).__name__
345+
with self.assertRaisesRegex(TypeError, err_msg_fn_call):
346+
list(get_genfunc(self, obj))
347+
348+
271349
class ExceptionTest(unittest.TestCase):
272350
# Tests for the issue #23353: check that the currently handled exception
273351
# is correctly saved/restored in PyEval_EvalFrameEx().

0 commit comments

Comments
 (0)
0