
    <e`x                         d Z ddlZddlZddlmZmZmZ ddlmZ  G d dej	                  Z
edk    r ej                     dS dS )z
Test suite for PEP 380 implementation

adapted from original tests written by Greg Ewing
see <http://www.cosc.canterbury.ac.nz/greg.ewing/python/yield-from/YieldFrom-Python3.1.2-rev5.zip>
    N)captured_stderr
disable_gc
gc_collect)supportc                       e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d  Z"d! Z#d" Z$d#S )$TestPEP380Operationz
    Test semantics.
    c                     g fd}fd |            D ]}                     d|           |                     g d           dS )zH
        Test delegation of initial next() call to subgenerator
        c               3      K                        d                         E d {V                       d           d S NStarting g1Finishing g1appendg2traces   +/usr/lib/python3.11/test/test_yield_from.pyg1zOTestPEP380Operation.test_delegation_of_initial_next_to_subgenerator.<locals>.g1   sH      LL'''rttOOOOOOOLL(((((    c               3   h   K                         d           dV                        d           d S )NStarting g2*   Finishing g2r   r   s   r   r   zOTestPEP380Operation.test_delegation_of_initial_next_to_subgenerator.<locals>.g2   s:      LL'''HHHLL(((((r   Yielded )r   r   z
Yielded 42r   r   Nr   assertEqualselfr   xr   r   s      @@r   /test_delegation_of_initial_next_to_subgeneratorzCTestPEP380Operation.test_delegation_of_initial_next_to_subgenerator   s     	) 	) 	) 	) 	) 	)	) 	) 	) 	) 	)  	. 	.ALLL,----  
  
  
 	 	 	 	 	r   c                 >   g fd}fd	  |            D ]}                     d|           	 |                     d           n8# t          $ r+}|                     |j        d         d           Y d}~nd}~ww xY w|                     g d           dS )	z?
        Test raising exception in initial next() call
        c               3      K   	                      d                         E d {V                       d           d S #                      d           w xY wr   r   r   s   r   r   zKTestPEP380Operation.test_raising_exception_in_initial_next_call.<locals>.g11   se      -]+++244^,,,,,^,,,,s   %A Ac                      	                       d           t          d          #                       d           w xY w)Nr   spanish inquisition occurredr   r   
ValueErrorr   s   r   r   zKTestPEP380Operation.test_raising_exception_in_initial_next_call.<locals>.g27   sB    -]+++ !?@@@^,,,,s   $' >r   'subgenerator failed to raise ValueErrorr   r%   N)r   r   r   r   r   failr'   r   argsr   r   r    er   r   s       @@r   +test_raising_exception_in_initial_next_callz?TestPEP380Operation.test_raising_exception_in_initial_next_call,   s    	- 	- 	- 	- 	- 	-	- 	- 	- 	- 	-	ARTT 2 2QQ011112
 II?@@@@  	H 	H 	HQVAY(FGGGGGGGG	H 	  
  
  
 	 	 	 	 	   %A 
B!A==Bc                     g fd}fd |            D ]}                     d|           |                     g d           dS )z@
        Test delegation of next() call to subgenerator
        c               3      K                        d           dV                E d {V  dV                       d           d S Nr   g1 hamg1 eggsr   r   r   s   r   r   zLTestPEP380Operation.test_delegation_of_next_call_to_subgenerator.<locals>.g1P   sZ      LL'''NNNrttOOOOOOOOOOLL(((((r   c               3   p   K                         d           dV  dV                        d           d S Nr   g2 spamg2 more spamr   r   r   s   r   r   zLTestPEP380Operation.test_delegation_of_next_call_to_subgenerator.<locals>.g2V   sF      LL'''OOO    LL(((((r   r   )r   Yielded g1 hamr   Yielded g2 spamYielded g2 more spamr   Yielded g1 eggsr   Nr   r   s      @@r   ,test_delegation_of_next_call_to_subgeneratorz@TestPEP380Operation.test_delegation_of_next_call_to_subgeneratorK   s     	) 	) 	) 	) 	) 	)	) 	) 	) 	) 	)
  	. 	.ALLL,---- 	 
 	 
 	 
 		 		 		 		 		r   c                 >   g fd}fd	  |            D ]}                     d|           	 |                     d           n8# t          $ r+}|                     |j        d         d           Y d}~nd}~ww xY w|                     g d           dS )	zA
        Test raising exception in delegated next() call
        c               3      K   	                      d           dV                E d {V  dV                       d           d S #                      d           w xY wr2   r   r   s   r   r   zMTestPEP380Operation.test_raising_exception_in_delegated_next_call.<locals>.g1m   w      -]+++244^,,,,,^,,,,   -A	 	A c               3      K   	                       d           dV  t          d          #                       d           w xY w)Nr   r7   hovercraft is full of eelsr8   r   r&   r   s   r   r   zMTestPEP380Operation.test_raising_exception_in_delegated_next_call.<locals>.g2u   sQ      -]+++ !=>>> ^,,,,s	   (- Ar   r(   r   rC   Nr   r9   r   r:   r   r   r)   r,   s       @@r   -test_raising_exception_in_delegated_next_callzATestPEP380Operation.test_raising_exception_in_delegated_next_callh   s    	- 	- 	- 	- 	- 	-	- 	- 	- 	- 	-	ARTT 2 2QQ011112
 II?@@@@  	F 	F 	FQVAY(DEEEEEEEE	F 	  
  
  
 	 	 	 	 	r/   c                    g fd}fd |            }t          |          }d}	 	 |                    |          }                    d|           |dz  }3# t          $ r Y nw xY w|                     g d           dS )z+
        Test delegation of send()
        c               3      K                        d           dV }                      d|                         E d {V  dV }                      d|                                 d           d S Nr   r3   zg1 received r4   r   r   r    r   r   s    r   r   z7TestPEP380Operation.test_delegation_of_send.<locals>.g1         LL'''ALLLQQ0111rttOOOOOOOALLLQQ0111LL(((((r   c               3      K                        d           dV }                      d|            dV }                      d|                                 d           d S )Nr   r7   g2 received r8   r   r   r    r   s    r   r   z7TestPEP380Operation.test_delegation_of_send.<locals>.g2   sw      LL'''ALLLQQ0111$$$ALLLQQ0111LL(((((r      r   )r   g1 received 1r   r:   g2 received 2r;   zg2 received 3r   r<   zg1 received 4r   N)nextsendr   StopIterationr   )r   r   gyr    r   r   s        @@r   test_delegation_of_sendz+TestPEP380Operation.test_delegation_of_send   s     	) 	) 	) 	) 	) 	)	) 	) 	) 	) 	) BDDGG	FF1IIQQ0111Q  	 	 	D	  
  
  
 	 	 	 	 	s   4A   
A-,A-c                     g fdfdfd}|                      t          |           |                     g d           dS )zA
        Test handling exception while delegating 'send'
        c               3      K                        d           dV }                      d|                         E d {V  dV }                      d|                                 d           d S rH   r   rI   s    r   r   zMTestPEP380Operation.test_handling_exception_while_delegating_send.<locals>.g1   rJ   r   c               3      K                        d           dV }                      d|            t          d          )Nr   r7   rL   rC   r&   rM   s    r   r   zMTestPEP380Operation.test_handling_exception_while_delegating_send.<locals>.g2   sJ      LL'''ALLLQQ01119:::r   c                                   } t          |           }d}	 	 |                     |          }                    d|           |dz  }3# t          $ r                     d           Y d S w xY w)NrN   r   rS   )rQ   rR   r   rS   )rT   rU   r    r   r   s      r   runzNTestPEP380Operation.test_handling_exception_while_delegating_send.<locals>.run   s    AQAA.q		ALLL!4555FA ! . . ._------.s   4A A54A5)r   rO   r   r:   rP   N)assertRaisesr'   r   r   r[   r   r   r   s     @@@r   -test_handling_exception_while_delegating_sendzATestPEP380Operation.test_handling_exception_while_delegating_send   s     	) 	) 	) 	) 	) 	)	) 	) 	) 	) 	)
	. 
	. 
	. 
	. 
	. 
	. 	*S)))  
  
  
 	 	 	 	 	r   c                    g fd}fd |            }t          d          D ])}t          |          }                    d|           *|                                 |                     g d           dS )z)
        Test delegating 'close'
        c               3      K   	                      d           dV                E d {V  dV                       d           d S #                      d           w xY wr2   r   r   s   r   r   z5TestPEP380Operation.test_delegating_close.<locals>.g1   r@   rA   c               3      K   	                       d           dV  dV                        d           d S #                       d           w xY wr6   r   r   s   r   r   z5TestPEP380Operation.test_delegating_close.<locals>.g2   c      -]+++$$$$^,,,,,^,,,,	   9 A   r   rD   N)rangerQ   r   closer   )r   r   rT   ir    r   r   s        @@r   test_delegating_closez)TestPEP380Operation.test_delegating_close   s     	- 	- 	- 	- 	- 	-	- 	- 	- 	- 	- BDDq 	. 	.AQALLL,----				  
  
  
 	 	 	 	 	r   c                    g fd}fd	  |            }t          d          D ])}t          |          }                    d|           *|                                 |                     d           nX# t
          $ rK}|                     |j        d         d           |                     |j	        t                     Y d}~nd}~ww xY w|                     g d	           dS )
zB
        Test handling exception while delegating 'close'
        c               3      K   	                      d           dV                E d {V  dV                       d           d S #                      d           w xY wr2   r   r   s   r   r   zMTestPEP380Operation.test_handing_exception_while_delegating_close.<locals>.g1	  r@   rA   c               3      K   	                       d           dV  dV                        d           t          d          #                       d           t          d          xY w)Nr   r7   r8   r   "nybbles have exploded with delightr&   r   s   r   r   zMTestPEP380Operation.test_handing_exception_while_delegating_close.<locals>.g2  s      G]+++$$$$^,,, !EFFF ^,,, !EFFFFFFs   A %A+rd   r   r(   r   rl   NrD   )re   rQ   r   rf   r*   r'   r   r+   assertIsInstance__context__GeneratorExitr   r   rT   rg   r    r-   r   r   s         @@r   -test_handing_exception_while_delegating_closezATestPEP380Operation.test_handing_exception_while_delegating_close  sW    	- 	- 	- 	- 	- 	-	G 	G 	G 	G 	G
	AA1XX 2 2GGQQ01111GGIII
 II?@@@@	  	@ 	@ 	@QVAY(LMMM!!!-????????	@
 	  
  
  
 	 	 	 	 	s   AA> >
CACCc                    g fd}fd	  |            }t          d          D ])}t          |          }                    d|           *t          d          }|                    |           |                     d           n8# t          $ r+}|                     |j        d         d           Y d}~nd}~ww xY w|                     g d	           dS )
z)
        Test delegating 'throw'
        c               3      K   	                      d           dV                E d {V  dV                       d           d S #                      d           w xY wr2   r   r   s   r   r   z5TestPEP380Operation.test_delegating_throw.<locals>.g12  r@   rA   c               3      K   	                       d           dV  dV                        d           d S #                       d           w xY wr6   r   r   s   r   r   z5TestPEP380Operation.test_delegating_throw.<locals>.g2:  rb   rc   rd   r   tomato ejectedr(   r   NrD   re   rQ   r   r'   throwr*   r   r+   rp   s         @@r   test_delegating_throwz)TestPEP380Operation.test_delegating_throw-  sF    	- 	- 	- 	- 	- 	-	- 	- 	- 	- 	-
	AA1XX 2 2GGQQ01111+,,AGGAJJJ II?@@@@  	: 	: 	:QVAY(899999999	: 	  
  
  
 	 	 	 	 	s   A'B 
C!B>>Cc                     g fd}t                      } ||           t          d          } ||           d|_         ||           |                     g d           dS )zC
        Test 'value' attribute of StopIteration exception
        c                                          | j        j        d|                                 d| j                   d S )Nz: zvalue = )r   	__class____name__value)r-   r   s    r   pexzPTestPEP380Operation.test_value_attribute_of_StopIteration_exception.<locals>.pexZ  sH    LLQ[%9%9%911=>>>LLL233333r   spameggs)zStopIteration: zvalue = NoneStopIteration: spamzvalue = spamr   zvalue = eggsN)rS   r}   r   )r   r~   r-   r   s      @r   /test_value_attribute_of_StopIteration_exceptionzCTestPEP380Operation.test_value_attribute_of_StopIteration_exceptionU  s     	4 	4 	4 	4 	4 OOA&!!AA  
  
  
 	 	 	 	 	r   c                 p    fd}d |                      t           |                      dg           d S )Nc               3   ,   K                 E d {V  d S N )r   s   r   r   z:TestPEP380Operation.test_exception_value_crash.<locals>.g1p  s"      rttOOOOOOOOOr   c               3      K   dV  dgS )Nr   r   r   r   r   r   r   z:TestPEP380Operation.test_exception_value_crash.<locals>.g2r  s      JJJ4Kr   r   )r   list)r   r   r   s     @r   test_exception_value_crashz.TestPEP380Operation.test_exception_value_crashm  sW    	 	 	 	 		 	 	 	bbdddV,,,,,r   c                     g fd}dfd	 |            D ]}                     d|           |                     g d           dS )z-
        Test generator return value
        c               3   <  K                        d           dV               E d {V }                      d|            ddt          d          fD ]+} |          E d {V }                      d|            ,dV                       d           d S )	Nr   r3   zg2 returned rN   rd      r4   r   )r   rS   )retvr   r   s     r   r   z;TestPEP380Operation.test_generator_return_value.<locals>.g1}  s      LL'''NNNRTT//////CLLLSS2333mA... 8 8!#A&&&&&&67777OOOLL(((((r   Nc              3   x   K                        d           dV  dV                       d           | r| S d S r6   r   )r   r   s    r   r   z;TestPEP380Operation.test_generator_return_value.<locals>.g2  sW      LL'''OOO    LL(((  r   r   )r   r9   r   r:   r;   r   zg2 returned Noner   r:   r;   r   zg2 returned 1r   r:   r;   r   zg2 returned (2,)r   r:   r;   r   zg2 returned StopIteration(3)r<   r   r   r   r   s      @@r   test_generator_return_valuez/TestPEP380Operation.test_generator_return_valuex  s     		) 		) 		) 		) 		) 		)	 	 	 	 	 	  	. 	.ALLL,----  
  
  
 	 	 	 	 	r   c                     g }d } |            D ]}|                     d|           |                     |g d           dS )z<
        Test delegation of next() to non-generator
        c               3   4   K   t          d          E d {V  d S Nr   re   r   r   r   rT   zGTestPEP380Operation.test_delegation_of_next_to_non_generator.<locals>.g  *      Qxxr   r   )	Yielded 0	Yielded 1	Yielded 2Nr   )r   r   rT   r    s       r   (test_delegation_of_next_to_non_generatorz<TestPEP380Operation.test_delegation_of_next_to_non_generator  s|     	  	  	  	. 	.ALLL,----  
  
  
 	 	 	 	 	r   c                     g }d } |            }t          d          D ]/}|                    d          }|                    d|           0|                     |g d           dS )z9
        Test conversion of send(None) to next()
        c               3   4   K   t          d          E d {V  d S r   r   r   r   r   rT   zBTestPEP380Operation.test_conversion_of_sendNone_to_next.<locals>.g  r   r   r   N	Yielded: )z
Yielded: 0z
Yielded: 1z
Yielded: 2)re   rR   r   r   )r   r   rT   gir    rU   s         r   #test_conversion_of_sendNone_to_nextz7TestPEP380Operation.test_conversion_of_sendNone_to_next  s     	  	  	 QSSq 	/ 	/AALLL!!-....  
  
  
 	 	 	 	 	r   c                 <   g fd} |            }t          |           t                      5 }|                                 ddd           n# 1 swxY w Y   |                     |                                d           |                     ddg           dS )z=
        Test delegation of close() to non-generator
        c               3      K   	                       d           t          d          E d {V                        d                                 d           d S #                       d           w xY wN
starting gr   zg should not be herefinishing gr   re   r   s   r   rT   zHTestPEP380Operation.test_delegation_of_close_to_non_generator.<locals>.g        ,\*** 88#######3444]+++++]++++   ?A A2N r   r   )rQ   r   rf   r   getvalue)r   rT   r   outputr   s       @r   )test_delegation_of_close_to_non_generatorz=TestPEP380Operation.test_delegation_of_close_to_non_generator  s     	, 	, 	, 	, 	, QSSR 	&HHJJJ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	**B/// 
 	 	 	 	 	s   AAAc                    g fd}	  |            }t          d          D ])}t          |          }                    d|           *t          d          }|                    |           |                     d           n8# t          $ r+}|                     |j        d         d           Y d}~nd}~ww xY w|                     g d           dS )	z:
        Test delegating 'throw' to non-generator
        c               3      K   	                       d           t          d          E d {V                        d           d S #                       d           w xY w)N
Starting g
   Finishing gr   r   s   r   rT   zETestPEP380Operation.test_delegating_throw_to_non_generator.<locals>.g  sl      ,\*** 99$$$$$$$]+++++]++++s   *A A   r   ru   r(   r   N)r   r   r   r   z	Yielded 3z	Yielded 4r   rv   )r   rT   r   rg   r    r-   r   s         @r   &test_delegating_throw_to_non_generatorz:TestPEP380Operation.test_delegating_throw_to_non_generator  s'    	, 	, 	, 	, 	,
	AB1XX 2 2HHQQ01111+,,AHHQKKK II?@@@@  	9 	9 	9QVAY'788888888	9 	  
  
  
 	 	 	 	 	s   A'B 
B<!B77B<c                    g fd}	  |            }t          |           t          d          D ]/}|                    d          }                    d|           0	 |                     d           n8# t
          $ r+}|                     d|j        d                    Y d}~nd}~ww xY w|                     d	d
g           dS )z:
        Test attempting to send to non-generator
        c               3      K   	                       d           t          d          E d {V                        d                                 d           d S #                       d           w xY wr   r   r   s   r   rT   zGTestPEP380Operation.test_attempting_to_send_to_non_generator.<locals>.g  r   r   r   r   zShould not have yielded: z#was able to send into non-generatorrR   r   Nr   r   )	rQ   re   rR   r   r*   AttributeErrorassertInr+   r   )r   rT   r   r    rU   r-   r   s         @r   (test_attempting_to_send_to_non_generatorz<TestPEP380Operation.test_attempting_to_send_to_non_generator  s    	, 	, 	, 	, 	,		=BHHH1XX C CGGBKKaaABBBBC II;<<<<  	- 	- 	-MM&!&),,,,,,,,	- 	 
 	 	 	 	 	s   AA9 9
B.!B))B.c                 *    G d d          fd}|                      t                    5   |            }|                     t          |          d           |                    d           ddd           n# 1 swxY w Y   |                      t                    5   |            }|                     t          |          d           |                    t                     ddd           n# 1 swxY w Y   t          j                    5 } |            }|                     t          |          d           |	                                 |                     t          |j
        j                   ddd           dS # 1 swxY w Y   dS )zG
        Test subiterator with a broken getattr implementation
        c                        e Zd Zd Zd Zd ZdS )@TestPEP380Operation.test_broken_getattr_handling.<locals>.Brokenc                     | S r   r   r   s    r   __iter__zITestPEP380Operation.test_broken_getattr_handling.<locals>.Broken.__iter__"      r   c                     dS )NrN   r   r   s    r   __next__zITestPEP380Operation.test_broken_getattr_handling.<locals>.Broken.__next__$  s    qr   c                     ddz   d S NrN   r   r   )r   attrs     r   __getattr__zLTestPEP380Operation.test_broken_getattr_handling.<locals>.Broken.__getattr__&  s    !r   N)r|   
__module____qualname__r   r   r   r   r   r   Brokenr   !  sA                r   r   c               3   ,   K                 E d {V  d S r   r   )r   s   r   rT   z;TestPEP380Operation.test_broken_getattr_handling.<locals>.g)  s+      vxxr   rN   N)r\   ZeroDivisionErrorr   rQ   rR   rw   r   r   catch_unraisable_exceptionrf   
unraisableexc_type)r   rT   r   cmr   s       @r   test_broken_getattr_handlingz0TestPEP380Operation.test_broken_getattr_handling  s`   	 	 	 	 	 	 	 		  	  	  	  	  011 	 	BT"XXq)))GGAJJJ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	
 011 	% 	%BT"XXq)))HH^$$$	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	%
 /11 	HRBT"XXq)))HHJJJ.0FGGG	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	Hs8   AA==BB"AC66C:=C:A'FFFc                     g fdd fd}|                      t          |           |                     dg           dS )z7
        Test exception in initial next() call
        c               3      K                        d                         E d {V                       d           d S )Ng1 about to yield from g2g1 should not be herer   r   s   r   r   zCTestPEP380Operation.test_exception_in_initial_next_call.<locals>.g1B  sJ      LL4555rttOOOOOOOLL011111r   c               3      K   ddz  V  d S r   r   r   r   r   r   zCTestPEP380Operation.test_exception_in_initial_next_call.<locals>.g2F  s      A#IIIIIr   c                  :                 } t          |            d S r   )rQ   )r   r   s    r   r[   zDTestPEP380Operation.test_exception_in_initial_next_call.<locals>.runH  s    BHHHHHr   r   N)r\   r   r   r]   s     @@@r   #test_exception_in_initial_next_callz7TestPEP380Operation.test_exception_in_initial_next_call=  s     	2 	2 	2 	2 	2 	2	 	 		 	 	 	 	 	+C000' 
 	 	 	 	 	r   c                 F   g fd}fd	  |            D ]}                     d|           	 |                     d           n8# t          $ r+}|                     |j        d         d           Y d}~nd}~ww xY w|                     g d           dS )	z0
        Test attempted yield-from loop
        c               3      K                        d           dV                       d                         E d {V                       d           d S )Ng1: startingy1g1: about to yield from g2r   r   r   s   r   r   z>TestPEP380Operation.test_attempted_yield_from_loop.<locals>.g1U  se      LL(((JJJLL5666rttOOOOOOOLL011111r   c               3      K                        d           dV                       d            E d {V                       d           d S )Ng2: startingy2g2: about to yield from g1zg2 should not be herer   )r   r   s   r   r   z>TestPEP380Operation.test_attempted_yield_from_loop.<locals>.g2\  s_      LL(((JJJLL5666MMMMMMMLL011111r   r   z$subgenerator didn't raise ValueErrorr   zgenerator already executingN)r   zYielded: y1r   r   zYielded: y2r   r)   )r   r   rU   r-   r   r   r   s       @@@r   test_attempted_yield_from_loopz2TestPEP380Operation.test_attempted_yield_from_loopP  s&    	2 	2 	2 	2 	2 	2	2 	2 	2 	2 	2 	2	>B 3 3aa122223
 II<====  	F 	F 	FQVAY'DEEEEEEEE	F 	  
  
  
 	 	 	 	 	s   'A 
B!BBc                 ~   g fd}fd G d dt                      |            }t          d          D ])}t          |          }                    d|           * d          }|                    |           |D ]}                    d|           |                     g d           d	S )
z=
        Test returning value from delegated 'throw'
        c               3      K   	                      d           dV                E d {V  dV                       d           d S #                      d           w xY wr2   r   r   s   r   r   zITestPEP380Operation.test_returning_value_from_delegated_throw.<locals>.g1x  r@   rA   c               3      K   	                      d           dV  dV  d S #  $ r!                      d           dV  dV  Y d S w xY w)Nr   r7   r8   Caught LunchError in g2zg2 lunch savedzg2 yet more spamr   )
LunchErrorr   s   r   r   zITestPEP380Operation.test_returning_value_from_delegated_throw.<locals>.g2  s      )]+++$$$$$$ ) ) )6777&&&&((((((()s   $ "A
	A
c                       e Zd ZdS )QTestPEP380Operation.test_returning_value_from_delegated_throw.<locals>.LunchErrorNr|   r   r   r   r   r   r   r             Dr   r   rd   r   ru   )r   r9   r   r:   r   zYielded g2 yet more spamr<   r   N)	Exceptionre   rQ   r   rw   r   )	r   r   rT   rg   r    r-   r   r   r   s	         @@@r   )test_returning_value_from_delegated_throwz=TestPEP380Operation.test_returning_value_from_delegated_throws  s6    	- 	- 	- 	- 	- 	-	) 	) 	) 	) 	) 	)	 	 	 	 	 	 	 	BDDq 	. 	.AQALLL,----J'((	


 	. 	.ALLL,---- 	 
 	 
 	 
 		 		 		 		 		r   c                     g fd}fd |d            |d            |d            |t          d                     |                     g d           dS )z1
        Test next and return with value
        c                     |           }t          |           	                     d           t          |                               d           d S # t          $ r#}                    d|           Y d }~d S d }~ww xY w)Nf resuming gf SHOULD NOT BE HERE	f caught )rQ   r   rS   rr   r-   rT   r   s      r   fz>TestPEP380Operation.test_next_and_return_with_value.<locals>.f  s    1BHHH3^,,,R344444  3 3 3aa12222222223s   9A 
