From ea2e97a08a2f1cd5e142dac36d60c80bd99ceeb2 Mon Sep 17 00:00:00 2001 From: Tim Peters Date: Sun, 24 Jun 2001 07:10:02 +0000 Subject: [PATCH] New tests to provoke SyntaxErrors unique to generators. Minor fiddling of other tests. --- Lib/test/test_generators.py | 91 ++++++++++++++++++++++++++++++++++--- 1 file changed, 85 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_generators.py b/Lib/test/test_generators.py index 5ddffdf9f8d..8a824074526 100644 --- a/Lib/test/test_generators.py +++ b/Lib/test/test_generators.py @@ -14,13 +14,16 @@ Let's try a simple generator: 1 >>> g.next() 2 + + "Falling off the end" stops the generator: + >>> g.next() Traceback (most recent call last): File "", line 1, in ? File "", line 2, in g StopIteration -"return" stops the generator: +"return" also stops the generator: >>> def f(): ... yield 1 @@ -424,7 +427,7 @@ arguments are iterable -- a LazyList is the same as a generator to times(). >>> def m235(): ... yield 1 -... # Gack: m235 below actually refers to a LazyList. +... # Gack: m235 below actually refers to a LazyList. ... me_times2 = times(2, m235) ... me_times3 = times(3, m235) ... me_times5 = times(5, m235) @@ -443,11 +446,87 @@ arguments are iterable -- a LazyList is the same as a generator to times(). [400, 405, 432, 450, 480, 486, 500, 512, 540, 576, 600, 625, 640, 648, 675] """ +# syntax_tests mostly provokes SyntaxErrors. -__test__ = {"tut": tutorial_tests, - "pep": pep_tests, - "email": email_tests, - "fun": fun_tests} +syntax_tests = """ + +>>> def f(): +... return 22 +... yield 1 +Traceback (most recent call last): + ... +SyntaxError: 'return' with argument inside generator (, line 2) + +>>> def f(): +... yield 1 +... return 22 +Traceback (most recent call last): + ... +SyntaxError: 'return' with argument inside generator (, line 3) + +"return None" is not the same as "return" in a generator: + +>>> def f(): +... yield 1 +... return None +Traceback (most recent call last): + ... +SyntaxError: 'return' with argument inside generator (, line 3) + +This one is fine: + +>>> def f(): +... yield 1 +... return + +>>> def f(): +... try: +... yield 1 +... finally: +... pass +Traceback (most recent call last): + ... +SyntaxError: 'yield' not allowed in a 'try' block with a 'finally' clause (, line 3) + +>>> def f(): +... try: +... try: +... 1/0 +... except ZeroDivisionError: +... yield 666 # bad because *outer* try has finally +... except: +... pass +... finally: +... pass +Traceback (most recent call last): + ... +SyntaxError: 'yield' not allowed in a 'try' block with a 'finally' clause (, line 6) + +But this is fine: + +>>> def f(): +... try: +... try: +... yield 12 +... 1/0 +... except ZeroDivisionError: +... yield 666 +... except: +... try: +... x = 12 +... finally: +... yield 12 +... except: +... return +>>> list(f()) +[12, 666] +""" + +__test__ = {"tut": tutorial_tests, + "pep": pep_tests, + "email": email_tests, + "fun": fun_tests, + "syntax": syntax_tests} # Magic test name that regrtest.py invokes *after* importing this module. # This worms around a bootstrap problem.