B
    u9a„„  ã               @   sÈ   d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dlm	Z	 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rÄe ¡  dS )é    N)Úsupport)Úassert_python_failurec               @   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!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ Z d=d>„ Z!d?d@„ Z"dAdB„ Z#dCS )DÚRoundtripLegalSyntaxTestCasec          
   C   sl   ||ƒ}|  ¡ }yt |¡}W n6 tjk
rT } z|  d||f ¡ W d d }~X Y nX |  ||  ¡ d¡ d S )Nzcould not roundtrip %r: %sz!could not re-generate syntax tree)ÚtotupleÚparserÚsequence2stÚParserErrorÚfailÚassertEqual)ÚselfÚfÚsÚst1ÚtÚst2Úwhy© r   ú!/usr/lib/python3.7/test_parser.pyÚ	roundtrip   s    $z&RoundtripLegalSyntaxTestCase.roundtripc             C   s   |   tj|¡ d S )N)r   r   Úexpr)r   r   r   r   r   Ú
check_expr   s    z'RoundtripLegalSyntaxTestCase.check_exprc             C   s6   t  d¡}| ¡ }i }t|i |ƒ |  |d t¡ d S )Nz/from __future__ import unicode_literals; x = ''Úx)r   ÚsuiteÚcompileÚexecZassertIsInstanceÚstr)r   r   ÚcodeZscoper   r   r   Útest_flags_passed    s
    
z.RoundtripLegalSyntaxTestCase.test_flags_passedc             C   s   |   tj|¡ d S )N)r   r   r   )r   r   r   r   r   Úcheck_suite)   s    z(RoundtripLegalSyntaxTestCase.check_suitec             C   s®   |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d	¡ |   d
¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ d S )Nzdef f(): yield 1zdef f(): yieldzdef f(): x += yieldzdef f(): x = yield 1zdef f(): x = y = yield 1zdef f(): x = yieldzdef f(): x = y = yieldzdef f(): 1 + (yield)*2zdef f(): (yield 1)*2zdef f(): return; yield 1zdef f(): yield 1; returnzdef f(): yield from 1zdef f(): x = yield from 1zdef f(): f((yield from 1))zdef f(): yield 1; return 1z1def f():
    for x in range(30):
        yield x
z)def f():
    if (yield):
        yield x
)r   )r   r   r   r   Útest_yield_statement,   s"    















z1RoundtripLegalSyntaxTestCase.test_yield_statementc             C   s@   |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ d S )Nzasync def f():
 await smth()z"async def f():
 foo = await smth()z'async def f():
 foo, bar = await smth()zasync def f():
 (await smth())z#async def f():
 foo((await smth()))z&async def f():
 await foo(); return 42)r   )r   r   r   r   Útest_await_statementC   s    




z1RoundtripLegalSyntaxTestCase.test_await_statementc             C   s   |   d¡ |   d¡ d S )Nz"async def f():
 async with 1: passz/async def f():
 async with a as b, c as d: pass)r   )r   r   r   r   Útest_async_with_statementK   s    
z6RoundtripLegalSyntaxTestCase.test_async_with_statementc             C   s   |   d¡ |   d¡ d S )Nz'async def f():
 async for i in (): passz*async def f():
 async for i, b in (): pass)r   )r   r   r   r   Útest_async_for_statementO   s    
z5RoundtripLegalSyntaxTestCase.test_async_for_statementc             C   s   |   d¡ |   d¡ d S )Nz3def f():
    x = 0
    def g():
        nonlocal x
