-- Test cases for parser -- Python 2 syntax.
--
-- See parse.test for a description of this file format.

[case testEmptyFile]
[out]
MypyFile:1()

[case testStringLiterals]
'bar'
u'foo'
ur'foo'
u'''bar'''
b'foo'
[out]
MypyFile:1(
  ExpressionStmt:1(
    StrExpr(bar))
  ExpressionStmt:2(
    UnicodeExpr(foo))
  ExpressionStmt:3(
    UnicodeExpr(foo))
  ExpressionStmt:4(
    UnicodeExpr(bar))
  ExpressionStmt:5(
    StrExpr(foo)))

[case testSimplePrint]
print 1
print 2, 3
print (4, 5)
[out]
MypyFile:1(
  PrintStmt:1(
    IntExpr(1)
    Newline)
  PrintStmt:2(
    IntExpr(2)
    IntExpr(3)
    Newline)
  PrintStmt:3(
    TupleExpr:3(
      IntExpr(4)
      IntExpr(5))
    Newline))

[case testPrintWithNoArgs]
print
[out]
MypyFile:1(
  PrintStmt:1(
    Newline))

[case testPrintWithTarget]
print >>foo
[out]
MypyFile:1(
  PrintStmt:1(
    Target(
      NameExpr(foo))
    Newline))

[case testPrintWithTargetAndArgs]
print >>foo, x
[out]
MypyFile:1(
  PrintStmt:1(
    NameExpr(x)
    Target(
      NameExpr(foo))
    Newline))

[case testPrintWithTargetAndArgsAndTrailingComma]
print >>foo, x, y,
[out]
MypyFile:1(
  PrintStmt:1(
    NameExpr(x)
    NameExpr(y)
    Target(
      NameExpr(foo))))

[case testSimpleWithTrailingComma]
print 1,
print 2, 3,
print (4, 5),
[out]
MypyFile:1(
  PrintStmt:1(
    IntExpr(1))
  PrintStmt:2(
    IntExpr(2)
    IntExpr(3))
  PrintStmt:3(
    TupleExpr:3(
      IntExpr(4)
      IntExpr(5))))

[case testOctalIntLiteral]
00
01
0377
[out]
MypyFile:1(
  ExpressionStmt:1(
    IntExpr(0))
  ExpressionStmt:2(
    IntExpr(1))
  ExpressionStmt:3(
    IntExpr(255)))

[case testLongLiteral]
0L
123L
012L
0x123l
[out]
MypyFile:1(
  ExpressionStmt:1(
    IntExpr(0))
  ExpressionStmt:2(
    IntExpr(123))
  ExpressionStmt:3(
    IntExpr(10))
  ExpressionStmt:4(
    IntExpr(291)))

[case testTryExceptWithComma]
try:
    x
except Exception, e:
    y
[out]
MypyFile:1(
  TryStmt:1(
    Block:1(
      ExpressionStmt:2(
        NameExpr(x)))
    NameExpr(Exception)
    NameExpr(e)
    Block:3(
      ExpressionStmt:4(
        NameExpr(y)))))

[case testTryExceptWithNestedComma]
try:
    x
except (KeyError, IndexError):
    y
[out]
MypyFile:1(
  TryStmt:1(
    Block:1(
      ExpressionStmt:2(
        NameExpr(x)))
    TupleExpr:3(
      NameExpr(KeyError)
      NameExpr(IndexError))
    Block:3(
      ExpressionStmt:4(
        NameExpr(y)))))

[case testExecStatement]
exec a
[out]
MypyFile:1(
  ExecStmt:1(
    NameExpr(a)))

[case testExecStatementWithIn]
exec a in globals()
[out]
MypyFile:1(
  ExecStmt:1(
    NameExpr(a)
    CallExpr:1(
      NameExpr(globals)
      Args())))

[case testExecStatementWithInAnd2Expressions]
exec a in x, y
[out]
MypyFile:1(
  ExecStmt:1(
    NameExpr(a)
    NameExpr(x)
    NameExpr(y)))

[case testEllipsisInExpression_python2]
x = ... # E: Parse error before ...
[out]

[case testStrLiteralConcatenationWithMixedLiteralTypes]
u'foo' 'bar'
'bar' u'foo'
[out]
MypyFile:1(
  ExpressionStmt:1(
    UnicodeExpr(foobar))
  ExpressionStmt:2(
    UnicodeExpr(barfoo)))

[case testLegacyInequality]
1 <> 2
[out]
MypyFile:1(
  ExpressionStmt:1(
    ComparisonExpr:1(
      !=
      IntExpr(1)
      IntExpr(2))))

