B
    ­»ˆdL>  ã               @   s¦  d Z ddlm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ZddlZddlZddlZddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ e	j e	j e	j ej¡d¡¡ZG dd„ dejƒZG dd„ dejƒZdd„ Z G dd„ de!ƒZ"G dd„ dee"ejƒƒZ#dd„ Z$G dd„ de!ƒZ%G dd„ dee%ejƒƒZ&G dd„ dejƒZ'G dd „ d ejƒZ(d!d"„ Z)d#d$„ Z*d%d&„ Z+e,d'kr¢e -¡  dS )(zTests for annotate.é    )Úabsolute_import)Údivision)Úprint_functionN)Úwith_metaclass)Úannotate)Ú	ast_utils)Úcodegen)Ú
formatting)Ú
test_utilsz../testdatac               @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚPrefixSuffixTestc       
         s¼   t  d¡}d}dd„ ‰x |D ]˜\‰ }|j|d}t |¡}t ‡ ‡fdd„¡}| |¡ |jd }d	}t	t
 |d
ˆ  ¡ƒ}	|  ||	d|||jd t|	|ƒ¡f ¡ |  |t |¡¡ qW d S )Nzn        {open_block}
          pass #a
          #b
            #c

          #d
        #e
        a
        ))Úbodyzdef x():)r   zclass X:)r   zif x:)Úorelsezif x:
  y
else:)r   zif x:
  y
elif y:)r   zwhile x:)r   zwhile x:
  y
else:)Z	finalbodyztry:
  x
finally:)r   ztry:
  x
except:)r   ztry:
  x
except:
  y
else:)r   zwith x:)r   z
with x, y:)r   zwith x:
 with y:)r   zfor x in y:c             S   s(   t | |d ƒ}t|tƒo&t|d ƒtjkS )Nr   )ÚgetattrÚ
isinstanceÚlistÚtypeÚastÚPass)ÚnodeÚchildren_attrÚval© r   úJ/var/www/html/venv/lib/python3.7/site-packages/pasta/base/annotate_test.pyÚis_node_for_suffixH   s    z>PrefixSuffixTest.test_block_suffix.<locals>.is_node_for_suffix)Ú
open_blockc                s
   ˆ| ˆ ƒS )Nr   )r   )r   r   r   r   Ú<lambda>Q   ó    z4PrefixSuffixTest.test_block_suffix.<locals>.<lambda>r   z  #b
    #c

  #d
zblock_suffix_%sz9Incorrect suffix for code:
%s
Node: %s (line %d)
Diff:
%sÚ
)ÚtextwrapÚdedentÚformatÚpastaÚparser   ZFindNodeVisitorÚvisitÚresultsÚstrÚfmtÚgetÚassertMultiLineEqualÚlinenoÚjoinÚ	_get_diffÚdump)
ÚselfZsrc_tplZ
test_casesr   ÚsrcÚtZnode_finderr   ÚexpectedÚactualr   )r   r   r   Útest_block_suffix+   s$    	


z"PrefixSuffixTest.test_block_suffixc             C   s4   d}t  |¡}|  || d¡d … t |d¡¡ d S )Nzfoo
#bar

#baz
z#barÚsuffix)r!   r"   ÚassertEqualÚindexr&   r'   )r-   r.   r/   r   r   r   Útest_module_suffix\   s    
z#PrefixSuffixTest.test_module_suffixc             C   s*   d}t  |¡}|  t |jd d¡¡ d S )Nzif x:  return y
  #a
#b
r   Zblock_suffix_body)r!   r"   ÚassertIsNoner&   r'   r   )r-   r.   r/   r   r   r   Ú.test_no_block_suffix_for_single_line_statementa   s    
z?PrefixSuffixTest.test_no_block_suffix_for_single_line_statementc             C   sF   d}t  |¡}|  dt |jd d¡¡ |  dt |jd d¡¡ d S )Nza

foo


b
r   é   Úprefixr3   )r!   r"   r4   r&   r'   r   )r-   r.   r/   r   r   r   Útest_expression_prefix_suffixf   s    
z.PrefixSuffixTest.test_expression_prefix_suffixc             C   sF   d}t  |¡}|  dt |jd d¡¡ |  dt |jd d¡¡ d S )Nza

def foo():
  return bar


