Blame tests/run/test_grammar.py

Packit 562c7a
### COPIED FROM CPython 3.5 - ADDED PART FOLLOWS ###
Packit 562c7a
# cython: language_level=3
Packit 562c7a
Packit 562c7a
import contextlib
Packit 562c7a
from tempfile import NamedTemporaryFile
Packit 562c7a
from Cython.Compiler.Main import compile as cython_compile
Packit 562c7a
Packit 562c7a
Packit 562c7a
def _compile(code):
Packit 562c7a
    with NamedTemporaryFile(suffix='.py') as f:
Packit 562c7a
        f.write(code.encode('utf8'))
Packit 562c7a
        f.flush()
Packit 562c7a
Packit 562c7a
        try:
Packit 562c7a
            from StringIO import StringIO
Packit 562c7a
        except ImportError:
Packit 562c7a
            from io import StringIO
Packit 562c7a
Packit 562c7a
        old_stderr = sys.stderr
Packit 562c7a
        try:
Packit 562c7a
            sys.stderr = StringIO()
Packit 562c7a
            result = cython_compile(f.name, language_level=3)
Packit 562c7a
        finally:
Packit 562c7a
            sys.stderr = old_stderr
Packit 562c7a
    return result
Packit 562c7a
Packit 562c7a
Packit 562c7a
def check_syntax_error(test, code):
Packit 562c7a
    result = _compile(code)
Packit 562c7a
    assert not result.c_file
Packit 562c7a
Packit 562c7a
Packit 562c7a
def compile(code, name, what):
Packit 562c7a
    assert what == 'exec'
Packit 562c7a
    result = _compile(code)
Packit 562c7a
    if not result.c_file:
Packit 562c7a
        raise SyntaxError('unexpected EOF')  # see usage of compile() below
Packit 562c7a
Packit 562c7a
Packit 562c7a
def exec(code):
Packit 562c7a
    result = _compile(code)
Packit 562c7a
    if not result.c_file:
Packit 562c7a
        raise SyntaxError('unexpected EOF')  # see usage of compile() below
Packit 562c7a
Packit 562c7a
Packit 562c7a
import unittest
Packit 562c7a
Packit 562c7a
if not hasattr(unittest, 'skipUnless'):
Packit 562c7a
    def skipUnless(condition, message):
Packit 562c7a
        def decorator(func):
Packit 562c7a
            if condition:
Packit 562c7a
                return func
Packit 562c7a
Packit 562c7a
            def test_method(self):
Packit 562c7a
                print(message)
Packit 562c7a
            return test_method
Packit 562c7a
        return decorator
Packit 562c7a
Packit 562c7a
    unittest.skipUnless = skipUnless
Packit 562c7a
Packit 562c7a
Packit 562c7a
### END OF CYTHON ADDED PART - COPIED PART FOLLOWS ###
Packit 562c7a
Packit 562c7a
# Python test set -- part 1, grammar.
Packit 562c7a
# This just tests whether the parser accepts them all.
Packit 562c7a
Packit 562c7a
#from test.support import check_syntax_error
Packit 562c7a
import inspect
Packit 562c7a
import unittest
Packit 562c7a
import sys
Packit 562c7a
# testing import *
Packit 562c7a
from sys import *
Packit 562c7a
Packit 562c7a
Packit 562c7a
class TokenTests(unittest.TestCase):
Packit 562c7a
Packit 562c7a
    def test_backslash(self):
Packit 562c7a
        # Backslash means line continuation:
Packit 562c7a
        x = 1 \
Packit 562c7a
        + 1
Packit 562c7a
        self.assertEqual(x, 2, 'backslash for line continuation')
Packit 562c7a
Packit 562c7a
        # Backslash does not means continuation in comments :\
Packit 562c7a
        x = 0
Packit 562c7a
        self.assertEqual(x, 0, 'backslash ending comment')
Packit 562c7a
Packit 562c7a
    def test_plain_integers(self):
Packit 562c7a
        self.assertEqual(type(000), type(0))
Packit 562c7a
        self.assertEqual(0xff, 255)
Packit 562c7a
        self.assertEqual(0o377, 255)
Packit 562c7a
        self.assertEqual(2147483647, 0o17777777777)
Packit 562c7a
        self.assertEqual(0b1001, 9)
Packit 562c7a
        # "0x" is not a valid literal
Packit 562c7a
        self.assertRaises(SyntaxError, eval, "0x")
Packit 562c7a
        from sys import maxsize
Packit 562c7a
        if maxsize == 2147483647:
Packit 562c7a
            self.assertEqual(-2147483647-1, -0o20000000000)
Packit 562c7a
            # XXX -2147483648
Packit 562c7a
            self.assertTrue(0o37777777777 > 0)
Packit 562c7a
            self.assertTrue(0xffffffff > 0)
Packit 562c7a
            self.assertTrue(0b1111111111111111111111111111111 > 0)
Packit 562c7a
            for s in ('2147483648', '0o40000000000', '0x100000000',
Packit 562c7a
                      '0b10000000000000000000000000000000'):
Packit 562c7a
                try:
Packit 562c7a
                    x = eval(s)
Packit 562c7a
                except OverflowError:
Packit 562c7a
                    self.fail("OverflowError on huge integer literal %r" % s)
Packit 562c7a
        elif maxsize == 9223372036854775807:
Packit 562c7a
            self.assertEqual(-9223372036854775807-1, -0o1000000000000000000000)
Packit 562c7a
            self.assertTrue(0o1777777777777777777777 > 0)
Packit 562c7a
            self.assertTrue(0xffffffffffffffff > 0)
Packit 562c7a
            self.assertTrue(0b11111111111111111111111111111111111111111111111111111111111111 > 0)
Packit 562c7a
            for s in '9223372036854775808', '0o2000000000000000000000', \
Packit 562c7a
                     '0x10000000000000000', \
Packit 562c7a
                     '0b100000000000000000000000000000000000000000000000000000000000000':
Packit 562c7a
                try:
Packit 562c7a
                    x = eval(s)
Packit 562c7a
                except OverflowError:
Packit 562c7a
                    self.fail("OverflowError on huge integer literal %r" % s)
Packit 562c7a
        else:
Packit 562c7a
            self.fail('Weird maxsize value %r' % maxsize)
Packit 562c7a
Packit 562c7a
    def test_long_integers(self):
Packit 562c7a
        x = 0
Packit 562c7a
        x = 0xffffffffffffffff
Packit 562c7a
        x = 0Xffffffffffffffff
Packit 562c7a
        x = 0o77777777777777777
Packit 562c7a
        x = 0O77777777777777777
Packit 562c7a
        x = 123456789012345678901234567890
Packit 562c7a
        x = 0b100000000000000000000000000000000000000000000000000000000000000000000
Packit 562c7a
        x = 0B111111111111111111111111111111111111111111111111111111111111111111111
Packit 562c7a
Packit 562c7a
    def test_floats(self):
Packit 562c7a
        x = 3.14
Packit 562c7a
        x = 314.
Packit 562c7a
        x = 0.314
Packit 562c7a
        # XXX x = 000.314
Packit 562c7a
        x = .314
Packit 562c7a
        x = 3e14
Packit 562c7a
        x = 3E14
Packit 562c7a
        x = 3e-14
Packit 562c7a
        x = 3e+14
Packit 562c7a
        x = 3.e14
Packit 562c7a
        x = .3e14
Packit 562c7a
        x = 3.1e4
Packit 562c7a
Packit 562c7a
    def test_float_exponent_tokenization(self):
Packit 562c7a
        # See issue 21642.
Packit 562c7a
        self.assertEqual(1 if 1else 0, 1)
Packit 562c7a
        self.assertEqual(1 if 0else 0, 0)
Packit 562c7a
        self.assertRaises(SyntaxError, eval, "0 if 1Else 0")
Packit 562c7a
Packit 562c7a
    def test_string_literals(self):
Packit 562c7a
        x = ''; y = ""; self.assertTrue(len(x) == 0 and x == y)
Packit 562c7a
        x = '\''; y = "'"; self.assertTrue(len(x) == 1 and x == y and ord(x) == 39)
Packit 562c7a
        x = '"'; y = "\""; self.assertTrue(len(x) == 1 and x == y and ord(x) == 34)
Packit 562c7a
        x = "doesn't \"shrink\" does it"
Packit 562c7a
        y = 'doesn\'t "shrink" does it'
Packit 562c7a
        self.assertTrue(len(x) == 24 and x == y)
Packit 562c7a
        x = "does \"shrink\" doesn't it"
Packit 562c7a
        y = 'does "shrink" doesn\'t it'
Packit 562c7a
        self.assertTrue(len(x) == 24 and x == y)
Packit 562c7a
        x = """
Packit 562c7a
The "quick"
Packit 562c7a
brown fox
Packit 562c7a
jumps over
Packit 562c7a
the 'lazy' dog.
Packit 562c7a
"""
Packit 562c7a
        y = '\nThe "quick"\nbrown fox\njumps over\nthe \'lazy\' dog.\n'
