B -_+@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 cCsxtj|rt|drttj|rXtj|t}tj|sP|tj rT|S|}|dd dd ddS|S)Nz.py\./) ospathisfilelowerendswithisabsrelpathgetcwd startswithpardirreplace)nameZrel_pathr#/usr/lib/python3.7/unittest/main.py _convert_names rcCsdd|DS)NcSsg|] }t|qSr)r).0rrrr .sz"_convert_names..r)namesrrr_convert_names-srcCsd|krd|}|S)N*z*%s*r)patternrrr_convert_select_pattern1src @seZdZdZdZdZdZZZZ Z Z dZ dddde jddddddf dddd Zdd d Zd d ZddZdddZddZddZddZddZd ddZddZdS)! 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|tr@t||_x0|dddD]} t|j| |_q(Wn||_|dkrTtj}||_||_ | |_ ||_ | |_ | |_ | dkrtjsd|_n| |_||_||_||_tj|d|_|||dS)Nrrdefaultr) isinstancestr __import__modulesplitgetattrsysargvexitfailfast catchbreak verbositybufferr" warnoptionswarnings defaultTest testRunner testLoaderr r basenameprogName parseArgsrunTests)selfr'r3r+r4r5r,r/r-r.r0r2r"partrrr__init__As,   zTestProgram.__init__cCs4|r t||jdkr||tddS)N)print_discovery_parser_initArgParsers _print_helpr*r,)r:msgrrr usageExitgs  zTestProgram.usageExitcOsZ|jdkr6t|jttd|ji|jn t|jttd|jidS)Nprog) r'r> _main_parserZ format_help MAIN_EXAMPLESr7r? print_helpMODULE_EXAMPLES)r:argskwargsrrrrAos   zTestProgram._print_helpcCs||jdkrpt|dkrD|ddkrD||dddS|j|dd||js|gdSn|j|dd||jrt|j|_ t dkrd|_n6|j dkrd|_ n$t |j t r|j f|_ n t|j |_ |dS)Nrdiscoverr=r!)r@r'lenr _do_discoveryrE parse_argstestsr testNames__name__r3r$r%list createTests)r:r+rrrr8xs(       zTestProgram.parseArgscCst|jr|j|j_|r@|dkr"|jn|}||j|j|j|_n0|jdkr\|j|j |_n|j |j|j |_dS)N) testNamePatternsr5rKstartrtoptestrPZloadTestsFromModuler'ZloadTestsFromNames)r:from_discoveryLoaderrrrrrSs   zTestProgram.createTestscCs$|}|||_|||_dS)N)_getParentArgParser_getMainArgParserrE_getDiscoveryArgParserr?)r:Z parent_parserrrrr@s zTestProgram._initArgParserscCstjdd}|jddddddd |jd d ddd d d |jddddd|jdkrn|jddddddd|_|jdkr|jddddddd|_|jdkr|jddddddd|_|jdkr|jdd d!td"d#g|_|S)$NF)Zadd_helpz-vz --verboser/Z store_constr=zVerbose output)destactionZconsthelpz-qz--quietrz Quiet outputz--localsr" store_truez"Show local variables in tracebacks)r]r^r_z-fz --failfastr-zStop on first fail or errorz-cz--catchr.z'Catch Ctrl-C and display results so farz-bz--bufferr0z%Buffer stdout and stderr during testsz-krTappendz.Only run tests which match the given substring)r]r^typer_)argparseArgumentParser add_argumentr-r.r0rTr)r:parserrrrrZs>          zTestProgram._getParentArgParsercCs2tj|gd}|j|_|j|_|jdddd|S)N)parentsrOrz?a list of any number of test modules, classes and test methods.)nargsr_)rcrdr7rDrArGre)r:parentrfrrrr[s zTestProgram._getMainArgParsercCs~tj|gd}d|j|_d|_|jddddd|jd d d d d|jd ddddx"dD]}|j|dtjtjdq\W|S)N)rgz %s discoverzcFor test discovery all test modules must be importable from the top level directory of the project.z-sz--start-directoryrUz*Directory to start discovery ('.' default))r]r_z-pz --patternrz+Pattern to match tests ('test*.py' default)z-tz--top-level-directoryrVzs  ]