a
    ix                    @   s2  d Z g dZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlmZ ddlmZ eddZi Zdd	 Zed
ZedZedZedZedZedZeeB eB eB eB eB ZedZedZedZedZedZeeB eB eB eB ZdZ dZ!dd Z"dqddZ#dd Z$dd Z%drd!d"Z&d#d$ Z'G d%d& d&eZ(d'd( Z)d)d* Z*d+d, Z+G d-d. d.ej,Z-d/d0 Z.G d1d2 d2Z/G d3d4 d4Z0G d5d6 d6Z1G d7d8 d8Z2G d9d: d:Z3G d;d< d<Z4G d=d> d>e5Z6G d?d@ d@e5Z7G dAdB dBe3Z8da9dsdEdFZ:dCdddddCdddDe1 dfdGdHZ;dtdJdKZ<da=dLdM Z>G dNdO dOej?Z@G dPdQ dQe@ZAG dRdS dSejBZCdudTdUZDG dVdW dWe@ZEdCdde1 dfdXdYZFdZd[ ZGd\d] ZHd^d_ ZIdvd`daZJdwdbdcZKdxdddeZLG dfdg dgZMeMdhdidjdkdldmZNdndo ZOePdpkr.e	QeO  dS )yzreStructuredText en)!register_optionflagDONT_ACCEPT_TRUE_FOR_1DONT_ACCEPT_BLANKLINENORMALIZE_WHITESPACEELLIPSISSKIPIGNORE_EXCEPTION_DETAILCOMPARISON_FLAGSREPORT_UDIFFREPORT_CDIFFREPORT_NDIFFREPORT_ONLY_FIRST_FAILUREREPORTING_FLAGS	FAIL_FASTExampleDocTestDocTestParserDocTestFinderDocTestRunnerOutputCheckerDocTestFailureUnexpectedExceptionDebugRunnertestmodtestfilerun_docstring_examplesDocTestSuiteDocFileSuiteset_unittest_reportflagsscript_from_examples
testsource	debug_srcdebug    N)StringIO)
namedtupleTestResultszfailed attemptedc                 C   s   t | dtt > S )N   )OPTIONFLAGS_BY_NAME
setdefaultlenname r,   /usr/lib64/python3.9/doctest.pyr      s    r   r   r   r   r   r   r   r	   r
   r   r   r   z<BLANKLINE>z...c                 C   s8   d}t jD ](}| |d }|tt |u r
||jO }q
|S )Nr"   )
__future__Zall_feature_namesgetgetattrZcompiler_flag)globsflagsfnameZfeaturer,   r,   r-   _extract_future_flags   s    
r4      c                 C   sV   t | r| S t| tr,t| t t dgS | d u rJtjt	|j
d  S tdd S )N*__name__z"Expected a module, string, or None)inspectismodule
isinstancestr
__import__globalslocalssysmodules	_getframe	f_globals	TypeError)moduledepthr,   r,   r-   _normalize_module   s    


rF   c                 C   s   dD ]}|  |d} q| S )N)z

)replace)datanewliner,   r,   r-   _newline_convert   s    rL   c                 C   s   |rVt |d}t|| } t|dd d urVt|jdrV|j| }||}t|| fS t| |d}|	 | fW  d    S 1 s0    Y  d S )N   
__loader__get_data)encoding)
rF   _module_relative_pathr0   hasattrrN   rO   decoderL   openread)filenamepackagemodule_relativerP   Zfile_contentsfr,   r,   r-   _load_testfile   s    


rZ      c                 C   s   t d|d | S )Nz
(?m)^(?!$) )resub)sindentr,   r,   r-   _indent   s    ra   c                 C   s*   t  }| \}}}tj||||d | S )N)file)r#   	tracebackprint_exceptiongetvalue)exc_infoZexcoutexc_typeexc_valexc_tbr,   r,   r-   _exception_traceback   s    
rj   c                   @   s   e Zd Zdd ZdddZdS )	_SpoofOutc                 C   s$   t | }|r |ds |d7 }|S NrH   )r#   re   endswith)selfresultr,   r,   r-   re      s    
z_SpoofOut.getvalueNc                 C   s   |  | t|  d S N)seekr#   truncate)rn   sizer,   r,   r-   rr   	  s    
z_SpoofOut.truncate)N)r7   
__module____qualname__re   rr   r,   r,   r,   r-   rk      s   	rk   c                 C   s   t | vr| |kS | t }dt| }}|d }|rR||rNt|}|d= ndS |d }|r||r||t|8 }|d= ndS ||krdS |D ],}||||}|dk r dS |t|7 }qdS )Nr"   FT)ELLIPSIS_MARKERsplitr)   
startswithrm   find)wantgotwsstartposendposwr,   r,   r-   _ellipsis_match  s0    


