@@ -909,12 +909,87 @@ async def spam():
909909 def test_aiter_callable_awaitable (self ):
910910 it = aiter (self .make_counter (), 10 )
911911 awaitable = it .__anext__ ()
912+ self .assertIsNone (awaitable .aw_wrapped )
912913 self .assertIsNone (awaitable .close ())
914+ self .assertIsNone (awaitable .aw_wrapped )
913915 with self .assertRaises (RuntimeError ):
914916 self .loop .run_until_complete (awaitable )
915917 awaitable = it .__anext__ ()
916918 with self .assertRaises (KeyError ):
917919 awaitable .throw (KeyError ('injected' ))
920+ self .assertIsNone (awaitable .aw_wrapped )
921+
922+ def test_aiter_callable_wrapped (self ):
923+ async def produce ():
924+ await awaitable ()
925+ await awaitable ()
926+ return 1
927+
928+ class CustomAwaitable :
929+ def __init__ (self ):
930+ self .iterator = self .iterate ()
931+
932+ def iterate (self ):
933+ yield ('result' ,)
934+
935+ def __await__ (self ):
936+ return self .iterator
937+
938+ for factory in (produce , awaitable , CustomAwaitable ):
939+ for action in ('complete' , 'close' , 'throw' ):
940+ with self .subTest (factory = factory , action = action ):
941+ calls = []
942+
943+ def get_awaitable ():
944+ wrapped = factory ()
945+ calls .append (wrapped )
946+ return wrapped
947+
948+ wrapper = anext (aiter (get_awaitable , object ()))
949+ try :
950+ self .assertIsNone (wrapper .aw_wrapped )
951+ self .assertEqual (calls , [])
952+ with self .assertRaises (AttributeError ):
953+ wrapper .aw_wrapped = None
954+ with self .assertRaises (AttributeError ):
955+ del wrapper .aw_wrapped
956+ self .assertEqual (next (wrapper ), ('result' ,))
957+ self .assertIs (wrapper .aw_wrapped , calls [0 ])
958+ if factory is produce :
959+ delegate = calls [0 ].cr_await
960+ self .assertEqual (wrapper .send (None ), ('result' ,))
961+ self .assertIs (wrapper .aw_wrapped , calls [0 ])
962+ self .assertIsNot (calls [0 ].cr_await , delegate )
963+ if action == 'complete' :
964+ with self .assertRaises (StopIteration ):
965+ wrapper .send (None )
966+ elif action == 'throw' :
967+ with self .assertRaises (AwaitException ):
968+ wrapper .throw (AwaitException )
969+ else :
970+ wrapper .close ()
971+ self .assertIs (wrapper .aw_wrapped , calls [0 ])
972+ finally :
973+ wrapper .close ()
974+
975+ def test_aiter_callable_wrapped_sentinel (self ):
976+ async def produce ():
977+ return 1
978+
979+ iterator = aiter (produce , 1 )
980+ wrapper = anext (iterator )
981+ with self .assertRaises (StopAsyncIteration ):
982+ wrapper .send (None )
983+ wrapped = wrapper .aw_wrapped
984+ self .assertIsNotNone (wrapped )
985+ self .assertEqual (inspect .getcoroutinestate (wrapped ),
986+ inspect .CORO_CLOSED )
987+ wrapper .close ()
988+ self .assertIs (wrapper .aw_wrapped , wrapped )
989+ exhausted = anext (iterator )
990+ with self .assertRaises (StopAsyncIteration ):
991+ exhausted .send (None )
992+ self .assertIsNone (exhausted .aw_wrapped )
918993
919994 def test_aiter_callable_cancel (self ):
920995 # Cancellation is delivered to the awaited callable result
@@ -931,9 +1006,15 @@ async def consume():
9311006 async def main ():
9321007 task = asyncio .ensure_future (consume ())
9331008 await asyncio .sleep (0 )
1009+ wrapper = task .get_coro ().cr_await
1010+ wrapped = wrapper .aw_wrapped
1011+ self .assertIsNotNone (wrapped )
9341012 task .cancel ()
9351013 with self .assertRaises (asyncio .CancelledError ):
9361014 await task
1015+ self .assertIs (wrapper .aw_wrapped , wrapped )
1016+ self .assertEqual (inspect .getcoroutinestate (wrapped ),
1017+ inspect .CORO_CLOSED )
9371018 self .loop .run_until_complete (main ())
9381019 self .assertEqual (cancelled , [1 ])
9391020
0 commit comments