a
    zeZ                     @   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mZ ddlmZ ddlZddlZedd	d
gZedg dZedg d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	ALWAYS_EQ)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dd Zdd Zdd Zdd  Zd!S )"TracebackCasesc              
   C   sH   z
|  W n0 |y: } zt ||W  Y d }~S d }~0 0 tdd S )Nzcall did not raise exception)	tracebackformat_exception_only
ValueError)selffuncexcvalue r   )/usr/lib/python3.9/test/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 d |  | jt}| d|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   N
bad syntax   r-   r@   )r3   r   r   r4   r5   r7   )r   r   r<   r   r   r    test_nocaretE   s    
zTracebackCases.test_nocaretc                 C   s   |  | jt}| t|d | |d  d | d|d  | |d dd |d d |  | jt}| t|d | |d  d d S )Nr,   r-   zprint(2)r.   r/   )rA   )	r!   r)   IndentationErrorr4   r5   r7   r8   r9   r+   r;   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__r4   )r   eZlstr   r   r    test_base_exceptionY   s    z"TracebackCases.test_base_exceptionc                    sP    fdd z
   W n t y0   t }Y n0 t|d |d |d  d S )Nc                      s*   zt dW n t y$      Y n0 d S )Nhellor   r   fr   r    rM   d   s    z?TracebackCases.test_traceback_context_recursionerror.<locals>.fr   r-   r/   )RecursionErrorsysexc_infor   format_exceptionr   rP   r   rL   r    %test_traceback_context_recursionerror_   s    
z4TracebackCases.test_traceback_context_recursionerrorc                    sP    fdd z
   W n t y0   t }Y n0 t|d |d |d  d S )Nc               
      sB   d } z
   W n( t y6 } z|} W Y d }~n