r   c                 C   s   |   } | rd|  S dS d S )Nz# #)rstrip)liner,   r,   r-   _comment_line?  s    r   c                 C   sh   dt |  }}| d}|dkr$|}| dd|}|dkr>|}| dd|}|dkr\|d }| || S )Nr"   rH   :.r&   )r)   rz   rfind)msgstartendir,   r,   r-   _strip_exception_detailsG  s    
r   c                   @   s.   e Zd Zdd Zd
ddZdd Zdd	 ZdS )_OutputRedirectingPdbc                 C   s(   || _ d| _tjj| |dd d| _d S )NFT)stdoutnosigintr&   )_OutputRedirectingPdb__out$_OutputRedirectingPdb__debugger_usedpdbPdb__init__Zuse_rawinput)rn   outr,   r,   r-   r   g  s    z_OutputRedirectingPdb.__init__Nc                 C   s*   d| _ |d u rt j}tj| | d S )NT)r   r?   rA   f_backr   r   	set_trace)rn   framer,   r,   r-   r   o  s    
z_OutputRedirectingPdb.set_tracec                 C   s   | j rtj|  d S rp   )r   r   r   set_continuern   r,   r,   r-   r   u  s    z"_OutputRedirectingPdb.set_continuec                 G   s8   t j}| jt _ztjj| g|R  W |t _S |t _0 d S rp   )r?   r   r   r   r   trace_dispatch)rn   argssave_stdoutr,   r,   r-   r   {  s    z$_OutputRedirectingPdb.trace_dispatch)N)r7   rt   ru   r   r   r   r   r,   r,   r,   r-   r   a  s   
r   c                 C   s   t | std|  |dr(tdtjj|d }t	| drXtj| j
d }n| jdkrttjdkrtjd dkrtjtjd d }qtj}nFt	| dr| jD ]&}tj||}tj|r|  S qtd	| j tj||S )
NzExpected a module: %r/z1Module-relative files may not have absolute paths__file__r"   __main__ __path__zBCan't resolve paths relative to the module %r (it has no __file__))r8   r9   rC   ry   
ValueErrorospathjoinrx   rR   r   r7   r)   r?   argvcurdirr   exists)rD   Z	test_pathZbasedirZ	directoryfullpathr,   r,   r-   rQ     s(    






rQ   c                   @   s&   e Zd Zd	ddZdd Zdd ZdS )
r   Nr"   c                 C   sv   | ds|d7 }|r(| ds(|d7 }|d urB| dsB|d7 }|| _|| _|| _|| _|d u rfi }|| _|| _d S rl   )rm   sourcer{   linenor`   optionsexc_msg)rn   r   r{   r   r   r`   r   r,   r,   r-   r     s    
zExample.__init__c                 C   s\   t | t |urtS | j|jkoZ| j|jkoZ| j|jkoZ| j|jkoZ| j|jkoZ| j|jkS rp   )typeNotImplementedr   r{   r   r`   r   r   rn   otherr,   r,   r-   __eq__  s    




zExample.__eq__c                 C   s   t | j| j| j| j| jfS rp   )hashr   r{   r   r`   r   r   r,   r,   r-   __hash__  s    zExample.__hash__)Nr"   r"   N)r7   rt   ru   r   r   r   r,   r,   r,   r-   r     s
   #  
r   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )r   c                 C   s,   || _ || _| | _|| _|| _|| _d S rp   )examples	docstringcopyr1   r+   rV   r   )rn   r   r1   r+   rV   r   r   r,   r,   r-   r     s    
zDocTest.__init__c                 C   sR   t | jdkrd}n"t | jdkr(d}ndt | j }d| jj| j| j| j|f S )Nr"   zno examplesr&   z	1 examplez%d examplesz<%s %s from %s:%s (%s)>)r)   r   	__class__r7   r+   rV   r   )rn   r   r,   r,   r-   __repr__  s    zDocTest.__repr__c                 C   s\   t | t |urtS | j|jkoZ| j|jkoZ| j|jkoZ| j|jkoZ| j|jkoZ| j|jkS rp   )r   r   r   r   r1   r+   rV   r   r   r,   r,   r-   r   )  s    




zDocTest.__eq__c                 C   s   t | j| j| j| jfS rp   )r   r   r+   rV   r   r   r,   r,   r-   r   4  s    zDocTest.__hash__c                 C   s:   t |tstS | j| j| jt| f|j|j|jt|fk S rp   )r:   r   r   r+   rV   r   idr   r,   r,   r-   __lt__8  s
    
zDocTest.__lt__N)r7   rt   ru   r   r   r   r   r   r,   r,   r,   r-   r     s
   r   c                   @   s   e Zd ZedejejB ZedejejB ejB Z	edj