Packit 562c7a
        self.assertEqual(x, y)
Packit 562c7a
        y = '''
Packit 562c7a
The "quick"
Packit 562c7a
brown fox
Packit 562c7a
jumps over
Packit 562c7a
the 'lazy' dog.
Packit 562c7a
'''
Packit 562c7a
        self.assertEqual(x, y)
Packit 562c7a
        y = "\n\
Packit 562c7a
The \"quick\"\n\
Packit 562c7a
brown fox\n\
Packit 562c7a
jumps over\n\
Packit 562c7a
the 'lazy' dog.\n\
Packit 562c7a
"
Packit 562c7a
        self.assertEqual(x, y)
Packit 562c7a
        y = '\n\
Packit 562c7a
The \"quick\"\n\
Packit 562c7a
brown fox\n\
Packit 562c7a
jumps over\n\
Packit 562c7a
the \'lazy\' dog.\n\
Packit 562c7a
'
Packit 562c7a
        self.assertEqual(x, y)
Packit 562c7a
Packit 562c7a
    def test_ellipsis(self):
Packit 562c7a
        x = ...
Packit 562c7a
        self.assertTrue(x is Ellipsis)
Packit 562c7a
        self.assertRaises(SyntaxError, eval, ".. .")
Packit 562c7a
Packit 562c7a
    def test_eof_error(self):
Packit 562c7a
        samples = ("def foo(", "\ndef foo(", "def foo(\n")
Packit 562c7a
        for s in samples:
Packit 562c7a
            with self.assertRaises(SyntaxError) as cm:
Packit 562c7a
                compile(s, "<test>", "exec")
Packit 562c7a
            self.assertIn("unexpected EOF", str(cm.exception))
Packit 562c7a
Packit 562c7a
class GrammarTests(unittest.TestCase):
Packit 562c7a
Packit 562c7a
    # single_input: NEWLINE | simple_stmt | compound_stmt NEWLINE
Packit 562c7a
    # XXX can't test in a script -- this rule is only used when interactive
Packit 562c7a
Packit 562c7a
    # file_input: (NEWLINE | stmt)* ENDMARKER
Packit 562c7a
    # Being tested as this very moment this very module
Packit 562c7a
Packit 562c7a
    # expr_input: testlist NEWLINE
Packit 562c7a
    # XXX Hard to test -- used only in calls to input()
Packit 562c7a
Packit 562c7a
    def test_eval_input(self):
Packit 562c7a
        # testlist ENDMARKER
Packit 562c7a
        x = eval('1, 0 or 1')
Packit 562c7a
Packit 562c7a
    def test_funcdef(self):
Packit 562c7a
        ### [decorators] 'def' NAME parameters ['->' test] ':' suite
Packit 562c7a
        ### decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE
Packit 562c7a
        ### decorators: decorator+
Packit 562c7a
        ### parameters: '(' [typedargslist] ')'
Packit 562c7a
        ### typedargslist: ((tfpdef ['=' test] ',')*
Packit 562c7a
        ###                ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef] | '**' tfpdef)
Packit 562c7a
        ###                | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Packit 562c7a
        ### tfpdef: NAME [':' test]
Packit 562c7a
        ### varargslist: ((vfpdef ['=' test] ',')*
Packit 562c7a
        ###              ('*' [vfpdef] (',' vfpdef ['=' test])*  [',' '**' vfpdef] | '**' vfpdef)
Packit 562c7a
        ###              | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Packit 562c7a
        ### vfpdef: NAME
Packit 562c7a
        def f1(): pass
Packit 562c7a
        f1()
Packit 562c7a
        f1(*())
Packit 562c7a
        f1(*(), **{})
Packit 562c7a
        def f2(one_argument): pass
Packit 562c7a
        def f3(two, arguments): pass
Packit 562c7a
        self.assertEqual(f2.__code__.co_varnames, ('one_argument',))
Packit 562c7a
        self.assertEqual(f3.__code__.co_varnames, ('two', 'arguments'))
Packit 562c7a
        def a1(one_arg,): pass
Packit 562c7a
        def a2(two, args,): pass
Packit 562c7a
        def v0(*rest): pass
Packit 562c7a
        def v1(a, *rest): pass
Packit 562c7a
        def v2(a, b, *rest): pass
Packit 562c7a
Packit 562c7a
        f1()
Packit 562c7a
        f2(1)
Packit 562c7a
        f2(1,)
Packit 562c7a
        f3(1, 2)
Packit 562c7a
        f3(1, 2,)
Packit 562c7a
        v0()
Packit 562c7a
        v0(1)
Packit 562c7a
        v0(1,)
Packit 562c7a
        v0(1,2)
Packit 562c7a
        v0(1,2,3,4,5,6,7,8,9,0)
Packit 562c7a
        v1(1)
Packit 562c7a
        v1(1,)
Packit 562c7a
        v1(1,2)
Packit 562c7a
        v1(1,2,3)
Packit 562c7a
        v1(1,2,3,4,5,6,7,8,9,0)
Packit 562c7a
        v2(1,2)
Packit 562c7a
        v2(1,2,3)
Packit 562c7a
        v2(1,2,3,4)
Packit 562c7a
        v2(1,2,3,4,5,6,7,8,9,0)
Packit 562c7a
Packit 562c7a
        def d01(a=1): pass
Packit 562c7a
        d01()
Packit 562c7a
        d01(1)
Packit 562c7a
        d01(*(1,))
Packit 562c7a
        d01(*[] or [2])
Packit 562c7a
        d01(*() or (), *{} and (), **() or {})
Packit 562c7a
        d01(**{'a':2})
Packit 562c7a
        d01(**{'a':2} or {})
Packit 562c7a
        def d11(a, b=1): pass
Packit 562c7a
        d11(1)
Packit 562c7a
        d11(1, 2)
Packit 562c7a
        d11(1, **{'b':2})
Packit 562c7a
        def d21(a, b, c=1): pass
Packit 562c7a
        d21(1, 2)
Packit 562c7a
        d21(1, 2, 3)
Packit 562c7a
        d21(*(1, 2, 3))
Packit 562c7a
        d21(1, *(2, 3))
Packit 562c7a
        d21(1, 2, *(3,))
Packit 562c7a
        d21(1, 2, **{'c':3})
Packit 562c7a
        def d02(a=1, b=2): pass
Packit 562c7a
        d02()
Packit 562c7a
        d02(1)
Packit 562c7a
        d02(1, 2)
Packit 562c7a
        d02(*(1, 2))
Packit 562c7a
        d02(1, *(2,))
Packit 562c7a
        d02(1, **{'b':2})
Packit 562c7a
        d02(**{'a': 1, 'b': 2})
Packit 562c7a
        def d12(a, b=1, c=2): pass
Packit 562c7a
        d12(1)
Packit 562c7a
        d12(1, 2)
Packit 562c7a
        d12(1, 2, 3)
Packit 562c7a
        def d22(a, b, c=1, d=2): pass
Packit 562c7a
        d22(1, 2)
Packit 562c7a
        d22(1, 2, 3)
Packit 562c7a
        d22(1, 2, 3, 4)
Packit 562c7a
        def d01v(a=1, *rest): pass
Packit 562c7a
        d01v()
Packit 562c7a
        d01v(1)
Packit 562c7a
        d01v(1, 2)
Packit 562c7a
        d01v(*(1, 2, 3, 4))
Packit 562c7a
        d01v(*(1,))
Packit 562c7a
        d01v(**{'a':2})
Packit 562c7a
        def d11v(a, b=1, *rest): pass
Packit 562c7a
        d11v(1)
Packit 562c7a
        d11v(1, 2)
Packit 562c7a
        d11v(1, 2, 3)
Packit 562c7a
        def d21v(a, b, c=1, *rest): pass
Packit 562c7a
        d21v(1, 2)
Packit 562c7a
        d21v(1, 2, 3)
Packit 562c7a
        d21v(1, 2, 3, 4)
Packit 562c7a
        d21v(*(1, 2, 3, 4))
Packit 562c7a
        d21v(1, 2, **{'c': 3})
Packit 562c7a
        def d02v(a=1, b=2, *rest): pass
Packit 562c7a
        d02v()
Packit 562c7a
        d02v(1)
Packit 562c7a
        d02v(1, 2)
Packit 562c7a
        d02v(1, 2, 3)
Packit 562c7a
        d02v(1, *(2, 3, 4))
Packit 562c7a
        d02v(**{'a': 1, 'b': 2})
Packit 562c7a
        def d12v(a, b=1, c=2, *rest): pass
Packit 562c7a
        d12v(1)
Packit 562c7a
        d12v(1, 2)
Packit 562c7a
        d12v(1, 2, 3)
Packit 562c7a
        d12v(1, 2, 3, 4)