z:def f():
    x = y = 0
    def g():
        nonlocal x, y
)r   )r   r   r   r   Útest_nonlocal_statementS   s    
z4RoundtripLegalSyntaxTestCase.test_nonlocal_statementc             C   s”  |   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foo(1)z	[1, 2, 3]z[x**3 for x in range(20)]z"[x**3 for x in range(20) if x % 3]z+[x**3 for x in range(20) if x % 2 if x % 3]zlist(x**3 for x in range(20))z&list(x**3 for x in range(20) if x % 3)z/list(x**3 for x in range(20) if x % 2 if x % 3)z
foo(*args)zfoo(*args, **kw)z	foo(**kw)zfoo(key=value)zfoo(key=value, *args)zfoo(key=value, *args, **kw)zfoo(key=value, **kw)zfoo(a, b, c, *args)zfoo(a, b, c, *args, **kw)zfoo(a, b, c, **kw)zfoo(a, *args, keyword=23)z	foo + barz	foo - barz	foo * barz	foo / barz
foo // barz	lambda: 0zlambda x: 0zlambda *y: 0zlambda *y, **z: 0zlambda **z: 0zlambda x, y: 0zlambda foo=bar: 0z"lambda foo=bar, spaz=nifty+spit: 0zlambda foo=bar, **z: 0z#lambda foo=bar, blaz=blat+2, **z: 0z'lambda foo=bar, blaz=blat+2, *y, **z: 0zlambda x, *y, **z: 0z(x for x in range(10))zfoo(x for x in range(10))z...za[...])r   )r   r   r   r   Útest_expressions]   sP    






































z-RoundtripLegalSyntaxTestCase.test_expressionsc             C   s   |   d¡ d S )NÚa)r   )r   r   r   r   Útest_simple_expression‡   s    z3RoundtripLegalSyntaxTestCase.test_simple_expressionc             C   s   |   d¡ |   d¡ d S )Nza = bza = b = c = d = e)r   )r   r   r   r   Útest_simple_assignments‹   s    
z4RoundtripLegalSyntaxTestCase.test_simple_assignmentsc          	   C   s¼  |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d	¡ |   d
¡ |  t¡ tdi i ƒ W d Q R X |  t¡ tdi i ƒ W d Q R X |  t¡ tdi i ƒ W d Q R X |  t¡ tdi i ƒ W d Q R X |  t¡ tdi i ƒ W d Q R X |  t¡ tdi i ƒ W d Q R X |  t¡ tdi i ƒ W d Q R X |  t¡ tdi i ƒ W d Q R X |  t¡ tdi i ƒ W d Q R X |  t¡ tdi i ƒ W d Q R X d S )Nz
x: int = 5z"y: List[T] = []; z: [list] = fun()zx: tuple = (1, 2)zd[f()]: int = 42zf(d[x]): str = 'abc'zx.y.z.w: complex = 42jzx: intz#def f():
    x: str
    y: int = 5
z#class C:
    x: str
    y: int = 5
zIclass C:
    def __init__(self, x: int) -> None:
        self.x: int = x
z2+2: intz[]: int = 5zx, *y, z: int = range(5)zt: tuple = 1, 2z
u = v: intz
False: intzx.False: intz	x.y,: intz[0]: intzf(): int)r   ÚassertRaisesÚSyntaxErrorr   )r   r   r   r   Útest_var_annot   s<    









z+RoundtripLegalSyntaxTestCase.test_var_annotc             C   s|   |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d	¡ |   d
¡ |   d¡ |   d¡ d S )Nza += bza -= bza *= bza /= bza //= bza %= bza &= bza |= bza ^= bza <<= bza >>= bza **= b)r   )r   r   r   r   Ú!test_simple_augmented_assignments¶   s    










z>RoundtripLegalSyntaxTestCase.test_simple_augmented_assignmentsc             C   sl  |   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def f(): passzdef f(*args): passzdef f(*args, **kw): passzdef f(**kw): passzdef f(foo=bar): passzdef f(foo=bar, *args): passz!def f(foo=bar, *args, **kw): passzdef f(foo=bar, **kw): passzdef f(a, b): passzdef f(a, b, *args): passzdef f(a, b, *args, **kw): passzdef f(a, b, **kw): passzdef f(a, b, foo=bar): passz!def f(a, b, foo=bar, *args): passz'def f(a, b, foo=bar, *args, **kw): passz def f(a, b, foo=bar, **kw): passz@staticmethod
def f(): passz,@staticmethod
@funcattrs(x, y)
def f(): passz@funcattrs()
def f(): passzdef f(*, a): passzdef f(*, a = 5): passzdef f(*, a = 5, b): passzdef f(*, a, b = 5): passz def f(*, a, b = 5, **kwds): passzdef f(*args, a): passzdef f(*args, a = 5): passzdef f(*args, a = 5, b): passzdef f(*args, a, b = 5): passz$def f(*args, a, b = 5, **kwds): passzdef f(a: int): passzdef f(a: int = 5): passzdef f(*args: list): passzdef f(**kwds: dict): passzdef f(*, a: int): passzdef f(*, a: int = 5): passzdef f() -> int: pass)r   )r   r   r   r   Útest_function_defsÄ   sH    


































