[case testEmptyFile]
[out]

[case testAssignmentAndVarDef]
a = None # type: A
b = None # type: B
if int():
    a = a
if int():
    a = b # E: Incompatible types in assignment (expression has type "B", variable has type "A")
class A: pass
class B: pass

[case testConstructionAndAssignment]
class A:
    def __init__(self): pass
class B:
    def __init__(self): pass

x = None # type: A
x = A()
if int():
    x = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
[case testInheritInitFromObject]
class A(object): pass
class B(object): pass
x = None # type: A
if int():
    x = A()
if int():
    x = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
[case testImplicitInheritInitFromObject]
class A: pass
class B: pass
x = None # type: A
o = None # type: object
if int():
    x = o # E: Incompatible types in assignment (expression has type "object", variable has type "A")
if int():
    x = A()
if int():
    o = x
[case testTooManyConstructorArgs]
import typing
object(object())
[out]
main:2: error: Too many arguments for "object"

[case testVarDefWithInit]
import typing
class A: pass
a = A() # type: A
b = object() # type: A  # E: Incompatible types in assignment (expression has type "object", variable has type "A")
[case testInheritanceBasedSubtyping]
import typing
class A: pass
class B(A): pass
x = B() # type: A
y = A() # type: B  # E: Incompatible types in assignment (expression has type "A", variable has type "B")
[case testDeclaredVariableInParentheses]

(x) = None # type: int
if int():
    x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
if int():
    x = 1


[case testIncompatibleAssignmentAmbiguousShortnames]

class Any: pass
class List: pass
class Dict: pass
class Iterator: pass

x = Any()
x = 1  # E: Incompatible types in assignment (expression has type "int", variable has type "__main__.Any")

y = List()
y = 1  # E: Incompatible types in assignment (expression has type "int", variable has type "__main__.List")

z = Dict()
z = 1  # E: Incompatible types in assignment (expression has type "int", variable has type "__main__.Dict")

w = Iterator()
w = 1  # E: Incompatible types in assignment (expression has type "int", variable has type "__main__.Iterator")


-- Simple functions and calling
-- ----------------------------


[case testFunction]
import typing
class A: pass
class B: pass
def f(x: 'A') -> None: pass
f(A())
f(B()) # E: Argument 1 to "f" has incompatible type "B"; expected "A"
[case testNotCallable]
import typing
class A: pass
A()()  # E: "A" not callable
[case testSubtypeArgument]
import typing
class A: pass
class B(A): pass
def f(x: 'A', y: 'B') -> None: pass
f(B(), A()) # E: Argument 2 to "f" has incompatible type "A"; expected "B"
f(B(), B())
[case testInvalidArgumentCount]
import typing
def f(x, y) -> None: pass
f(object())
f(object(), object(), object())
[out]
main:3: error: Missing positional argument "y" in call to "f"
main:4: error: Too many arguments for "f"

[case testMissingPositionalArguments]
class Foo:
    def __init__(self, bar: int):
        pass
c = Foo()
def foo(baz: int, bas: int):pass
foo()
[out]
main:4: error: Missing positional argument "bar" in call to "Foo"
main:6: error: Missing positional arguments "baz", "bas" in call to "foo"


-- Locals
-- ------


[case testLocalVariables]
def f() -> None:
  x = None # type: A
  y = None # type: B
  if int():
      x = x
      x = y # E: Incompatible types in assignment (expression has type "B", variable has type "A")
class A: pass
class B: pass

[case testLocalVariableScope]
def f() -> None:
  x: A
  x = A()
def g() -> None:
  x: B
  x = A() # E: Incompatible types in assignment (expression has type "A", variable has type "B")
class A: pass
class B: pass

[case testFunctionArguments]
import typing
def f(x: 'A', y: 'B') -> None:
  if int():
    x = y # E: Incompatible types in assignment (expression has type "B", variable has type "A")
    x = x
    y = B()
class A: pass
class B: pass

[case testLocalVariableInitialization]
import typing
def f() -> None:
  a = A() # type: A
  b = B() # type: A # Fail
class A: pass
class B: pass
[out]
main:4: error: Incompatible types in assignment (expression has type "B", variable has type "A")

[case testVariableInitializationWithSubtype]
import typing
class A: pass
class B(A): pass
x = B() # type: A
y = A() # type: B # E: Incompatible types in assignment (expression has type "A", variable has type "B")


-- Misc
-- ----


[case testInvalidReturn]
import typing
def f() -> 'A':
  return B()
class A: pass
class B: pass
[out]
main:3: error: Incompatible return value type (got "B", expected "A")

