-- Semantic analysis of named tuples

[case testSimpleNamedtuple]
from collections import namedtuple
N = namedtuple('N', ['a'])
def f() -> N: pass
[out]
MypyFile:1(
  ImportFrom:1(collections, [namedtuple])
  AssignmentStmt:2(
    NameExpr(N* [__main__.N])
    NamedTupleExpr:2(N, Tuple[Any]))
  FuncDef:3(
    f
    def () -> Tuple[Any, fallback=__main__.N]
    Block:3(
      PassStmt:3())))

[case testTwoItemNamedtuple]
from collections import namedtuple
N = namedtuple('N', ['a', 'xyz'])
def f() -> N: pass
[out]
MypyFile:1(
  ImportFrom:1(collections, [namedtuple])
  AssignmentStmt:2(
    NameExpr(N* [__main__.N])
    NamedTupleExpr:2(N, Tuple[Any, Any]))
  FuncDef:3(
    f
    def () -> Tuple[Any, Any, fallback=__main__.N]
    Block:3(
      PassStmt:3())))

[case testTwoItemNamedtupleWithTupleFieldNames]
from collections import namedtuple
N = namedtuple('N', ('a', 'xyz'))
def f() -> N: pass
[out]
MypyFile:1(
  ImportFrom:1(collections, [namedtuple])
  AssignmentStmt:2(
    NameExpr(N* [__main__.N])
    NamedTupleExpr:2(N, Tuple[Any, Any]))
  FuncDef:3(
    f
    def () -> Tuple[Any, Any, fallback=__main__.N]
    Block:3(
      PassStmt:3())))

[case testTwoItemNamedtupleWithShorthandSyntax]
from collections import namedtuple
N = namedtuple('N', ' a  xyz ')
def f() -> N: pass
[out]
MypyFile:1(
  ImportFrom:1(collections, [namedtuple])
  AssignmentStmt:2(
    NameExpr(N* [__main__.N])
    NamedTupleExpr:2(N, Tuple[Any, Any]))
  FuncDef:3(
    f
    def () -> Tuple[Any, Any, fallback=__main__.N]
    Block:3(
      PassStmt:3())))

[case testNamedTupleWithItemTypes]
from typing import NamedTuple
N = NamedTuple('N', [('a', int),
                     ('b', str)])
[out]
MypyFile:1(
  ImportFrom:1(typing, [NamedTuple])
  AssignmentStmt:2(
    NameExpr(N* [__main__.N])
    NamedTupleExpr:2(N, Tuple[builtins.int, builtins.str])))

[case testNamedTupleWithTupleFieldNamesWithItemTypes]
from typing import NamedTuple
N = NamedTuple('N', (('a', int),
                     ('b', str)))
[out]
MypyFile:1(
  ImportFrom:1(typing, [NamedTuple])
  AssignmentStmt:2(
    NameExpr(N* [__main__.N])
    NamedTupleExpr:2(N, Tuple[builtins.int, builtins.str])))

[case testNamedTupleBaseClass]
from collections import namedtuple
N = namedtuple('N', ['x'])
class A(N): pass
[out]
MypyFile:1(
  ImportFrom:1(collections, [namedtuple])
  AssignmentStmt:2(
    NameExpr(N* [__main__.N])
    NamedTupleExpr:2(N, Tuple[Any]))
  ClassDef:3(
    A
    TupleType(
      Tuple[Any, fallback=__main__.N])
    BaseType(
      __main__.N)
    PassStmt:3()))

[case testNamedTupleBaseClass2]
from collections import namedtuple
class A(namedtuple('N', ['x'])): pass
[out]
MypyFile:1(
  ImportFrom:1(collections, [namedtuple])
  ClassDef:2(
    A
    TupleType(
      Tuple[Any, fallback=__main__.N@2])
    BaseType(
      __main__.N@2)
    PassStmt:2()))

[case testNamedTupleBaseClassWithItemTypes]
from typing import NamedTuple
class A(NamedTuple('N', [('x', int)])): pass
[out]
MypyFile:1(
  ImportFrom:1(typing, [NamedTuple])
  ClassDef:2(
    A
    TupleType(
      Tuple[builtins.int, fallback=__main__.N@2])
    BaseType(
      __main__.N@2)
    PassStmt:2()))

-- Errors

[case testNamedTupleWithTooFewArguments]
from collections import namedtuple
N = namedtuple('N') # E: Too few arguments for namedtuple()

[case testNamedTupleWithInvalidName]
from collections import namedtuple
N = namedtuple(1, ['x']) # E: namedtuple() expects a string literal as the first argument

[case testNamedTupleWithInvalidItems]
from collections import namedtuple
N = namedtuple('N', 1) # E: List or tuple literal expected as the second argument to namedtuple()

[case testNamedTupleWithInvalidItems2]
from collections import namedtuple
N = namedtuple('N', ['x', 1]) # E: String literal expected as namedtuple() item

[case testNamedTupleWithUnderscoreItemName]
from collections import namedtuple
N = namedtuple('N', ['_fallback']) # E: namedtuple() field names cannot start with an underscore: _fallback

-- NOTE: The following code works at runtime but is not yet supported by mypy.
--       Keyword arguments may potentially be supported in the future.
[case testNamedTupleWithNonpositionalArgs]
from collections import namedtuple
N = namedtuple(typename='N', field_names=['x']) # E: Unexpected arguments to namedtuple()

[case testInvalidNamedTupleBaseClass]
from typing import NamedTuple
class A(NamedTuple('N', [1])): pass # E: Tuple expected as NamedTuple() field
class B(A): pass

[case testInvalidNamedTupleBaseClass2]

class A(NamedTuple('N', [1])): pass
class B(A): pass
[out]
main:2: error: Unsupported dynamic base class "NamedTuple"
main:2: error: Name 'NamedTuple' is not defined
