B
    u9a                 @   s  d Z ddlmZ ddlm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mZmZmZmZ ddlmZ ddlZddlZedd	d
gZeddddgZeddddgZG dd dejZG dd dejZdZdZedeeeef ZG dd dZ G dd de ejZ!G dd de ejZ"G d d! d!ejZ#G d"d# d#ejZ$G d$d% d%ejZ%G d&d' d'ejZ&G d(d) d)ejZ'G d*d+ d+ejZ(e)d,kre*  dS )-zTest cases for traceback module    )
namedtuple)StringION)support)TESTFNErrorcaptured_outputunlinkcpython_only)assert_python_okcodeco_filenameco_nameframef_code	f_globalsf_localstbtb_frame	tb_linenotb_nextc               @   s   e Z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dd Zdd Zdd Zejdd Zdd ZdS )TracebackCasesc          
   C   sB   y
|  W n* |k
r4 } zt ||S d }~X Y n
X tdd S )Nzcall did not raise exception)	tracebackformat_exception_only
ValueError)selffuncexcvalue r   $/usr/lib/python3.7/test_traceback.pyget_exception_format   s
    
z#TracebackCases.get_exception_formatc             C   s   t ddd d S )Nzdef fact(x):
	return x!
?exec)compile)r   r   r   r   syntax_error_with_caret"   s    z&TracebackCases.syntax_error_with_caretc             C   s   t ddd d S )Nz1 +
r!   r"   )r#   )r   r   r   r   syntax_error_with_caret_2%   s    z(TracebackCases.syntax_error_with_caret_2c             C   s   t ddd d S )Nz def spam():
  print(1)
 print(2)r!   r"   )r#   )r   r   r   r   syntax_error_bad_indentation(   s    z+TracebackCases.syntax_error_bad_indentationc             C   s   t ddd d S )Nu   Python = "Ṕýţĥòñ" +r!   r"   )r#   )r   r   r   r   !syntax_error_with_caret_non_ascii+   s    z0TracebackCases.syntax_error_with_caret_non_asciic             C   s   t ddd d S )Nz	 print(2)r!   r"   )r#   )r   r   r   r   syntax_error_bad_indentation2.   s    z,TracebackCases.syntax_error_bad_indentation2c             C   s  |  | jt}| t|d | |d  dk | d|d  | |d d|d d |  | j	t}| d|d  | |d 
dd | |d d|d d |  | jt}| d|d  | |d 
dd | |d d|d d d S )	N      z	return x!^   !
+)r    r$   SyntaxErrorassertEquallen
assertTruestripassertInfindr%   countr'   )r   errr   r   r   
test_caret1   s       zTracebackCases.test_caretc             C   s>   t dd}tt |}| t|d | |d  d d S )Nerror)zx.py   Nz
bad syntax   r*   z
bad syntax)r0   r   r   r1   r2   r4   )r   r   r8   r   r   r   test_nocaretE   s    
zTracebackCases.test_nocaretc             C   s   |  | jt}| t|d | |d  d | d|d  | |d d|d d |  | jt}| t|d | |d  d | d|d  | |d d|d d d S )Nr)   r*   zprint(2)r+   r,   )p)	r    r&   IndentationErrorr1   r2   r4   r5   r6   r(   )r   r8   r   r   r   test_bad_indentationK   s     z#TracebackCases.test_bad_indentationc             C   s&   t  }t|j|}| |dg d S )NzKeyboardInterrupt
)KeyboardInterruptr   r   	__class__r1   )r   eZlstr   r   r   test_base_exceptionZ   s    z"TracebackCases.test_base_exceptionc             C   sx   G dd dt }t|| }| t|d d|j }|jdkrJ|j}nd|j|jg}| |d d||f  d S )	Nc               @   s   e Zd Zdd ZdS )z?TracebackCases.test_format_exception_only_bad__str__.<locals>.Xc             S   s   dd  d S )Nr*   r   r   )r   r   r   r   __str__b   s    zGTracebackCases.test_format_exception_only_bad__str__.<locals>.X.__str__N)__name__
__module____qualname__rF   r   r   r   r   Xa   s   rJ   r*   z<unprintable %s object>)__main__builtins.r   z%s: %s
)		Exceptionr   r   r1   r2   rG   rH   rI   join)r   rJ   r8   Z	str_valueZstr_namer   r   r   %test_format_exception_only_bad__str__`   s    

z4TracebackCases.test_format_exception_only_bad__str__c       	         s   dd l }dd ldd ldd l}jjddgjjd}| \}}t	|d
 d   fdd}|dd	dd
 xhdD ]`}|dkrd	}n|dkrd}nd}|d|||d |d|||d |d|||d qW |dddd d S )Nr   z-cz&import sys; print(sys.stdout.encoding))stdoutstderrasciic          	      s  zdt td|d}|d| | W d Q R X jjtgjjd}| \}}|	 
 }W d tt X | d}|	 }	d|	}
