B
    ”Ü‡\3  ã               @   s€  d Z ddlmZ ddlmZ ddlmZ ddlZddlZddlZddlmZ ddl	Z	ddl
Z
ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd;dd„Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Z d'd(„ Z!d<d)d*„Z"d+d,„ Z#d-d.„ Z$e	j%d/d0G d1d2„ d2e&ƒƒZ'd3d4„ Z(d5d6„ Z)G d7d8„ d8e&ƒZ*d9d:„ Z+dS )=z4 basic collect and runtest protocol implementations é    )Úabsolute_import)Údivision)Úprint_functionN)Útimeé   )ÚCollectErrorRepr)ÚCollectReport)Ú
TestReport)ÚExceptionInfo)ÚExit)Úskip)ÚSkipped)ÚTEST_OUTCOMEc             C   s,   | j dddd}|jddtd ddd	f d S )
Nzterminal reportingZ	reportingZgeneral)Zafterz--durationsZstoreÚNz2show N slowest setup/test durations (N=0 for all).)ÚactionÚtypeÚdefaultÚmetavarÚhelp)ZgetgroupZ	addoptionÚint)ÚparserÚgroup© r   ú-lib/python3.7/site-packages/_pytest/runner.pyÚpytest_addoption   s    r   c             C   s  | j jj}| j  d¡}|d kr"d S | }g }x4|j ¡ D ]&}x |D ]}t|dƒr@| |¡ q@W q6W |shd S |jdd„ d | 	¡  |s’| 
dd¡ n| 
dd| ¡ |d |… }xN|D ]F}|d	k rà|jd
k rà| d¡ | d¡ P | d|j|j|jf ¡ q´W d S )NÚverboseÚdurationc             S   s   | j S )N)r   )Úxr   r   r   Ú<lambda>4   s    z)pytest_terminal_summary.<locals>.<lambda>)Úkeyú=zslowest test durationszslowest %s test durationsé   g{®Gázt?Ú z:(0.00 durations hidden.  Use -vv to show these durations.)z%02.2fs %-8s %s)ÚconfigÚoptionÚ	durationsÚgetvalueZstatsÚvaluesÚhasattrÚappendÚsortÚreverseZ	write_sepr   Z
write_lineÚwhenÚnodeid)Zterminalreporterr%   r   ZtrZdlistZreplistÚrepr   r   r   Úpytest_terminal_summary'   s0    





r/   c             C   s   t ƒ | _d S )N)Ú
SetupStateÚ_setupstate)Úsessionr   r   r   Úpytest_sessionstartD   s    r3   c             C   s   | j  ¡  d S )N)r1   Úteardown_all)r2   r   r   r   Úpytest_sessionfinishH   s    r5   c             C   s8   | j j| j| jd t| |d | j j| j| jd dS )N)r-   Úlocation)ÚnextitemT)ÚihookZpytest_runtest_logstartr-   r6   ÚruntestprotocolZpytest_runtest_logfinish)Úitemr7   r   r   r   Úpytest_runtest_protocolL   s    r;   Tc             C   sŒ   t | dƒ}|r| js|  ¡  t| d|ƒ}|g}|jrb| jjjrFt| ƒ | jjj	sb| 
t| d|ƒ¡ | 
t| d||d¡ |rˆd| _d | _|S )NÚ_requestÚsetupÚcallÚteardown)r7   F)r(   r<   Z_initrequestÚcall_and_reportÚpassedr#   r$   Z	setupshowÚshow_test_itemZ	setuponlyr)   Zfuncargs)r:   Úlogr7   Z
hasrequestr.   Úreportsr   r   r   r9   S   s    



r9   c             C   sV   | j  ¡ }| ¡  | d¡ | | j¡ t| jj ¡ ƒ}|rR| d 	d 
|¡¡¡ dS )zAShow test function, parameters and the fixtures of the test item.z        z (fixtures used: {})z, N)r#   Zget_terminal_writerÚlineÚwriteZ_nodeidÚsortedZ_fixtureinfoZname2fixturedefsÚkeysÚformatÚjoin)r:   ZtwZused_fixturesr   r   r   rB   g   s    

