
    Rh.                         d Z ddl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	Zd
 Zd Zd Z G d de      ZeZy)zUnittest main program    N   )loaderrunner)installHandlerT   a  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                 ,   t         j                  j                  |       r| j                         j	                  d      rt         j                  j                  |       rtt         j                  j                  | t        j                               }t         j                  j                  |      s|j                  t         j                        r| S |} t         j                  j                  |       d d j                  dd      j                  dd      S | S )Nz.py\./)ospathisfilelowerendswithisabsrelpathgetcwd
startswithpardirnormpathreplace)namerel_paths     $/usr/lib/python3.12/unittest/main.py_convert_namer      s    
 
ww~~d

 5 5e <77==wwtRYY[9Hww}}X&(*=*=bii*HD ww%cr*224=EEc3OOK    c                 >    | D cg c]  }t        |       c}S c c}w N)r   )namesr   s     r   _convert_namesr!   /   s    ,12DM$222s   c                     d| vrd| z  } | S )N*z*%s* )patterns    r   _convert_select_patternr&   3   s    '>7"Nr   c                       e Zd ZdZdZdZdxZxZxZxZ	xZ
ZdZddddej                  ddddddfddddZdd	Zd
 Zd ZddZd Zd Zd Zd ZddZd Zy)TestProgramzA command-line program that runs a set of tests; this is primarily
       for making test modules conveniently executable.
    Nr   __main__TF)	tb_locals	durationsc                >   t        |t              rEt        |      | _        |j	                  d      dd  D ]  }t        | j                  |      | _         n|| _        |t        j                  }|| _        || _	        |	| _
        || _        |
