-- 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: invalid syntax
[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 testListComprehensionInPython2]
([ 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(
      default(
        Var(__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(
    LambdaExpr: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(
    LambdaExpr: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(
    LambdaExpr:1(
      Args(
        Var(x))
      Block:1(
        ReturnStmt:1(
          NameExpr(z))))))

[case testInvalidExprInTupleArgListInPython2_1]
def f(x, ()): pass
[out]
main:1: error: invalid syntax

[case testInvalidExprInTupleArgListInPython2_2]
def f(x, (y, x[1])): pass
[out]
main:1: error: invalid syntax

[case testListLiteralAsTupleArgInPython2]
def f(x, [x]): pass
[out]
main:1: error: invalid syntax

[case testTupleArgAfterStarArgInPython2]
def f(*a, (b, c)): pass
[out]
main:1: error: invalid syntax

[case testTupleArgAfterStarStarArgInPython2]
def f(*a, (b, c)): pass
[out]
main:1: error: invalid syntax

[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 "a" in function definition
main:3: error: Duplicate argument "x" in function definition

[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)))))

[case testSuperInPython2]
class A:
    def f(self):
        super(A, self).x
[out]
MypyFile:1(
  ClassDef:1(
    A
    FuncDef:2(
      f
      Args(
        Var(self))
      Block:2(
        ExpressionStmt:3(
          SuperExpr:3(
            x
            CallExpr:3(
              NameExpr(super)
              Args(
                NameExpr(A)
                NameExpr(self)))))))))

[case testTypeCommentsInPython2]
x = 1 # type: List[int]

def f(x, y=0):
    # type: (List[int], str) -> None
    pass
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x)
    IntExpr(1)
    List?[int?])
  FuncDef:3(
    f
    Args(
      Var(x)
      default(
        Var(y)
        IntExpr(0)))
    def (x: List?[int?], y: str? =) -> None?
    Block:3(
      PassStmt:5())))

[case testMultiLineTypeCommentInPython2]
def f(x,  # type: List[int]
      y,
      z=1, # type: str
      ):
    # type: (...) -> None
    pass
[out]
MypyFile:1(
  FuncDef:1(
    f
    Args(
      Var(x)
      Var(y)
      default(
        Var(z)
        IntExpr(1)))
    def (x: List?[int?], y: Any, z: str? =) -> None?
    Block:1(
      PassStmt:6())))

[case testIfStmtInPython2]
if x:
    y
elif z:
    a
else:
    b
[out]
MypyFile:1(
  IfStmt:1(
    If(
      NameExpr(x))
    Then(
      ExpressionStmt:2(
        NameExpr(y)))
    Else(
      IfStmt:3(
        If(
          NameExpr(z))
        Then(
          ExpressionStmt:4(
            NameExpr(a)))
        Else(
          ExpressionStmt:6(
            NameExpr(b)))))))

[case testWhileStmtInPython2]
while x:
    y
else:
    z
[out]
MypyFile:1(
  WhileStmt:1(
    NameExpr(x)
    Block:1(
      ExpressionStmt:2(
        NameExpr(y)))
    Else(
      ExpressionStmt:4(
        NameExpr(z)))))

[case testForStmtInPython2]
for x, y in z:
    a
else:
    b
[out]
MypyFile:1(
  ForStmt:1(
    TupleExpr:1(
      NameExpr(x)
      NameExpr(y))
    NameExpr(z)
    Block:1(
      ExpressionStmt:2(
        NameExpr(a)))
    Else(
      ExpressionStmt:4(
        NameExpr(b)))))

[case testWithStmtInPython2]
with x as y:
    z
[out]
MypyFile:1(
  WithStmt:1(
    Expr(
      NameExpr(x))
    Target(
      NameExpr(y))
    Block:1(
      ExpressionStmt:2(
        NameExpr(z)))))

[case testExpressionsInPython2]
x[y]
x + y
~z
x.y
([x, y])
{x, y}
{x: y}
x < y > z
[out]
MypyFile:1(
  ExpressionStmt:1(
    IndexExpr:1(
      NameExpr(x)
      NameExpr(y)))
  ExpressionStmt:2(
    OpExpr:2(
      +
      NameExpr(x)
      NameExpr(y)))
  ExpressionStmt:3(
    UnaryExpr:3(
      ~
      NameExpr(z)))
  ExpressionStmt:4(
    MemberExpr:4(
      NameExpr(x)
      y))
  ExpressionStmt:5(
    ListExpr:5(
      NameExpr(x)
      NameExpr(y)))
  ExpressionStmt:6(
    SetExpr:6(
      NameExpr(x)
      NameExpr(y)))
  ExpressionStmt:7(
    DictExpr:7(
      NameExpr(x)
      NameExpr(y)))
  ExpressionStmt:8(
    ComparisonExpr:8(
      <
      >
      NameExpr(x)
      NameExpr(y)
      NameExpr(z))))