b
r   r9   r:   Ú r3   )r!   r"   r4   r&   r'   r   )r-   r.   r/   r   r   r   Útest_statement_prefix_suffixl   s    
z-PrefixSuffixTest.test_statement_prefix_suffixN)Ú__name__Ú
__module__Ú__qualname__r2   r6   r8   r;   r=   r   r   r   r   r   )   s
   1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e d¡dd„ ƒZe d¡dd„ ƒZe d¡dd„ ƒZdS )ÚIndentationTestc             C   sÖ   t  d¡}t |¡}t |tjf¡}|jdd„ d |\}}}}}}	}
|  	dt
 |d¡¡ |  	dt
 |d¡¡ |  	dt
 |d¡¡ |  	d	t
 |d¡¡ |  	dt
 |d¡¡ |  	dt
 |	d¡¡ |  	dt
 |
d¡¡ d S )
NzÌ        foo('begin')
        if a:
          foo('a1')
          if b:
            foo('b1')
            if c:
              foo('c1')
            foo('b2')
          foo('a2')
        foo('end')
        c             S   s   | j S )N)r)   )r   r   r   r   r   „   r   z4IndentationTest.test_indent_levels.<locals>.<lambda>)Úkeyr<   Úindentz  z    z      )r   r   r!   r"   r   Úfind_nodes_by_typer   ÚCallÚsortr4   r&   r'   )r-   r.   r/   Z
call_nodesÚbeginZa1Úb1Úc1Úb2Za2Úendr   r   r   Útest_indent_levelsu   s    
z"IndentationTest.test_indent_levelsc             C   sJ   d}t  |¡}|jd }|j\}}|  t |d¡¡ |  t |d¡¡ d S )Nzif a: b; c
r   Úindent_diff)r!   r"   r   r7   r&   r'   )r-   r.   r/   Úif_nodeÚbÚcr   r   r   Útest_indent_levels_same_line   s    


z,IndentationTest.test_indent_levels_same_linec       
      C   sØ   d}d}xÊt  ||¡D ]º\}}|j||d}t |¡}|jd }|jd }|jd }	|  dt |d¡¡ |  dt |d¡¡ |  |t |d¡¡ |  |t |d¡¡ |  || t |	d¡¡ |  |t |	d¡¡ qW d S )Nz(if a:
{first}if b:
{first}{second}foo()
)ú z  z    z        ú	z		)ÚfirstÚsecondr   r<   rC   rM   )	Ú	itertoolsÚproductr    r!   r"   r   r4   r&   r'   )
r-   ÚtemplateÚindentsrT   rU   r.   r/   Zouter_if_nodeZinner_if_nodeZ	call_noder   r   r   Útest_indent_depths—   s    



z"IndentationTest.test_indent_depthsc             C   sP   t  d¡}t |¡}|jd j\}}|  dt |d¡¡ |  dt |d¡¡ d S )NzQ        class A:
          """Doc
             string."""
          pass
        r   z  rC   )r   r   r!   r"   r   r4   r&   r'   )r-   r.   r/   Ú	docstringÚ	pass_stmtr   r   r   Útest_indent_multiline_string©   s    
z,IndentationTest.test_indent_multiline_stringc             C   sP   t  d¡}t |¡}|jd j\}}|  dt |d¡¡ |  dt |d¡¡ d S )NzR        class A:
          """Doc

             string."""
          pass
        r   z  rC   )r   r   r!   r"   r   r4   r&   r'   )r-   r.   r/   r[   r\   r   r   r   Ú)test_indent_multiline_string_with_newlineµ   s    
z9IndentationTest.test_indent_multiline_string_with_newlinec             C   sÖ   d}xBdD ]:}t  |j|d¡}|  | d¡d t |jd d¡¡ q
W d}xBdD ]:}t  |j|d¡}|  | d¡d t |jd d	¡¡ qRW d
}x<dD ]4}t  |j|d¡}|  |d t |jd d¡¡ qšW d S )Nz#def foo(a, b{trailing_comma}): pass)r<   ú,z , )Útrailing_commarR   ú)r   Zargs_suffixz%class Foo(a, b{trailing_comma}): passZbases_suffixz&from mod import (a, b{trailing_comma})Znames_suffix)r!   r"   r    r4   Úlstripr&   r'   r   )r-   rX   r`   Útreer   r   r   Útest_scope_trailing_commaÁ   s    