B"B  Bc              3   n   K                        d           d V                       d|            | S )N
g startingg returning r   )r   r   s    r   rT   z>TestPEP380Operation.test_next_and_return_with_value.<locals>.g  s@      LL&&&EEELLLQQ0111Hr   NrN   r   r   )r   r   g returning Nonef caught StopIteration()r   r   g returning 1f caught StopIteration(1)r   r   g returning (2,)f caught StopIteration((2,))r   r   g returning StopIteration(3)(f caught StopIteration(StopIteration(3))rS   r   r   r   rT   r   s     @@r   test_next_and_return_with_valuez3TestPEP380Operation.test_next_and_return_with_value  s     	3 	3 	3 	3 	3 	3	 	 	 	 	
 	
$	!	$	-

  
  
  
 	 	 	 	 	r   c                     g fd}fd |d            |d            |d            |t          d                     |                     g d           dS )z1
        Test send and return with value
        c                     |           }t          |           	                     d           |                    d                               d           d S # t          $ r#}                    d|           Y d }~d S d }~ww xY w)Nf sending spam to gr   r   r   )rQ   r   rR   rS   r   s      r   r   z>TestPEP380Operation.test_send_and_return_with_value.<locals>.f  s    1BHHH32333344444  3 3 3aa12222222223s   ?A 
