U
    ¼Ê¦iæ+  ã                   @   st   d Z ddlZddlZddlZddlmZmZ ddlmZ dZ	dZ
dZd	d
„ Zdd„ Zdd„ ZG dd„ deƒZeZdS )zUnittest main programé    Né   )ÚloaderÚrunner)ÚinstallHandlerTa  Examples:
  %(prog)s test_module               - run tests from test_module
  %(prog)s module.TestClass          - run tests from module.TestClass
  %(prog)s module.Class.test_method  - run specified test method
  %(prog)s path/to/test_file.py      - run tests from test_file.py
aF  Examples:
  %(prog)s                           - run default set of tests
  %(prog)s MyTestSuite               - run suite 'MyTestSuite'
  %(prog)s MyTestCase.testSomething  - run MyTestCase.testSomething
  %(prog)s MyTestCase                - run all 'test*' test methods
                                       in MyTestCase
c                 C   sx   t j | ¡rt|  ¡  d¡rtt j | ¡rXt j | t  ¡ ¡}t j |¡sP| t j	¡rT| S |} | d d…  
dd¡ 
dd¡S | S )Nz.pyéýÿÿÿú\Ú.ú/)ÚosÚpathÚisfileÚlowerÚendswithÚisabsÚrelpathÚgetcwdÚ
startswithÚpardirÚreplace)ÚnameZrel_path© r   ú#/usr/lib/python3.8/unittest/main.pyÚ_convert_name   s    r   c                 C   s   dd„ | D ƒS )Nc                 S   s   g | ]}t |ƒ‘qS r   )r   )Ú.0r   r   r   r   Ú
<listcomp>.   s     z"_convert_names.<locals>.<listcomp>r   )Únamesr   r   r   Ú_convert_names-   s    r   c                 C   s   d| krd|  } | S )NÚ*z*%s*r   )Úpatternr   r   r   Ú_convert_select_pattern1   s    r   c                   @   s²   e Zd ZdZdZdZd Z Z Z Z	 Z
ZdZddddejddddddfddœdd	„Zd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d„Zdd„ ZdS )!ÚTestProgramzA command-line program that runs a set of tests; this is primarily
       for making test modules conveniently executable.
    Nr   Ú__main__TF)Ú	tb_localsc                C   sÊ   t |tƒr<t|ƒ| _| d¡dd … D ]}t| j|ƒ| _q&n|| _|d krPtj}|| _|| _	|	| _
|| _|
| _|| _|d krŠtjsŠd| _n|| _|| _|| _|| _tj |d ¡| _|  |¡ |  ¡  d S )Nr   r   Údefaultr   )Ú
isinstanceÚstrÚ
__import__ÚmoduleÚsplitÚgetattrÚsysÚargvÚexitÚfailfastÚ
catchbreakÚ	verbosityÚbufferr"   ÚwarnoptionsÚwarningsÚdefaultTestÚ
testRunnerÚ
testLoaderr
   r   ÚbasenameÚprogNameÚ	parseArgsÚrunTests)Úselfr'   r3   r+   r4   r5   r,   r/   r-   r.   r0   r2   r"   Úpartr   r   r   Ú__init__A   s,    


zTestProgram.__init__c                 C   s4   |rt |ƒ | jd kr|  ¡  |  ¡  t d¡ d S )Né   )ÚprintÚ_discovery_parserÚ_initArgParsersÚ_print_helpr*   r,   )r:   Úmsgr   r   r   Ú	usageExitg   s    
zTestProgram.usageExitc                 O   sZ   | j d kr6t| j ¡ ƒ ttd| ji ƒ | j ¡  n t| j ¡ ƒ ttd| ji ƒ d S )NÚprog)	r'   r>   Ú_main_parserZformat_helpÚMAIN_EXAMPLESr7   r?   Ú
print_helpÚMODULE_EXAMPLES)r:   ÚargsÚkwargsr   r   r   rA   o   s    
zTestProgram._print_helpc                 C   sê   |   ¡  | jd krpt|ƒdkrD|d  ¡ dkrD|  |dd … ¡ d S | j |dd … | ¡ | js†|  g ¡ d S n| j |dd … | ¡ | jr¨t| jƒ| _	t
dkrÞd | _n6| jd krºd | _	n$t| jtƒrÒ| jf| _	nt| jƒ| _	|  ¡  d S )Nr   Údiscoverr=   r!   )r@   r'   Úlenr   Ú_do_discoveryrE   Ú
parse_argsÚtestsr   Ú	testNamesÚ__name__r3   r$   r%   ÚlistÚcreateTests)r:   r+   r   r   r   r8   x   s(    


zTestProgram.parseArgsc                 C   st   | j r| j | j_ |r@|d kr"| jn|ƒ }| | j| j| j¡| _n0| jd kr\| j | j	¡| _n| j 
| j| j	¡| _d S ©N)ÚtestNamePatternsr5   rK   Ústartr   ÚtopÚtestrP   ZloadTestsFromModuler'   ZloadTestsFromNames)r:   Úfrom_discoveryÚLoaderr   r   r   r   rS   •   s    


