B
    WcD9                 @   sR  d Z ddl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lm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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( erddl)Z)ddl*Z+eeee, e,ej-f ed f Z.ee$e"f e/e0e
d ddd Z1G d!d de"Z2e3e/e/e
e/ e(e4d"d#d$Z5G d%d& d&e#Z6ed'd(ee&d dd)d*d+Z7ed'd,eed d-d.d/Z8g fe	e9 dd0d1d2Z:e4d3d4d5Z;dS )6z4Discover and run std-library "unittest" style tests.    N)Any)Callable)	Generator)Iterable)List)Optional)Tuple)Type)TYPE_CHECKING)Union)	getimfunc)is_async_function)hookimpl)FixtureRequest)	Collector)Item)exit)fail)skip)xfail)Class)Function)Module)CallInfo)Scope)NNNUnitTestCase)	collectornameobjreturnc             C   sH   yt jd }t||jsd S W n tk
r2   d S X tj| ||d}|S )Nunittest)r   r   )sysmodules
issubclassTestCase	Exceptionr   from_parent)r   r   r   utitem r)   /lib/python3.7/site-packages/_pytest/unittest.pypytest_pycollect_makeitem,   s    
r+   c               @   s:   e Zd ZdZeeeef  dddZe	ddddZ
dS )	r   T)r   c             c   s   ddl m} | j}t|dds"d S t|}|s@| | |   | jjj	| dd | }d}xL|
| jD ]<}t| j|}t|ddsqjt|}tj| ||dV  d}qjW |st| jdd }	|	d k	rtjd	d }
|
d ks|	|
jjkrtj| dd
V  d S )Nr   )
TestLoaderZ__test__T)r    F)r   ZcallobjrunTestztwisted.trial.unittest)r   )r    r,   r   getattr_is_skipped_inject_setup_teardown_fixturesZ_inject_setup_class_fixtureZsessionZ_fixturemanagerZparsefactoriesZgetTestCaseNamesr   TestCaseFunctionr&   r!   r"   getr$   r-   )selfr,   clsskippedloaderZfoundsomethingr   xfuncobjruntestr'   r)   r)   r*   collectA   s0    
zUnitTestCase.collectN)r4   r   c             C   sD   t |dddtjdd}|r ||_t |dddtjd	d}|r@||_dS )
zxInjects a hidden auto-use fixture to invoke setUpClass/setup_method and corresponding
        teardown functions (#517).Z
setUpClassZtearDownClassZdoClassCleanupsF)scope	pass_selfZsetup_methodZteardown_methodNT)_make_xunit_fixturer   r   Z!_UnitTestCase__pytest_class_setupr   Z"_UnitTestCase__pytest_method_setup)r3   r4   Zclass_fixtureZmethod_fixturer)   r)   r*   r0   `   s$    z,UnitTestCase._inject_setup_teardown_fixtures)__name__
__module____qualname__
nofuncargsr   r   r   r   r:   typer0   r)   r)   r)   r*   r   <   s   )r   
setup_nameteardown_namecleanup_namer;   r<   c                s   t | |d t | |d d kr,d kr,d S |rBt | |dd  ndd  tj|jdd| d| j dttd	 d
 fdd}|S )Nc              W   s   d S )Nr)   )argsr)   r)   r*   <lambda>       z%_make_xunit_fixture.<locals>.<lambda>c              W   s   d S )Nr)   )rF   r)   r)   r*   cleanup   s    z$_make_xunit_fixture.<locals>.cleanupTZ