Packit 562c7a
        d12v(*(1, 2, 3, 4))
Packit 562c7a
        d12v(1, 2, *(3, 4, 5))
Packit 562c7a
        d12v(1, *(2,), **{'c': 3})
Packit 562c7a
        def d22v(a, b, c=1, d=2, *rest): pass
Packit 562c7a
        d22v(1, 2)
Packit 562c7a
        d22v(1, 2, 3)
Packit 562c7a
        d22v(1, 2, 3, 4)
Packit 562c7a
        d22v(1, 2, 3, 4, 5)
Packit 562c7a
        d22v(*(1, 2, 3, 4))
Packit 562c7a
        d22v(1, 2, *(3, 4, 5))
Packit 562c7a
        d22v(1, *(2, 3), **{'d': 4})
Packit 562c7a
Packit 562c7a
        # keyword argument type tests
Packit 562c7a
        try:
Packit 562c7a
            str('x', **{b'foo':1 })
Packit 562c7a
        except TypeError:
Packit 562c7a
            pass
Packit 562c7a
        else:
Packit 562c7a
            self.fail('Bytes should not work as keyword argument names')
Packit 562c7a
        # keyword only argument tests
Packit 562c7a
        def pos0key1(*, key): return key
Packit 562c7a
        pos0key1(key=100)
Packit 562c7a
        def pos2key2(p1, p2, *, k1, k2=100): return p1,p2,k1,k2
Packit 562c7a
        pos2key2(1, 2, k1=100)
Packit 562c7a
        pos2key2(1, 2, k1=100, k2=200)
Packit 562c7a
        pos2key2(1, 2, k2=100, k1=200)
Packit 562c7a
        def pos2key2dict(p1, p2, *, k1=100, k2, **kwarg): return p1,p2,k1,k2,kwarg
Packit 562c7a
        pos2key2dict(1,2,k2=100,tokwarg1=100,tokwarg2=200)
Packit 562c7a
        pos2key2dict(1,2,tokwarg1=100,tokwarg2=200, k2=100)
Packit 562c7a
Packit 562c7a
        self.assertRaises(SyntaxError, eval, "def f(*): pass")
Packit 562c7a
        self.assertRaises(SyntaxError, eval, "def f(*,): pass")
Packit 562c7a
        self.assertRaises(SyntaxError, eval, "def f(*, **kwds): pass")
Packit 562c7a
Packit 562c7a
        # keyword arguments after *arglist
Packit 562c7a
        def f(*args, **kwargs):
Packit 562c7a
            return args, kwargs
Packit 562c7a
        self.assertEqual(f(1, x=2, *[3, 4], y=5), ((1, 3, 4),
Packit 562c7a
                                                    {'x':2, 'y':5}))
Packit 562c7a
        self.assertEqual(f(1, *(2,3), 4), ((1, 2, 3, 4), {}))
Packit 562c7a
        self.assertRaises(SyntaxError, eval, "f(1, x=2, *(3,4), x=5)")
Packit 562c7a
        self.assertEqual(f(**{'eggs':'scrambled', 'spam':'fried'}),
Packit 562c7a
                         ((), {'eggs':'scrambled', 'spam':'fried'}))
Packit 562c7a
        self.assertEqual(f(spam='fried', **{'eggs':'scrambled'}),
Packit 562c7a
                         ((), {'eggs':'scrambled', 'spam':'fried'}))
Packit 562c7a
Packit 562c7a
        # argument annotation tests
Packit 562c7a
        def f(x) -> list: pass
Packit 562c7a
        self.assertEqual(f.__annotations__, {'return': list})
Packit 562c7a
        def f(x: int): pass
Packit 562c7a
        self.assertEqual(f.__annotations__, {'x': int})
Packit 562c7a
        def f(*x: str): pass
Packit 562c7a
        self.assertEqual(f.__annotations__, {'x': str})
Packit 562c7a
        def f(**x: float): pass
Packit 562c7a
        self.assertEqual(f.__annotations__, {'x': float})
Packit 562c7a
        def f(x, y: 1+2): pass
Packit 562c7a
        self.assertEqual(f.__annotations__, {'y': 3})
Packit 562c7a
        def f(a, b: 1, c: 2, d): pass
Packit 562c7a
        self.assertEqual(f.__annotations__, {'b': 1, 'c': 2})
Packit 562c7a
        def f(a, b: 1, c: 2, d, e: 3 = 4, f=5, *g: 6): pass
Packit 562c7a
        self.assertEqual(f.__annotations__,
Packit 562c7a
                         {'b': 1, 'c': 2, 'e': 3, 'g': 6})
Packit 562c7a
        def f(a, b: 1, c: 2, d, e: 3 = 4, f=5, *g: 6, h: 7, i=8, j: 9 = 10,
Packit 562c7a
              **k: 11) -> 12: pass
Packit 562c7a
        self.assertEqual(f.__annotations__,
Packit 562c7a
                         {'b': 1, 'c': 2, 'e': 3, 'g': 6, 'h': 7, 'j': 9,
Packit 562c7a
                          'k': 11, 'return': 12})
Packit 562c7a
        # Check for issue #20625 -- annotations mangling
Packit 562c7a
        class Spam:
Packit 562c7a
            def f(self, *, __kw: 1):
Packit 562c7a
                pass
Packit 562c7a
        class Ham(Spam): pass
Packit 562c7a
        self.assertEqual(Spam.f.__annotations__, {'_Spam__kw': 1})
Packit 562c7a
        self.assertEqual(Ham.f.__annotations__, {'_Spam__kw': 1})
Packit 562c7a
        # Check for SF Bug #1697248 - mixing decorators and a return annotation
Packit 562c7a
        def null(x): return x
Packit 562c7a
        @null
Packit 562c7a
        def f(x) -> list: pass
Packit 562c7a
        self.assertEqual(f.__annotations__, {'return': list})
Packit 562c7a
Packit 562c7a
        # test MAKE_CLOSURE with a variety of oparg's
Packit 562c7a
        closure = 1
Packit 562c7a
        def f(): return closure
Packit 562c7a
        def f(x=1): return closure
Packit 562c7a
        def f(*, k=1): return closure
Packit 562c7a
        def f() -> int: return closure
Packit 562c7a
Packit 562c7a
        # Check ast errors in *args and *kwargs
Packit 562c7a
        check_syntax_error(self, "f(*g(1=2))")
Packit 562c7a
        check_syntax_error(self, "f(**g(1=2))")
Packit 562c7a
Packit 562c7a
        # Check trailing commas are permitted in funcdef argument list
Packit 562c7a
        def f(a,): pass
Packit 562c7a
        def f(*args,): pass
Packit 562c7a
        def f(**kwds,): pass
Packit 562c7a
        def f(a, *args,): pass
Packit 562c7a
        def f(a, **kwds,): pass
Packit 562c7a
        def f(*args, b,): pass
Packit 562c7a
        def f(*, b,): pass
Packit 562c7a
        def f(*args, **kwds,): pass
Packit 562c7a
        def f(a, *args, b,): pass
Packit 562c7a
        def f(a, *, b,): pass
Packit 562c7a
        def f(a, *args, **kwds,): pass
Packit 562c7a
        def f(*args, b, **kwds,): pass
Packit 562c7a
        def f(*, b, **kwds,): pass
Packit 562c7a
        def f(a, *args, b, **kwds,): pass
Packit 562c7a
        def f(a, *, b, **kwds,): pass
Packit 562c7a
Packit 562c7a
    def test_lambdef(self):
Packit 562c7a
        ### lambdef: 'lambda' [varargslist] ':' test
Packit 562c7a
        l1 = lambda : 0
Packit 562c7a
        self.assertEqual(l1(), 0)
Packit 562c7a
        l2 = lambda : a[d] # XXX just testing the expression
Packit 562c7a
        l3 = lambda : [2 < x for x in [-1, 3, 0]]
Packit 562c7a
        self.assertEqual(l3(), [0, 1, 0])
Packit 562c7a
        l4 = lambda x = lambda y = lambda z=1 : z : y() : x()
Packit 562c7a
        self.assertEqual(l4(), 1)
Packit 562c7a
        l5 = lambda x, y, z=2: x + y + z
Packit 562c7a
        self.assertEqual(l5(1, 2), 5)
Packit 562c7a
        self.assertEqual(l5(1, 2, 3), 6)
Packit 562c7a
        check_syntax_error(self, "lambda x: x = 2")
Packit 562c7a
        check_syntax_error(self, "lambda (None,): None")
Packit 562c7a
        l6 = lambda x, y, *, k=20: x+y+k
Packit 562c7a
        self.assertEqual(l6(1,2), 1+2+20)
Packit 562c7a
        self.assertEqual(l6(1,2,k=10), 1+2+10)
Packit 562c7a
Packit 562c7a
        # check that trailing commas are permitted
Packit 562c7a
        l10 = lambda a,: 0
