[case testTaskStatus]
import trio
from trio_typing import TaskStatus

async def child(arg: int, *, task_status: TaskStatus[int]) -> None:
    await trio.sleep(arg)
    task_status.started("hi")  # E: Argument 1 to "started" of "TaskStatus" has incompatible type "str"; expected "int"
    task_status.started()  # E: Missing positional argument "value" in call to "started" of "TaskStatus"

async def child2(
    arg: int, *, task_status: TaskStatus[None] = trio.TASK_STATUS_IGNORED
) -> None:
    await trio.sleep(arg)
    task_status.started()
    task_status.started(None)
    await child(arg, task_status=task_status)  # E: Argument "task_status" to "child" has incompatible type "TaskStatus[None]"; expected "TaskStatus[int]"

async def parent() -> None:
    async with trio.open_nursery() as nursery:
        nursery.start_soon(child, 10)  # E: Argument 1 to "start_soon" of "Nursery" has incompatible type "Callable[[int, NamedArg(TaskStatus[int], 'task_status')], Coroutine[Any, Any, None]]"; expected "Callable[[int], Awaitable[Any]]"
        nursery.start_soon(child2)  # E: Argument 1 to "start_soon" of "Nursery" has incompatible type "Callable[[int, DefaultNamedArg(TaskStatus[None], 'task_status')], Coroutine[Any, Any, None]]"; expected "Callable[[], Awaitable[Any]]"
        nursery.start_soon(child2, "hi")  # E: Argument 1 to "start_soon" of "Nursery" has incompatible type "Callable[[int, DefaultNamedArg(TaskStatus[None], 'task_status')], Coroutine[Any, Any, None]]"; expected "Callable[[str], Awaitable[Any]]"
        nursery.start_soon(child2, 50)
        await nursery.start(child)  # E: Argument 1 to "start" of "Nursery" has incompatible type "Callable[[int, NamedArg(TaskStatus[int], 'task_status')], Coroutine[Any, Any, None]]"; expected "Callable[[NamedArg(TaskStatus[int], 'task_status')], Awaitable[Any]]"
        await nursery.start(child, "hi")  # E: Argument 1 to "start" of "Nursery" has incompatible type "Callable[[int, NamedArg(TaskStatus[int], 'task_status')], Coroutine[Any, Any, None]]"; expected "Callable[[str, NamedArg(TaskStatus[int], 'task_status')], Awaitable[Any]]"
        result = await nursery.start(child, 10)
        result2 = await nursery.start(child2, 10)  # E: Function does not return a value (it only ever returns None)
        await nursery.start(child2, 10)
        reveal_type(result)  # N: Revealed type is "builtins.int"

[case testTaskStatus_NoPlugin]
import trio
from trio_typing import TaskStatus

async def child(arg: int, *, task_status: TaskStatus[int]) -> None:
    await trio.sleep(arg)
    task_status.started("hi")  # E: Argument 1 to "started" of "TaskStatus" has incompatible type "str"; expected "int"
    task_status.started()  # E: Missing positional argument "value" in call to "started" of "TaskStatus"

async def child2(
    arg: int, *, task_status: TaskStatus[None] = trio.TASK_STATUS_IGNORED
) -> None:
    await trio.sleep(arg)
    task_status.started()
    task_status.started(None)
    await child(arg, task_status=task_status)  # E: Argument "task_status" to "child" has incompatible type "TaskStatus[None]"; expected "TaskStatus[int]"

async def parent() -> None:
    async with trio.open_nursery() as nursery:
        nursery.start_soon(child, 10)  # E: Argument 1 to "start_soon" of "Nursery" has incompatible type "Callable[[int, NamedArg(TaskStatus[int], 'task_status')], Coroutine[Any, Any, None]]"; expected "Union[Callable[[], Awaitable[Any]], Callable[[Any], Awaitable[Any]], Callable[[Any, Any], Awaitable[Any]], Callable[[Any, Any, Any], Awaitable[Any]], Callable[[Any, Any, Any, Any], Awaitable[Any]], Callable[[VarArg(Any)], Awaitable[Any]]]"
        nursery.start_soon(child2)
        nursery.start_soon(child2, "hi")
        nursery.start_soon(child2, 50)
        await nursery.start(child)
        await nursery.start(child, "hi")
        result = await nursery.start(child, 10)
        result2 = await nursery.start(child2, 10)  # E: Function does not return a value (it only ever returns None)
        await nursery.start(child2, 10)
        reveal_type(result)  # N: Revealed type is "builtins.int"