_unittest_Z	_fixture_)r;   Zautouser   )NNN)requestr   c             3   s   t | r| j}tjj|ddd k	rnyr:| |j n  W n* tk
rl   r` |  n    Y nX d V  z$d k	rr| |j n  W d r |  n   X d S )NT)_use_item_location)r/   Z__unittest_skip_why__pytestr   r%   Zfunction)r3   rJ   reason)rI   r<   setupteardownr)   r*   fixture   s,    



z$_make_xunit_fixture.<locals>.fixture)r.   rL   rP   valuer@   r   r   )r   rC   rD   rE   r;   r<   rP   r)   )rI   r<   rN   rO   r*   r=   z   s      r=   c                   s4  e Zd ZU dZdZeeejj	e
   ed< dZed ed< dd Zddd	d
ZddddZdddddZdddddZddddddZddddddZdeddddZd,ddeddddZd-ded  ddd!d"Zdddd#d$Zdddd%d&Zddd'd(Zejj	e
 dd) fd*d+Z  ZS ).r1   TN_excinfozunittest.TestCase	_testcasec             C   s   | j d k	stt| j j| jS )N)parentAssertionErrorr.   r   Zoriginalname)r3   r)   r)   r*   _getobj   s    zTestCaseFunction._getobj)r   c             C   sL   d | _ | jd k	st| j| j| _t| j| j| _t| drH| j	
  d S )N_request)_explicit_tearDownrT   rU   r   r   rS   r.   _objhasattrrW   Z_fillfixtures)r3   r)   r)   r*   rN      s    
zTestCaseFunction.setupc             C   s(   | j d k	r|    d | _ d | _d | _d S )N)rX   rS   rY   )r3   r)   r)   r*   rO      s
    
zTestCaseFunction.teardown)testcaser   c             C   s   d S )Nr)   )r3   r[   r)   r)   r*   	startTest   s    zTestCaseFunction.startTest_SysExcInfoType)
rawexcinfor   c             C   s  t |d|}y"tjjt |}|j |j W n tk
r   yry,tj	| }|
dd td|dd W n@ tjtfk
r    Y n& tk
r   td|f dd Y nX W n6 tk
r    Y n" tjk
r   tjj }Y nX Y nX | jdg | d S )	N_rawexcinfor   zCNOTE: Incompatible Exception Representation, displaying natively:

 F)pytracez8ERROR: Unknown Incompatible Exception representation:
%rrR   )r.   _pytest_codeExceptionInfoBaseExceptionZfrom_exc_inforQ   	traceback	TypeErrorformat_exceptioninsertr   joinr%   KeyboardInterruptZfrom_current__dict__
setdefaultappend)r3   r^   excinfovaluesr)   r)   r*   _addexcinfo   s2    

zTestCaseFunction._addexcinfo)r[   r^   r   c             C   sF   y"t |d tjr t|d j W n tk
r6   Y nX | | d S )N   )
isinstancer   r%   msgrg   rq   )r3   r[   r^   r)   r)   r*   addError   s    zTestCaseFunction.addErrorc             C   s   |  | d S )N)rq   )r3   r[   r^   r)   r)   r*   
addFailure  s    zTestCaseFunction.addFailure)r[   rM   r   c             C   s>   yt jj|ddW n$ tjk
r8   | t  Y nX d S )NT)rK   )rL   r   r%   rq   r!   exc_info)r3   r[   rM   r)   r)   r*   addSkip  s    zTestCaseFunction.addSkipr`   )r[   r^   rM   r   c             C   s:   yt t| W n$ t jk
r4   | t  Y nX d S )N)r   strr%   rq   r!   rw   )r3   r[   r^   rM   r)   r)   r*   addExpectedFailure  s    z#TestCaseFunction.addExpectedFailureztwisted.trial.unittest.Todoc             C   sR   d}|r|d|j  7 }yt|dd W n$ tjk
rL   | t  Y nX d S )NzUnexpected successz: F)ra   )rM   r   r%   rq   r!   rw   )r3   r[   rM   rt   r)   r)   r*   addUnexpectedSuccess  s    z%TestCaseFunction.addUnexpectedSuccessc             C   s   d S )Nr)   )r3   r[   r)   r)   r*   
addSuccess'  s    zTestCaseFunction.addSuccessc             C   s   d S )Nr)   )r3   r[   r)   r)   r*   stopTest*  s    zTestCaseFunction.stopTestc          	   C   s   ddl m} | jd k	st||  t| jr:| j| d nt| jtsJtt	| jp^t	| jj}| j
dr|s| jj| _t| jddd  t| j| j| j z| j| d W d t| j| j X d S )Nr   )&maybe_wrap_pytest_function_for_tracing)resultZusepdbtearDownc              W   s   d S )Nr)   )rF   r)   r)   r*   rG   D  rH   z*TestCaseFunction.runtest.<locals>.<lambda>)Z_pytest.debuggingr~   rS   rU   r   r   rs   rT   r   r/   ZconfigZ	getoptionr   rX   setattrr   delattr)r3   r~   r5   r)   r)   r*   r9   -  s    
	