Packit 562c7a
        l11 = lambda *args,: 0
Packit 562c7a
        l12 = lambda **kwds,: 0
Packit 562c7a
        l13 = lambda a, *args,: 0
Packit 562c7a
        l14 = lambda a, **kwds,: 0
Packit 562c7a
        l15 = lambda *args, b,: 0
Packit 562c7a
        l16 = lambda *, b,: 0
Packit 562c7a
        l17 = lambda *args, **kwds,: 0
Packit 562c7a
        l18 = lambda a, *args, b,: 0
Packit 562c7a
        l19 = lambda a, *, b,: 0
Packit 562c7a
        l20 = lambda a, *args, **kwds,: 0
Packit 562c7a
        l21 = lambda *args, b, **kwds,: 0
Packit 562c7a
        l22 = lambda *, b, **kwds,: 0
Packit 562c7a
        l23 = lambda a, *args, b, **kwds,: 0
Packit 562c7a
        l24 = lambda a, *, b, **kwds,: 0
Packit 562c7a
Packit 562c7a
Packit 562c7a
    ### stmt: simple_stmt | compound_stmt
Packit 562c7a
    # Tested below
Packit 562c7a
Packit 562c7a
    def test_simple_stmt(self):
Packit 562c7a
        ### simple_stmt: small_stmt (';' small_stmt)* [';']
Packit 562c7a
        x = 1; pass; del x
Packit 562c7a
        def foo():
Packit 562c7a
            # verify statements that end with semi-colons
Packit 562c7a
            x = 1; pass; del x;
Packit 562c7a
        foo()
Packit 562c7a
Packit 562c7a
    ### small_stmt: expr_stmt | pass_stmt | del_stmt | flow_stmt | import_stmt | global_stmt | access_stmt
Packit 562c7a
    # Tested below
Packit 562c7a
Packit 562c7a
    def test_expr_stmt(self):
Packit 562c7a
        # (exprlist '=')* exprlist
Packit 562c7a
        1
Packit 562c7a
        1, 2, 3
Packit 562c7a
        x = 1
Packit 562c7a
        x = 1, 2, 3
Packit 562c7a
        x = y = z = 1, 2, 3
Packit 562c7a
        x, y, z = 1, 2, 3
Packit 562c7a
        abc = a, b, c = x, y, z = xyz = 1, 2, (3, 4)
Packit 562c7a
Packit 562c7a
        check_syntax_error(self, "x + 1 = 1")
Packit 562c7a
        check_syntax_error(self, "a + 1 = b + 2")
Packit 562c7a
Packit 562c7a
    # Check the heuristic for print & exec covers significant cases
Packit 562c7a
    # As well as placing some limits on false positives
Packit 562c7a
    def test_former_statements_refer_to_builtins(self):
Packit 562c7a
        keywords = "print", "exec"
Packit 562c7a
        # Cases where we want the custom error
Packit 562c7a
        cases = [
Packit 562c7a
            "{} foo",
Packit 562c7a
            "{} {{1:foo}}",
Packit 562c7a
            "if 1: {} foo",
Packit 562c7a
            "if 1: {} {{1:foo}}",
Packit 562c7a
            "if 1:\n    {} foo",
Packit 562c7a
            "if 1:\n    {} {{1:foo}}",
Packit 562c7a
        ]
Packit 562c7a
        for keyword in keywords:
Packit 562c7a
            custom_msg = "call to '{}'".format(keyword)
Packit 562c7a
            for case in cases:
Packit 562c7a
                source = case.format(keyword)
Packit 562c7a
                with self.subTest(source=source):
Packit 562c7a
                    with self.assertRaisesRegex(SyntaxError, custom_msg):
Packit 562c7a
                        exec(source)
Packit 562c7a
                source = source.replace("foo", "(foo.)")
Packit 562c7a
                with self.subTest(source=source):
Packit 562c7a
                    with self.assertRaisesRegex(SyntaxError, "invalid syntax"):
Packit 562c7a
                        exec(source)
Packit 562c7a
Packit 562c7a
    def test_del_stmt(self):
Packit 562c7a
        # 'del' exprlist
Packit 562c7a
        abc = [1,2,3]
Packit 562c7a
        x, y, z = abc
Packit 562c7a
        xyz = x, y, z
Packit 562c7a
Packit 562c7a
        del abc
Packit 562c7a
        del x, y, (z, xyz)
Packit 562c7a
Packit 562c7a
    def test_pass_stmt(self):
Packit 562c7a
        # 'pass'
Packit 562c7a
        pass
Packit 562c7a
Packit 562c7a
    # flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
Packit 562c7a
    # Tested below
Packit 562c7a
Packit 562c7a
    def test_break_stmt(self):
Packit 562c7a
        # 'break'
Packit 562c7a
        while 1: break
Packit 562c7a
Packit 562c7a
    def test_continue_stmt(self):
Packit 562c7a
        # 'continue'
Packit 562c7a
        i = 1
Packit 562c7a
        while i: i = 0; continue
Packit 562c7a
Packit 562c7a
        msg = ""
Packit 562c7a
        while not msg:
Packit 562c7a
            msg = "ok"
Packit 562c7a
            try:
Packit 562c7a
                continue
Packit 562c7a
                msg = "continue failed to continue inside try"
Packit 562c7a
            except:
Packit 562c7a
                msg = "continue inside try called except block"
Packit 562c7a
        if msg != "ok":
Packit 562c7a
            self.fail(msg)
Packit 562c7a
Packit 562c7a
        msg = ""
Packit 562c7a
        while not msg:
Packit 562c7a
            msg = "finally block not called"
Packit 562c7a
            try:
Packit 562c7a
                continue
Packit 562c7a
            finally:
Packit 562c7a
                msg = "ok"
Packit 562c7a
        if msg != "ok":
Packit 562c7a
            self.fail(msg)
Packit 562c7a
Packit 562c7a
    def test_break_continue_loop(self):
Packit 562c7a
        # This test warrants an explanation. It is a test specifically for SF bugs
Packit 562c7a
        # #463359 and #462937. The bug is that a 'break' statement executed or
Packit 562c7a
        # exception raised inside a try/except inside a loop, *after* a continue
Packit 562c7a
        # statement has been executed in that loop, will cause the wrong number of
Packit 562c7a
        # arguments to be popped off the stack and the instruction pointer reset to
Packit 562c7a
        # a very small number (usually 0.) Because of this, the following test
Packit 562c7a
        # *must* written as a function, and the tracking vars *must* be function
Packit 562c7a
        # arguments with default values. Otherwise, the test will loop and loop.
Packit 562c7a
Packit 562c7a
        def test_inner(extra_burning_oil = 1, count=0):
Packit 562c7a
            big_hippo = 2
Packit 562c7a
            while big_hippo:
Packit 562c7a
                count += 1
Packit 562c7a
                try:
Packit 562c7a
                    if extra_burning_oil and big_hippo == 1:
Packit 562c7a
                        extra_burning_oil -= 1
Packit 562c7a
                        break
Packit 562c7a
                    big_hippo -= 1
Packit 562c7a
                    continue
Packit 562c7a
                except:
Packit 562c7a
                    raise
Packit 562c7a
            if count > 2 or big_hippo != 1:
Packit 562c7a
                self.fail("continue then break in try/except in loop broken!")
Packit 562c7a
        test_inner()
Packit 562c7a
Packit 562c7a
    def test_return(self):
Packit 562c7a
        # 'return' [testlist]
Packit 562c7a
        def g1(): return
Packit 562c7a
        def g2(): return 1
Packit 562c7a
        g1()
Packit 562c7a
        x = g2()
Packit 562c7a
        check_syntax_error(self, "class foo:return 1")
Packit 562c7a
Packit 562c7a
    def test_yield(self):
Packit 562c7a
        # Allowed as standalone statement
Packit 562c7a
        def g(): yield 1
Packit 562c7a
        def g(): yield from ()
Packit 562c7a
        # Allowed as RHS of assignment
Packit 562c7a
        def g(): x = yield 1
Packit 562c7a
        def g(): x = yield from ()
Packit 562c7a
        # Ordinary yield accepts implicit tuples
Packit 562c7a
        def g(): yield 1, 1
Packit 562c7a
        def g(): x = yield 1, 1
Packit 562c7a
        # 'yield from' does not
Packit 562c7a
        check_syntax_error(self, "def g(): yield from (), 1")
Packit 562c7a
        check_syntax_error(self, "def g(): x = yield from (), 1")
Packit 562c7a
        # Requires parentheses as subexpression
Packit 562c7a
        def g(): 1, (yield 1)
Packit 562c7a
        def g(): 1, (yield from ())
Packit 562c7a
        check_syntax_error(self, "def g(): 1, yield 1")
Packit 562c7a
        check_syntax_error(self, "def g(): 1, yield from ()")
Packit 562c7a
        # Requires parentheses as call argument