z/RoundtripLegalSyntaxTestCase.test_function_defsc             C   s6   |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ d S )Nzclass foo():passzclass foo(object):passz!@class_decorator
class foo():passz&@class_decorator(arg)
class foo():passz(@decorator1
@decorator2
class foo():pass)r   )r   r   r   r   Útest_class_defsô   s
    



z,RoundtripLegalSyntaxTestCase.test_class_defsc             C   s®   |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d	¡ |   d
¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ d S )Nzfrom sys.path import *zfrom sys.path import dirnamezfrom sys.path import (dirname)zfrom sys.path import (dirname,)z*from sys.path import dirname as my_dirnamez,from sys.path import (dirname as my_dirname)z-from sys.path import (dirname as my_dirname,)z&from sys.path import dirname, basenamez(from sys.path import (dirname, basename)z)from sys.path import (dirname, basename,)z4from sys.path import dirname as my_dirname, basenamez6from sys.path import (dirname as my_dirname, basename)z7from sys.path import (dirname as my_dirname, basename,)z5from sys.path import dirname, basename as my_basenamez7from sys.path import (dirname, basename as my_basename)z8from sys.path import (dirname, basename as my_basename,)zfrom .bogus import x)r   )r   r   r   r   Útest_import_from_statementÿ   s.    









z7RoundtripLegalSyntaxTestCase.test_import_from_statementc             C   s6   |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ d S )Nz
import syszimport sys as systemzimport sys, mathzimport sys as system, mathzimport sys, math as my_math)r   )r   r   r   r   Útest_basic_import_statement  s
    



z8RoundtripLegalSyntaxTestCase.test_basic_import_statementc             C   sT   |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ d S )	Nzfrom . import namezfrom .. import namezfrom ... import namezfrom .... import namezfrom .pkg import namezfrom ..pkg import namezfrom ...pkg import namezfrom ....pkg import name)r   )r   r   r   r   Útest_relative_imports  s    






z2RoundtripLegalSyntaxTestCase.test_relative_importsc             C   s   |   d¡ d S )Nz"# -*- coding: iso-8859-1 -*-
pass
)r   )r   r   r   r   Útest_pep263+  s    z(RoundtripLegalSyntaxTestCase.test_pep263c             C   s   |   d¡ d S )Nzassert alo < ahi and blo < bhi
)r   )r   r   r   r   Útest_assert/  s    z(RoundtripLegalSyntaxTestCase.test_assertc             C   s"   |   d¡ |   d¡ |   d¡ d S )Nzwith open('x'): pass
zwith open('x') as f: pass
z*with open('x') as f, open('y') as g: pass
)r   )r   r   r   r   Ú	test_with2  s    

z&RoundtripLegalSyntaxTestCase.test_withc             C   s@   |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ d S )Nztry: pass
except: pass
ztry: pass
finally: pass
z'try: pass
except A: pass
finally: pass
z4try: pass
except A: pass
except: pass
finally: pass
z"try: pass
except: pass
else: pass
z0try: pass
except: pass
else: pass
finally: pass
)r   )r   r   r   r   Útest_try_stmt7  s    




z*RoundtripLegalSyntaxTestCase.test_try_stmtc             C   s   |   d¡ |   d¡ d S )Nzif True:
  pass
else:
  pass
z/if True:
  pass
elif True:
  pass
