1# cython: language_level=3str, binding=True
2# mode: run
3# tag: pep492, await, gh3337
4
5"""
6Cython specific tests in addition to "test_coroutines_pep492.pyx"
7(which is copied from CPython).
8"""
9
10import sys
11
12
13def run_async(coro):
14    #assert coro.__class__ is types.GeneratorType
15    assert coro.__class__.__name__ in ('coroutine', '_GeneratorWrapper'), coro.__class__.__name__
16
17    buffer = []
18    result = None
19    while True:
20        try:
21            buffer.append(coro.send(None))
22        except StopIteration as ex:
23            result = ex.value if sys.version_info >= (3, 5) else ex.args[0] if ex.args else None
24            break
25    return buffer, result
26
27
28async def test_async_temp_gh3337(x, y):
29    """
30    >>> run_async(test_async_temp_gh3337(2, 3))
31    ([], -1)
32    >>> run_async(test_async_temp_gh3337(3, 2))
33    ([], 0)
34    """
35    return min(x - y, 0)
36
37
38async def outer_with_nested(called):
39    """
40    >>> called = []
41    >>> _, inner = run_async(outer_with_nested(called))
42    >>> called  # after outer_with_nested()
43    ['outer', 'make inner', 'deco', 'return inner']
44    >>> _ = run_async(inner())
45    >>> called  # after inner()
46    ['outer', 'make inner', 'deco', 'return inner', 'inner']
47    """
48    called.append('outer')
49
50    def deco(f):
51        called.append('deco')
52        return f
53
54    called.append('make inner')
55
56    @deco
57    async def inner():
58        called.append('inner')
59        return 1
60
61    called.append('return inner')
62    return inner
63