ZdddZdd Zdd	d
Zdd ZedejZdd ZedejZdd Zdd Zdd ZdS )r   a  
        # Source consists of a PS1 line followed by zero or more PS2 lines.
        (?P<source>
            (?:^(?P<indent> [ ]*) >>>    .*)    # PS1 line
            (?:\n           [ ]*  \.\.\. .*)*)  # PS2 lines
        \n?
        # Want consists of any non-blank lines that do not start with PS1.
        (?P<want> (?:(?![ ]*$)    # Not a blank line
                     (?![ ]*>>>)  # Not a line starting with PS1
                     .+$\n?       # But any other line
                  )*)
        a  
        # Grab the traceback header.  Different versions of Python have
        # said different things on the first traceback line.
        ^(?P<hdr> Traceback\ \(
            (?: most\ recent\ call\ last
            |   innermost\ last
            ) \) :
        )
        \s* $                # toss trailing whitespace on the header.
        (?P<stack> .*?)      # don't blink: absorb stuff until...
        ^ (?P<msg> \w+ .*)   #     a line *starts* with alphanum.
        z^[ ]*(#.*)?$<string>c                    s  |  }| |  dkr8d fdd|dD }g }d\}}| j|D ]}||||   ||d|| 7 }| 	|||\}}}	}
| 
|s|t||	|
| t|d |d ||d| | 7 }| }qP|||d   |S )Nr"   rH   c                    s   g | ]}| d  qS rp   r,   .0lZ
min_indentr,   r-   
<listcomp>      z'DocTestParser.parse.<locals>.<listcomp>r"   r"   r`   )r   r`   r   )
expandtabs_min_indentr   rx   _EXAMPLE_REfinditerappendr   count_parse_example_IS_BLANK_OR_COMMENTr   r)   groupr   )rn   stringr+   outputZcharnor   mr   r   r{   r   r,   r   r-   parses  s*    



zDocTestParser.parsec                 C   s   t | |||||||S rp   )r   get_examples)rn   r   r1   r+   rV   r   r,   r,   r-   get_doctest  s    	zDocTestParser.get_doctestc                 C   s   dd |  ||D S )Nc                 S   s   g | ]}t |tr|qS r,   )r:   r   )r   xr,   r,   r-   r     s   
z.DocTestParser.get_examples.<locals>.<listcomp>)r   )rn   r   r+   r,   r,   r-   r     s    zDocTestParser.get_examplesc           
         s
  t |d |dd}| | || | |dd  d  d || d fdd|D }|d	}|d}t |dkrtd
|d r|d= | |d  ||t |  d fdd|D }| j|}|r|d}nd }| 	|||}	||	||fS )Nr`   r   rH   r&   r\   r   c                    s   g | ]}| d  d qS )r[   Nr,   )r   slr`   r,   r-   r     r   z0DocTestParser._parse_example.<locals>.<listcomp>r{   z *$rv   c                    s   g | ]}| d  qS rp   r,   )r   Zwlr   r,   r-   r     r   r   )
r)   r   rx   _check_prompt_blank_check_prefixr   r]   match_EXCEPTION_RE_find_options)
rn   r   r+   r   source_linesr   r{   
want_linesr   r   r,   r   r-   r     s&     


zDocTestParser._parse_examplez#\s*doctest:\s*([^\n\'"]*)$c           	      C   s   i }| j |D ]v}|ddd }|D ]V}|d dvsN|dd  tvrdtd|d ||f t|dd   }|d dk||< q.q|r| |rtd|||f |S )	Nr&   ,r\   r"   z+-z7line %r of the doctest for %s has an invalid option: %r+zSline %r of the doctest for %s has an option directive on a line with no example: %r)_OPTION_DIRECTIVE_REr   r   rI   rx   r'   r   r   )	rn   r   r+   r   r   r   option_stringsoptionflagr,   r,   r-   r     s"    zDocTestParser._find_optionsz^([ ]*)(?=\S)c                 C   s2   dd | j |D }t|dkr*t|S dS d S )Nc                 S   s   g | ]}t |qS r,   )r)   )r   r`   r,   r,   r-   r   
  r   z-DocTestParser._min_indent.<locals>.<listcomp>r"   )
_INDENT_REfindallr)   min)rn   r_   indentsr,   r,   r-   r     s    zDocTestParser._min_indentc              	   C   s^   t |D ]P\}}t||d kr||d  dkrtd|| d ||||d  |f qd S )Nr[   rM   r\   z8line %r of the docstring for %s lacks blank after %s: %rr&   )	enumerater)   r   )rn   linesr`   r+   r   r   r   r,   r,   r-   r     s     z!DocTestParser._check_prompt_blankc                 C   s>   t |D ]0\}}|r||std|| d ||f qd S )NzGline %r of the docstring for %s has inconsistent leading whitespace: %rr&   )r   ry   r   )rn   r   prefixr+   r   r   r   r,   r,   r-   r     s
    zDocTestParser._check_prefixN)r   )r   )r7   rt   ru   r]   compile	MULTILINEVERBOSEr   DOTALLr   r   r   r   r   r   r   r   r   r   r   r   r   r,   r,   r,   r-   r   C  s&   	

'
3r   c                   @   sJ   e Zd Zde ddfddZdddZdd	 Zd
d Zdd Zdd Z	dS )r   FTc                 C   s   || _ || _|| _|| _d S rp   )_parser_verbose_recurse_exclude_empty)rn   verboseparserrecurseexclude_emptyr,   r,   r-   r   7  s    zDocTestFinder.__init__Nc           	   	   C   sL  |d u r.t |dd }|d u r.tdt|f |du r<d }n|d u rNt|}zt|}W n tyr   d }Y nd0 |st|}|d |dd   dksd }|d u rd }n*|d urt	||j
}n
t	|}|sd }|d u r|d u ri }n
|j
 }n| }|d ur|| d|vr&d|d< g }| ||||||i  |  |S )Nr7   zJDocTestFinder.find: name must be given when obj.__name__ doesn't exist: %rFr"   z<]>r   )r0   r   r   r8   	getmoduleZgetsourcefilerC   Zgetfile	linecachegetlines__dict__r   update_findsort)	rn   objr+   rD   r1   
extraglobsrb   r   testsr,   r,   r-   rz   M  sJ    $






zDocTestFinder.findc                 C   s   |d u rdS t |d ur(|t |u S t |r>|j|ju S t |r|t|dr\|jj}nt|drn|j}ndS |j	|kS t 
|r|j	|jkS t|dr|j	|jkS t|trdS tdd S )NT__objclass__rt   z"object must be a class or function)r8   r   
isfunctionr   __globals__ZismethoddescriptorrR   r  rt   r7   isclassr:   propertyr   )rn   rD   objectZobj_modr,   r,   r-   _from_module  s(    








zDocTestFinder._from_modulec              
   C   s  | j rtd|  t||v r"d S d|t|< | |||||}|d urR|| t|r| jr|j	 D ]P\}	}
d||	f }	t
t|
st|
rl| ||
rl| ||
|	|||| qlt|rn| jrnt|di 	 D ]\}	}
t|	tstdt|	f t
|
sJt|
sJt|
sJt|
tsJtdt|
f d||	f }	| ||
|	|||| qt|r| jr|j	 D ]t\}	}
t|
ttfr|
j}
t
|
st|
st|
tr| ||
rd||	f }	| ||
|	|||| qd S )NzFinding tests in %sr&   z%s.%s__test__z5DocTestFinder.find: __test__ keys must be strings: %rz`DocTestFinder.find: __test__ values must be strings, functions, methods, classes, or modules: %rz%s.__test__.%s)r   printr   	_get_testr   r8   r9   r   r   itemsZ	isroutineunwrapr  r	  r   r0   r:   r;   r   r   staticmethodclassmethod__func__r  )rn   r  r   r+   rD   r   r1   seentestZvalnamevalr,   r,   r-   r     sd    


