B
    ^ c+                 @   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   lib/python3.7/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|| _x0|ddd  D ]}t| j|| _q(W n|| _|d krTtj}|| _|| _	|	| _
|| _|
| _|| _|d krtjsd| _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rt| j| _	t
dkrd | _n6| jd krd | _	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 )N)_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-krT   appendz.Only run tests which match the given substring)r]   r^   typer_   )argparseArgumentParseradd_argumentr-   r.   r0   rT   r   )r:   parserr   r   r   rZ      s>    








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_   )rc   rd   r7   rD   rA   rG   re   )r:   parentrf   r   r   r   r[      s    zTestProgram._getMainArgParserc             C   s~   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 x"dD ]}|j|dt jt jd q\W |S )N)rg   z%s discoverzcFor test discovery all test modules must be importable from the top level directory of the project.z-sz--start-directoryrU   z*Directory to start discovery ('.' default))r]   r_   z-pz	--patternr   z+Pattern to match tests ('test*.py' default)z-tz--top-level-directoryrV   z<Top level directory of project (defaults to start directory))rU   r   rV   ?)rh   r#   r_   )rc   rd   r7   rD   Zepilogre   ZSUPPRESS)r:   ri   rf   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)rX   rY   )rU   r   rV   r?   r@   rN   rS   )r:   r+   rY   r   r   r   rM      s    
zTestProgram._do_discoveryc          	   C   s   | j rt  | jd krtj| _t| jtryVy"| 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 qX n| j}|| j| _| jrt| j   d S )N)r/   r-   r0   r2   r"   )r/   r-   r0   r2   )r.   r   r4   r   ZTextTestRunnerr$   rb   r/   r-   r0   r2   r"   	TypeErrorrunrW   resultr,   r*   ZwasSuccessful)r:   r4   r   r   r   r9      s.    
zTestProgram.runTests)N)FN)N)rQ   
__module____qualname____doc__r'   r/   r-   r.   r0   r7   r2   rT   r?   r   ZdefaultTestLoaderr<   rC   rA   r8   rS   r@   rZ   r[   r\   rM   r9   r   r   r   r   r    7   s&   #
	
#
r    )rq   r*   rc   r
    r   r   Zsignalsr   Z
__unittestrF   rH   r   r   r   objectr    mainr   r   r   r   <module>   s   	 ]