else:
  pass
)r   )r   r   r   r   Útest_if_stmtA  s    
z)RoundtripLegalSyntaxTestCase.test_if_stmtc                s@  d}t  |¡}‡ fdd„‰ dddddd	d
dddddddddg}|  tˆ |jdddƒƒ|¡ |  tˆ | ¡ ƒƒdd„ |D ƒ¡ |  tˆ |jddƒƒdd„ |D ƒ¡ |  tˆ |jddƒƒdd„ |D ƒ¡ |  tˆ |jdddƒƒdd„ |D ƒ¡ |  tˆ t j|dddƒƒ|¡ |  tˆ t j|dddƒƒdd„ |D ƒ¡ d S )Nzdef f(x):
    return x + 1c             3   sX   | d }| d }t |ttfƒrNx4| dd … D ]}xˆ |ƒD ]
}|V  q:W q,W n| V  d S )Nr   é   )Ú
isinstanceÚtupleÚlist)ÚtreeZ	node_typeÚnextZeltr   )Úwalkr   r   r<   K  s    z8RoundtripLegalSyntaxTestCase.test_position.<locals>.walk)r6   Údefr6   r   )r6   r   r6   é   )é   ú(r6   é   )r6   r   r6   é   )é   ú)r6   r?   )é   ú:r6   rC   )r>   Ú r6   é	   )rA   rG   é   éÿÿÿÿ)r6   ÚreturnrI   r>   )r6   r   rI   rE   )é   ú+rI   é   )rI   Ú1rI   é   )r>   rG   rI   é   )rB   rG   rI   rJ   )r>   rG   rI   rJ   )r   rG   rI   rJ   T)Ú	line_infoÚcol_infoc             S   s   g | ]\}}}}||f‘qS r   r   )Ú.0r   ÚnÚlÚcr   r   r   ú
<listcomp>k  s    z>RoundtripLegalSyntaxTestCase.test_position.<locals>.<listcomp>)rR   c             S   s   g | ]\}}}}|||f‘qS r   r   )rT   r   rU   rV   rW   r   r   r   rX   m  s    )rS   c             S   s   g | ]\}}}}|||f‘qS r   r   )rT   r   rU   rV   rW   r   r   r   rX   o  s    c             S   s   g | ]}t |ƒ‘qS r   )r9   )rT   r   r   r   r   rX   q  s    c             S   s   g | ]}t |ƒ‘qS r   )r9   )rT   r   r   r   r   rX   w  s    )r   r   r
   r9   r   ÚtolistZst2tupleZst2list)r   r   ÚstZexpectedr   )r<   r   Útest_positionE  sF    


z*RoundtripLegalSyntaxTestCase.test_positionc             C   s,   |   d¡ |   d¡ |   d¡ |   d¡ d S )Nz*a = yz
x, *b, = mz[*a, *b] = yzfor [*x, b] in x: pass)r   )r   r   r   r   Útest_extended_unpackingy  s    


z4RoundtripLegalSyntaxTestCase.test_extended_unpackingc             C   s"   |   d¡ |   d¡ |   d¡ d S )Nzraise
zraise e
zBtry:
    suite
except Exception as e:
    raise ValueError from e
)r   )r   r   r   r   Útest_raise_statement  s    

z1RoundtripLegalSyntaxTestCase.test_raise_statementc             C   s   |   d¡ |   d¡ d S )Nz[]z[*{2}, 3, *[4]])r   )r   r   r   r   Útest_list_displays‡  s    
z/RoundtripLegalSyntaxTestCase.test_list_displaysc             C   s6   |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ d S )Nz{*{2}, 3, *[4]}z{2}z{2,}z{2, 3}z{2, 3,})r   )r   r   r   r   Útest_set_displays‹  s
    



z.RoundtripLegalSyntaxTestCase.test_set_displaysc             C   sJ   |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ d S )Nz{}z{a:b}z{a:b,}z
{a:b, c:d}z{a:b, c:d,}z{**{}}z{**{}, 3:4, **{5:6, 7:8}})r   )r   r   r   r   Útest_dict_displays’  s    





z/RoundtripLegalSyntaxTestCase.test_dict_displaysc             C   s6   |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ d S )Nz
f(*a, **b)zf(a, *b, *c, *d)zf(**a, **b)zf(2, *a, *b, **b, **c, **d)z0f(*b, *() or () and (), **{} and {}, **() or {}))r   )r   r   r   r   Útest_argument_unpacking›  s
    



