
    F\hp-                     x    S r SSKrSSKrSSKrSSKJrJr  SSKJr  Sr	Sr
SrS	rS
 rS rS r " S S\5      r\rg)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                 b   [         R                  R                  U 5      (       Ga	  U R                  5       R	                  S5      (       a  [         R                  R                  U 5      (       a  [         R                  R                  U [         R                  " 5       5      n[         R                  R                  U5      (       d$  UR                  [         R                  5      (       a  U $ Un [         R                  R                  U 5      S S R                  SS5      R                  SS5      $ U $ )Nz.py\./)ospathisfilelowerendswithisabsrelpathgetcwd
startswithpardirnormpathreplace)namerel_paths     $/usr/lib/python3.13/unittest/main.py_convert_namer      s    
 
ww~~d

 5 5e < <77==wwtRYY[9Hww}}X&&(*=*=bii*H*HD ww%cr*224=EEc3OOK    c                 D    U  Vs/ s H  n[        U5      PM     sn$ s  snf N)r   )namesr   s     r   _convert_namesr!   .   s    ,12EDM$E222s   c                     SU ;  a  SU -  n U $ )N*z*%s* )patterns    r   _convert_select_patternr&   2   s    '>7"Nr   c                       \ rS rSrSrSrSrS=r=r=r	=r
=rrSrSSSS\R                  SSSSSS4SSS.S	 jjrS
 rS rSS jrS rS rS rS rSS jrS rSrg)TestProgram8   ztA command-line program that runs a set of tests; this is primarily
