o w[e+@stdZddlZddlZddlZddlmZmZddlmZdZ dZ dZ d d Z d d Z d dZGdddeZeZdS)zUnittest main programN)loaderrunner)installHandlerTaExamples: %(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 aFExamples: %(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 cCstj|r>|dr>tj|r,tj|t}tj|s(|tj r*|S|}tj |dd dd ddS|S)Nz.py\./) ospathisfilelowerendswithisabsrelpathgetcwd startswithpardirnormpathreplace)namerel_pathr$/usr/lib/python3.10/unittest/main.py _convert_names $rcCsdd|DS)NcSsg|]}t|qSr)r).0rrrr .sz"_convert_names..r)namesrrr_convert_names-srcCsd|vrd|}|S)N*z*%s*r)patternrrr_convert_select_pattern1sr!c @seZdZdZdZdZdZZZZ Z Z dZ dddde jddddddf dddd Zdd d Zd d ZddZdddZddZddZddZddZdddZddZdS) TestProgramzA command-line program that runs a set of tests; this is primarily for making test modules conveniently executable. Nr__main__TF) tb_localsc Cst|trt||_|dddD] } t|j| |_qn||_|dur(tj}||_||_ | |_ ||_ | |_ | |_ | durEtjsEd|_n| |_||_||_||_tj|d|_|||dS)Nrrdefaultr) isinstancestr __import__modulesplitgetattrsysargvexitfailfast catchbreak verbositybufferr$ warnoptionswarnings defaultTest testRunner testLoaderr r basenameprogName parseArgsrunTests)selfr)r5r-r6r7r.r1r/r0r2r4r$partrrr__init__As.    zTestProgram.__init__cCs4|rt||jdur||tddS)N)print_discovery_parser_initArgParsers _print_helpr,r.)r<msgrrr usageExitgs  zTestProgram.usageExitcOs\|jdurt|jttd|ji|jdSt|jttd|jidS)Nprog) r)r@ _main_parser format_help MAIN_EXAMPLESr9rA print_helpMODULE_EXAMPLES)r<argskwargsrrrrCos zTestProgram._print_helpcCs||jdur8t|dkr"|ddkr"||dddS|j|dd||js7|gdSn |j|dd||jrTt|j|_ t dkrSd|_n|j dur]d|_ nt |j t ri|j f|_ nt|j |_ |dS)Nrdiscoverr?r#)rBr)lenr _do_discoveryrG parse_argstestsr testNames__name__r5r&r'list createTests)r<r-rrrr:xs,        zTestProgram.parseArgscCsx|jr|j|j_|r!|dur|jn|}||j|j|j|_dS|jdur0|j|j |_dS|j |j|j |_dSN) testNamePatternsr7rNstartr toptestrSloadTestsFromModuler)loadTestsFromNames)r<from_discoveryLoaderrrrrrVs    zTestProgram.createTestscCs$|}|||_|||_dSrW)_getParentArgParser_getMainArgParserrG_getDiscoveryArgParserrA)r< parent_parserrrrrBs zTestProgram._initArgParserscCstjdd}|jddddddd |jd d ddd d d |jddddd|jdur7|jddddddd|_|jdurI|jddddddd|_|jdur[|jddddddd|_|jdurm|jdd d!td"d#g|_|S)$NF)add_helpz-vz --verboser1 store_constr?zVerbose output)destactionconsthelpz-qz--quietrz Quiet outputz--localsr$ store_truez"Show local variables in tracebacks)rfrgriz-fz --failfastr/zStop on first fail or errorz-cz--catchr0z'Catch Ctrl-C and display results so farz-bz--bufferr2z%Buffer stdout and stderr during testsz-krXappendz.Only run tests which match the given substring)rfrgtyperi)argparseArgumentParser add_argumentr/r0r2rXr!)r<parserrrrr`sL          zTestProgram._getParentArgParsercCs2tj|gd}|j|_|j|_|jdddd|S)NparentsrRrz?a list of any number of test modules, classes and test methods.)nargsri)rmrnr9rFrCrJro)r<parentrprrrraszTestProgram._getMainArgParsercCsztj|gd}d|j|_d|_|jddddd|jd d d d d|jd dddddD] }|j|dtjtjdq-|S)Nrqz %s discoverzcFor test discovery all test modules must be importable from the top level directory of the project.z-sz--start-directoryrYz*Directory to start discovery ('.' default))rfriz-pz --patternr z+Pattern to match tests ('test*.py' default)z-tz--top-level-directoryrZzrErCr:rVrBr`rarbrPr;rrrrr"7s. &  #  r")rr,rmr rrsignalsr __unittestrIrKrrr!objectr"mainrrrrs  ]