z)IndentationTest.test_scope_trailing_commac             C   s@   t  d¡}t |¡}|jd }|jd }|  dt |d¡¡ d S )Nz#        if a:

          b
        r   z  rM   )r   r   r!   r"   r   r4   r&   r'   )r-   r.   r/   rN   rO   r   r   r   Útest_indent_extra_newlinesÔ   s    


z*IndentationTest.test_indent_extra_newlinesc             C   s@   t  d¡}t |¡}|jd }|jd }|  dt |d¡¡ d S )Nz9        if a:
            #not here

          b
        r   z  rM   )r   r   r!   r"   r   r4   r&   r'   )r-   r.   r/   rN   rO   r   r   r   Ú'test_indent_extra_newlines_with_commentß   s    


z7IndentationTest.test_indent_extra_newlines_with_commentc             C   sR   t  d¡}t  d¡}t |¡}t tjdd¡|jd jd< |  |t	 
|¡¡ d S )Nz5        def a():
            b
            c
        z<        def a():
            b
            new_node
        Únew_node)Úidr   r9   )r   r   r!   r"   r   ÚExprÚNamer   r(   r   Úto_str)r-   r.   r0   r/   r   r   r   Útest_autoindentë   s    
zIndentationTest.test_autoindentZmixed_tabs_spacesc             C   s   t  t d¡jdd¡ d S )Nz:        if a:
                b
        {ONETAB}c
        rS   )ÚONETAB)r!   r"   r   r   r    )r-   r   r   r   Ú"test_mixed_tabs_spaces_indentationû   s    z2IndentationTest.test_mixed_tabs_spaces_indentationc             C   sh   xbt ddƒD ]T}t t d¡jdd| d¡}|jd jd jd }|  t 	|d¡dd|  ¡ qW d S )	Nr9   é   zB          if a:
          {WS}if b:
          {ONETAB}c
          rS   rR   )rm   ÚWSr   rM   )