z4RoundtripLegalSyntaxTestCase.test_argument_unpackingc             C   s"   |   d¡ |   d¡ |   d¡ d S )Nz{x for x in seq}z{f(x) for x in seq}z#{f(x) for x in seq if condition(x)})r   )r   r   r   r   Útest_set_comprehensions¢  s    

z4RoundtripLegalSyntaxTestCase.test_set_comprehensionsc             C   s"   |   d¡ |   d¡ |   d¡ d S )Nz{x:x for x in seq}z({x**2:x[3] for x in seq if condition(x)}z4{x:x for x in seq1 for y in seq2 if condition(x, y)})r   )r   r   r   r   Útest_dict_comprehensions§  s    

z5RoundtripLegalSyntaxTestCase.test_dict_comprehensionsN)$Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r    r!   r"   r#   r$   r&   r'   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r[   r\   r]   r^   r_   r`   ra   rb   rc   r   r   r   r   r      sB   	
*'0
4	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 )ÚIllegalSyntaxTestCasec             C   s8   yt  |¡ W n t jk
r$   Y nX |  d| ¡ d S )Nz"did not detect invalid tree for %r)r   r   r   r	   )r   r:   Zlabelr   r   r   Úcheck_bad_tree´  s
    z$IllegalSyntaxTestCase.check_bad_treec             C   s   |   dd¡ d S )N)r6   rI   é   z<junk>)rh   )r   r   r   r   Ú	test_junk¼  s    zIllegalSyntaxTestCase.test_junkc             C   sD   d}|   |d¡ d}|   |d¡ d}|   |d¡ d}|   |d¡ d S )	N)i  )i  )i  )i  )i  )r6   )r>   rG   )r>   rG   )r   rG   z too small items in terminal node)i  )i  )i  )i  )i  )r6   s   pass)r>   rG   )r>   rG   )r   rG   z'non-string second item in terminal node)i  )i  )i  )i  )i  )r6   ÚpassÚ0r   )r>   rG   )r>   rG   )r   rG   z'non-integer third item in terminal node)i  )i  )i  )i  )i  )r6   rk   r   r   )r>   rG   )r>   rG   )r   rG   ztoo many items in terminal node)rh   )r   r:   r   r   r   Útest_illegal_terminalÀ  s    				z+IllegalSyntaxTestCase.test_illegal_terminalc             C   s   d}|   |d¡ d S )N)i  )i  )i  )i  )r6   r=   )r6   r   )i  )r?   r@   )rC   rD   )rE   rF   )i#  )r>   rG   )rA   rG   )i  )i	  )i
  )i  )i  )r6   rK   )i9  )i$  )i%  )i&  )i'  )i)  )i*  )i+  )i,  )i-  )i.  )i/  )i0  )i1  )rI   rO   )i  )i	  )i
  )i  )i  )r6   Úyield)i9  )i$  )i%  )i&  )i'  )i)  )i*  )i+  )i,  )i-  )i.  )i/  )i0  )i1  )rI   rO   )r>   rG   )rB   rG   )r>   rG   )r   rG   zdef f():
  return 1
  yield 1)rh   )r   r:   r   r   r   Útest_illegal_yield_1î  s    2z*IllegalSyntaxTestCase.test_illegal_yield_1c             C   s   d}|   |d¡ d S )N)i  )i  )i	  )i
  )i  )r6   Úfrom)i  )r6   Z