d }~0 0 t | d S N	Exception)rH   r   rL   r   r    rM   u   s    
z=TracebackCases.test_traceback_cause_recursionerror.<locals>.fr   r-   r/   )rV   rO   rP   r   rQ   rR   r   rL   r    #test_traceback_cause_recursionerrorq   s    
z2TracebackCases.test_traceback_cause_recursionerrorc                 C   sx   G dd dt }t|| }| t|d d|j }|jdv 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__   s    zGTracebackCases.test_format_exception_only_bad__str__.<locals>.X.__str__N__name__
__module____qualname__rY   r   r   r   r    X   s   r^   r-   z<unprintable %s object>)__main__builtins.r   %s: %s
)	rV   r   r   r4   r5   r[   r\   r]   join)r   r^   r<   	str_value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jjddgjjd}| \}}t|d d   fdd}|dd	dd
 dD ]`}|dkrd	}n|dkrd}nd}|d	|||d |d	|||d |d	|||d qn|dddd d S )Nr   -cz&import sys; print(sys.stdout.encoding)stdoutstderrasciic                    s  zt td|d"}|d| | W d    n1 s80    Y  jjtgjjd}| \}}|	 
 }W tt n
tt 0 | 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}')
                        rh   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}rA   z-Invalid error message: {0!r} instead of {1!r})openr   writeformatPopen
executablePIPESTDOUTcommunicatedecode
splitlinesr   encoder8   r6   endswith)Z
firstlinesmessagecharsetlinenooutputprocessri   rj   Zencoded_messageZmessage_asciiZerr_lineerr_msgZoutput_encodingr   
subprocessrO   r   r    do_test   s@    $


z1TracebackCases.test_encoded_file.<locals>.do_test foorA   )rk   z
iso-8859-1utf-8GBKr   u   丂儀u   hé hoz# coding: {0}
r,   z#!shebang
# coding: {0}
   z 	
# coding: {0}
zx=0
# coding: GBK
r   )
rO   r   rr   rs   rt   ru   rv   strrx   rq   )r   r   ri   rj   r   r|   textr   r   r    test_encoded_file   s6    
#


z TracebackCases.test_encoded_filec                 C   s6   t d}td|\}}}g d}| | | 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()
        rg   )s"   Traceback (most recent call last):s&     File "<string>", line 8, in __init__s#   ZeroDivisionError: division by zero)textwrapdedentr   r4   rx   )r   r   rcri   rj   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_exceptionrV   r4   getvalue)r   r~   r   r   r    test_print_exception   s
    z#TracebackCases.test_print_exceptionN)r[   r\   r]   r!   r'   r(   r)   r*   r+   r=   rB   rE   rI   rS   rW   rf   r   r   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)KeyErrorr&   r   r   r    some_exception   s    z#TracebackFormatTests.some_exceptionNc                 C   s  ddl m} z|   W n ty   t \}}}|d urH||j ddt	| }t
 }||| | }td}	t| W d    n1 s0    Y  t
 }
tj||
d td}t  W d    n1 s0    Y  t }t
 }tj|d Y n
0 td| || | |	 |
  | | |  | ||  | }| t|d |d }|d	d  \}}| |d
 | |d | |d d S )Nr   )traceback_printz#Traceback (most recent call last):
r   rj   r   z&unable to create test traceback stringr   	Traceback  Filez	    raise)	_testcapir   r   r   rO   rP   r   rc   r   	format_tbr   r   r   print_tb	print_exc
format_excr   r4   rx   r5   r6   
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  sD    


(
&z+TracebackFormatTests.check_traceback_formatc                 C   s   |    d S rT   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 rT   )r   clearr   r   r   r    
cleanup_tb3  s    zRTracebackFormatTests.test_traceback_format_with_cleared_frames.<locals>.cleanup_tbr   )r   r   r   r   r    )test_traceback_format_with_cleared_frames1  s    z>TracebackFormatTests.test_traceback_format_with_cleared_framesc                 C   s   t d }ttd W d    n1 s.0    Y  t }tjtd|d | | |  ttd}| | d	| d S )Nrj   r-   r   r   )
r   r   print_stackrO   	_getframer   r4   r   format_stackrc   )r   ZststderrZstfileZstfmtr   r   r    test_stack_format7  s    
.z&TracebackFormatTests.test_stack_formatc              	   C   s~   dd }t d}|  W d    n1 s,0    Y  |jj}| |  dd  dt|d f ddt|d	 f d
g d S )Nc                   S   s   t   d S rT   )r   r   r   r   r   r    prnE  s    z2TracebackFormatTests.test_print_stack.<locals>.prnrj   z)  File "%s", line %d, in test_print_stackrA   z	    prn()z  File "%s", line %d, in prnr-   z    traceback.print_stack())r   __code__co_firstlinenor4   r   rx   __file__)r   r   rj   r}   r   r   r    test_print_stackD  s    
$z%TracebackFormatTests.test_print_stackc                    s  d | _  fdd td>}z
   W n ty>   |  Y n0 | d W d    n1 s^0    Y   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@}z
  W n ty|   |  Y n0 | d W d    n1 s0    Y  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@}z
  W n tyn   |  Y n0 | d W d    n1 s0    Y  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D}ztj W n tyN   |  Y n0 | d" W d    n1 sp0    Y  dt d|	d  dt d|	d  dt d|	d  dt d|	d  d}
dt d|	d#  d$}||
  }|  }| 	|| tdH}ztjd	  W n ty0   |  Y n0 | d" W d    n1 sR0    Y  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 rT   r   r   rL   r   r    rM   Y  s    zBTracebackFormatTests._check_recursive_traceback_display.<locals>.frj   zno recursion occurredz+Traceback (most recent call last):
  File "z", line r   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-   rK   r:   )gr   r    r     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 "rA   z', in g
    raise ValueError
ValueError
   z0, in _check_recursive_traceback_display
    g()
c                    s   | r| d S    d S r   r   r   )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   rN   Zfailr   r   r   rx   r   r4   ZassertRegexr8   rO   getrecursionlimitintresearchgroupranger   r   _RECURSIVE_CUTOFF)r   
render_excstderr_fZlineno_fZresult_fr   actualZ	rec_limitZstderr_gZlineno_gZresult_gZtb_lineZstderr_hZlineno_hZresult_hr   )rM   r   r   r    "_check_recursive_traceback_displayR  s8   

(*

*

*


*
*z7TracebackFormatTests._check_recursive_traceback_displayc                 C   s   |  tj d S rT   )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 rT   )rO   rP   )exc_type	exc_valueexc_tbr   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 rT   )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   r4   r   )r   r   resultr}   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}z
||W n< |yr   z|W n  |yl   t \}}}Y n0 Y n0 td}|| W d    n1 s0    Y  |   }	| 	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r[   r\   r]   r   r   r   r   r    UnhashableException  s   r   ex1ex2rj      r   zUnhashableException: ex2rA   zUnhashableException: ex1r   )r   r   rV   rO   rP   r   r   r7   rx   r4   r5   context_messager8   )
r   r   r   r   r   r   exc_valr   r   r   r   r   r    test_unhashable  s$    

&z$TracebackFormatTests.test_unhashable)N)r[   r\   r]   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                   @   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ee ddd Zdd Zdd Zdd Zdd Zdd Zd S )!BaseExceptionReportingTestsc              
   C   sF   t |tr|S z
|  W n( ty@ } z|W  Y d }~S d }~0 0 d S rT   )
isinstancerV   )r   Zexception_or_callablerH   r   r   r    get_exceptionD  s    

z)BaseExceptionReportingTests.get_exceptionc                 C   s   dd  d S rX   r   r&   r   r   r    zero_divL  s    z$BaseExceptionReportingTests.zero_divc                 C   sJ   |  }| |d d | d|d  | |d d|d  d S )Nr   z1/0 # In zero_divr   r   ZeroDivisionError)rx   r6   r   r8   )r   msglinesr   r   r    check_zero_divO  s    z*BaseExceptionReportingTests.check_zero_divc              
   C   s   zdd  W n( t y4 } z|}W Y d }~n
d }~0 0 | | }| t|d | |d d | |d d | d|d  | |d d	 d S )
Nr-   r   r,   r   r   z1/0 # Markerr/   rA   r   )r   
get_reportrx   r4   r5   r6   r   r8   r   _rH   r   r   r   r    test_simpleU  s    z'BaseExceptionReportingTests.test_simplec                    sj   fdd  fdd}t |}t|d |d t |d  d|d	  d S )
Nc               
      s<   z    W n* ty6 }  zt| W Y d } ~ n
d } ~ 0 0 d S rT   r   r   r   )rH   r&   r   r    inner_raiseb  s    z;BaseExceptionReportingTests.test_cause.<locals>.inner_raisec                      s
      d S rT   r   r   r   r   r    outer_raiseg  s    z;BaseExceptionReportingTests.test_cause.<locals>.outer_raiserA   r-   r   inner_raise() # Markerr/   
boundariessplitr   r4   r5   cause_messager   r8   r   r   Zblocksr   r   r   r    
test_causea  s    z&BaseExceptionReportingTests.test_causec                    sj   fdd  fdd}t |}t|d |d t |d  d|d	  d S )
Nc                      s(   z    W n ty"   tY n0 d S rT   r   r   r&   r   r    r   p  s    z=BaseExceptionReportingTests.test_context.<locals>.inner_raisec                      s
      d S rT   r   r   r   r   r    r   u  s    z=BaseExceptionReportingTests.test_context.<locals>.outer_raiserA   r-   r   r   r/   )r   r   r   r4   r5   r   r   r8   r   r   r   r    test_contexto  s    z(BaseExceptionReportingTests.test_contextc              
   C   s   z zt W n   td Y n0 W n( tyH } z|}W Y d }~n
d }~0 0 | | }| t|d | |d d | |d d | d|d  | |d d	 d S )
Nr,   r   r   r-   r   zZeroDivisionError from Noner/   rA   r   )	rV   r   r   rx   r4   r5   r6   r   r8   r   r   r   r    test_context_suppression}  s    z4BaseExceptionReportingTests.test_context_suppressionc                    sj   fdd  fdd}t |}t|d |d t |d  d|d	  d S )
Nc               
      s\   z    W n( ty4 }  z| }W Y d } ~ n
d } ~ 0 0 zt W n tyV   t|Y n0 d S rT   )r   r   Zxyzzy	NameErrorr   )_erH   r&   r   r    r     s    zGBaseExceptionReportingTests.test_cause_and_context.<locals>.inner_raisec                      s
      d S rT   r   r   r   r   r    r     s    zGBaseExceptionReportingTests.test_cause_and_context.<locals>.outer_raiserA   r-   r   r   r/   r   r   r   r   r    test_cause_and_context  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               
      sp   z@z    W n. ty< }  z| }t| W Y d } ~ n
d } ~ 0 0 W n* tyj }  z|| W Y d } ~ n
d } ~ 0 0 d S rT   r   )rH   zr&   r   r    r     s     zEBaseExceptionReportingTests.test_cause_recursive.<locals>.inner_raisec                      s
      d S rT   r   r   r   r   r    r     s    zEBaseExceptionReportingTests.test_cause_recursive.<locals>.outer_raiserA   r-   zraise KeyError from er   z1/0r   r/   )	r   r   r   r4   r5   r   r8   ZassertNotInr   r   r   r   r    test_cause_recursive  s    	z0BaseExceptionReportingTests.test_cause_recursivez5Pegen is arguably better here, so no need to fix thisc                 C   sP   dd }|  | }| |d d dd }|  | }| |d d d S )Nc                   S   s   t ddd S )Nr   )r   r   r   rJ   )r3   r   r   r   r    rH     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    rH     s    z               ^)r   rx   r4   r   rH   r   r   r   r    test_syntax_error_offset_at_eol  s    z;BaseExceptionReportingTests.test_syntax_error_offset_at_eolc                 C   s   t d}| | }| |dg d|_| | }| |ddg t d}d|_| | }| |dg d|_| | }| |ddg d S )Nr@   zSyntaxError: bad syntaxd   z  File "<string>", line 100z	myfile.pyz#SyntaxError: bad syntax (myfile.py)z  File "myfile.py", line 100)r3   r   rx   r4   r}   filenamer  r   r   r    test_syntax_error_no_lineno  s*    z7BaseExceptionReportingTests.test_syntax_error_no_linenoc                 C   sj   |  td }| d| |  td}| d| |  t }| d| |  td}| d| d S )NzException: None
Nonez
Exception
r   )r   rV   r8   r;   r   r   r    test_message_none  s    z-BaseExceptionReportingTests.test_message_nonec                 C   s@   G dd dt }d|_| | }d|j d}| || d S )Nc                   @   s   e Zd Zdd ZdS )zLBaseExceptionReportingTests.test_exception_modulename_not_unicode.<locals>.Xc                 S   s   dS NI am Xr   r&   r   r   r    rY     s    zTBaseExceptionReportingTests.test_exception_modulename_not_unicode.<locals>.X.__str__NrZ   r   r   r   r    r^     s   r^   *   z
<unknown>.z	: I am X
)rV   r\   r   r]   r4   )r   r^   r<   expr   r   r    %test_exception_modulename_not_unicode  s
    zABaseExceptionReportingTests.test_exception_modulename_not_unicodec              
   C   s   t ddD ]}dD ]}d| d|  }dg}|dk rH|d|   nR|d	krz|d|   |d
d|d    n |d|   |d
d  |d |d | tddd|| |f}d|}| || qq
d S )Nr   )r   r/    ztext%dz  File "file.py", line 1r-   z    %s   z    %s^z     zSyntaxError: msgr   r   zfile.pyr1   )r   appendlstripr   r3   rc   r4   )r   offsetaddr   r   r<   r  r   r   r    !test_syntax_error_various_offsets  s     


z=BaseExceptionReportingTests.test_syntax_error_various_offsetsc                 C   sX   G dd d}|  |j }d}d|jjj|jjjg}d||f }| || d S )Nc                   @   s   e Zd ZG dd dZdS )zJBaseExceptionReportingTests.test_format_exception_only_qualname.<locals>.Ac                   @   s   e Zd ZG dd deZdS )zLBaseExceptionReportingTests.test_format_exception_only_qualname.<locals>.A.Bc                   @   s   e Zd Zdd ZdS )zNBaseExceptionReportingTests.test_format_exception_only_qualname.<locals>.A.B.Xc                 S   s   dS r  r   r&   r   r   r    rY   	  s    zVBaseExceptionReportingTests.test_format_exception_only_qualname.<locals>.A.B.X.__str__NrZ   r   r   r   r    r^     s   r^   N)r[   r\   r]   rV   r^   r   r   r   r    B  s   r  N)r[   r\   r]   r  r   r   r   r    A  s   r  r	  ra   rb   )r   r  r^   rc   r\   r]   r4   )r   r  r<   rd   re   r  r   r   r    #test_format_exception_only_qualname  s    z?BaseExceptionReportingTests.test_format_exception_only_qualnameN)r[   r\   r]   r   r   r   r   r   r   r   r   r   unittestZskipIfr   Zuse_old_parserr  r  r  r  r  r  r   r   r   r    r   B  s    
r   c                   @   s   e Zd Zdd ZdS )PyExcReportingTestsc                 C   st   |  |}dtt|||j}td$}tt|||j W d    n1 sV0    Y  | |	 | |S )Nr   rj   )
r   rc   r   rQ   type__traceback__r   r   r4   r   )r   rH   ssior   r   r    r     s    

2zPyExcReportingTests.get_reportN)r[   r\   r]   r   r   r   r   r    r    s   r  c                   @   s   e Zd Zedd ZdS )CExcReportingTestsc                 C   sN   ddl m} | |}td}|| W d    n1 s<0    Y  | S )Nr   r   rj   )r   r   r   r   r   )r   rH   r   r  r   r   r    r   (  s
    

&zCExcReportingTests.get_reportN)r[   r\   r]   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 raisedrU   r&   r   r   r    last_raises16  s    zLimitTests.last_raises1c                 C   s   |    d S rT   )r   r&   r   r   r    last_raises29  s    zLimitTests.last_raises2c                 C   s   |    d S rT   )r!  r&   r   r   r    last_raises3<  s    zLimitTests.last_raises3c                 C   s   |    d S rT   )r"  r&   r   r   r    last_raises4?  s    zLimitTests.last_raises4c                 C   s   |    d S rT   )r#  r&   r   r   r    last_raises5B  s    zLimitTests.last_raises5c                 C   s   t  S rT   )rO   r   r&   r   r   r    last_returns_frame1E  s    zLimitTests.last_returns_frame1c                 C   s   |   S rT   )r%  r&   r   r   r    last_returns_frame2H  s    zLimitTests.last_returns_frame2c                 C   s   |   S rT   )r&  r&   r   r   r    last_returns_frame3K  s    zLimitTests.last_returns_frame3c                 C   s   |   S rT   )r'  r&   r   r   r    last_returns_frame4N  s    zLimitTests.last_returns_frame4c                 C   s   |   S rT   )r(  r&   r   r   r    last_returns_frame5Q  s    zLimitTests.last_returns_frame5c                    s|      fdd}fdd}ttdd6 | }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    n1 sn0    Y  d S )Nc                     s   t j fi | S rT   r   extract_stackkwargs)r   r   r    extractV  s    z.LimitTests.test_extract_stack.<locals>.extractc                    sX     | d | |d |    | |d d  ||d d     t| t| d S r   )r4   r5   )r   r   ignorer&   r   r    assertEqualExceptX  s    $z8LimitTests.test_extract_stack.<locals>.assertEqualExcepttracebacklimit  r   r/   limitr   r  iir-   r   rA   r   r   )r)  r   	swap_attrrO   ZassertGreaterr5   r4   r1  )r   r.  r0  nolimr   )r   r   r    test_extract_stackT  s*    &zLimitTests.test_extract_stackc                    sz  z|    W n  ty,   t \}} Y n0  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    n1 sl0    Y  d S )Nc                     s   t j fi | S rT   )r   
extract_tbr,  r   r   r    r.  u  s    z+LimitTests.test_extract_tb.<locals>.extractr1  r2  r  r/   r3  r   r   r   rA   r   r   	r$  rV   rO   rP   r   r5  r4   r5   r1  )r   r   r   r.  r6  r   r   r    test_extract_tbp  s.    zLimitTests.test_extract_tbc                    s~  z|    W n  ty,   t \ Y n0  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    n1 sp0    Y  d S )Nc                     s   t j fi | dd S )Nr-   r   )r   rQ   r,  r   r   r   r   r    r.    s    z1LimitTests.test_format_exception.<locals>.extractr1  r2  r  r/   r3  r   r   r9  r   rA   r   r   r:  )r   r.  r6  r   r<  r    test_format_exception  s.    z LimitTests.test_format_exceptionN)r[   r\   r]   __doc__r   r!  r"  r#  r$  r%  r&  r'  r(  r)  r7  r;  r=  r   r   r   r    r  1  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  z
|  W n   t  \}}}Y n0 |jjjj}| t|jd t| | t|jd d S )	Nc                      s
      d S rT   r   r   )middler   r    outer  s    z,MiscTracebackCases.test_clear.<locals>.outerc                      s
      d S rT   r   r   )innerr   r    r@    s    z-MiscTracebackCases.test_clear.<locals>.middlec                  S   s   d} dd  d S rX   r   )ir   r   r    rB    s    z,MiscTracebackCases.test_clear.<locals>.innerr-   r   )	rO   rP   r   r   r4   r5   r   r   clear_frames)r   rA  r   r   r   Zinner_framer   )rB  r@  r    
test_clear  s    

zMiscTracebackCases.test_clearc                 C   s^   dd }| }|j j}| |dd  t|d ddft|d dd	fg | t|d
 d d S )Nc                   S   s   t  S rT   r*  r   r   r   r    r.    s    z6MiscTracebackCases.test_extract_stack.<locals>.extractr   r/   r7  zresult = extract()r-   r.  z return traceback.extract_stack()r   r,   )r   r   r4   r   r5   )r   r.  r   r}   r   r   r    r7    s    z%MiscTracebackCases.test_extract_stackN)r[   r\   r]   rE  r7  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	S )
	TestFramec                 C   s   t   t dt  tddd}| |d | t|d | |tddd | |t| | t|| | |j	 | 
|t  | |t d S )NrM   r-   dummy)rM   r-   rG  %"""Test cases for traceback module""")	linecache
clearcache	lazycacheglobalsr   FrameSummaryr4   tupleZassertIsNonelocalsassertNotEqualobjectr
   r   rM   r   r   r    test_basics  s    
zTestFrame.test_basicsc                 C   sH   t   tjddddd}| d |j t dt  | d|j d S )NrM   r-   rG  F)lookup_linerH  )	rI  rJ  r   rM  r4   _linerK  rL  linerR  r   r   r    test_lazy_lines  s    zTestFrame.test_lazy_linesc                 C   s$   t jddddd}| d|j d S )NrM   r-   rG  rV  rV  )r   rM  r4   rV  rR  r   r   r    test_explicit_line  s    zTestFrame.test_explicit_linec                 C   s&   t jddddd}| t|d d S )NrM   r-   rG  rV  rX  r,   )r   rM  r4   r5   rR  r   r   r    test_len  s    zTestFrame.test_lenN)r[   r\   r]   rS  rW  rY  rZ  r   r   r   r    rF    s   	rF  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 rT   )listr   
walk_stackr   r   r   r    deeper  s    z)TestStack.test_walk_stack.<locals>.deeperr-   )r\  r   r]  r4   r5   )r   r^  s1s2r   r   r    test_walk_stack  s
    zTestStack.test_walk_stackc                 C   sP   zdd  W n  t y,   t \}}}Y n0 tt|}| t|d d S rX   )rV   rO   rP   r\  r   walk_tbr4   r5   )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 rT   )r   StackSummaryr.  r]  ZassertIsInstancer   r  r   r   r    r7  	  s    zTestStack.test_extract_stackc                 C   s*   t jjt d dd}| t|d d S )Nr   r3  )r   rd  r.  r]  r4   r5   re  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 )N/foo.pymethodr  Tlookup_linesr   
import sys)rI  rJ  updatecacherL  	test_code
test_framer   rd  r.  iterr4   rV  r   crM   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 )Nrg  rh  r  Fri  r   rk  )rI  rJ  rm  rn  r   rd  r.  ro  r4   cacherl  rL  rV  rp  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foo.pyr-   fredrV  z*  File "foo.py", line 1, in fred
    line
r   rd  	from_listr4   rq   re  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 )Nrv  )rw  r/   rx  rV  r   z*  File "foo.py", line 2, in fred
    line
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 ru  ry  re  r   r   r    test_format_smoke1  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 )
Nrg  rh  	somethingr-   r  Tcapture_localsr   1rI  rl  rL  rm  rn  r   rd  r.  ro  r4   rO  rp  r   r   r    test_locals9  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 )Nrg  rh  r~  r-   r  r   r  rp  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  r4  )r   rd  r.  r]  )kvabr   r   r    
some_innerH  s
    z0TestStack.test_format_locals.<locals>.some_innerrA   r,   zw  File "%s", line %d, in some_inner
    return traceback.StackSummary.extract(
    a = 1
    b = 2
    k = 3
    v = 4
)r4   r   r   r   rq   )r   r  r  r   r   r    test_format_localsG  s    
zTestStack.test_format_localsN)r[   r\   r]   ra  rc  r7  rf  rr  rt  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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 )TestTracebackExceptionc              	   C   s   zdd  W n: t yF   t }tj| }tjt|d }Y n0 | d |j	 | d |j
 | d|j | ||j | |d |j | t|d t| d S )Nr-   r   r/   F)rV   rO   rP   r   TracebackExceptionrd  r.  rb  r4   	__cause____context____suppress_context__stackr   r   r   rP   r   expected_stackr   r   r    
test_smokeY  s    

z!TestTracebackException.test_smokec              
   C   s   dd }z
|  W nb t yt } zJt }tjjt|d dddd| _tjj	|dddd| _
W Y d }~n
d }~0 0 | j}| j
}| d |j | d |j | d|j | ||j | |d |j | t|d t| d S )	Nc                   S   s   dd  d S rX   r   r   r   r   r    r   j  s    z7TestTracebackException.test_from_exception.<locals>.foor/   r-   FT)r4  rj  r  r   )rV   rO   rP   r   rd  r.  rb  r  r  from_exceptionr   r4   r  r  r  r  r   r   )r   r   rH   rP   r  r   r   r   r    test_from_exceptionh  s(    
z*TestTracebackException.test_from_exceptionc              	   C   s  z\z0dd  W t  }tj| }td}td|n&t  }tj| }td}td|0 W n: ty   t  }tj| }tjt|d }Y n0 tt|d }| ||j	 | ||j
 | d|j | ||j | |d |j | t|d t| d S )Nr-   r   causeuh ohr/   TrO   rP   r   r  rV   rd  r.  rb  r4   r  r  r  r  r   r   )r   exc_info_contextexc_contextr  rP   r   r  Z	exc_causer   r   r    r   ~  s0    




z!TestTracebackException.test_causec              	   C   s   zHz&dd  W t  }tj| }tdnt  }tj| }td0 W n: ty   t  }tj| }tjt|d }Y n0 | d |j	 | ||j
 | d|j | ||j | |d |j | t|d t| d S )Nr-   r   r  r/   Fr  )r   r  r  rP   r   r  r   r   r    r     s*    





z#TestTracebackException.test_contextc                 C   s~   zdd  W n t y&   t }Y n0 t|d }t|d }tj| }| t|d | | t|d | d S )Nr-   r   r/   )rV   rO   rP   getrefcountr   r  r4   )r   rP   Zrefcnt1Zrefcnt2r   r   r   r    /test_no_refs_to_exception_and_traceback_objects  s    
zFTestTracebackException.test_no_refs_to_exception_and_traceback_objectsc                 C   sr   zdd  W n. t y:   t }tj| }tj| }Y n0 | || | || | |t  | |t	 d S rX   )
rV   rO   rP   r   r  ZassertIsNotr4   rP  rQ  r
   )r   rP   r   exc2r   r   r    test_comparison_basic  s    
z,TestTracebackException.test_comparison_basicc                    s   dd   fdd}z
|  W n t y8   t }Y n0 tj| }tj|ddi}tj|ddi}| || | || tj|dd	i}| || tj|dd
i}tj|d
d	d}| || tj|ddi}	tj|dd	d}
| |	|
 d S )Nc                   S   s    zt dW n    Y n0 d S )Nz	bad valuerK   r   r   r   r    	raise_exc  s    zKTestTracebackException.test_comparison_params_variations.<locals>.raise_excc                     s   d\} }   d S )N)r-   r/   r   )xyr  r   r    raise_with_locals  s    zSTestTracebackException.test_comparison_params_variations.<locals>.raise_with_localsr4  r   r/   r  Tr   )r4  r  r   )rV   rO   rP   r   r  r4   rP  )r   r  rP   r   Zexc1r  Zexc3Zexc4Zexc5Zexc6Zexc7r   r  r    !test_comparison_params_variations  s&    

z8TestTracebackException.test_comparison_params_variationsc              	   C   s|   g }t dD ]2}zdd  W q   |tjt   Y q0 q| |d |d  | t|d  t|d   d S )Nr/   r-   r   )	r   r  r   r  rO   rP   r4   r\  rq   )r   Zexcsr   r   r   r    /test_comparison_equivalent_exceptions_are_equal  s    zFTestTracebackException.test_comparison_equivalent_exceptions_are_equalc                 C   s   G dd dt }|d}|d}z
||W n6 |y`   z|W n |yZ   t }Y n0 Y n0 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 r   r   r   r   r   r    r     s    zJTestTracebackException.test_unhashable.<locals>.UnhashableException.__eq__Nr   r   r   r   r    r     s   r   r   r   zUnhashableException: ex2
r/   zUnhashableException: ex1
r  )rV   rO   rP   r   r  r\  rq   r8   )r   r   r   r   rP   r   	formattedr   r   r    r     s    