d|	}d| |d	 d
|d	 | |d |
d|d |
 |d |kd|d | d S )Nw)encodingz}{0}if 1:
                        import traceback;
                        raise RuntimeError('{1}')
                        )rQ   rR   backslashreplacezraise RuntimeError('{0}')zRuntimeError: {0}zline %sr*   z)Invalid line number: {0!r} instead of {1}r,   z.Invalid traceback line: {0!r} instead of {1!r}r<   z-Invalid error message: {0!r} instead of {1!r})openr   writeformatPopen
executablePIPESTDOUTcommunicatedecode
splitlinesr   encoder5   r3   endswith)Z
firstlinesmessagecharsetlinenooutputprocessrQ   rR   Zencoded_messageZmessage_asciiZerr_lineZerr_msg)output_encodingr   
subprocesssysr   r   do_test}   s.    



z1TracebackCases.test_encoded_file.<locals>.do_test foor<   )rS   z
iso-8859-1zutf-8GBKrn   u   丂儀u   hé hoz# coding: {0}
r)   z#!shebang
# coding: {0}
   z 	
# coding: {0}
zx=0
# coding: GBK
zutf-8)tempfilerj   ri   osrZ   r[   r\   r]   r^   strr`   rY   )	r   rp   rq   rg   rQ   rR   rk   rd   textr   )rh   r   ri   rj   r   test_encoded_filem   s,     

#





z TracebackCases.test_encoded_filec             C   s8   t d}td|\}}}dddg}| | | d S )Na%  
            import sys
            import traceback

            class PrintExceptionAtExit(object):
                def __init__(self):
                    try:
                        x = 1 / 0
                    except Exception:
                        self.exc_info = sys.exc_info()
                        # self.exc_info[1] (traceback) contains frames:
                        # explicitly clear the reference to self in the current
                        # frame to break a reference cycle
                        self = None

                def __del__(self):
                    traceback.print_exception(*self.exc_info)

            # Keep a reference in the module namespace to call the destructor
            # when the module is unloaded
            obj = PrintExceptionAtExit()
        z-cs"   Traceback (most recent call last):s&     File "<string>", line 8, in __init__s#   ZeroDivisionError: division by zero)textwrapdedentr
   r1   r`   )r   r   ZrcrQ   rR   expectedr   r   r   test_print_traceback_at_exit   s    z+TracebackCases.test_print_traceback_at_exitc             C   s0   t  }tjttdd |d | | d d S )NZ	projector)filezException: projector
)r   r   print_exceptionrN   r1   getvalue)r   rf   r   r   r   test_print_exception   s    z#TracebackCases.test_print_exceptionN)rG   rH   rI   r    r$   r%   r&   r'   r(   r9   r=   rA   rE   rP   rt   r   Zrequires_type_collectingrx   r|   r   r   r   r   r      s   D r   c               @   sr   e Zd Zdd ZedddZdd Zdd	 Zd
d Zdd Z	dd Z
dd Zedd Zdd Zedd ZdS )TracebackFormatTestsc             C   s   t dd S )NZblah)KeyError)r   r   r   r   some_exception   s    z#TracebackFormatTests.some_exceptionNc             C   s  ddl m} y|   W n tk
r   t \}}}|d k	rH||j ddt	| }t
 }||| | }td}	t| W d Q R X t
 }
tj||
d td}t  W d Q R X t }t
 }tj|d Y n
X td| || | |	 |
  | | |  | ||  | }| t|d |d }|d	d  \}}| |d
 | |d | |d d S )Nr   )traceback_printz#Traceback (most recent call last):
rl   rR   )ry   z&unable to create test traceback stringro   	Tracebackz  Filez	    raise)	_testcapir   r   r~   rj   exc_infor   rO   r   	format_tbr   r{   r   print_tb	print_exc
format_excr   r1   r`   r2   r3   
startswith)r   Zcleanup_funcr   type_r   r   Ztraceback_fmtZfile_Z
python_fmtZtbstderrZtbfileZ	excstderrZexcfmtZexcfileZtb_linesZbannerlocationZsource_liner   r   r   check_traceback_format   sB    



z+TracebackFormatTests.check_traceback_formatc             C   s   |    d S )N)r   )r   r   r   r   test_traceback_format  s    z*TracebackFormatTests.test_traceback_formatc             C   s   dd }|  | d S )Nc             S   s   | j   d S )N)r   clear)r   r   r   r   
cleanup_tb  s    zRTracebackFormatTests.test_traceback_format_with_cleared_frames.<locals>.cleanup_tb)r   )r   r   r   r   r   )test_traceback_format_with_cleared_frames  s    z>TracebackFormatTests.test_traceback_format_with_cleared_framesc          	   C   s|   t d}ttd W d Q R X t }tjtd|d | | |  ttd}| | d	| d S )NrR   r*   )ry   rl   )
r   r   print_stackrj   	_getframer   r1   r{   format_stackrO   )r   ZststderrZstfileZstfmtr   r   r   test_stack_format  s    
z&TracebackFormatTests.test_stack_formatc          	   C   sj   dd }t d}|  W d Q R X |jj}| |  dd  dt|d f ddt|d	 f d
g d S )Nc               S   s   t   d S )N)r   r   r   r   r   r   prn"  s    z2TracebackFormatTests.test_print_stack.<locals>.prnrR   z)  File "%s", line %d, in test_print_stackr<   z	    prn()z  File "%s", line %d, in prnr*   z    traceback.print_stack())r   __code__co_firstlinenor1   r{   r`   __file__)r   r   rR   re   r   r   r   test_print_stack!  s    
z%TracebackFormatTests.test_print_stackc                s  d | _  fdd tdD}y
   W n( tk
rN } z
|  W d d }~X Y nX | d W d Q R X  jj}dt d|d  dt d|d	  d
t d|d	  d
t d|d	  d}| }|  }| 	|d d |d d  | 
|d |d  | |d |d  t }| ttd|d  t|d | d(fdd	tdF}	y
  W n* tk
