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