B
    ܇\%                 @   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	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G dd deZdd ZG dd deZedddd Zedddd Zg fddZdS )z> discovery and running of std-library "unittest" style tests.     )absolute_import)division)print_functionN)	getimfunc)hookimpl)fail)skip)xfail)Class)Functionc             C   s<   yt |tjd jsd S W n tk
r.   d S X t|| dS )Nunittest)parent)
issubclasssysmodulesTestCase	ExceptionUnitTestCase)Z	collectornameobj r   /lib/python3.7/site-packages/_pytest/unittest.pypytest_pycollect_makeitem   s    r   c               @   s    e Zd ZdZdd Zdd ZdS )r   Tc             c   s   ddl m} | j}t|dds"d S t|dd}|sD| | |   | jjj| dd | }d}xJ|	| jD ]:}t| j|}t|ddsqnt
|}t|| |dV  d}qnW |st| jd	d }	|	d k	rtjd
d }
|
d ks|	|
jjkrtd	| dV  d S )Nr   )
TestLoaderZ__test__T__unittest_skip__F)r   )r   ZcallobjrunTestztwisted.trial.unittest)r   )r   r   r   getattr_inject_setup_teardown_fixturesZ_inject_setup_class_fixtureZsessionZ_fixturemanagerZparsefactoriesZgetTestCaseNamesr   TestCaseFunctionr   r   getr   r   )selfr   clsZskippedloaderZfoundsomethingr   xfuncobjruntestutr   r   r   collect$   s0    
zUnitTestCase.collectc             C   s<   t |ddddd}|r||_t |dddd	d}|r8||_d
S )zwInjects a hidden auto-use fixture to invoke setUpClass/setup_method and corresponding
        teardown functions (#517)Z
setUpClassZtearDownClassclassF)scope	pass_selfZsetup_methodZteardown_methodfunctionTN)_make_xunit_fixtureZ!_UnitTestCase__pytest_class_setupZ"_UnitTestCase__pytest_method_setup)r    r!   Zclass_fixtureZmethod_fixturer   r   r   r   B   s    z,UnitTestCase._inject_setup_teardown_fixturesN)__name__
__module____qualname__
nofuncargsr'   r   r   r   r   r   r      s   r   c                sN   t | |d t | |d d kr,d kr,d S tj|dd fdd}|S )NT)r)   Zautousec             3   sf   t | dd r| j}t| d k	r< r6| |j n  d V  d k	rb r\| |j n  d S )Nr   )r   __unittest_skip_why__pytestr   r+   )r    Zrequestreason)r*   setupteardownr   r   fixtureX   s    
z$_make_xunit_fixture.<locals>.fixture)r   r2   r6   )r   Z
setup_nameZteardown_namer)   r*   r6   r   )r*   r4   r5   r   r,   R   s    r,   c               @   s   e Zd Zd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dZd#ddZdd Zdd Zdd Zdd Zd d! ZdS )$r   TNc             C   s0   | j | j| _|   t| dr,| j  d S )N_request)r   r   r   	_testcase_fix_unittest_skip_decoratorhasattrr7   Z_fillfixtures)r    r   r   r   r4   q   s    
zTestCaseFunction.setupc             C   s"   t jd dkrt| jd| j dS )aO  
        The @unittest.skip decorator calls functools.wraps(self._testcase)
        The call to functools.wraps() fails unless self._testcase
        has a __name__ attribute. This is usually automatically supplied
        if the test is a function or method, but we need to add manually
        here.

        See issue #1169
        r      r-   N)r   version_infosetattrr8   r   )r    r   r   r   r9   w   s    
z-TestCaseFunction._fix_unittest_skip_decoratorc             C   s
   d | _ d S )N)r8   )r    r   r   r   r5      s    zTestCaseFunction.teardownc             C   s   d S )Nr   )r    testcaser   r   r   	startTest   s    zTestCaseFunction.startTestc             C   s   t |d|}ytj|}|j |j W n tk