B(BBc              3      K                        d           d V }                     d|                                d|            | S )Nr   zg received r   r   )r   r    r   s     r   rT   z>TestPEP380Operation.test_send_and_return_with_value.<locals>.g  sY      LL&&&ALLLAA/000LLLQQ0111Hr   NrN   r   r   )r   r  g received 'spam'r   r   r   r  r  r   r   r   r  r  r   r   r   r  r  r   r   r   r   s     @@r   test_send_and_return_with_valuez3TestPEP380Operation.test_send_and_return_with_value  s     	3 	3 	3 	3 	3 	3	 	 	 	 	 	
$	!	$	-

 !
 !
 !
 	 	 	 	 	r   c           
      t   fdfd}ddt          d          fD ]g  |            }                    t          |                                         t          |                    t
                                         |                     ddddt                    g           d	S )
ze
        Test catching an exception thrown into a
        subgenerator and returning a value
        c               3   b   K   	 dV  n%# t           $ r                      d           Y nw xY wS )NrN   inner caught ValueError)r'   r   )r   r}   s   r   innerzTTestPEP380Operation.test_catching_exception_from_subgen_and_returning.<locals>.inner  sP      8 8 8 86777778Ls   
 ,,c               3   f   K                E d {V }                      d| d           | V  d S )Ninner returned 	 to outerr   )r   r
  r   s    r   outerzTTestPEP380Operation.test_catching_exception_from_subgen_and_returning.<locals>.outer  sL       577""""""ALLL<===GGGGGr   rd   r   rN   r	  r  r  N)rS   r   rQ   reprrw   r'   r   )r   r  rT   r
  r   r}   s      @@@r   1test_catching_exception_from_subgen_and_returningzETestPEP380Operation.test_catching_exception_from_subgen_and_returning  s    
	 	 	 	 	 		 	 	 	 	 	
 mA... 
	 
	EEALLa!!!LLaggj1122333U))057U	%    
	 
	r   c                    g fdfd}	  |            }t          |           |                    t                     |                     d           n# t          $ r Y nw xY w|                     ddg           dS )zo
        Test throwing GeneratorExit into a subgenerator that
        catches it and returns normally.
        c               3      K   	                       d           d V                        d           d S # t          $ r Y d S w xY wNEnter fExit fr   ro   r   s   r   r   zSTestPEP380Operation.test_throwing_GeneratorExit_into_subgen_that_returns.<locals>.f  sa      Y'''X&&&&&    s   .5 