[case testSlicingInPython2]
x[y:]
x[y:z]
x[::y]
[out]
MypyFile:1(
  ExpressionStmt:1(
    IndexExpr:1(
      NameExpr(x)
      SliceExpr:1(
        NameExpr(y)
        <empty>)))
  ExpressionStmt:2(
    IndexExpr:2(
      NameExpr(x)
      SliceExpr:2(
        NameExpr(y)
        NameExpr(z))))
  ExpressionStmt:3(
    IndexExpr:3(
      NameExpr(x)
      SliceExpr:3(
        <empty>
        <empty>
        NameExpr(y)))))

[case testStarArgsInPython2]
def f(*x): # type: (*int) -> None
    pass
f(x, *y)
[out]
MypyFile:1(
  FuncDef:1(
    f
    def (*x: int?) -> None?
    VarArg(
      Var(x))
    Block:1(
      PassStmt:2()))
  ExpressionStmt:3(
    CallExpr:3(
      NameExpr(f)
      Args(
        NameExpr(x)
        NameExpr(y))
      VarArg)))

[case testKwArgsInPython2]
def f(**x): # type: (**int) -> None
    pass
f(x, **y)
[out]
MypyFile:1(
  FuncDef:1(
    f
    def (**x: int?) -> None?
    DictVarArg(
      Var(x))
    Block:1(
      PassStmt:2()))
  ExpressionStmt:3(
    CallExpr:3(
      NameExpr(f)
      Args(
        NameExpr(x))
      DictVarArg(
        NameExpr(y)))))

[case testBoolOpInPython2]
x and y or z
[out]
MypyFile:1(
  ExpressionStmt:1(
    OpExpr:1(
      or
      OpExpr:1(
        and
        NameExpr(x)
        NameExpr(y))
      NameExpr(z))))

[case testImportsInPython2]
from x import y, z as zz
import m
import n as nn
from aa import *
[out]
MypyFile:1(
  ImportFrom:1(x, [y, z : zz])
  Import:2(m)
  Import:3(n : nn)
  ImportAll:4(aa))

[case testTryFinallyInPython2]
try:
    x
finally:
    y
[out]
MypyFile:1(
  TryStmt:1(
    Block:1(
      ExpressionStmt:2(
        NameExpr(x)))
    Finally(
      ExpressionStmt:4(
        NameExpr(y)))))

[case testRaiseInPython2]
raise
raise x
[out]
MypyFile:1(
  RaiseStmt:1()
  RaiseStmt:2(
    NameExpr(x)))

[case testAssignmentInPython2]
x = y
x, (y, z) = aa
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x)
    NameExpr(y))
  AssignmentStmt:2(
    TupleExpr:2(
      NameExpr(x)
      TupleExpr:2(
        NameExpr(y)
        NameExpr(z)))
    NameExpr(aa)))

[case testAugmentedAssignmentInPython2]
x += y
x *= 2
[out]
MypyFile:1(
  OperatorAssignmentStmt:1(
    +
    NameExpr(x)
    NameExpr(y))
  OperatorAssignmentStmt:2(
    *
    NameExpr(x)
    IntExpr(2)))

[case testDelStatementInPython2]
del x
del x.y, x[y]
[out]
MypyFile:1(
  DelStmt:1(
    NameExpr(x))
  DelStmt:2(
    TupleExpr:2(
      MemberExpr:2(
        NameExpr(x)
        y)
      IndexExpr:2(
        NameExpr(x)
        NameExpr(y)))))

[case testClassDecoratorInPython2]
@dec()
class C:
    pass
[out]
MypyFile:1(
  ClassDef:2(
    C
    Decorators(
      CallExpr:1(
        NameExpr(dec)
        Args()))
    PassStmt:3()))

[case testFunctionDecaratorInPython2]
@dec()
def f():
    pass
[out]
MypyFile:1(
  Decorator:1(
    Var(f)
    CallExpr:1(
      NameExpr(dec)
      Args())
    FuncDef:2(
      f
      Block:2(
        PassStmt:3()))))

[case testOverloadedFunctionInPython2]
@overload
def g():
    pass
@overload
def g():
    pass
def g():
    pass
[out]
MypyFile:1(
  OverloadedFuncDef:1(
    Decorator:1(
      Var(g)
      NameExpr(overload)
      FuncDef:2(
        g
        Block:2(
          PassStmt:3())))
    Decorator:4(
      Var(g)
      NameExpr(overload)
      FuncDef:5(
        g
        Block:5(
          PassStmt:6())))
    FuncDef:7(
      g
      Block:7(
        PassStmt:8()))))