r   yjy,tj| }|dd t	d
|dd W n8 t	jtfk
r    Y n   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)Zpytracez8ERROR: Unknown Incompatible Exception representation:
%r_excinfo)r   _pytest_codeZExceptionInfovalue	traceback	TypeErrorformat_exceptioninsertr   joinr   KeyboardInterruptZfrom_current__dict__
setdefaultappend)r    
rawexcinfoexcinfovaluesr   r   r   _addexcinfo   s2    

zTestCaseFunction._addexcinfoc             C   s   |  | d S )N)rR   )r    r>   rO   r   r   r   addError   s    zTestCaseFunction.addErrorc             C   s   |  | d S )N)rR   )r    r>   rO   r   r   r   
addFailure   s    zTestCaseFunction.addFailurec             C   s<   yt | W n* t jk
r6   d| _| t  Y nX d S )NT)r   r   Z_skipped_by_markrR   r   exc_info)r    r>   r3   r   r   r   addSkip   s
    zTestCaseFunction.addSkiprA   c             C   s:   yt t| W n$ t jk
r4   | t  Y nX d S )N)r	   strr   rR   r   rU   )r    r>   rO   r3   r   r   r   addExpectedFailure   s    z#TestCaseFunction.addExpectedFailurec             C   s
   || _ d S )N)Z_unexpectedsuccess)r    r>   r3   r   r   r   addUnexpectedSuccess   s    z%TestCaseFunction.addUnexpectedSuccessc             C   s   d S )Nr   )r    r>   r   r   r   
addSuccess   s    zTestCaseFunction.addSuccessc             C   s   d S )Nr   )r    r>   r   r   r   stopTest   s    zTestCaseFunction.stopTestc             C   s   t | j| jj}t | jjdds,t |ddrt | jjddpFt |dd}y| j| | j| W n2 tk
r   tjd dkr~ | j| | Y nX dS dS )Nr   Fr1   rA   r   r;   T)r   r8   Z_testMethodName	__class__Z_addSkiprG   r   r<   )r    Z
testMethodZskip_whyr   r   r   _handle_skip   s    
zTestCaseFunction._handle_skipc             C   s:   | j jdd kr | j| d n|  r,d S | j  d S )NZ	pdbinvoke)result)ZconfigZpluginmanagerZ
get_pluginr8   r]   debug)r    r   r   r   r%      s
    zTestCaseFunction.runtestc             C   s*   t | | |jdd }|r&||_d S )Nc             S   s   | j jd S )NZ
__unittest)frame	f_globalsr   )r#   r   r   r   <lambda>   s    z2TestCaseFunction._prunetraceback.<locals>.<lambda>)r   _prunetracebackrF   filter)r    rP   rF   r   r   r   rc      s
    
z TestCaseFunction._prunetraceback)rA   )rA   )r-   r.   r/   r0   rB   r8   r4   r9   r5   r?   rR   rS   rT   rV   rX   rY   rZ   r[   r]   r%   rc   r   r   r   r   r   l   s$   !

	r   T)Ztryfirstc             C   s@   t | tr<| jr<| jd|_y|`W n tk
r:   Y nX d S )Nr   )
isinstancer   rB   poprP   r^   AttributeError)itemZcallr   r   r   pytest_runtest_makereport   s    
ri   )Zhookwrapperc             #   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   rU   r@   typerG   )r    	exc_valueexc_typeZexc_tbrj   )Failure__init__r   r   excstore  s    z)pytest_runtest_protocol.<locals>.excstore)NNNN)re   r   r   r   ZFailure__init__(check_testcase_implements_trial_reporter)rh   r&   ro   r   )rn   r   pytest_runtest_protocol   s    

rr   c             C   s8   | rd S ddl m} ddlm} |t| | d d S )Nr   )classImplements)	IReporter   )Zzope.interfacers   Ztwisted.trial.itrialrt   r   rN   )Zdoners   rt   r   r   r   rq     s    
rq   )__doc__Z
__future__r   r   r   r   rF   Z_pytest._coderC   r2   Z_pytest.compatr   Z_pytest.configr   Z_pytest.outcomesr   r   r	   Z_pytest.pythonr
   r   r   r   r,   r   ri   rr   rq   r   r   r   r   <module>   s,   3 