AAc               3      K                        d                         E d {V                       d           d S NEnter gzExit gr   r   r   s   r   rT   zSTestPEP380Operation.test_throwing_GeneratorExit_into_subgen_that_returns.<locals>.g!  H      LL###qssNNNNNNNLL"""""r   *subgenerator failed to raise GeneratorExitr  r  N)rQ   rw   ro   r*   r   )r   rT   r   r   r   s      @@r   4test_throwing_GeneratorExit_into_subgen_that_returnszHTestPEP380Operation.test_throwing_GeneratorExit_into_subgen_that_returns  s    
 	 	 	 	 		# 	# 	# 	# 	# 	#	DBHHHHH]### IIBCCCC  	 	 	D	 	 
 	 	 	 	 	s   3A 
A'&A'c                 X   g fdfd}	  |            }t          |           |                    t                     |                     d           n8# t          $ r+}|                     |j        d         d           Y d}~nd}~ww xY w|                     ddg           dS )	ze
        Test throwing GeneratorExit into a subgenerator that
        catches it and yields.
        c               3      K   	                       d           d V                        d           d S # t          $ r d V  Y d S w xY wr  r  r   s   r   r   zXTestPEP380Operation.test_throwing_GeneratorExit_into_subgenerator_that_yields.<locals>.f8  si      Y'''X&&&&&    s   .5 AAc               3      K                        d                         E d {V                       d           d S r  r   r  s   r   rT   zXTestPEP380Operation.test_throwing_GeneratorExit_into_subgenerator_that_yields.<locals>.g?  r  r   r  r   zgenerator ignored GeneratorExitNr  r  )rQ   rw   ro   r*   RuntimeErrorr   r+   r   rT   r   r-   r   r   s       @@r   9test_throwing_GeneratorExit_into_subgenerator_that_yieldszMTestPEP380Operation.test_throwing_GeneratorExit_into_subgenerator_that_yields2  s
   
 	 	 	 	 		# 	# 	# 	# 	# 	#	DBHHHHH]### IIBCCCC  	K 	K 	KQVAY(IJJJJJJJJ	K 	 
 	 	 	 	 	s   3A 