z&TestTracebackException.test_unhashablec                    sp    fdd z d W nD t y\   t }tj|ddi}tjjt|d dd}Y n0 | ||j	 d S )Nc                    s   | r | d  ndd  d S rX   r   )nrecurser   r    r    s    z2TestTracebackException.test_limit.<locals>.recurser   r4  r   r/   r3  )
rV   rO   rP   r   r  rd  r.  rb  r4   r  r  r   r  r    
test_limit  s    z!TestTracebackException.test_limitc                 C   sx   t   td}tdd}t|d d }t|dd }tjt||dd}| t j	i  t 
dt  | |jd jd d S )	Nr  rg  rh  r  Fri  r   rk  )rI  rJ  rV   rm  rn  test_tbr   r  r4   rs  rl  rL  r  rV  r   rH   rq  rM   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 )Nrg  r  rh  r-   string)r~  r   r  Tr  r   r  z'string'rI  rl  rL  rV   rm  rn  r  r   r  r4   r  rO  r  r   r   r    r    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 )Nrg  r  rh  r~  r-   r  r   r  r  r   r   r    r  '  s    
z%TestTracebackException.test_no_localsc                 C   s,   t ttdd }| t| dg d S )NZhavenzException: haven
)r   r  rV   r4   r\  rq   )r   r   r   r   r    test_traceback_header0  s    z,TestTracebackException.test_traceback_headerN)r[   r\   r]   r  r  r   r   r  r  r  r  r   r  r  r  r  r  r   r   r   r    r  W  s   %
	r  c                   @   s   e Zd Zdd ZdS )MiscTestc                 C   sd   t  }dh}ttD ]<}|ds||v r,qtt|}t|dd dkr|| q| tj| d S )N
print_listr   r\   r   )setdirr   r   getattrr  ZassertCountEqual__all__)r   r   Z	blacklistnameZmodule_objectr   r   r    test_all9  s    
zMiscTest.test_allN)r[   r\   r]   r  r   r   r   r    r  7  s   r  r_   ),r>  collectionsr   ior   rI  rO   r  r   testr   Ztest.supportr   r   r   r   r	   r
   Ztest.support.script_helperr   r   r   rm  rn  r  ZTestCaser   r   r   r   r%   escaper   r   r  r  r  r?  rF  r[  r  r  r[   mainr   r   r   r    <module>   sN     g  = Rx)%` a