r } z
|  W d d }~X Y nX | d W d Q R X jj}
dt d|
d  dt d|
d  dt d|
d  dt d|
d  d}dt d|
d  d}||  }|	  }| 	|| d)fdd	tdF}y
  W n* tk
rt } z
|  W d d }~X Y nX | d W d Q R X jj}dt d|d  dt d|d  dt d|d  dt d|d  d t d|d  d!}||  }|  }| 	|| tdJ}	ytj W n* tk
rN } z
|  W d d }~X Y nX | d" W d Q R X dt d|
d  dt d|
d  dt d|
d  dt d|
d  d}dt d|
d#  d$}||  }|	  }| 	|| tdN}	ytjd	  W n* tk
r* } z
|  W d d }~X Y nX | d" W d Q R X dt d|
d  dt d|
d  dt d|
d  d%t d|
d  d}dt d|
d&  d'}||  }|	  }| 	|| d S )*Nc                  s
      d S )Nr   r   )fr   r   r   6  s    zBTracebackFormatTests._check_recursive_traceback_display.<locals>.frR   zno recursion occurredz+Traceback (most recent call last):
  File "z", line ro   z8, in _check_recursive_traceback_display
    f()
  File "r*   z, in f
    f()
  File "zn, in f
    f()
  \[Previous line repeated (\d+) more times\]
RecursionError: maximum recursion depth exceeded
r   z\d+<   
   c                s   | r | d S t d S )Nr*   )r   )r7   )gr   r   r   c  s    zBTracebackFormatTests._check_recursive_traceback_display.<locals>.gzno value error was raisedz  File "r,   z%, in g
    return g(count-1)
  File "zM, in g
    return g(count-1)
  [Previous line repeated 7 more times]
  File "r<   z', in g
    raise ValueError
ValueError
   z0, in _check_recursive_traceback_display
    g()
c                s   | r| d S    d S )Nr*   r   )r7   )r   hr   r   r     s    zBTracebackFormatTests._check_recursive_traceback_display.<locals>.hz8, in _check_recursive_traceback_display
    h()
  File "z%, in h
    return h(count-1)
  File "zM, in h
    return h(count-1)
  [Previous line repeated 7 more times]
  File "z, in h
    g()
zno error raisedG   zK, in _check_recursive_traceback_display
    g(traceback._RECURSIVE_CUTOFF)
zL, in g
    return g(count-1)
  [Previous line repeated 1 more time]
  File "c   zO, in _check_recursive_traceback_display
    g(traceback._RECURSIVE_CUTOFF + 1)
)r   )r   )ZmaxDiffr   RecursionErrorZfailr   r   r   r`   r{   r1   ZassertRegexr5   rj   getrecursionlimitintresearchgroupranger   r   _RECURSIVE_CUTOFF)r   
render_excstderr_fr   Zlineno_fZresult_frw   actualZ	rec_limitZstderr_gZlineno_gZresult_gZtb_lineZstderr_hZlineno_hZresult_hr   )r   r   r   r   "_check_recursive_traceback_display/  s    

F*

F

V
F
Fz7TracebackFormatTests._check_recursive_traceback_displayc             C   s   |  tj d S )N)r   r   r   )r   r   r   r   test_recursive_traceback_python  s    z4TracebackFormatTests.test_recursive_traceback_pythonc                s&   ddl m   fdd}| | d S )Nr   )exception_printc                 s   t  \} }} | d S )N)rj   r   )exc_type	exc_valueexc_tb)r   r   r   r     s    zRTracebackFormatTests.test_recursive_traceback_cpython_internal.<locals>.render_exc)r   r   r   )r   r   r   )r   r   )test_recursive_traceback_cpython_internal  s    z>TracebackFormatTests.test_recursive_traceback_cpython_internalc             C   sJ   dd }| }|j j}| |dd  dt|d f dt|d f g d S )Nc               S   s   t  S )N)r   r   r   r   r   r   fmt  s    z3TracebackFormatTests.test_format_stack.<locals>.fmtr   z>  File "%s", line %d, in test_format_stack
    result = fmt()
r,   zA  File "%s", line %d, in fmt
    return traceback.format_stack()
r*   )r   r   r1   r   )r   r   resultre   r   r   r   test_format_stack  s    z&TracebackFormatTests.test_format_stackc       
      C   s   ddl m} G dd dt}|d}|d}y
||W n@ |k
rv   y|W n" |k
rp   t \}}}Y nX Y nX td}|| W d Q R X |   }	| 	dt
|	 | 	t |	d	  | d
|	d  | d|	d  d S )Nr   )r   c               @   s   e Zd Zdd ZdS )zATracebackFormatTests.test_unhashable.<locals>.UnhashableExceptionc             S   s   dS )NTr   )r   otherr   r   r   __eq__  s    zHTracebackFormatTests.test_unhashable.<locals>.UnhashableException.__eq__N)rG   rH   rI   r   r   r   r   r   UnhashableException  s   r   ex1ex2rR      ro   zUnhashableException: ex2r<   zUnhashableException: ex1r   )r   r   rN   rj   r   r   r{   r4   r`   r1   r2   context_messager5   )
r   r   r   r   r   r   Zexc_valr   r   r   r   r   r   test_unhashable  s$    

