a zex@sZdZddlZddlZddlmZmZmZddlmZGdddej Z e dkrVe dS)z Test suite for PEP 380 implementation adapted from original tests written by Greg Ewing see N)captured_stderr disable_gc gc_collect)supportc@seZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ ddZ ddZddZddZddZddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd,d-Zd.d/Zd0d1Zd2d3Zd4d5Zd6d7Zd8d9Zd:d;Z dd?Z"d@dAZ#dBdCZ$dDS)ETestPEP380Operationz Test semantics. csNgfdd}fdd|D]}d|fq$|gddS)zH Test delegation of initial next() call to subgenerator c3s$dEdHddSN Starting g1 Finishing g1appendg2tracer H/opt/bitninja-python-dojo/embedded/lib/python3.9/test/test_yield_from.pyg1s  zOTestPEP380Operation.test_delegation_of_initial_next_to_subgenerator..g1c3sddVddS)N Starting g2* Finishing g2r r rr rrs zOTestPEP380Operation.test_delegation_of_initial_next_to_subgenerator..g2 Yielded %s)rrz Yielded 42rr Nr assertEqualselfrxr r r/test_delegation_of_initial_next_to_subgenerators   zCTestPEP380Operation.test_delegation_of_initial_next_to_subgeneratorc sgfdd}fddz |D]}d|fq&Wn6tyt}z||jddWYd}~nd}~00|d |gd dS) z? Test raising exception in initial next() call c 3s6z$dEdHWdn d0dSrr r r r rr1s zKTestPEP380Operation.test_raising_exception_in_initial_next_call..g1c s2z dtdWdn d0dS)Nrspanish inquisition occurredrr ValueErrorr rr rr7s  zKTestPEP380Operation.test_raising_exception_in_initial_next_call..g2rrrN'subgenerator failed to raise ValueError)rrrr r rrargsfailrrrer r r+test_raising_exception_in_initial_next_call,s  ( z?TestPEP380Operation.test_raising_exception_in_initial_next_callcsNgfdd}fdd|D]}d|fq$|gddS)z@ Test delegation of next() call to subgenerator c3s0ddVEdHdVddSNrg1 hamg1 eggsr r r r r rrPs   zLTestPEP380Operation.test_delegation_of_next_call_to_subgenerator..g1c3s$ddVdVddSNrg2 spam g2 more spamrr r rr rrVs zLTestPEP380Operation.test_delegation_of_next_call_to_subgenerator..g2r)rYielded g1 hamrYielded g2 spamYielded g2 more spamrYielded g1 eggsr Nrrr r r,test_delegation_of_next_call_to_subgeneratorKs   z@TestPEP380Operation.test_delegation_of_next_call_to_subgeneratorc sgfdd}fddz |D]}d|fq&Wn6tyt}z||jddWYd}~nd}~00|d |gd dS) zA Test raising exception in delegated next() call c 3sBz0ddVEdHdVWdn d0dSr'r r r r rrms   zMTestPEP380Operation.test_raising_exception_in_delegated_next_call..g1c 3s>z,ddVtddVWdn d0dS)Nrr+hovercraft is full of eelsr,rrr rr rrus  zMTestPEP380Operation.test_raising_exception_in_delegated_next_call..g2rrr2Nr rr-rr.rr r!r$r r r-test_raising_exception_in_delegated_next_callhs  ( zATestPEP380Operation.test_raising_exception_in_delegated_next_callcsgfdd}fdd|}t|}d}z(||}d|f|d7}q2WntyjYn0|gddS) z+ Test delegation of send() c3sPddV}d|fEdHdV}d|fddSNrr(zg1 received %sr)r r rr r rrs  z7TestPEP380Operation.test_delegation_of_send..g1c3sDddV}d|fdV}d|fddS)Nrr+g2 received %sr,rr r6rr rrs  z7TestPEP380Operation.test_delegation_of_send..g2r) r g1 received 1rr. g2 received 2r/z g2 received 3rr0z g1 received 4r N)nextsendr StopIterationr)rrgyrr r rtest_delegation_of_sends   z+TestPEP380Operation.test_delegation_of_sendcsLgfddfddfdd}|t||gddS) zA Test handling exception while delegating 'send' c3sPddV}d|fEdHdV}d|fddSr5r r6r r rrs  zMTestPEP380Operation.test_handling_exception_while_delegating_send..g1c3sLddV}d|ftddV}d|fddS)Nrr+r7r2r,rrr6rr rrs zMTestPEP380Operation.test_handling_exception_while_delegating_send..g2cs\}t|}d}z(||}d|f|d7}qWntyVdYn0dS)Nr8rr=)r;r<r r=)r>r?r)rrr rruns  zNTestPEP380Operation.test_handling_exception_while_delegating_send..run)rr9rr.r:N) assertRaisesrrrrAr rrrr-test_handling_exception_while_delegating_sends   zATestPEP380Operation.test_handling_exception_while_delegating_sendcsfgfdd}fdd|}tdD]}t|}d|fq,||gddS) z) Test delegating 'close' c 3sBz0ddVEdHdVWdn d0dSr'r r r r rrs   z5TestPEP380Operation.test_delegating_close..g1c 3s6z$ddVdVWdn d0dSr*r r rr rrs  z5TestPEP380Operation.test_delegating_close..g2rr3N)ranger;r closer)rrr>irr r rtest_delegating_closes  z)TestPEP380Operation.test_delegating_closec sgfdd}fddz8|}tdD]}t|}d|fq.|WnDty}z,||jdd||jt WYd }~nd }~00| d |gd d S) zB Test handling exception while delegating 'close' c 3sBz0ddVEdHdVWdn d0dSr'r r r r rr s   zMTestPEP380Operation.test_handing_exception_while_delegating_close..g1c 3sFz,ddVdVWdtdndtd0dS)Nrr+r,r"nybbles have exploded with delightrr rr rrs   zMTestPEP380Operation.test_handing_exception_while_delegating_close..g2rFrrrKNr r3) rGr;r rHrrr"assertIsInstance __context__ GeneratorExitr#rrr>rIrr%r r r-test_handing_exception_while_delegating_closes   $ zATestPEP380Operation.test_handing_exception_while_delegating_closec sgfdd}fddzB|}tdD]}t|}d|fq.td}||Wn6ty}z||jddWYd }~nd }~00|d |gd d S) z) Test delegating 'throw' c 3sBz0ddVEdHdVWdn d0dSr'r r r r rr2s   z5TestPEP380Operation.test_delegating_throw..g1c 3s6z$ddVdVWdn d0dSr*r r rr rr:s  z5TestPEP380Operation.test_delegating_throw..g2rFrtomato ejectedrNr r3rGr;r rthrowrr"r#rOr r rtest_delegating_throw-s  ( z)TestPEP380Operation.test_delegating_throwcsPgfdd}t}||td}||d|_|||gddS)zC Test 'value' attribute of StopIteration exception cs,d|jj|fd|jfdS)Nz%s: %sz value = %s)r __class____name__value)r%rr rpexZszPTestPEP380Operation.test_value_attribute_of_StopIteration_exception..pexspameggs)zStopIteration: z value = NoneStopIteration: spamz value = spamr[z value = eggsN)r=rWr)rrXr%r rr/test_value_attribute_of_StopIteration_exceptionUs zCTestPEP380Operation.test_value_attribute_of_StopIteration_exceptioncs,fdd}dd|t|dgdS)Nc3sEdHdSNr r rr rrpsz:TestPEP380Operation.test_exception_value_crash..g1css dVdgS)Nrrr r r r rrrsz:TestPEP380Operation.test_exception_value_crash..g2r)rlist)rrr r^rtest_exception_value_crashms z.TestPEP380Operation.test_exception_value_crashcsPgfdd}dfdd |D]}d|fq&|gddS) z- Test generator return value c3srddVEdH}d|fddtdfD]"}|EdH}d|fq:dVddS) Nrr(zg2 returned %rr8rFr)r )r r=)retvr r rr}s  z;TestPEP380Operation.test_generator_return_value..g1Nc3s,ddVdVd|r(|SdSr*r rdrr rrs   z;TestPEP380Operation.test_generator_return_value..g2r)rr-rr.r/rzg2 returned Nonerr.r/rz g2 returned 1rr.r/rzg2 returned (2,)rr.r/rzg2 returned StopIteration(3)r0r )Nrrr r rtest_generator_return_valuexs   z/TestPEP380Operation.test_generator_return_valuecCs<g}dd}|D]}|d|fq||gddS)z< Test delegation of next() to non-generator csstdEdHdSNrbrGr r r rr>szGTestPEP380Operation.test_delegation_of_next_to_non_generator..gr) Yielded 0 Yielded 1 Yielded 2Nr)rrr>rr r r(test_delegation_of_next_to_non_generators  zszBTestPEP380Operation.test_conversion_of_sendNone_to_next..grbN Yielded: %s)z Yielded: 0z Yielded: 1z Yielded: 2)rGr<r r)rrr>girr?r r r#test_conversion_of_sendNone_to_nexts  z7TestPEP380Operation.test_conversion_of_sendNone_to_nextcspgfdd}|}t|t}|Wdn1sB0Y||d|ddgdS)z= Test delegation of close() to non-generator c 3sBz0dtdEdHdWdn d0dSN starting grbzg should not be here finishing gr rGr rr rr>s   zHTestPEP380Operation.test_delegation_of_close_to_non_generator..gNrqrr)r;rrHrgetvalue)rr>rnoutputr rr)test_delegation_of_close_to_non_generators &z=TestPEP380Operation.test_delegation_of_close_to_non_generatorc sgfdd}zB|}tdD]}t|}d|fq td}||Wn6ty}z||jddWYd}~nd}~00|d|gd dS) z: Test delegating 'throw' to non-generator c 3s8z&dtdEdHWdn d0dS)N Starting g Finishing grsr rr rr>s zETestPEP380Operation.test_delegating_throw_to_non_generator..grrQrNr )rxrirjrkz Yielded 3z Yielded 4rzrR)rr>rnrIrr%r rr&test_delegating_throw_to_non_generators  ( z:TestPEP380Operation.test_delegating_throw_to_non_generatorc sgfdd}z:|}t|tdD]}|d}d|fq(Wn6ty}z|d|jdWYd}~nd}~00|d |d d gdS) z: Test attempting to send to non-generator c 3sBz0dtdEdHdWdn d0dSrprsr rr rr>s   zGTestPEP380Operation.test_attempting_to_send_to_non_generator..grbrzShould not have yielded: %sr<rNz#was able to send into non-generatorrqrr) r;rGr<r AttributeErrorZassertInr"r#r)rr>rnrr?r%r rr(test_attempting_to_send_to_non_generators   ( z}|}|t|d| |t|j j Wdn1s0YdS)zG Test subiterator with a broken getattr implementation c@s$eZdZddZddZddZdS)z@TestPEP380Operation.test_broken_getattr_handling..BrokencSs|Sr]r rr r r__iter__"szITestPEP380Operation.test_broken_getattr_handling..Broken.__iter__cSsdS)Nr8r rr r r__next__$szITestPEP380Operation.test_broken_getattr_handling..Broken.__next__cSs dddSNr8rr )rattrr r r __getattr__&szLTestPEP380Operation.test_broken_getattr_handling..Broken.__getattr__N)rV __module__ __qualname__rrrr r r rBroken!src3sEdHdSr]r r rr rr>)sz;TestPEP380Operation.test_broken_getattr_handling..gr8N) rBZeroDivisionErrorrr;r<rSr}rZcatch_unraisable_exceptionrHZ unraisableexc_type)rr>rncmr rrtest_broken_getattr_handlings  ( ( z0TestPEP380Operation.test_broken_getattr_handlingcsDgfddddfdd}|t||dgdS) z7 Test exception in initial next() call c3s$dEdHddS)Ng1 about to yield from g2g1 should not be herer r r r rrBs  zCTestPEP380Operation.test_exception_in_initial_next_call..g1cssddVdSrr r r r rrFszCTestPEP380Operation.test_exception_in_initial_next_call..g2cs}t|dSr])r;)rnrr rrAHszDTestPEP380Operation.test_exception_in_initial_next_call..runrN)rBrrrCr rDr#test_exception_in_initial_next_call=s  z7TestPEP380Operation.test_exception_in_initial_next_callc sgfdd}fddz$|D]}d|fq,Wn6tyz}z||jddWYd}~nd}~00|d |gd dS) z0 Test attempted yield-from loop c3s4ddVdEdHddS)N g1: startingZy1g1: about to yield from g2rr r r r rrUs    z>TestPEP380Operation.test_attempted_yield_from_loop..g1c3s2ddVdEdHddS)N g2: startingZy2g2: about to yield from g1zg2 should not be herer r )rnrr rr\s    z>TestPEP380Operation.test_attempted_yield_from_loop..g2rmrzgenerator already executingNz$subgenerator didn't raise ValueError)rz Yielded: y1rrz Yielded: y2rr!)rrr?r%r )rrnrrtest_attempted_yield_from_loopPs( z2TestPEP380Operation.test_attempted_yield_from_loopcsgfdd}fddGdddt|}tdD]}t|}d|fq>d }|||D]}d|fqr|gd d S) z= Test returning value from delegated 'throw' c 3sBz0ddVEdHdVWdn d0dSr'r r r r rrxs   zITestPEP380Operation.test_returning_value_from_delegated_throw..g1c3sHzddVdVWn(yBddVdVYn0dS)Nrr+r,Caught LunchError in g2zg2 lunch savedzg2 yet more spamr r ) LunchErrorrr rrs    zITestPEP380Operation.test_returning_value_from_delegated_throw..g2c@s eZdZdS)zQTestPEP380Operation.test_returning_value_from_delegated_throw..LunchErrorNrVrrr r r rrsrrFrrQ)rr-rr.rzYielded g2 yet more spamr0r N) ExceptionrGr;r rSrrOr )rrrr)test_returning_value_from_delegated_throwss   z=TestPEP380Operation.test_returning_value_from_delegated_throwcsVgfdd}fdd|d|d|d|td|gd dS) z1 Test next and return with value c sj|}t|z dt|dWn4tyd}zd|fWYd}~n d}~00dS)N f resuming gf SHOULD NOT BE HERE f caught %r)r;r r=rrnr%r>rr rfs z>TestPEP380Operation.test_next_and_return_with_value..fc3s$ddVd|f|S)N g startingg returning %rr )rrr rr>s z>TestPEP380Operation.test_next_and_return_with_value..gNr8rarb)rrg returning Nonef caught StopIteration()rr g returning 1f caught StopIteration(1)rrg returning (2,)f caught StopIteration((2,))rrg returning StopIteration(3)(f caught StopIteration(StopIteration(3))r=rrrr rrtest_next_and_return_with_values  z3TestPEP380Operation.test_next_and_return_with_valuecsVgfdd}fdd|d|d|d|td|gd dS) z1 Test send and return with value c sl|}t|z"d|ddWn4tyf}zd|fWYd}~n d}~00dS)Nf sending spam to grYrr)r;r r<r=rrr rrs  z>TestPEP380Operation.test_send_and_return_with_value..fc3s4ddV}d|fd|f|S)Nrz g received %rrr )rrrr rr>s  z>TestPEP380Operation.test_send_and_return_with_value..gNr8rarb)rrg received 'spam'rrrrrrrrrrrrrrrrrrrr rrtest_send_and_return_with_values  z3TestPEP380Operation.test_send_and_return_with_valuec s~fddfdd}ddtdfD]Ng|}t|t|t|ddd ftgq*d S) ze Test catching an exception thrown into a subgenerator and returning a value c3s,z dVWnty&dYn0S)Nr8inner caught ValueError)rr r )rrWr rinners   zTTestPEP380Operation.test_catching_exception_from_subgen_and_returning..innerc3s&EdH}d|f|VdS)Ninner returned %r to outerr re)rrr routers zTTestPEP380Operation.test_catching_exception_from_subgen_and_returning..outerrFrar8rrN)r=r r;reprrSrrrrr>r )rrrWr1test_catching_exception_from_subgen_and_returningszETestPEP380Operation.test_catching_exception_from_subgen_and_returningcslgfddfdd}z|}t||tWntyLYn 0|d|ddgdS) zo Test throwing GeneratorExit into a subgenerator that catches it and returns normally. c3s8zddVdWnty2YdS0dSNEnter fExit fr rNr rr rrs   zSTestPEP380Operation.test_throwing_GeneratorExit_into_subgen_that_returns..fc3s$dEdHddSNEnter gzExit gr r rrr rr>!s  zSTestPEP380Operation.test_throwing_GeneratorExit_into_subgen_that_returns..g*subgenerator failed to raise GeneratorExitrrN)r;rSrNr#r)rr>rnr rr4test_throwing_GeneratorExit_into_subgen_that_returnss   zHTestPEP380Operation.test_throwing_GeneratorExit_into_subgen_that_returnsc sgfddfdd}z|}t||tWn6typ}z||jddWYd}~nd}~00|d|d d gdS) ze Test throwing GeneratorExit into a subgenerator that catches it and yields. c3s<zddVdWnty6dVYn0dSrrr rr rr8s   zXTestPEP380Operation.test_throwing_GeneratorExit_into_subgenerator_that_yields..fc3s$dEdHddSrr r rr rr>?s  zXTestPEP380Operation.test_throwing_GeneratorExit_into_subgenerator_that_yields..grzgenerator ignored GeneratorExitNrrr)r;rSrN RuntimeErrorrr"r#rr>rnr%r rr9test_throwing_GeneratorExit_into_subgenerator_that_yields2s ( zMTestPEP380Operation.test_throwing_GeneratorExit_into_subgenerator_that_yieldsc sgfddfdd}z|}t||tWnDty~}z,||jdd||jtWYd}~nd}~00|d|d d gdS) z{ Test throwing GeneratorExit into a subgenerator that catches it and raises a different exception. c3s>zddVdWnty8tdYn0dS)NrrVorpal bunny encountered)r rNrr rr rrVs   zRTestPEP380Operation.test_throwing_GeneratorExit_into_subgen_that_raises..fc3s$dEdHddSrr r rr rr>]s  zRTestPEP380Operation.test_throwing_GeneratorExit_into_subgen_that_raises..grrNr rr) r;rSrNrrr"rLrMr#rr rr3test_throwing_GeneratorExit_into_subgen_that_raisesPs $ zGTestPEP380Operation.test_throwing_GeneratorExit_into_subgen_that_raisescCsdd}|tt|dS)NcssdEdHdS)Nr r r r r rr>psz4TestPEP380Operation.test_yield_from_empty..g)rBr=r;)rr>r r rtest_yield_from_emptyosz)TestPEP380Operation.test_yield_from_emptycsfdd}fdd|tgd|tg}z|dqDWntyjYn0|gdGdddtfd d}fd d|tg}z|qWntyYn0Gfd d d tfd d}|t dS)Nc3sdVEdHdVdSNrrbr r )twor ronevs zOTestPEP380Operation.test_delegating_generators_claim_to_be_running..onec3s2dVzEdHWnty&Yn0dVdSNr8rFrr rr rrzs  zOTestPEP380Operation.test_delegating_generators_claim_to_be_running..two)rr8rFrbrc@s eZdZdS)zQTestPEP380Operation.test_delegating_generators_claim_to_be_running..MyErrNrr r r rMyErrsrc3sLz dVWnyYn0EdHz dVWnyFYn0dSrr r )rrr rrs     c3sbz dVWnyYn0zEdHWnty>Yn0z dVWny\Yn0dSrrr )rrr rrs     cs*eZdZddZddZfddZdS)zPTestPEP380Operation.test_delegating_generators_claim_to_be_running..MyItcSs|Sr]r rr r rrszYTestPEP380Operation.test_delegating_generators_claim_to_be_running..MyIt.__iter__cSsdSNrr rr r rrszYTestPEP380Operation.test_delegating_generators_claim_to_be_running..MyIt.__next__csjttdSr]) assertTrue gi_runningrBrr;)Zself_rrr rrHs zVTestPEP380Operation.test_delegating_generators_claim_to_be_running..MyIt.closeN)rVrrrrrHr rr rMyItsrc3sEdHdSr]r r )rr rrs) rr_r;r r<r=rrSobjectrH)rrresr )rrrrrr.test_delegating_generators_claim_to_be_runningts2         zBTestPEP380Operation.test_delegating_generators_claim_to_be_runningcspddfdd}dd}dd}||D]}|d |vq.|||D]}|d |vofd |vqPdS) NcSsddtDS)NcSsg|] }|dqS)rbr ).0rr r r zaTestPEP380Operation.test_delegator_is_visible_to_debugger..call_stack..)inspectstackr r r r call_stackszMTestPEP380Operation.test_delegator_is_visible_to_debugger..call_stackc3sVVVdSr]r r rr rgenszFTestPEP380Operation.test_delegator_is_visible_to_debugger..gencss|EdHdSr]r r>r r rrYszGTestPEP380Operation.test_delegator_is_visible_to_debugger..spamcss|EdHdSr]r rr r rrZszGTestPEP380Operation.test_delegator_is_visible_to_debugger..eggsrYrZ)r)rrrYrZrr rr%test_delegator_is_visible_to_debuggers z9TestPEP380Operation.test_delegator_is_visible_to_debuggercs:Gdddfdd}dt||ddS)Nc@seZdZddZddZdS)z?TestPEP380Operation.test_custom_iterator_return..MyItercSs|Sr]r rr r rrszHTestPEP380Operation.test_custom_iterator_return..MyIter.__iter__cSs tddSr)r=rr r rrszHTestPEP380Operation.test_custom_iterator_return..MyIter.__next__N)rVrrrrr r r rMyItersrc3sEdHdSr]r r rrcr rrsz.genr)r_r)rrr rrtest_custom_iterator_returns  z/TestPEP380Operation.test_custom_iterator_returncszddfdd}dd}tD|}|}|d||||~~tWdn1sl0YdS)Ncss dVdSr]r r r r r innermostszDTestPEP380Operation.test_close_with_cleared_frame..innermostc3sdV}EdHdSr]r ) outer_genrr rrsz@TestPEP380Operation.test_close_with_cleared_frame..innercssdV}|EdHdSr]r ) inner_genr r rrsz@TestPEP380Operation.test_close_with_cleared_frame..outer)rr<r)rrrrrr rrtest_close_with_cleared_frames    z1TestPEP380Operation.test_close_with_cleared_framecsJGfdddfdd}|}t|d|d|ddS)Ncs(eZdZddZddZfddZdS)zHTestPEP380Operation.test_send_tuple_with_custom_generator..MyGencSs|Sr]r rr r rr szQTestPEP380Operation.test_send_tuple_with_custom_generator..MyGen.__iter__cSsdSrr rr r rr szQTestPEP380Operation.test_send_tuple_with_custom_generator..MyGen.__next__cs|dSr]r )rZwhatrer rr< szMTestPEP380Operation.test_send_tuple_with_custom_generator..MyGen.sendN)rVrrrrr<r rer rMyGensrc3sEdH}dSr]r re)rr rrszHTestPEP380Operation.test_send_tuple_with_custom_generator..outer)r8rFrb)r;r<rrr )rrdr%test_send_tuple_with_custom_generators  z9TestPEP380Operation.test_send_tuple_with_custom_generatorN)%rVrr__doc__rr&r1r4r@rErJrPrTr\r`rfrlrorwr|r~rrrrrrrrrrrrrrrrr r r rrsD%,)")( 3  #+*/H'r__main__) rZunittestrZ test.supportrrrtestrZTestCaserrVmainr r r rs