| _        || _        || _        |t        j                  sd| _        n|| _        || _        || _        || _        t(        j*                  j-                  |d         | _        | j1                  |       | j3                          y )Nr   r   defaultr   )
isinstancestr
__import__modulesplitgetattrsysargvexitfailfast
catchbreak	verbositybufferr*   r+   warnoptionswarningsdefaultTest
testRunner
testLoaderr   r   basenameprogName	parseArgsrunTests)selfr1   r=   r5   r>   r?   r6   r9   r7   r8   r:   r<   r*   r+   parts                  r   __init__zTestProgram.__init__C   s    
 fc"$V,DKS)!"- 9%dkk489 !DK<88D	 $"""COO &DM %DM&$$((a1tr   c                     t        j                  dt               |rt        |       | j                  | j                          | j                          t        j                  d       y )NzHTestProgram.usageExit() is deprecated and will be removed in Python 3.13   )	r<   warnDeprecationWarningprint_discovery_parser_initArgParsers_print_helpr4   r6   )rD   msgs     r   	usageExitzTestProgram.usageExitk   sP     01C	E#J!!)  "r   c                 V   | j                   \t        | j                  j                                t        t        d| j
                  iz         | j                  j                          y t        | j                  j                                t        t        d| j
                  iz         y )Nprog)	r1   rK   _main_parserformat_helpMAIN_EXAMPLESrA   rL   
print_helpMODULE_EXAMPLES)rD   argskwargss      r   rN   zTestProgram._print_helpu   sx    ;;$##//12-64=="99:""--/$##//12/VT]]$;;<r   c                    | j                          | j                  vt        |      dkD  r+|d   j                         dk(  r| j	                  |dd         y | j
                  j                  |dd  |        | j                  s1| j	                  g        y | j
                  j                  |dd  |        | j                  r+t        | j                        | _	        t        dk(  rcd | _        n[| j                  d | _	        nGt        | j                  t              r| j                  f| _	        nt        | j                        | _	        | j                          y )Nr   discoverrH   r)   )rM   r1   lenr   _do_discoveryrS   
parse_argstestsr!   	testNames__name__r=   r.   r/   listcreateTests)rD   r5   s     r   rB   zTestProgram.parseArgs~   s   ;;4y1}aJ!>""48,((ab48:: ""2&((ab48::+DJJ7DN:%"%!DN((#."..0DN!$"2"23DNr   c                    | j                   r| j                   | j                  _         |rM|| j                  n |       } |j                  | j                  | j                  | j
                        | _        y | j                  +| j                  j                  | j                        | _        y | j                  j                  | j                  | j                        | _        y r   )testNamePatternsr?   r[   startr%   toptestr`   loadTestsFromModuler1   loadTestsFromNames)rD   from_discoveryLoaderr   s       r   rc   zTestProgram.createTests   s      /3/D/DDOO,(.T__FHF'

DLL$((KDI^^#;;DKKHDI::4>>;?;;HDIr   c                 |    | j                         }| j                  |      | _        | j                  |      | _        y r   )_getParentArgParser_getMainArgParserrS   _getDiscoveryArgParserrL   )rD   parent_parsers     r   rM   zTestProgram._initArgParsers   s6    002 22=A!%!<!<]!Kr   c                 >   t        j                  d      }|j                  dddddd	       |j                  d
ddddd	       |j                  dddd       |j                  ddt        d dd       | j                  |j                  ddddd       d| _        | j
                  |j                  ddddd       d| _        | j                  |j                  d d!d"dd#       d| _        | j                  !|j                  d$d%d&t        d'(       g | _        |S ))NF)add_helpz-vz	--verboser9   store_constrH   zVerbose output)destactionconsthelpz-qz--quietr   zQuiet outputz--localsr*   
store_truez"Show local variables in tracebacks)ru   rv   rx   z--durationsr+   Nz+Show the N slowest test cases (N=0 for all))ru   typer-   metavarrx   z-fz
--failfastr7   zStop on first fail or errorz-cz--catchr8   z'Catch Ctrl-C and display results so farz-bz--bufferr:   z%Buffer stdout and stderr during testsz-kre   appendz.Only run tests which match the given substring)ru   rv   r{   rx   )	argparseArgumentParseradd_argumentintr7   r8   r:   re   r&   )rD   parsers     r   rn   zTestProgram._getParentArgParser   sr   ((%8D+K#0!1 	 	3 	D)+#0!/ 	 	1 	J[#/!E 	 	G 	M#$(#!N 	 	P == l'3%B   D "DM??"il'3%N   P $DO;;jx'3%L   N  DK  (+='/6M%U   W %'D!r   c                     t        j                  |g      }| j                  |_        | j                  |_        |j                  ddd       |S )Nparentsr_   r#   z?a list of any number of test modules, classes and test methods.)nargsrx   )r~   r   rA   rR   rN   rV   r   )rD   parentr   s      r   ro   zTestProgram._getMainArgParser   sP    ((&:mm ,,G3"8 	 	9 r   c                 X   t        j                  |g      }d| j                  z  |_        d|_        |j                  dddd       |j                  d	d
dd       |j                  dddd       dD ]3  }|j                  |dt         j                  t         j                         5 |S )Nr   z%s discoverzcFor test discovery all test modules must be importable from the top level directory of the project.z-sz--start-directoryrf   z*Directory to start discovery ('.' default))ru   rx   z-pz	--patternr%   z+Pattern to match tests ('test*.py' default)z-tz--top-level-directoryrg   z<Top level directory of project (defaults to start directory))rf   r%   rg   ?)r   r-   rx   )r~   r   rA   rR   epilogr   SUPPRESS)rD   r   r   args       r   rp   z"TestProgram._getDiscoveryArgParser   s    ((&:#dmm3$ 	D"5G!M 	 	OD+I!N 	 	PD"9"4 	 	5 / 	8C3(0(9(9%-%6%6   8	8
 r   c                     d| _         d| _        d | _        |8| j                  | j	                          | j                  j                  ||        | j                  d|       y )Nr   ztest*.pyT)rk   rl   )rf   r%   rg   rL   rM   r^   rc   )rD   r5   rl   s      r   r]   zTestProgram._do_discovery   s^    
!%%-$$&""--dD9V<r   c                    | j                   r
t                | j                  t        j                  | _        t        | j                  t              rV	 	 | j                  | j                  | j                  | j                  | j                  | j                  | j                        }n| j                  }|j                  | j                        | _        | j"                  r| j                   j$                  dk(  r<t'        | j                   j(                        dk(  rt+        j"                  t,               y | j                   j/                         rt+        j"                  d       y t+        j"                  d       y y # t        $ rA | j                  | j                  | j                  | j                  | j                        }Y w xY w# t        $ r | j                         }Y 1w xY w)N)r9   r7   r:   r<   r*   r+   )r9   r7   r:   r<   r   r   )r8   r   r>   r   TextTestRunnerr.   r{   r9   r7   r:   r<   r*   r+   	TypeErrorrunrh   resultr6   testsRunr\   skippedr4   _NO_TESTS_EXITCODEwasSuccessful)rD   r>   s     r   rC   zTestProgram.runTests   sa   ????"$33DOdoot,/I!%4>>:>--8<:>--;?>>;?>> "1 "KJ" J nnTYY/99{{##q(S1D1D-E-J+,**,  ! I!%4>>:>--8<:>-- "1 "IJI  /!__.
/s,   AE< <AGG	 GG	 	G&%G&r   )FN)ra   
__module____qualname____doc__r1   r9   r7   r8   r:   rA   r<   re   rL   r   defaultTestLoaderrF   rP   rN   rB   rc   rM   rn   ro   rp   r]   rC   r$   r   r   r(   r(   9   s     FINRRHRzRFRXR;K(d#0H0HTd$& >C"	&P=:
HL
$L	*=!r   r(   )r   r4   r~   r   r<    r   r   signalsr   
__unittestr   rU   rW   r   r!   r&   objectr(   mainr$   r   r   <module>r      sX     
  	   #
  3g& gT r   