z$TracebackFormatTests.test_unhashable)N)rG   rH   rI   r   r	   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r}      s   , 2r}   zG
The above exception was the direct cause of the following exception:

zF
During handling of the above exception, another exception occurred:

z(%s|%s)c               @   sd   e Z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dd Zdd ZdS )BaseExceptionReportingTestsc          
   C   s@   t |tr|S y
|  W n" tk
r: } z|S d }~X Y nX d S )N)
isinstancerN   )r   Zexception_or_callablerD   r   r   r   get_exception!  s    

z)BaseExceptionReportingTests.get_exceptionc             C   s   dd  d S )Nr*   r   r   )r   r   r   r   zero_div)  s    z$BaseExceptionReportingTests.zero_divc             C   sJ   |  }| |d d | d|d  | |d d|d  d S )Nz  Filez1/0 # In zero_divr   r   ZeroDivisionError)r`   r3   r   r5   )r   msglinesr   r   r   check_zero_div,  s    z*BaseExceptionReportingTests.check_zero_divc          
   C   s   ydd  W n& t k
r2 } z|}W d d }~X Y nX | | }| t|d | |d d | |d d | d|d  | |d d	 d S )
Nr*   r   r)   r   z  Filez1/0 # Markerr,   r<   r   )r   
get_reportr`   r1   r2   r3   r   r5   )r   _rD   r   r   r   r   test_simple2  s    z'BaseExceptionReportingTests.test_simplec                sj   fdd  fdd}t |}t|d |d t |d  d|d	  d S )
Nc           
      s:   y    W n( tk
r4 }  z
t| W d d } ~ X Y nX d S )N)r   r   r~   )rD   )r   r   r   inner_raise?  s    z;BaseExceptionReportingTests.test_cause.<locals>.inner_raisec                  s
      d S )Nr   r   )r   r   r   outer_raiseD  s    z;BaseExceptionReportingTests.test_cause.<locals>.outer_raiser<   r*   r   zinner_raise() # Markerr,   )
boundariessplitr   r1   r2   cause_messager   r5   )r   r   blocksr   )r   r   r   
test_cause>  s    z&BaseExceptionReportingTests.test_causec                sj   fdd  fdd}t |}t|d |d t |d  d|d	  d S )
Nc                  s*   y    W n tk
r$   tY nX d S )N)r   r   r~   r   )r   r   r   r   M  s    z=BaseExceptionReportingTests.test_context.<locals>.inner_raisec                  s
      d S )Nr   r   )r   r   r   r   R  s    z=BaseExceptionReportingTests.test_context.<locals>.outer_raiser<   r*   r   zinner_raise() # Markerr,   )r   r   r   r1   r2   r   r   r5   )r   r   r   r   )r   r   r   test_contextL  s    z(BaseExceptionReportingTests.test_contextc          
   C   s   y yt W n   td Y nX W n& tk
rF } z|}W d d }~X Y nX | | }| t|d | |d d | |d d | d|d  | |d d	 d S )
Nr)   r   r   r*   z  FilezZeroDivisionError from Noner,   r<   r   )	rN   r   r   r`   r1   r2   r3   r   r5   )r   r   rD   r   r   r   r   test_context_suppressionZ  s    z4BaseExceptionReportingTests.test_context_suppressionc                sj   fdd  fdd}t |}t|d |d t |d  d|d	  d S )
Nc           
      s\   y    W n& tk