[case testTopLevelContextAndInvalidReturn]
import typing
class A: pass
class B: pass
def f() -> 'A':
  return B()  # E: Incompatible return value type (got "B", expected "A")
a = B() # type: A  # E: Incompatible types in assignment (expression has type "B", variable has type "A")
[case testEmptyReturnInAnyTypedFunction]
from typing import Any
def f() -> Any:
  return

[case testEmptyYieldInAnyTypedFunction]
from typing import Any
def f() -> Any:
  yield

[case testModuleImplicitAttributes]
import typing
class A: pass
reveal_type(__name__)         # N: Revealed type is "builtins.str"
reveal_type(__doc__)          # N: Revealed type is "builtins.str"
reveal_type(__file__)         # N: Revealed type is "builtins.str"
reveal_type(__package__)      # N: Revealed type is "builtins.str"
reveal_type(__annotations__)  # N: Revealed type is "builtins.dict[builtins.str, Any]"
[builtins fixtures/primitives.pyi]


-- Scoping and shadowing
-- ---------------------


[case testLocalVariableShadowing]
class A: pass
class B: pass
a = None # type: A
if int():
    a = B()  # E: Incompatible types in assignment (expression has type "B", variable has type "A")
    a = A()
def f() -> None:
  a = None # type: B
  if int():
      a = A()     # E: Incompatible types in assignment (expression has type "A", variable has type "B")
      a = B()
a = B()       # E: Incompatible types in assignment (expression has type "B", variable has type "A")
a = A()
[case testGlobalDefinedInBlockWithType]
class A: pass
while A:
    a = None # type: A
    if int():
        a = A()
        a = object() # E: Incompatible types in assignment (expression has type "object", variable has type "A")


-- # type: signatures
-- ------------------


[case testFunctionSignatureAsComment]
def f(x): # type: (int) -> str
    return 1
f('')
[out]
main:2: error: Incompatible return value type (got "int", expected "str")
main:3: error: Argument 1 to "f" has incompatible type "str"; expected "int"

[case testMethodSignatureAsComment]
class A:
    def f(self, x):
        # type: (int) -> str
        self.f('') # Fail
        return 1
A().f('') # Fail
[out]
main:4: error: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
main:5: error: Incompatible return value type (got "int", expected "str")
main:6: error: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"

[case testTrailingCommaParsing]
x = 1
x in 1,  # E: Unsupported right operand type for in ("int")
[builtins fixtures/tuple.pyi]

[case testTrailingCommaInIfParsing]
if x in 1, : pass
[out]
main:1: error: invalid syntax

[case testInitReturnTypeError]
class C:
    def __init__(self):
        # type: () -> int
        pass
[out]
main:2: error: The return type of "__init__" must be None

-- WritesCache signals to testcheck to do the cache validation
[case testWritesCache]
import a
import d
[file a.py]
import b
import c
[file b.py]
[file c.py]
[file d.py]

[case testWritesCacheErrors]
import a
import d
[file a.py]
import b
import c
[file b.py]
[file c.py]
[file d.py]
import e
[file e.py]
1+'no'  # E: Unsupported operand types for + ("int" and "str")

[case testModuleAsTypeNoCrash]

import mock
from typing import Union

class A: ...
class B: ...

x: Union[mock, A]  # E: Module "mock" is not valid as a type \
                   # N: Perhaps you meant to use a protocol matching the module structure?

if isinstance(x, B):
    pass
[file mock.py]
[builtins fixtures/isinstance.pyi]
[out]

[case testModuleAsTypeNoCrash2]

import mock
from typing import overload, Any, Union

@overload
def f(x: int) -> int: ...
@overload
def f(x: str) -> Union[mock, str]: ...  # E: Module "mock" is not valid as a type \
                                        # N: Perhaps you meant to use a protocol matching the module structure?
def f(x):
    pass

x: Any
f(x)
[file mock.py]
[builtins fixtures/isinstance.pyi]
[out]

[case testPartialTypeComments]
def foo(
    a,  # type: str
    b,
    args=None,
):
    # type: (...) -> None
    pass

[case testNoneHasBool]
none = None
b = none.__bool__()
reveal_type(b)  # N: Revealed type is "Literal[False]"
[builtins fixtures/bool.pyi]

[case testAssignmentInvariantNoteForList]
from typing import List
x: List[int]
y: List[float]
y = x # E: Incompatible types in assignment (expression has type "List[int]", variable has type "List[float]") \
     # N: "List" is invariant -- see https://mypy.readthedocs.io/en/stable/common_issues.html#variance \
     # N: Consider using "Sequence" instead, which is covariant