rB   c             C   s   t | dƒ | jj | ¡ d S )Nr=   )Ú_update_current_test_varr2   r1   Úprepare)r:   r   r   r   Úpytest_runtest_setupr   s    
rM   c             C   sn   t | dƒ d\t_t_t_y|  ¡  W nB tk
rh   t ¡ \}}}|j}|t_|t_|t_~~~‚ Y nX d S )Nr>   )NNN)	rK   ÚsysÚ	last_typeÚ
last_valueÚlast_tracebackZruntestÚ	ExceptionÚexc_infoÚtb_next)r:   r   ÚvalueÚtbr   r   r   Úpytest_runtest_callw   s    
rW   c             C   s(   t | dƒ | jj | |¡ t | d ƒ d S )Nr?   )rK   r2   r1   Úteardown_exact)r:   r7   r   r   r   Úpytest_runtest_teardown‡   s    
rY   c             C   s>   d}|r.d  | j|¡}| dd¡}|tj|< ntj |¡ dS )z–
    Update PYTEST_CURRENT_TEST to reflect the current item and stage.

    If ``when`` is None, delete PYTEST_CURRENT_TEST from the environment.
    ZPYTEST_CURRENT_TESTz{} ({})ú z(null)N)rI   r-   ÚreplaceÚosÚenvironÚpop)r:   r,   Zvar_namerU   r   r   r   rK      s    rK   c             C   s&   | j dkr"| jrdS | jrdS dS d S )N)r=   r?   )ÚerrorÚEZERROR)ÚskippedÚsZSKIPPED)r"   r"   r"   )r,   Úfailedra   )Úreportr   r   r   Úpytest_report_teststatus   s    
re   c             K   sP   t | |f|Ž}| j}|j| |d}|r2|j|d t||ƒrL|j| ||d |S )N)r:   r>   )rd   )Únoder>   rd   )Úcall_runtest_hookr8   Úpytest_runtest_makereportZpytest_runtest_logreportÚcheck_interactive_exceptionÚpytest_exception_interact)r:   r,   rC   Úkwdsr>   Úhookrd   r   r   r   r@   ¬   s    
r@   c             C   s.   | j o,t|dƒp*| j  tj¡p*| j  tj¡ S )NZwasxfail)Úexcinfor(   Úerrisinstancer   rR   ÚbdbZBdbQuit)r>   rd   r   r   r   ri   ·   s    
ri   c                sL   d| }t ˆj|ƒ‰ tf}ˆj d¡s0|tf7 }tj‡ ‡‡fdd„||dS )NZpytest_runtest_Zusepdbc                  s   ˆ f dˆiˆ—ŽS )Nr:   r   r   )r8   r:   rk   r   r   r   Æ   s    z#call_runtest_hook.<locals>.<lambda>)r,   Úreraise)Úgetattrr8   r   r#   r&   ÚKeyboardInterruptÚCallInfoÚ	from_call)r:   r,   rk   Zhooknamerp   r   )r8   r:   rk   r   rg   ¿   s    
rg   F)Úreprc               @   sZ   e Zd ZdZe ¡ Ze ¡ Ze ¡ Ze ¡ Z	e ¡ Z
edd„ ƒZed	dd„ƒZdd„ ZdS )
rs   z. Result/Exception info a function invocation. c             C   s   | j d k	rtd | ¡ƒ‚| jS )Nz{!r} has no valid result)rm   ÚAttributeErrorrI   Ú_result)Úselfr   r   r   ÚresultÕ   s    
zCallInfo.resultNc             C   sZ   t ƒ }d }y
|ƒ }W n,   t ¡ }|d k	r8| |¡r8‚ d }Y nX t ƒ }| |||||dS )N)ÚstartÚstopr,   ry   rm   )r   r
   Zfrom_currentrn   )ÚclsÚfuncr,   rp   rz   rm   ry   r{   r   r   r   rt   Û   s    

zCallInfo.from_callc             C   s8   | j d k	rd}| j j}nt| jƒ}d}dj| j||dS )NZ	exceptionry   z*<CallInfo when={when!r} {status}: {value}>)r,   rU   Ústatus)rm   rU   ru   rw   rI   r,   )rx   r~   rU   r   r   r   Ú__repr__ë   s    