r2 }  z| }W d d } ~ X Y nX yt W n tk
rV   t|Y nX d S )N)r   r   Zxyzzy	NameErrorr~   )Z_erD   )r   r   r   r   l  s    zGBaseExceptionReportingTests.test_cause_and_context.<locals>.inner_raisec                  s
      d S )Nr   r   )r   r   r   r   u  s    zGBaseExceptionReportingTests.test_cause_and_context.<locals>.outer_raiser<   r*   r   zinner_raise() # Markerr,   )r   r   r   r1   r2   r   r   r5   )r   r   r   r   )r   r   r   test_cause_and_contexti  s    	z2BaseExceptionReportingTests.test_cause_and_contextc                s   fdd  fdd}t |}t|d |d t d|d  d	|d  d
|d  |d  d S )Nc           
      sl   y>y    W n, tk
r: }  z| }t| W d d } ~ X Y nX W n( tk
rf }  z
|| W d d } ~ X Y nX d S )N)r   r   r~   )rD   z)r   r   r   r   ~  s    zEBaseExceptionReportingTests.test_cause_recursive.<locals>.inner_raisec                  s
      d S )Nr   r   )r   r   r   r     s    zEBaseExceptionReportingTests.test_cause_recursive.<locals>.outer_raiser<   r*   zraise KeyError from er   z1/0zinner_raise() # Markerr,   )	r   r   r   r1   r2   r   r5   ZassertNotInr   )r   r   r   r   )r   r   r   test_cause_recursive}  s    	z0BaseExceptionReportingTests.test_cause_recursivec             C   sP   dd }|  | }| |d d dd }|  | }| |d d d S )Nc               S   s   t ddd S )Nrl   )rl   r   ro   Zhello)r0   r   r   r   r   rD     s    zFBaseExceptionReportingTests.test_syntax_error_offset_at_eol.<locals>.er   z	        ^c               S   s   t d d S )Nzx = 5 | 4 |)r"   r   r   r   r   rD     s    z              ^)r   r`   r1   )r   rD   r   r   r   r   test_syntax_error_offset_at_eol  s    z;BaseExceptionReportingTests.test_syntax_error_offset_at_eolc             C   sj   |  td }| d| |  td}| d| |  t }| d| |  td}| d| d S )NzException: None
