ó
    Ö›‘hÃ&  ã                  ó¦   • S r SSKJr  SSKJr  SSKJr  SSKJrJ	r	  SSK
Jr  SSKJr  SS	KJrJrJrJr   " S
 S\" \S5      5      r " S S\5      rg)z&
Tests for L{twisted._threads._team}.
é    )Úannotations)ÚCallable)ÚproxyForInterface)ÚcallÚget)ÚFailure)ÚSynchronousTestCaseé   )ÚAlreadyQuitÚIWorkerÚTeamÚcreateMemoryWorkerc                  ó:   ^ • \ rS rSrSrSS jrSU 4S jjrSrU =r$ )ÚContextualWorkeré   z2
A worker implementation that supplies a context.
c                ó   • Xl         X l        g)z*
Create with a real worker and a context.
N)Ú_realWorkerÚ_context)ÚselfÚ
realWorkerÚctxs      ÚcC:\Users\psant\Downloads\Noiseback\school\venv\Lib\site-packages\twisted/_threads/test/test_team.pyÚ__init__ÚContextualWorker.__init__   s   € ð &ÔØ�ó    c                ó2   >^ ^• [         TT ]  U U4S j5        g)zr
Perform the given work with the context given to __init__.

@param work: the work to pass on to the real worker.
c                 ó0   >• [        T R                  T5      $ ©N)r   r   )r   Úworks   €€r   Ú<lambda>Ú%ContextualWorker.do.<locals>.<lambda>%   s   ø€ œ4 §¡¨tÔ4r   N)ÚsuperÚdo)r   r   Ú	__class__s   ``€r   r#   ÚContextualWorker.do   s   ú€ ô 	‰‰
Õ4Õ5r   )r   r   )r   r   r   ÚobjectÚreturnÚNone)r   zCallable[[], object]r'   r(   )	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r#   Ú__static_attributes__Ú__classcell__)r$   s   @r   r   r      s   ø† ñô÷6õ 6r   r   r   c                  ó¸   • \ rS rSrSrSS jrSS jrSS jrSS jrSS jr	SS jr
SS	 jrSS
 jrSS jrSS jrSS jrSS jrSS jrSS jrSS jrSS jrSrg)Ú	TeamTestsé(   z
Tests for L{Team}
c                óà   ^ • [        5       u  nT l        [        USS9T l        / T l        / T l        / T l        / T l        S T l        SU 4S jjn/ T l	        SU 4S jjn[        XU5      T l        g)	zT
Set up a L{Team} with inspectable, synchronous workers that can be
single-stepped.
Úcoordinator©Úworkerc                 ó   • g)NF© r8   r   r   r    Ú!TeamTests.setUp.<locals>.<lambda>8   s   €  Ur   c                 ó¢  >^^^• TR                  5       (       a  g [        5       u  n mTR                  R                  T5        TR                  R                  T5        [        U [        TR                  5      S9mTR                  R                  T5        TR                  R                  T5        TR                  mSUUUU4S jjnUTl	        T$ )Nr5   c                 ó€   >• T" 5         TR                   R                  T 5        TR                  R                  T5        g r   )ÚallUnquitWorkersÚremoveÚactivePerformers)ÚcwÚ	performerÚrealQuitr   s   €€€€r   ÚquitAndRemoveÚ<TeamTests.setUp.<locals>.createWorker.<locals>.quitAndRemoveE   s0   ø€ Ù”
Ø×%Ñ%×,Ñ,¨RÔ0Ø×%Ñ%×,Ñ,¨YÕ7r   ©r'   r(   )
ÚnoMoreWorkersr   ÚworkerPerformersÚappendr>   r   ÚlenÚallWorkersEverr<   Úquit)r6   rB   r?   r@   rA   r   s     @@@€r   ÚcreateWorkerÚ%TeamTests.setUp.<locals>.createWorker:   sª   û€ Ø×!Ñ!×#Ñ#ØÜ 2Ó 4ÑˆF�IØ×!Ñ!×(Ñ(¨Ô3Ø×!Ñ!×(Ñ(¨Ô3Ü! &´°T×5JÑ5JÓ1KÑLˆBØ×Ñ×&Ñ& rÔ*Ø×!Ñ!×(Ñ(¨Ô,Ø—w‘wˆH÷8ò 8ð
 $ˆBŒGØˆIr   c                 óL   >• T R                   R                  [        5       5        g r   )ÚfailuresrG   r   ©r   s   €r   ÚlogExceptionÚ%TeamTests.setUp.<locals>.logExceptionO   s   ø€ Ø�M‰M× Ñ ¤£Õ+r   N)r'   zContextualWorker | NonerD   )r   ÚcoordinateOncer   r4   rF   rI   r<   r>   rE   rN   r   Úteam)r   r4   rK   rP   s   `   r   ÚsetUpÚTeamTests.setUp-   so   ø€ ô
 ,>Ó+?Ñ(ˆ�TÔ(Ü+¨KÀÑNˆÔØ<>ˆÔØ68ˆÔØ8:ˆÔØ<>ˆÔÙ*ˆÔ÷	ð& (*ˆŒ÷	,ô ˜°LÓAˆ�	r   c                óf   • SnU R                  5       (       a  SnU R                  5       (       a  M  U$ )zÐ
Perform all work currently scheduled in the coordinator.

@return: whether any coordination work was performed; if the
    coordinator was idle when this was called, return L{False}
    (otherwise L{True}).
FT)rR   )r   Údids     r   Ú
coordinateÚTeamTests.coordinateT   s3   € ð ˆØ×!Ñ!×#Ñ#ØˆCð ×!Ñ!×#Ó#àˆ
r   c                óÒ   • SnU(       a^  U R                  5       nU R                   H  nX R                  ;   d  M  U" 5         M     U=(       d    U R                  5       nU(       a  M]  gg)zR
Perform all work on the coordinator and worker performers that needs to
be done.
TN)rX   rF   r>   )r   Ú
continuingr@   s      r   ÚperformAllOutstandingWorkÚ#TeamTests.performAllOutstandingWorka   sS   € ð
 ˆ
ÞØŸ™Ó*ˆJØ!×2Ô2�	Ø× 5Ñ 5Õ5Ù–Kñ 3ð $×8 t§¡Ó'8ˆJ÷ Šjr   c                ó„  ^• SmSU4S jjnU R                   R                  U5        U R                  5         U R                  U R                   R	                  5       R
                  S5        U R                  5         U R                  TS5        U R                  U R                   R	                  5       R
                  S5        g)zL
L{Team.do} does the work in a worker created by the createWorker
callable.
Nc                 ó   >• [        S5      m g )Nr6   )r   )Úwhos   €r   Ú	somethingÚ4TeamTests.test_doDoesWorkInWorker.<locals>.somethingu   s   ø€ ä�h“-‰Cr   é   r   rD   )rS   r#   rX   ÚassertEqualÚ
statisticsÚbusyWorkerCountr\   )r   ra   r`   s     @r   Útest_doDoesWorkInWorkerÚ!TeamTests.test_doDoesWorkInWorkern   s�   ø€ ð
 ˆ÷	 ð 	�	‰	�‰�YÔØ�‰ÔØ×Ñ˜Ÿ™×-Ñ-Ó/×?Ñ?ÀÔCØ×&Ñ&Ô(Ø×Ñ˜˜aÔ Ø×Ñ˜Ÿ™×-Ñ-Ó/×?Ñ?ÀÕCr   c                óà   • U R                   R                  5       nU R                  UR                  S5        U R                  UR                  S5        U R                  UR
                  S5        g)zy
L{Team.statistics} returns an object with idleWorkerCount,
busyWorkerCount, and backloggedWorkCount integer attributes.
r   N)rS   re   rd   ÚidleWorkerCountrf   ÚbackloggedWorkCount)r   Ústatss     r   Útest_initialStatisticsÚ TeamTests.test_initialStatistics€   sX   € ð
 —	‘	×$Ñ$Ó&ˆØ×Ñ˜×.Ñ.°Ô2Ø×Ñ˜×.Ñ.°Ô2Ø×Ñ˜×2Ñ2°AÕ6r   c                ó¤   • U R                   R                  S5        U R                  5         U R                  [	        U R
                  5      S5        g)z>
L{Team.grow} increases the number of available idle workers.
é   N)rS   Úgrowr\   rd   rH   rF   rO   s    r   Útest_growCreatesIdleWorkersÚ%TeamTests.test_growCreatesIdleWorkersŠ   s;   € ð 	�	‰	�‰�qÔØ×&Ñ&Ô(Ø×Ñœ˜T×2Ñ2Ó3°QÕ7r   c                ó$  ^ • U 4S jT l         T R                  R                  S5        T R                  5         T R	                  [        T R                  5      S5        T R	                  T R                  R                  5       R                  S5        g)zw
L{Team.grow} increases the number of available idle workers until the
C{createWorker} callable starts returning None.
c                 ó4   >• [        T R                  5      S:¬  $ )Né   )rH   rI   rO   s   €r   r    Ú0TeamTests.test_growCreateLimit.<locals>.<lambda>—   s   ø€ ¤S¨×)<Ñ)<Ó%=ÀÒ%Br   rp   rv   N)	rE   rS   rq   r\   rd   rH   rI   re   rj   rO   s   `r   Útest_growCreateLimitÚTeamTests.test_growCreateLimit’   sh   ø€ ô
 CˆÔØ�	‰	�‰�qÔØ×&Ñ&Ô(Ø×Ñœ˜T×0Ñ0Ó1°1Ô5Ø×Ñ˜Ÿ™×-Ñ-Ó/×?Ñ?ÀÕCr   c                óú   • U R                   R                  S5        U R                  5         U R                   R                  S5        U R                  5         U R	                  [        U R                  5      S5        g)z7
L{Team.shrink} will quit the given number of workers.
rp   rv   r
   N)rS   rq   r\   Úshrinkrd   rH   r<   rO   s    r   Útest_shrinkQuitsWorkersÚ!TeamTests.test_shrinkQuitsWorkers�   sY   € ð 	�	‰	�‰�qÔØ×&Ñ&Ô(Ø�	‰	×Ñ˜ÔØ×&Ñ&Ô(Ø×Ñœ˜T×2Ñ2Ó3°QÕ7r   c                óŒ  • U R                   R                  S5        U R                  5         U R                  [	        U R
                  5      S5        U R                   R                  5         U R                  [	        U R
                  5      S5        U R                  5         U R                  [	        U R
                  5      S5        g)zE
L{Team.shrink} with no arguments will stop all outstanding workers.
é
   r   N)rS   rq   r\   rd   rH   r<   r{   rO   s    r   Útest_shrinkToZeroÚTeamTests.test_shrinkToZero§   s�   € ð 	�	‰	�‰�rÔØ×&Ñ&Ô(Ø×Ñœ˜T×2Ñ2Ó3°RÔ8Ø�	‰	×ÑÔØ×Ñœ˜T×2Ñ2Ó3°RÔ8Ø×&Ñ&Ô(Ø×Ñœ˜T×2Ñ2Ó3°QÕ7r   c                óœ  ^• U R                   R                  S5        U R                  5         SmSU4S jjnU R                  U R                   R	                  5       R
                  S5        [        S5       H  nU R                   R                  U5        M      U R                  5         U R                  U R                   R	                  5       R
                  S5        S U l        U R                   R                  U5        U R                  5         U R                  U R                   R	                  5       R
                  S5        U R                  U R                   R	                  5       R                  S5        U R                  5         U R                  U R                   R	                  5       R                  S5        U R                  TS5        g)	zu
When no additional workers are available, the given work is backlogged,
and then performed later when the work was.
rv   r   c                 ó   >• T S-  m g )Nrc   r8   )Útimess   €r   ra   Ú@TeamTests.test_moreWorkWhenNoWorkersAvailable.<locals>.something¼   s   ø€ à�Q‰J‰Er   c                 ó   • g)NTr8   r8   r   r   r    Ú?TeamTests.test_moreWorkWhenNoWorkersAvailable.<locals>.<lambda>Ç   s   €  Tr   rc   é   NrD   )rS   rq   rX   rd   re   rj   Úranger#   rE   rk   r\   )r   ra   Úir„   s      @r   Ú#test_moreWorkWhenNoWorkersAvailableÚ-TeamTests.test_moreWorkWhenNoWorkersAvailable³   sB  ø€ ð
 	�	‰	�‰�qÔØ�‰ÔØˆ÷	ð 	×Ñ˜Ÿ™×-Ñ-Ó/×?Ñ?ÀÔCÜ�q–ˆAØ�I‰I�L‰L˜Ö#ñ ð 	�‰ÔØ×Ñ˜Ÿ™×-Ñ-Ó/×?Ñ?ÀÔCÙ)ˆÔØ�	‰	�‰�YÔØ�‰ÔØ×Ñ˜Ÿ™×-Ñ-Ó/×?Ñ?ÀÔCØ×Ñ˜Ÿ™×-Ñ-Ó/×CÑCÀQÔGØ×&Ñ&Ô(Ø×Ñ˜Ÿ™×-Ñ-Ó/×CÑCÀQÔGØ×Ñ˜ Õ"r   c                ó   • U R                   R                  S 5        U R                  5         U R                  [	        U R
                  5      S5        U R                  U R
                  S   R                  [        5        g)z›
When an exception is raised in a task passed to L{Team.do}, the
C{logException} given to the L{Team} at construction is invoked in the
exception context.
c                 ó   • SS-  $ )Nrc   r   r8   r8   r   r   r    Ú0TeamTests.test_exceptionInTask.<locals>.<lambda>Ö   s   € ˜Q šUr   rc   r   N)rS   r#   r\   rd   rH   rN   ÚtypeÚZeroDivisionErrorrO   s    r   Útest_exceptionInTaskÚTeamTests.test_exceptionInTaskÐ   sY   € ð 	�	‰	�‰‘]Ô#Ø×&Ñ&Ô(Ø×Ñœ˜TŸ]™]Ó+¨QÔ/Ø×Ñ˜Ÿ™ qÑ)×.Ñ.Ô0AÕBr   c                óê   • U R                   R                  5         U R                  [        U R                   R                  5        U R                  [        U R                   R                  [
        5        g)z`
L{Team.quit} causes future invocations of L{Team.do} and L{Team.quit}
to raise L{AlreadyQuit}.
N)rS   rJ   ÚassertRaisesr   r#   ÚlistrO   s    r   Ú	test_quitÚTeamTests.test_quitÛ   sD   € ð
 	�	‰	�‰ÔØ×Ñœ+ t§y¡y§~¡~Ô6Ø×Ñœ+ t§y¡y§|¡|´TÕ:r   c                óx  • [        S5       H"  nU R                  R                  [        5        M$     U R	                  5         U R                  R                  5         U R	                  5         U R                  [        U R                  5      S5        U R                  [        U R                  R
                  5        g)zS
L{Team.quit} causes all idle workers, as well as the coordinator
worker, to quit.
r   r   N)r‰   rS   r#   r–   r\   rJ   rd   rH   r<   r•   r   r4   ©r   Úxs     r   Útest_quitQuitsÚTeamTests.test_quitQuitsä   s   € ô
 �r–ˆAØ�I‰I�L‰LœÖñ à×&Ñ&Ô(Ø�	‰	�‰ÔØ×&Ñ&Ô(Ø×Ñœ˜T×2Ñ2Ó3°QÔ7Ø×Ñœ+ t×'7Ñ'7×'<Ñ'<Õ=r   c                ó  • U R                   R                  S5        [        S5       H"  nU R                   R                  [        5        M$     U R                  5         U R                   R                  5         U R                  5         U R                  [        U R                  5      S5        U R                  5         U R                  [        U R                  5      S5        U R                  [        U R                  R                  5        g)zd
L{Team.quit} causes all busy workers to be quit once they've finished
the work they've been given.
r   rp   r   N)rS   rq   r‰   r#   r–   rX   rJ   rd   rH   r<   r\   r•   r   r4   rš   s     r   Útest_quitQuitsLaterWhenBusyÚ%TeamTests.test_quitQuitsLaterWhenBusyñ   s²   € ð
 	�	‰	�‰�rÔÜ�q–ˆAØ�I‰I�L‰LœÖñ à�‰ÔØ�	‰	�‰ÔØ�‰ÔØ×Ñœ˜T×2Ñ2Ó3°QÔ7Ø×&Ñ&Ô(Ø×Ñœ˜T×2Ñ2Ó3°QÔ7Ø×Ñœ+ t×'7Ñ'7×'<Ñ'<Õ=r   c                ó´  ^ ^• T R                   R                  [        5        T R                   R                  R                  mSUU 4S jjnUT R                   R                  l        T R                   R                  5         T R                  [        T R                   R
                  5        T R                  [        T R                   R                  [        5        g)zŒ
If work happens after L{Team.quit} sets its C{Quit} flag, but before
any other work takes place, the L{Team} should still exit gracefully.
c                 ó4   >• T " 5         TR                  5         g r   )r\   )ÚoriginalSetr   s   €€r   ÚperformWorkConcurrentlyÚOTeamTests.test_quitConcurrentWithWorkHappening.<locals>.performWorkConcurrently	  s   ø€ ÙŒMØ×*Ñ*Õ,r   NrD   )rS   r#   r–   Ú_quitÚsetrJ   r•   r   )r   r¤   r£   s   ` @r   Ú$test_quitConcurrentWithWorkHappeningÚ.TeamTests.test_quitConcurrentWithWorkHappening  s„   ù€ ð
 	�	‰	�‰”TÔØ—i‘i—o‘o×)Ñ)ˆ÷	-ð 	-ð 6ˆ�	‰	�‰ÔØ�	‰	�‰ÔØ×Ñœ+ t§y¡y§~¡~Ô6Ø×Ñœ+ t§y¡y§|¡|´TÕ:r   c                óp  • [        S5       H"  nU R                  R                  [        5        M$     U R	                  5         U R                  [        U R                  5      S5        U R                  R                  S5        U R                  5         U R                  [        U R                  5      S5        g)zT
L{Team.shrink} will wait for busy workers to finish being busy and then
quit them.
r   é   rv   N)
r‰   rS   r#   r–   rX   rd   rH   r<   r{   r\   rš   s     r   Útest_shrinkWhenBusyÚTeamTests.test_shrinkWhenBusy  s€   € ô
 �r–ˆAØ�I‰I�L‰LœÖñ à�‰ÔØ×Ñœ˜T×2Ñ2Ó3°RÔ8à�	‰	×Ñ˜ÔØ×&Ñ&Ô(Ø×Ñœ˜T×2Ñ2Ó3°QÕ7r   )	r>   r<   rI   rR   r4   rN   rE   rS   rF   NrD   )r'   Úbool)r)   r*   r+   r,   r-   rT   rX   r\   rg   rm   rr   rx   r|   r€   r‹   r’   r—   rœ   rŸ   r¨   r¬   r.   r8   r   r   r1   r1   (   s\   † ñô%BôNô9ôDô$7ô8ô	Dô8ô
8ô#ô:	Cô;ô>ô>ô ;÷"8r   r1   N)r-   Ú
__future__r   Útypingr   Útwisted.python.componentsr   Útwisted.python.contextr   r   Útwisted.python.failurer   Útwisted.trial.unittestr	   Ú r   r   r   r   r   r1   r8   r   r   Ú<module>r¶      sG   ðñõ #å å 7ß ,Ý *Ý 6ß =Ó =ô6Ñ(¨°-Ó@ô 6ô*v8Ð#õ v8r   