B$!B

Bc                    g fdfd}	  |            }t          |           |                    t                     |                     d           nX# t          $ rK}|                     |j        d         d           |                     |j        t                     Y d}~nd}~ww xY w|                     ddg           dS )	z{
        Test throwing GeneratorExit into a subgenerator that
        catches it and raises a different exception.
        c               3      K   	                       d           d V                        d           d S # t          $ r t          d          w xY w)Nr  r  Vorpal bunny encountered)r   ro   r'   r   s   r   r   zRTestPEP380Operation.test_throwing_GeneratorExit_into_subgen_that_raises.<locals>.fV  si      =Y'''X&&&&&  = = = !;<<<=s	   .5 Ac               3      K                        d                         E d {V                       d           d S r  r   r  s   r   rT   zRTestPEP380Operation.test_throwing_GeneratorExit_into_subgen_that_raises.<locals>.g]  r  r   r(   r   r&  Nr  r  )	rQ   rw   ro   r*   r'   r   r+   rm   rn   r"  s       @@r   3test_throwing_GeneratorExit_into_subgen_that_raiseszGTestPEP380Operation.test_throwing_GeneratorExit_into_subgen_that_raisesP  s"   
 	= 	= 	= 	= 	=	# 	# 	# 	# 	# 	#	ABHHHHH]###
 II?@@@@	  	@ 	@ 	@QVAY(BCCC!!!-????????	@
 	 
 	 	 	 	 	s   3A 
B/$AB**B/c                 ^    d }|                      t          t           |                       d S )Nc               3      K   dE d {V  d S )Nr   r   r   r   r   rT   z4TestPEP380Operation.test_yield_from_empty.<locals>.gp  s      MMMMMMMMMr   )r\   rS   rQ   )r   rT   s     r   test_yield_from_emptyz)TestPEP380Operation.test_yield_from_emptyo  s5    	 	 	-qqss33333r   c                     fd}fd |                                  t                    g d            |            t                    g}	 	 |                                        d                     )# t
          $ r Y nw xY w                      |g d            G d dt                    fd}fd	 |            t                    g}	 	 |                                                             )# t
          $ r Y n                       |g d            xY w G  fd
