U
    42i<                     @  s  d Z ddlmZ ddl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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&Z&ej'dd dk r\ddl(m)Z) errddl*Z*ddl+Z,eeee- e-ej.f ed f Z/dddd d!d"d#Z0G d$d% d%e!Z1G d&d' d'e"Z2ed(d)d*d+d,d-d.d/Z3d0a4ed(d1d*d2d3d4d5Z5d6d7d8d9Z6dS ):z4Discover and run std-library "unittest" style tests.    )annotationsN)Any)Callable)	Generator)Iterable)Tuple)Type)TYPE_CHECKING)Union)is_async_function)hookimpl)FixtureRequest)	Collector)Item)exit)fail)skip)xfail)Class)Function)Module)CallInfo   )      )ExceptionGroup)NNNzModule | ClassstrobjectzUnitTestCase | None)	collectornameobjreturnc                 C  sV   z t jd }t||jsW d S W n tk
r6   Y d S X t|rFd S tj| ||dS )Nunittest)r   r    )	sysmodules
issubclassTestCase	Exceptioninspect
isabstractUnitTestCasefrom_parent)r   r   r    ut r-   4/tmp/pip-unpacked-wheel-7n2p7kht/_pytest/unittest.pypytest_pycollect_makeitem3   s    


r/   c                   @  sF   e Zd ZdZdd ZddddZdd	d
ddZdd	d
ddZdS )r*   Tc                 C  s
   |  dS )NrunTestr    selfr-   r-   r.   newinstanceL   s    zUnitTestCase.newinstancezIterable[Item | Collector]r!   c           
      c  s   ddl m} | j}t|dds"d S t|}|sJ| | | | |   | jj	
|  | j | }d}|| jD ]2}t| j|}t|ddsqvtj| |dV  d}qv|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__TF)r   r0   twisted.trial.unittest)r"   r6   r    getattr_is_skipped'_register_unittest_setup_method_fixture&_register_unittest_setup_class_fixtureZ_register_setup_class_fixturesession_fixturemanagerZparsefactoriesr4   nodeidZgetTestCaseNamesTestCaseFunctionr+   r#   r$   getr&   r0   )
r3   r6   clsskippedloaderZfoundsomethingr   xruntestr,   r-   r-   r.   collectT   s0    

zUnitTestCase.collecttypeNone)rA   r!   c                   s   t ddt dddkr,dkr,dS t ddd  ddfd	d
ddd fdd}| jjjdj || jddd dS )zSRegister an auto-use fixture to invoke setUpClass and
        tearDownClass (#517).Z
setUpClassNZtearDownClassZdoClassCleanupsc                   S  s   d S Nr-   r-   r-   r-   r.   <lambda>z       zEUnitTestCase._register_unittest_setup_class_fixture.<locals>.<lambda>rH   r5   c                    sF   t  dd } | sd S dd | D }t|dkr8|d n
td|d S )NZtearDown_exceptionsc                 S  s   g | ]\}}}|qS r-   r-   ).0_excr-   r-   r.   
<listcomp>   s     zlUnitTestCase._register_unittest_setup_class_fixture.<locals>.process_teardown_exceptions.<locals>.<listcomp>   r   zUnittest class cleanup errors)r8   lenr   )Z	exc_infos
exceptions)rA   r-   r.   process_teardown_exceptions|   s    
zXUnitTestCase._register_unittest_setup_class_fixture.<locals>.process_teardown_exceptionsr   Generator[None]requestr!   c                 3  s   | j }t|r$|j}tjj|ddd k	rZz
  W n" tk
rX         Y nX d V  zd k	rp  W 5      X d S NT)Z_use_item_location)rA   r9   __unittest_skip_why__pytestr   r'   )rV   rA   reason)cleanuprS   setupteardownr-   r.   unittest_setup_class_fixture   s"    