__future__)r6   Úimport)i  )r6   Z
generators)r>   rG   )i  )i  )i  )r6   r=   )r6   r   )i  )r?   r@   )rC   rD   )rE   rF   )i#  )r>   rG   )rA   rG   )i  )i	  )i
  )i  )i  )r6   rK   )i9  )i$  )i%  )i&  )i'  )i)  )i*  )i+  )i,  )i-  )i.  )i/  )i0  )i1  )rI   rO   )i  )i	  )i
  )i  )i  )r6   rn   )i9  )i$  )i%  )i&  )i'  )i)  )i*  )i+  )i,  )i-  )i.  )i/  )i0  )i1  )rI   rO   )r>   rG   )rB   rG   )r>   rG   )r   rG   zdef f():
  return 1
  yield 1)rh   )r   r:   r   r   r   Útest_illegal_yield_2%  s    ;z*IllegalSyntaxTestCase.test_illegal_yield_2c             C   s   d}|   |d¡ d S )N)i  )i7  )i"  )i#  )i$  )i%  )i'  )i(  )i)  )i*  )i+  )i,  )i-  )i.  )i/  )r6   r%   )é   ú,)rs   rt   )i"  )i#  )i$  )i%  )i'  )i(  )i)  )i*  )i+  )i,  )i-  )i.  )i/  )r6   rW   )r>   rG   )r   rG   za,,c)rh   )r   r:   r   r   r   Útest_a_comma_comma_ce  s    z*IllegalSyntaxTestCase.test_a_comma_comma_cc             C   s   d}|   |d¡ d S )N)i  )i  )i	  )i
  )i  )i8  )i#  )i$  )i%  )i&  )i(  )i)  )i*  )i+  )i,  )i-  )i.  )i/  )i0  )r6   r%   )i  )é%   z$=)i8  )i#  )i$  )i%  )i&  )i(  )i)  )i*  )i+  )i,  )i-  )i.  )i/  )i0  )r6   Úb)r>   rG   )r   rG   za $= b)rh   )r   r:   r   r   r   Útest_illegal_operator€  s    z+IllegalSyntaxTestCase.test_illegal_operatorc             C   s   d}|   |d¡ d S )N)i  )i  )i	  )i
  )i  )r6   Zfoo)r>   rG   )r>   rG   )r   rG   zmalformed global ast)rh   )r   r:   r   r   r   Útest_malformed_global¡  s    z+IllegalSyntaxTestCase.test_malformed_globalc             C   s   d}|   |d¡ d S )N)i  )i  )i  )i  )i  )i  )r6   rp   )r6   rq   )i  )i  )r6   Zfred)r>   rG   )r>   rG   )r   rG   zfrom import fred)rh   )r   r:   r   r   r   Útest_missing_import_source¬  s    	z0IllegalSyntaxTestCase.test_missing_import_sourcec          	   C   sH   d}|   |d¡ d}|   |d¡ d}|  t¡ t |¡ W d Q R X d S )N)iT  )i  )r   rG   zmissed encoding)iT  )i  )r   rG   s
   iso-8859-1znon-string encoding)iT  )i  )r   rG   u   í³¿)rh   r(   ÚUnicodeEncodeErrorr   r   )r   r:   r   r   r   Útest_illegal_encodingº  s    z+IllegalSyntaxTestCase.test_illegal_encodingc             C   s4   d}|   |d¡ d}|   |d¡ d}|   |d¡ d S )N)i  )i  )iùÿÿÿrG   znegative node id)i  )i  )éc   rG   zinvalid token id)i  )i  )i'  )r   rG   zinvalid symbol id)rh   )r   r:   r   r   r   Útest_invalid_node_idÌ  s    z*IllegalSyntaxTestCase.test_invalid_node_idc          
   C   sX   yt  d¡ W nD t jk
rR } z$|  dt|ƒ¡ |  dt|ƒ¡ W d d }~X Y nX d S )N)i  )i  )i  )r   rG   Zsimple_stmtZ
file_input)r   r   r   ÚassertInr   )r   r   r   r   r   Útest_ParserError_messageÔ  s
    z.IllegalSyntaxTestCase.test_ParserError_messageN)rd   re   rf   rh   rj   rm   ro   rr   ru   rx   ry   rz   r|   r~   r€   r   r   r   r   rg   ²  s   .7@!rg   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S )ÚCompileTestCasec             C   s(   t  d¡}t  |¡}|  t|ƒd¡ d S )Nz2 + 3rA   )r   r   Ú	compilestr
   Úeval)r   rZ   r   r   r   r   Útest_compile_exprá  s    

z!CompileTestCase.test_compile_exprc             C   s6   t  d¡}t  |¡}i }t||ƒ |  |d d¡ d S )Nzx = 2; y = x + 3ÚyrA   )r   r   r‚   r   r
   )r   rZ   r   Zglobsr   r   r   Útest_compile_suiteæ  s
    


