[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]
x = None # type: A
x = A()
if int():
    x = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
class A:
    def __init__(self): pass
class B:
    def __init__(self): pass

[case testInheritInitFromObject]
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")
class A(object): pass
class B(object): pass

[case testImplicitInheritInitFromObject]
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
class A: pass
class B: pass
[out]

[case testTooManyConstructorArgs]
import typing
object(object())
[out]
main:2: error: Too many arguments for "object"

[case testVarDefWithInit]
import typing
a = A() # type: A
b = object() # type: A
class A: pass
[out]
main:3: error: Incompatible types in assignment (expression has type "object", variable has type "A")

[case testInheritanceBasedSubtyping]
import typing
x = B() # type: A
y = A() # type: B # Fail
class A: pass
class B(A): pass
[out]
main:3: error: 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
def f(x: 'A') -> None: pass
f(A())
f(B()) # Fail
class A: pass
class B: pass
[out]
main:4: error: Argument 1 to "f" has incompatible type "B"; expected "A"

[case testNotCallable]
import typing
A()()
class A: pass
[out]
main:2: error: "A" not callable

[case testSubtypeArgument]
import typing
def f(x: 'A', y: 'B') -> None: pass
f(B(), A()) # Fail
f(B(), B())

class A: pass
class B(A): pass
[out]
main:3: error: Argument 2 to "f" has incompatible type "A"; expected "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
x = B() # type: A
y = A() # type: B # Fail
class A: pass
class B(A): pass
[out]
main:3: error: 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
def f() -> 'A':
  return B()
a = B() # type: A
class A: pass
class B: pass
[out]
main:3: error: Incompatible return value type (got "B", expected "A")
main:4: error: 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]
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()

class A: pass
class B: pass

[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-skip]
x = 1
x in 1,
if x in 1, :
    pass
[out]

[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

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
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 testNoneHasBoolShowNoneErrorsFalse]
none = None
b = none.__bool__()
reveal_type(b)  # N: Revealed type is "Literal[False]"
[builtins fixtures/bool.pyi]
[file mypy.ini]
\[mypy]
show_none_errors = False

[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: ...