for making test modules conveniently executable.
Nr   __main__TF)	tb_locals	durationsc                B   [        U[        5      (       aG  [        U5      U l        UR	                  S5      SS   H  n[        U R                  U5      U l        M      OXl        Uc  [        R                  nX`l        Xl	        Xl
        Xpl        Xl        Xl        Xl        Uc  [        R                  (       d  SU l        OXl        X l        X@l        XPl        [(        R*                  R-                  US   5      U l        U R1                  U5        U R3                  5         g )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)selfr2   r>   r6   r?   r@   r7   r:   r8   r9   r;   r=   r+   r,   parts                  r   __init__TestProgram.__init__B   s    
 fc""$V,DKS)!"-%dkk48 . !K<88D	 $"""COO &DM %M&$$((a1tr   c                 X   U R                   c\  [        U R                  R                  5       5        [        [        SU R
                  0-  5        U R                  R                  5         g [        U R                  R                  5       5        [        [        SU R
                  0-  5        g )Nprog)	r2   print_main_parserformat_helpMAIN_EXAMPLESrB   _discovery_parser
print_helpMODULE_EXAMPLES)rE   argskwargss      r   _print_helpTestProgram._print_helpj   sx    ;;$##//12-64=="99:""--/$##//12/VT]]$;;<r   c                    U R                  5         U R                  c~  [        U5      S:  a,  US   R                  5       S:X  a  U R	                  USS  5        g U R
                  R                  USS  U 5        U R                  (       d  U R	                  / 5        g OU R
                  R                  USS  U 5        U R                  (       a,  [        U R                  5      U l	        [        S:X  a  S U l        OaU R                  c  S U l	        OL[        U R                  [        5      (       a  U R                  4U l	        O[        U R                  5      U l	        U R                  5         g )Nr   discover   r*   )_initArgParsersr2   lenr   _do_discoveryrL   
parse_argstestsr!   	testNames__name__r>   r/   r0   listcreateTests)rE   r6   s     r   rC   TestProgram.parseArgss   s   ;;4y1}aJ!>""48,((ab48:: ""2&	  ((ab48::+DJJ7DN:%"%!DN((#.."..0DN!$"2"23DNr   c                    U R                   (       a  U R                   U R                  l         U(       aN  Uc  U R                  OU" 5       nUR                  " U R                  U R                  U R
                  5      U l        g U R                  c+  U R                  R                  U R                  5      U l        g U R                  R                  U R                  U R                  5      U l        g r   )testNamePatternsr@   rW   startr%   toptestr^   loadTestsFromModuler2   loadTestsFromNames)rE   from_discoveryLoaderr   s       r   ra   TestProgram.createTests   s      /3/D/DDOO,(.T__FHF

DLL$((KDI^^#;;DKKHDI::4>>;?;;HDIr   c                 |    U R                  5       nU R                  U5      U l        U R                  U5      U l        g r   )_getParentArgParser_getMainArgParserrL   _getDiscoveryArgParserrO   )rE   parent_parsers     r   rY   TestProgram._initArgParsers   s6    002 22=A!%!<!<]!Kr   c           	         [         R                  " SS9nUR                  SSSSSSS	9  UR                  S
SSSSSS	9  UR                  SSSSS9  UR                  SS[        S SSS9  U R                  c  UR                  SSSSSS9  SU l        U R
                  c  UR                  SSSSSS9  SU l        U R                  c  UR                  S S!S"SS#S9  SU l        U R                  c  UR                  S$S%S&[        S'S(9  / U l        U$ ))NF)add_helpz-vz	--verboser:   store_constrX   zVerbose output)destactionconsthelpz-qz--quietr   zQuiet outputz--localsr+   
store_truez"Show local variables in tracebacks)rv   rw   ry   z--durationsr,   Nz+Show the N slowest test cases (N=0 for all))rv   typer.   metavarry   z-fz
--failfastr8   zStop on first fail or errorz-cz--catchr9   z'Catch Ctrl-C and display results so farz-bz--bufferr;   z%Buffer stdout and stderr during testsz-krd   appendz.Only run tests which match the given substring)rv   rw   r|   ry   )	argparseArgumentParseradd_argumentintr8   r9   r;   rd   r&   )rE   parsers     r   rn   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                     [         R                  " U/S9nU R                  Ul        U R                  Ul        UR                  SSSS9  U$ )Nparentsr]   r#   z?a list of any number of test modules, classes and test methods.)nargsry   )r   r   rB   rJ   rT   rP   r   )rE   parentr   s      r   ro   TestProgram._getMainArgParser   sP    ((&:mm ,,G3"8 	 	9 r   c                 @   [         R                  " U/S9nSU R                  -  Ul        SUl        UR                  SSSSS9  UR                  S	S
SSS9  UR                  SSSSS9  S H1  nUR                  US[         R                  [         R                  S9  M3     U$ )Nr   z%s discoverzcFor test discovery all test modules must be importable from the top level directory of the project.z-sz--start-directoryre   z*Directory to start discovery ('.' default))rv   ry   z-pz	--patternr%   z+Pattern to match tests ('test*.py' default)z-tz--top-level-directoryrf   z<Top level directory of project (defaults to start directory))re   r%   rf   ?)r   r.   ry   )r   r   rB   rJ   epilogr   SUPPRESS)rE   r   r   args       r   rp   "TestProgram._getDiscoveryArgParser   s    ((&:#dmm3$ 	D"5G!M 	 	OD+I!N 	 	PD"9"4 	 	5 /C3(0(9(9%-%6%6   8 /
 r   c                     SU l         SU l        S U l        Ub8  U R                  c  U R	                  5         U R                  R                  X5        U R                  SUS9  g )Nr   ztest*.pyT)rj   rk   )re   r%   rf   rO   rY   r\   ra   )rE   r6   rk   s      r   r[   TestProgram._do_discovery   s\    
!%%-$$&""--d9V<r   c           	         U R                   (       a
  [        5         U R                  c  [        R                  U l        [        U R                  [        5      (       aS    U R                  U R                  U R                  U R                  U R                  U R                  U R                  S9nOU R                  nUR                  U R                  5      U l        U R"                  (       a  U R                   R$                  S:X  a>  ['        U R                   R(                  5      S:X  a  [*        R"                  " [,        5        g U R                   R/                  5       (       a  [*        R"                  " S5        g [*        R"                  " S5        g g ! [         a>    U R                  U R                  U R                  U R                  U R                  S9n GNf = f! [         a    U R                  5       n GN?f = f)N)r:   r8   r;   r=   r+   r,   )r:   r8   r;   r=   r   r   )r9   r   r?   r   TextTestRunnerr/   r|   r:   r8   r;   r=   r+   r,   	TypeErrorrunrg   resultr7   testsRunrZ   skippedr5   _NO_TESTS_EXITCODEwasSuccessful)rE   r?   s     r   rD   TestProgram.runTests   sf   ????"$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F AGG GG G<;G<)rO   rL   r;   r9   r>   r,   r7   r8   r2   r%   rB   r   re   r+   rg   r@   rd   r^   r?   rf   r:   r=   )FNr   )r_   
__module____qualname____firstlineno____doc__r2   r:   r8   r9   r;   rB   r=   rd   rO   r   defaultTestLoaderrG   rT   rC   ra   rY   rn   ro   rp   r[   rD   __static_attributes__r$   r   r   r(   r(   8   s     FINRRHRzRFRXR;K(d#0H0HTd$& >C"	&P=:
HL
$L	*=!r   r(   )r   r5   r   r    r   r   signalsr   
__unittestr   rN   rQ   r   r!   r&   objectr(   mainr$   r   r   <module>r      sU     
  	  #
  3]& ]@ r   