dt                    fd} |            t                     	                                 d S )Nc               3   <   K   dV                E d {V  dV  d S Nr   r   r   )twos   r   onezOTestPEP380Operation.test_delegating_generators_claim_to_be_running.<locals>.onev  s;      GGGsuuGGGGGr   c               3   P   K   dV  	  E d {V  n# t           $ r Y nw xY wdV  d S NrN   rd   r'   )r   s   r   r/  zOTestPEP380Operation.test_delegating_generators_claim_to_be_running.<locals>.twoz  sU      GGG   GGGGGs    
)r   rN   rd   r   Tr   c                       e Zd ZdS )QTestPEP380Operation.test_delegating_generators_claim_to_be_running.<locals>.MyErrNr   r   r   r   MyErrr5    r   r   r6  c               3   p   K   	 dV  n#  $ r Y nw xY w             E d {V  	 dV  d S #  $ r Y d S w xY wr.  r   )r6  r/  s   r   r0  zOTestPEP380Operation.test_delegating_generators_claim_to_be_running.<locals>.one  s         suu   s   
 , 55c               3      K   	 dV  n#  $ r Y nw xY w	 E d {V  n# t           $ r Y nw xY w	 dV  d S #  $ r Y d S w xY wr2  r3  )r6  r   s   r   r/  zOTestPEP380Operation.test_delegating_generators_claim_to_be_running.<locals>.two  s               s$   
  