zDocTestFinder._findc           	   	   C   s   t |tr|}nHz,|jd u r"d}n|j}t |ts:t|}W n ttfyV   d}Y n0 | ||}| jrr|srd S |d u rd }n.t|dd p|j}|dd  dkr|d d }| j	
|||||S )Nr   r   .pycrv   )r:   r;   __doc__rC   AttributeError_find_linenor   r0   r7   r   r   )	rn   r   r+   rD   r1   r   r   r   rV   r,   r,   r-   r    s*    




zDocTestFinder._get_testc                 C   s  d }t |rd}t |rb|d u r(d S tdt|dd }t|D ]\}}||rF|} qbqFt |rr|j	}t 
|r|j}t |r|j}t |r|j}t |rt|dd d }|d ur
|d u r|d S td}t|t|D ]}||| r|  S qd S )Nr"   z^\s*class\s*%s\br7   -co_firstlinenor&   z(^|.*:)\s*\w*("|\'))r8   r9   r  r]   r   r0   r   r   Zismethodr  r  __code__Zistracebacktb_frameZisframef_codeZiscoderanger)   )rn   r   r   r   patr   r   r,   r,   r-   r  2  s6    







zDocTestFinder._find_lineno)NNNN)
r7   rt   ru   r   r   rz   r	  r   r  r  r,   r,   r,   r-   r   .  s   	

f=&r   c                   @   s   e Zd ZdZdddZdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dd ZedZdddZd ddZd!ddZdd ZdS )"r   zF**********************************************************************Nr"   c                 C   sN   |pt  | _|d u rdtjv }|| _|| _|| _d| _d| _i | _	t
 | _d S )N-vr"   )r   _checkerr?   r   r   optionflagsoriginal_optionflagstriesfailures_name2ftrk   _fakeout)rn   checkerr   r#  r,   r,   r-   r     s    
zDocTestRunner.__init__c                 C   sH   | j rD|jr.|dt|j d t|j  n|dt|j d  d S )NzTrying:
zExpecting:
zExpecting nothing
)r   r{   ra   r   )rn   r   r  exampler,   r,   r-   report_start  s    zDocTestRunner.report_startc                 C   s   | j r|d d S )Nzok
)r   rn   r   r  r*  r|   r,   r,   r-   report_success  s    zDocTestRunner.report_successc                 C   s&   ||  ||| j||| j  d S rp   )_failure_headerr"  output_differencer#  r,  r,   r,   r-   report_failure  s    zDocTestRunner.report_failurec                 C   s$   ||  ||d tt|  d S )NzException raised:
)r.  ra   rj   rn   r   r  r*  rf   r,   r,   r-   report_unexpected_exception  s
    
z)DocTestRunner.report_unexpected_exceptionc                 C   s   | j g}|jrR|jd ur4|jd ur4|j|j d }nd}|d|j||jf  n|d|jd |jf  |d |j}|t| d|S )Nr&   ?zFile "%s", line %s, in %szLine %s, in %szFailed example:rH   )DIVIDERrV   r   r   r+   r   ra   r   )rn   r  r*  r   r   r   r,   r,   r-   r.    s    
zDocTestRunner._failure_headerc              	   C   s  d }}| j }td\}}}	| jj}
t|jD ]4\}}| j t@ oH|dk}|| _ |jr|j D ],\}}|r||  j |O  _ q`|  j | M  _ q`| j t	@ rq.|d7 }|s| 
||| d|j|f }z,tt|j|d|d|j | j  d }W n2 ty    Y n   t }| j  Y n0 | j }| jd |}|d u r^|
|j|| j r|}n|tj|d d  d }|s|t|7 }|jd u r|	}nB|
|j|| j r|}n*| j t@ r|
t|jt|| j r|}||u r|sP| |||| nT||u r&|s|  |||| |d7 }n*||	u rP|sF| !|||| |d7 }n |r.| j t"@ r. qfq.|| _ | #||| t$||S )	Nr"   rM   r&   z<doctest %s[%d]>ZsingleTr5   rv   )%r#  r  r"  check_outputr   r   r   r   r  r   r+  r+   execr   r   r1   debuggerr   KeyboardInterruptr?   rf   r(  re   rr   r{   rc   format_exception_onlyrj   r   r   r   r-  r0  r2  r   _DocTestRunner__record_outcomer%   )rn   r  compileflagsr   r&  r%  r$  SUCCESSFAILUREZBOOMcheck
examplenumr*  quietZ
optionflagr  rV   	exceptionr|   outcomer   r,   r,   r-   Z__run  s    











zDocTestRunner.__runc                 C   sL   | j |jd\}}|| || f| j |j< |  j|7  _|  j|7  _d S )Nr   )r'  r/   r+   r&  r%  )rn   r  rY   tf2t2r,   r,   r-   Z__record_outcomez  s    zDocTestRunner.__record_outcomez.<doctest (?P<name>.+)\[(?P<examplenum>\d+)\]>$c                 C   sV   | j |}|rF|d| jjkrF| jjt|d }|jjddS | 	||S d S )Nr+   r?  Tkeepends)
%_DocTestRunner__LINECACHE_FILENAME_REr   r   r  r+   r   intr   
splitlinessave_linecache_getlines)rn   rV   module_globalsr   r*  r,   r,   r-   Z__patched_linecache_getlines  s
    z*DocTestRunner.__patched_linecache_getlinesTc           	   	      sD  || _ |d u rt|j}tj|d u rVj  d u s@  dkrHj}n fdd}| jt_t	 }t
j}t| _| j  | jjt
_tj| _| jt_tj}tjt_zR| |||W t_|t
_t| | jt_|t_|r|j  dd l}d |_S nDt_|t
_t| | jt_|t_|r>|j  dd l}d |_0 d S )Nutf-8c                    s    t |  d } |  d S )Nbackslashreplace)r;   encodewrite)r_   rP   r   r,   r-   r     s    zDocTestRunner.run.<locals>.outr"   )r  r4   r1   r?   r   rP   lowerrP  r(  gettracer   r   r   r7  resetr   r   rK  *_DocTestRunner__patched_linecache_getlinesdisplayhook__displayhook___DocTestRunner__runsettraceclearbuiltins_)	rn   r  r;  r   clear_globsZ
save_traceZsave_set_traceZsave_displayhookr[  r,   rQ  r-   run  sb    





        

zDocTestRunner.runc                 C   s  |d u r| j }g }g }g }d }}| j D ]V}|\}\}	}
||
7 }||	7 }|
dkr`|| q,|	dkrx|||
f q,|| q,|r|rtt|d |  |D ]}td| q|rtt|d |  |D ]\}}td||f  q|r:t| j tt|d |  |D ] \}\}	}
td|	|
|f  q|rft|dt| jd	 t|| d
|d |rztd|d n|rtd t||S )Nr"   zitems had no tests:z   zitems passed all tests:z %3d tests in %szitems had failures:z %3d of %3d in %sztests inzitems.z
passed andzfailed.z***Test Failed***z	failures.zTest passed.)	r   r'  r  r   r  r)   r   r4  r%   )rn   r   ZnotestsZpassedZfailedZtotaltZtotalfr   r+   rY   rC  thingr   r,   r,   r-   	summarize  sP    
zDocTestRunner.summarizec                 C   sR   | j }|j  D ]<\}\}}||v r@|| \}}|| }|| }||f||< qd S rp   )r'  r  )rn   r   dr+   rY   rC  rD  rE  r,   r,   r-   merge  s    zDocTestRunner.merge)NNr"   )N)NNT)N)r7   rt   ru   r4  r   r+  r-  r0  r2  r.  rX  r:  r]   r   rH  rU  r^  r`  rb  r,   r,   r,   r-   r   f  s   :
$}



I
9r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
r   c                 C   s   t |dddS )NASCIIrN  )r;   rO  )rn   r_   r,   r,   r-   _toAscii&  s    zOutputChecker._toAsciic                 C   s   |  |}|  |}||kr dS |t@ sH||fdkr8dS ||fdkrHdS |t@ stdtt d|}tdd|}||krdS |t@ rd|	 }d|	 }||krdS |t
@ rt||rdS dS )	NT)zTrue
z1
)zFalse
z0
z(?m)^%s\s*?$r   z(?m)^[^\S\n]+$r\   F)rd  r   r   r]   r^   escapeBLANKLINE_MARKERr   r   rx   r   r   rn   r{   r|   r#  r,   r,   r-   r5  ,  s2    


zOutputChecker.check_outputc                 C   s<   |t tB tB @ sdS |t@ r dS |ddko:|ddkS )NFTrH   r5   )r	   r
   r   r   rg  r,   r,   r-   _do_a_fancy_diffk  s    zOutputChecker._do_a_fancy_diffc           
      C   s(  |j }|t@ stdt|}| |||r|jdd}|jdd}|t@ rptj	||dd}t
|dd  }d}nZ|t@ rtj||dd}t
|dd  }d}n,|t@ rtjtjd}	t
|	||}d	}n d
| td| S |r|rdt|t|f S |rdt| S |r dt| S dS d S )Nz(?m)^[ ]*(?=
)TrF  r5   )nz#unified diff with -expected +actualz-context diff with expected followed by actual)Zcharjunkzndiff with -expected +actualzDifferences (%s):
r   zExpected:
%sGot:
%szExpected:
%sGot nothing
zExpected nothing
Got:
%szExpected nothing
Got nothing
)r{   r   r]   r^   rf  rh  rJ  r	   difflibZunified_difflistr
   Zcontext_diffr   ZDifferZIS_CHARACTER_JUNKZcomparera   r   )
rn   r*  r|   r#  r{   r   Z	got_linesdiffkindZenginer,   r,   r-   r/    s4    zOutputChecker.output_differenceN)r7   rt   ru   rd  r5  rh  r/  r,   r,   r,   r-   r     s   ?r   c                   @   s   e Zd Zdd Zdd ZdS )r   c                 C   s   || _ || _|| _d S rp   )r  r*  r|   )rn   r  r*  r|   r,   r,   r-   r     s    zDocTestFailure.__init__c                 C   s
   t | jS rp   r;   r  r   r,   r,   r-   __str__  s    zDocTestFailure.__str__Nr7   rt   ru   r   ro  r,   r,   r,   r-   r     s   r   c                   @   s   e Zd Zdd Zdd ZdS )r   c                 C   s   || _ || _|| _d S rp   )r  r*  rf   )rn   r  r*  rf   r,   r,   r-   r     s    zUnexpectedException.__init__c                 C   s
   t | jS rp   rn  r   r,   r,   r-   ro    s    zUnexpectedException.__str__Nrp  r,   r,   r,   r-   r     s   r   c                   @   s&   e Zd Zd	ddZdd Zdd ZdS )
r   NTc                 C   s$   t | |||d}|r |j  |S )NF)r   r^  r1   rZ  )rn   r  r;  r   r]  rr,   r,   r-   r^  1  s    
zDebugRunner.runc                 C   s   t |||d S rp   )r   r1  r,   r,   r-   r2  7  s    z'DebugRunner.report_unexpected_exceptionc                 C   s   t |||d S rp   )r   r,  r,   r,   r-   r0  :  s    zDebugRunner.report_failure)NNT)r7   rt   ru   r^  r2  r0  r,   r,   r,   r-   r     s   [
r   TFc	                 C   s   | d u rt jd} t| s,td| f |d u r:| j}t|d}	|rVt||d}
nt	||d}
|	j
| |||dD ]}|
| qt|r|
  td u r|
an
t|
 t|
j|
jS )Nr   ztestmod: module required; %r)r   r   r#  r1   r  )r?   r@   r/   r8   r9   rC   r7   r   r   r   rz   r^  r`  masterrb  r%   r&  r%  )r   r+   r1   r   reportr#  r  raise_on_errorr   finderrunnerr  r,   r,   r-   r   F  s$    E


r   c                 C   s   |r|st dt| |||pd\}} |d u r:tj| }|d u rHi }n| }|d urb|| d|vrrd|d< |	rt||d}nt||d}|
	|||| d}|
| |r|  td u r|an
t| t|j|jS )N8Package may only be specified for module-relative paths.rM  r7   r   rr  r"   )r   rZ   r   r   basenamer   r   r   r   r   r^  r`  rt  rb  r%   r&  r%  )rV   rX   r+   rW   r1   r   ru  r#  r  rv  r   rP   textrx  r  r,   r,   r-   r     s2    R


r   NoNamec           	      C   s@   t |dd}t||d}|j| ||dD ]}|j||d q(d S )NF)r   r   rr  )r1   )r;  )r   r   rz   r^  )	rY   r1   r   r+   r;  r#  rw  rx  r  r,   r,   r-   r   )  s    r   c                 C   s"   | t @ | krtd| t}| a|S )NzOnly reporting flags allowed)r   r   _unittest_reportflags)r2   oldr,   r,   r-   r   F  s
    
r   c                   @   sl   e Zd ZdddZdd Zdd Zd	d
 Zdd Zdd Zdd Z	dd Z
dd Zdd ZejZdd ZdS )DocTestCaser"   Nc                 C   s:   t j|  || _|| _|j | _|| _|| _	|| _
d S rp   )unittestTestCaser   _dt_optionflags_dt_checkerr1   r   	_dt_globs_dt_test	_dt_setUp_dt_tearDown)rn   r  r#  setUptearDownr)  r,   r,   r-   r   l  s    zDocTestCase.__init__c                 C   s   | j }| jd ur| | d S rp   )r  r  rn   r  r,   r,   r-   r  w  s    
zDocTestCase.setUpc                 C   s6   | j }| jd ur| | |j  |j| j d S rp   )r  r  r1   rZ  r   r  r  r,   r,   r-   r  }  s
    


zDocTestCase.tearDownc                 C   s   | j }tj}t }| j}|t@ s(|tO }t|| jdd}z&d|_	|j
||jdd\}}W |t_n|t_0 |r| | | d S )NFr#  r)  r   zF----------------------------------------------------------------------)r   r]  )r  r?   r   r#   r  r   r}  r   r  r4  r^  rP  ZfailureExceptionformat_failurere   )rn   r  r~  newr#  rx  r&  r%  r,   r,   r-   runTest  s"    zDocTestCase.runTestc                 C   sP   | j }|jd u rd}n
d|j }d|jddd  }d|j|j|||f S )Nzunknown line numberz%sr   rv   z:Failed doctest test for %s
  File "%s", line %s, in %s

%s)r  r   r   r+   rx   rV   )rn   errr  r   Zlnamer,   r,   r-   r    s    

zDocTestCase.format_failurec                 C   s6   |    t| j| jdd}|j| jdd |   d S )NFr  )r]  )r  r   r  r  r^  r  r  )rn   rx  r,   r,   r-   r!     s    BzDocTestCase.debugc                 C   s   | j jS rp   r  r+   r   r,   r,   r-   r     s    zDocTestCase.idc                 C   sP   t | t |urtS | j|jkoN| j|jkoN| j|jkoN| j|jkoN| j|jkS rp   )r   r   r  r  r  r  r  r   r,   r,   r-   r     s    



zDocTestCase.__eq__c                 C   s   t | j| j| j| jfS rp   )r   r  r  r  r  r   r,   r,   r-   r    	  s    zDocTestCase.__hash__c                 C   s,   | j jd}d|d d|d d f S )Nr   z%s (%s)rv   )r  r+   rx   r   )rn   r+   r,   r,   r-   r   	  s    zDocTestCase.__repr__c                 C   s   d| j j S )Nz	Doctest: r  r   r,   r,   r-   shortDescription
	  s    zDocTestCase.shortDescription)r"   NNN)r7   rt   ru   r   r  r  r  r  r!   r   r   r   r   r  ro  r  r,   r,   r,   r-   r  j  s     

H
r  c                   @   s0   e Zd Zdd Zdd Zdd Zdd ZeZd	S )
SkipDocTestCasec                 C   s   || _ t| d  d S rp   )rD   r  r   )rn   rD   r,   r,   r-   r   	  s    zSkipDocTestCase.__init__c                 C   s   |  d d S )Nz-DocTestSuite will not work with -O2 and above)ZskipTestr   r,   r,   r-   r  	  s    zSkipDocTestCase.setUpc                 C   s   d S rp   r,   r   r,   r,   r-   	test_skip	  s    zSkipDocTestCase.test_skipc                 C   s   d| j j S )NzSkipping tests from %s)rD   r7   r   r,   r,   r-   r  	  s    z SkipDocTestCase.shortDescriptionN)r7   rt   ru   r   r  r  r  ro  r,   r,   r,   r-   r  	  s
   r  c                   @   s   e Zd Zdd ZdS )_DocTestSuitec                 C   s   d S rp   r,   )rn   indexr,   r,   r-   _removeTestAtIndex 	  s    z _DocTestSuite._removeTestAtIndexN)r7   rt   ru   r  r,   r,   r,   r-   r  	  s   r  c           	      K   s   |d u rt  }t| } |j| ||d}|sNtjjdkrNt }|t|  |S |	  t }|D ]X}t
|jdkrtq`|js| j}|dd  dkr|d d }||_|t|fi | q`|S )Nrs  r5   r"   r  r  rv   )r   rF   rz   r?   r2   optimizer  addTestr  r   r)   r   rV   r   r  )	rD   r1   r  Ztest_finderr   r  suiter  rV   r,   r,   r-   r   $	  s(    %r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )DocFileCasec                 C   s   d | jjdS )Nr\  r   )r   r  r+   rx   r   r,   r,   r-   r   f	  s    zDocFileCase.idc                 C   s   | j jS rp   )r  rV   r   r,   r,   r-   r   i	  s    zDocFileCase.__repr__c                 C   s   d| j j| j j|f S )Nz2Failed doctest test for %s
  File "%s", line 0

%s)r  r+   rV   )rn   r  r,   r,   r-   r  l	  s    zDocFileCase.format_failureN)r7   rt   ru   r   r   r  r,   r,   r,   r-   r  d	  s   r  c           
      K   sz   |d u ri }n|  }|r&|s&tdt| |||p4d\}} d|vrL| |d< tj| }||||| d}	t|	fi |S )Nry  rM  r   r"   )r   r   rZ   r   r   rz  r   r  )
r   rX   rW   r1   r   rP   r   docr+   r  r,   r,   r-   DocFileTestq	  s    r  c                  O   sH   t  }|ddr$t|d|d< | D ]}|t|fi | q(|S )NrX   TrW   )r  r/   rF   r  r  )pathskwr  r   r,   r,   r-   r   	  s    8r   c                 C   s   g }t  | D ]x}t|trh||jd d  |j}|r|d |dd |dd d D 7 }q|dd |dd d D 7 }q|r|d dkr|  q|r|d dkr|d qd	|d S )	Nrv   z# Expected:c                 S   s   g | ]}d | qS )z## r,   r   r,   r,   r-   r   
  r   z(script_from_examples.<locals>.<listcomp>rH   c                 S   s   g | ]}t |qS r,   )r   r   r,   r,   r-   r   
  s   r   r"   )
r   r   r:   r   r   r   r{   rx   popr   )r_   r   Zpiecer{   r,   r,   r-   r   	  s     :

"

r   c                    sJ   t | } t | } fdd|D }|s4t d|d }t|j}|S )Nc                    s   g | ]}|j  kr|qS r,   r*   )r   rC  r*   r,   r-   r   /
  r   ztestsource.<locals>.<listcomp>znot found in testsr"   )rF   r   rz   r   r   r   )rD   r+   r  r  testsrcr,   r*   r-   r   &
  s    

r   c                 C   s   t | }t||| d S rp   )r   debug_script)srcpmr1   r  r,   r,   r-   r    6
  s    r    c                 C   s   dd l }|r| }ni }|rvzt| || W q   tt d  |jdd}|  |d t d  Y q0 n|jdd	d|  || d S )Nr"   r&   T)r   r5   zexec(%r))
r   r   r6  r  r?   rf   r   rT  Zinteractionr^  )r  r  r1   r   pr,   r,   r-   r  ;
  s    
r  c                 C   s$   t | } t| |}t||| j d S rp   )rF   r   r  r   )rD   r+   r  r  r,   r,   r-   r!   O
  s    
r!   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )
_TestClassc                 C   s
   || _ d S rp   r  )rn   r  r,   r,   r-   r   k
  s    z_TestClass.__init__c                 C   s   | j d | _ | S )Nr5   r  r   r,   r,   r-   squareu
  s    z_TestClass.squarec                 C   s   | j S rp   r  r   r,   r,   r-   r/   
  s    z_TestClass.getN)r7   rt   ru   r   r  r/   r,   r,   r,   r-   r  ]
  s   

r  z
                      Example of a string object, searched as-is.
                      >>> x = 1; y = 2
                      >>> x + y, x * y
                      (3, 2)
                      a  
                                    In 2.2, boolean expressions displayed
                                    0 or 1.  By default, we still accept
                                    them.  This can be disabled by passing
                                    DONT_ACCEPT_TRUE_FOR_1 to the new
                                    optionflags argument.
                                    >>> 4 == 4
                                    1
                                    >>> 4 == 4
                                    True
                                    >>> 4 > 4
                                    0
                                    >>> 4 > 4
                                    False
                                    z
                Blank lines can be marked with <BLANKLINE>:
                    >>> print('foo\n\nbar\n')
                    foo
                    <BLANKLINE>
                    bar
                    <BLANKLINE>
            z
                If the ellipsis flag is used, then '...' can be used to
                elide substrings in the desired output:
                    >>> print(list(range(1000))) #doctest: +ELLIPSIS
                    [0, 1, 2, ..., 999]
            a  
                If the whitespace normalization flag is used, then
                differences in whitespace are ignored.
                    >>> print(list(range(30))) #doctest: +NORMALIZE_WHITESPACE
                    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
                     15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
                     27, 28, 29]
            )r  r   zbool-int equivalencezblank linesZellipsiszwhitespace normalizationc                  C   s"  dd l } | jdd}|jdddddd	 |jd
ddt g dd |jddddd |jdddd | }|j}|j}d}|jD ]}|t| O }q|j	r|t
O }|D ]v}|drtj|\}}tjd| t|d d }	tjd= t|	||d\}
}nt|d||d\}
}|
r dS qdS )Nr"   zdoctest runner)descriptionr!  z	--verbose
store_trueFz'print very verbose output for all tests)actiondefaulthelpz-oz--optionr   zqspecify a doctest option flag to apply to the test run; may be specified more than once to apply multiple options)r  choicesr  r  z-fz--fail-fastzystop running tests after first failure (this is a shorthand for -o FAIL_FAST, and is in addition to any other -o options))r  r  rb   r   z file containing the tests to run)nargsr  z.pyrr  )rX   r   r#  r&   )argparseArgumentParseradd_argumentr'   keys
parse_argsrb   r   r   Z	fail_fastr   rm   r   r   rx   r?   insertr<   r   r   )r  r   r   Z	testfilesr   r   r   rV   dirnamer   r&  r\  r,   r,   r-   _test
  sH    




r  r   )r5   )r[   )	NNNNTr"   NFF)Fr|  Nr"   )NNNN)FN)FN)F)RZ__docformat____all__r.   rj  r8   r   r   r   r]   r?   rc   r  ior#   collectionsr$   r%   r'   r   r   r   r   r   r   r   r   r	   r
   r   r   r   r   rf  rw   r4   rF   rL   rZ   ra   rj   rk   r   r   r   r   r   rQ   r   r   r   r   r   r   	Exceptionr   r   r   rt  r   r   r   r}  r   r  r  r  Z	TestSuiter  r   r  r  r   r   r   r    r  r!   r  r
  r  r7   exitr,   r,   r,   r-   <module>0   s   -


1%.DK l  :   ; n   
h
{  
$ $
@
IR


,	3-