z"CompileTestCase.test_compile_suitec             C   s   t  d¡}|  tt j|¡ d S )Nz	1 = 3 + 4)r   r   r(   r)   r‚   )r   rZ   r   r   r   Útest_compile_errorí  s    
z"CompileTestCase.test_compile_errorc             C   s8   t  d¡}|  tt j|¡ t  d¡}|  tt j|¡ d S )Nza = "\U12345678"z	a = "\u1")r   r   r(   r)   r‚   )r   rZ   r   r   r   Útest_compile_badunicodeñ  s    

z'CompileTestCase.test_compile_badunicodec             C   sB   t  d¡}t  |¡}|  t|ƒd¡ t  |¡}|  t|ƒd¡ d S )Nz-3éýÿÿÿ)r   r   r‚   r
   rƒ   )r   rZ   Úcode1Úcode2r   r   r   Útest_issue_9011÷  s
    


zCompileTestCase.test_issue_9011c          
   C   s  t  d¡}t  |¡}|  |jd¡ | ¡ }|  |jd¡ x>dD ]6}t  ||¡}|  |jd¡ | |¡}|  |jd¡ q>W xvtdƒtdƒfD ]b}|  t	¡ t  ||¡}W d Q R X |  |jd¡ |  t	¡ | |¡}W d Q R X |  |jd¡ qŠW |  
tt j|tdƒ¡ |  
t|jtdƒ¡ d S )Nza + 5z<syntax-tree>)zfile.pys   file.pyzfile.pys   file.py)r   r   r‚   r
   Úco_filenamer   Ú	bytearrayÚ
memoryviewZassertWarnsÚDeprecationWarningr(   Ú	TypeErrorr9   )r   rZ   r   Úfilenamer   r   r   Útest_compile_filename  s&    



z%CompileTestCase.test_compile_filenameN)	rd   re   rf   r„   r†   r‡   rˆ   rŒ   r“   r   r   r   r   r   Ý  s   
r   c               @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚParserStackLimitTestCasezitry to push the parser to/over its limits.
    see http://bugs.python.org/issue1881 for a discussion
    c             C   s   d| d|  S )Nú[ú]r   )r   Úlevelr   r   r   Ú_nested_expression  s    z+ParserStackLimitTestCase._nested_expressionc             C   s    |   d¡}t |¡}| ¡  d S )Né]   )r˜   r   r   r   )r   ÚerZ   r   r   r   Útest_deeply_nested_list  s    

z0ParserStackLimitTestCase.test_deeply_nested_listc             C   s6   |   d¡}td|ƒ\}}}|  d|¡ |  d|¡ d S )Néd   z-cs   s_push: parser stack overflows   MemoryError)r˜   r   r   )r   rš   ZrcÚoutÚerrr   r   r   Útest_trigger_memory_error$  s    
z2ParserStackLimitTestCase.test_trigger_memory_errorN)rd   re   rf   Ú__doc__r˜   r›   rŸ   r   r   r   r   r”     s   r”   c               @   s4   e Zd ZdZdd„ Zdd„ ZejZejdd„ ƒZ	dS )	ÚSTObjectTestCasez(Test operations on ST objects themselvesc       
      C   s  t  d¡}t  d¡}t  d¡}t  d¡}t  d¡}t  d¡}|  ||kd¡ |  ||kd¡ |  ||kd¡ |  ||¡ |  ||¡ |  ||¡ |  ||kd¡ |  ||kd¡ |  ||kd¡ |  ||kd¡ |  ||kd¡ |  ||kd¡ |  ||kd¡ |  ||kd¡ |  ||kd¡ |  ||kd¡ |  ||kd¡ |  ||kd¡ |  ||k ||k ¡ |  ||k ||k ¡ |  ||k ||k ¡ |  ||k ||k¡ |  ||k ||k¡ |  ||k ||k¡ |  ||k||k¡ |  ||k||k¡ |  ||k||k¡ t|||ƒ}t|||ƒ}t|||gƒd }	|  ||	k ¡ |  ||k ¡ |  |	|k ¡ |  ||	k¡ |  ||k¡ |  |	|k¡ |  ||k¡ |  |	|	k¡ |  ||k¡ |  |dkd¡ |  d|kd¡ |  t	t