[builtins fixtures/list.pyi]

[case testAssignmentInvariantNoteForDict]
from typing import Dict
x: Dict[str, int]
y: Dict[str, float]
y = x # E: Incompatible types in assignment (expression has type "Dict[str, int]", variable has type "Dict[str, float]") \
     # N: "Dict" is invariant -- see https://mypy.readthedocs.io/en/stable/common_issues.html#variance \
     # N: Consider using "Mapping" instead, which is covariant in the value type
[builtins fixtures/dict.pyi]

[case testDistinctTypes]
# flags: --strict-optional
import b

[file a.py]
from typing import NamedTuple
from typing_extensions import TypedDict
from enum import Enum
class A: pass
N = NamedTuple('N', [('x', int)])
D = TypedDict('D', {'x': int})
class B(Enum):
    b = 10

[file b.py]
from typing import List, Optional, Union, Sequence, NamedTuple, Tuple, Type
from typing_extensions import Literal, Final, TypedDict
from enum import Enum
import a
class A: pass
N = NamedTuple('N', [('x', int)])
class B(Enum):
    b = 10
D = TypedDict('D', {'y': int})

def foo() -> Optional[A]:
    b = True
    return a.A() if b else None  # E: Incompatible return value type (got "Optional[a.A]", expected "Optional[b.A]")

def bar() -> List[A]:
    l = [a.A()]
    return l  # E: Incompatible return value type (got "List[a.A]", expected "List[b.A]")

def baz() -> Union[A, int]:
    b = True
    return a.A() if b else 10  # E: Incompatible return value type (got "Union[a.A, int]", expected "Union[b.A, int]")

def spam() -> Optional[A]:
    return a.A()  # E: Incompatible return value type (got "a.A", expected "Optional[b.A]")

def eggs() -> Sequence[A]:
    x = [a.A()]
    return x  # E: Incompatible return value type (got "List[a.A]", expected "Sequence[b.A]")

def eggs2() -> Sequence[N]:
    x = [a.N(0)]
    return x  # E: Incompatible return value type (got "List[a.N]", expected "Sequence[b.N]")

def asdf1() -> Sequence[Tuple[a.A, A]]:
    x = [(a.A(), a.A())]
    return x  # E: Incompatible return value type (got "List[Tuple[a.A, a.A]]", expected "Sequence[Tuple[a.A, b.A]]")

def asdf2() -> Sequence[Tuple[A, a.A]]:
    x = [(a.A(), a.A())]
    return x  # E: Incompatible return value type (got "List[Tuple[a.A, a.A]]", expected "Sequence[Tuple[b.A, a.A]]")

def arg() -> Tuple[A, A]:
    return A()  # E: Incompatible return value type (got "A", expected "Tuple[A, A]")

def types() -> Sequence[Type[A]]:
    x = [a.A]
    return x  # E: Incompatible return value type (got "List[Type[a.A]]", expected "Sequence[Type[b.A]]")

def literal() -> Sequence[Literal[B.b]]:
    x = [a.B.b]  # type: List[Literal[a.B.b]]
    return x  # E: Incompatible return value type (got "List[Literal[a.B.b]]", expected "Sequence[Literal[b.B.b]]")

def typeddict() -> Sequence[D]:
    x = [{'x': 0}]  # type: List[a.D]
    return x  # E: Incompatible return value type (got "List[a.D]", expected "Sequence[b.D]")

a = (a.A(), A())
a.x  # E: "Tuple[a.A, b.A]" has no attribute "x"

[builtins fixtures/dict.pyi]

[case testReturnAnyFromFunctionDeclaredToReturnObject]
# flags: --warn-return-any
from typing import Any

def f() -> object:
    x: Any = 1
    return x

[case testImportModuleAsClassMember]
import test

class A:
    def __init__(self) -> None:
        self.test = test

    def __call__(self) -> None:
      self.test.foo("Message")

[file test.py]
def foo(s: str) -> None: ...

[case testLocalImportModuleAsClassMember]
class A:
    def __init__(self) -> None:
        import test

        self.test = test

    def __call__(self) -> None:
      self.test.foo("Message")

[file test.py]
def foo(s: str) -> None: ...

[case testInlineAssertions]
import a, b
s1: str = 42  # E: Incompatible types in assignment (expression has type "int", variable has type "str")
[file a.py]
s2: str = 42  # E: Incompatible types in assignment (expression has type "int", variable has type "str")
[file b.py]
s3: str = 42  # E: Incompatible types in assignment (expression has type "int", variable has type "str")
[file c.py]
s3: str = 'foo'
