-- Test cases for the default plugin
--
-- Note that we have additional test cases in pythoneval.test (that use real typeshed stubs).


[case testContextManagerWithGenericFunction]
from contextlib import contextmanager
from typing import TypeVar, Iterator

T = TypeVar('T')

@contextmanager
def yield_id(item: T) -> Iterator[T]:
    yield item

reveal_type(yield_id) # N: Revealed type is "def [T] (item: T`-1) -> contextlib.GeneratorContextManager[T`-1]"

with yield_id(1) as x:
    reveal_type(x) # N: Revealed type is "builtins.int*"

f = yield_id
def g(x, y): pass
f = g # E: Incompatible types in assignment (expression has type "Callable[[Any, Any], Any]", variable has type "Callable[[T], GeneratorContextManager[T]]")
[typing fixtures/typing-medium.pyi]
[builtins fixtures/tuple.pyi]

[case testAsyncContextManagerWithGenericFunction]
# flags: --python-version 3.7
from contextlib import asynccontextmanager
from typing import TypeVar, AsyncGenerator

T = TypeVar('T')

@asynccontextmanager
async def yield_id(item: T) -> AsyncGenerator[T, None]:
    yield item

reveal_type(yield_id) # N: Revealed type is "def [T] (item: T`-1) -> typing.AsyncContextManager[T`-1]"

async with yield_id(1) as x:
    reveal_type(x) # N: Revealed type is "builtins.int*"
[typing fixtures/typing-async.pyi]
[builtins fixtures/tuple.pyi]

[case testContextManagerReturnsGenericFunction]
import contextlib
from typing import Callable
from typing import Generator
from typing import Iterable
from typing import TypeVar

TArg = TypeVar('TArg')
TRet = TypeVar('TRet')

@contextlib.contextmanager
def _thread_mapper(maxsize: int) -> Generator[
    Callable[[Callable[[TArg], TRet], Iterable[TArg]], Iterable[TRet]],
    None, None,
]:
    # defined inline as there isn't a builtins.map fixture
    def my_map(f: Callable[[TArg], TRet], it: Iterable[TArg]) -> Iterable[TRet]:
        for x in it:
            yield f(x)

    yield my_map

def identity(x: int) -> int: return x

with _thread_mapper(1) as m:
    lst = list(m(identity, [2, 3]))
    reveal_type(lst) # N: Revealed type is "builtins.list[builtins.int*]"
[typing fixtures/typing-medium.pyi]
[builtins fixtures/list.pyi]

[case testContextManagerWithUnspecifiedArguments]
from contextlib import contextmanager
from typing import Callable, Iterator

c: Callable[..., Iterator[int]]
reveal_type(c) # N: Revealed type is "def (*Any, **Any) -> typing.Iterator[builtins.int]"
reveal_type(contextmanager(c)) # N: Revealed type is "def (*Any, **Any) -> contextlib.GeneratorContextManager[builtins.int*]"
[typing fixtures/typing-medium.pyi]
[builtins fixtures/tuple.pyi]
