a
    äzeRˆ  ã                   @   sH   d dl Z d dlZd dlmZ G dd„ dejƒZdd„ ZedkrDeƒ  dS )é    N)Úsupportc                   @   sð   e Zd Zd4d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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,d-„ Zd.d/„ Zejd0d1„ ƒZejd2d3„ ƒZdS )5ÚSyntaxTestCaseú
<testcase>ÚexecNc           
   
   C   sÄ   zt |||ƒ W n¤ ty´ } zŒ|r>t||ƒs>|  d|j ¡ t |t|ƒ¡}	|	d u rf|  d|f ¡ |  |j	|¡ |d urŠ|  |j
|¡ |d ur |  |j|¡ W Y d }~nd }~0 0 |  d¡ d S )NzSyntaxError is not a %szSyntaxError did not contain %rz#compile() did not raise SyntaxError)ÚcompileÚSyntaxErrorÚ
isinstanceÚfailÚ__name__ÚreÚsearchÚstrZassertEqualÚfilenameÚlinenoÚoffset)
ÚselfÚcodeZerrtextr   ÚmodeÚsubclassr   r   ÚerrÚmo© r   ú&/usr/lib/python3.9/test/test_syntax.pyÚ_check_errorö  s    $zSyntaxTestCase._check_errorc                 C   s   | j dddd d S )Nzf{úinvalid syntaxÚsingle©r   ©r   ©r   r   r   r   Ú1test_curly_brace_after_primary_raises_immediately  s    z@SyntaxTestCase.test_curly_brace_after_primary_raises_immediatelyc                 C   s   |   dd¡ d S )Nzf() = 1Zassignr   r   r   r   r   Útest_assign_call  s    zSyntaxTestCase.test_assign_callz3The old parser cannot generate these error messagesc                 C   sH  |   dd¡ |   dd¡ |   dd¡ |   dd¡ |   dd	¡ |   d
d¡ |   dd	¡ |   dd	¡ |   dd¡ |   dd¡ |   dd¡ |   dd¡ |   dd¡ |   dd¡ |   dd¡ |   dd¡ |   dd¡ |   dd¡ |   dd¡ |   dd¡ |   dd¡ |   dd¡ |   dd¡ |   d d¡ |   d!d¡ |   d"d#¡ |   d$d¡ d S )%Nzdel (,)r   zdel 1zdelete literalz
del (1, 2)zdel Nonezdelete Nonezdel *xzdelete starredzdel (*x)zuse starred expressionz	del (*x,)z	del [*x,]zdel f()zdelete function callzdel f(a, b)z	del o.f()z
del a[0]()z
del x, f()z
del f(), xzdel [a, b, ((c), (d,), e.f())]zdel (a if True else b)zdelete conditionalzdel +azdelete operatorz	del a, +bz	del a + bzdel (a + b, c)zdel (c[0], a + b)zdel a.b.c + 2zdel a.b.c[0] + 2zdel (a, b, (c, d.e.f + 2))zdel [a, b, (c, d.e.f[0] + 2)]zdel (a := 5)zdelete named expressionz
del a += br   r   r   r   r   Útest_assign_del  s6    zSyntaxTestCase.test_assign_delc                 C   s   d}| j |ddd d S )Nz¬if 1:
            def error(a):
                global a  # SyntaxError
            def error2():
                b = 1
                global b  # SyntaxError
            zparameter and globalé   ©r   r   ©r   Úsourcer   r   r   Útest_global_param_err_first4  s    z*SyntaxTestCase.test_global_param_err_firstc                 C   s   d}| j |ddd d S )Nz®if 1:
            def error(a):
                nonlocal a  # SyntaxError
            def error2():
                b = 1
                global b  # SyntaxError
            zparameter and nonlocalr"   r#   r   r$   r   r   r   Útest_nonlocal_param_err_first>  s    z,SyntaxTestCase.test_nonlocal_param_err_firstc                 C   s   |   dd¡ d S )NÚbreakúoutside loopr   r   r   r   r   Útest_break_outside_loopH  s    z&SyntaxTestCase.test_break_outside_loopc                 C   sp   |   dd¡ |   dd¡ |   dd¡ |   dd¡ |   dd¡ |   dd¡ |   dd¡ |   d	d¡ |   d
d¡ d S )Nzif 0: yieldúoutside functionzif 0: yield
else:  x=1zif 1: pass
else: yieldzwhile 0: yieldzwhile 0: yield
else:  x=1zclass C:
  if 0: yieldz#class C:
  if 1: pass
  else: yieldzclass C:
  while 0: yieldz(class C:
  while 0: yield
  else:  x = 1r   r   r   r   r   Útest_yield_outside_functionK  s    ÿÿz*SyntaxTestCase.test_yield_outside_functionc                 C   sp   |   dd¡ |   dd¡ |   dd¡ |   dd¡ |   dd¡ |   dd¡ |   dd¡ |   d	d¡ |   d
d¡ d S )Nzif 0: returnr+   zif 0: return
else:  x=1zif 1: pass
else: returnzwhile 0: returnzclass C:
  if 0: returnzclass C:
  while 0: returnz'class C:
  while 0: return
  else:  x=1z$class C:
  if 0: return
  else: x= 1z$class C:
  if 1: pass
  else: returnr   r   r   r   r   Útest_return_outside_functionX  s    ÿÿÿz+SyntaxTestCase.test_return_outside_functionc                 C   s@   |   dd¡ |   dd¡ |   dd¡ |   dd¡ |   dd¡ d S )Nzif 0: breakr)   zif 0: break