,,6 ??c                   (    e Zd Zd Zd Z fdZdS )PTestPEP380Operation.test_delegating_generators_claim_to_be_running.<locals>.MyItc                     | S r   r   r   s    r   r   zYTestPEP380Operation.test_delegating_generators_claim_to_be_running.<locals>.MyIt.__iter__  r   r   c                     dS Nr   r   r   s    r   r   zYTestPEP380Operation.test_delegating_generators_claim_to_be_running.<locals>.MyIt.__next__      rr   c                 ~                         j                                       t          t                     d S r   )
assertTrue
gi_runningr\   r'   rQ   )self_r   r   s    r   rf   zVTestPEP380Operation.test_delegating_generators_claim_to_be_running.<locals>.MyIt.close  s5    ...!!*dB77777r   N)r|   r   r   r   r   rf   )r   r   s   r   MyItr:    sQ            8 8 8 8 8 8 8 8r   rC  c               3   ,   K                 E d {V  d S r   r   )rC  s   r   r0  zOTestPEP380Operation.test_delegating_generators_claim_to_be_running.<locals>.one  s+      tvvr   )
r   r   rQ   r   rR   rS   r   rw   objectrf   )r   r0  resr6  rC  r   r/  s   `  @@@@r   .test_delegating_generators_claim_to_be_runningzBTestPEP380Operation.test_delegating_generators_claim_to_be_runningt  sD   	 	 	 	 		 	 	 	 	 SUUb<<<000SUUBxxj	(

2772;;'''( 	 	 	D	lll+++	 	 	 	 	I 	 	 			 		 		 		 		 			 	 	 	 	 	 SUUBxxj	,

288E??+++, 	 	 	D	S,,,///	8 	8 	8 	8 	8 	8 	8 	86 	8 	8 	8	 	 	 	 	SUUR





s$   *B 
BB&*D 
D6D6c                     d fd}d }d } | |                      D ]}|                      d|v             | | |                                D ]}|                      d|v od|v            d S )Nc                  <    d t          j                    D             S )Nc                     g | ]
}|d          S )r   r   ).0r   s     r   
<listcomp>zaTestPEP380Operation.test_delegator_is_visible_to_debugger.<locals>.call_stack.<locals>.<listcomp>  s    222QAaD222r   )inspectstackr   r   r   
call_stackzMTestPEP380Operation.test_delegator_is_visible_to_debugger.<locals>.call_stack  s    22'-//2222r   c               3   T   K                 V                V                V  d S r   r   )rO  s   r   genzFTestPEP380Operation.test_delegator_is_visible_to_debugger.<locals>.gen  sC      *,,*,,*,,r   c              3      K   | E d {V  d S r   r   rT   s    r   r   zGTestPEP380Operation.test_delegator_is_visible_to_debugger.<locals>.spam        LLLLLLLLLr   c              3      K   | E d {V  d S r   r   rS  s    r   r   zGTestPEP380Operation.test_delegator_is_visible_to_debugger.<locals>.eggs  rT  r   r   r   )r@  )r   rQ  r   r   rN  rO  s        @r   %test_delegator_is_visible_to_debuggerz9TestPEP380Operation.test_delegator_is_visible_to_debugger  s    	3 	3 	3	 	 	 	 	
	 	 		 	 	 T##%%[[ 	- 	-EOOFeO,,,,T$$ssuu++&& 	A 	AEOOFeO?%@@@@	A 	Ar   c                      G d d          fd}d t           |                       |                     d           d S )Nc                       e Zd Zd Zd ZdS )?TestPEP380Operation.test_custom_iterator_return.<locals>.MyIterc                     | S r   r   r   s    r   r   zHTestPEP380Operation.test_custom_iterator_return.<locals>.MyIter.__iter__  r   r   c                      t          d          r=  )rS   r   s    r   r   zHTestPEP380Operation.test_custom_iterator_return.<locals>.MyIter.__next__  s    #B'''r   N)r|   r   r   r   r   r   r   r   MyIterrY    s2          ( ( ( ( (r   r\  c               3   ,   K                 E d {V d S r   r   )r\  r   s   r   rQ  z<TestPEP380Operation.test_custom_iterator_return.<locals>.gen  s(      #VXX%%%%%%CCCr   r   )r   r   )r   rQ  r\  r   s     @@r   test_custom_iterator_returnz/TestPEP380Operation.test_custom_iterator_return  s~    	( 	( 	( 	( 	( 	( 	( 	(
	& 	& 	& 	& 	& 	& SSUUb!!!!!r   c                 2   d fd}d }t                      5   |            } |            }|                    d            |                    |           |                    |           ~~t                       d d d            d S # 1 swxY w Y   d S )Nc               3      K   d V  d S r   r   r   r   r   	innermostzDTestPEP380Operation.test_close_with_cleared_frame.<locals>.innermost  s      EEEEEr   c               3   4   K   d V }              E d {V  d S r   r   )	outer_genra  s    r   r
  z@TestPEP380Operation.test_close_with_cleared_frame.<locals>.inner  s4      I y{{"""""""""r   c               3   "   K   d V } | E d {V  d S r   r   )	inner_gens    r   r  z@TestPEP380Operation.test_close_with_cleared_frame.<locals>.outer  s-      I          r   )r   rR   r   )r   r
  r  re  rc  ra  s        @r   test_close_with_cleared_framez1TestPEP380Operation.test_close_with_cleared_frame  s   &	 	 		# 	# 	# 	# 	#	! 	! 	! \\ 		 		IINN4   NN9%%%NN9%%%LLL		 		 		 		 		 		 		 		 		 		 		 		 		 		 		 		 		 		s   A$BBBc                      G fdd          fd} |            }t          |           d |                    d           |                     d           d S )Nc                   &    e Zd Zd Zd Z fdZdS )HTestPEP380Operation.test_send_tuple_with_custom_generator.<locals>.MyGenc                     | S r   r   r   s    r   r   zQTestPEP380Operation.test_send_tuple_with_custom_generator.<locals>.MyGen.__iter__  r   r   c                     dS r=  r   r   s    r   r   zQTestPEP380Operation.test_send_tuple_with_custom_generator.<locals>.MyGen.__next__  r>  r   c                     |d S r   r   )r   whatr   s     r   rR   zMTestPEP380Operation.test_send_tuple_with_custom_generator.<locals>.MyGen.send  s    tr   N)r|   r   r   r   r   rR   )r   s   r   MyGenri    sL                  r   rn  c               3   ,   K                E d {V } d S r   r   )r   rn  s    r   r  zHTestPEP380Operation.test_send_tuple_with_custom_generator.<locals>.outer  s(       577""""""AAAr   )rN   rd   r      )rQ   rR   r   )r   r  rT   rn  r   s      @@r   %test_send_tuple_with_custom_generatorz9TestPEP380Operation.test_send_tuple_with_custom_generator	  s    	 	 	 	 	 	 	 	 	 		# 	# 	# 	# 	#EGGQ	|L)))))r   N)%r|   r   r   __doc__r!   r.   r=   rE   rV   r^   rh   rq   rx   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r#  r(  r+  rG  rV  r^  rf  rq  r   r   r   r   r      s%          .  >  :# # #J* * *X' ' 'R     D' ' 'R& & &P  0- - -1 1 1f     "  ,  @  6H H H@  &! ! !F) ) )V( ( (T- - -^  :  <  <  >4 4 4
I I IVA A A*" " "% % %N* * * * *r   r   __main__)rr  unittestrM  test.supportr   r   r   testr   TestCaser   r|   mainr   r   r   <module>ry     s       @ @ @ @ @ @ @ @ @ @      J* J* J* J* J*(+ J* J* J*Z  zHMOOOOO r   