Packit 562c7a
        def g(): f((yield 1))
Packit 562c7a
        def g(): f((yield 1), 1)
Packit 562c7a
        def g(): f((yield from ()))
Packit 562c7a
        def g(): f((yield from ()), 1)
Packit 562c7a
        check_syntax_error(self, "def g(): f(yield 1)")
Packit 562c7a
        check_syntax_error(self, "def g(): f(yield 1, 1)")
Packit 562c7a
        check_syntax_error(self, "def g(): f(yield from ())")
Packit 562c7a
        check_syntax_error(self, "def g(): f(yield from (), 1)")
Packit 562c7a
        # Not allowed at top level
Packit 562c7a
        check_syntax_error(self, "yield")
Packit 562c7a
        check_syntax_error(self, "yield from")
Packit 562c7a
        # Not allowed at class scope
Packit 562c7a
        check_syntax_error(self, "class foo:yield 1")
Packit 562c7a
        check_syntax_error(self, "class foo:yield from ()")
Packit 562c7a
        # Check annotation refleak on SyntaxError
Packit 562c7a
        check_syntax_error(self, "def g(a:(yield)): pass")
Packit 562c7a
Packit 562c7a
    def test_raise(self):
Packit 562c7a
        # 'raise' test [',' test]
Packit 562c7a
        try: raise RuntimeError('just testing')
Packit 562c7a
        except RuntimeError: pass
Packit 562c7a
        try: raise KeyboardInterrupt
Packit 562c7a
        except KeyboardInterrupt: pass
Packit 562c7a
Packit 562c7a
    def test_import(self):
Packit 562c7a
        # 'import' dotted_as_names
Packit 562c7a
        import sys
Packit 562c7a
        import time, sys
Packit 562c7a
        # 'from' dotted_name 'import' ('*' | '(' import_as_names ')' | import_as_names)
Packit 562c7a
        from time import time
Packit 562c7a
        from time import (time)
Packit 562c7a
        # not testable inside a function, but already done at top of the module
Packit 562c7a
        # from sys import *
Packit 562c7a
        from sys import path, argv
Packit 562c7a
        from sys import (path, argv)
Packit 562c7a
        from sys import (path, argv,)
Packit 562c7a
Packit 562c7a
    def test_global(self):
Packit 562c7a
        # 'global' NAME (',' NAME)*
Packit 562c7a
        global a
Packit 562c7a
        global a, b
Packit 562c7a
        global one, two, three, four, five, six, seven, eight, nine, ten
Packit 562c7a
Packit 562c7a
    def test_nonlocal(self):
Packit 562c7a
        # 'nonlocal' NAME (',' NAME)*
Packit 562c7a
        x = 0
Packit 562c7a
        y = 0
Packit 562c7a
        def f():
Packit 562c7a
            nonlocal x
Packit 562c7a
            nonlocal x, y
Packit 562c7a
Packit 562c7a
    def test_assert(self):
Packit 562c7a
        # assertTruestmt: 'assert' test [',' test]
Packit 562c7a
        assert 1
Packit 562c7a
        assert 1, 1
Packit 562c7a
        assert lambda x:x
Packit 562c7a
        assert 1, lambda x:x+1
Packit 562c7a
Packit 562c7a
        try:
Packit 562c7a
            assert True
Packit 562c7a
        except AssertionError as e:
Packit 562c7a
            self.fail("'assert True' should not have raised an AssertionError")
Packit 562c7a
Packit 562c7a
        try:
Packit 562c7a
            assert True, 'this should always pass'
Packit 562c7a
        except AssertionError as e:
Packit 562c7a
            self.fail("'assert True, msg' should not have "
Packit 562c7a
                      "raised an AssertionError")
Packit 562c7a
Packit 562c7a
    # these tests fail if python is run with -O, so check __debug__
Packit 562c7a
    @unittest.skipUnless(__debug__, "Won't work if __debug__ is False")
Packit 562c7a
    def testAssert2(self):
Packit 562c7a
        try:
Packit 562c7a
            assert 0, "msg"
Packit 562c7a
        except AssertionError as e:
Packit 562c7a
            self.assertEqual(e.args[0], "msg")
Packit 562c7a
        else:
Packit 562c7a
            self.fail("AssertionError not raised by assert 0")
Packit 562c7a
Packit 562c7a
        try:
Packit 562c7a
            assert False
Packit 562c7a
        except AssertionError as e:
Packit 562c7a
            self.assertEqual(len(e.args), 0)
Packit 562c7a
        else:
Packit 562c7a
            self.fail("AssertionError not raised by 'assert False'")
Packit 562c7a
Packit 562c7a
Packit 562c7a
    ### compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | funcdef | classdef
Packit 562c7a
    # Tested below
Packit 562c7a
Packit 562c7a
    def test_if(self):
Packit 562c7a
        # 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite]
Packit 562c7a
        if 1: pass
Packit 562c7a
        if 1: pass
Packit 562c7a
        else: pass
Packit 562c7a
        if 0: pass
Packit 562c7a
        elif 0: pass
Packit 562c7a
        if 0: pass
Packit 562c7a
        elif 0: pass
Packit 562c7a
        elif 0: pass
Packit 562c7a
        elif 0: pass
Packit 562c7a
        else: pass
Packit 562c7a
Packit 562c7a
    def test_while(self):
Packit 562c7a
        # 'while' test ':' suite ['else' ':' suite]
Packit 562c7a
        while 0: pass
Packit 562c7a
        while 0: pass
Packit 562c7a
        else: pass
Packit 562c7a
Packit 562c7a
        # Issue1920: "while 0" is optimized away,
Packit 562c7a
        # ensure that the "else" clause is still present.
Packit 562c7a
        x = 0
Packit 562c7a
        while 0:
Packit 562c7a
            x = 1
Packit 562c7a
        else:
Packit 562c7a
            x = 2
Packit 562c7a
        self.assertEqual(x, 2)
Packit 562c7a
Packit 562c7a
    def test_for(self):
Packit 562c7a
        # 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite]
Packit 562c7a
        for i in 1, 2, 3: pass
Packit 562c7a
        for i, j, k in (): pass
Packit 562c7a
        else: pass
Packit 562c7a
        class Squares:
Packit 562c7a
            def __init__(self, max):
Packit 562c7a
                self.max = max
Packit 562c7a
                self.sofar = []
Packit 562c7a
            def __len__(self): return len(self.sofar)
Packit 562c7a
            def __getitem__(self, i):
Packit 562c7a
                if not 0 <= i < self.max: raise IndexError
Packit 562c7a
                n = len(self.sofar)
Packit 562c7a
                while n <= i:
Packit 562c7a
                    self.sofar.append(n*n)
Packit 562c7a
                    n = n+1
Packit 562c7a
                return self.sofar[i]
Packit 562c7a
        n = 0
Packit 562c7a
        for x in Squares(10): n = n+x
Packit 562c7a
        if n != 285:
Packit 562c7a
            self.fail('for over growing sequence')
Packit 562c7a
Packit 562c7a
        result = []
Packit 562c7a
        for x, in [(1,), (2,), (3,)]:
Packit 562c7a
            result.append(x)
Packit 562c7a
        self.assertEqual(result, [1, 2, 3])
Packit 562c7a
Packit 562c7a
    def test_try(self):
Packit 562c7a
        ### try_stmt: 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
Packit 562c7a
        ###         | 'try' ':' suite 'finally' ':' suite
Packit 562c7a
        ### except_clause: 'except' [expr ['as' expr]]
Packit 562c7a
        try:
Packit 562c7a
            1/0
Packit 562c7a
        except ZeroDivisionError:
Packit 562c7a
            pass
Packit 562c7a
        else:
Packit 562c7a
            pass
Packit 562c7a
        try: 1/0
Packit 562c7a
        except EOFError: pass
Packit 562c7a
        except TypeError as msg: pass
Packit 562c7a
        except RuntimeError as msg: pass
Packit 562c7a
        except: pass
Packit 562c7a
        else: pass
Packit 562c7a
        try: 1/0
Packit 562c7a
        except (EOFError, TypeError, ZeroDivisionError): pass
Packit 562c7a
        try: 1/0
Packit 562c7a
        except (EOFError, TypeError, ZeroDivisionError) as msg: pass
Packit 562c7a
        try: pass
Packit 562c7a
        finally: pass
Packit 562c7a
Packit 562c7a
    def test_suite(self):
Packit 562c7a
        # simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT
Packit 562c7a
        if 1: pass
Packit 562c7a
        if 1:
Packit 562c7a
            pass
Packit 562c7a
        if 1:
Packit 562c7a
            #
Packit 562c7a
            #
Packit 562c7a
            #
Packit 562c7a
            pass
Packit 562c7a
            pass
Packit 562c7a
            #
Packit 562c7a
            pass
Packit 562c7a
            #
Packit 562c7a
Packit 562c7a
    def test_test(self):