else:  x=1zif 1: pass
else: breakzclass C:
  if 0: breakz#class C:
  if 1: pass
  else: breakr   r   r   r   r   r*   f  s    ÿc                 C   s@   |   dd¡ |   dd¡ |   dd¡ |   dd¡ |   dd¡ d S )Nzif 0: continueznot properly in loopzif 0: continue
else:  x=1zif 1: pass
else: continuezclass C:
  if 0: continuez&class C:
  if 1: pass
  else: continuer   r   r   r   r   Útest_continue_outside_loopn  s    ÿz)SyntaxTestCase.test_continue_outside_loopc                 C   s   | j ddtd d S )Nzfoo()
 bar()
zunexpected indent©r   ©r   ÚIndentationErrorr   r   r   r   Útest_unexpected_indentv  s    ÿz%SyntaxTestCase.test_unexpected_indentc                 C   s   | j ddtd d S )Nzif 1:
foo()zexpected an indented blockr/   r0   r   r   r   r   Útest_no_indentz  s    ÿzSyntaxTestCase.test_no_indentc                 C   s   | j ddtd d S )Nzif 1:
  foo()
 bar()z unindent does not match .* levelr/   r0   r   r   r   r   Útest_bad_outdent~  s    þzSyntaxTestCase.test_bad_outdentc                 C   s   |   dd¡ d S )Nzint(base=10, '2')z,positional argument follows keyword argumentr   r   r   r   r   Útest_kwargs_lastƒ  s    ÿzSyntaxTestCase.test_kwargs_lastc                 C   s   |   dd¡ d S )Nzint(**{'base': 10}, '2')z6positional argument follows keyword argument unpackingr   r   r   r   r   Útest_kwargs_last2‡  s    ÿz SyntaxTestCase.test_kwargs_last2c                 C   s   |   dd¡ d S )Nzint(**{'base': 10}, *['2'])z>iterable argument unpacking follows keyword argument unpackingr   r   r   r   r   Útest_kwargs_last3Œ  s    ÿz SyntaxTestCase.test_kwargs_last3c                 C   s6   d}zt |ddƒ W n ty0   |  d¡ Y n0 d S )Nz\
pass
        \

pass
ú<string>r   z8Empty line after a line continuation character is valid.)r   r   r	   )r   Úsr   r   r   Útest_empty_line_after_linecont‘  s
    z-SyntaxTestCase.test_empty_line_after_linecontc                 C   sj   d}t dƒD ]>}|d| › d7 }|d|d  › d7 }|d| › d7 }q|d› d	7 }|  |d
¡ d S )NÚ é   z    ztry:
é   zraise Exception
zexcept Exception as e:
z0                                                Úpassú!too many statically nested blocks)Úranger   )r   r   Úir   r   r   Útest_nested_named_except_blocksž  s    z.SyntaxTestCase.test_nested_named_except_blocksc                 C   s   d}|   |d¡ d S )Nzw
def func1():
    if a != b:
        raise ValueError

def func2():
    try
        return 1
    finally:
        pass
r   r   )r   r   r   r   r   Ú&test_barry_as_flufl_with_syntax_errors¨  s    z5SyntaxTestCase.test_barry_as_flufl_with_syntax_errorsc                 C   s:   | j ddddd | j ddddd | j ddd	dd d S )
Nz	a = 3 \ 4ú6unexpected character after line continuation characterr=   é   )r   r   z1,\#
2é   z
fgdfgf
1,\#
2
r"   r   r   r   r   r   Ú-test_invalid_line_continuation_error_position¹  s    þþþz<SyntaxTestCase.test_invalid_line_continuation_error_positionc                 C   s   |   dd¡ |   dd¡ d S )Nu   A.ÆŠ\ rD   u   A.Î¼\
zunexpected EOF while parsingr   r   r   r   r   Ú-test_invalid_line_continuation_left_recursiveÄ  s    ÿÿz<SyntaxTestCase.test_invalid_line_continuation_left_recursivec                 C   s   d}|   |d¡ d S )Na¸  
while 1:
 while 2:
  while 3:
   while 4:
    while 5:
     while 6:
      while 8:
       while 9:
        while 10:
         while 11:
          while 12:
           while 13:
            while 14:
             while 15:
              while 16:
               while 17:
                while 18:
                 while 19:
                  while 20:
                   while 21:
                    while 22:
                     break
r?   r   r$   r   r   r   Ú)test_syntax_error_on_deeply_nested_blocksÌ  s    	z8SyntaxTestCase.test_syntax_error_on_deeply_nested_blocksc              
   C   s|   dd d }dD ]f}| j |dF |  t¡ t|d|ƒ W d   ƒ n1 sN0    Y  W d   ƒ q1 sl0    Y  qd S )Nú-i † Ú4)r   Úevalr   r   r8   )ZsubTestZassertRaisesÚMemoryErrorr   )r   r%   r   r   r   r   Ú#test_error_on_parser_stack_overflowï  s
    z2SyntaxTestCase.test_error_on_parser_stack_overflow)r   r   NNN)r
   Ú
__module__Ú__qualname__r   r   r    ÚunittestZskipIfr   Zuse_old_parserr!   r&   r'   r*   r,   r-   r.   r2   r3   r4   r5   r6   r7   r:   Zcpython_onlyrB   rC   rG   rH   rI   rN   r   r   r   r   r   ô  s:    ÿ




	
"r   c                  C   s(   t  t¡ ddlm}  t j| dd d S )Nr   ©Útest_syntaxT)Ú	verbosity)r   Zrun_unittestr   ÚtestrS   Zrun_doctestrR   r   r   r   Ú	test_mainø  s    
rV   Ú__main__)r   rQ   rU   r   ZTestCaser   rV   r
   r   r   r   r   Ú<module>ï  s     