zYUnitTestCase._register_unittest_setup_class_fixture.<locals>.unittest_setup_class_fixtureZ_unittest_setUpClass_fixture_classTr   funcr>   ZscopeZautouser8   r<   r=   Z_register_fixture__qualname__r>   )r3   rA   r^   r-   )r[   rA   rS   r\   r]   r.   r;   s   s    
z3UnitTestCase._register_unittest_setup_class_fixturec                   sh   t |dd t |dd dkr,dkr,dS ddd fdd}| jjjd	|j || jd
dd dS )zWRegister an auto-use fixture to invoke setup_method and
        teardown_method (#517).Zsetup_methodNZteardown_methodr   rT   rU   c                 3  sV   | j }t|r$|j}tjj|dd d k	r8 || j d V  d k	rR|| j d S rW   )instancer9   rX   rY   r   r'   function)rV   r3   rZ   r\   r]   r-   r.   unittest_setup_method_fixture   s    z[UnitTestCase._register_unittest_setup_method_fixture.<locals>.unittest_setup_method_fixtureZ_unittest_setup_method_fixture_re   Tr`   rb   )r3   rA   rg   r-   rf   r.   r:      s    
z4UnitTestCase._register_unittest_setup_method_fixtureN)__name__
__module__rc   
nofuncargsr4   rF   r;   r:   r-   r-   r-   r.   r*   G   s
   8r*   c                      s.  e Zd ZU dZdZded< dd Zedd Zd	d
 fddZ	d	d
 f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dd	dddZd6dddd	d!d"d#Zd7dd$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/d0Zd1d2d3 fd4d5Z  ZS )8r?   TNz7list[_pytest._code.ExceptionInfo[BaseException]] | None_excinfoc                 C  s   t | jtst| j| jS rI   )
isinstanceparentr*   AssertionErrorr    r   r2   r-   r-   r.   _getinstance   s    zTestCaseFunction._getinstancec                 C  s   | j S rI   )rd   r2   r-   r-   r.   	_testcase   s    zTestCaseFunction._testcaserH   r5   c                   s   d | _ t   d S rI   )_explicit_tearDownsuperr\   r2   	__class__r-   r.   r\      s    zTestCaseFunction.setupc                   s0   | j d k	r|    d | _ d | _| `t   d S rI   )rq   _objZ	_instancerr   r]   r2   rs   r-   r.   r]      s    
zTestCaseFunction.teardownzunittest.TestCase)testcaser!   c                 C  s   d S rI   r-   r3   rv   r-   r-   r.   	startTest   s    zTestCaseFunction.startTest_SysExcInfoType)
rawexcinfor!   c                 C  s  t |d|}z"tjjt |}|j}|j}W n tk
r   zrz,tj	| }|
dd td|dd W n@ tjtfk
r    Y n& tk
r   td|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Zpytracez6ERROR: Unknown Incompatible Exception representation:
rk   )r8   _pytest_codeZExceptionInfoBaseExceptionZfrom_exc_infovalue	traceback	TypeErrorformat_exceptioninsertr   joinr'   KeyboardInterruptZfrom_current__dict__
setdefaultappend)r3   rz   excinforM   valuesr-   r-   r.   _addexcinfo   s8    

zTestCaseFunction._addexcinfo)rv   rz   r!   c                 C  sF   z"t |d tjr t|d j W n tk
r6   Y nX | | d S )NrP   )rl   r   r'   msgr   r   r3   rv   rz   r-   r-   r.   addError  s    zTestCaseFunction.addErrorc                 C  s   |  | d S rI   )r   r   r-   r-   r.   
addFailure  s    zTestCaseFunction.addFailurer   )rv   rZ   r!   c                 C  s>   zt jj|ddW n$ tjk
r8   | t  Y nX d S rW   )rY   r   r'   r   r#   exc_info)r3   rv   rZ   r-   r-   r.   addSkip  s    zTestCaseFunction.addSkipr|   )rv   rz   rZ   r!   c                 C  s:   zt t| W n$ t jk
r4   | t  Y nX d S rI   )r   r   r'   r   r#   r   )r3   rv   rz   rZ   r-   r-   r.   addExpectedFailure   s    z#TestCaseFunction.addExpectedFailurez"twisted.trial.unittest.Todo | Nonec                 C  sR   d}|r|d|j  7 }zt|dd W n$ tjk
rL   | t  Y nX d S )NzUnexpected successz: Fr}   )rZ   r   r'   r   r#   r   )r3   rv   rZ   r   r-   r-   r.   addUnexpectedSuccess+  s    z%TestCaseFunction.addUnexpectedSuccessc                 C  s   d S rI   r-   rw   r-   r-   r.   
addSuccess9  s    zTestCaseFunction.addSuccessc                 C  s   d S rI   r-   rw   r-   r-   r.   stopTest<  s    zTestCaseFunction.stopTestfloat)rv   elapsedr!   c                 C  s   d S rI   r-   )r3   rv   r   r-   r-   r.   addDuration?  s    zTestCaseFunction.addDurationc              	   C  s   ddl m} | j}|d k	st||  t| jr<|| d n|t| jtsLtt	| jp`t	| jj}| j
dr|s|j| _t|ddd  t|| j| j z|| d W 5 t|| j X d S )Nr   )&maybe_wrap_pytest_function_for_tracing)resultZusepdbtearDownc                  W  s   d S rI   r-   )argsr-   r-   r.   rJ   Y  rK   z*TestCaseFunction.runtest.<locals>.<lambda>)Z_pytest.debuggingr   rd   rn   r   r    rl   rm   r*   r9   configZ	getoptionr   rq   setattrr   delattr)r3   r   rv   rB   r-   r-   r.   rE   B  s    
	zTestCaseFunction.runtestz*_pytest._code.ExceptionInfo[BaseException]z_pytest._code.Traceback)r   r!   c                   s&   t  |}|dd }|s"|}|S )Nc                 S  s   | j jd S )NZ