zCallInfo.__repr__)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚattrZibrw   rm   rz   r{   r,   Úpropertyry   Úclassmethodrt   r   r   r   r   r   rs   Ê   s   rs   c             C   sø   |j }|j|j }dd„ | jD ƒ}|j}g }|js<d}d }npt|tƒsPd}|}n\| tj	¡r~d}| 
¡ }	t|	jƒ|	j|	jf}n.d}|j dkr˜|  |¡}n| j|| jjjd}x*| jD ] \}
}}| d||
f |f¡ q´W t| j| j||||||| jd		S )
Nc             S   s   i | ]
}d |“qS )r   r   )Ú.0r   r   r   r   ú
<dictcomp>û   s    z-pytest_runtest_makereport.<locals>.<dictcomp>rA   rc   ra   r>   )ZstylezCaptured %s %s)Úuser_properties)r,   r{   rz   Úkeywordsrm   Ú
isinstancer
   rn   r   rR   Z_getreprcrashÚstrÚpathÚlinenoÚmessageÚrepr_failureÚ_repr_failure_pyr#   r$   ZtbstyleZ_report_sectionsr)   r	   r-   r6   r‰   )r:   r>   r,   r   rŠ   rm   ZsectionsÚoutcomeÚlongreprÚrZrwhenr   Zcontentr   r   r   rh   ø   s@    

rh   c       	         s¼   t  ‡ fdd„d¡}d }|js$d}nvddlm} tf| ¡  }|j |¡rtd}ˆ  |jd¡j	}t
|jƒ|j|jf}n&d	}ˆ  |j¡}t|d
ƒs–t|ƒ}|}tˆ j||t|dd ƒƒ}||_|S )Nc                  s   t ˆ  ¡ ƒS )N)ÚlistÚcollectr   )Ú	collectorr   r   r   !  s    z,pytest_make_collect_report.<locals>.<lambda>r–   rA   r   )Únosera   rE   rc   Z
toterminalry   )rs   rt   rm   Z_pytestr˜   r   Zget_skip_exceptionsrn   r‘   Z	reprcrashrŒ   r   rŽ   r   r   r(   r   r   r-   rq   r>   )	r—   r>   r“   r’   r˜   Zskip_exceptionsr”   Z	errorinfor.   r   )r—   r   Úpytest_make_collect_report   s&    
r™   c               @   sX   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdS )r0   zD shared state for setting up/tearing down test items or collectors. c             C   s   g | _ i | _d S )N)ÚstackÚ_finalizers)rx   r   r   r   Ú__init__=  s    zSetupState.__init__c             C   s6   |rt |tƒrt‚t|ƒst‚| j |g ¡ |¡ dS )z attach a finalizer to the given colitem.
        if colitem is None, this will add a finalizer that
        is called at the end of teardown_all().
        N)r‹   ÚtupleÚAssertionErrorÚcallabler›   Ú
setdefaultr)   )rx   Ú	finalizerÚcolitemr   r   r   ÚaddfinalizerA  s    zSetupState.addfinalizerc             C   s   | j  ¡ }|  |¡ d S )N)rš   r^   Ú_teardown_with_finalization)rx   r¢   r   r   r   Ú_pop_and_teardownK  s    
zSetupState._pop_and_teardownc             C   sf   | j  |d ¡}d }x@|rR| ¡ }y
|ƒ  W q tk
rN   |d krJt ¡ }Y qX qW |rbtj|Ž  d S )N)r›   r^   r   rN   rS   Úsixrp   )rx   r¢   Z
finalizersÚexcZfinr   r   r   Ú_callfinalizersO  s    
zSetupState._callfinalizersc             C   sP   |   |¡ t|dƒr| ¡  x.| jD ]$}|d ks$|| jks$t|tƒs$t‚q$W d S )Nr?   )r¨   r(   r?   r›   rš   r‹   r   rž   )rx   r¢   r   r   r   r¤   ^  s
    

z&SetupState._teardown_with_finalizationc             C   s@   x| j r|  ¡  qW xt| jƒD ]}|  |¡ q W | jr<t‚d S )N)rš   r¥   r•   r›   r¤   rž   )rx   r   r   r   r   r4   g  s
    zSetupState.teardown_allc             C   s   |r|  ¡ pg }|  |¡ d S )N)Ú	listchainÚ_teardown_towards)rx   r:   r7   Úneeded_collectorsr   r   r   rX   n  s    zSetupState.teardown_exactc             C   sn   d }xV| j rZ| j |d t| j ƒ… kr&P y|  ¡  W q tk
rV   |d krRt ¡ }Y qX qW |rjtj|Ž  d S )N)rš   Úlenr¥   r   rN   rS   r¦   rp   )rx   r«   r§   r   r   r   rª   r  s    zSetupState._teardown_towardsc          	   C   s’   |  ¡ }|  |¡ x$| jD ]}t|dƒrtj|jŽ  qW xT|t| jƒd… D ]>}| j |¡ y| 	¡  W qL t
k
rˆ   t ¡ |_‚ Y qLX qLW dS )zn setup objects along the collector chain to the test-method
            and teardown previously setup objects.Ú_prepare_excN)r©   rª   rš   r(   r¦   rp   r­   r¬   r)   r=   r   rN   rS   )rx   r¢   r«   Úcolr   r   r   rL     s    


zSetupState.prepareN)r€   r   r‚   rƒ   rœ   r£   r¥   r¨   r¤   r4   rX   rª   rL   r   r   r   r   r0   :  s   
	r0   c             C   sN   | j }|j| d |j| d}|j dd ¡}|rJt||ƒrJ|j| ||d |S )N)r—   r>   )rf   r>   rd   )r8   Zpytest_collectstartr™   Ú__dict__r^   ri   rj   )r—   r8   r.   r>   r   r   r   Úcollect_one_node”  s    r°   )TN)T),rƒ   Z
__future__r   r   r   ro   r\   rN   r   r„   r¦   rD   r   r   r	   Z_pytest._code.coder
   Z_pytest.outcomesr   r   r   r   r   r/   r3   r5   r;   r9   rB   rM   rW   rY   rK   re   r@   ri   rg   rb   Úobjectrs   rh   r™   r0   r°   r   r   r   r   Ú<module>   sL   

-(Z