-- Python 3.10 semantic analysis test cases.

[case testCapturePattern]
x = 1
match x:
  case a:
    a
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x [__main__.x])
    IntExpr(1)
    builtins.int)
  MatchStmt:2(
    NameExpr(x [__main__.x])
    Pattern(
      AsPattern:3(
        NameExpr(a* [__main__.a])))
    Body(
      ExpressionStmt:4(
        NameExpr(a [__main__.a])))))

[case testCapturePatternOutliving]
x = 1
match x:
    case a:
      pass
a
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x [__main__.x])
    IntExpr(1)
    builtins.int)
  MatchStmt:2(
    NameExpr(x [__main__.x])
    Pattern(
      AsPattern:3(
        NameExpr(a* [__main__.a])))
    Body(
      PassStmt:4()))
  ExpressionStmt:5(
    NameExpr(a [__main__.a])))

[case testNestedCapturePatterns]
x = 1
match x:
    case ([a], {'k': b}):
        a
        b
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x [__main__.x])
    IntExpr(1)
    builtins.int)
  MatchStmt:2(
    NameExpr(x [__main__.x])
    Pattern(
      SequencePattern:3(
        SequencePattern:3(
          AsPattern:3(
            NameExpr(a* [__main__.a])))
        MappingPattern:3(
          Key(
            StrExpr(k))
          Value(
            AsPattern:3(
              NameExpr(b* [__main__.b]))))))
    Body(
      ExpressionStmt:4(
        NameExpr(a [__main__.a]))
      ExpressionStmt:5(
        NameExpr(b [__main__.b])))))

[case testMappingPatternRest]
x = 1
match x:
    case {**r}:
        r
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x [__main__.x])
    IntExpr(1)
    builtins.int)
  MatchStmt:2(
    NameExpr(x [__main__.x])
    Pattern(
      MappingPattern:3(
        Rest(
          NameExpr(r* [__main__.r]))))
    Body(
      ExpressionStmt:4(
        NameExpr(r [__main__.r])))))


[case testAsPattern]
x = 1
match x:
    case 1 as a:
        a
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x [__main__.x])
    IntExpr(1)
    builtins.int)
  MatchStmt:2(
    NameExpr(x [__main__.x])
    Pattern(
      AsPattern:3(
        ValuePattern:3(
          IntExpr(1))
        NameExpr(a* [__main__.a])))
    Body(
      ExpressionStmt:4(
        NameExpr(a [__main__.a])))))

[case testGuard]
x = 1
a = 1
match x:
    case 1 if a:
        pass
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x [__main__.x])
    IntExpr(1)
    builtins.int)
  AssignmentStmt:2(
    NameExpr(a [__main__.a])
    IntExpr(1)
    builtins.int)
  MatchStmt:3(
    NameExpr(x [__main__.x])
    Pattern(
      ValuePattern:4(
        IntExpr(1)))
    Guard(
      NameExpr(a [__main__.a]))
    Body(
      PassStmt:5())))

[case testCapturePatternInGuard]
x = 1
match x:
  case a if a:
    pass
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x [__main__.x])
    IntExpr(1)
    builtins.int)
  MatchStmt:2(
    NameExpr(x [__main__.x])
    Pattern(
      AsPattern:3(
        NameExpr(a* [__main__.a])))
    Guard(
      NameExpr(a [__main__.a]))
    Body(
      PassStmt:4())))

[case testAsPatternInGuard]
x = 1
match x:
    case 1 as a if a:
        pass
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x [__main__.x])
    IntExpr(1)
    builtins.int)
  MatchStmt:2(
    NameExpr(x [__main__.x])
    Pattern(
      AsPattern:3(
        ValuePattern:3(
          IntExpr(1))
        NameExpr(a* [__main__.a])))
    Guard(
      NameExpr(a [__main__.a]))
    Body(
      PassStmt:4())))

[case testValuePattern]
import _a

x = 1
match x:
    case _a.b:
        pass
[fixture _a.py]
b = 1
[out]
MypyFile:1(
  Import:1(_a)
  AssignmentStmt:3(
    NameExpr(x [__main__.x])
    IntExpr(1)
    builtins.int)
  MatchStmt:4(
    NameExpr(x [__main__.x])
    Pattern(
      ValuePattern:5(
        MemberExpr:5(
          NameExpr(_a)
          b [_a.b])))
    Body(
      PassStmt:6())))