[case testLambdaInListComprehensionInPython2]
([ 0 for x in 1, 2 if 3 ])
[out]
MypyFile:1(
  ExpressionStmt:1(
    ListComprehension:1(
      GeneratorExpr:1(
        IntExpr(0)
        NameExpr(x)
        TupleExpr:1(
          IntExpr(1)
          IntExpr(2))
        IntExpr(3)))))

[case testTupleArgListInPython2]
def f(x, (y, z)): pass
[out]
MypyFile:1(
  FuncDef:1(
    f
    Args(
      Var(x)
      Var(__tuple_arg_2))
    Block:1(
      AssignmentStmt:1(
        TupleExpr:1(
          NameExpr(y)
          NameExpr(z))
        NameExpr(__tuple_arg_2))
      PassStmt:1())))

[case testTupleArgListWithTwoTupleArgsInPython2]
def f((x, y), (z, zz)): pass
[out]
MypyFile:1(
  FuncDef:1(
    f
    Args(
      Var(__tuple_arg_1)
      Var(__tuple_arg_2))
    Block:1(
      AssignmentStmt:1(
        TupleExpr:1(
          NameExpr(x)
          NameExpr(y))
        NameExpr(__tuple_arg_1))
      AssignmentStmt:1(
        TupleExpr:1(
          NameExpr(z)
          NameExpr(zz))
        NameExpr(__tuple_arg_2))
      PassStmt:1())))

[case testTupleArgListWithInitializerInPython2]
def f((y, z) = (1, 2)): pass
[out]
MypyFile:1(
  FuncDef:1(
    f
    Args(
      Var(__tuple_arg_1))
    Init(
      AssignmentStmt:1(
        NameExpr(__tuple_arg_1)
        TupleExpr:1(
          IntExpr(1)
          IntExpr(2))))
    Block:1(
      AssignmentStmt:1(
        TupleExpr:1(
          NameExpr(y)
          NameExpr(z))
        NameExpr(__tuple_arg_1))
      PassStmt:1())))

[case testLambdaTupleArgListInPython2]
lambda (x, y): z
[out]
MypyFile:1(
  ExpressionStmt:1(
    FuncExpr:1(
      Args(
        Var(__tuple_arg_1))
      Block:1(
        AssignmentStmt:1(
          TupleExpr:1(
            NameExpr(x)
            NameExpr(y))
          NameExpr(__tuple_arg_1))
        ReturnStmt:1(
          NameExpr(z))))))

[case testLambdaSingletonTupleArgListInPython2]
lambda (x,): z
[out]
MypyFile:1(
  ExpressionStmt:1(
    FuncExpr:1(
      Args(
        Var(__tuple_arg_1))
      Block:1(
        AssignmentStmt:1(
          TupleExpr:1(
            NameExpr(x))
          NameExpr(__tuple_arg_1))
        ReturnStmt:1(
          NameExpr(z))))))

[case testLambdaNoTupleArgListInPython2]
lambda (x): z
[out]
MypyFile:1(
  ExpressionStmt:1(
    FuncExpr:1(
      Args(
        Var(x))
      Block:1(
        ReturnStmt:1(
          NameExpr(z))))))

[case testInvalidExprInTupleArgListInPython2_1]
def f(x, ()): pass
[out]
main: error: Empty tuple not valid as an argument

[case testInvalidExprInTupleArgListInPython2_2]
def f(x, (y, x[1])): pass
[out]
main:1: error: Invalid item in tuple argument

[case testListLiteralAsTupleArgInPython2]
def f(x, [x]): pass
[out]
main:1: error: Parse error before [
main:1: error: Parse error before end of line

[case testTupleArgAfterStarArgInPython2]
def f(*a, (b, c)): pass
[out]
main:1: error: Invalid argument list

[case testTupleArgAfterStarStarArgInPython2]
def f(*a, (b, c)): pass
[out]
main:1: error: Invalid argument list

[case testParenthesizedArgumentInPython2]
def f(x, (y)): pass
[out]
MypyFile:1(
  FuncDef:1(
    f
    Args(
      Var(x)
      Var(y))
    Block:1(
      PassStmt:1())))

[case testDuplicateNameInTupleArgList_python2]
def f(a, (a, b)):
    pass
def g((x, (x, y))):
    pass
[out]
main:1: error: Duplicate argument name "a"
main:3: error: Duplicate argument name "x"

[case testBackquotesInPython2]
`1 + 2`
[out]
MypyFile:1(
  ExpressionStmt:1(
    BackquoteExpr:1(
      OpExpr:1(
        +
        IntExpr(1)
        IntExpr(2)))))

[case testBackquoteSpecialCasesInPython2]
`1, 2`
[out]
MypyFile:1(
  ExpressionStmt:1(
    BackquoteExpr:1(
      TupleExpr:1(
        IntExpr(1)
        IntExpr(2)))))