Nonez
Exception
rl   )r   rN   r5   )r   r8   r   r   r   test_message_none  s    z-BaseExceptionReportingTests.test_message_noneN)rG   rH   rI   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s   r   c               @   s   e Zd Zdd ZdS )PyExcReportingTestsc          	   C   s`   |  |}dtt|||j}td}tt|||j W d Q R X | |	 | |S )Nrl   rR   )
r   rO   r   format_exceptiontype__traceback__r   rz   r1   r{   )r   rD   sZsior   r   r   r     s    

zPyExcReportingTests.get_reportN)rG   rH   rI   r   r   r   r   r   r     s   r   c               @   s   e Zd Zedd ZdS )CExcReportingTestsc          	   C   s:   ddl m} | |}td}|| W d Q R X | S )Nr   )r   rR   )r   r   r   r   r{   )r   rD   r   r   r   r   r   r     s
    

zCExcReportingTests.get_reportN)rG   rH   rI   r	   r   r   r   r   r   r     s   r   c               @   sx   e Zd Z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dd Zdd Zdd Zdd ZdS )
LimitTestsze Tests for limit argument.
        It's enough to test extact_tb, extract_stack and format_exception c             C   s   t dd S )NzLast raised)rN   )r   r   r   r   last_raises1  s    zLimitTests.last_raises1c             C   s   |    d S )N)r   )r   r   r   r   last_raises2  s    zLimitTests.last_raises2c             C   s   |    d S )N)r   )r   r   r   r   last_raises3  s    zLimitTests.last_raises3c             C   s   |    d S )N)r   )r   r   r   r   last_raises4  s    zLimitTests.last_raises4c             C   s   |    d S )N)r   )r   r   r   r   last_raises5  s    zLimitTests.last_raises5c             C   s   t  S )N)rj   r   )r   r   r   r   last_returns_frame1  s    zLimitTests.last_returns_frame1c             C   s   |   S )N)r   )r   r   r   r   last_returns_frame2  s    zLimitTests.last_returns_frame2c             C   s   |   S )N)r   )r   r   r   r   last_returns_frame3  s    zLimitTests.last_returns_frame3c             C   s   |   S )N)r   )r   r   r   r   last_returns_frame4  s    zLimitTests.last_returns_frame4c             C   s   |   S )N)r   )r   r   r   r   last_returns_frame5  s    zLimitTests.last_returns_frame5c          	      sf      fdd}fdd}ttdd, | }t|d |dd	|d
d   ||dd	|dd  d |d
d	|d d  ||dd	|d d t|d d  |dd	g  t`|| |d dt_| |d
d   |dd	|dd   |dd	|d d  dt_| g  dt_| g  W d Q R X d S )Nc                 s   t j f| S )N)r   extract_stack)kwargs)r   r   r   extract  s    z.LimitTests.test_extract_stack.<locals>.extractc                sX     | d | |d |    | |d d  ||d d     t| t| d S )Nr*   )r1   r2   )r   rw   ignore)r   r   r   assertEqualExcept  s    $z8LimitTests.test_extract_stack.<locals>.assertEqualExcepttracebacklimiti  ro   r,   )limitr   d   iir*   r   r<   r   r   )r   r   	swap_attrrj   ZassertGreaterr2   r1   r   )r   r   r   nolimr   )r   r   r   test_extract_stack  s*    &zLimitTests.test_extract_stackc          	      sf  y|    W n" tk
r.   t \}} Y nX  fdd}ttdd | }| t|d | |dd|d d  | |dd| | |d	d|d	d   | |d
d| | |ddg  t`| | | dt_| | |d d  | |dd|d d  | |dd|dd   dt_| | g  dt_| | g  W d Q R X d S )Nc                 s   t j f| S )N)r   
extract_tb)r   )r   r   r   r     s    z+LimitTests.test_extract_tb.<locals>.extractr   i     r,   )r   r   r   ir   r<   r   r   )	r   rN   rj   r   r   r   r1   r2   r   )r   r   r   r   r   r   )r   r   test_extract_tb  s.    zLimitTests.test_extract_tbc          	      sj  y|    W n" tk
r.   t \ Y nX  fdd}ttdd | }| t|d | |dd|d d  | |dd| | |d	d|d	d   | |d
d| | |ddg  t`| | | dt_| | |d d  | |dd|d d  | |dd|dd   dt_| | g  dt_| | g  W d Q R X d S )Nc                 s   t j f| dd S )Nr*   r   )r   r   )r   )r   r   r   r   r   r   *  s    z1LimitTests.test_format_exception.<locals>.extractr   i  r   r,   )r   r   r   ir   r<   r   r   )	r   rN   rj   r   r   r   r1   r2   r   )r   r   r   r   )r   r   r   r   test_format_exception#  s.    z LimitTests.test_format_exceptionN)rG   rH   rI   __doc__r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s   r   c               @   s   e Zd Zdd Zdd ZdS )MiscTracebackCasesc                s   fdd} fdddd  y
|  W n   t  \}}}Y nX |jjjj}| t|jd t| | t|jd d S )	Nc                  s
      d S )Nr   r   )middler   r   outerG  s    z,MiscTracebackCases.test_clear.<locals>.outerc                  s
      d S )Nr   r   )innerr   r   r   I  s    z-MiscTracebackCases.test_clear.<locals>.middlec              S   s   d} dd  d S )Nr*   r   r   )ir   r   r   r  K  s    z,MiscTracebackCases.test_clear.<locals>.innerr*   r   )	rj   r   r   r   r1   r2   r   r   clear_frames)r   r   r   r   r   Zinner_framer   )r  r   r   
test_clearF  s    

zMiscTracebackCases.test_clearc             C   sJ   dd }| }|j j}| |dd  t|d ddft|d dd	fg d S )
Nc               S   s   t  S )N)r   r   r   r   r   r   r   _  s    z6MiscTracebackCases.test_extract_stack.<locals>.extractr   r,   r   zresult = extract()r*   r   z return traceback.extract_stack())r   r   r1   r   )r   r   r   re   r   r   r   r   ^  s    z%MiscTracebackCases.test_extract_stackN)rG   rH   rI   r  r   r   r   r   r   r   A  s   r   c               @   s$   e Zd Zdd Zdd Zdd ZdS )	TestFramec             C   s   t   t dt  tddd}| |d | t|d | |tddd | |t| | t|| | |j	 d S )Nr   r*   dummy)r   r*   r  z%"""Test cases for traceback module""")
	linecache
clearcache	lazycacheglobalsr   FrameSummaryr1   tupleZassertIsNonelocals)r   r   r   r   r   test_basicsk  s    
zTestFrame.test_basicsc             C   sH   t   tjddddd}| d |j t dt  | d|j d S )Nr   r*   r  F)lookup_linez%"""Test cases for traceback module""")	r  r  r   r  r1   _liner	  r
  line)r   r   r   r   r   test_lazy_linesz  s    zTestFrame.test_lazy_linesc             C   s$   t jddddd}| d|j d S )Nr   r*   r  r  )r  )r   r  r1   r  )r   r   r   r   r   test_explicit_line  s    zTestFrame.test_explicit_lineN)rG   rH   rI   r  r  r  r   r   r   r   r  i  s   	r  c               @   sl   e Z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dd Zdd Zdd ZdS )	TestStackc             C   sL   dd }t td }| }| t|t| d | |dd  | d S )Nc               S   s   t td S )N)listr   
walk_stackr   r   r   r   deeper  s    z)TestStack.test_walk_stack.<locals>.deeperr*   )r  r   r  r1   r2   )r   r  s1s2r   r   r   test_walk_stack  s
    zTestStack.test_walk_stackc             C   sR   ydd  W n" t k
