17db96d56Sopenharmony_ciimport inspect
27db96d56Sopenharmony_ciimport types
37db96d56Sopenharmony_ciimport unittest
47db96d56Sopenharmony_ciimport contextlib
57db96d56Sopenharmony_ci
67db96d56Sopenharmony_cifrom test.support.import_helper import import_module
77db96d56Sopenharmony_cifrom test.support import gc_collect, requires_working_socket
87db96d56Sopenharmony_ciasyncio = import_module("asyncio")
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_cirequires_working_socket(module=True)
127db96d56Sopenharmony_ci
137db96d56Sopenharmony_ci_no_default = object()
147db96d56Sopenharmony_ci
157db96d56Sopenharmony_ci
167db96d56Sopenharmony_ciclass AwaitException(Exception):
177db96d56Sopenharmony_ci    pass
187db96d56Sopenharmony_ci
197db96d56Sopenharmony_ci
207db96d56Sopenharmony_ci@types.coroutine
217db96d56Sopenharmony_cidef awaitable(*, throw=False):
227db96d56Sopenharmony_ci    if throw:
237db96d56Sopenharmony_ci        yield ('throw',)
247db96d56Sopenharmony_ci    else:
257db96d56Sopenharmony_ci        yield ('result',)
267db96d56Sopenharmony_ci
277db96d56Sopenharmony_ci
287db96d56Sopenharmony_cidef run_until_complete(coro):
297db96d56Sopenharmony_ci    exc = False
307db96d56Sopenharmony_ci    while True:
317db96d56Sopenharmony_ci        try:
327db96d56Sopenharmony_ci            if exc:
337db96d56Sopenharmony_ci                exc = False
347db96d56Sopenharmony_ci                fut = coro.throw(AwaitException)
357db96d56Sopenharmony_ci            else:
367db96d56Sopenharmony_ci                fut = coro.send(None)
377db96d56Sopenharmony_ci        except StopIteration as ex:
387db96d56Sopenharmony_ci            return ex.args[0]
397db96d56Sopenharmony_ci
407db96d56Sopenharmony_ci        if fut == ('throw',):
417db96d56Sopenharmony_ci            exc = True
427db96d56Sopenharmony_ci
437db96d56Sopenharmony_ci
447db96d56Sopenharmony_cidef to_list(gen):
457db96d56Sopenharmony_ci    async def iterate():
467db96d56Sopenharmony_ci        res = []
477db96d56Sopenharmony_ci        async for i in gen:
487db96d56Sopenharmony_ci            res.append(i)
497db96d56Sopenharmony_ci        return res
507db96d56Sopenharmony_ci
517db96d56Sopenharmony_ci    return run_until_complete(iterate())
527db96d56Sopenharmony_ci
537db96d56Sopenharmony_ci
547db96d56Sopenharmony_cidef py_anext(iterator, default=_no_default):
557db96d56Sopenharmony_ci    """Pure-Python implementation of anext() for testing purposes.
567db96d56Sopenharmony_ci
577db96d56Sopenharmony_ci    Closely matches the builtin anext() C implementation.
587db96d56Sopenharmony_ci    Can be used to compare the built-in implementation of the inner
597db96d56Sopenharmony_ci    coroutines machinery to C-implementation of __anext__() and send()
607db96d56Sopenharmony_ci    or throw() on the returned generator.
617db96d56Sopenharmony_ci    """
627db96d56Sopenharmony_ci
637db96d56Sopenharmony_ci    try:
647db96d56Sopenharmony_ci        __anext__ = type(iterator).__anext__
657db96d56Sopenharmony_ci    except AttributeError:
667db96d56Sopenharmony_ci        raise TypeError(f'{iterator!r} is not an async iterator')
677db96d56Sopenharmony_ci
687db96d56Sopenharmony_ci    if default is _no_default:
697db96d56Sopenharmony_ci        return __anext__(iterator)
707db96d56Sopenharmony_ci
717db96d56Sopenharmony_ci    async def anext_impl():
727db96d56Sopenharmony_ci        try:
737db96d56Sopenharmony_ci            # The C code is way more low-level than this, as it implements
747db96d56Sopenharmony_ci            # all methods of the iterator protocol. In this implementation
757db96d56Sopenharmony_ci            # we're relying on higher-level coroutine concepts, but that's
767db96d56Sopenharmony_ci            # exactly what we want -- crosstest pure-Python high-level
777db96d56Sopenharmony_ci            # implementation and low-level C anext() iterators.
787db96d56Sopenharmony_ci            return await __anext__(iterator)
797db96d56Sopenharmony_ci        except StopAsyncIteration:
807db96d56Sopenharmony_ci            return default
817db96d56Sopenharmony_ci
827db96d56Sopenharmony_ci    return anext_impl()
837db96d56Sopenharmony_ci
847db96d56Sopenharmony_ci
857db96d56Sopenharmony_ciclass AsyncGenSyntaxTest(unittest.TestCase):
867db96d56Sopenharmony_ci
877db96d56Sopenharmony_ci    def test_async_gen_syntax_01(self):
887db96d56Sopenharmony_ci        code = '''async def foo():
897db96d56Sopenharmony_ci            await abc
907db96d56Sopenharmony_ci            yield from 123
917db96d56Sopenharmony_ci        '''
927db96d56Sopenharmony_ci
937db96d56Sopenharmony_ci        with self.assertRaisesRegex(SyntaxError, 'yield from.*inside async'):
947db96d56Sopenharmony_ci            exec(code, {}, {})
957db96d56Sopenharmony_ci
967db96d56Sopenharmony_ci    def test_async_gen_syntax_02(self):
977db96d56Sopenharmony_ci        code = '''async def foo():
987db96d56Sopenharmony_ci            yield from 123
997db96d56Sopenharmony_ci        '''
1007db96d56Sopenharmony_ci
1017db96d56Sopenharmony_ci        with self.assertRaisesRegex(SyntaxError, 'yield from.*inside async'):
1027db96d56Sopenharmony_ci            exec(code, {}, {})
1037db96d56Sopenharmony_ci
1047db96d56Sopenharmony_ci    def test_async_gen_syntax_03(self):
1057db96d56Sopenharmony_ci        code = '''async def foo():
1067db96d56Sopenharmony_ci            await abc
1077db96d56Sopenharmony_ci            yield
1087db96d56Sopenharmony_ci            return 123
1097db96d56Sopenharmony_ci        '''
1107db96d56Sopenharmony_ci
1117db96d56Sopenharmony_ci        with self.assertRaisesRegex(SyntaxError, 'return.*value.*async gen'):
1127db96d56Sopenharmony_ci            exec(code, {}, {})
1137db96d56Sopenharmony_ci
1147db96d56Sopenharmony_ci    def test_async_gen_syntax_04(self):
1157db96d56Sopenharmony_ci        code = '''async def foo():
1167db96d56Sopenharmony_ci            yield
1177db96d56Sopenharmony_ci            return 123
1187db96d56Sopenharmony_ci        '''
1197db96d56Sopenharmony_ci
1207db96d56Sopenharmony_ci        with self.assertRaisesRegex(SyntaxError, 'return.*value.*async gen'):
1217db96d56Sopenharmony_ci            exec(code, {}, {})
1227db96d56Sopenharmony_ci
1237db96d56Sopenharmony_ci    def test_async_gen_syntax_05(self):
1247db96d56Sopenharmony_ci        code = '''async def foo():
1257db96d56Sopenharmony_ci            if 0:
1267db96d56Sopenharmony_ci                yield
1277db96d56Sopenharmony_ci            return 12
1287db96d56Sopenharmony_ci        '''
1297db96d56Sopenharmony_ci
1307db96d56Sopenharmony_ci        with self.assertRaisesRegex(SyntaxError, 'return.*value.*async gen'):
1317db96d56Sopenharmony_ci            exec(code, {}, {})
1327db96d56Sopenharmony_ci
1337db96d56Sopenharmony_ci
1347db96d56Sopenharmony_ciclass AsyncGenTest(unittest.TestCase):
1357db96d56Sopenharmony_ci
1367db96d56Sopenharmony_ci    def compare_generators(self, sync_gen, async_gen):
1377db96d56Sopenharmony_ci        def sync_iterate(g):
1387db96d56Sopenharmony_ci            res = []
1397db96d56Sopenharmony_ci            while True:
1407db96d56Sopenharmony_ci                try:
1417db96d56Sopenharmony_ci                    res.append(g.__next__())
1427db96d56Sopenharmony_ci                except StopIteration:
1437db96d56Sopenharmony_ci                    res.append('STOP')
1447db96d56Sopenharmony_ci                    break
1457db96d56Sopenharmony_ci                except Exception as ex:
1467db96d56Sopenharmony_ci                    res.append(str(type(ex)))
1477db96d56Sopenharmony_ci            return res
1487db96d56Sopenharmony_ci
1497db96d56Sopenharmony_ci        def async_iterate(g):
1507db96d56Sopenharmony_ci            res = []
1517db96d56Sopenharmony_ci            while True:
1527db96d56Sopenharmony_ci                an = g.__anext__()
1537db96d56Sopenharmony_ci                try:
1547db96d56Sopenharmony_ci                    while True:
1557db96d56Sopenharmony_ci                        try:
1567db96d56Sopenharmony_ci                            an.__next__()
1577db96d56Sopenharmony_ci                        except StopIteration as ex:
1587db96d56Sopenharmony_ci                            if ex.args:
1597db96d56Sopenharmony_ci                                res.append(ex.args[0])
1607db96d56Sopenharmony_ci                                break
1617db96d56Sopenharmony_ci                            else:
1627db96d56Sopenharmony_ci                                res.append('EMPTY StopIteration')
1637db96d56Sopenharmony_ci                                break
1647db96d56Sopenharmony_ci                        except StopAsyncIteration:
1657db96d56Sopenharmony_ci                            raise
1667db96d56Sopenharmony_ci                        except Exception as ex:
1677db96d56Sopenharmony_ci                            res.append(str(type(ex)))
1687db96d56Sopenharmony_ci                            break
1697db96d56Sopenharmony_ci                except StopAsyncIteration:
1707db96d56Sopenharmony_ci                    res.append('STOP')
1717db96d56Sopenharmony_ci                    break
1727db96d56Sopenharmony_ci            return res
1737db96d56Sopenharmony_ci
1747db96d56Sopenharmony_ci        sync_gen_result = sync_iterate(sync_gen)
1757db96d56Sopenharmony_ci        async_gen_result = async_iterate(async_gen)
1767db96d56Sopenharmony_ci        self.assertEqual(sync_gen_result, async_gen_result)
1777db96d56Sopenharmony_ci        return async_gen_result
1787db96d56Sopenharmony_ci
1797db96d56Sopenharmony_ci    def test_async_gen_iteration_01(self):
1807db96d56Sopenharmony_ci        async def gen():
1817db96d56Sopenharmony_ci            await awaitable()
1827db96d56Sopenharmony_ci            a = yield 123
1837db96d56Sopenharmony_ci            self.assertIs(a, None)
1847db96d56Sopenharmony_ci            await awaitable()
1857db96d56Sopenharmony_ci            yield 456
1867db96d56Sopenharmony_ci            await awaitable()
1877db96d56Sopenharmony_ci            yield 789
1887db96d56Sopenharmony_ci
1897db96d56Sopenharmony_ci        self.assertEqual(to_list(gen()), [123, 456, 789])
1907db96d56Sopenharmony_ci
1917db96d56Sopenharmony_ci    def test_async_gen_iteration_02(self):
1927db96d56Sopenharmony_ci        async def gen():
1937db96d56Sopenharmony_ci            await awaitable()
1947db96d56Sopenharmony_ci            yield 123
1957db96d56Sopenharmony_ci            await awaitable()
1967db96d56Sopenharmony_ci
1977db96d56Sopenharmony_ci        g = gen()
1987db96d56Sopenharmony_ci        ai = g.__aiter__()
1997db96d56Sopenharmony_ci
2007db96d56Sopenharmony_ci        an = ai.__anext__()
2017db96d56Sopenharmony_ci        self.assertEqual(an.__next__(), ('result',))
2027db96d56Sopenharmony_ci
2037db96d56Sopenharmony_ci        try:
2047db96d56Sopenharmony_ci            an.__next__()
2057db96d56Sopenharmony_ci        except StopIteration as ex:
2067db96d56Sopenharmony_ci            self.assertEqual(ex.args[0], 123)
2077db96d56Sopenharmony_ci        else:
2087db96d56Sopenharmony_ci            self.fail('StopIteration was not raised')
2097db96d56Sopenharmony_ci
2107db96d56Sopenharmony_ci        an = ai.__anext__()
2117db96d56Sopenharmony_ci        self.assertEqual(an.__next__(), ('result',))
2127db96d56Sopenharmony_ci
2137db96d56Sopenharmony_ci        try:
2147db96d56Sopenharmony_ci            an.__next__()
2157db96d56Sopenharmony_ci        except StopAsyncIteration as ex:
2167db96d56Sopenharmony_ci            self.assertFalse(ex.args)
2177db96d56Sopenharmony_ci        else:
2187db96d56Sopenharmony_ci            self.fail('StopAsyncIteration was not raised')
2197db96d56Sopenharmony_ci
2207db96d56Sopenharmony_ci    def test_async_gen_exception_03(self):
2217db96d56Sopenharmony_ci        async def gen():
2227db96d56Sopenharmony_ci            await awaitable()
2237db96d56Sopenharmony_ci            yield 123
2247db96d56Sopenharmony_ci            await awaitable(throw=True)
2257db96d56Sopenharmony_ci            yield 456
2267db96d56Sopenharmony_ci
2277db96d56Sopenharmony_ci        with self.assertRaises(AwaitException):
2287db96d56Sopenharmony_ci            to_list(gen())
2297db96d56Sopenharmony_ci
2307db96d56Sopenharmony_ci    def test_async_gen_exception_04(self):
2317db96d56Sopenharmony_ci        async def gen():
2327db96d56Sopenharmony_ci            await awaitable()
2337db96d56Sopenharmony_ci            yield 123
2347db96d56Sopenharmony_ci            1 / 0
2357db96d56Sopenharmony_ci
2367db96d56Sopenharmony_ci        g = gen()
2377db96d56Sopenharmony_ci        ai = g.__aiter__()
2387db96d56Sopenharmony_ci        an = ai.__anext__()
2397db96d56Sopenharmony_ci        self.assertEqual(an.__next__(), ('result',))
2407db96d56Sopenharmony_ci
2417db96d56Sopenharmony_ci        try:
2427db96d56Sopenharmony_ci            an.__next__()
2437db96d56Sopenharmony_ci        except StopIteration as ex:
2447db96d56Sopenharmony_ci            self.assertEqual(ex.args[0], 123)
2457db96d56Sopenharmony_ci        else:
2467db96d56Sopenharmony_ci            self.fail('StopIteration was not raised')
2477db96d56Sopenharmony_ci
2487db96d56Sopenharmony_ci        with self.assertRaises(ZeroDivisionError):
2497db96d56Sopenharmony_ci            ai.__anext__().__next__()
2507db96d56Sopenharmony_ci
2517db96d56Sopenharmony_ci    def test_async_gen_exception_05(self):
2527db96d56Sopenharmony_ci        async def gen():
2537db96d56Sopenharmony_ci            yield 123
2547db96d56Sopenharmony_ci            raise StopAsyncIteration
2557db96d56Sopenharmony_ci
2567db96d56Sopenharmony_ci        with self.assertRaisesRegex(RuntimeError,
2577db96d56Sopenharmony_ci                                    'async generator.*StopAsyncIteration'):
2587db96d56Sopenharmony_ci            to_list(gen())
2597db96d56Sopenharmony_ci
2607db96d56Sopenharmony_ci    def test_async_gen_exception_06(self):
2617db96d56Sopenharmony_ci        async def gen():
2627db96d56Sopenharmony_ci            yield 123
2637db96d56Sopenharmony_ci            raise StopIteration
2647db96d56Sopenharmony_ci
2657db96d56Sopenharmony_ci        with self.assertRaisesRegex(RuntimeError,
2667db96d56Sopenharmony_ci                                    'async generator.*StopIteration'):
2677db96d56Sopenharmony_ci            to_list(gen())
2687db96d56Sopenharmony_ci
2697db96d56Sopenharmony_ci    def test_async_gen_exception_07(self):
2707db96d56Sopenharmony_ci        def sync_gen():
2717db96d56Sopenharmony_ci            try:
2727db96d56Sopenharmony_ci                yield 1
2737db96d56Sopenharmony_ci                1 / 0
2747db96d56Sopenharmony_ci            finally:
2757db96d56Sopenharmony_ci                yield 2
2767db96d56Sopenharmony_ci                yield 3
2777db96d56Sopenharmony_ci
2787db96d56Sopenharmony_ci            yield 100
2797db96d56Sopenharmony_ci
2807db96d56Sopenharmony_ci        async def async_gen():
2817db96d56Sopenharmony_ci            try:
2827db96d56Sopenharmony_ci                yield 1
2837db96d56Sopenharmony_ci                1 / 0
2847db96d56Sopenharmony_ci            finally:
2857db96d56Sopenharmony_ci                yield 2
2867db96d56Sopenharmony_ci                yield 3
2877db96d56Sopenharmony_ci
2887db96d56Sopenharmony_ci            yield 100
2897db96d56Sopenharmony_ci
2907db96d56Sopenharmony_ci        self.compare_generators(sync_gen(), async_gen())
2917db96d56Sopenharmony_ci
2927db96d56Sopenharmony_ci    def test_async_gen_exception_08(self):
2937db96d56Sopenharmony_ci        def sync_gen():
2947db96d56Sopenharmony_ci            try:
2957db96d56Sopenharmony_ci                yield 1
2967db96d56Sopenharmony_ci            finally:
2977db96d56Sopenharmony_ci                yield 2
2987db96d56Sopenharmony_ci                1 / 0
2997db96d56Sopenharmony_ci                yield 3
3007db96d56Sopenharmony_ci
3017db96d56Sopenharmony_ci            yield 100
3027db96d56Sopenharmony_ci
3037db96d56Sopenharmony_ci        async def async_gen():
3047db96d56Sopenharmony_ci            try:
3057db96d56Sopenharmony_ci                yield 1
3067db96d56Sopenharmony_ci                await awaitable()
3077db96d56Sopenharmony_ci            finally:
3087db96d56Sopenharmony_ci                await awaitable()
3097db96d56Sopenharmony_ci                yield 2
3107db96d56Sopenharmony_ci                1 / 0
3117db96d56Sopenharmony_ci                yield 3
3127db96d56Sopenharmony_ci
3137db96d56Sopenharmony_ci            yield 100
3147db96d56Sopenharmony_ci
3157db96d56Sopenharmony_ci        self.compare_generators(sync_gen(), async_gen())
3167db96d56Sopenharmony_ci
3177db96d56Sopenharmony_ci    def test_async_gen_exception_09(self):
3187db96d56Sopenharmony_ci        def sync_gen():
3197db96d56Sopenharmony_ci            try:
3207db96d56Sopenharmony_ci                yield 1
3217db96d56Sopenharmony_ci                1 / 0
3227db96d56Sopenharmony_ci            finally:
3237db96d56Sopenharmony_ci                yield 2
3247db96d56Sopenharmony_ci                yield 3
3257db96d56Sopenharmony_ci
3267db96d56Sopenharmony_ci            yield 100
3277db96d56Sopenharmony_ci
3287db96d56Sopenharmony_ci        async def async_gen():
3297db96d56Sopenharmony_ci            try:
3307db96d56Sopenharmony_ci                await awaitable()
3317db96d56Sopenharmony_ci                yield 1
3327db96d56Sopenharmony_ci                1 / 0
3337db96d56Sopenharmony_ci            finally:
3347db96d56Sopenharmony_ci                yield 2
3357db96d56Sopenharmony_ci                await awaitable()
3367db96d56Sopenharmony_ci                yield 3
3377db96d56Sopenharmony_ci
3387db96d56Sopenharmony_ci            yield 100
3397db96d56Sopenharmony_ci
3407db96d56Sopenharmony_ci        self.compare_generators(sync_gen(), async_gen())
3417db96d56Sopenharmony_ci
3427db96d56Sopenharmony_ci    def test_async_gen_exception_10(self):
3437db96d56Sopenharmony_ci        async def gen():
3447db96d56Sopenharmony_ci            yield 123
3457db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError,
3467db96d56Sopenharmony_ci                                    "non-None value .* async generator"):
3477db96d56Sopenharmony_ci            gen().__anext__().send(100)
3487db96d56Sopenharmony_ci
3497db96d56Sopenharmony_ci    def test_async_gen_exception_11(self):
3507db96d56Sopenharmony_ci        def sync_gen():
3517db96d56Sopenharmony_ci            yield 10
3527db96d56Sopenharmony_ci            yield 20
3537db96d56Sopenharmony_ci
3547db96d56Sopenharmony_ci        def sync_gen_wrapper():
3557db96d56Sopenharmony_ci            yield 1
3567db96d56Sopenharmony_ci            sg = sync_gen()
3577db96d56Sopenharmony_ci            sg.send(None)
3587db96d56Sopenharmony_ci            try:
3597db96d56Sopenharmony_ci                sg.throw(GeneratorExit())
3607db96d56Sopenharmony_ci            except GeneratorExit:
3617db96d56Sopenharmony_ci                yield 2
3627db96d56Sopenharmony_ci            yield 3
3637db96d56Sopenharmony_ci
3647db96d56Sopenharmony_ci        async def async_gen():
3657db96d56Sopenharmony_ci            yield 10
3667db96d56Sopenharmony_ci            yield 20
3677db96d56Sopenharmony_ci
3687db96d56Sopenharmony_ci        async def async_gen_wrapper():
3697db96d56Sopenharmony_ci            yield 1
3707db96d56Sopenharmony_ci            asg = async_gen()
3717db96d56Sopenharmony_ci            await asg.asend(None)
3727db96d56Sopenharmony_ci            try:
3737db96d56Sopenharmony_ci                await asg.athrow(GeneratorExit())
3747db96d56Sopenharmony_ci            except GeneratorExit:
3757db96d56Sopenharmony_ci                yield 2
3767db96d56Sopenharmony_ci            yield 3
3777db96d56Sopenharmony_ci
3787db96d56Sopenharmony_ci        self.compare_generators(sync_gen_wrapper(), async_gen_wrapper())
3797db96d56Sopenharmony_ci
3807db96d56Sopenharmony_ci    def test_async_gen_api_01(self):
3817db96d56Sopenharmony_ci        async def gen():
3827db96d56Sopenharmony_ci            yield 123
3837db96d56Sopenharmony_ci
3847db96d56Sopenharmony_ci        g = gen()
3857db96d56Sopenharmony_ci
3867db96d56Sopenharmony_ci        self.assertEqual(g.__name__, 'gen')
3877db96d56Sopenharmony_ci        g.__name__ = '123'
3887db96d56Sopenharmony_ci        self.assertEqual(g.__name__, '123')
3897db96d56Sopenharmony_ci
3907db96d56Sopenharmony_ci        self.assertIn('.gen', g.__qualname__)
3917db96d56Sopenharmony_ci        g.__qualname__ = '123'
3927db96d56Sopenharmony_ci        self.assertEqual(g.__qualname__, '123')
3937db96d56Sopenharmony_ci
3947db96d56Sopenharmony_ci        self.assertIsNone(g.ag_await)
3957db96d56Sopenharmony_ci        self.assertIsInstance(g.ag_frame, types.FrameType)
3967db96d56Sopenharmony_ci        self.assertFalse(g.ag_running)
3977db96d56Sopenharmony_ci        self.assertIsInstance(g.ag_code, types.CodeType)
3987db96d56Sopenharmony_ci
3997db96d56Sopenharmony_ci        self.assertTrue(inspect.isawaitable(g.aclose()))
4007db96d56Sopenharmony_ci
4017db96d56Sopenharmony_ci
4027db96d56Sopenharmony_ciclass AsyncGenAsyncioTest(unittest.TestCase):
4037db96d56Sopenharmony_ci
4047db96d56Sopenharmony_ci    def setUp(self):
4057db96d56Sopenharmony_ci        self.loop = asyncio.new_event_loop()
4067db96d56Sopenharmony_ci        asyncio.set_event_loop(None)
4077db96d56Sopenharmony_ci
4087db96d56Sopenharmony_ci    def tearDown(self):
4097db96d56Sopenharmony_ci        self.loop.close()
4107db96d56Sopenharmony_ci        self.loop = None
4117db96d56Sopenharmony_ci        asyncio.set_event_loop_policy(None)
4127db96d56Sopenharmony_ci
4137db96d56Sopenharmony_ci    def check_async_iterator_anext(self, ait_class):
4147db96d56Sopenharmony_ci        with self.subTest(anext="pure-Python"):
4157db96d56Sopenharmony_ci            self._check_async_iterator_anext(ait_class, py_anext)
4167db96d56Sopenharmony_ci        with self.subTest(anext="builtin"):
4177db96d56Sopenharmony_ci            self._check_async_iterator_anext(ait_class, anext)
4187db96d56Sopenharmony_ci
4197db96d56Sopenharmony_ci    def _check_async_iterator_anext(self, ait_class, anext):
4207db96d56Sopenharmony_ci        g = ait_class()
4217db96d56Sopenharmony_ci        async def consume():
4227db96d56Sopenharmony_ci            results = []
4237db96d56Sopenharmony_ci            results.append(await anext(g))
4247db96d56Sopenharmony_ci            results.append(await anext(g))
4257db96d56Sopenharmony_ci            results.append(await anext(g, 'buckle my shoe'))
4267db96d56Sopenharmony_ci            return results
4277db96d56Sopenharmony_ci        res = self.loop.run_until_complete(consume())
4287db96d56Sopenharmony_ci        self.assertEqual(res, [1, 2, 'buckle my shoe'])
4297db96d56Sopenharmony_ci        with self.assertRaises(StopAsyncIteration):
4307db96d56Sopenharmony_ci            self.loop.run_until_complete(consume())
4317db96d56Sopenharmony_ci
4327db96d56Sopenharmony_ci        async def test_2():
4337db96d56Sopenharmony_ci            g1 = ait_class()
4347db96d56Sopenharmony_ci            self.assertEqual(await anext(g1), 1)
4357db96d56Sopenharmony_ci            self.assertEqual(await anext(g1), 2)
4367db96d56Sopenharmony_ci            with self.assertRaises(StopAsyncIteration):
4377db96d56Sopenharmony_ci                await anext(g1)
4387db96d56Sopenharmony_ci            with self.assertRaises(StopAsyncIteration):
4397db96d56Sopenharmony_ci                await anext(g1)
4407db96d56Sopenharmony_ci
4417db96d56Sopenharmony_ci            g2 = ait_class()
4427db96d56Sopenharmony_ci            self.assertEqual(await anext(g2, "default"), 1)
4437db96d56Sopenharmony_ci            self.assertEqual(await anext(g2, "default"), 2)
4447db96d56Sopenharmony_ci            self.assertEqual(await anext(g2, "default"), "default")
4457db96d56Sopenharmony_ci            self.assertEqual(await anext(g2, "default"), "default")
4467db96d56Sopenharmony_ci
4477db96d56Sopenharmony_ci            return "completed"
4487db96d56Sopenharmony_ci
4497db96d56Sopenharmony_ci        result = self.loop.run_until_complete(test_2())
4507db96d56Sopenharmony_ci        self.assertEqual(result, "completed")
4517db96d56Sopenharmony_ci
4527db96d56Sopenharmony_ci        def test_send():
4537db96d56Sopenharmony_ci            p = ait_class()
4547db96d56Sopenharmony_ci            obj = anext(p, "completed")
4557db96d56Sopenharmony_ci            with self.assertRaises(StopIteration):
4567db96d56Sopenharmony_ci                with contextlib.closing(obj.__await__()) as g:
4577db96d56Sopenharmony_ci                    g.send(None)
4587db96d56Sopenharmony_ci
4597db96d56Sopenharmony_ci        test_send()
4607db96d56Sopenharmony_ci
4617db96d56Sopenharmony_ci        async def test_throw():
4627db96d56Sopenharmony_ci            p = ait_class()
4637db96d56Sopenharmony_ci            obj = anext(p, "completed")
4647db96d56Sopenharmony_ci            self.assertRaises(SyntaxError, obj.throw, SyntaxError)
4657db96d56Sopenharmony_ci            return "completed"
4667db96d56Sopenharmony_ci
4677db96d56Sopenharmony_ci        result = self.loop.run_until_complete(test_throw())
4687db96d56Sopenharmony_ci        self.assertEqual(result, "completed")
4697db96d56Sopenharmony_ci
4707db96d56Sopenharmony_ci    def test_async_generator_anext(self):
4717db96d56Sopenharmony_ci        async def agen():
4727db96d56Sopenharmony_ci            yield 1
4737db96d56Sopenharmony_ci            yield 2
4747db96d56Sopenharmony_ci        self.check_async_iterator_anext(agen)
4757db96d56Sopenharmony_ci
4767db96d56Sopenharmony_ci    def test_python_async_iterator_anext(self):
4777db96d56Sopenharmony_ci        class MyAsyncIter:
4787db96d56Sopenharmony_ci            """Asynchronously yield 1, then 2."""
4797db96d56Sopenharmony_ci            def __init__(self):
4807db96d56Sopenharmony_ci                self.yielded = 0
4817db96d56Sopenharmony_ci            def __aiter__(self):
4827db96d56Sopenharmony_ci                return self
4837db96d56Sopenharmony_ci            async def __anext__(self):
4847db96d56Sopenharmony_ci                if self.yielded >= 2:
4857db96d56Sopenharmony_ci                    raise StopAsyncIteration()
4867db96d56Sopenharmony_ci                else:
4877db96d56Sopenharmony_ci                    self.yielded += 1
4887db96d56Sopenharmony_ci                    return self.yielded
4897db96d56Sopenharmony_ci        self.check_async_iterator_anext(MyAsyncIter)
4907db96d56Sopenharmony_ci
4917db96d56Sopenharmony_ci    def test_python_async_iterator_types_coroutine_anext(self):
4927db96d56Sopenharmony_ci        import types
4937db96d56Sopenharmony_ci        class MyAsyncIterWithTypesCoro:
4947db96d56Sopenharmony_ci            """Asynchronously yield 1, then 2."""
4957db96d56Sopenharmony_ci            def __init__(self):
4967db96d56Sopenharmony_ci                self.yielded = 0
4977db96d56Sopenharmony_ci            def __aiter__(self):
4987db96d56Sopenharmony_ci                return self
4997db96d56Sopenharmony_ci            @types.coroutine
5007db96d56Sopenharmony_ci            def __anext__(self):
5017db96d56Sopenharmony_ci                if False:
5027db96d56Sopenharmony_ci                    yield "this is a generator-based coroutine"
5037db96d56Sopenharmony_ci                if self.yielded >= 2:
5047db96d56Sopenharmony_ci                    raise StopAsyncIteration()
5057db96d56Sopenharmony_ci                else:
5067db96d56Sopenharmony_ci                    self.yielded += 1
5077db96d56Sopenharmony_ci                    return self.yielded
5087db96d56Sopenharmony_ci        self.check_async_iterator_anext(MyAsyncIterWithTypesCoro)
5097db96d56Sopenharmony_ci
5107db96d56Sopenharmony_ci    def test_async_gen_aiter(self):
5117db96d56Sopenharmony_ci        async def gen():
5127db96d56Sopenharmony_ci            yield 1
5137db96d56Sopenharmony_ci            yield 2
5147db96d56Sopenharmony_ci        g = gen()
5157db96d56Sopenharmony_ci        async def consume():
5167db96d56Sopenharmony_ci            return [i async for i in aiter(g)]
5177db96d56Sopenharmony_ci        res = self.loop.run_until_complete(consume())
5187db96d56Sopenharmony_ci        self.assertEqual(res, [1, 2])
5197db96d56Sopenharmony_ci
5207db96d56Sopenharmony_ci    def test_async_gen_aiter_class(self):
5217db96d56Sopenharmony_ci        results = []
5227db96d56Sopenharmony_ci        class Gen:
5237db96d56Sopenharmony_ci            async def __aiter__(self):
5247db96d56Sopenharmony_ci                yield 1
5257db96d56Sopenharmony_ci                yield 2
5267db96d56Sopenharmony_ci        g = Gen()
5277db96d56Sopenharmony_ci        async def consume():
5287db96d56Sopenharmony_ci            ait = aiter(g)
5297db96d56Sopenharmony_ci            while True:
5307db96d56Sopenharmony_ci                try:
5317db96d56Sopenharmony_ci                    results.append(await anext(ait))
5327db96d56Sopenharmony_ci                except StopAsyncIteration:
5337db96d56Sopenharmony_ci                    break
5347db96d56Sopenharmony_ci        self.loop.run_until_complete(consume())
5357db96d56Sopenharmony_ci        self.assertEqual(results, [1, 2])
5367db96d56Sopenharmony_ci
5377db96d56Sopenharmony_ci    def test_aiter_idempotent(self):
5387db96d56Sopenharmony_ci        async def gen():
5397db96d56Sopenharmony_ci            yield 1
5407db96d56Sopenharmony_ci        applied_once = aiter(gen())
5417db96d56Sopenharmony_ci        applied_twice = aiter(applied_once)
5427db96d56Sopenharmony_ci        self.assertIs(applied_once, applied_twice)
5437db96d56Sopenharmony_ci
5447db96d56Sopenharmony_ci    def test_anext_bad_args(self):
5457db96d56Sopenharmony_ci        async def gen():
5467db96d56Sopenharmony_ci            yield 1
5477db96d56Sopenharmony_ci        async def call_with_too_few_args():
5487db96d56Sopenharmony_ci            await anext()
5497db96d56Sopenharmony_ci        async def call_with_too_many_args():
5507db96d56Sopenharmony_ci            await anext(gen(), 1, 3)
5517db96d56Sopenharmony_ci        async def call_with_wrong_type_args():
5527db96d56Sopenharmony_ci            await anext(1, gen())
5537db96d56Sopenharmony_ci        async def call_with_kwarg():
5547db96d56Sopenharmony_ci            await anext(aiterator=gen())
5557db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
5567db96d56Sopenharmony_ci            self.loop.run_until_complete(call_with_too_few_args())
5577db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
5587db96d56Sopenharmony_ci            self.loop.run_until_complete(call_with_too_many_args())
5597db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
5607db96d56Sopenharmony_ci            self.loop.run_until_complete(call_with_wrong_type_args())
5617db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
5627db96d56Sopenharmony_ci            self.loop.run_until_complete(call_with_kwarg())
5637db96d56Sopenharmony_ci
5647db96d56Sopenharmony_ci    def test_anext_bad_await(self):
5657db96d56Sopenharmony_ci        async def bad_awaitable():
5667db96d56Sopenharmony_ci            class BadAwaitable:
5677db96d56Sopenharmony_ci                def __await__(self):
5687db96d56Sopenharmony_ci                    return 42
5697db96d56Sopenharmony_ci            class MyAsyncIter:
5707db96d56Sopenharmony_ci                def __aiter__(self):
5717db96d56Sopenharmony_ci                    return self
5727db96d56Sopenharmony_ci                def __anext__(self):
5737db96d56Sopenharmony_ci                    return BadAwaitable()
5747db96d56Sopenharmony_ci            regex = r"__await__.*iterator"
5757db96d56Sopenharmony_ci            awaitable = anext(MyAsyncIter(), "default")
5767db96d56Sopenharmony_ci            with self.assertRaisesRegex(TypeError, regex):
5777db96d56Sopenharmony_ci                await awaitable
5787db96d56Sopenharmony_ci            awaitable = anext(MyAsyncIter())
5797db96d56Sopenharmony_ci            with self.assertRaisesRegex(TypeError, regex):
5807db96d56Sopenharmony_ci                await awaitable
5817db96d56Sopenharmony_ci            return "completed"
5827db96d56Sopenharmony_ci        result = self.loop.run_until_complete(bad_awaitable())
5837db96d56Sopenharmony_ci        self.assertEqual(result, "completed")
5847db96d56Sopenharmony_ci
5857db96d56Sopenharmony_ci    async def check_anext_returning_iterator(self, aiter_class):
5867db96d56Sopenharmony_ci        awaitable = anext(aiter_class(), "default")
5877db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
5887db96d56Sopenharmony_ci            await awaitable
5897db96d56Sopenharmony_ci        awaitable = anext(aiter_class())
5907db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
5917db96d56Sopenharmony_ci            await awaitable
5927db96d56Sopenharmony_ci        return "completed"
5937db96d56Sopenharmony_ci
5947db96d56Sopenharmony_ci    def test_anext_return_iterator(self):
5957db96d56Sopenharmony_ci        class WithIterAnext:
5967db96d56Sopenharmony_ci            def __aiter__(self):
5977db96d56Sopenharmony_ci                return self
5987db96d56Sopenharmony_ci            def __anext__(self):
5997db96d56Sopenharmony_ci                return iter("abc")
6007db96d56Sopenharmony_ci        result = self.loop.run_until_complete(self.check_anext_returning_iterator(WithIterAnext))
6017db96d56Sopenharmony_ci        self.assertEqual(result, "completed")
6027db96d56Sopenharmony_ci
6037db96d56Sopenharmony_ci    def test_anext_return_generator(self):
6047db96d56Sopenharmony_ci        class WithGenAnext:
6057db96d56Sopenharmony_ci            def __aiter__(self):
6067db96d56Sopenharmony_ci                return self
6077db96d56Sopenharmony_ci            def __anext__(self):
6087db96d56Sopenharmony_ci                yield
6097db96d56Sopenharmony_ci        result = self.loop.run_until_complete(self.check_anext_returning_iterator(WithGenAnext))
6107db96d56Sopenharmony_ci        self.assertEqual(result, "completed")
6117db96d56Sopenharmony_ci
6127db96d56Sopenharmony_ci    def test_anext_await_raises(self):
6137db96d56Sopenharmony_ci        class RaisingAwaitable:
6147db96d56Sopenharmony_ci            def __await__(self):
6157db96d56Sopenharmony_ci                raise ZeroDivisionError()
6167db96d56Sopenharmony_ci                yield
6177db96d56Sopenharmony_ci        class WithRaisingAwaitableAnext:
6187db96d56Sopenharmony_ci            def __aiter__(self):
6197db96d56Sopenharmony_ci                return self
6207db96d56Sopenharmony_ci            def __anext__(self):
6217db96d56Sopenharmony_ci                return RaisingAwaitable()
6227db96d56Sopenharmony_ci        async def do_test():
6237db96d56Sopenharmony_ci            awaitable = anext(WithRaisingAwaitableAnext())
6247db96d56Sopenharmony_ci            with self.assertRaises(ZeroDivisionError):
6257db96d56Sopenharmony_ci                await awaitable
6267db96d56Sopenharmony_ci            awaitable = anext(WithRaisingAwaitableAnext(), "default")
6277db96d56Sopenharmony_ci            with self.assertRaises(ZeroDivisionError):
6287db96d56Sopenharmony_ci                await awaitable
6297db96d56Sopenharmony_ci            return "completed"
6307db96d56Sopenharmony_ci        result = self.loop.run_until_complete(do_test())
6317db96d56Sopenharmony_ci        self.assertEqual(result, "completed")
6327db96d56Sopenharmony_ci
6337db96d56Sopenharmony_ci    def test_anext_iter(self):
6347db96d56Sopenharmony_ci        @types.coroutine
6357db96d56Sopenharmony_ci        def _async_yield(v):
6367db96d56Sopenharmony_ci            return (yield v)
6377db96d56Sopenharmony_ci
6387db96d56Sopenharmony_ci        class MyError(Exception):
6397db96d56Sopenharmony_ci            pass
6407db96d56Sopenharmony_ci
6417db96d56Sopenharmony_ci        async def agenfn():
6427db96d56Sopenharmony_ci            try:
6437db96d56Sopenharmony_ci                await _async_yield(1)
6447db96d56Sopenharmony_ci            except MyError:
6457db96d56Sopenharmony_ci                await _async_yield(2)
6467db96d56Sopenharmony_ci            return
6477db96d56Sopenharmony_ci            yield
6487db96d56Sopenharmony_ci
6497db96d56Sopenharmony_ci        def test1(anext):
6507db96d56Sopenharmony_ci            agen = agenfn()
6517db96d56Sopenharmony_ci            with contextlib.closing(anext(agen, "default").__await__()) as g:
6527db96d56Sopenharmony_ci                self.assertEqual(g.send(None), 1)
6537db96d56Sopenharmony_ci                self.assertEqual(g.throw(MyError, MyError(), None), 2)
6547db96d56Sopenharmony_ci                try:
6557db96d56Sopenharmony_ci                    g.send(None)
6567db96d56Sopenharmony_ci                except StopIteration as e:
6577db96d56Sopenharmony_ci                    err = e
6587db96d56Sopenharmony_ci                else:
6597db96d56Sopenharmony_ci                    self.fail('StopIteration was not raised')
6607db96d56Sopenharmony_ci                self.assertEqual(err.value, "default")
6617db96d56Sopenharmony_ci
6627db96d56Sopenharmony_ci        def test2(anext):
6637db96d56Sopenharmony_ci            agen = agenfn()
6647db96d56Sopenharmony_ci            with contextlib.closing(anext(agen, "default").__await__()) as g:
6657db96d56Sopenharmony_ci                self.assertEqual(g.send(None), 1)
6667db96d56Sopenharmony_ci                self.assertEqual(g.throw(MyError, MyError(), None), 2)
6677db96d56Sopenharmony_ci                with self.assertRaises(MyError):
6687db96d56Sopenharmony_ci                    g.throw(MyError, MyError(), None)
6697db96d56Sopenharmony_ci
6707db96d56Sopenharmony_ci        def test3(anext):
6717db96d56Sopenharmony_ci            agen = agenfn()
6727db96d56Sopenharmony_ci            with contextlib.closing(anext(agen, "default").__await__()) as g:
6737db96d56Sopenharmony_ci                self.assertEqual(g.send(None), 1)
6747db96d56Sopenharmony_ci                g.close()
6757db96d56Sopenharmony_ci                with self.assertRaisesRegex(RuntimeError, 'cannot reuse'):
6767db96d56Sopenharmony_ci                    self.assertEqual(g.send(None), 1)
6777db96d56Sopenharmony_ci
6787db96d56Sopenharmony_ci        def test4(anext):
6797db96d56Sopenharmony_ci            @types.coroutine
6807db96d56Sopenharmony_ci            def _async_yield(v):
6817db96d56Sopenharmony_ci                yield v * 10
6827db96d56Sopenharmony_ci                return (yield (v * 10 + 1))
6837db96d56Sopenharmony_ci
6847db96d56Sopenharmony_ci            async def agenfn():
6857db96d56Sopenharmony_ci                try:
6867db96d56Sopenharmony_ci                    await _async_yield(1)
6877db96d56Sopenharmony_ci                except MyError:
6887db96d56Sopenharmony_ci                    await _async_yield(2)
6897db96d56Sopenharmony_ci                return
6907db96d56Sopenharmony_ci                yield
6917db96d56Sopenharmony_ci
6927db96d56Sopenharmony_ci            agen = agenfn()
6937db96d56Sopenharmony_ci            with contextlib.closing(anext(agen, "default").__await__()) as g:
6947db96d56Sopenharmony_ci                self.assertEqual(g.send(None), 10)
6957db96d56Sopenharmony_ci                self.assertEqual(g.throw(MyError, MyError(), None), 20)
6967db96d56Sopenharmony_ci                with self.assertRaisesRegex(MyError, 'val'):
6977db96d56Sopenharmony_ci                    g.throw(MyError, MyError('val'), None)
6987db96d56Sopenharmony_ci
6997db96d56Sopenharmony_ci        def test5(anext):
7007db96d56Sopenharmony_ci            @types.coroutine
7017db96d56Sopenharmony_ci            def _async_yield(v):
7027db96d56Sopenharmony_ci                yield v * 10
7037db96d56Sopenharmony_ci                return (yield (v * 10 + 1))
7047db96d56Sopenharmony_ci
7057db96d56Sopenharmony_ci            async def agenfn():
7067db96d56Sopenharmony_ci                try:
7077db96d56Sopenharmony_ci                    await _async_yield(1)
7087db96d56Sopenharmony_ci                except MyError:
7097db96d56Sopenharmony_ci                    return
7107db96d56Sopenharmony_ci                yield 'aaa'
7117db96d56Sopenharmony_ci
7127db96d56Sopenharmony_ci            agen = agenfn()
7137db96d56Sopenharmony_ci            with contextlib.closing(anext(agen, "default").__await__()) as g:
7147db96d56Sopenharmony_ci                self.assertEqual(g.send(None), 10)
7157db96d56Sopenharmony_ci                with self.assertRaisesRegex(StopIteration, 'default'):
7167db96d56Sopenharmony_ci                    g.throw(MyError, MyError(), None)
7177db96d56Sopenharmony_ci
7187db96d56Sopenharmony_ci        def test6(anext):
7197db96d56Sopenharmony_ci            @types.coroutine
7207db96d56Sopenharmony_ci            def _async_yield(v):
7217db96d56Sopenharmony_ci                yield v * 10
7227db96d56Sopenharmony_ci                return (yield (v * 10 + 1))
7237db96d56Sopenharmony_ci
7247db96d56Sopenharmony_ci            async def agenfn():
7257db96d56Sopenharmony_ci                await _async_yield(1)
7267db96d56Sopenharmony_ci                yield 'aaa'
7277db96d56Sopenharmony_ci
7287db96d56Sopenharmony_ci            agen = agenfn()
7297db96d56Sopenharmony_ci            with contextlib.closing(anext(agen, "default").__await__()) as g:
7307db96d56Sopenharmony_ci                with self.assertRaises(MyError):
7317db96d56Sopenharmony_ci                    g.throw(MyError, MyError(), None)
7327db96d56Sopenharmony_ci
7337db96d56Sopenharmony_ci        def run_test(test):
7347db96d56Sopenharmony_ci            with self.subTest('pure-Python anext()'):
7357db96d56Sopenharmony_ci                test(py_anext)
7367db96d56Sopenharmony_ci            with self.subTest('builtin anext()'):
7377db96d56Sopenharmony_ci                test(anext)
7387db96d56Sopenharmony_ci
7397db96d56Sopenharmony_ci        run_test(test1)
7407db96d56Sopenharmony_ci        run_test(test2)
7417db96d56Sopenharmony_ci        run_test(test3)
7427db96d56Sopenharmony_ci        run_test(test4)
7437db96d56Sopenharmony_ci        run_test(test5)
7447db96d56Sopenharmony_ci        run_test(test6)
7457db96d56Sopenharmony_ci
7467db96d56Sopenharmony_ci    def test_aiter_bad_args(self):
7477db96d56Sopenharmony_ci        async def gen():
7487db96d56Sopenharmony_ci            yield 1
7497db96d56Sopenharmony_ci        async def call_with_too_few_args():
7507db96d56Sopenharmony_ci            await aiter()
7517db96d56Sopenharmony_ci        async def call_with_too_many_args():
7527db96d56Sopenharmony_ci            await aiter(gen(), 1)
7537db96d56Sopenharmony_ci        async def call_with_wrong_type_arg():
7547db96d56Sopenharmony_ci            await aiter(1)
7557db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
7567db96d56Sopenharmony_ci            self.loop.run_until_complete(call_with_too_few_args())
7577db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
7587db96d56Sopenharmony_ci            self.loop.run_until_complete(call_with_too_many_args())
7597db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
7607db96d56Sopenharmony_ci            self.loop.run_until_complete(call_with_wrong_type_arg())
7617db96d56Sopenharmony_ci
7627db96d56Sopenharmony_ci    async def to_list(self, gen):
7637db96d56Sopenharmony_ci        res = []
7647db96d56Sopenharmony_ci        async for i in gen:
7657db96d56Sopenharmony_ci            res.append(i)
7667db96d56Sopenharmony_ci        return res
7677db96d56Sopenharmony_ci
7687db96d56Sopenharmony_ci    def test_async_gen_asyncio_01(self):
7697db96d56Sopenharmony_ci        async def gen():
7707db96d56Sopenharmony_ci            yield 1
7717db96d56Sopenharmony_ci            await asyncio.sleep(0.01)
7727db96d56Sopenharmony_ci            yield 2
7737db96d56Sopenharmony_ci            await asyncio.sleep(0.01)
7747db96d56Sopenharmony_ci            return
7757db96d56Sopenharmony_ci            yield 3
7767db96d56Sopenharmony_ci
7777db96d56Sopenharmony_ci        res = self.loop.run_until_complete(self.to_list(gen()))
7787db96d56Sopenharmony_ci        self.assertEqual(res, [1, 2])
7797db96d56Sopenharmony_ci
7807db96d56Sopenharmony_ci    def test_async_gen_asyncio_02(self):
7817db96d56Sopenharmony_ci        async def gen():
7827db96d56Sopenharmony_ci            yield 1
7837db96d56Sopenharmony_ci            await asyncio.sleep(0.01)
7847db96d56Sopenharmony_ci            yield 2
7857db96d56Sopenharmony_ci            1 / 0
7867db96d56Sopenharmony_ci            yield 3
7877db96d56Sopenharmony_ci
7887db96d56Sopenharmony_ci        with self.assertRaises(ZeroDivisionError):
7897db96d56Sopenharmony_ci            self.loop.run_until_complete(self.to_list(gen()))
7907db96d56Sopenharmony_ci
7917db96d56Sopenharmony_ci    def test_async_gen_asyncio_03(self):
7927db96d56Sopenharmony_ci        loop = self.loop
7937db96d56Sopenharmony_ci
7947db96d56Sopenharmony_ci        class Gen:
7957db96d56Sopenharmony_ci            async def __aiter__(self):
7967db96d56Sopenharmony_ci                yield 1
7977db96d56Sopenharmony_ci                await asyncio.sleep(0.01)
7987db96d56Sopenharmony_ci                yield 2
7997db96d56Sopenharmony_ci
8007db96d56Sopenharmony_ci        res = loop.run_until_complete(self.to_list(Gen()))
8017db96d56Sopenharmony_ci        self.assertEqual(res, [1, 2])
8027db96d56Sopenharmony_ci
8037db96d56Sopenharmony_ci    def test_async_gen_asyncio_anext_04(self):
8047db96d56Sopenharmony_ci        async def foo():
8057db96d56Sopenharmony_ci            yield 1
8067db96d56Sopenharmony_ci            await asyncio.sleep(0.01)
8077db96d56Sopenharmony_ci            try:
8087db96d56Sopenharmony_ci                yield 2
8097db96d56Sopenharmony_ci                yield 3
8107db96d56Sopenharmony_ci            except ZeroDivisionError:
8117db96d56Sopenharmony_ci                yield 1000
8127db96d56Sopenharmony_ci            await asyncio.sleep(0.01)
8137db96d56Sopenharmony_ci            yield 4
8147db96d56Sopenharmony_ci
8157db96d56Sopenharmony_ci        async def run1():
8167db96d56Sopenharmony_ci            it = foo().__aiter__()
8177db96d56Sopenharmony_ci
8187db96d56Sopenharmony_ci            self.assertEqual(await it.__anext__(), 1)
8197db96d56Sopenharmony_ci            self.assertEqual(await it.__anext__(), 2)
8207db96d56Sopenharmony_ci            self.assertEqual(await it.__anext__(), 3)
8217db96d56Sopenharmony_ci            self.assertEqual(await it.__anext__(), 4)
8227db96d56Sopenharmony_ci            with self.assertRaises(StopAsyncIteration):
8237db96d56Sopenharmony_ci                await it.__anext__()
8247db96d56Sopenharmony_ci            with self.assertRaises(StopAsyncIteration):
8257db96d56Sopenharmony_ci                await it.__anext__()
8267db96d56Sopenharmony_ci
8277db96d56Sopenharmony_ci        async def run2():
8287db96d56Sopenharmony_ci            it = foo().__aiter__()
8297db96d56Sopenharmony_ci
8307db96d56Sopenharmony_ci            self.assertEqual(await it.__anext__(), 1)
8317db96d56Sopenharmony_ci            self.assertEqual(await it.__anext__(), 2)
8327db96d56Sopenharmony_ci            try:
8337db96d56Sopenharmony_ci                it.__anext__().throw(ZeroDivisionError)
8347db96d56Sopenharmony_ci            except StopIteration as ex:
8357db96d56Sopenharmony_ci                self.assertEqual(ex.args[0], 1000)
8367db96d56Sopenharmony_ci            else:
8377db96d56Sopenharmony_ci                self.fail('StopIteration was not raised')
8387db96d56Sopenharmony_ci            self.assertEqual(await it.__anext__(), 4)
8397db96d56Sopenharmony_ci            with self.assertRaises(StopAsyncIteration):
8407db96d56Sopenharmony_ci                await it.__anext__()
8417db96d56Sopenharmony_ci
8427db96d56Sopenharmony_ci        self.loop.run_until_complete(run1())
8437db96d56Sopenharmony_ci        self.loop.run_until_complete(run2())
8447db96d56Sopenharmony_ci
8457db96d56Sopenharmony_ci    def test_async_gen_asyncio_anext_05(self):
8467db96d56Sopenharmony_ci        async def foo():
8477db96d56Sopenharmony_ci            v = yield 1
8487db96d56Sopenharmony_ci            v = yield v
8497db96d56Sopenharmony_ci            yield v * 100
8507db96d56Sopenharmony_ci
8517db96d56Sopenharmony_ci        async def run():
8527db96d56Sopenharmony_ci            it = foo().__aiter__()
8537db96d56Sopenharmony_ci
8547db96d56Sopenharmony_ci            try:
8557db96d56Sopenharmony_ci                it.__anext__().send(None)
8567db96d56Sopenharmony_ci            except StopIteration as ex:
8577db96d56Sopenharmony_ci                self.assertEqual(ex.args[0], 1)
8587db96d56Sopenharmony_ci            else:
8597db96d56Sopenharmony_ci                self.fail('StopIteration was not raised')
8607db96d56Sopenharmony_ci
8617db96d56Sopenharmony_ci            try:
8627db96d56Sopenharmony_ci                it.__anext__().send(10)
8637db96d56Sopenharmony_ci            except StopIteration as ex:
8647db96d56Sopenharmony_ci                self.assertEqual(ex.args[0], 10)
8657db96d56Sopenharmony_ci            else:
8667db96d56Sopenharmony_ci                self.fail('StopIteration was not raised')
8677db96d56Sopenharmony_ci
8687db96d56Sopenharmony_ci            try:
8697db96d56Sopenharmony_ci                it.__anext__().send(12)
8707db96d56Sopenharmony_ci            except StopIteration as ex:
8717db96d56Sopenharmony_ci                self.assertEqual(ex.args[0], 1200)
8727db96d56Sopenharmony_ci            else:
8737db96d56Sopenharmony_ci                self.fail('StopIteration was not raised')
8747db96d56Sopenharmony_ci
8757db96d56Sopenharmony_ci            with self.assertRaises(StopAsyncIteration):
8767db96d56Sopenharmony_ci                await it.__anext__()
8777db96d56Sopenharmony_ci
8787db96d56Sopenharmony_ci        self.loop.run_until_complete(run())
8797db96d56Sopenharmony_ci
8807db96d56Sopenharmony_ci    def test_async_gen_asyncio_anext_06(self):
8817db96d56Sopenharmony_ci        DONE = 0
8827db96d56Sopenharmony_ci
8837db96d56Sopenharmony_ci        # test synchronous generators
8847db96d56Sopenharmony_ci        def foo():
8857db96d56Sopenharmony_ci            try:
8867db96d56Sopenharmony_ci                yield
8877db96d56Sopenharmony_ci            except:
8887db96d56Sopenharmony_ci                pass
8897db96d56Sopenharmony_ci        g = foo()
8907db96d56Sopenharmony_ci        g.send(None)
8917db96d56Sopenharmony_ci        with self.assertRaises(StopIteration):
8927db96d56Sopenharmony_ci            g.send(None)
8937db96d56Sopenharmony_ci
8947db96d56Sopenharmony_ci        # now with asynchronous generators
8957db96d56Sopenharmony_ci
8967db96d56Sopenharmony_ci        async def gen():
8977db96d56Sopenharmony_ci            nonlocal DONE
8987db96d56Sopenharmony_ci            try:
8997db96d56Sopenharmony_ci                yield
9007db96d56Sopenharmony_ci            except:
9017db96d56Sopenharmony_ci                pass
9027db96d56Sopenharmony_ci            DONE = 1
9037db96d56Sopenharmony_ci
9047db96d56Sopenharmony_ci        async def run():
9057db96d56Sopenharmony_ci            nonlocal DONE
9067db96d56Sopenharmony_ci            g = gen()
9077db96d56Sopenharmony_ci            await g.asend(None)
9087db96d56Sopenharmony_ci            with self.assertRaises(StopAsyncIteration):
9097db96d56Sopenharmony_ci                await g.asend(None)
9107db96d56Sopenharmony_ci            DONE += 10
9117db96d56Sopenharmony_ci
9127db96d56Sopenharmony_ci        self.loop.run_until_complete(run())
9137db96d56Sopenharmony_ci        self.assertEqual(DONE, 11)
9147db96d56Sopenharmony_ci
9157db96d56Sopenharmony_ci    def test_async_gen_asyncio_anext_tuple(self):
9167db96d56Sopenharmony_ci        async def foo():
9177db96d56Sopenharmony_ci            try:
9187db96d56Sopenharmony_ci                yield (1,)
9197db96d56Sopenharmony_ci            except ZeroDivisionError:
9207db96d56Sopenharmony_ci                yield (2,)
9217db96d56Sopenharmony_ci
9227db96d56Sopenharmony_ci        async def run():
9237db96d56Sopenharmony_ci            it = foo().__aiter__()
9247db96d56Sopenharmony_ci
9257db96d56Sopenharmony_ci            self.assertEqual(await it.__anext__(), (1,))
9267db96d56Sopenharmony_ci            with self.assertRaises(StopIteration) as cm:
9277db96d56Sopenharmony_ci                it.__anext__().throw(ZeroDivisionError)
9287db96d56Sopenharmony_ci            self.assertEqual(cm.exception.args[0], (2,))
9297db96d56Sopenharmony_ci            with self.assertRaises(StopAsyncIteration):
9307db96d56Sopenharmony_ci                await it.__anext__()
9317db96d56Sopenharmony_ci
9327db96d56Sopenharmony_ci        self.loop.run_until_complete(run())
9337db96d56Sopenharmony_ci
9347db96d56Sopenharmony_ci    def test_async_gen_asyncio_anext_stopiteration(self):
9357db96d56Sopenharmony_ci        async def foo():
9367db96d56Sopenharmony_ci            try:
9377db96d56Sopenharmony_ci                yield StopIteration(1)
9387db96d56Sopenharmony_ci            except ZeroDivisionError:
9397db96d56Sopenharmony_ci                yield StopIteration(3)
9407db96d56Sopenharmony_ci
9417db96d56Sopenharmony_ci        async def run():
9427db96d56Sopenharmony_ci            it = foo().__aiter__()
9437db96d56Sopenharmony_ci
9447db96d56Sopenharmony_ci            v = await it.__anext__()
9457db96d56Sopenharmony_ci            self.assertIsInstance(v, StopIteration)
9467db96d56Sopenharmony_ci            self.assertEqual(v.value, 1)
9477db96d56Sopenharmony_ci            with self.assertRaises(StopIteration) as cm:
9487db96d56Sopenharmony_ci                it.__anext__().throw(ZeroDivisionError)
9497db96d56Sopenharmony_ci            v = cm.exception.args[0]
9507db96d56Sopenharmony_ci            self.assertIsInstance(v, StopIteration)
9517db96d56Sopenharmony_ci            self.assertEqual(v.value, 3)
9527db96d56Sopenharmony_ci            with self.assertRaises(StopAsyncIteration):
9537db96d56Sopenharmony_ci                await it.__anext__()
9547db96d56Sopenharmony_ci
9557db96d56Sopenharmony_ci        self.loop.run_until_complete(run())
9567db96d56Sopenharmony_ci
9577db96d56Sopenharmony_ci    def test_async_gen_asyncio_aclose_06(self):
9587db96d56Sopenharmony_ci        async def foo():
9597db96d56Sopenharmony_ci            try:
9607db96d56Sopenharmony_ci                yield 1
9617db96d56Sopenharmony_ci                1 / 0
9627db96d56Sopenharmony_ci            finally:
9637db96d56Sopenharmony_ci                await asyncio.sleep(0.01)
9647db96d56Sopenharmony_ci                yield 12
9657db96d56Sopenharmony_ci
9667db96d56Sopenharmony_ci        async def run():
9677db96d56Sopenharmony_ci            gen = foo()
9687db96d56Sopenharmony_ci            it = gen.__aiter__()
9697db96d56Sopenharmony_ci            await it.__anext__()
9707db96d56Sopenharmony_ci            await gen.aclose()
9717db96d56Sopenharmony_ci
9727db96d56Sopenharmony_ci        with self.assertRaisesRegex(
9737db96d56Sopenharmony_ci                RuntimeError,
9747db96d56Sopenharmony_ci                "async generator ignored GeneratorExit"):
9757db96d56Sopenharmony_ci            self.loop.run_until_complete(run())
9767db96d56Sopenharmony_ci
9777db96d56Sopenharmony_ci    def test_async_gen_asyncio_aclose_07(self):
9787db96d56Sopenharmony_ci        DONE = 0
9797db96d56Sopenharmony_ci
9807db96d56Sopenharmony_ci        async def foo():
9817db96d56Sopenharmony_ci            nonlocal DONE
9827db96d56Sopenharmony_ci            try:
9837db96d56Sopenharmony_ci                yield 1
9847db96d56Sopenharmony_ci                1 / 0
9857db96d56Sopenharmony_ci            finally:
9867db96d56Sopenharmony_ci                await asyncio.sleep(0.01)
9877db96d56Sopenharmony_ci                await asyncio.sleep(0.01)
9887db96d56Sopenharmony_ci                DONE += 1
9897db96d56Sopenharmony_ci            DONE += 1000
9907db96d56Sopenharmony_ci
9917db96d56Sopenharmony_ci        async def run():
9927db96d56Sopenharmony_ci            gen = foo()
9937db96d56Sopenharmony_ci            it = gen.__aiter__()
9947db96d56Sopenharmony_ci            await it.__anext__()
9957db96d56Sopenharmony_ci            await gen.aclose()
9967db96d56Sopenharmony_ci
9977db96d56Sopenharmony_ci        self.loop.run_until_complete(run())
9987db96d56Sopenharmony_ci        self.assertEqual(DONE, 1)
9997db96d56Sopenharmony_ci
10007db96d56Sopenharmony_ci    def test_async_gen_asyncio_aclose_08(self):
10017db96d56Sopenharmony_ci        DONE = 0
10027db96d56Sopenharmony_ci
10037db96d56Sopenharmony_ci        fut = asyncio.Future(loop=self.loop)
10047db96d56Sopenharmony_ci
10057db96d56Sopenharmony_ci        async def foo():
10067db96d56Sopenharmony_ci            nonlocal DONE
10077db96d56Sopenharmony_ci            try:
10087db96d56Sopenharmony_ci                yield 1
10097db96d56Sopenharmony_ci                await fut
10107db96d56Sopenharmony_ci                DONE += 1000
10117db96d56Sopenharmony_ci                yield 2
10127db96d56Sopenharmony_ci            finally:
10137db96d56Sopenharmony_ci                await asyncio.sleep(0.01)
10147db96d56Sopenharmony_ci                await asyncio.sleep(0.01)
10157db96d56Sopenharmony_ci                DONE += 1
10167db96d56Sopenharmony_ci            DONE += 1000
10177db96d56Sopenharmony_ci
10187db96d56Sopenharmony_ci        async def run():
10197db96d56Sopenharmony_ci            gen = foo()
10207db96d56Sopenharmony_ci            it = gen.__aiter__()
10217db96d56Sopenharmony_ci            self.assertEqual(await it.__anext__(), 1)
10227db96d56Sopenharmony_ci            await gen.aclose()
10237db96d56Sopenharmony_ci
10247db96d56Sopenharmony_ci        self.loop.run_until_complete(run())
10257db96d56Sopenharmony_ci        self.assertEqual(DONE, 1)
10267db96d56Sopenharmony_ci
10277db96d56Sopenharmony_ci        # Silence ResourceWarnings
10287db96d56Sopenharmony_ci        fut.cancel()
10297db96d56Sopenharmony_ci        self.loop.run_until_complete(asyncio.sleep(0.01))
10307db96d56Sopenharmony_ci
10317db96d56Sopenharmony_ci    def test_async_gen_asyncio_gc_aclose_09(self):
10327db96d56Sopenharmony_ci        DONE = 0
10337db96d56Sopenharmony_ci
10347db96d56Sopenharmony_ci        async def gen():
10357db96d56Sopenharmony_ci            nonlocal DONE
10367db96d56Sopenharmony_ci            try:
10377db96d56Sopenharmony_ci                while True:
10387db96d56Sopenharmony_ci                    yield 1
10397db96d56Sopenharmony_ci            finally:
10407db96d56Sopenharmony_ci                await asyncio.sleep(0.01)
10417db96d56Sopenharmony_ci                await asyncio.sleep(0.01)
10427db96d56Sopenharmony_ci                DONE = 1
10437db96d56Sopenharmony_ci
10447db96d56Sopenharmony_ci        async def run():
10457db96d56Sopenharmony_ci            g = gen()
10467db96d56Sopenharmony_ci            await g.__anext__()
10477db96d56Sopenharmony_ci            await g.__anext__()
10487db96d56Sopenharmony_ci            del g
10497db96d56Sopenharmony_ci            gc_collect()  # For PyPy or other GCs.
10507db96d56Sopenharmony_ci
10517db96d56Sopenharmony_ci            await asyncio.sleep(0.1)
10527db96d56Sopenharmony_ci
10537db96d56Sopenharmony_ci        self.loop.run_until_complete(run())
10547db96d56Sopenharmony_ci        self.assertEqual(DONE, 1)
10557db96d56Sopenharmony_ci
10567db96d56Sopenharmony_ci    def test_async_gen_asyncio_aclose_10(self):
10577db96d56Sopenharmony_ci        DONE = 0
10587db96d56Sopenharmony_ci
10597db96d56Sopenharmony_ci        # test synchronous generators
10607db96d56Sopenharmony_ci        def foo():
10617db96d56Sopenharmony_ci            try:
10627db96d56Sopenharmony_ci                yield
10637db96d56Sopenharmony_ci            except:
10647db96d56Sopenharmony_ci                pass
10657db96d56Sopenharmony_ci        g = foo()
10667db96d56Sopenharmony_ci        g.send(None)
10677db96d56Sopenharmony_ci        g.close()
10687db96d56Sopenharmony_ci
10697db96d56Sopenharmony_ci        # now with asynchronous generators
10707db96d56Sopenharmony_ci
10717db96d56Sopenharmony_ci        async def gen():
10727db96d56Sopenharmony_ci            nonlocal DONE
10737db96d56Sopenharmony_ci            try:
10747db96d56Sopenharmony_ci                yield
10757db96d56Sopenharmony_ci            except:
10767db96d56Sopenharmony_ci                pass
10777db96d56Sopenharmony_ci            DONE = 1
10787db96d56Sopenharmony_ci
10797db96d56Sopenharmony_ci        async def run():
10807db96d56Sopenharmony_ci            nonlocal DONE
10817db96d56Sopenharmony_ci            g = gen()
10827db96d56Sopenharmony_ci            await g.asend(None)
10837db96d56Sopenharmony_ci            await g.aclose()
10847db96d56Sopenharmony_ci            DONE += 10
10857db96d56Sopenharmony_ci
10867db96d56Sopenharmony_ci        self.loop.run_until_complete(run())
10877db96d56Sopenharmony_ci        self.assertEqual(DONE, 11)
10887db96d56Sopenharmony_ci
10897db96d56Sopenharmony_ci    def test_async_gen_asyncio_aclose_11(self):
10907db96d56Sopenharmony_ci        DONE = 0
10917db96d56Sopenharmony_ci
10927db96d56Sopenharmony_ci        # test synchronous generators
10937db96d56Sopenharmony_ci        def foo():
10947db96d56Sopenharmony_ci            try:
10957db96d56Sopenharmony_ci                yield
10967db96d56Sopenharmony_ci            except:
10977db96d56Sopenharmony_ci                pass
10987db96d56Sopenharmony_ci            yield
10997db96d56Sopenharmony_ci        g = foo()
11007db96d56Sopenharmony_ci        g.send(None)
11017db96d56Sopenharmony_ci        with self.assertRaisesRegex(RuntimeError, 'ignored GeneratorExit'):
11027db96d56Sopenharmony_ci            g.close()
11037db96d56Sopenharmony_ci
11047db96d56Sopenharmony_ci        # now with asynchronous generators
11057db96d56Sopenharmony_ci
11067db96d56Sopenharmony_ci        async def gen():
11077db96d56Sopenharmony_ci            nonlocal DONE
11087db96d56Sopenharmony_ci            try:
11097db96d56Sopenharmony_ci                yield
11107db96d56Sopenharmony_ci            except:
11117db96d56Sopenharmony_ci                pass
11127db96d56Sopenharmony_ci            yield
11137db96d56Sopenharmony_ci            DONE += 1
11147db96d56Sopenharmony_ci
11157db96d56Sopenharmony_ci        async def run():
11167db96d56Sopenharmony_ci            nonlocal DONE
11177db96d56Sopenharmony_ci            g = gen()
11187db96d56Sopenharmony_ci            await g.asend(None)
11197db96d56Sopenharmony_ci            with self.assertRaisesRegex(RuntimeError, 'ignored GeneratorExit'):
11207db96d56Sopenharmony_ci                await g.aclose()
11217db96d56Sopenharmony_ci            DONE += 10
11227db96d56Sopenharmony_ci
11237db96d56Sopenharmony_ci        self.loop.run_until_complete(run())
11247db96d56Sopenharmony_ci        self.assertEqual(DONE, 10)
11257db96d56Sopenharmony_ci
11267db96d56Sopenharmony_ci    def test_async_gen_asyncio_aclose_12(self):
11277db96d56Sopenharmony_ci        DONE = 0
11287db96d56Sopenharmony_ci
11297db96d56Sopenharmony_ci        async def target():
11307db96d56Sopenharmony_ci            await asyncio.sleep(0.01)
11317db96d56Sopenharmony_ci            1 / 0
11327db96d56Sopenharmony_ci
11337db96d56Sopenharmony_ci        async def foo():
11347db96d56Sopenharmony_ci            nonlocal DONE
11357db96d56Sopenharmony_ci            task = asyncio.create_task(target())
11367db96d56Sopenharmony_ci            try:
11377db96d56Sopenharmony_ci                yield 1
11387db96d56Sopenharmony_ci            finally:
11397db96d56Sopenharmony_ci                try:
11407db96d56Sopenharmony_ci                    await task
11417db96d56Sopenharmony_ci                except ZeroDivisionError:
11427db96d56Sopenharmony_ci                    DONE = 1
11437db96d56Sopenharmony_ci
11447db96d56Sopenharmony_ci        async def run():
11457db96d56Sopenharmony_ci            gen = foo()
11467db96d56Sopenharmony_ci            it = gen.__aiter__()
11477db96d56Sopenharmony_ci            await it.__anext__()
11487db96d56Sopenharmony_ci            await gen.aclose()
11497db96d56Sopenharmony_ci
11507db96d56Sopenharmony_ci        self.loop.run_until_complete(run())
11517db96d56Sopenharmony_ci        self.assertEqual(DONE, 1)
11527db96d56Sopenharmony_ci
11537db96d56Sopenharmony_ci    def test_async_gen_asyncio_asend_01(self):
11547db96d56Sopenharmony_ci        DONE = 0
11557db96d56Sopenharmony_ci
11567db96d56Sopenharmony_ci        # Sanity check:
11577db96d56Sopenharmony_ci        def sgen():
11587db96d56Sopenharmony_ci            v = yield 1
11597db96d56Sopenharmony_ci            yield v * 2
11607db96d56Sopenharmony_ci        sg = sgen()
11617db96d56Sopenharmony_ci        v = sg.send(None)
11627db96d56Sopenharmony_ci        self.assertEqual(v, 1)
11637db96d56Sopenharmony_ci        v = sg.send(100)
11647db96d56Sopenharmony_ci        self.assertEqual(v, 200)
11657db96d56Sopenharmony_ci
11667db96d56Sopenharmony_ci        async def gen():
11677db96d56Sopenharmony_ci            nonlocal DONE
11687db96d56Sopenharmony_ci            try:
11697db96d56Sopenharmony_ci                await asyncio.sleep(0.01)
11707db96d56Sopenharmony_ci                v = yield 1
11717db96d56Sopenharmony_ci                await asyncio.sleep(0.01)
11727db96d56Sopenharmony_ci                yield v * 2
11737db96d56Sopenharmony_ci                await asyncio.sleep(0.01)
11747db96d56Sopenharmony_ci                return
11757db96d56Sopenharmony_ci            finally:
11767db96d56Sopenharmony_ci                await asyncio.sleep(0.01)
11777db96d56Sopenharmony_ci                await asyncio.sleep(0.01)
11787db96d56Sopenharmony_ci                DONE = 1
11797db96d56Sopenharmony_ci
11807db96d56Sopenharmony_ci        async def run():
11817db96d56Sopenharmony_ci            g = gen()
11827db96d56Sopenharmony_ci
11837db96d56Sopenharmony_ci            v = await g.asend(None)
11847db96d56Sopenharmony_ci            self.assertEqual(v, 1)
11857db96d56Sopenharmony_ci
11867db96d56Sopenharmony_ci            v = await g.asend(100)
11877db96d56Sopenharmony_ci            self.assertEqual(v, 200)
11887db96d56Sopenharmony_ci
11897db96d56Sopenharmony_ci            with self.assertRaises(StopAsyncIteration):
11907db96d56Sopenharmony_ci                await g.asend(None)
11917db96d56Sopenharmony_ci
11927db96d56Sopenharmony_ci        self.loop.run_until_complete(run())
11937db96d56Sopenharmony_ci        self.assertEqual(DONE, 1)
11947db96d56Sopenharmony_ci
11957db96d56Sopenharmony_ci    def test_async_gen_asyncio_asend_02(self):
11967db96d56Sopenharmony_ci        DONE = 0
11977db96d56Sopenharmony_ci
11987db96d56Sopenharmony_ci        async def sleep_n_crash(delay):
11997db96d56Sopenharmony_ci            await asyncio.sleep(delay)
12007db96d56Sopenharmony_ci            1 / 0
12017db96d56Sopenharmony_ci
12027db96d56Sopenharmony_ci        async def gen():
12037db96d56Sopenharmony_ci            nonlocal DONE
12047db96d56Sopenharmony_ci            try:
12057db96d56Sopenharmony_ci                await asyncio.sleep(0.01)
12067db96d56Sopenharmony_ci                v = yield 1
12077db96d56Sopenharmony_ci                await sleep_n_crash(0.01)
12087db96d56Sopenharmony_ci                DONE += 1000
12097db96d56Sopenharmony_ci                yield v * 2
12107db96d56Sopenharmony_ci            finally:
12117db96d56Sopenharmony_ci                await asyncio.sleep(0.01)
12127db96d56Sopenharmony_ci                await asyncio.sleep(0.01)
12137db96d56Sopenharmony_ci                DONE = 1
12147db96d56Sopenharmony_ci
12157db96d56Sopenharmony_ci        async def run():
12167db96d56Sopenharmony_ci            g = gen()
12177db96d56Sopenharmony_ci
12187db96d56Sopenharmony_ci            v = await g.asend(None)
12197db96d56Sopenharmony_ci            self.assertEqual(v, 1)
12207db96d56Sopenharmony_ci
12217db96d56Sopenharmony_ci            await g.asend(100)
12227db96d56Sopenharmony_ci
12237db96d56Sopenharmony_ci        with self.assertRaises(ZeroDivisionError):
12247db96d56Sopenharmony_ci            self.loop.run_until_complete(run())
12257db96d56Sopenharmony_ci        self.assertEqual(DONE, 1)
12267db96d56Sopenharmony_ci
12277db96d56Sopenharmony_ci    def test_async_gen_asyncio_asend_03(self):
12287db96d56Sopenharmony_ci        DONE = 0
12297db96d56Sopenharmony_ci
12307db96d56Sopenharmony_ci        async def sleep_n_crash(delay):
12317db96d56Sopenharmony_ci            fut = asyncio.ensure_future(asyncio.sleep(delay),
12327db96d56Sopenharmony_ci                                        loop=self.loop)
12337db96d56Sopenharmony_ci            self.loop.call_later(delay / 2, lambda: fut.cancel())
12347db96d56Sopenharmony_ci            return await fut
12357db96d56Sopenharmony_ci
12367db96d56Sopenharmony_ci        async def gen():
12377db96d56Sopenharmony_ci            nonlocal DONE
12387db96d56Sopenharmony_ci            try:
12397db96d56Sopenharmony_ci                await asyncio.sleep(0.01)
12407db96d56Sopenharmony_ci                v = yield 1
12417db96d56Sopenharmony_ci                await sleep_n_crash(0.01)
12427db96d56Sopenharmony_ci                DONE += 1000
12437db96d56Sopenharmony_ci                yield v * 2
12447db96d56Sopenharmony_ci            finally:
12457db96d56Sopenharmony_ci                await asyncio.sleep(0.01)
12467db96d56Sopenharmony_ci                await asyncio.sleep(0.01)
12477db96d56Sopenharmony_ci                DONE = 1
12487db96d56Sopenharmony_ci
12497db96d56Sopenharmony_ci        async def run():
12507db96d56Sopenharmony_ci            g = gen()
12517db96d56Sopenharmony_ci
12527db96d56Sopenharmony_ci            v = await g.asend(None)
12537db96d56Sopenharmony_ci            self.assertEqual(v, 1)
12547db96d56Sopenharmony_ci
12557db96d56Sopenharmony_ci            await g.asend(100)
12567db96d56Sopenharmony_ci
12577db96d56Sopenharmony_ci        with self.assertRaises(asyncio.CancelledError):
12587db96d56Sopenharmony_ci            self.loop.run_until_complete(run())
12597db96d56Sopenharmony_ci        self.assertEqual(DONE, 1)
12607db96d56Sopenharmony_ci
12617db96d56Sopenharmony_ci    def test_async_gen_asyncio_athrow_01(self):
12627db96d56Sopenharmony_ci        DONE = 0
12637db96d56Sopenharmony_ci
12647db96d56Sopenharmony_ci        class FooEr(Exception):
12657db96d56Sopenharmony_ci            pass
12667db96d56Sopenharmony_ci
12677db96d56Sopenharmony_ci        # Sanity check:
12687db96d56Sopenharmony_ci        def sgen():
12697db96d56Sopenharmony_ci            try:
12707db96d56Sopenharmony_ci                v = yield 1
12717db96d56Sopenharmony_ci            except FooEr:
12727db96d56Sopenharmony_ci                v = 1000
12737db96d56Sopenharmony_ci            yield v * 2
12747db96d56Sopenharmony_ci        sg = sgen()
12757db96d56Sopenharmony_ci        v = sg.send(None)
12767db96d56Sopenharmony_ci        self.assertEqual(v, 1)
12777db96d56Sopenharmony_ci        v = sg.throw(FooEr)
12787db96d56Sopenharmony_ci        self.assertEqual(v, 2000)
12797db96d56Sopenharmony_ci        with self.assertRaises(StopIteration):
12807db96d56Sopenharmony_ci            sg.send(None)
12817db96d56Sopenharmony_ci
12827db96d56Sopenharmony_ci        async def gen():
12837db96d56Sopenharmony_ci            nonlocal DONE
12847db96d56Sopenharmony_ci            try:
12857db96d56Sopenharmony_ci                await asyncio.sleep(0.01)
12867db96d56Sopenharmony_ci                try:
12877db96d56Sopenharmony_ci                    v = yield 1
12887db96d56Sopenharmony_ci                except FooEr:
12897db96d56Sopenharmony_ci                    v = 1000
12907db96d56Sopenharmony_ci                    await asyncio.sleep(0.01)
12917db96d56Sopenharmony_ci                yield v * 2
12927db96d56Sopenharmony_ci                await asyncio.sleep(0.01)
12937db96d56Sopenharmony_ci                # return
12947db96d56Sopenharmony_ci            finally:
12957db96d56Sopenharmony_ci                await asyncio.sleep(0.01)
12967db96d56Sopenharmony_ci                await asyncio.sleep(0.01)
12977db96d56Sopenharmony_ci                DONE = 1
12987db96d56Sopenharmony_ci
12997db96d56Sopenharmony_ci        async def run():
13007db96d56Sopenharmony_ci            g = gen()
13017db96d56Sopenharmony_ci
13027db96d56Sopenharmony_ci            v = await g.asend(None)
13037db96d56Sopenharmony_ci            self.assertEqual(v, 1)
13047db96d56Sopenharmony_ci
13057db96d56Sopenharmony_ci            v = await g.athrow(FooEr)
13067db96d56Sopenharmony_ci            self.assertEqual(v, 2000)
13077db96d56Sopenharmony_ci
13087db96d56Sopenharmony_ci            with self.assertRaises(StopAsyncIteration):
13097db96d56Sopenharmony_ci                await g.asend(None)
13107db96d56Sopenharmony_ci
13117db96d56Sopenharmony_ci        self.loop.run_until_complete(run())
13127db96d56Sopenharmony_ci        self.assertEqual(DONE, 1)
13137db96d56Sopenharmony_ci
13147db96d56Sopenharmony_ci    def test_async_gen_asyncio_athrow_02(self):
13157db96d56Sopenharmony_ci        DONE = 0
13167db96d56Sopenharmony_ci
13177db96d56Sopenharmony_ci        class FooEr(Exception):
13187db96d56Sopenharmony_ci            pass
13197db96d56Sopenharmony_ci
13207db96d56Sopenharmony_ci        async def sleep_n_crash(delay):
13217db96d56Sopenharmony_ci            fut = asyncio.ensure_future(asyncio.sleep(delay),
13227db96d56Sopenharmony_ci                                        loop=self.loop)
13237db96d56Sopenharmony_ci            self.loop.call_later(delay / 2, lambda: fut.cancel())
13247db96d56Sopenharmony_ci            return await fut
13257db96d56Sopenharmony_ci
13267db96d56Sopenharmony_ci        async def gen():
13277db96d56Sopenharmony_ci            nonlocal DONE
13287db96d56Sopenharmony_ci            try:
13297db96d56Sopenharmony_ci                await asyncio.sleep(0.01)
13307db96d56Sopenharmony_ci                try:
13317db96d56Sopenharmony_ci                    v = yield 1
13327db96d56Sopenharmony_ci                except FooEr:
13337db96d56Sopenharmony_ci                    await sleep_n_crash(0.01)
13347db96d56Sopenharmony_ci                yield v * 2
13357db96d56Sopenharmony_ci                await asyncio.sleep(0.01)
13367db96d56Sopenharmony_ci                # return
13377db96d56Sopenharmony_ci            finally:
13387db96d56Sopenharmony_ci                await asyncio.sleep(0.01)
13397db96d56Sopenharmony_ci                await asyncio.sleep(0.01)
13407db96d56Sopenharmony_ci                DONE = 1
13417db96d56Sopenharmony_ci
13427db96d56Sopenharmony_ci        async def run():
13437db96d56Sopenharmony_ci            g = gen()
13447db96d56Sopenharmony_ci
13457db96d56Sopenharmony_ci            v = await g.asend(None)
13467db96d56Sopenharmony_ci            self.assertEqual(v, 1)
13477db96d56Sopenharmony_ci
13487db96d56Sopenharmony_ci            try:
13497db96d56Sopenharmony_ci                await g.athrow(FooEr)
13507db96d56Sopenharmony_ci            except asyncio.CancelledError:
13517db96d56Sopenharmony_ci                self.assertEqual(DONE, 1)
13527db96d56Sopenharmony_ci                raise
13537db96d56Sopenharmony_ci            else:
13547db96d56Sopenharmony_ci                self.fail('CancelledError was not raised')
13557db96d56Sopenharmony_ci
13567db96d56Sopenharmony_ci        with self.assertRaises(asyncio.CancelledError):
13577db96d56Sopenharmony_ci            self.loop.run_until_complete(run())
13587db96d56Sopenharmony_ci        self.assertEqual(DONE, 1)
13597db96d56Sopenharmony_ci
13607db96d56Sopenharmony_ci    def test_async_gen_asyncio_athrow_03(self):
13617db96d56Sopenharmony_ci        DONE = 0
13627db96d56Sopenharmony_ci
13637db96d56Sopenharmony_ci        # test synchronous generators
13647db96d56Sopenharmony_ci        def foo():
13657db96d56Sopenharmony_ci            try:
13667db96d56Sopenharmony_ci                yield
13677db96d56Sopenharmony_ci            except:
13687db96d56Sopenharmony_ci                pass
13697db96d56Sopenharmony_ci        g = foo()
13707db96d56Sopenharmony_ci        g.send(None)
13717db96d56Sopenharmony_ci        with self.assertRaises(StopIteration):
13727db96d56Sopenharmony_ci            g.throw(ValueError)
13737db96d56Sopenharmony_ci
13747db96d56Sopenharmony_ci        # now with asynchronous generators
13757db96d56Sopenharmony_ci
13767db96d56Sopenharmony_ci        async def gen():
13777db96d56Sopenharmony_ci            nonlocal DONE
13787db96d56Sopenharmony_ci            try:
13797db96d56Sopenharmony_ci                yield
13807db96d56Sopenharmony_ci            except:
13817db96d56Sopenharmony_ci                pass
13827db96d56Sopenharmony_ci            DONE = 1
13837db96d56Sopenharmony_ci
13847db96d56Sopenharmony_ci        async def run():
13857db96d56Sopenharmony_ci            nonlocal DONE
13867db96d56Sopenharmony_ci            g = gen()
13877db96d56Sopenharmony_ci            await g.asend(None)
13887db96d56Sopenharmony_ci            with self.assertRaises(StopAsyncIteration):
13897db96d56Sopenharmony_ci                await g.athrow(ValueError)
13907db96d56Sopenharmony_ci            DONE += 10
13917db96d56Sopenharmony_ci
13927db96d56Sopenharmony_ci        self.loop.run_until_complete(run())
13937db96d56Sopenharmony_ci        self.assertEqual(DONE, 11)
13947db96d56Sopenharmony_ci
13957db96d56Sopenharmony_ci    def test_async_gen_asyncio_athrow_tuple(self):
13967db96d56Sopenharmony_ci        async def gen():
13977db96d56Sopenharmony_ci            try:
13987db96d56Sopenharmony_ci                yield 1
13997db96d56Sopenharmony_ci            except ZeroDivisionError:
14007db96d56Sopenharmony_ci                yield (2,)
14017db96d56Sopenharmony_ci
14027db96d56Sopenharmony_ci        async def run():
14037db96d56Sopenharmony_ci            g = gen()
14047db96d56Sopenharmony_ci            v = await g.asend(None)
14057db96d56Sopenharmony_ci            self.assertEqual(v, 1)
14067db96d56Sopenharmony_ci            v = await g.athrow(ZeroDivisionError)
14077db96d56Sopenharmony_ci            self.assertEqual(v, (2,))
14087db96d56Sopenharmony_ci            with self.assertRaises(StopAsyncIteration):
14097db96d56Sopenharmony_ci                await g.asend(None)
14107db96d56Sopenharmony_ci
14117db96d56Sopenharmony_ci        self.loop.run_until_complete(run())
14127db96d56Sopenharmony_ci
14137db96d56Sopenharmony_ci    def test_async_gen_asyncio_athrow_stopiteration(self):
14147db96d56Sopenharmony_ci        async def gen():
14157db96d56Sopenharmony_ci            try:
14167db96d56Sopenharmony_ci                yield 1
14177db96d56Sopenharmony_ci            except ZeroDivisionError:
14187db96d56Sopenharmony_ci                yield StopIteration(2)
14197db96d56Sopenharmony_ci
14207db96d56Sopenharmony_ci        async def run():
14217db96d56Sopenharmony_ci            g = gen()
14227db96d56Sopenharmony_ci            v = await g.asend(None)
14237db96d56Sopenharmony_ci            self.assertEqual(v, 1)
14247db96d56Sopenharmony_ci            v = await g.athrow(ZeroDivisionError)
14257db96d56Sopenharmony_ci            self.assertIsInstance(v, StopIteration)
14267db96d56Sopenharmony_ci            self.assertEqual(v.value, 2)
14277db96d56Sopenharmony_ci            with self.assertRaises(StopAsyncIteration):
14287db96d56Sopenharmony_ci                await g.asend(None)
14297db96d56Sopenharmony_ci
14307db96d56Sopenharmony_ci        self.loop.run_until_complete(run())
14317db96d56Sopenharmony_ci
14327db96d56Sopenharmony_ci    def test_async_gen_asyncio_shutdown_01(self):
14337db96d56Sopenharmony_ci        finalized = 0
14347db96d56Sopenharmony_ci
14357db96d56Sopenharmony_ci        async def waiter(timeout):
14367db96d56Sopenharmony_ci            nonlocal finalized
14377db96d56Sopenharmony_ci            try:
14387db96d56Sopenharmony_ci                await asyncio.sleep(timeout)
14397db96d56Sopenharmony_ci                yield 1
14407db96d56Sopenharmony_ci            finally:
14417db96d56Sopenharmony_ci                await asyncio.sleep(0)
14427db96d56Sopenharmony_ci                finalized += 1
14437db96d56Sopenharmony_ci
14447db96d56Sopenharmony_ci        async def wait():
14457db96d56Sopenharmony_ci            async for _ in waiter(1):
14467db96d56Sopenharmony_ci                pass
14477db96d56Sopenharmony_ci
14487db96d56Sopenharmony_ci        t1 = self.loop.create_task(wait())
14497db96d56Sopenharmony_ci        t2 = self.loop.create_task(wait())
14507db96d56Sopenharmony_ci
14517db96d56Sopenharmony_ci        self.loop.run_until_complete(asyncio.sleep(0.1))
14527db96d56Sopenharmony_ci
14537db96d56Sopenharmony_ci        # Silence warnings
14547db96d56Sopenharmony_ci        t1.cancel()
14557db96d56Sopenharmony_ci        t2.cancel()
14567db96d56Sopenharmony_ci
14577db96d56Sopenharmony_ci        with self.assertRaises(asyncio.CancelledError):
14587db96d56Sopenharmony_ci            self.loop.run_until_complete(t1)
14597db96d56Sopenharmony_ci        with self.assertRaises(asyncio.CancelledError):
14607db96d56Sopenharmony_ci            self.loop.run_until_complete(t2)
14617db96d56Sopenharmony_ci
14627db96d56Sopenharmony_ci        self.loop.run_until_complete(self.loop.shutdown_asyncgens())
14637db96d56Sopenharmony_ci
14647db96d56Sopenharmony_ci        self.assertEqual(finalized, 2)
14657db96d56Sopenharmony_ci
14667db96d56Sopenharmony_ci    def test_async_gen_asyncio_shutdown_02(self):
14677db96d56Sopenharmony_ci        messages = []
14687db96d56Sopenharmony_ci
14697db96d56Sopenharmony_ci        def exception_handler(loop, context):
14707db96d56Sopenharmony_ci            messages.append(context)
14717db96d56Sopenharmony_ci
14727db96d56Sopenharmony_ci        async def async_iterate():
14737db96d56Sopenharmony_ci            yield 1
14747db96d56Sopenharmony_ci            yield 2
14757db96d56Sopenharmony_ci
14767db96d56Sopenharmony_ci        it = async_iterate()
14777db96d56Sopenharmony_ci        async def main():
14787db96d56Sopenharmony_ci            loop = asyncio.get_running_loop()
14797db96d56Sopenharmony_ci            loop.set_exception_handler(exception_handler)
14807db96d56Sopenharmony_ci
14817db96d56Sopenharmony_ci            async for i in it:
14827db96d56Sopenharmony_ci                break
14837db96d56Sopenharmony_ci
14847db96d56Sopenharmony_ci        asyncio.run(main())
14857db96d56Sopenharmony_ci
14867db96d56Sopenharmony_ci        self.assertEqual(messages, [])
14877db96d56Sopenharmony_ci
14887db96d56Sopenharmony_ci    def test_async_gen_asyncio_shutdown_exception_01(self):
14897db96d56Sopenharmony_ci        messages = []
14907db96d56Sopenharmony_ci
14917db96d56Sopenharmony_ci        def exception_handler(loop, context):
14927db96d56Sopenharmony_ci            messages.append(context)
14937db96d56Sopenharmony_ci
14947db96d56Sopenharmony_ci        async def async_iterate():
14957db96d56Sopenharmony_ci            try:
14967db96d56Sopenharmony_ci                yield 1
14977db96d56Sopenharmony_ci                yield 2
14987db96d56Sopenharmony_ci            finally:
14997db96d56Sopenharmony_ci                1/0
15007db96d56Sopenharmony_ci
15017db96d56Sopenharmony_ci        it = async_iterate()
15027db96d56Sopenharmony_ci        async def main():
15037db96d56Sopenharmony_ci            loop = asyncio.get_running_loop()
15047db96d56Sopenharmony_ci            loop.set_exception_handler(exception_handler)
15057db96d56Sopenharmony_ci
15067db96d56Sopenharmony_ci            async for i in it:
15077db96d56Sopenharmony_ci                break
15087db96d56Sopenharmony_ci
15097db96d56Sopenharmony_ci        asyncio.run(main())
15107db96d56Sopenharmony_ci
15117db96d56Sopenharmony_ci        message, = messages
15127db96d56Sopenharmony_ci        self.assertEqual(message['asyncgen'], it)
15137db96d56Sopenharmony_ci        self.assertIsInstance(message['exception'], ZeroDivisionError)
15147db96d56Sopenharmony_ci        self.assertIn('an error occurred during closing of asynchronous generator',
15157db96d56Sopenharmony_ci                      message['message'])
15167db96d56Sopenharmony_ci
15177db96d56Sopenharmony_ci    def test_async_gen_asyncio_shutdown_exception_02(self):
15187db96d56Sopenharmony_ci        messages = []
15197db96d56Sopenharmony_ci
15207db96d56Sopenharmony_ci        def exception_handler(loop, context):
15217db96d56Sopenharmony_ci            messages.append(context)
15227db96d56Sopenharmony_ci
15237db96d56Sopenharmony_ci        async def async_iterate():
15247db96d56Sopenharmony_ci            try:
15257db96d56Sopenharmony_ci                yield 1
15267db96d56Sopenharmony_ci                yield 2
15277db96d56Sopenharmony_ci            finally:
15287db96d56Sopenharmony_ci                1/0
15297db96d56Sopenharmony_ci
15307db96d56Sopenharmony_ci        async def main():
15317db96d56Sopenharmony_ci            loop = asyncio.get_running_loop()
15327db96d56Sopenharmony_ci            loop.set_exception_handler(exception_handler)
15337db96d56Sopenharmony_ci
15347db96d56Sopenharmony_ci            async for i in async_iterate():
15357db96d56Sopenharmony_ci                break
15367db96d56Sopenharmony_ci            gc_collect()
15377db96d56Sopenharmony_ci
15387db96d56Sopenharmony_ci        asyncio.run(main())
15397db96d56Sopenharmony_ci
15407db96d56Sopenharmony_ci        message, = messages
15417db96d56Sopenharmony_ci        self.assertIsInstance(message['exception'], ZeroDivisionError)
15427db96d56Sopenharmony_ci        self.assertIn('unhandled exception during asyncio.run() shutdown',
15437db96d56Sopenharmony_ci                      message['message'])
15447db96d56Sopenharmony_ci
15457db96d56Sopenharmony_ci    def test_async_gen_expression_01(self):
15467db96d56Sopenharmony_ci        async def arange(n):
15477db96d56Sopenharmony_ci            for i in range(n):
15487db96d56Sopenharmony_ci                await asyncio.sleep(0.01)
15497db96d56Sopenharmony_ci                yield i
15507db96d56Sopenharmony_ci
15517db96d56Sopenharmony_ci        def make_arange(n):
15527db96d56Sopenharmony_ci            # This syntax is legal starting with Python 3.7
15537db96d56Sopenharmony_ci            return (i * 2 async for i in arange(n))
15547db96d56Sopenharmony_ci
15557db96d56Sopenharmony_ci        async def run():
15567db96d56Sopenharmony_ci            return [i async for i in make_arange(10)]
15577db96d56Sopenharmony_ci
15587db96d56Sopenharmony_ci        res = self.loop.run_until_complete(run())
15597db96d56Sopenharmony_ci        self.assertEqual(res, [i * 2 for i in range(10)])
15607db96d56Sopenharmony_ci
15617db96d56Sopenharmony_ci    def test_async_gen_expression_02(self):
15627db96d56Sopenharmony_ci        async def wrap(n):
15637db96d56Sopenharmony_ci            await asyncio.sleep(0.01)
15647db96d56Sopenharmony_ci            return n
15657db96d56Sopenharmony_ci
15667db96d56Sopenharmony_ci        def make_arange(n):
15677db96d56Sopenharmony_ci            # This syntax is legal starting with Python 3.7
15687db96d56Sopenharmony_ci            return (i * 2 for i in range(n) if await wrap(i))
15697db96d56Sopenharmony_ci
15707db96d56Sopenharmony_ci        async def run():
15717db96d56Sopenharmony_ci            return [i async for i in make_arange(10)]
15727db96d56Sopenharmony_ci
15737db96d56Sopenharmony_ci        res = self.loop.run_until_complete(run())
15747db96d56Sopenharmony_ci        self.assertEqual(res, [i * 2 for i in range(1, 10)])
15757db96d56Sopenharmony_ci
15767db96d56Sopenharmony_ci    def test_asyncgen_nonstarted_hooks_are_cancellable(self):
15777db96d56Sopenharmony_ci        # See https://bugs.python.org/issue38013
15787db96d56Sopenharmony_ci        messages = []
15797db96d56Sopenharmony_ci
15807db96d56Sopenharmony_ci        def exception_handler(loop, context):
15817db96d56Sopenharmony_ci            messages.append(context)
15827db96d56Sopenharmony_ci
15837db96d56Sopenharmony_ci        async def async_iterate():
15847db96d56Sopenharmony_ci            yield 1
15857db96d56Sopenharmony_ci            yield 2
15867db96d56Sopenharmony_ci
15877db96d56Sopenharmony_ci        async def main():
15887db96d56Sopenharmony_ci            loop = asyncio.get_running_loop()
15897db96d56Sopenharmony_ci            loop.set_exception_handler(exception_handler)
15907db96d56Sopenharmony_ci
15917db96d56Sopenharmony_ci            async for i in async_iterate():
15927db96d56Sopenharmony_ci                break
15937db96d56Sopenharmony_ci
15947db96d56Sopenharmony_ci        asyncio.run(main())
15957db96d56Sopenharmony_ci
15967db96d56Sopenharmony_ci        self.assertEqual([], messages)
15977db96d56Sopenharmony_ci
15987db96d56Sopenharmony_ci    def test_async_gen_await_same_anext_coro_twice(self):
15997db96d56Sopenharmony_ci        async def async_iterate():
16007db96d56Sopenharmony_ci            yield 1
16017db96d56Sopenharmony_ci            yield 2
16027db96d56Sopenharmony_ci
16037db96d56Sopenharmony_ci        async def run():
16047db96d56Sopenharmony_ci            it = async_iterate()
16057db96d56Sopenharmony_ci            nxt = it.__anext__()
16067db96d56Sopenharmony_ci            await nxt
16077db96d56Sopenharmony_ci            with self.assertRaisesRegex(
16087db96d56Sopenharmony_ci                    RuntimeError,
16097db96d56Sopenharmony_ci                    r"cannot reuse already awaited __anext__\(\)/asend\(\)"
16107db96d56Sopenharmony_ci            ):
16117db96d56Sopenharmony_ci                await nxt
16127db96d56Sopenharmony_ci
16137db96d56Sopenharmony_ci            await it.aclose()  # prevent unfinished iterator warning
16147db96d56Sopenharmony_ci
16157db96d56Sopenharmony_ci        self.loop.run_until_complete(run())
16167db96d56Sopenharmony_ci
16177db96d56Sopenharmony_ci    def test_async_gen_await_same_aclose_coro_twice(self):
16187db96d56Sopenharmony_ci        async def async_iterate():
16197db96d56Sopenharmony_ci            yield 1
16207db96d56Sopenharmony_ci            yield 2
16217db96d56Sopenharmony_ci
16227db96d56Sopenharmony_ci        async def run():
16237db96d56Sopenharmony_ci            it = async_iterate()
16247db96d56Sopenharmony_ci            nxt = it.aclose()
16257db96d56Sopenharmony_ci            await nxt
16267db96d56Sopenharmony_ci            with self.assertRaisesRegex(
16277db96d56Sopenharmony_ci                    RuntimeError,
16287db96d56Sopenharmony_ci                    r"cannot reuse already awaited aclose\(\)/athrow\(\)"
16297db96d56Sopenharmony_ci            ):
16307db96d56Sopenharmony_ci                await nxt
16317db96d56Sopenharmony_ci
16327db96d56Sopenharmony_ci        self.loop.run_until_complete(run())
16337db96d56Sopenharmony_ci
16347db96d56Sopenharmony_ci    def test_async_gen_aclose_twice_with_different_coros(self):
16357db96d56Sopenharmony_ci        # Regression test for https://bugs.python.org/issue39606
16367db96d56Sopenharmony_ci        async def async_iterate():
16377db96d56Sopenharmony_ci            yield 1
16387db96d56Sopenharmony_ci            yield 2
16397db96d56Sopenharmony_ci
16407db96d56Sopenharmony_ci        async def run():
16417db96d56Sopenharmony_ci            it = async_iterate()
16427db96d56Sopenharmony_ci            await it.aclose()
16437db96d56Sopenharmony_ci            await it.aclose()
16447db96d56Sopenharmony_ci
16457db96d56Sopenharmony_ci        self.loop.run_until_complete(run())
16467db96d56Sopenharmony_ci
16477db96d56Sopenharmony_ci    def test_async_gen_aclose_after_exhaustion(self):
16487db96d56Sopenharmony_ci        # Regression test for https://bugs.python.org/issue39606
16497db96d56Sopenharmony_ci        async def async_iterate():
16507db96d56Sopenharmony_ci            yield 1
16517db96d56Sopenharmony_ci            yield 2
16527db96d56Sopenharmony_ci
16537db96d56Sopenharmony_ci        async def run():
16547db96d56Sopenharmony_ci            it = async_iterate()
16557db96d56Sopenharmony_ci            async for _ in it:
16567db96d56Sopenharmony_ci                pass
16577db96d56Sopenharmony_ci            await it.aclose()
16587db96d56Sopenharmony_ci
16597db96d56Sopenharmony_ci        self.loop.run_until_complete(run())
16607db96d56Sopenharmony_ci
16617db96d56Sopenharmony_ci    def test_async_gen_aclose_compatible_with_get_stack(self):
16627db96d56Sopenharmony_ci        async def async_generator():
16637db96d56Sopenharmony_ci            yield object()
16647db96d56Sopenharmony_ci
16657db96d56Sopenharmony_ci        async def run():
16667db96d56Sopenharmony_ci            ag = async_generator()
16677db96d56Sopenharmony_ci            asyncio.create_task(ag.aclose())
16687db96d56Sopenharmony_ci            tasks = asyncio.all_tasks()
16697db96d56Sopenharmony_ci            for task in tasks:
16707db96d56Sopenharmony_ci                # No AttributeError raised
16717db96d56Sopenharmony_ci                task.get_stack()
16727db96d56Sopenharmony_ci
16737db96d56Sopenharmony_ci        self.loop.run_until_complete(run())
16747db96d56Sopenharmony_ci
16757db96d56Sopenharmony_ci
16767db96d56Sopenharmony_ciif __name__ == "__main__":
16777db96d56Sopenharmony_ci    unittest.main()
1678