Packit 562c7a
        ### and_test ('or' and_test)*
Packit 562c7a
        ### and_test: not_test ('and' not_test)*
Packit 562c7a
        ### not_test: 'not' not_test | comparison
Packit 562c7a
        if not 1: pass
Packit 562c7a
        if 1 and 1: pass
Packit 562c7a
        if 1 or 1: pass
Packit 562c7a
        if not not not 1: pass
Packit 562c7a
        if not 1 and 1 and 1: pass
Packit 562c7a
        if 1 and 1 or 1 and 1 and 1 or not 1 and 1: pass
Packit 562c7a
Packit 562c7a
    def test_comparison(self):
Packit 562c7a
        ### comparison: expr (comp_op expr)*
Packit 562c7a
        ### comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'|'is' 'not'
Packit 562c7a
        if 1: pass
Packit 562c7a
        x = (1 == 1)
Packit 562c7a
        if 1 == 1: pass
Packit 562c7a
        if 1 != 1: pass
Packit 562c7a
        if 1 < 1: pass
Packit 562c7a
        if 1 > 1: pass
Packit 562c7a
        if 1 <= 1: pass
Packit 562c7a
        if 1 >= 1: pass
Packit 562c7a
        if 1 is 1: pass
Packit 562c7a
        if 1 is not 1: pass
Packit 562c7a
        if 1 in (): pass
Packit 562c7a
        if 1 not in (): pass
Packit 562c7a
        if 1 < 1 > 1 == 1 >= 1 <= 1 != 1 in 1 not in 1 is 1 is not 1: pass
Packit 562c7a
Packit 562c7a
    def test_binary_mask_ops(self):
Packit 562c7a
        x = 1 & 1
Packit 562c7a
        x = 1 ^ 1
Packit 562c7a
        x = 1 | 1
Packit 562c7a
Packit 562c7a
    def test_shift_ops(self):
Packit 562c7a
        x = 1 << 1
Packit 562c7a
        x = 1 >> 1
Packit 562c7a
        x = 1 << 1 >> 1
Packit 562c7a
Packit 562c7a
    def test_additive_ops(self):
Packit 562c7a
        x = 1
Packit 562c7a
        x = 1 + 1
Packit 562c7a
        x = 1 - 1 - 1
Packit 562c7a
        x = 1 - 1 + 1 - 1 + 1
Packit 562c7a
Packit 562c7a
    def test_multiplicative_ops(self):
Packit 562c7a
        x = 1 * 1
Packit 562c7a
        x = 1 / 1
Packit 562c7a
        x = 1 % 1
Packit 562c7a
        x = 1 / 1 * 1 % 1
Packit 562c7a
Packit 562c7a
    def test_unary_ops(self):
Packit 562c7a
        x = +1
Packit 562c7a
        x = -1
Packit 562c7a
        x = ~1
Packit 562c7a
        x = ~1 ^ 1 & 1 | 1 & 1 ^ -1
Packit 562c7a
        x = -1*1/1 + 1*1 - ---1*1
Packit 562c7a
Packit 562c7a
    def test_selectors(self):
Packit 562c7a
        ### trailer: '(' [testlist] ')' | '[' subscript ']' | '.' NAME
Packit 562c7a
        ### subscript: expr | [expr] ':' [expr]
Packit 562c7a
Packit 562c7a
        import sys, time
Packit 562c7a
        c = sys.path[0]
Packit 562c7a
        x = time.time()
Packit 562c7a
        x = sys.modules['time'].time()
Packit 562c7a
        a = '01234'
Packit 562c7a
        c = a[0]
Packit 562c7a
        c = a[-1]
Packit 562c7a
        s = a[0:5]
Packit 562c7a
        s = a[:5]
Packit 562c7a
        s = a[0:]
Packit 562c7a
        s = a[:]
Packit 562c7a
        s = a[-5:]
Packit 562c7a
        s = a[:-1]
Packit 562c7a
        s = a[-4:-3]
Packit 562c7a
        # A rough test of SF bug 1333982.  http://python.org/sf/1333982
Packit 562c7a
        # The testing here is fairly incomplete.
Packit 562c7a
        # Test cases should include: commas with 1 and 2 colons
Packit 562c7a
        d = {}
Packit 562c7a
        d[1] = 1
Packit 562c7a
        d[1,] = 2
Packit 562c7a
        d[1,2] = 3
Packit 562c7a
        d[1,2,3] = 4
Packit 562c7a
        L = list(d)
Packit 562c7a
        L.sort(key=lambda x: x if isinstance(x, tuple) else ())
Packit 562c7a
        self.assertEqual(str(L), '[1, (1,), (1, 2), (1, 2, 3)]')
Packit 562c7a
Packit 562c7a
    def test_atoms(self):
Packit 562c7a
        ### atom: '(' [testlist] ')' | '[' [testlist] ']' | '{' [dictsetmaker] '}' | NAME | NUMBER | STRING
Packit 562c7a
        ### dictsetmaker: (test ':' test (',' test ':' test)* [',']) | (test (',' test)* [','])
Packit 562c7a
Packit 562c7a
        x = (1)
Packit 562c7a
        x = (1 or 2 or 3)
Packit 562c7a
        x = (1 or 2 or 3, 2, 3)
Packit 562c7a
Packit 562c7a
        x = []
Packit 562c7a
        x = [1]
Packit 562c7a
        x = [1 or 2 or 3]
Packit 562c7a
        x = [1 or 2 or 3, 2, 3]
Packit 562c7a
        x = []
Packit 562c7a
Packit 562c7a
        x = {}
Packit 562c7a
        x = {'one': 1}
Packit 562c7a
        x = {'one': 1,}
Packit 562c7a
        x = {'one' or 'two': 1 or 2}
Packit 562c7a
        x = {'one': 1, 'two': 2}
Packit 562c7a
        x = {'one': 1, 'two': 2,}