zTestCaseFunction.runtest)ro   r   c                s*   t  | |jdd }|r&||_d S )Nc             S   s   | j jd S )NZ
__unittest)frame	f_globalsr2   )r7   r)   r)   r*   rG   S  rH   z2TestCaseFunction._prunetraceback.<locals>.<lambda>)super_prunetracebackrf   filter)r3   ro   rf   )	__class__r)   r*   r   N  s
    
z TestCaseFunction._prunetraceback)r`   )N)r>   r?   r@   rA   rR   r   r   rb   rc   rd   re   __annotations__rS   rV   rN   rO   r\   rq   ru   rv   ry   rx   rz   r{   r|   r}   r9   r   __classcell__r)   r)   )r   r*   r1      s,   
		"	
	

"
r1   T)Ztryfirst)r(   callr   c                s   t | tr<| jr<| jd|_y|`W n tk
r:   Y nX tj	d}|r|jrt |jj
|jr|j td   fdd|j}|j|_d S )Nr   r    c                  s   t t jS )N)rL   r   ry   rQ   r)   )ro   r)   r*   rG   o  rH   z+pytest_runtest_makereport.<locals>.<lambda>)rs   r1   rR   popro   r   AttributeErrorr!   r"   r2   rQ   ZSkipTestr   Z	from_callZwhen)r(   r   r    Zcall2r)   )ro   r*   pytest_runtest_makereportY  s    
r   )Zhookwrapper)r(   r   c             #   s\   t | trRdtjkrRtjd }|jj t  d fdd	}||j_d V   |j_nd V  d S )Nztwisted.trial.unittestztwisted.python.failurec                sn   |d krt  | _n|d kr$t|}|||f| _y | ||||d W n" tk
rh    | ||| Y nX d S )N)captureVars)r!   rw   r_   rB   rg   )r3   	exc_valueexc_typeZexc_tbr   )Failure__init__r)   r*   excstore~  s    z)pytest_runtest_protocol.<locals>.excstore)NNNN)rs   r1   r!   r"   ZFailure__init__(check_testcase_implements_trial_reporter)r(   r'   r   r)   )r   r*   pytest_runtest_protocolw  s    

r   )doner   c             C   s8   | rd S ddl m} ddlm} |t| | d d S )Nr   )classImplements)	IReporterrr   )Zzope.interfacer   Ztwisted.trial.itrialr   r1   rn   )r   r   r   r)   r)   r*   r     s    
r   )r   c             C   s   t t| ddS )zDReturn True if the given object has been marked with @unittest.skip.Z__unittest_skip__F)boolr.   )r   r)   r)   r*   r/     s    r/   )<__doc__r!   rf   typestypingr   r   r   r   r   r   r   r	   r
   r   Z_pytest._coderb   rL   Z_pytest.compatr   r   Z_pytest.configr   Z_pytest.fixturesr   Z_pytest.nodesr   r   Z_pytest.outcomesr   r   r   r   Z_pytest.pythonr   r   r   Z_pytest.runnerr   Z_pytest.scoper   r    Ztwisted.trial.unittestZtwistedre   TracebackTyper]   ry   objectr+   r   rB   r   r=   r1   r   r   intr   r/   r)   r)   r)   r*   <module>   sj   ?7 #