__unittest)frame	f_globalsr@   )rD   r-   r-   r.   rJ   h  rK   z4TestCaseFunction._traceback_filter.<locals>.<lambda>)rr   _traceback_filterfilter)r3   r   r   Z
ntracebackrs   r-   r.   r   c  s    z"TestCaseFunction._traceback_filter)r|   )N)rh   ri   rc   rj   rk   __annotations__ro   propertyrp   r\   r]   rx   r   r   r   r   r   r   r   r   r   rE   r   __classcell__r-   r-   rs   r.   r?      s*   

#

  !r?   T)Ztryfirstr   zCallInfo[None]rH   )itemcallr!   c                   s   t | tr<| jr<| jd|_z|`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 rI   )rY   r   r   r   r-   r   r-   r.   rJ     rK   z+pytest_runtest_makereport.<locals>.<lambda>)rl   r?   rk   popr   r   AttributeErrorr#   r$   r@   r   ZSkipTestr   Z	from_callwhen)r   r   r"   Zcall2r-   r   r.   pytest_runtest_makereporto  s    

 r   F)wrapperzGenerator[None, object, object])r   r!   c                 #  s   t | tr~dtjkr~tjd }|jj tsPddlm} ddl	m
} |t| dad	 fdd	}||j_z
d V }W 5  |j_X nd V }|S )
Nr7   ztwisted.python.failurer   )	IReporter)classImplementsTc                   sn   |d krt  | _n|d kr$t|}|||f| _z | ||||d W n" tk
rh    | ||| Y nX d S )N)captureVars)r#   r   r{   rG   r   )r3   	exc_valueexc_typeexc_tbr   ZFailure__init__r-   r.   excstore  s        
z)pytest_runtest_protocol.<locals>.excstore)NNNN)rl   r?   r#   r$   ZFailure__init__classImplements_has_runZtwisted.trial.itrialr   Zzope.interfacer   )r   r,   r   r   r   resr-   r   r.   pytest_runtest_protocol  s&    

       
r   boolr5   c                 C  s   t t| ddS )zDReturn True if the given object has been marked with @unittest.skip.Z__unittest_skip__F)r   r8   r1   r-   r-   r.   r9     s    r9   )7__doc__
__future__r   r(   r#   r   typestypingr   r   r   r   r   r   r	   r
   Z_pytest._coder~   Z_pytest.compatr   Z_pytest.configr   Z_pytest.fixturesr   Z_pytest.nodesr   r   Z_pytest.outcomesr   r   r   r   Z_pytest.pythonr   r   r   Z_pytest.runnerr   rY   version_infoZexceptiongroupr   r"   Ztwisted.trial.unittestZtwistedr   TracebackTypery   r/   r*   r?   r   r   r   r9   r-   r-   r-   r.   <module>   sb     &&