$Yf#@skddlZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl m Z ddl mZmZmZmZmZdZeZdZGdddeZGd d d eZGd d d eZGd ddeZddZddZddZddZddZ ddZ!GdddZ"ddZ#dd Z$Gd!d"d"e"Z%Gd#d$d$e%Z&Gd%d&d&e%Z'ej(d'd(d)gZ)Gd*d+d+ej*Z+Gd,d-d-e"Z,Gd.d/d/eZ-Gd0d1d1e-Z.Gd2d3d3e-Z/dS)4N)result)strclass safe_repr_count_diff_all_purpose_count_diff_hashable_common_shorten_reprTz@ Diff is %s characters long. Set self.maxDiff to None to see it.c@seZdZdS)SkipTestN)__name__ __module__ __qualname__r r )/opt/alt/python35/lib64/python3.5/case.pyr s r c@seZdZdS) _ShouldStopN)r r r r r r rr"s rc@seZdZdS)_UnexpectedSuccessN)r r r r r r rr's rc@s7eZdZdddZejdddZdS)_OutcomeNcCsLd|_||_t|d|_d|_g|_d|_g|_dS)NF addSubTestT)expecting_failurerhasattrresult_supports_subtestssuccessskippedexpectedFailureerrors)selfrr r r__init__.s     z_Outcome.__init__Fccs |j}d|_zy dVWntk r5Yntk r~}z*d|_|jj|t|fWYdd}~Xntk rYnvtj}|j r||_ nd|_|j j||fd}Yn)X|j r|jr|j j|dfWd|jo||_XdS)NTF) rKeyboardInterruptr rappendstrrsysexc_inforrrr)r test_caseisTestZ old_successer r r rtestPartExecutor7s*     .      z_Outcome.testPartExecutor)r r r r contextlibcontextmanagerr$r r r rr-s  rcCs|S)Nr )objr r r_idUsr(csfdd}|S)NcsLt|ts6tj|fdd}|}d|_|_|S)NcstdS)N)r )argskwargs)reasonr r skip_wrapper^sz-skip..decorator..skip_wrapperT) isinstancetype functoolswraps__unittest_skip____unittest_skip_why__) test_itemr,)r+r r decorator\s !  zskip..decoratorr )r+r4r )r+rskipXs r5cCs|rt|StS)N)r5r() conditionr+r r rskipIfhs r7cCs|st|StS)N)r5r()r6r+r r r skipUnlessps r8cCs d|_|S)NT)__unittest_expecting_failure__)r3r r rrxs rcsHt|tr,tfdd|DSt|toGt|S)Nc3s|]}t|VqdS)N) _is_subtype).0r#)basetyper r ~sz_is_subtype..)r-tupleallr. issubclass)expectedr<r )r<rr:|sr:c@s(eZdZddZddZdS)_BaseTestCaseContextcCs ||_dS)N)r!)rr!r r rrsz_BaseTestCaseContext.__init__cCs.|jj|j|}|jj|dS)N)r!_formatMessagemsgfailureException)r standardMsgrDr r r _raiseFailuresz"_BaseTestCaseContext._raiseFailureN)r r r rrGr r r rrBs  rBcCs!dtjkrt|StSdS)NWITHIN_PYTHON_RPM_BUILD)osenvironr5r()r+r r r_skipInRpmBuilds rKcs%tjfdd}|S)Nc sadtjkrPy||Wn$tk rFttjYnXtn ||dS)NrH)rIrJ ExceptionZ_ExpectedFailurerr r)r)r*)funcr rwrappers  z+_expectedFailureInRpmBuild..wrapper)r/r0)rMrNr )rMr_expectedFailureInRpmBuilds! rOc@s+eZdZdddZddZdS)_AssertRaisesBaseContextNcCs\tj||||_||_|dk r=tj|}||_d|_d|_dS)N) rBrrAr!recompileexpected_regexobj_namerD)rrAr!rSr r rrs     z!_AssertRaisesBaseContext.__init__cCszt|j|js1td||jf|r`|ddkr`tjdtdf}|s|jdd|_ |rtjdt t |td|S|^}}y|j |_ Wn!tk rt||_ YnX||||WdQRXWdd}XdS)Nz%s() arg 1 must be %srzcallable is NonerDz3%r is an invalid keyword argument for this function)r:rA _base_type TypeError_base_type_strwarningswarnDeprecationWarningpoprDnextiterr rTAttributeErrorr)rnamer)r*Z callable_objr r rhandles.      z_AssertRaisesBaseContext.handle)r r r rrar r r rrPs  rPc@s4eZdZeZdZddZddZdS)_AssertRaisesContextz-an exception type or tuple of exception typescCs|S)Nr )rr r r __enter__sz_AssertRaisesContext.__enter__c Cs |dkry|jj}Wn!tk r?t|j}YnX|jrh|jdj||jq|jdj|n tj|t ||jsdS|j d|_ |j dkrdS|j }|j t|s |jdj|jt|dS)Nz{} not raised by {}z {} not raisedFTz"{}" does not match "{}")rAr r_rrTrGformat traceback clear_framesr@with_traceback exceptionrSsearchpattern)rexc_type exc_valuetbexc_namerSr r r__exit__s(      z_AssertRaisesContext.__exit__N)r r r BaseExceptionrVrXrcror r r rrbs  rbc@s4eZdZeZdZddZddZdS)_AssertWarnsContextz(a warning type or tuple of warning typescCssx2tjjD]!}t|ddri|_qWtjdd|_|jj|_tj d|j |S)N__warningregistry__recordTalways) rmodulesvaluesgetattrrrrYcatch_warningswarnings_managerrc simplefilterrA)rvr r rrc s z_AssertWarnsContext.__enter__c Csd|jj||||dk r&dSy|jj}Wn!tk rYt|j}YnXd}x|jD]}|j}t||jsqj|dkr|}|j dk r|j j t| rqj||_ |j |_ |j |_ dSW|dk r"|jdj|j jt||jrJ|jdj||jn|jdj|dS)Nz"{}" does not match "{}"z{} not triggered by {}z{} not triggered)ryrorAr r_rrYmessager-rSriwarningfilenamelinenorGrdrjrT)rrkrlrmrnZfirst_matchingmwr r rros8          z_AssertWarnsContext.__exit__N)r r r WarningrVrXrcror r r rrqs  rq_LoggingWatcherrecordsoutputc@s4eZdZddZddZddZdS)_CapturingHandlercCs&tjj|tgg|_dS)N)loggingHandlerrrwatcher)rr r rrAsz_CapturingHandler.__init__cCsdS)Nr )rr r rflushEsz_CapturingHandler.flushcCs9|jjj||j|}|jjj|dS)N)rrrrdr)rrsrDr r remitHsz_CapturingHandler.emitN)r r r rrrr r r rr<s   rc@s:eZdZdZddZddZddZdS) _AssertLogsContextz"%(levelname)s:%(name)s:%(message)scCsStj||||_|r:tjj|||_n tj|_d|_dS)N) rBr logger_namer _nameToLevelgetlevelINFOrD)rr!rrr r rrTs   z_AssertLogsContext.__init__cCst|jtjr(|j}|_ntj|j}|_tj|j}t}|j ||j |_ |j dd|_ |j |_|j|_|g|_ |j|j d|_|j S)NF)r-rrLoggerlogger getLogger FormatterLOGGING_FORMATr setFormatterrhandlers old_handlersr old_level propagate old_propagatesetLevel)rr formatterhandlerr r rrc]s       z_AssertLogsContext.__enter__cCs|j|j_|j|j_|jj|j|dk rAdSt|jj dkr|j dj t j |j|jjdS)NFrz-no logs of level {} or higher triggered on {})rrrrrrrlenrrrGrdr getLevelNamerr`)rrkrlrmr r rrons z_AssertLogsContext.__exit__N)r r r rrrcror r r rrOs  rc@sGeZdZeZdZdZdZdZddd Z d d Z d d Z ddZ ddZ eddZeddZddZddZddZddZddZd d!Zd"d#Zd$d%Zd&d'Zejed(d)Zd*d+Zd,d-Zd.d/Z d0d1d2Z!d3d4Z"d5d6Z#d7d8Z$d9d:Z%d0d;d<Z&d0d=d>Z'd0d?d@Z(dAdBZ)dCdDZ*dEdFZ+d0d0dGdHZ,dIdJZ-d0dKdLZ.d0dMdNZ/d0dOdPZ0d0d0d0dQdRZ1d0d0d0dSdTZ2d0d0dUdVZ3dWdXZ4d0dYdZZ5d0d[d\Z6d0d]d^Z7d0d_d`Z8d0dadbZ9d0dcddZ:d0dedfZ;d0dgdhZ<d0didjZ=d0dkdlZ>d0dmdnZ?d0dodpZ@d0dqdrZAd0dsdtZBd0dudvZCd0dwdxZDd0dydzZEd0d{d|ZFd0d}d~ZGddZHddZId0ddZJd0ddZKddZLeLe/ZMZNeLe0ZOZPeLe1ZQZReLe2ZSZTeLe(ZUZVeLe*ZWeLe'ZXeLeHZYeLeJZZeLeKZ[d0S)TestCaseTPFrunTestc Cs||_d|_d|_yt||}Wn7tk rg|dkrctd|j|fYn X|j|_g|_d|_ i|_ |j t d|j t d|j td|j td|j td|j tddS) NzNo testrzno such test method in %s: %sassertDictEqualassertListEqualassertTupleEqualassertSetEqualassertMultiLineEqual)_testMethodName_outcome_testMethodDocrwr_ ValueError __class____doc__ _cleanups_subtest_type_equality_funcsaddTypeEqualityFuncdictlistr>set frozensetr)rZ methodName testMethodr r rrs&         zTestCase.__init__cCs||j|)rrr)rr r r__repr__szTestCase.__repr__cCsRt|dd}|dk r.|||n tjdtd|j|dS)NaddSkipz4TestResult has no addSkip method, skips not reportedr)rwrYrZRuntimeWarning addSuccess)rrr!r+rr r r_addSkips    zTestCase._addSkipcks|jjsdVdS|j}|dkr<tj|}n|jj|}t||||_zt|jj|jdd dVWdQRX|jj s|jj }|dk r|j rt n|jj rt Wd||_XdS)Nr"T)rrr collectionsChainMapparams new_child_SubTestr$rrZfailfastrr)rrDrparentZ params_maprr r rsubTests$         zTestCase.subTestcCsx|D]y\}}t|tr;|j|j||q|dk rt|d|jrp|j||q|j||qWdS)Nr)r-rrr!r@rE addFailureZaddError)rrrtestr r r r_feedErrorsToResult=s zTestCase._feedErrorsToResultc CsPy |j}Wn/tk r>tjdt|j|YnX|||dS)Nz@TestResult has no addExpectedFailure method, reporting as passes)addExpectedFailurer_rYrZrr)rrr rr r r_addExpectedFailureGs   zTestCase._addExpectedFailurecCsxy |j}WnZtk ritjdty tdWn(tk rd|j|tjYnXYn X||dS)NzCTestResult has no addUnexpectedSuccess method, reporting as failure) addUnexpectedSuccessr_rYrZrrrrr )rrrr r r_addUnexpectedSuccessQs      zTestCase._addUnexpectedSuccessNc (Cs|}|dkrC|j}t|dd}|dk rC||j|t||j}t|jddst|ddrz>t|jddpt|dd}|j|||Wd|j|XdSt|dd}t|dd}|p |}t|} z'| |_| j ||j WdQRX| j r|| _ | j |dd |WdQRXd| _ | j ||j WdQRX|jx*| jD]\} } |j|| | qW|j|| j| j r:|r-| jr|j|| jq:|j|n |j||SWd|j||dkrt|d d} | dk r| | jjd| _d|_XdS) N startTestRunr1Fr2r9r"T stopTestRun)rrwZ startTestrrrZstopTestrrr$rrrr doCleanupsrrrrrrrclear) rrZ orig_resultrrZskip_whyZexpecting_failure_methodZexpecting_failure_classroutcomerr+rr r rrun`sh                     z TestCase.runc Cse|jpt}xI|jr]|jj\}}}|j||||WdQRXqW|jS)N)rrrr\r$r)rrrr)r*r r rrs  zTestCase.doCleanupscOs|j||S)N)r)rr)kwdsr r r__call__szTestCase.__call__cCsc|jt||j|jx5|jr^|jjd\}}}|||q*WdS)Nr)rrwrrrr\)rrr)r*r r rdebugs    zTestCase.debugcCst|dS)N)r )rr+r r rskipTestszTestCase.skipTestcCs|j|dS)N)rE)rrDr r rfailsz TestCase.failcCs5|r1|j|dt|}|j|dS)Nz%s is not false)rCrrE)rexprrDr r r assertFalseszTestCase.assertFalsecCs5|s1|j|dt|}|j|dS)Nz%s is not true)rCrrE)rrrDr r r assertTrueszTestCase.assertTruec Csh|js|p|S|dkr#|Syd||fSWn,tk rcdt|t|fSYnXdS)Nz%s : %s) longMessageUnicodeDecodeErrorr)rrDrFr r rrCs    zTestCase._formatMessagec Os4t||}z|jd||SWdd}XdS)N assertRaises)rbra)rexpected_exceptionr)r*contextr r rrszTestCase.assertRaisescOs"t||}|jd||S)N assertWarns)rqra)rexpected_warningr)r*rr r rrszTestCase.assertWarnscCst|||S)N)r)rrrr r r assertLogs'szTestCase.assertLogscCset|t|kr^|jjt|}|dk r^t|trZt||}|S|jS)N)r.rrr-rrw_baseAssertEqual)rfirstsecondZasserterr r r_getAssertEqualityFunc=s zTestCase._getAssertEqualityFunccCsD||ks@dt||}|j||}|j|dS)Nz%s != %s)rrCrE)rrrrDrFr r rrWs zTestCase._baseAssertEqualcCs)|j||}|||d|dS)NrD)r)rrrrDZassertion_funcr r r assertEqual^szTestCase.assertEqualcCsG||ksC|j|dt|t|f}|j|dS)Nz%s == %s)rCrrE)rrrrDr r rassertNotEquales zTestCase.assertNotEqualcCs||krdS|dk r4|dk r4td|dk rt|||krZdSdt|t|t|f}nT|dkrd}tt|||dkrdSdt|t||f}|j||}|j|dS)Nz specify delta or places not bothz%s != %s within %s deltarz%s != %s within %r places)rWabsrroundrCrE)rrrplacesrDdeltarFr r rassertAlmostEqualns&         zTestCase.assertAlmostEqualcCs|dk r$|dk r$td|dk r||k rWt|||krWdSdt|t|t|f}na|dkrd}||k rtt|||dkrdSdt|t||f}|j||}|j|dS)Nz specify delta or places not bothz%s == %s within %s deltarrz%s == %s within %r places)rWrrrrCrE)rrrrrDrrFr r rassertNotAlmostEquals"   #   ,   zTestCase.assertNotAlmostEqualc'Cs|dk rt|j}t||sC|jd|t|ft||sz|jd|t|fnd}d}yt|}Wn"ttfk rd|}YnX|dkryt|}Wn"ttfk rd|}YnX|dkr&||krdSd|jft||}xt t ||D]} y|| } Wn0tt tfk r|d| |f7}PYnXy|| } Wn0tt tfk r|d| |f7}PYnX| | krH|d | ft| | 7}PqHW||kr3|dkr3t |t |kr3dS||kr|d |||f7}y"|d |t||f7}Wq&tt tfk r|d ||f7}Yq&Xnx||kr&|d |||f7}y"|d |t||f7}Wn/tt tfk r%|d||f7}YnX|} ddj tjtj|jtj|j} |j| | } |j|| }|j|dS)NzFirst sequence is not a %s: %szSecond sequence is not a %s: %sZsequencez(First %s has no length. Non-sequence?z)Second %s has no length. Non-sequence?z%ss differ: %s != %s z( Unable to index element %d of first %s z) Unable to index element %d of second %s z# First differing element %d: %s %s z+ First %s contains %d additional elements. zFirst extra element %d: %s z'Unable to index element %d of first %s z, Second %s contains %d additional elements. z(Unable to index element %d of second %s r)r r-rErrrWNotImplementedError capitalizerrangemin IndexErrorr.joindifflibndiffpprintpformat splitlines_truncateMessagerCr)rZseq1Zseq2rDseq_typeZ seq_type_nameZ differingZlen1Zlen2iZitem1Zitem2rFdiffMsgr r rassertSequenceEquals              zTestCase.assertSequenceEqualcCsA|j}|dks't||kr/||S|tt|S)N)maxDiffr DIFF_OMITTED)rr|diffZmax_diffr r rrs zTestCase._truncateMessagecCs|j|||dtdS)Nr)rr)rZlist1Zlist2rDr r rrs zTestCase.assertListEqualcCs|j|||dtdS)Nr)rr>)rZtuple1Ztuple2rDr r rr+s zTestCase.assertTupleEqualc Csy|j|}Wnktk rK}z|jd|WYdd}~Xn6tk r}z|jd|WYdd}~XnXy|j|}Wnktk r}z|jd|WYdd}~Xn6tk r}z|jd|WYdd}~XnX|p |sdSg}|rO|jdx!|D]}|jt|q2W|r|jdx!|D]}|jt|qiWdj|} |j|j|| dS)Nz/invalid type when attempting set difference: %sz2first argument does not support set difference: %sz3second argument does not support set difference: %sz*Items in the first set but not the second:z*Items in the second set but not the first:r) differencerWrr_rreprrrC) rZset1Zset2rDZ difference1r#Z difference2linesitemrFr r rr6s2 #$#$     zTestCase.assertSetEqualcCsE||krAdt|t|f}|j|j||dS)Nz%s not found in %s)rrrC)rmember containerrDrFr r rassertInas  zTestCase.assertIncCsE||krAdt|t|f}|j|j||dS)Nz%s unexpectedly found in %s)rrrC)rr r!rDrFr r r assertNotInhs  zTestCase.assertNotIncCsE||k rAdt|t|f}|j|j||dS)Nz %s is not %s)rrrC)rexpr1expr2rDrFr r rassertIsos  zTestCase.assertIscCs<||kr8dt|f}|j|j||dS)Nzunexpectedly identical: %s)rrrC)rr$r%rDrFr r r assertIsNotvs zTestCase.assertIsNotcCs|j|td|j|td||krdt||}ddjtjtj|jtj|j}|j ||}|j |j ||dS)Nz"First argument is not a dictionaryz#Second argument is not a dictionaryz%s != %sr) assertIsInstancerrrrrrrrrrrC)rZd1Zd2rDrFrr r rr|s zTestCase.assertDictEqualc Cstjdtg}g}xv|jD]h\}}||krQ|j|q)|||kr)|jdt|t|t||fq)W|p|sdSd}|rddjdd|D}|r|r|d7}|d dj|7}|j|j||dS) Nz&assertDictContainsSubset is deprecatedz%s, expected: %s, actual: %srz Missing: %s,css|]}t|VqdS)N)r)r;rr r rr=sz4TestCase.assertDictContainsSubset..z; zMismatched values: %s) rYrZr[itemsrrrrrC) rZsubsetZ dictionaryrDmissingZ mismatchedkeyvaluerFr r rassertDictContainsSubsets,     z!TestCase.assertDictContainsSubsetc Cst|t|}}y"tj|}tj|}Wn!tk r^t||}Yn X||krodSt||}|rd}dd|D}dj|} |j|| }|j||}|j |dS)NzElement counts were not equal: cSsg|]}d|qS)z First has %d, Second has %d: %rr )r;rr r r s z-TestCase.assertCountEqual..r) rrCounterrWrrrrrCr) rrrrDZ first_seqZ second_seqZ differencesrFrrr r rassertCountEquals   zTestCase.assertCountEqualcCs5|j|td|j|td||kr1t||jks\t||jkro|j||||jdd}|jdd}t|dkr|jd|kr|dg}|dg}dt||}dd jt j ||}|j ||}|j |j ||dS) NzFirst argument is not a stringzSecond argument is not a stringkeependsTrz rz%s != %sr)r(rr_diffThresholdrrrrrrrrrrC)rrrrDZ firstlinesZ secondlinesrFrr r rrs '  zTestCase.assertMultiLineEqualcCsE||ksAdt|t|f}|j|j||dS)Nz%s not less than %s)rrrC)rabrDrFr r r assertLesss zTestCase.assertLesscCsE||ksAdt|t|f}|j|j||dS)Nz%s not less than or equal to %s)rrrC)rr4r5rDrFr r rassertLessEquals zTestCase.assertLessEqualcCsE||ksAdt|t|f}|j|j||dS)Nz%s not greater than %s)rrrC)rr4r5rDrFr r r assertGreaters zTestCase.assertGreatercCsE||ksAdt|t|f}|j|j||dS)Nz"%s not greater than or equal to %s)rrrC)rr4r5rDrFr r rassertGreaterEquals zTestCase.assertGreaterEqualcCs<|dk r8dt|f}|j|j||dS)Nz%s is not None)rrrC)rr'rDrFr r r assertIsNones zTestCase.assertIsNonecCs/|dkr+d}|j|j||dS)Nzunexpectedly None)rrC)rr'rDrFr r rassertIsNotNones zTestCase.assertIsNotNonecCsBt||s>dt||f}|j|j||dS)Nz%s is not an instance of %r)r-rrrC)rr'rrDrFr r rr(szTestCase.assertIsInstancecCsBt||r>dt||f}|j|j||dS)Nz%s is an instance of %r)r-rrrC)rr'rrDrFr r rassertNotIsInstanceszTestCase.assertNotIsInstancecOs%t|||}|jd||S)NassertRaisesRegex)rbra)rrrSr)r*rr r rr= s zTestCase.assertRaisesRegexcOs%t|||}|jd||S)NassertWarnsRegex)rqra)rrrSr)r*rr r rr>szTestCase.assertWarnsRegexcCskt|ttfr$tj|}|j|sgd|j|f}|j||}|j|dS)Nz&Regex didn't match: %r not found in %r) r-rbytesrQrRrirjrCrE)rtextrSrDrFr r r assertRegex.szTestCase.assertRegexcCst|ttfr$tj|}|j|}|rd||j|j|j|f}|j ||}|j |dS)Nz"Regex matched: %r matches %r in %r) r-rr?rQrRristartendrjrCrE)rr@Zunexpected_regexrDmatchrFr r rassertNotRegex:s zTestCase.assertNotRegexcsfdd}|S)Ncs,tjdjjtd||S)NzPlease use {0} instead.r)rYrZrdr r[)r)r*) original_funcr rdeprecated_funcJs z,TestCase._deprecate..deprecated_funcr )rFrGr )rFr _deprecateIszTestCase._deprecateii)\r r r AssertionErrorrErrr3Z_classSetupFailedrrrrr classmethodrrrrrrrrrrrr%r&_subtest_msg_sentinelrrrrrrrrrrrrrCrrrrrrrrrrrrrrr"r#r&r'rr.r1rr6r7r8r9r:r;r(r<r=r>rArErHZfailUnlessEqualZ assertEqualsZ failIfEqualZassertNotEqualsZfailUnlessAlmostEqualZassertAlmostEqualsZfailIfAlmostEqualZassertNotAlmostEqualsZ failUnlessZassert_ZfailUnlessRaisesZfailIfZassertRaisesRegexpZassertRegexpMatchesZassertNotRegexpMatchesr r r rr{s !             E    !   & c   + !        rcseZdZdddfddZddZddZdd Zd d Zd d ZddZ ddZ ddZ ddZ S)FunctionTestCaseNcs;tt|j||_||_||_||_dS)N)superrLr _setUpFunc _tearDownFunc _testFunc _description)rZtestFuncrr description)rr rrhs    zFunctionTestCase.__init__cCs|jdk r|jdS)N)rN)rr r rroszFunctionTestCase.setUpcCs|jdk r|jdS)N)rO)rr r rrsszFunctionTestCase.tearDowncCs|jdS)N)rP)rr r rrwszFunctionTestCase.runTestcCs |jjS)N)rPr )rr r rrzszFunctionTestCase.idcCs\t||jstS|j|jko[|j|jko[|j|jko[|j|jkS)N)r-rrrNrOrPrQ)rrr r rr}s zFunctionTestCase.__eq__cCs+tt||j|j|j|jfS)N)rr.rNrOrPrQ)rr r rrszFunctionTestCase.__hash__cCsdt|j|jjfS)Nz%s (%s))rrrPr )rr r rrszFunctionTestCase.__str__cCsdt|j|jfS)Nz <%s tec=%s>)rrrP)rr r rrszFunctionTestCase.__repr__cCsE|jdk r|jS|jj}|rA|jddjpDdS)Nrr)rQrPrrr)rrr r rrs z!FunctionTestCase.shortDescription) r r r rrrrrrrrrrr r )rrrL_s        rLcs^eZdZfddZddZddZddZd d Zd d ZS) rcs8tj||_||_||_|j|_dS)N)rMr_messager!rrE)rr!r|r)rr rrs     z_SubTest.__init__cCstddS)Nzsubtests cannot be run directly)r )rr r rrsz_SubTest.runTestcCsg}|jtk r.|jdj|j|jrxdjddt|jjD}|jdj|dj|pdS)Nz[{}]z, css'|]\}}dj||VqdS)z{}={!r}N)rd)r;kr{r r rr=sz+_SubTest._subDescription..z({}) z ())rSrKrrdrrsortedr*)rpartsZ params_descr r r_subDescriptions  z_SubTest._subDescriptioncCsdj|jj|jS)Nz{} {})rdr!rrX)rr r rrsz _SubTest.idcCs |jjS)N)r!r)rr r rrsz_SubTest.shortDescriptioncCsdj|j|jS)Nz{} {})rdr!rX)rr r rrsz_SubTest.__str__) r r r rrrXrrrr r )rrrs    r)0rr/rrIrrrQrYrr%rerrutilrrrrrZ __unittestobjectrKrrLr rrrr(r5r7r8rr:rBrKrOrPrbrq namedtuplerrrrrrLrr r r rsR           ( (       /%5 ,: