o
    IAf                    @   sF  	 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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Z0G d3d4 d4Z1G d5d6 d6Z2G d7d8 d8Z3G d9d: d:Z4G d;d< d<Z5G d=d> d>e6Z7G d?d@ d@e6Z8G dAdB dBe4Z9da:			DdsdEdFZ;dCdddddCdddDe2 dfdGdHZ<	I	dtdJdKZ=da>dLdM Z?G dNdO dOej@ZAG dPdQ dQeAZBG dRdS dSejCZDdudTdUZEG dVdW dWeAZFdCdde2 dfdXdYZGdZd[ ZHd\d] ZId^d_ ZJdvd`daZKdvdbdcZLdwdddeZMG dfdg dgZNeNdhdidjdkdldmZOdndo ZPeQdpkre	ReP  dS dS )xz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IncrementalNewlineDecoder)
namedtupleTestResultszfailed attemptedc                 C   s   t | dtt > S )N   )OPTIONFLAGS_BY_NAME
setdefaultlenname r-   /usr/lib/python3.10/doctest.pyr      s   r   r   r   r   r   r   r   r	   r
   r   r   r   z<BLANKLINE>z...c                 C   s:   	 d}t jD ]}| |d }|tt |u r||jO }q|S )Nr"   )
__future__Zall_feature_namesgetgetattrZcompiler_flag)globsflagsZfnameZfeaturer-   r-   r.   _extract_future_flags   s   

r4      c                 C   sT   	 t | r| S t| trt| t t dgS | d u r&tjt	|j
d  S td)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   t d d| dS NT)r$   decode)datar-   r-   r.   _newline_convert   s   rJ   c                 C   s   |r;t |d}t|| } t|dd  }d u r&z|jj}W n	 ty%   Y nw t|dr;|| }||}t	|| fS t
| |d}| | fW  d    S 1 sRw   Y  d S )N   
__loader__get_data)encoding)rF   _module_relative_pathr1   __spec__loaderAttributeErrorhasattrrM   rH   rJ   openread)filenamepackagemodule_relativerN   rQ   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 N
)r#   re   endswith)selfresultr-   r-   r.   re     s   
z_SpoofOut.getvalueNc                 C   s   |  | t|  d S N)seekr#   truncate)ro   sizer-   r-   r.   rs   
  s   
z_SpoofOut.truncaterq   )r7   
__module____qualname__re   rs   r-   r-   r-   r.   rk      s    	rk   c                 C   s   	 t | vr	| |kS | t }dt|}}|d }|r*||r(t|}|d= ndS |d }|rA||r?|t|8 }|d= ndS ||krGdS |D ]}||||}|dk rY dS |t|7 }qIdS )Nr"   FT)ELLIPSIS_MARKERsplitr*   
startswithrn   find)wantgotwsstartposendposwr-   r-   r.   _ellipsis_match  s2   


r   c                 C   s   	 |   } | r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"   rm   :.r'   )r*   r{   rfind)msgstartendir-   r-   r.   _strip_exception_detailsH  s   
r   c                   @   s0   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)ro   outr-   r-   r.   r   h  s   
z_OutputRedirectingPdb.__init__Nc                 C   s*   d| _ |d u rt j}tj| | d S rG   )r   r?   rA   f_backr   r   	set_trace)ro   framer-   r-   r.   r   p  s   
z_OutputRedirectingPdb.set_tracec                 C   s   | j rtj|  d S d S rq   )r   r   r   set_continuero   r-   r-   r.   r   v  s   z"_OutputRedirectingPdb.set_continuec                 G   s4   t j}| jt _ztjj| g|R  W |t _S |t _w rq   )r?   r   r   r   r   trace_dispatch)ro   argssave_stdoutr-   r-   r.   r   |  s
   z$_OutputRedirectingPdb.trace_dispatchrq   )r7   ru   rv   r   r   r   r   r-   r-   r-   r.   r   b  s    
r   c                 C   s   t | std|  |drtdtjj|d }t	| dr,tj| j
d }nF| jdkrOttjdkrKtjd dkrKtjtjd d }n'tj}n#t	| drk| jD ]}tj||}tj|rj|  S qWt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   rz   
ValueErrorospathjoinry   rS   r   r7   r*   r?   argvcurdirr   exists)rD   Z	test_pathZbasedirZ	directoryfullpathr-   r-   r.   rO     s*   





rO   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r!| ds!|d7 }|| _|| _|| _|| _|d u r3i }|| _|| _d S rl   )rn   sourcer|   linenor`   optionsexc_msg)ro   r   r|   r   r   r`   r   r-   r-   r.   r     s   

zExample.__init__c                 C   \   t | t |ur
tS | j|jko-| j|jko-| j|jko-| j|jko-| j|jko-| j|jkS rq   )typeNotImplementedr   r|   r   r`   r   r   ro   otherr-   r-   r.   __eq__     




zExample.__eq__c                 C   s   t | j| j| j| j| jfS rq   )hashr   r|   r   r`   r   r   r-   r-   r.   __hash__  s   zExample.__hash__)Nr"   r"   N)r7   ru   rv   r   r   r   r-   r-   r-   r.   r     s    "
r   c                   @   s6   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 rq   )examples	docstringcopyr2   r,   rV   r   )ro   r   r2   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   )ro   r   r-   r-   r.   __repr__  s   zDocTest.__repr__c                 C   r   rq   )r   r   r   r   r2   r,   rV   r   r   r-   r-   r.   r   *  r   zDocTest.__eq__c                 C      t | j| j| j| jfS rq   )r   r   r,   rV   r   r   r-   r-   r.   r   5  s   zDocTest.__hash__c                 C   s:   t |tstS | j| j| jt| f|j|j|jt|fk S rq   )r:   r   r   r,   rV   r   idr   r-   r-   r.   __lt__9  s
   
zDocTest.__lt__N)r7   ru   rv   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rd fdd|dD }g }d\}}| j|D ]M}||||   ||d|| 7 }| 	|||\}}}	}
| 
|se|t||	|
| t|d |d ||d| | 7 }| }q)|||d   |S )Nr"   rm   c                       g | ]}| d  qS rq   r-   .0lZ
min_indentr-   r.   
<listcomp>      z'DocTestParser.parse.<locals>.<listcomp>r"   r"   r`   )r   r`   r   )
expandtabs_min_indentr   ry   _EXAMPLE_REfinditerappendr   count_parse_example_IS_BLANK_OR_COMMENTr   r*   groupr   )ro   stringr,   outputZcharnor   mr   r   r|   r   r-   r   r.   parset  s,   



zDocTestParser.parsec                 C   s   	 t | |||||||S rq   )r   get_examples)ro   r   r2   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   )ro   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rOtd
|d rO|d= | |d  ||t |  d fdd|D }| j|}|rw|d}nd }| 	|||}	||	||fS )Nr`   r   rm   r'   r\   r   c                    s   g | ]
}| d  d qS )r[   Nr-   )r   slr`   r-   r.   r     s    z0DocTestParser._parse_example.<locals>.<listcomp>r|   z *$rw   c                    r   rq   r-   )r   Zwlr   r-   r.   r     r   r   )
r*   r   ry   _check_prompt_blank_check_prefixr   r]   match_EXCEPTION_RE_find_options)
ro   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 ];}|ddd }|D ]+}|d dvs(|dd  tvr3td|d ||f t|dd   }|d dk||< qq	|rU| |rUt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   replacery   r(   r   r   )	ro   r   r,   r   r   r   option_stringsoptionflagr-   r-   r.   r     s$   zDocTestParser._find_optionsz^([ ]*)(?=\S)c                 C   s0   	 dd | j |D }t|dkrt|S dS )Nc                 S      g | ]}t |qS r-   )r*   )r   r`   r-   r-   r.   r         z-DocTestParser._min_indent.<locals>.<listcomp>r"   )
_INDENT_REfindallr*   min)ro   r_   indentsr-   r-   r.   r   	  s
   zDocTestParser._min_indentc              	   C   s`   	 t |D ](\}}t||d kr-||d  dkr-td|| d ||||d  |f qd S )Nr[   rK   r\   z8line %r of the docstring for %s lacks blank after %s: %rr'   )	enumerater*   r   )ro   linesr`   r,   r   r   r   r-   r-   r.   r     s    z!DocTestParser._check_prompt_blankc                 C   s@   	 t |D ]\}}|r||std|| d ||f qd S )NzGline %r of the docstring for %s has inconsistent leading whitespace: %rr'   )r   rz   r   )ro   r   prefixr,   r   r   r   r-   r-   r.   r     s   zDocTestParser._check_prefixN)r   )r7   ru   rv   r]   compile	MULTILINEVERBOSEr   DOTALLr   r   r   r   r   r   r   r   r   r   r   r   r   r-   r-   r-   r.   r   D  s*    

'
3r   c                   @   sT   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d Z
dS )r   FTc                 C   s   	 || _ || _|| _|| _d S rq   )_parser_verbose_recurse_exclude_empty)ro   verboseparserrecurseexclude_emptyr-   r-   r.   r   8  s
   
zDocTestFinder.__init__Nc           	   	   C   sJ  	 |d u rt |dd }|d u rtdt|f |du rd }n	|d u r(t|}zt|}W n ty:   d }Y n2w |sPt|}|d |dd   dksPd }|d u rWd }n|d urct	||j
}nt	|}|sld }|d u r}|d u rwi }n
|j
 }n| }|d ur|| d|vrd|d< g }| ||||||i  |  |S )Nr7   zJDocTestFinder.find: name must be given when obj.__name__ doesn't exist: %rFr"   z<]>r   )r1   r   r   r8   	getmoduleZgetsourcefilerC   Zgetfile	linecachegetlines__dict__r   update_findsort)	ro   objr,   rD   r2   
extraglobsrb   r   testsr-   r-   r.   r{   N  sN   #



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r8|j}ndS |j	|kS t 
|rJ|j	|jkS t|drU|j	|jkS t|tr\dS td)NT__objclass__ru   z"object must be a class or function)r8   r  
isfunctionr  __globals__ZismethoddescriptorrS   r  ru   r7   isclassr:   propertyr   )ro   rD   objectZobj_modr-   r-   r.   _from_module  s*   








zDocTestFinder._from_modulec                 C   s2   	 |}zt |}W n	 ty   Y nw t |S rq   )r8   unwrapr   	isroutine)ro   r  Zmaybe_routiner-   r-   r.   _is_routine  s   
zDocTestFinder._is_routinec              
   C   s  	 | j r
td|  t||v rd S d|t|< | |||||}|d ur*|| t|r]| jr]|j	 D ]%\}	}
d||	f }	| 
|
sKt|
r\| ||
r\| ||
|	|||| q7t|r| jrt|di 	 D ]@\}	}
t|	tstdt|	f t|
st|
st|
st|
tstdt|
f d||	f }	| ||
|	|||| qmt|r| jr|j	 D ]8\}	}
t|
ttfr|
j}
t|
st|
st|
tr| ||
rd||	f }	| ||
|	|||| qd S d S d 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  itemsr  r  r  r  r1   r:   r;   r   r   r  staticmethodclassmethod__func__r  )ro   r
  r  r,   rD   r   r2   seentestZvalnamevalr-   r-   r.   r    sj   



zDocTestFinder._findc           	   	   C   s   	 t |tr	|}n$z|jd u rd}n|j}t |tst|}W n ttfy,   d}Y nw | ||}| jr:|s:d S |d u rAd }nt|dd pI|j}|dd  dkrX|d d }| j	
|||||S )Nr   r   .pycrw   )r:   r;   __doc__rC   rR   _find_linenor   r1   r7   r   r   )	ro   r  r,   rD   r2   r   r   r   rV   r-   r-   r.   r    s0   



zDocTestFinder._get_testc                 C   s6  	 d }t |dd }t|r|d urd}t|r@|d ur@|d u r#d S tdt |dd }t|D ]\}}||r?|} nq2t|rH|j	}t
|rVt |dd rV|j}t|r^|j}t|rf|j}t|rst |dd d }|d ur|d u r|d S td}t|t|D ]}||| r|  S qd S )	Nr!  r"   z^\s*class\s*%s\br7   -co_firstlinenor'   z(^|.*:)\s*\w*("|\'))r1   r8   r9   r  r]   r   r   r   Zismethodr  r  __code__Zistracebacktb_frameZisframef_codeZiscoderanger*   )ro   r  r   r   r   patr   r   r-   r-   r.   r"  >  s@   



zDocTestFinder._find_linenoNNNN)r7   ru   rv   r   r   r{   r  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   sP   	 |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)ro   checkerr   r-  r-   r-   r.   r     s   
zDocTestRunner.__init__c                 C   sP   	 | j r&|jr|dt|j d t|j  d S |dt|j d  d S d S )NzTrying:
zExpecting:
zExpecting nothing
)r   r|   ra   r   )ro   r   r  exampler-   r-   r.   report_start  s   

zDocTestRunner.report_startc                 C   s   	 | j r
|d d S d S )Nzok
)r   ro   r   r  r4  r}   r-   r-   r.   report_success  s   zDocTestRunner.report_successc                 C   s(   	 ||  ||| j||| j  d S rq   )_failure_headerr,  output_differencer-  r6  r-   r-   r.   report_failure  s   
zDocTestRunner.report_failurec                 C   s&   	 ||  ||d tt|  d S )NzException raised:
)r8  ra   rj   ro   r   r  r4  rf   r-   r-   r.   report_unexpected_exception  s   

z)DocTestRunner.report_unexpected_exceptionc                 C   s   | j g}|jr)|jd ur|jd ur|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:rm   )DIVIDERrV   r   r   r,   r   ra   r   )ro   r  r4  r   r   r   r-   r-   r.   r8    s   

zDocTestRunner._failure_headerc              	   C   sj  	 d }}| j }td\}}}	| jj}
t|jD ]\}}| j t@ o%|dk}|| _ |jrH|j D ]\}}|r?|  j |O  _ q1|  j | M  _ q1| j t	@ rNq|d7 }|s[| 
||| d|j|f }ztt|j|d|d|j | j  d }W n ty       t }| j  Y | j }| jd |}|d u r|
|j|| j r|}n9tj|d d  d }|s|t|7 }|jd u r|	}n|
|j|| j r|}n| j t@ r|
t|jt|| j r|}||u r|s| |||| n)||u r|s|  |||| |d7 }n||	u r|s| !|||| |d7 }|r%| j t"@ r% nq|| _ | #||| t$||S )	Nr"   rK   r'   z<doctest %s[%d]>ZsingleTr5   rw   )%r-  r(  r,  check_outputr   r   r   r   r  r   r5  r,   execr   r   r2   debuggerr   KeyboardInterruptr?   rf   r2  re   rs   r|   rc   format_exception_onlyrj   r   r   r   r7  r:  r<  r   _DocTestRunner__record_outcomer&   )ro   r  compileflagsr   r0  r/  r.  SUCCESSFAILUREZBOOMcheck
examplenumr4  quietZ
optionflagr  rV   	exceptionr}   outcomer   r-   r-   r.   Z__run  s   












zDocTestRunner.__runc                 C   sN   	 | j |jd\}}|| || f| j |j< |  j|7  _|  j|7  _d S )Nr   )r1  r0   r,   r0  r/  )ro   r  rY   tf2t2r-   r-   r.   Z__record_outcome  s
   zDocTestRunner.__record_outcomez.<doctest (?P<name>.+)\[(?P<examplenum>\d+)\]>$c                 C   sR   | j |}|r#|d| jjkr#| jjt|d }|jjddS | 	||S )Nr,   rI  Tkeepends)
%_DocTestRunner__LINECACHE_FILENAME_REr   r   r  r,   r   intr   
splitlinessave_linecache_getlines)ro   rV   module_globalsr   r4  r-   r-   r.   Z__patched_linecache_getlines  s
   z*DocTestRunner.__patched_linecache_getlinesTc           	   	      s@  	 || _ |d u rt|j}tj|d u r,j  d u s!  dkr%j}n fdd}| jt_t	 }t
j}t| _| j  | jjt
_tj| _| jt_tj}tjt_z)| |||W t_|t
_t| | jt_|t_|r~|j  dd l}d |_S S t_|t
_t| | jt_|t_|r|j  dd l}d |_w )Nutf-8c                    s    t |  d } |  d S )Nbackslashreplace)r;   encodewrite)r_   rN   r   r-   r.   r     s   zDocTestRunner.run.<locals>.outr"   )r  r4   r2   r?   r   rN   lowerrZ  r2  gettracer   r   r   rA  resetr  r  rU  *_DocTestRunner__patched_linecache_getlinesdisplayhook__displayhook___DocTestRunner__runsettraceclearbuiltins_)	ro   r  rE  r   clear_globsZ
save_traceZsave_set_traceZsave_displayhookre  r-   r[  r.   run  sR   







zDocTestRunner.runc                 C   s  	 |d u r| j }g }g }g }d }}| j D ]+}|\}\}	}
||
7 }||	7 }|
dkr1|| q|	dkr=|||
f q|| q|rx|r\tt|d |  |D ]}td| qT|rxtt|d |  |D ]\}}td||f  qk|rt| j tt|d |  |D ]\}\}	}
td|	|
|f  q|rt|dt| jd	 t|| d
|d |rt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   r1  r  r   r  r*   r  r>  r&   )ro   r   ZnotestsZpassedZfailedZtotaltZtotalfr   r,   rY   rM  thingr   r-   r-   r.   	summarize  sR   


zDocTestRunner.summarizec                 C   sR   | j }|j  D ]\}\}}||v r || \}}|| }|| }||f||< qd S rq   )r1  r  )ro   r   dr,   rY   rM  rN  rO  r-   r-   r.   merge!  s   zDocTestRunner.merge)NNr"   rq   NNT)r7   ru   rv   r>  r   r5  r7  r:  r<  r8  rb  rD  r]   r   rR  r_  rh  rj  rl  r-   r-   r-   r.   r   v  s     9
$}




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ASCIIrX  )r;   rY  )ro   r_   r-   r-   r.   _toAscii6  s   zOutputChecker._toAsciic                 C   s   	 |  |}|  |}||krdS |t@ s%||fdkrdS ||fdkr%dS |t@ sBtdtt d|}tdd|}||krBdS |t@ rZd|	 }d|	 }||krZdS |t
@ ret||redS dS )	NT)zTrue
z1
)zFalse
z0
z(?m)^%s\s*?$r   z(?m)^[^\S\n]+$r\   F)ro  r   r   r]   r^   escapeBLANKLINE_MARKERr   r   ry   r   r   ro   r|   r}   r-  r-   r-   r.   r?  <  s4   


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 )NFTrm   r5   )r	   r
   r   r   rr  r-   r-   r.   _do_a_fancy_diff{  s   zOutputChecker._do_a_fancy_diffc           
      C   s   	 |j }|t@ stdt|}| |||rp|jdd}|jdd}|t@ r9tj	||dd}t
|dd  }d}n,|t@ rPtj||dd}t
|dd  }d}n|t@ retjtjd}	t
|	||}d	}d
| td| S |r~|r~dt|t|f S |rdt| S |rdt| S dS )Nz(?m)^[ ]*(?=
)TrP  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^   rq  rs  rT  r	   difflibZunified_difflistr
   Zcontext_diffr   ZDifferZIS_CHARACTER_JUNKZcomparera   r   )
ro   r4  r}   r-  r|   r   Z	got_linesdiffkindZenginer-   r-   r.   r9    s6   zOutputChecker.output_differenceN)r7   ru   rv   ro  r?  rs  r9  r-   r-   r-   r.   r   .  s    ?r   c                   @      e Zd Z	 dd Zdd ZdS )r   c                 C      || _ || _|| _d S rq   )r  r4  r}   )ro   r  r4  r}   r-   r-   r.   r        
zDocTestFailure.__init__c                 C   
   t | jS rq   r;   r  r   r-   r-   r.   __str__     
zDocTestFailure.__str__Nr7   ru   rv   r   r~  r-   r-   r-   r.   r         
r   c                   @   ry  )r   c                 C   rz  rq   )r  r4  rf   )ro   r  r4  rf   r-   r-   r.   r     r{  zUnexpectedException.__init__c                 C   r|  rq   r}  r   r-   r-   r.   r~    r  zUnexpectedException.__str__Nr  r-   r-   r-   r.   r     r  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   rh  r2   rd  )ro   r  rE  r   rg  rr-   r-   r.   rh  A  s   
zDebugRunner.runc                 C      t |||rq   )r   r;  r-   r-   r.   r<  G     z'DebugRunner.report_unexpected_exceptionc                 C   r  rq   )r   r6  r-   r-   r.   r:  J  r  zDebugRunner.report_failurerm  )r7   ru   rv   rh  r<  r:  r-   r-   r-   r.   r     s
    
Zr   TFc	                 C   s   	 | d u rt jd} t| std| f |d u r| j}t|d}	|r,t||d}
nt	||d}
|	j
| |||dD ]}|
| q;|rI|
  td u rP|
ant|
 t|
j|
jS )Nr   ztestmod: module required; %r)r   r   r-  r2   r	  )r?   r@   r0   r8   r9   rC   r7   r   r   r   r{   rh  rj  masterrl  r&   r0  r/  )r   r,   r2   r   reportr-  r	  raise_on_errorr   finderrunnerr  r-   r-   r.   r   V  s&   B


r   c                 C   s   	 |r	|s	t dt| |||pd\}} |d u rtj| }|d u r%i }n| }|d ur2|| d|vr:d|d< |	rCt||d}nt||d}|
	|||| d}|
| |r]|  td u rd|ant| t|j|jS )N8Package may only be specified for module-relative paths.rW  r7   r   r  r"   )r   rZ   r   r   basenamer   r  r   r   r   rh  rj  r  rl  r&   r0  r/  )rV   rX   r,   rW   r2   r   r  r-  r	  r  r   rN   textr  r  r-   r-   r.   r     s4   N


r   NoNamec           	      C   sB   	 t |dd}t||d}|j| ||dD ]	}|j||d qd S )NF)r   r   r  )r2   )rE  )r   r   r{   rh  )	rY   r2   r   r,   rE  r-  r  r  r  r-   r-   r.   r   9  s   r   c                 C   s$   	 | t @ | krtd| t}| a|S )NzOnly reporting flags allowed)r   r   _unittest_reportflags)r3   oldr-   r-   r.   r   V  s   
r   c                   @   sp   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 rq   )unittestTestCaser   _dt_optionflags_dt_checkerr2   r   	_dt_globs_dt_test	_dt_setUp_dt_tearDown)ro   r  r-  setUptearDownr3  r-   r-   r.   r   |  s   
zDocTestCase.__init__c                 C   s"   | j }| jd ur| | d S d S rq   )r  r  ro   r  r-   r-   r.   r    s   
zDocTestCase.setUpc                 C   s6   | j }| jd ur| | |j  |j| j d S rq   )r  r  r2   rd  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_w |r@| | | d S )NFr-  r3  r   zF----------------------------------------------------------------------)r   rg  )r  r?   r   r#   r  r   r  r   r  r>  rh  rZ  ZfailureExceptionformat_failurere   )ro   r  r  newr-  r  r0  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   rw   z:Failed doctest test for %s
  File "%s", line %s, in %s

%s)r  r   r   r,   ry   rV   )ro   errr  r   Zlnamer-   r-   r.   r    s   

zDocTestCase.format_failurec                 C   s8   	 |    t| j| jdd}|j| jdd |   d S )NFr  )rg  )r  r   r  r  rh  r  r  )ro   r  r-   r-   r.   r!     s   AzDocTestCase.debugc                 C      | j jS rq   r  r,   r   r-   r-   r.   r   	     zDocTestCase.idc                 C   sP   t | t |ur
tS | j|jko'| j|jko'| j|jko'| j|jko'| j|jkS rq   )r   r   r  r  r  r  r  r   r-   r-   r.   r   	  s   



zDocTestCase.__eq__c                 C   r   rq   )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)rw   )r  r,   ry   r   )ro   r,   r-   r-   r.   r   	  s   zDocTestCase.__repr__c                 C   s   d| j j S )Nz	Doctest: r  r   r-   r-   r.   shortDescription	  r  zDocTestCase.shortDescription)r"   NNN)r7   ru   rv   r   r  r  r  r  r!   r   r   r   r   r  r~  r  r-   r-   r-   r.   r  z  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 rq   )rD   r  r   )ro   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      d S rq   r-   r   r-   r-   r.   	test_skip%	     zSkipDocTestCase.test_skipc                 C   s   d| j j S )NzSkipping tests from %s)rD   r7   r   r-   r-   r.   r  (	  r  z SkipDocTestCase.shortDescriptionN)r7   ru   rv   r   r  r  r  r~  r-   r-   r-   r.   r  	  s    r  c                   @   s   e Zd Zdd ZdS )_DocTestSuitec                 C   r  rq   r-   )ro   indexr-   r-   r.   _removeTestAtIndex0	  r  z _DocTestSuite._removeTestAtIndexN)r7   ru   rv   r  r-   r-   r-   r.   r  .	  s    r  c           	      K   s   	 |d u rt  }t| } |j| ||d}|s(tjjdkr(t }|t|  |S |	  t }|D ],}t
|jdkr;q1|jsR| j}|dd  dkrO|d d }||_|t|fi | q1|S )Nr  r5   r"   r  r   rw   )r   rF   r{   r?   r3   optimizer  addTestr  r  r*   r   rV   r   r  )	rD   r2   r	  Ztest_finderr   r
  suiter  rV   r-   r-   r.   r   4	  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 )Nrf  r   )r   r  r,   ry   r   r-   r-   r.   r   v	  s   zDocFileCase.idc                 C   r  rq   )r  rV   r   r-   r-   r.   r   y	  r  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   )ro   r  r-   r-   r.   r  |	  s   zDocFileCase.format_failureN)r7   ru   rv   r   r   r  r-   r-   r-   r.   r  t	  s    r  c           
      K   sz   |d u ri }n|  }|r|stdt| |||pd\}} d|vr&| |d< tj| }||||| d}	t|	fi |S )Nr  rW  r   r"   )r   r   rZ   r   r   r  r   r  )
r   rX   rW   r2   r   rN   r   docr,   r  r-   r-   r.   DocFileTest	  s   r  c                  O   sJ   	 t  }|ddrt|d|d< | D ]}|t|fi | q|S )NrX   TrW   )r  r0   rF   r  r  )pathskwr  r   r-   r-   r.   r   	  s   7r   c                 C   s   	 g }t  | D ]<}t|tr5||jd d  |j}|r4|d |dd |dd d D 7 }q	|dd |dd d D 7 }q	|rZ|d dkrZ|  |rZ|d dksN|ro|d dkro|d |ro|d dksbd	|d S )	Nrw   z# Expected:c                 S   s   g | ]}d | qS )z## r-   r   r-   r-   r.   r   '
  r   z(script_from_examples.<locals>.<listcomp>rm   c                 S   r   r-   )r   r   r-   r-   r.   r   *
  s    r   r"   )
r   r   r:   r   r   r   r|   ry   popr   )r_   r   Zpiecer|   r-   r-   r.   r   	  s(   9

 

r   c                    sL   	 t | } t | } fdd|D }|st d|d }t|j}|S )Nc                    s   g | ]	}|j  kr|qS r-   r+   )r   rM  r+   r-   r.   r   ?
  s    ztestsource.<locals>.<listcomp>znot found in testsr"   )rF   r   r{   r   r   r   )rD   r,   r
  r  testsrcr-   r+   r.   r   6
  s   

r   c                 C   s   	 t | }t||| d S rq   )r   debug_script)srcpmr2   r  r-   r-   r.   r    F
  s   r    c                 C   s   	 dd l }|r| }ni }|r<z	t| || W d S    tt d  |jdd}|  |d t d  Y d S |jdd	d|  || d S )Nr"   r'   T)r   r5   zexec(%r))
r   r   r@  r  r?   rf   r   r^  Zinteractionrh  )r  r  r2   r   pr-   r-   r.   r  K
  s   
r  c                 C   s&   	 t | } t| |}t||| j d S rq   )rF   r   r  r  )rD   r,   r  r  r-   r-   r.   r!   _
  s   
r!   c                   @   s&   e Zd Z	 dd Zdd Zdd ZdS )
_TestClassc                 C   s   	 || _ d S rq   r  )ro   r  r-   r-   r.   r   {
  s   
z_TestClass.__init__c                 C   s   	 | j d | _ | S )Nr5   r  r   r-   r-   r.   square
  s   z_TestClass.squarec                 C   s   	 | j S rq   r  r   r-   r-   r.   r0   
  s   z_TestClass.getN)r7   ru   rv   r   r  r0   r-   r-   r-   r.   r  m
  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 }qA|j	rQ|t
O }|D ];}|drtj|\}}tjd| t|d d }	tjd= t|	||d\}
}n
t|d||d\}
}|
r dS qSd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.pyr  )rX   r   r-  r'   )argparseArgumentParseradd_argumentr(   keys
parse_argsrb   r   r   Z	fail_fastr   rn   r   r   ry   r?   insertr<   r   r   )r  r   r   Z	testfilesr   r   r   rV   dirnamer   r0  rf  r-   r-   r.   _test
  sJ   




r  r   )r5   )r[   )	NNNNTr"   NFF)Fr  Nr"   r*  )FN)F)SZ__docformat____all__r/   ru  r8   r  r   r   r]   r?   rc   r  ior#   r$   collectionsr%   r&   r(   r   r   r   r   r   r   r   r   r	   r
   r   r   r   r   rq  rx   r4   rF   rJ   rZ   ra   rj   rk   r   r   r   r   r   rO   r   r   r   r   r   r   	Exceptionr   r   r   r  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>   s   '-


1%.DK l  I   ; n
h
{
$ $
@
IR


,	3
-