o
    éT•jø+  ã                   @   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    	 ]