o
    f+                     @   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   s   t j| r>|  dr>t j| r,t j| t  }t j|s(|t j	r*| S |} t j
| d d ddddS | S )Nz.py\./)ospathisfilelowerendswithisabsrelpathgetcwd
startswithpardirnormpathreplace)namerel_path r   $/usr/lib/python3.10/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| v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 u r(tj}|| _|| _	|	| _
|| _|
| _|| _|d u rEtjsEd| _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)   r5   r-   r6   r7   r.   r1   r/   r0   r2   r4   r$   partr   r   r   __init__A   s.   


zTestProgram.__init__c                 C   s4   |rt | | jd u r|   |   td d S )N   )print_discovery_parser_initArgParsers_print_helpr,   r.   )r<   msgr   r   r   	usageExitg   s   
zTestProgram.usageExitc                 O   s\   | j d u rt| j  ttd| ji  | j  d S t| j  ttd| ji  d S )Nprog)	r)   r@   _main_parserformat_helpMAIN_EXAMPLESr9   rA   
print_helpMODULE_EXAMPLES)r<   argskwargsr   r   r   rC   o   s   
zTestProgram._print_helpc                 C   s   |    | jd u r8t|dkr"|d  dkr"| |dd   d S | j|dd  |  | js7| g  d S n| j|dd  |  | jrTt| j| _	t
dkrSd | _n| jd u r]d | _	nt| jtri| jf| _	nt| j| _	|   d S )Nr   discoverr?   r#   )rB   r)   lenr   _do_discoveryrG   
parse_argstestsr   	testNames__name__r5   r&   r'   listcreateTests)r<   r-   r   r   r   r:   x   s,   


zTestProgram.parseArgsc                 C   sx   | j r| j | j_ |r!|d u r| jn| }|| j| j| j| _d S | jd u r0| j| j	| _d S | j
| j| j	| _d S N)testNamePatternsr7   rN   startr    toptestrS   loadTestsFromModuler)   loadTestsFromNames)r<   from_discoveryLoaderr   r   r   r   rV      s   



zTestProgram.createTestsc                 C   s$   |   }| || _| || _d S rW   )_getParentArgParser_getMainArgParserrG   _getDiscoveryArgParserrA   )r<   parent_parserr   r   r   rB      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 u r7|jdddddd d| _| jd u rI|jdddddd d| _| jd u r[|jdddddd d| _| jd u rm|jdd d!td"d# g | _|S )$NF)add_helpz-vz	--verboser1   store_constr?   zVerbose output)destactionconsthelpz-qz--quietr   zQuiet outputz--localsr$   
store_truez"Show local variables in tracebacks)rf   rg   ri   z-fz
--failfastr/   zStop on first fail or errorz-cz--catchr0   z'Catch Ctrl-C and display results so farz-bz--bufferr2   z%Buffer stdout and stderr during testsz-krX   appendz.Only run tests which match the given substring)rf   rg   typeri   )argparseArgumentParseradd_argumentr/   r0   r2   rX   r!   )r<   parserr   r   r   r`      sL   








zTestProgram._getParentArgParserc                 C   s2   t j|gd}| j|_| j|_|jdddd |S )NparentsrR   r   z?a list of any number of test modules, classes and test methods.)nargsri   )rm   rn   r9   rF   rC   rJ   ro   )r<   parentrp   r   r   r   ra      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 q-|S )Nrq   z%s discoverzcFor test discovery all test modules must be importable from the top level directory of the project.z-sz--start-directoryrY   z*Directory to start discovery ('.' default))rf   ri   z-pz	--patternr    z+Pattern to match tests ('test*.py' default)z-tz--top-level-directoryrZ   z<Top level directory of project (defaults to start directory))rY   r    rZ   ?)rs   r%   ri   )rm   rn   r9   rF   epilogro   SUPPRESS)r<   rt   rp   argr   r   r   rb      s$   


z"TestProgram._getDiscoveryArgParserc                 C   sL   d| _ d| _d | _|d ur| jd u r|   | j||  | jd|d d S )Nr   ztest*.pyT)r^   r_   )rY   r    rZ   rA   rB   rQ   rV   )r<   r-   r_   r   r   r   rP      s   
zTestProgram._do_discoveryc              	   C   s   | j rt  | jd u rtj| _t| jtrMz*z| j| j| j| j	| j
| jd}W n ty=   | j| j| j| j	| j
d}Y nw W n tyL   |  }Y nw | j}|| j| _| jret| j   d S d S )N)r1   r/   r2   r4   r$   )r1   r/   r2   r4   )r0   r   r6   r   TextTestRunnerr&   rl   r1   r/   r2   r4   r$   	TypeErrorrunr[   resultr.   r,   wasSuccessful)r<   r6   r   r   r   r;      s:   


zTestProgram.runTestsrW   )FN)rT   
__module____qualname____doc__r)   r1   r/   r0   r2   r9   r4   rX   rA   r   defaultTestLoaderr>   rE   rC   r:   rV   rB   r`   ra   rb   rP   r;   r   r   r   r   r"   7   s.    
&	
#
r"   )r   r,   rm   r
    r   r   signalsr   
__unittestrI   rK   r   r   r!   objectr"   mainr   r   r   r   <module>   s    	 ]