import functools from langgraph.utils import is_async_callable, is_async_generator def test_is_async() -> None: async def func() -> None: pass assert is_async_callable(func) wrapped_func = functools.wraps(func)(func) assert is_async_callable(wrapped_func) def sync_func() -> None: pass assert not is_async_callable(sync_func) wrapped_sync_func = functools.wraps(sync_func)(sync_func) assert not is_async_callable(wrapped_sync_func) class AsyncFuncCallable: async def __call__(self) -> None: pass runnable = AsyncFuncCallable() assert is_async_callable(runnable) wrapped_runnable = functools.wraps(runnable)(runnable) assert is_async_callable(wrapped_runnable) class SyncFuncCallable: def __call__(self) -> None: pass sync_runnable = SyncFuncCallable() assert not is_async_callable(sync_runnable) wrapped_sync_runnable = functools.wraps(sync_runnable)(sync_runnable) assert not is_async_callable(wrapped_sync_runnable) def test_is_generator() -> None: async def gen(): yield assert is_async_generator(gen) wrapped_gen = functools.wraps(gen)(gen) assert is_async_generator(wrapped_gen) def sync_gen(): yield assert not is_async_generator(sync_gen) wrapped_sync_gen = functools.wraps(sync_gen)(sync_gen) assert not is_async_generator(wrapped_sync_gen) class AsyncGenCallable: async def __call__(self): yield runnable = AsyncGenCallable() assert is_async_generator(runnable) wrapped_runnable = functools.wraps(runnable)(runnable) assert is_async_generator(wrapped_runnable) class SyncGenCallable: def __call__(self): yield sync_runnable = SyncGenCallable() assert not is_async_generator(sync_runnable) wrapped_sync_runnable = functools.wraps(sync_runnable)(sync_runnable) assert not is_async_generator(wrapped_sync_runnable)