Packit 562c7a
        x = {'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5, 'six': 6}
Packit 562c7a
Packit 562c7a
        x = {'one'}
Packit 562c7a
        x = {'one', 1,}
Packit 562c7a
        x = {'one', 'two', 'three'}
Packit 562c7a
        x = {2, 3, 4,}
Packit 562c7a
Packit 562c7a
        x = x
Packit 562c7a
        x = 'x'
Packit 562c7a
        x = 123
Packit 562c7a
Packit 562c7a
    ### exprlist: expr (',' expr)* [',']
Packit 562c7a
    ### testlist: test (',' test)* [',']
Packit 562c7a
    # These have been exercised enough above
Packit 562c7a
Packit 562c7a
    def test_classdef(self):
Packit 562c7a
        # 'class' NAME ['(' [testlist] ')'] ':' suite
Packit 562c7a
        class B: pass
Packit 562c7a
        class B2(): pass
Packit 562c7a
        class C1(B): pass
Packit 562c7a
        class C2(B): pass
Packit 562c7a
        class D(C1, C2, B): pass
Packit 562c7a
        class C:
Packit 562c7a
            def meth1(self): pass
Packit 562c7a
            def meth2(self, arg): pass
Packit 562c7a
            def meth3(self, a1, a2): pass
Packit 562c7a
Packit 562c7a
        # decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE
Packit 562c7a
        # decorators: decorator+
Packit 562c7a
        # decorated: decorators (classdef | funcdef)
Packit 562c7a
        def class_decorator(x): return x
Packit 562c7a
        @class_decorator
Packit 562c7a
        class G: pass
Packit 562c7a
Packit 562c7a
    def test_dictcomps(self):
Packit 562c7a
        # dictorsetmaker: ( (test ':' test (comp_for |
Packit 562c7a
        #                                   (',' test ':' test)* [','])) |
Packit 562c7a
        #                   (test (comp_for | (',' test)* [','])) )
Packit 562c7a
        nums = [1, 2, 3]
Packit 562c7a
        self.assertEqual({i:i+1 for i in nums}, {1: 2, 2: 3, 3: 4})
Packit 562c7a
Packit 562c7a
    def test_listcomps(self):
Packit 562c7a
        # list comprehension tests
Packit 562c7a
        nums = [1, 2, 3, 4, 5]
Packit 562c7a
        strs = ["Apple", "Banana", "Coconut"]
Packit 562c7a
        spcs = ["  Apple", " Banana ", "Coco  nut  "]
Packit 562c7a
Packit 562c7a
        self.assertEqual([s.strip() for s in spcs], ['Apple', 'Banana', 'Coco  nut'])
Packit 562c7a
        self.assertEqual([3 * x for x in nums], [3, 6, 9, 12, 15])
Packit 562c7a
        self.assertEqual([x for x in nums if x > 2], [3, 4, 5])
Packit 562c7a
        self.assertEqual([(i, s) for i in nums for s in strs],
Packit 562c7a
                         [(1, 'Apple'), (1, 'Banana'), (1, 'Coconut'),
Packit 562c7a
                          (2, 'Apple'), (2, 'Banana'), (2, 'Coconut'),
Packit 562c7a
                          (3, 'Apple'), (3, 'Banana'), (3, 'Coconut'),
Packit 562c7a
                          (4, 'Apple'), (4, 'Banana'), (4, 'Coconut'),
Packit 562c7a
                          (5, 'Apple'), (5, 'Banana'), (5, 'Coconut')])
Packit 562c7a
        self.assertEqual([(i, s) for i in nums for s in [f for f in strs if "n" in f]],
Packit 562c7a
                         [(1, 'Banana'), (1, 'Coconut'), (2, 'Banana'), (2, 'Coconut'),
Packit 562c7a
                          (3, 'Banana'), (3, 'Coconut'), (4, 'Banana'), (4, 'Coconut'),
Packit 562c7a
                          (5, 'Banana'), (5, 'Coconut')])
Packit 562c7a
        self.assertEqual([(lambda a:[a**i for i in range(a+1)])(j) for j in range(5)],
Packit 562c7a
                         [[1], [1, 1], [1, 2, 4], [1, 3, 9, 27], [1, 4, 16, 64, 256]])
Packit 562c7a
Packit 562c7a
        def test_in_func(l):
Packit 562c7a
            return [0 < x < 3 for x in l if x > 2]
Packit 562c7a
Packit 562c7a
        self.assertEqual(test_in_func(nums), [False, False, False])
Packit 562c7a
Packit 562c7a
        def test_nested_front():
Packit 562c7a
            self.assertEqual([[y for y in [x, x + 1]] for x in [1,3,5]],
Packit 562c7a
                             [[1, 2], [3, 4], [5, 6]])
Packit 562c7a
Packit 562c7a
        test_nested_front()
Packit 562c7a
Packit 562c7a
        check_syntax_error(self, "[i, s for i in nums for s in strs]")
Packit 562c7a
        check_syntax_error(self, "[x if y]")
Packit 562c7a
Packit 562c7a
        suppliers = [
Packit 562c7a
          (1, "Boeing"),
Packit 562c7a
          (2, "Ford"),
Packit 562c7a
          (3, "Macdonalds")
Packit 562c7a
        ]
Packit 562c7a
Packit 562c7a
        parts = [
Packit 562c7a
          (10, "Airliner"),
Packit 562c7a
          (20, "Engine"),
Packit 562c7a
          (30, "Cheeseburger")
Packit 562c7a
        ]
Packit 562c7a
Packit 562c7a
        suppart = [
Packit 562c7a
          (1, 10), (1, 20), (2, 20), (3, 30)
Packit 562c7a
        ]
Packit 562c7a
Packit 562c7a
        x = [
Packit 562c7a
          (sname, pname)
Packit 562c7a
            for (sno, sname) in suppliers
Packit 562c7a
              for (pno, pname) in parts
Packit 562c7a
                for (sp_sno, sp_pno) in suppart
Packit 562c7a
                  if sno == sp_sno and pno == sp_pno
Packit 562c7a
        ]
Packit 562c7a
Packit 562c7a
        self.assertEqual(x, [('Boeing', 'Airliner'), ('Boeing', 'Engine'), ('Ford', 'Engine'),
Packit 562c7a
                             ('Macdonalds', 'Cheeseburger')])
Packit 562c7a
Packit 562c7a
    def test_genexps(self):
Packit 562c7a
        # generator expression tests
Packit 562c7a
        g = ([x for x in range(10)] for x in range(1))
Packit 562c7a
        self.assertEqual(next(g), [x for x in range(10)])
Packit 562c7a
        try:
Packit 562c7a
            next(g)
Packit 562c7a
            self.fail('should produce StopIteration exception')
Packit 562c7a
        except StopIteration:
Packit 562c7a
            pass
Packit 562c7a
Packit 562c7a
        a = 1
Packit 562c7a
        try:
Packit 562c7a
            g = (a for d in a)
Packit 562c7a
            next(g)
Packit 562c7a
            self.fail('should produce TypeError')
Packit 562c7a
        except TypeError:
Packit 562c7a
            pass
Packit 562c7a
Packit 562c7a
        self.assertEqual(list((x, y) for x in 'abcd' for y in 'abcd'), [(x, y) for x in 'abcd' for y in 'abcd'])
Packit 562c7a
        self.assertEqual(list((x, y) for x in 'ab' for y in 'xy'), [(x, y) for x in 'ab' for y in 'xy'])
Packit 562c7a
Packit 562c7a
        a = [x for x in range(10)]
Packit 562c7a
        b = (x for x in (y for y in a))
Packit 562c7a
        self.assertEqual(sum(b), sum([x for x in range(10)]))
Packit 562c7a
Packit 562c7a
        self.assertEqual(sum(x**2 for x in range(10)), sum([x**2 for x in range(10)]))
Packit 562c7a
        self.assertEqual(sum(x*x for x in range(10) if x%2), sum([x*x for x in range(10) if x%2]))
Packit 562c7a
        self.assertEqual(sum(x for x in (y for y in range(10))), sum([x for x in range(10)]))
Packit 562c7a
        self.assertEqual(sum(x for x in (y for y in (z for z in range(10)))), sum([x for x in range(10)]))
Packit 562c7a
        self.assertEqual(sum(x for x in [y for y in (z for z in range(10))]), sum([x for x in range(10)]))
Packit 562c7a
        self.assertEqual(sum(x for x in (y for y in (z for z in range(10) if True)) if True), sum([x for x in range(10)]))
Packit 562c7a
        self.assertEqual(sum(x for x in (y for y in (z for z in range(10) if True) if False) if True), 0)
Packit 562c7a
        check_syntax_error(self, "foo(x for x in range(10), 100)")
Packit 562c7a
        check_syntax_error(self, "foo(100, x for x in range(10))")
Packit 562c7a
Packit 562c7a
    def test_comprehension_specials(self):
Packit 562c7a
        # test for outmost iterable precomputation
Packit 562c7a
        x = 10; g = (i for i in range(x)); x = 5
Packit 562c7a
        self.assertEqual(len(list(g)), 10)
Packit 562c7a
Packit 562c7a
        # This should hold, since we're only precomputing outmost iterable.
Packit 562c7a
        x = 10; t = False; g = ((i,j) for i in range(x) if t for j in range(x))
Packit 562c7a
        x = 5; t = True;
Packit 562c7a
        self.assertEqual([(i,j) for i in range(10) for j in range(5)], list(g))
Packit 562c7a
Packit 562c7a
        # Grammar allows multiple adjacent 'if's in listcomps and genexps,
Packit 562c7a
        # even though it's silly. Make sure it works (ifelse broke this.)
Packit 562c7a
        self.assertEqual([ x for x in range(10) if x % 2 if x % 3 ], [1, 5, 7])
Packit 562c7a
        self.assertEqual(list(x for x in range(10) if x % 2 if x % 3), [1, 5, 7])
Packit 562c7a
Packit 562c7a
        # verify unpacking single element tuples in listcomp/genexp.
Packit 562c7a
        self.assertEqual([x for x, in [(4,), (5,), (6,)]], [4, 5, 6])
Packit 562c7a
        self.assertEqual(list(x for x, in [(7,), (8,), (9,)]), [7, 8, 9])
Packit 562c7a
Packit 562c7a
    def test_with_statement(self):
Packit 562c7a
        class manager(object):
Packit 562c7a
            def __enter__(self):
Packit 562c7a
                return (1, 2)
Packit 562c7a
            def __exit__(self, *args):
Packit 562c7a
                pass
Packit 562c7a
Packit 562c7a
        with manager():
Packit 562c7a
            pass
Packit 562c7a
        with manager() as x:
Packit 562c7a
            pass
Packit 562c7a
        with manager() as (x, y):
Packit 562c7a
            pass
Packit 562c7a
        with manager(), manager():
Packit 562c7a
            pass
Packit 562c7a
        with manager() as x, manager() as y:
Packit 562c7a
            pass
Packit 562c7a
        with manager() as x, manager():
Packit 562c7a
            pass
Packit 562c7a
Packit 562c7a
    def test_if_else_expr(self):
Packit 562c7a
        # Test ifelse expressions in various cases
Packit 562c7a
        def _checkeval(msg, ret):
Packit 562c7a
            "helper to check that evaluation of expressions is done correctly"
Packit 562c7a
            print(x)
Packit 562c7a
            return ret
Packit 562c7a
Packit 562c7a
        # the next line is not allowed anymore
Packit 562c7a
        #self.assertEqual([ x() for x in lambda: True, lambda: False if x() ], [True])
Packit 562c7a
        self.assertEqual([ x() for x in (lambda: True, lambda: False) if x() ], [True])
Packit 562c7a
        self.assertEqual([ x(False) for x in (lambda x: False if x else True, lambda x: True if x else False) if x(False) ], [True])
Packit 562c7a
        self.assertEqual((5 if 1 else _checkeval("check 1", 0)), 5)
Packit 562c7a
        self.assertEqual((_checkeval("check 2", 0) if 0 else 5), 5)
Packit 562c7a
        self.assertEqual((5 and 6 if 0 else 1), 1)
Packit 562c7a
        self.assertEqual(((5 and 6) if 0 else 1), 1)
Packit 562c7a
        self.assertEqual((5 and (6 if 1 else 1)), 6)
Packit 562c7a
        self.assertEqual((0 or _checkeval("check 3", 2) if 0 else 3), 3)
Packit 562c7a
        self.assertEqual((1 or _checkeval("check 4", 2) if 1 else _checkeval("check 5", 3)), 1)
Packit 562c7a
        self.assertEqual((0 or 5 if 1 else _checkeval("check 6", 3)), 5)
Packit 562c7a
        self.assertEqual((not 5 if 1 else 1), False)
Packit 562c7a
        self.assertEqual((not 5 if 0 else 1), 1)
Packit 562c7a
        self.assertEqual((6 + 1 if 1 else 2), 7)
Packit 562c7a
        self.assertEqual((6 - 1 if 1 else 2), 5)
Packit 562c7a
        self.assertEqual((6 * 2 if 1 else 4), 12)
Packit 562c7a
        self.assertEqual((6 / 2 if 1 else 3), 3)
Packit 562c7a
        self.assertEqual((6 < 4 if 0 else 2), 2)
Packit 562c7a
Packit 562c7a
    def test_paren_evaluation(self):
Packit 562c7a
        self.assertEqual(16 // (4 // 2), 8)
Packit 562c7a
        self.assertEqual((16 // 4) // 2, 2)
Packit 562c7a
        self.assertEqual(16 // 4 // 2, 2)
Packit 562c7a
        self.assertTrue(False is (2 is 3))
Packit 562c7a
        self.assertFalse((False is 2) is 3)
Packit 562c7a
        self.assertFalse(False is 2 is 3)
Packit 562c7a
Packit 562c7a
    def test_matrix_mul(self):
Packit 562c7a
        # This is not intended to be a comprehensive test, rather just to be few
Packit 562c7a
        # samples of the @ operator in test_grammar.py.
Packit 562c7a
        class M:
Packit 562c7a
            def __matmul__(self, o):
Packit 562c7a
                return 4
Packit 562c7a
            def __imatmul__(self, o):
Packit 562c7a
                self.other = o
Packit 562c7a
                return self
Packit 562c7a
        m = M()
Packit 562c7a
        self.assertEqual(m @ m, 4)
Packit 562c7a
        m @= 42
Packit 562c7a
        self.assertEqual(m.other, 42)
Packit 562c7a
Packit 562c7a
    def test_async_await(self):
Packit 562c7a
        async = 1
Packit 562c7a
        await = 2
Packit 562c7a
        self.assertEqual(async, 1)
Packit 562c7a
Packit 562c7a
        def async():
Packit 562c7a
            nonlocal await
Packit 562c7a
            await = 10
Packit 562c7a
        async()
Packit 562c7a
        self.assertEqual(await, 10)
Packit 562c7a
Packit 562c7a
        #self.assertFalse(bool(async.__code__.co_flags & inspect.CO_COROUTINE))
Packit 562c7a
Packit 562c7a
        async def test():
Packit 562c7a
            def sum():
Packit 562c7a
                pass
Packit 562c7a
            if 1:
Packit 562c7a
                await someobj()
Packit 562c7a
Packit 562c7a
        self.assertEqual(test.__name__, 'test')
Packit 562c7a
        #self.assertTrue(bool(test.__code__.co_flags & inspect.CO_COROUTINE))
Packit 562c7a
Packit 562c7a
        def decorator(func):
Packit 562c7a
            setattr(func, '_marked', True)
Packit 562c7a
            return func
Packit 562c7a
Packit 562c7a
        @decorator
Packit 562c7a
        async def test2():
Packit 562c7a
            return 22
Packit 562c7a
        self.assertTrue(test2._marked)
Packit 562c7a
        self.assertEqual(test2.__name__, 'test2')
Packit 562c7a
        #self.assertTrue(bool(test2.__code__.co_flags & inspect.CO_COROUTINE))
Packit 562c7a
Packit 562c7a
    def test_async_for(self):
Packit 562c7a
        class Done(Exception): pass
Packit 562c7a
Packit 562c7a
        class AIter:
Packit 562c7a
            def __aiter__(self):
Packit 562c7a
                return self
Packit 562c7a
            async def __anext__(self):
Packit 562c7a
                raise StopAsyncIteration
Packit 562c7a
Packit 562c7a
        async def foo():
Packit 562c7a
            async for i in AIter():
Packit 562c7a
                pass
Packit 562c7a
            async for i, j in AIter():
Packit 562c7a
                pass
Packit 562c7a
            async for i in AIter():
Packit 562c7a
                pass
Packit 562c7a
            else:
Packit 562c7a
                pass
Packit 562c7a
            raise Done
Packit 562c7a
Packit 562c7a
        with self.assertRaises(Done):
Packit 562c7a
            foo().send(None)
Packit 562c7a
Packit 562c7a
    def test_async_with(self):
Packit 562c7a
        class Done(Exception): pass
Packit 562c7a
Packit 562c7a
        class manager:
Packit 562c7a
            async def __aenter__(self):
Packit 562c7a
                return (1, 2)
Packit 562c7a
            async def __aexit__(self, *exc):
Packit 562c7a
                return False
Packit 562c7a
Packit 562c7a
        async def foo():
Packit 562c7a
            async with manager():
Packit 562c7a
                pass
Packit 562c7a
            async with manager() as x:
Packit 562c7a
                pass
Packit 562c7a
            async with manager() as (x, y):
Packit 562c7a
                pass
Packit 562c7a
            async with manager(), manager():
Packit 562c7a
                pass
Packit 562c7a
            async with manager() as x, manager() as y:
Packit 562c7a
                pass
Packit 562c7a
            async with manager() as x, manager():
Packit 562c7a
                pass
Packit 562c7a
            raise Done
Packit 562c7a
Packit 562c7a
        with self.assertRaises(Done):
Packit 562c7a
            foo().send(None)
Packit 562c7a
Packit 562c7a
Packit 562c7a
### END OF COPY ###
Packit 562c7a
Packit 562c7a
GrammarTests.assertRaisesRegex = lambda self, exc, msg: self.assertRaises(exc)
Packit 562c7a
Packit 562c7a
if sys.version_info < (2, 7):
Packit 562c7a
    def assertRaises(self, exc_type, func=None, *args, **kwargs):
Packit 562c7a
        if func is not None:
Packit 562c7a
            return unittest.TestCase.assertRaises(self, exc_type, func, *args, **kwargs)
Packit 562c7a
        @contextlib.contextmanager
Packit 562c7a
        def assertRaisesCM():
Packit 562c7a
            class Result(object):
Packit 562c7a
                exception = exc_type("unexpected EOF")  # see usage above
Packit 562c7a
            try:
Packit 562c7a
                yield Result()
Packit 562c7a
            except exc_type:
Packit 562c7a
                self.assertTrue(True)
Packit 562c7a
            else:
Packit 562c7a
                self.assertTrue(False)
Packit 562c7a
        return assertRaisesCM()
Packit 562c7a
    GrammarTests.assertRaises = assertRaises
Packit 562c7a
    TokenTests.assertRaises = assertRaises
Packit 562c7a
Packit 562c7a
Packit 562c7a
if not hasattr(unittest.TestCase, 'subTest'):
Packit 562c7a
    @contextlib.contextmanager
Packit 562c7a
    def subTest(self, source, **kwargs):
Packit 562c7a
        try:
Packit 562c7a
            yield
Packit 562c7a
        except Exception:
Packit 562c7a
            print(source)
Packit 562c7a
            raise
Packit 562c7a
    GrammarTests.subTest = subTest
Packit 562c7a
Packit 562c7a
Packit 562c7a
if not hasattr(unittest.TestCase, 'assertIn'):
Packit 562c7a
    def assertIn(self, member, container, msg=None):
Packit 562c7a
        self.assertTrue(member in container, msg)
Packit 562c7a
    TokenTests.assertIn = assertIn
Packit 562c7a
Packit 562c7a
Packit 562c7a
# FIXME: disabling some tests for real Cython bugs here
Packit 562c7a
del GrammarTests.test_comprehension_specials  # iterable pre-calculation in generator expression
Packit 562c7a
del GrammarTests.test_funcdef  # annotation mangling
Packit 562c7a
Packit 562c7a
# this test is difficult to enable in Py2.6
Packit 562c7a
if sys.version_info < (2,7):
Packit 562c7a
    del GrammarTests.test_former_statements_refer_to_builtins
Packit 562c7a
Packit 562c7a
Packit 562c7a
if __name__ == '__main__':
Packit 562c7a
    unittest.main()