ÿzTestProgram.createTestsc                 C   s$   |   ¡ }|  |¡| _|  |¡| _d S rT   )Ú_getParentArgParserÚ_getMainArgParserrE   Ú_getDiscoveryArgParserr?   )r:   Zparent_parserr   r   r   r@   ¡   s    zTestProgram._initArgParsersc                 C   sÞ   t jdd�}|jddddddd	� |jd
dddddd	� |jddddd� | jd krn|jdddddd� d| _| jd kr’|jdddddd� d| _| jd kr¶|jdddddd� d| _| jd krÚ|jdd d!td"d#� g | _|S )$NF)Zadd_helpz-vz	--verboser/   Zstore_constr=   zVerbose output)ÚdestÚactionZconstÚhelpz-qz--quietr   zQuiet outputz--localsr"   Ú
store_truez"Show local variables in tracebacks)r^   r_   r`   z-fz
--failfastr-   zStop on first fail or errorz-cz--catchr.   z'Catch Ctrl-C and display results so farz-bz--bufferr0   z%Buffer stdout and stderr during testsz-krU   Úappendz.Only run tests which match the given substring)r^   r_   Útyper`   )ÚargparseÚArgumentParserÚadd_argumentr-   r.   r0   rU   r   )r:   Úparserr   r   r   r[   ¦   sR    
 þ
 þþ

þ

þ

þ
 þzTestProgram._getParentArgParserc                 C   s2   t j|gd�}| j|_| j|_|jdddd� |S )N©ÚparentsrO   r   z?a list of any number of test modules, classes and test methods.)Únargsr`   )rd   re   r7   rD   rA   rG   rf   )r:   Úparentrg   r   r   r   r\   É   s    ÿzTestProgram._getMainArgParserc                 C   sz   t j|gd�}d| j |_d|_|jddddd� |jd	d
ddd� |jddddd� dD ]}|j|dt jt jd� qZ|S )Nrh   z%s discoverzcFor test discovery all test modules must be importable from the top level directory of the project.z-sz--start-directoryrV   z*Directory to start discovery ('.' default))r^   r`   z-pz	--patternr   z+Pattern to match tests ('test*.py' default)z-tz--top-level-directoryrW   z<Top level directory of project (defaults to start directory))rV   r   rW   ú?)rj   r#   r`   )rd   re   r7   rD   Zepilogrf   ZSUPPRESS)r:   rk   rg   Úargr   r   r   r]   Ô   s$    
ÿ
ÿ
ÿþz"TestProgram._getDiscoveryArgParserc                 C   sL   d| _ d| _d | _|d k	r:| jd kr,|  ¡  | j || ¡ | jd|d� d S )Nr   ztest*.pyT)rY   rZ   )rV   r   rW   r?   r@   rN   rS   )r:   r+   rZ   r   r   r   rM   é   s    
zTestProgram._do_discoveryc              	   C   sÐ   | j rtƒ  | jd krtj| _t| jtƒr zVz"| j| j| j| j	| j
| jd�}W n. tk
r|   | j| j| j| j	| j
d�}Y nX W q¦ tk
rœ   |  ¡ }Y q¦X n| j}| | j¡| _| jrÌt | j ¡  ¡ d S )N)r/   r-   r0   r2   r"   )r/   r-   r0   r2   )r.   r   r4   r   ZTextTestRunnerr$   rc   r/   r-   r0   r2   r"   Ú	TypeErrorÚrunrX   Úresultr,   r*   ZwasSuccessful)r:   r4   r   r   r   r9   ö   s2    
ü
ýzTestProgram.runTests)N)FN)N)rQ   Ú
__module__Ú__qualname__Ú__doc__r'   r/   r-   r.   r0   r7   r2   rU   r?   r   ZdefaultTestLoaderr<   rC   rA   r8   rS   r@   r[   r\   r]   rM   r9   r   r   r   r   r    7   s6        ýý&
	
#
r    )rs   r*   rd   r
   Ú r   r   Zsignalsr   Z
__unittestrF   rH   r   r   r   Úobjectr    Úmainr   r   r   r   Ú<module>   s   	 ]