-- Test cases for user-defined plugins
--
-- Note: Plugins used by tests live under test-data/unit/plugins. Defining
--       plugin files in test cases does not work reliably.

[case testFunctionPluginFile]
# flags: --config-file tmp/mypy.ini
def f() -> str: ...
reveal_type(f())  # N: Revealed type is "builtins.int"
[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/fnplugin.py

[case testFunctionPluginFilePyProjectTOML]
# flags: --config-file tmp/pyproject.toml
def f() -> str: ...
reveal_type(f())  # N: Revealed type is "builtins.int"
[file pyproject.toml]
\[tool.mypy]
plugins='<ROOT>/test-data/unit/plugins/fnplugin.py'

[case testFunctionPlugin]
# flags: --config-file tmp/mypy.ini
def f() -> str: ...
reveal_type(f())  # N: Revealed type is "builtins.int"
[file mypy.ini]
\[mypy]
plugins=fnplugin

[case testFunctionPluginPyProjectTOML]
# flags: --config-file tmp/pyproject.toml
def f() -> str: ...
reveal_type(f())  # N: Revealed type is "builtins.int"
[file pyproject.toml]
\[tool.mypy]
plugins = 'fnplugin'

[case testFunctionPluginFullnameIsNotNone]
# flags: --config-file tmp/mypy.ini
from typing import Callable, TypeVar
f: Callable[[], None]
T = TypeVar('T')
def g(x: T) -> T: return x  # This strips out the name of a callable
g(f)()
[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/fnplugin.py

[case testFunctionPluginFullnameIsNotNonePyProjectTOML]
# flags: --config-file tmp/pyproject.toml
from typing import Callable, TypeVar
f: Callable[[], None]
T = TypeVar('T')
def g(x: T) -> T: return x  # This strips out the name of a callable
g(f)()
[file pyproject.toml]
\[tool.mypy]
plugins="<ROOT>/test-data/unit/plugins/fnplugin.py"

[case testTwoPlugins]
# flags: --config-file tmp/mypy.ini
def f(): ...
def g(): ...
def h(): ...
reveal_type(f())  # N: Revealed type is "builtins.int"
reveal_type(g())  # N: Revealed type is "builtins.str"
reveal_type(h())  # N: Revealed type is "Any"
[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/fnplugin.py,
  <ROOT>/test-data/unit/plugins/plugin2.py

[case testTwoPluginsPyProjectTOML]
# flags: --config-file tmp/pyproject.toml
def f(): ...
def g(): ...
def h(): ...
reveal_type(f())  # N: Revealed type is "builtins.int"
reveal_type(g())  # N: Revealed type is "builtins.str"
reveal_type(h())  # N: Revealed type is "Any"
[file pyproject.toml]
\[tool.mypy]
plugins=['<ROOT>/test-data/unit/plugins/fnplugin.py',
  '<ROOT>/test-data/unit/plugins/plugin2.py'
]

[case testTwoPluginsMixedType]
# flags: --config-file tmp/mypy.ini
def f(): ...
def g(): ...
def h(): ...
reveal_type(f())  # N: Revealed type is "builtins.int"
reveal_type(g())  # N: Revealed type is "builtins.str"
reveal_type(h())  # N: Revealed type is "Any"
[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/fnplugin.py, plugin2

[case testTwoPluginsMixedTypePyProjectTOML]
# flags: --config-file tmp/pyproject.toml
def f(): ...
def g(): ...
def h(): ...
reveal_type(f())  # N: Revealed type is "builtins.int"
reveal_type(g())  # N: Revealed type is "builtins.str"
reveal_type(h())  # N: Revealed type is "Any"
[file pyproject.toml]
\[tool.mypy]
plugins=['<ROOT>/test-data/unit/plugins/fnplugin.py', 'plugin2']

[case testMissingPluginFile]
# flags: --config-file tmp/mypy.ini
[file mypy.ini]
\[mypy]
plugins=missing.py
[out]
tmp/mypy.ini:2: error: Can't find plugin "tmp/missing.py"
--' (work around syntax highlighting)

[case testMissingPlugin]
# flags: --config-file tmp/mypy.ini
[file mypy.ini]
\[mypy]
plugins=missing
[out]
tmp/mypy.ini:2: error: Error importing plugin "missing": No module named 'missing'

[case testMultipleSectionsDefinePlugin]
# flags: --config-file tmp/mypy.ini
[file mypy.ini]
\[acme]
plugins=acmeplugin
\[mypy]
plugins=missing.py
\[another]
plugins=another_plugin
[out]
tmp/mypy.ini:4: error: Can't find plugin "tmp/missing.py"
--' (work around syntax highlighting)

[case testInvalidPluginExtension]
# flags: --config-file tmp/mypy.ini
[file mypy.ini]
\[mypy]
plugins=dir/badext.pyi
[file dir/badext.pyi]
[out]
tmp/mypy.ini:2: error: Plugin "badext.pyi" does not have a .py extension

[case testMissingPluginEntryPoint]
# flags: --config-file tmp/mypy.ini
[file mypy.ini]
\[mypy]
 plugins = <ROOT>/test-data/unit/plugins/noentry.py
[out]
tmp/mypy.ini:2: error: Plugin "<ROOT>/test-data/unit/plugins/noentry.py" does not define entry point function "plugin"

[case testCustomPluginEntryPointFile]
# flags: --config-file tmp/mypy.ini
def f() -> str: ...
reveal_type(f())  # N: Revealed type is "builtins.int"
[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/customentry.py:register

[case testCustomPluginEntryPointFileTrailingComma]
# flags: --config-file tmp/mypy.ini
def f() -> str: ...
reveal_type(f())  # N: Revealed type is "builtins.int"
[file mypy.ini]
\[mypy]
plugins =
    <ROOT>/test-data/unit/plugins/customentry.py:register,

[case testCustomPluginEntryPoint]
# flags: --config-file tmp/mypy.ini
def f() -> str: ...
reveal_type(f())  # N: Revealed type is "builtins.int"
[file mypy.ini]
\[mypy]
plugins=customentry:register

[case testInvalidPluginEntryPointReturnValue]
# flags: --config-file tmp/mypy.ini
def f(): pass
f()
[file mypy.ini]
\[mypy]

plugins=<ROOT>/test-data/unit/plugins/badreturn.py
[out]
tmp/mypy.ini:3: error: Type object expected as the return value of "plugin"; got None (in <ROOT>/test-data/unit/plugins/badreturn.py)

[case testInvalidPluginEntryPointReturnValue2]
# flags: --config-file tmp/mypy.ini
def f(): pass
f()
[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/badreturn2.py
[out]
tmp/mypy.ini:2: error: Return value of "plugin" must be a subclass of "mypy.plugin.Plugin" (in <ROOT>/test-data/unit/plugins/badreturn2.py)

[case testAttributeTypeHookPlugin]
# flags: --config-file tmp/mypy.ini
from typing import Callable
from m import Signal, DerivedSignal
s: Signal[Callable[[int], None]] = Signal()
s(1)
s('') # E: Argument 1 has incompatible type "str"; expected "int"

ds: DerivedSignal[Callable[[int], None]] = DerivedSignal()
ds('') # E: Argument 1 has incompatible type "str"; expected "int"
[file m.py]
from typing import TypeVar, Generic, Callable
T = TypeVar('T', bound=Callable[..., None])
class Signal(Generic[T]):
    __call__: Callable[..., None]  # This type is replaced by the plugin

class DerivedSignal(Signal[T]): ...
[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/attrhook.py

[case testAttributeTypeHookPluginUntypedDecoratedGetattr]
# flags: --config-file tmp/mypy.ini
from m import Magic, DerivedMagic

magic = Magic()
reveal_type(magic.magic_field)  # N: Revealed type is "builtins.str"
reveal_type(magic.non_magic_method())  # N: Revealed type is "builtins.int"
reveal_type(magic.non_magic_field)  # N: Revealed type is "builtins.int"
magic.nonexistent_field  # E: Field does not exist
reveal_type(magic.fallback_example)  # N: Revealed type is "Any"

derived = DerivedMagic()
reveal_type(derived.magic_field)  # N: Revealed type is "builtins.str"
derived.nonexistent_field  # E: Field does not exist
reveal_type(derived.fallback_example)  # N: Revealed type is "Any"

[file m.py]
from typing import Any, Callable

def decorator(f):
    pass

class Magic:
    # Triggers plugin infrastructure:
    @decorator
    def __getattr__(self, x: Any) -> Any: ...
    def non_magic_method(self) -> int: ...
    non_magic_field: int

class DerivedMagic(Magic): ...
[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/attrhook2.py

[case testAttributeTypeHookPluginDecoratedGetattr]
# flags: --config-file tmp/mypy.ini
from m import Magic, DerivedMagic

magic = Magic()
reveal_type(magic.magic_field)  # N: Revealed type is "builtins.str"
reveal_type(magic.non_magic_method())  # N: Revealed type is "builtins.int"
reveal_type(magic.non_magic_field)  # N: Revealed type is "builtins.int"
magic.nonexistent_field  # E: Field does not exist
reveal_type(magic.fallback_example)  # N: Revealed type is "builtins.bool"

derived = DerivedMagic()
reveal_type(derived.magic_field)  # N: Revealed type is "builtins.str"
derived.nonexistent_field  # E: Field does not exist
reveal_type(derived.fallback_example)  # N: Revealed type is "builtins.bool"

[file m.py]
from typing import Any, Callable

def decorator(f: Callable) -> Callable[[Any, str], bool]:
    pass

class Magic:
    # Triggers plugin infrastructure:
    @decorator
    def __getattr__(self, x: Any) -> Any: ...
    def non_magic_method(self) -> int: ...
    non_magic_field: int

class DerivedMagic(Magic): ...
[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/attrhook2.py

[case testAttributeHookPluginForDynamicClass]
# flags: --config-file tmp/mypy.ini
from m import Magic, DerivedMagic

magic = Magic()
reveal_type(magic.magic_field)  # N: Revealed type is "builtins.str"
reveal_type(magic.non_magic_method())  # N: Revealed type is "builtins.int"
reveal_type(magic.non_magic_field)  # N: Revealed type is "builtins.int"
magic.nonexistent_field  # E: Field does not exist
reveal_type(magic.fallback_example)  # N: Revealed type is "Any"

derived = DerivedMagic()
reveal_type(derived.magic_field)  # N: Revealed type is "builtins.str"
derived.nonexistent_field  # E: Field does not exist
reveal_type(magic.fallback_example)  # N: Revealed type is "Any"

[file m.py]
from typing import Any
class Magic:
    # Triggers plugin infrastructure:
    def __getattr__(self, x: Any) -> Any: ...
    def non_magic_method(self) -> int: ...
    non_magic_field: int

class DerivedMagic(Magic): ...

[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/attrhook2.py

[case testTypeAnalyzeHookPlugin]
# flags: --config-file tmp/mypy.ini
from typing import Callable
from mypy_extensions import DefaultArg
from m import Signal
s: Signal[[int, DefaultArg(str, 'x')]] = Signal()
reveal_type(s) # N: Revealed type is "m.Signal[def (builtins.int, x: builtins.str =)]"
s.x # E: "Signal[Callable[[int, str], None]]" has no attribute "x"
ss: Signal[int, str] # E: Invalid "Signal" type (expected "Signal[[t, ...]]")
[file m.py]
from typing import TypeVar, Generic, Callable
T = TypeVar('T', bound=Callable[..., None])
class Signal(Generic[T]):
    __call__: Callable[..., None]
[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/type_anal_hook.py
[builtins fixtures/dict.pyi]

[case testFunctionPluginHookForClass]
# flags: --config-file tmp/mypy.ini
import mod
from mod import AttrInt

Alias = AttrInt
AnotherAlias = mod.Attr

class C:
    x = Alias()
    y = mod.AttrInt(required=True)
    z = AnotherAlias(int, required=False)

c = C()
reveal_type(c.x)  # N: Revealed type is "Union[builtins.int, None]"
reveal_type(c.y)  # N: Revealed type is "builtins.int"
reveal_type(c.z)  # N: Revealed type is "Union[builtins.int, None]"

[file mod.py]
from typing import Generic, TypeVar, Type
T = TypeVar('T')

class Attr(Generic[T]):
    def __init__(self, tp: Type[T], required: bool = False) -> None:
        pass
    def __get__(self, instance: object, owner: type) -> T:
        pass

class AttrInt(Attr[int]):
    def __init__(self, required: bool = False) -> None:
        pass

[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/class_callable.py
[builtins fixtures/bool.pyi]
[out]

[case testFunctionPluginHookForReturnedCallable]
# flags: --config-file tmp/mypy.ini
from m import decorator1, decorator2
@decorator1()
def f() -> None: pass
@decorator2()
def g() -> None: pass
reveal_type(f) # N: Revealed type is "def (*Any, **Any) -> builtins.str"
reveal_type(g) # N: Revealed type is "def (*Any, **Any) -> builtins.int"
[file m.py]
from typing import Callable
def decorator1() -> Callable[..., Callable[..., int]]: pass
def decorator2() -> Callable[..., Callable[..., int]]: pass
[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/named_callable.py

[case testFunctionMethodContextsHasArgNames]
# flags: --config-file tmp/mypy.ini
from mod import Class, func

reveal_type(Class().method(arg1=1, arg2=2, classname='builtins.str'))  # N: Revealed type is "builtins.str"
reveal_type(Class.myclassmethod(arg1=1, arg2=2, classname='builtins.str'))  # N: Revealed type is "builtins.str"
reveal_type(Class.mystaticmethod(arg1=1, arg2=2, classname='builtins.str'))  # N: Revealed type is "builtins.str"
reveal_type(Class.method(self=Class(), arg1=1, arg2=2, classname='builtins.str'))  # N: Revealed type is "builtins.str"
reveal_type(func(arg1=1, arg2=2, classname='builtins.str'))  # N: Revealed type is "builtins.str"

[file mod.py]
from typing import Any
class Class:
    def method(self, classname: str, arg1: Any, arg2: Any) -> Any:
        pass
    @classmethod
    def myclassmethod(cls, classname: str, arg1: Any, arg2: Any):
        pass
    @staticmethod
    def mystaticmethod(classname: str, arg1: Any, arg2: Any):
        pass
def func(classname: str, arg1: Any, arg2: Any) -> Any:
    pass

[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/arg_names.py
[builtins fixtures/classmethod.pyi]

[case testFunctionMethodContextsHasArgNamesPositionals]
# flags: --config-file tmp/mypy.ini
from mod import Class, func

reveal_type(Class().method('builtins.str', arg1=1, arg2=2))  # N: Revealed type is "builtins.str"
reveal_type(Class.myclassmethod('builtins.str', arg1=1, arg2=2))  # N: Revealed type is "builtins.str"
reveal_type(Class.mystaticmethod('builtins.str', arg1=1, arg2=2))  # N: Revealed type is "builtins.str"
reveal_type(Class.method(Class(), 'builtins.str', arg1=1, arg2=2))  # N: Revealed type is "builtins.str"
reveal_type(func('builtins.str', arg1=1, arg2=2))  # N: Revealed type is "builtins.str"

[file mod.py]
from typing import Any
class Class:
    def method(self, classname: str, arg1: Any, arg2: Any) -> Any:
        pass
    @classmethod
    def myclassmethod(cls, classname: str, arg1: Any, arg2: Any):
        pass
    @staticmethod
    def mystaticmethod(classname: str, arg1: Any, arg2: Any):
        pass
def func(classname: str, arg1: Any, arg2: Any) -> Any:
    pass

[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/arg_names.py
[builtins fixtures/classmethod.pyi]

[case testFunctionMethodContextsHasArgNamesInitMethod]
# flags: --config-file tmp/mypy.ini
from mod import ClassInit, Outer

reveal_type(ClassInit('builtins.str'))  # N: Revealed type is "builtins.str"
reveal_type(ClassInit(classname='builtins.str'))  # N: Revealed type is "builtins.str"
reveal_type(Outer.NestedClassInit(classname='builtins.str'))  # N: Revealed type is "builtins.str"
[file mod.py]
from typing import Any
class ClassInit:
    def __init__(self, classname: str):
        pass
class Outer:
    class NestedClassInit:
        def __init__(self, classname: str):
            pass

[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/arg_names.py

[case testFunctionMethodContextsHasArgNamesUnfilledArguments]
# flags: --config-file tmp/mypy.ini
from mod import ClassUnfilled, func_unfilled

reveal_type(ClassUnfilled().method(classname='builtins.str', arg1=1))  # N: Revealed type is "builtins.str"
reveal_type(ClassUnfilled().method(arg2=1, classname='builtins.str'))  # N: Revealed type is "builtins.str"
reveal_type(ClassUnfilled().method('builtins.str'))  # N: Revealed type is "builtins.str"
reveal_type(func_unfilled(classname='builtins.str', arg1=1))  # N: Revealed type is "builtins.str"
reveal_type(func_unfilled(arg2=1, classname='builtins.str'))  # N: Revealed type is "builtins.str"
reveal_type(func_unfilled('builtins.str'))  # N: Revealed type is "builtins.str"

[file mod.py]
from typing import Any
class ClassUnfilled:
    def method(self, classname: str, arg1: Any = None, arg2: Any = None) -> Any:
        pass
def func_unfilled(classname: str, arg1: Any = None, arg2: Any = None) -> Any:
    pass

[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/arg_names.py

[case testFunctionMethodContextsHasArgNamesStarExpressions]
# flags: --config-file tmp/mypy.ini
from mod import ClassStarExpr, func_star_expr

reveal_type(ClassStarExpr().method(classname='builtins.str', arg1=1))  # N: Revealed type is "builtins.str"
reveal_type(ClassStarExpr().method('builtins.str', arg1=1))  # N: Revealed type is "builtins.str"
reveal_type(ClassStarExpr().method('builtins.str', arg1=1, arg2=1))  # N: Revealed type is "builtins.str"
reveal_type(ClassStarExpr().method('builtins.str', 2, 3, 4, arg1=1, arg2=1))  # N: Revealed type is "builtins.str"
reveal_type(func_star_expr(classname='builtins.str', arg1=1))  # N: Revealed type is "builtins.str"
reveal_type(func_star_expr('builtins.str', arg1=1))  # N: Revealed type is "builtins.str"
reveal_type(func_star_expr('builtins.str', 2, 3, 4, arg1=1, arg2=2))  # N: Revealed type is "builtins.str"

[file mod.py]
from typing import Any
class ClassStarExpr:
    def method(self, classname: str, *args, **kwargs) -> Any:
        pass
def func_star_expr(classname: str, *args, **kwargs) -> Any:
    pass

[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/arg_names.py
[builtins fixtures/dict.pyi]

[case testFunctionMethodContextArgNamesForInheritedMethods]
# flags: --config-file tmp/mypy.ini
from mod import ClassChild

reveal_type(ClassChild().method(classname='builtins.str', arg1=1, arg2=1))  # N: Revealed type is "builtins.str"
reveal_type(ClassChild().method(arg1=1, classname='builtins.str', arg2=1))  # N: Revealed type is "builtins.str"
reveal_type(ClassChild().method('builtins.str', arg1=1, arg2=1))  # N: Revealed type is "builtins.str"
reveal_type(ClassChild.myclassmethod('builtins.str'))  # N: Revealed type is "builtins.str"
[file mod.py]
from typing import Any
class Base:
    def method(self, classname: str, arg1: Any, arg2: Any) -> Any:
        pass
    @classmethod
    def myclassmethod(cls, classname: str) -> Any:
        pass
class ClassChild(Base):
    pass

[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/arg_names.py
[builtins fixtures/classmethod.pyi]

[case testMethodSignatureHook]
# flags: --config-file tmp/mypy.ini
from typing import Iterator

class Foo:
    # Test that method signature hooks are applied in various cases: explicit method calls, and
    # implicit dunder method calls through language syntax.
    # The plugin's method signature hook should turn all str occurrences into int.
    def __init__(self) -> None: ...
    def __getitem__(self, index: str) -> str: ...
    def __setitem__(self, index: str, value: str) -> None: ...
    def __iter__(self) -> Iterator[str]: ...
    def __next__(self) -> str: ...
    def __call__(self, *args: str) -> str: ...
    def m(self, arg: str) -> str: ...

foo = Foo()
reveal_type(foo.m(2)) # N: Revealed type is "builtins.int"
reveal_type(foo[3]) # N: Revealed type is "builtins.int"
reveal_type(foo(4, 5, 6)) # N: Revealed type is "builtins.int"
foo[4] = 5
for x in foo:
    reveal_type(x) # N: Revealed type is "builtins.int"

[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/method_sig_hook.py
[builtins fixtures/tuple.pyi]

[case testMethodSignatureHookNamesFullyQualified]
# flags: --config-file tmp/mypy.ini
from mypy_extensions import TypedDict
from typing import NamedTuple

class FullyQualifiedTestClass:
    @classmethod
    def class_method(self) -> str: ...
    def instance_method(self) -> str: ...

class FullyQualifiedTestTypedDict(TypedDict):
    foo: str

FullyQualifiedTestNamedTuple = NamedTuple('FullyQualifiedTestNamedTuple', [('foo', str)])

# Check the return types to ensure that the method signature hook is called in each case
reveal_type(FullyQualifiedTestClass.class_method()) # N: Revealed type is "builtins.int"
reveal_type(FullyQualifiedTestClass().instance_method()) # N: Revealed type is "builtins.int"
reveal_type(FullyQualifiedTestNamedTuple('')._asdict()) # N: Revealed type is "builtins.int"

[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/fully_qualified_test_hook.py
[builtins fixtures/classmethod.pyi]

[case testDynamicClassPlugin]
# flags: --config-file tmp/mypy.ini
from mod import declarative_base, Column, Instr

Base = declarative_base()

class Model(Base):
    x: Column[int]
class Other:
    x: Column[int]

reveal_type(Model().x)  # N: Revealed type is "mod.Instr[builtins.int]"
reveal_type(Other().x)  # N: Revealed type is "mod.Column[builtins.int]"
[file mod.py]
from typing import Generic, TypeVar
def declarative_base(): ...

T = TypeVar('T')

class Column(Generic[T]): ...
class Instr(Generic[T]): ...

[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/dyn_class.py

[case testDynamicClassPluginChainCall]
# flags: --config-file tmp/mypy.ini
from mod import declarative_base, Column, Instr

Base = declarative_base().with_optional_xxx()

class Model(Base):
    x: Column[int]

reveal_type(Model().x)  # N: Revealed type is "mod.Instr[builtins.int]"
[file mod.py]
from typing import Generic, TypeVar

class Base:
    def with_optional_xxx(self) -> Base: ...

def declarative_base() -> Base: ...

T = TypeVar('T')

class Column(Generic[T]): ...
class Instr(Generic[T]): ...

[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/dyn_class.py

[case testDynamicClassPluginChainedAssignment]
# flags: --config-file tmp/mypy.ini
from mod import declarative_base

Base1 = Base2 = declarative_base()

class C1(Base1): ...
class C2(Base2): ...
[file mod.py]
def declarative_base(): ...
[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/dyn_class.py

[case testDynamicClassPluginNegatives]
# flags: --config-file tmp/mypy.ini
from mod import non_declarative_base

Bad1 = non_declarative_base()

class C1(Bad1): ...  # E: Variable "__main__.Bad1" is not valid as a type \
                     # N: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases \
                     # E: Invalid base class "Bad1"
[file mod.py]
def non_declarative_base(): ...
[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/dyn_class.py

[case testDynamicClassHookFromClassMethod]
# flags: --config-file tmp/mypy.ini

from mod import QuerySet, Manager

MyManager = Manager.from_queryset(QuerySet)

reveal_type(MyManager())  # N: Revealed type is "__main__.MyManager"
reveal_type(MyManager().attr)  # N: Revealed type is "builtins.str"

def func(manager: MyManager) -> None:
    reveal_type(manager)   # N: Revealed type is "__main__.MyManager"
    reveal_type(manager.attr)   # N: Revealed type is "builtins.str"

func(MyManager())

[file mod.py]
from typing import Generic, TypeVar, Type
class QuerySet:
    attr: str
class Manager:
    @classmethod
    def from_queryset(cls, queryset_cls: Type[QuerySet]): ...

[builtins fixtures/classmethod.pyi]
[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/dyn_class_from_method.py

[case testBaseClassPluginHookWorksIncremental]
# flags: --config-file tmp/mypy.ini
import a

[file a.py]
from base import Base
class C(Base): ...

[file a.py.2]
from base import Base
class C(Base): ...
reveal_type(C().__magic__)
Base.__magic__

[file base.py]
from lib import declarative_base
Base = declarative_base()

[file lib.py]
from typing import Any
def declarative_base() -> Any: ...

[file mypy.ini]
\[mypy]
python_version=3.6
plugins=<ROOT>/test-data/unit/plugins/common_api_incremental.py
[out]
[out2]
tmp/a.py:3: note: Revealed type is "builtins.str"
tmp/a.py:4: error: "Type[Base]" has no attribute "__magic__"

[case testArgKindsMethod]
# flags: --config-file tmp/mypy.ini
class Class:
    def method(self, *args, **kwargs):
        pass

Class().method(1, *[2], **{'a': 1})  # E: [[0, 2], [4]]
[builtins fixtures/dict.pyi]
[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/arg_kinds.py

[case testArgKindsFunction]
# flags: --config-file tmp/mypy.ini
def func(*args, **kwargs):
    pass

func(1, 2, [3, 4], *[5, 6, 7], **{'a': 1})  # E: [[0, 0, 0, 2], [4]]
[builtins fixtures/dict.pyi]
[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/arg_kinds.py

[case testHookCallableInstance]
# flags: --config-file tmp/mypy.ini
from typing import Generic, TypeVar
T = TypeVar("T")
class Class(Generic[T]):
    def __init__(self, one: T): ...
    def __call__(self, two: T) -> int: ...
reveal_type(Class("hi")("there"))  # N: Revealed type is "builtins.str"
instance = Class(3.14)
reveal_type(instance(2))  # N: Revealed type is "builtins.float"

[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/callable_instance.py

[case testGetMethodHooksOnUnions]
# flags: --config-file tmp/mypy.ini --no-strict-optional
from typing import Union

class Foo:
    def meth(self, x: str) -> str: ...
class Bar:
    def meth(self, x: int) -> float: ...
class Other:
    meth: int

x: Union[Foo, Bar, Other]
if isinstance(x.meth, int):
    reveal_type(x.meth)  # N: Revealed type is "builtins.int"
else:
    reveal_type(x.meth(int()))  # N: Revealed type is "builtins.int"

[builtins fixtures/isinstancelist.pyi]
[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/union_method.py

[case testGetMethodHooksOnUnionsStrictOptional]
# flags: --config-file tmp/mypy.ini --strict-optional
from typing import Union

class Foo:
    def meth(self, x: str) -> str: ...
class Bar:
    def meth(self, x: int) -> float: ...
class Other:
    meth: int

x: Union[Foo, Bar, Other]
if isinstance(x.meth, int):
    reveal_type(x.meth)  # N: Revealed type is "builtins.int"
else:
    reveal_type(x.meth(int()))  # N: Revealed type is "builtins.int"

[builtins fixtures/isinstancelist.pyi]
[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/union_method.py

[case testGetMethodHooksOnUnionsSpecial]
# flags: --config-file tmp/mypy.ini
from typing import Union

class Foo:
    def __getitem__(self, x: str) -> str: ...
class Bar:
    def __getitem__(self, x: int) -> float: ...

x: Union[Foo, Bar]
reveal_type(x[int()])  # N: Revealed type is "builtins.int"

[builtins fixtures/isinstancelist.pyi]
[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/union_method.py

[case testPluginDependencies]
# flags: --config-file tmp/mypy.ini

# The top level file here doesn't do anything, but the plugin should add
# a dependency on err that will cause err to be processed and an error reported.

[file err.py]
1 + 'lol'  # E: Unsupported operand types for + ("int" and "str")

[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/depshook.py

[case testCustomizeMroTrivial]
# flags: --config-file tmp/mypy.ini
class A: pass
[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/customize_mro.py

[case testDescriptorMethods]
# flags: --config-file tmp/mypy.ini

class Desc:
    def __get__(self, obj, cls):
        pass

    def __set__(self, obj, val):
        pass

class Cls:
    attr = Desc()

reveal_type(Cls().attr)  # N: Revealed type is "builtins.int"
reveal_type(Cls.attr)  # N: Revealed type is "builtins.str"

Cls().attr = 3
Cls().attr = "foo"  # E: Incompatible types in assignment (expression has type "str", variable has type "int")

[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/descriptor.py

[case testFunctionSigPluginFile]
# flags: --config-file tmp/mypy.ini

def dynamic_signature(arg1: str) -> str: ...
a: int = 1
reveal_type(dynamic_signature(a))  # N: Revealed type is "builtins.int"
b: bytes = b'foo'
reveal_type(dynamic_signature(b))  # N: Revealed type is "builtins.bytes"
[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/function_sig_hook.py

[case testPluginCalledCorrectlyWhenMethodInDecorator]
# flags: --config-file tmp/mypy.ini
from typing import TypeVar, Callable

T = TypeVar('T')
class Foo:
    def a(self, x: Callable[[], T]) -> Callable[[], T]: ...

b = Foo()

@b.a
def f() -> None:
    pass

reveal_type(f())  # N: Revealed type is "builtins.str"

[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/method_in_decorator.py

[case testClassAttrPluginClassVar]
# flags: --config-file tmp/mypy.ini

from typing import Type

class Cls:
    attr = 'test'
    unchanged = 'test'

reveal_type(Cls().attr)  # N: Revealed type is "builtins.str"
reveal_type(Cls.attr)  # N: Revealed type is "builtins.int"
reveal_type(Cls.unchanged)  # N: Revealed type is "builtins.str"
x: Type[Cls]
reveal_type(x.attr)  # N: Revealed type is "builtins.int"
[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/class_attr_hook.py

[case testClassAttrPluginMethod]
# flags: --config-file tmp/mypy.ini

class Cls:
    def attr(self) -> None:
        pass

reveal_type(Cls.attr)  # N: Revealed type is "builtins.int"
[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/class_attr_hook.py

[case testClassAttrPluginEnum]
# flags: --config-file tmp/mypy.ini

import enum

class Cls(enum.Enum):
    attr = 'test'

reveal_type(Cls.attr)  # N: Revealed type is "builtins.int"
[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/class_attr_hook.py

[case testClassAttrPluginMetaclassAnyBase]
# flags: --config-file tmp/mypy.ini

from typing import Any, Type
class M(type):
    attr = 'test'

B: Any
class Cls(B, metaclass=M):
    pass

reveal_type(Cls.attr) # N: Revealed type is "builtins.int"
[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/class_attr_hook.py

[case testClassAttrPluginMetaclassRegularBase]
# flags: --config-file tmp/mypy.ini

from typing import Any, Type
class M(type):
    attr = 'test'

class B:
    attr = None

class Cls(B, metaclass=M):
    pass

reveal_type(Cls.attr) # N: Revealed type is "builtins.int"
[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/class_attr_hook.py

[case testClassAttrPluginPartialType]
# flags: --config-file tmp/mypy.ini

class Cls:
    attr = None
    def f(self) -> int:
        return Cls.attr + 1

[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/class_attr_hook.py

[case testAddClassMethodPlugin]
# flags: --config-file tmp/mypy.ini
class BaseAddMethod: pass

class MyClass(BaseAddMethod):
    pass

my_class = MyClass()
reveal_type(MyClass.foo_classmethod)  # N: Revealed type is "def ()"
reveal_type(MyClass.foo_staticmethod)  # N: Revealed type is "def (builtins.int) -> builtins.str"
[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/add_classmethod.py

[case testCustomErrorCodePlugin]
# flags: --config-file tmp/mypy.ini  --show-error-codes
def main() -> int:
    return 2

main()  # E: Custom error  [custom]
reveal_type(1)  # N: Revealed type is "Literal[1]?"

[file mypy.ini]
\[mypy]
plugins=<ROOT>/test-data/unit/plugins/custom_errorcode.py