j|d ¡ |  t	t
jd|¡ |  t	t
j|d	¡ |  t	t
jd
|¡ d S )Nz2 + 3zx = 2; y = x + 3zlist(x**3 for x in range(20))TFr6   g¹ëhÒ˜@zspanish armadai  s   waterloo)r   r   r   r
   ÚminÚmaxÚsortedZ
assertTruer(   r‘   ÚoperatorÚgeÚleÚltÚgt)
r   r   r   Zst3Zst1_copyZst2_copyZst3_copyZbottomÚtopZmidr   r   r   Útest_comparisons/  sf    





z!STObjectTestCase.test_comparisonsc             C   s¨   t  d¡t  d¡t  d¡g}x†|D ]~}t |¡}|  | ¡ | ¡ ¡ t |¡}|  | ¡ | ¡ ¡ x<ttj	d ƒD ]*}t 
t ||¡¡}|  | ¡ | ¡ ¡ qrW q"W d S )Nz2 + 3zx = 2; y = x + 3zlist(x**3 for x in range(20))r6   )r   r   r   Úcopyr
   r   ZdeepcopyÚrangeÚpickleZHIGHEST_PROTOCOLÚloadsÚdumps)r   ÚstsrZ   Zst_copyÚprotor   r   r   Útest_copy_picklel  s    


z!STObjectTestCase.test_copy_picklec                s–   dd„ ‰ t  d¡‰t d¡‰‡ ‡‡fdd„‰‡‡‡‡fdd„}|t d	¡ƒ |t d
¡ƒ |t d¡ƒ |t d¡ƒ |t d¡ƒ |t d¡ƒ d S )Nc             S   s0   | dkr| S | dkr | d d@ S d| d   ¡ > S )Nr6   é€   ri   éüÿÿÿ)Ú
bit_length)rU   r   r   r   Ú
XXXROUNDUP  s
    z0STObjectTestCase.test_sizeof.<locals>.XXXROUNDUPZPiiZhP3iP0hc                s”   | d krdS d}t | ƒdko(t| d tƒ}|rB|t | d ƒd 7 }|rR| dd… n
| dd … }|r|ˆ t |ƒƒˆ 7 }x|D ]}|ˆ|ƒ7 }q|W |S )Nr   r6   rJ   )Úlenr7   r   )ZnodeZresÚhasstrZchildrenZchild)r·   ÚnodesizeÚsizeofchildrenr   r   r»   ˆ  s    
z4STObjectTestCase.test_sizeof.<locals>.sizeofchildrenc                s    ˆ  | ˆ ˆ ˆ|  ¡ ƒ ¡ d S )N)Úcheck_sizeofr   )rZ   )Úbasesizerº   r   r»   r   r   Úcheck_st_sizeof–  s    z5STObjectTestCase.test_sizeof.<locals>.check_st_sizeofz2 + 3z	2 + 3 + 4z	x = 2 + 3rG   z# -*- coding: utf-8 -*-aÒ  [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,])r   ZcalcobjsizeÚstructÚcalcsizer   r   r   )r   r¾   r   )r·   r½   rº   r   r»   r   Útest_sizeof}  s    

zSTObjectTestCase.test_sizeofN)
rd   re   rf   r    r«   r³   r   r¼   Zcpython_onlyrÁ   r   r   r   r   r¡   ,  s
   =r¡   c               @   s   e Zd Zdd„ ZdS )ÚOtherParserCasec          	   C   s&   |   t¡ t dd¡ W d Q R X d S )Nr%   rw   )r(   r‘   r   r   )r   r   r   r   Útest_two_args_to_expr¦  s    z%OtherParserCase.test_two_args_to_exprN)rd   re   rf   rÃ   r   r   r   r   rÂ   ¤  s   rÂ   Ú__main__)r¬   r   r®   Zunittestr¥   r¿   Ztestr   Ztest.support.script_helperr   ZTestCaser   rg   r   r”   r¡   rÂ   rd   Úmainr   r   r   r   Ú<module>   s(      %  -:x