r.   t \}}}Y nX tt|}| t|d d S )Nr*   r   )rN   rj   r   r  r   walk_tbr1   r2   )r   r   r   r   r   r   r   test_walk_tb  s    zTestStack.test_walk_tbc             C   s$   t jt d }| |t j d S )N)r   StackSummaryr   r  ZassertIsInstance)r   r   r   r   r   r     s    zTestStack.test_extract_stackc             C   s*   t jjt d dd}| t|d d S )Nro   )r   )r   r  r   r  r1   r2   )r   r   r   r   r   test_extract_stack_limit  s    z"TestStack.test_extract_stack_limitc             C   sd   t   t dt  tdd}t|d d }tjjt	|dfgdd}t   | 
|d jd d S )Nz/foo.pymethodr   T)lookup_linesr   z
import sys)r  r  updatecacher
  	test_code
test_framer   r  r   iterr1   r  )r   cr   r   r   r   r   test_extract_stack_lookup_lines  s    
z)TestStack.test_extract_stack_lookup_linesc             C   sj   t   tdd}t|d d }tjjt|dfgdd}| i t j	 t 
dt  | |d jd d S )Nz/foo.pyr  r   F)r   r   z
import sys)r  r  r"  r#  r   r  r   r$  r1   cacher!  r
  r  )r   r%  r   r   r   r   r   *test_extract_stackup_deferred_lookup_lines  s    
z4TestStack.test_extract_stackup_deferred_lookup_linesc             C   s$   t jdg}| dg|  d S )N)zfoo.pyr*   fredr  z*  File "foo.py", line 1, in fred
    line
)r   r  	from_listr1   rY   )r   r   r   r   r   test_from_list  s    zTestStack.test_from_listc             C   s8   t jdg}d|d< t j|}| dg|  d S )N)zfoo.pyr*   r)  r  )zfoo.pyr,   r)  r  r   z*  File "foo.py", line 2, in fred
    line
)r   r  r*  r1   rY   )r   r   r  r   r   r   test_from_list_edited_stack  s    z%TestStack.test_from_list_edited_stackc             C   s$   t jdg}| dg|  d S )N)zfoo.pyr*   r)  r  z*  File "foo.py", line 1, in fred
    line
)r   r  r*  r1   rY   )r   r   r   r   r   test_format_smoke  s    zTestStack.test_format_smokec             C   s^   t dt  tdd}t|t ddi}tjjt|dfgdd}| 	|d j
dd	i d S )
Nz/foo.pyr  	somethingr*   r   T)capture_localsr   1)r  r!  r
  r"  r#  r   r  r   r$  r1   r  )r   r%  r   r   r   r   r   test_locals  s
    
zTestStack.test_localsc             C   sV   t dt  tdd}t|t ddi}tjt|dfg}| 	|d j
d  d S )Nz/foo.pyr  r.  r*   r   r   )r  r!  r
  r"  r#  r   r  r   r$  r1   r  )r   r%  r   r   r   r   r   test_no_locals  s
    
zTestStack.test_no_localsc             C   s8   dd }|dd}|  dt|jjd f g|  d S )Nc             S   s    d}d}t jjt d dddS )Nr*   r,   T)r/  r   )r   r  r   r  )kvabr   r   r   
some_inner  s    z0TestStack.test_format_locals.<locals>.some_innerr<   r)   z  File "%s", line %d, in some_inner
    traceback.walk_stack(None), capture_locals=True, limit=1)
    a = 1
    b = 2
    k = 3
    v = 4
)r1   r   r   r   rY   )r   r7  r   r   r   r   test_format_locals  s    
zTestStack.test_format_localsN)rG   rH   rI   r  r  r   r  r&  r(  r+  r,  r-  r1  r2  r8  r   r   r   r   r    s   		r  c               @   s\   e Z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dd ZdS )TestTracebackExceptionc          	   C   s   ydd  W n< t k
rH   t }tj| }tjt|d }Y nX | d |j	 | d |j
 | d|j | ||j | |d |j | t|d t| d S )Nr*   r   r,   F)rN   rj   r   r   TracebackExceptionr  r   r  r1   	__cause____context____suppress_context__stackr   rr   )r   r   r   expected_stackr   r   r   
test_smoke  s    
z!TestTracebackException.test_smokec          
   C   s   dd }y