Úranger!   r"   r   r   r    r   r4   r&   r'   )r-   Ú
num_spacesr/   Únode_cr   r   r   Útest_tab_below_spaces  s
    z%IndentationTest.test_tab_below_spacesc             C   s`   xZt ddƒD ]L}t t d¡jdd| d¡}|jd jd jd }|  t 	|d¡d¡ qW d S )	Nr9   ro   zR          if a:
          {WS}{ONETAB}if b:
          {ONETAB}{ONETAB}c
          rS   rR   )rm   rp   r   rM   )
rq   r!   r"   r   r   r    r   r4   r&   r'   )r-   rr   r/   rs   r   r   r   Útest_tabs_below_spaces_and_tab  s
    z.IndentationTest.test_tabs_below_spaces_and_tabN)r>   r?   r@   rL   rQ   rZ   r]   r^   rd   re   rf   rl   r
   Úrequires_featuresrn   rt   ru   r   r   r   r   rA   s   s   rA   c          	   C   sB   t | dƒ.}yt | ¡ ¡ W n tk
r2   dS X W d Q R X dS )NÚrFT)Úopenr   r"   ÚreadÚSyntaxError)ÚfilepathÚfr   r   r   Ú_is_syntax_valid  s    r}   c               @   s   e Zd Zdd„ ZdS )ÚSymmetricTestMetac             C   s”   dd„ }d}t j td¡}xht  |¡D ]Z\}}}	xN|	D ]F}
|
 d¡r6t j ||
¡}t t|ƒ d¡||ƒƒ|||
d d…  < q6W q&W t	 
| |||¡S )Nc                s   ‡ fdd„}|S )Nc          	      sd   t ˆ dƒ}| ¡ }W d Q R X t |¡}t |¡}| |¡ |  t 	|¡|¡ |  
g |jjd¡ d S )Nrw   zUnmatched parens)rx   ry   r   r"   r   ÚAstAnnotatorr#   r(   r   rk   r4   ÚtokensZ_parens)r-   Úhandler.   r/   Ú	annotator)r{   r   r   Útest(  s    


zISymmetricTestMeta.__new__.<locals>.symmetric_test_generator.<locals>.testr   )r{   rƒ   r   )r{   r   Úsymmetric_test_generator'  s    z;SymmetricTestMeta.__new__.<locals>.symmetric_test_generatorZtest_symmetric_r   z.inz3Test contains syntax not supported by this version.éýÿÿÿ)ÚosÚpathr*   ÚTESTDATA_DIRÚwalkÚendswithÚunittestÚskipIfr}   r   Ú__new__)ÚmcsÚnameÚbasesÚ	inst_dictr„   Útest_method_prefixÚdata_dirÚdirpathÚdirsÚfilesÚfilenameÚ	full_pathr   r   r   r   %  s    

"zSymmetricTestMeta.__new__N)r>   r?   r@   r   r   r   r   r   r~   #  s   r~   c               @   s   e Zd ZdZdS )ÚSymmetricTestzValidates the symmetry property.

  After parsing + annotating a module, regenerating the source code for it
  should yield the same result.
  N)r>   r?   r@   Ú__doc__r   r   r   r   r™   @  s   r™   c             C   s0   x*dD ]"}t t| |d ƒtƒrt| |dƒS qW dS )N)rh   r   ÚattrÚargÚmoduler<   )r   r   r%   )r   r›   r   r   r   Ú_get_node_identifierH  s    
rž   c               @   s   e Zd Zdd„ ZdS )ÚPrefixSuffixGoldenTestMetac          
   C   sÆ   dd„ }d}t j td¡}dtjd d…  }xˆt  |¡D ]z\}}	}
xn|
D ]f}| d¡rHt j ||¡}t j |d||d d	… d
 ¡}t 	t
|ƒ d¡|||ƒƒ|||d d	…  < qHW q8W t | |||¡S )Nc                s   ‡ ‡fdd„}|S )Nc          	      s  t ˆdƒ}| ¡ }W d Q R X t |¡}t |¡}| |¡ dd„ ‰ d ‡ fdd„t 	|¡D ƒ¡d }t
| ddƒrÈtj tj ˆ¡¡s˜t tj ˆ¡¡ t ˆd	ƒ}| |¡ W d Q R X td
ˆ ƒ d S y"t ˆdƒ}| ¡ }W d Q R X W n  tk
r
   |  d¡ Y nX |  ||¡ d S )Nrw   c             S   s   | d krdS |   dd¡S )Nr<   r   z\n)Úreplace)Úsr   r   r   Úescape[  s    z_PrefixSuffixGoldenTestMeta.__new__.<locals>.golden_test_generator.<locals>.test.<locals>.escaper   c             3   sn   | ]f}d   tt|ddƒt|ddƒfƒt|ƒjd t|ƒ ˆ t |d¡ƒˆ t |d¡ƒˆ t |d¡ƒ¡V  qdS )	z5{0:12} {1:20} 	prefix=|{2}|	suffix=|{3}|	indent=|{4}|r)   éÿÿÿÿÚ
col_offsetrR   r:   r3   rC   N)r    r%   r   r   r>   rž   r&   r'   )Ú.0Ún)r¢   r   r   ú	<genexpr>_  s   zbPrefixSuffixGoldenTestMeta.__new__.<locals>.golden_test_generator.<locals>.test.<locals>.<genexpr>Úgenerate_goldensFÚwzWrote: zMissing golden data.)rx   ry   r   r"   r   r   r#   r*   r   r‰   r   r†   r‡   ÚisdirÚdirnameÚmakedirsÚwriteÚprintÚIOErrorZfailr(   )r-   r   r.   r/   r‚   Úresultr|   Úgolden)Úgolden_fileÚ
input_file)r¢   r   rƒ   T  s,    



zOPrefixSuffixGoldenTestMeta.__new__.<locals>.golden_test_generator.<locals>.testr   )r³   r²   rƒ   r   )r²   r³   r   Úgolden_test_generatorS  s    #zAPrefixSuffixGoldenTestMeta.__new__.<locals>.golden_test_generatorZtest_golden_prefix_suffix_r   z%d.%dé   z.inr±   r…   z.outz3Test contains syntax not supported by this version.)r†   r‡   r*   rˆ   ÚsysÚversion_infor‰   rŠ   r‹   rŒ   r}   r   r   )rŽ   r   r   r‘   r´   r’   r“   Úpython_versionr”   r•   r–   r—   r˜   Zgolden_pathr   r   r   r   Q  s    '

$z"PrefixSuffixGoldenTestMeta.__new__N)r>   r?   r@   r   r   r   r   r   rŸ   O  s   rŸ   c               @   s   e Zd ZdZdZdS )ÚPrefixSuffixGoldenTestzÍChecks the prefix and suffix on each node in the AST.

  This uses golden files in testdata/ast/golden. To regenerate these files, run
  python setup.py test -s pasta.base.annotate_test.generate_goldens
  N)r>   r?   r@   rš   ZmaxDiffr   r   r   r   r¹   Š  s   r¹   c               @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚManualEditsTestz‡Tests that we can handle ASTs that have been modified.

  Such ASTs may lack position information (lineno/col_offset) on some nodes.
  c             C   sV   d}t  |¡}t |tjf¡d }|j tjdtj	ddd¡ |  
dt  |¡¡ dS )zBTests that Call node traversal works without position information.zf(a)r   rO   )r¦   )rœ   Úvaluez	f(a, b=0)N)r!   r"   r   rD   r   rE   ÚkeywordsÚappendÚkeywordÚNumr4   r,   )r-   r.   r/   r   r   r   r   Útest_call_no_pos›  s
    
z ManualEditsTest.test_call_no_posc             C   sr   d}t  |¡}t |tjf¡d }|j tjdtj	ddd¡ d|jd j
_d|jd j
_|  dt  |¡¡ dS )	zATests that Call node traversal works even with illegal positions.zf(a)r   rO   )r¦   )rœ   r»   r£   z	f(a, b=0)N)r!   r"   r   rD   r   rE   r¼   r½   r¾   r¿   r»   r)   r¤   r4   r,   )r-   r.   r/   r   r   r   r   Útest_call_illegal_pos£  s    
z%ManualEditsTest.test_call_illegal_posN)r>   r?   r@   rš   rÀ   rÁ   r   r   r   r   rº   •  s   rº   c               @   s4   e Zd ZdZe d¡dd„ ƒZe d¡dd„ ƒZdS )ÚFstringTestz$Tests fstring support more in-depth.Zfstringc             C   s2   d}t  |¡}|jd j}|  t |d¡d¡ d S )Nzf"a {b} c d {e}"r   Úcontentz<f"a {__pasta_fstring_val_0__} c d {__pasta_fstring_val_1__}")r!   r"   r   r»   r4   r&   r'   )r-   r.   r/   r   r   r   r   Útest_fstring´  s    

zFstringTest.test_fstringc             C   s2   d}t  |¡}|jd j}|  t |d¡d¡ d S )Nzf"a {{{b} {{c}}"r   rÃ   z&f"a {{{__pasta_fstring_val_0__} {{c}}")r!   r"   r   r»   r4   r&   r'   )r-   r.   r/   r   r   r   r   Útest_fstring_escaping½  s    

z!FstringTest.test_fstring_escapingN)r>   r?   r@   rš   r
   rv   rÄ   rÅ   r   r   r   r   rÂ   ±  s   	rÂ   c             C   s   t  | ¡ |  ¡ ¡S )N)ÚdifflibZndiffÚ
splitlines)ÚbeforeÚafterr   r   r   r+   Ç  s    r+   c              C   s\   t  ¡ } |  t  t¡¡ |  t  t¡¡ |  t  t¡¡ |  t  t¡¡ |  t  t¡¡ | S )N)	r‹   Ú	TestSuiteÚaddTestsÚ	makeSuiterº   r™   r   r¹   rÂ   )r°   r   r   r   ÚsuiteË  s    rÍ   c              C   s(   t  ¡ } |  t  t¡¡ ttddƒ | S )Nr¨   T)r‹   rÊ   rË   rÌ   r¹   Úsetattr)r°   r   r   r   r¨   Õ  s    r¨   Ú__main__).rš   Ú
__future__r   r   r   r   rÆ   rV   Úos.pathr†   Úsixr   r¶   r   r‹   r!   Z
pasta.baser   r   r   r	   r&   r
   r‡   Úrealpathr*   r«   Ú__file__rˆ   ZTestCaser   rA   r}   r   r~   r™   rž   rŸ   r¹   rº   rÂ   r+   rÍ   r¨   r>   Úmainr   r   r   r   Ú<module>   sH   J (	;