|  W n` t k
rr } zBt }tjjt|d dddd| _tjj	|dddd| _
W d d }~X Y nX | j}| j
}| d |j | d |j | d|j | ||j | |d |j | t|d t| d S )	Nc               S   s   dd  d S )Nr*   r   r   r   r   r   r   rm     s    z7TestTracebackException.test_from_exception.<locals>.foor,   r*   FT)r   r   r/  r   )rN   rj   r   r   r  r   r  r?  r:  from_exceptionr   r1   r;  r<  r=  r>  r   rr   )r   rm   rD   r   r?  r   r   r   r   test_from_exception  s$    

"z*TestTracebackException.test_from_exceptionc          	   C   s   y8zdd  W d t  }tj| }td}td|X W n< tk
rt   t  }tj| }tjt|d }Y nX tt|d }| ||j	 | ||j
 | d|j | ||j | |d |j | t|d t| d S )Nr*   r   causezuh ohr,   T)rj   r   r   r:  rN   r  r   r  r1   r;  r<  r=  r>  r   rr   )r   exc_info_contextexc_contextrC  r   r   r?  Z	exc_causer   r   r   r     s&    

z!TestTracebackException.test_causec          	   C   s   y.zdd  W d t  }tj| }tdX W n< tk
rj   t  }tj| }tjt|d }Y nX | d |j	 | ||j
 | d|j | ||j | |d |j | t|d t| d S )Nr*   r   zuh ohr,   F)rj   r   r   r:  rN   r  r   r  r1   r;  r<  r=  r>  r   rr   )r   rD  rE  r   r   r?  r   r   r   r   %  s"    

z#TestTracebackException.test_contextc             C   s   G dd dt }|d}|d}y
||W n: |k
rd   y|W n |k
r^   t }Y nX Y nX tj| }t| }| d|d  | d|d  d S )	Nc               @   s   e Zd Zdd ZdS )zCTestTracebackException.test_unhashable.<locals>.UnhashableExceptionc             S   s   dS )NTr   )r   r   r   r   r   r   ;  s    zJTestTracebackException.test_unhashable.<locals>.UnhashableException.__eq__N)rG   rH   rI   r   r   r   r   r   r   :  s   r   r   r   zUnhashableException: ex2
r,   zUnhashableException: ex1
r   )rN   rj   r   r   r:  r  rY   r5   )r   r   r   r   r   r   	formattedr   r   r   r   9  s    

z&TestTracebackException.test_unhashablec                sr    fdd y d W nF t k
r^   t }tj|ddi}tjjt|d dd}Y nX | ||j	 d S )Nc                s   | r | d  ndd  d S )Nr*   r   r   )n)recurser   r   rH  M  s    z2TestTracebackException.test_limit.<locals>.recurser   r   ro   r,   )r   )
rN   rj   r   r   r:  r  r   r  r1   r>  )r   r   r   r?  r   )rH  r   
test_limitL  s    z!TestTracebackException.test_limitc             C   sx   t   td}tdd}t|d d }t|dd }tjt||dd}| i t j	 t 
dt  | |jd jd d S )	Nzuh ohz/foo.pyr  r   F)r   r   z
import sys)r  r  rN   r"  r#  test_tbr   r:  r1   r'  r!  r
  r>  r  )r   rD   r%  r   r   r   r   r   r   test_lookup_lines[  s    
z(TestTracebackException.test_lookup_linesc             C   sp   t dt  td}tdd}t|t ddd}t|dd }tjt||dd	}| 	|j
d
 jddd d S )Nz/foo.pyzuh ohr  r*   string)r.  r   r   T)r/  r   r0  z'string')r  r!  r
  rN   r"  r#  rJ  r   r:  r1   r>  r  )r   rD   r%  r   r   r   r   r   r   r1  f  s    
z"TestTracebackException.test_localsc             C   sd   t dt  td}tdd}t|t ddi}t|dd }tt||}| 	|j
d jd  d S )Nz/foo.pyzuh ohr  r.  r*   r   r   )r  r!  r
  rN   r"  r#  rJ  r   r:  r1   r>  r  )r   rD   r%  r   r   r   r   r   r   r2  q  s    
z%TestTracebackException.test_no_localsc             C   s,   t ttdd }| t| dg d S )NZhavenzException: haven
)r   r:  rN   r1   r  rY   )r   r   r   r   r   test_traceback_headerz  s    z,TestTracebackException.test_traceback_headerN)rG   rH   rI   r@  rB  r   r   r   rI  rK  r1  r2  rM  r   r   r   r   r9    s   	r9  c               @   s   e Zd Zdd ZdS )MiscTestc             C   sh   t  }dh}xHttD ]<}|ds||kr.qtt|}t|dd dkr|| qW | tj| d S )N
print_listr   rH   r   )setdirr   r   getattraddZassertCountEqual__all__)r   rw   Z	blacklistnameZmodule_objectr   r   r   test_all  s    
zMiscTest.test_allN)rG   rH   rI   rV  r   r   r   r   rN    s   rN  rK   )+r   collectionsr   ior   r  rj   Zunittestr   Ztestr   Ztest.supportr   r   r   r   r	   Ztest.support.script_helperr
   ru   r   r"  r#  rJ  ZTestCaser   r}   r   r   r#   escaper   r   r   r   r   r   r  r  r9  rN  rG   mainr   r   r   r   <module>   sH    D  = x(` 
