o
    ¶2úhL>  ã                   @   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 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„ ‰|D ]L\‰ }|j|d}t |¡}t ‡ ‡fdd„¡}| |¡ |jd }d	}t	t
 |d
ˆ  ¡ƒ}	|  ||	d|||jd t|	|ƒ¡f ¡ |  |t |¡¡ q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:)Ú	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   úS/var/www/html/chatgem/venv/lib/python3.10/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   s   
 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   ÚFindNodeVisitorÚvisitÚresultsÚstrÚfmtÚgetÚassertMultiLineEqualÚlinenoÚjoinÚ	_get_diffÚdump)
ÚselfÚsrc_tplÚ
test_casesr   ÚsrcÚtÚnode_finderr   ÚexpectedÚactualr   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+   ©r1   r4   r5   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   Úblock_suffix_body)r$   r%   ÚassertIsNoner*   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    é   Úprefixr:   ©r$   r%   r;   r*   r+   r   r=   r   r   r   Útest_expression_prefix_suffixf   ó   
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    rB   rC   Ú r:   rD   r=   r   r   r   Útest_statement_prefix_suffixl   rF   z-PrefixSuffixTest.test_statement_prefix_suffixN)Ú__name__Ú
__module__Ú__qualname__r9   r>   rA   rE   rH   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 r   )r-   r   r   r   r   r   „   s    z4IndentationTest.test_indent_levels.<locals>.<lambda>)ÚkeyrG   Úindentú  ú    z      )r!   r"   r$   r%   r   Úfind_nodes_by_typer   ÚCallÚsortr;   r*   r+   )r1   r4   r5   Ú
call_nodesÚbeginÚa1Úb1Úc1Úb2Ú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   r@   r*   r+   )r1   r4   r5   Úif_nodeÚbÚcr   r   r   Útest_indent_levels_same_line   s   


z,IndentationTest.test_indent_levels_same_linec           
      C   sÔ   d}d}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
d S )Nz(if a:
{first}if b:
{first}{second}foo()
)ú rO   rP   z        ú	z		)ÚfirstÚsecondr   rG   rN   r]   )	Ú	itertoolsÚproductr#   r$   r%   r   r;   r*   r+   )
r1   ÚtemplateÚindentsrd   re   r4   r5   Úouter_if_nodeÚinner_if_nodeÚ	call_noder   r   r   Útest_indent_depths—   s   



ôz"IndentationTest.test_indent_depthsc                 C   óP   t  d¡}t |¡}|jd j\}}|  dt |d¡¡ |  dt |d¡¡ d S )NzQ        class A:
          """Doc
             string."""
          pass
        r   rO   rN   ©r!   r"   r$   r%   r   r;   r*   r+   ©r1   r4   r5   Ú	docstringÚ	pass_stmtr   r   r   Útest_indent_multiline_string©   ó
   

z,IndentationTest.test_indent_multiline_stringc                 C   rn   )NzR        class A:
          """Doc

             string."""
          pass
        r   rO   rN   ro   rp   r   r   r   Ú)test_indent_multiline_string_with_newlineµ   rt   z9IndentationTest.test_indent_multiline_string_with_newlinec                 C   sÊ   d}dD ]}t  |j|d¡}|  | d¡d t |jd d¡¡ qd}dD ]}t  |j|d¡}|  | d¡d t |jd d	¡¡ q&d
}dD ]}t  |j|d¡}|  |d t |jd d¡¡ qHd S )Nz#def foo(a, b{trailing_comma}): pass)rG   ú,z , )Útrailing_commarb   ú)r   Úargs_suffixz%class Foo(a, b{trailing_comma}): passÚbases_suffixz&from mod import (a, b{trailing_comma})Únames_suffix)r$   r%   r#   r;   Úlstripr*   r+   r   )r1   rh   rw   Útreer   r   r   Útest_scope_trailing_commaÁ   s&   ÿÿ
ÿþz)IndentationTest.test_scope_trailing_commac                 C   ó@   t  d¡}t |¡}|jd }|jd }|  dt |d¡¡ d S )Nz#        if a:

          b
        r   rO   r]   ro   ©r1   r4   r5   r^   r_   r   r   r   Útest_indent_extra_newlinesÔ   s
   



z*IndentationTest.test_indent_extra_newlinesc                 C   r   )Nz9        if a:
            #not here

          b
        r   rO   r]   ro   r€   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   rB   )r!   r"   r$   r%   r   ÚExprÚNamer   r,   r   Úto_str)r1   r4   r7   r5   r   r   r   Útest_autoindentë   s
   


zIndentationTest.test_autoindentÚmixed_tabs_spacesc                 C   s   t  t d¡jdd¡ d S )Nz:        if a:
                b
        {ONETAB}c
        rc   )ÚONETAB)r$   r%   r!   r"   r#   )r1   r   r   r   Ú"test_mixed_tabs_spaces_indentationû   s   üz2IndentationTest.test_mixed_tabs_spaces_indentationc                 C   sd   t ddƒD ]*}t t d¡jdd| d¡}|jd jd jd }|  t 	|d¡dd|  ¡ qd S )	NrB   é   zB          if a:
          {WS}if b:
          {ONETAB}c
          rc   rb   ©rŠ   ÚWSr   r]   ©
Úranger$   r%   r!   r"   r#   r   r;   r*   r+   ©r1   Ú
num_spacesr5   Únode_cr   r   r   Útest_tab_below_spaces  s   
üùz%IndentationTest.test_tab_below_spacesc                 C   s\   t ddƒD ]&}t t d¡jdd| d¡}|jd jd jd }|  t 	|d¡d¡ qd S )	NrB   rŒ   zR          if a:
          {WS}{ONETAB}if b:
          {ONETAB}{ONETAB}c
          rc   rb   r   r   r]   r   r‘   r   r   r   Útest_tabs_below_spaces_and_tab  s   
üùz.IndentationTest.test_tabs_below_spaces_and_tabN)rI   rJ   rK   r\   ra   rm   rs   ru   r~   r   r‚   rˆ   r
   Úrequires_featuresr‹   r”   r•   r   r   r   r   rL   s   s     


rL   c              	   C   sd   t | dƒ#}z	t | ¡ ¡ W n ty   Y W d   ƒ dS w W d   ƒ dS 1 s+w   Y  dS )NÚrFT)Úopenr   r%   ÚreadÚSyntaxError)ÚfilepathÚfr   r   r   Ú_is_syntax_valid  s   üÿ
þûr   c                   @   ó   e Zd Zdd„ ZdS )ÚSymmetricTestMetac                 C   sŒ   dd„ }d}t j td¡}t  |¡D ]+\}}}	|	D ]#}
|
 d¡r<t j ||
¡}t t|ƒ d¡||ƒƒ|||
d d…  < qqt	 
| |||¡S )Nc                    s   ‡ fdd„}|S )Nc                    sx   t ˆ dƒ}| ¡ }W d   ƒ n1 sw   Y  t |¡}t |¡}| |¡ |  t 	|¡|¡ |  
g |jjd¡ d S )Nr—   zUnmatched parens)r˜   r™   r   r%   r   ÚAstAnnotatorr'   r,   r   r‡   r;   ÚtokensÚ_parens)r1   Úhandler4   r5   Ú	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_generatorÚtest_symmetric_r   ú.inú3Test 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©rI   rJ   rK   r³   r   r   r   r   rŸ   #  ó    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)rI   rJ   rK   Ú__doc__r   r   r   r   rÁ   @  s    rÁ   c                 C   s0   dD ]}t t| |d ƒtƒrt| |dƒ  S qdS )N)r„   rµ   ÚattrÚargÚmodulerG   )r   r   r)   )r   rÃ   r   r   r   Ú_get_node_identifierH  s
   ÿrÆ   c                   @   rž   )ÚPrefixSuffixGoldenTestMetac              
   C   s¾   dd„ }d}t j td¡}dtjd d…  }t  |¡D ];\}}	}
|
D ]3}| d¡rUt j ||¡}t j |d||d d	… d
 ¡}t 	t
|ƒ d¡|||ƒƒ|||d d	…  < q"qt | |||¡S )Nc                    s   ‡ ‡fdd„}|S )Nc                    sT  t ˆdƒ}| ¡ }W d   ƒ n1 sw   Y  t |¡}t |¡}| |¡ dd„ ‰ d ‡ fdd„t 	|¡D ƒ¡d }t
| ddƒrxtj tj ˆ¡¡sVt tj ˆ¡¡ t ˆd	ƒ}| |¡ W d   ƒ n1 skw   Y  td
ˆ ƒ d S zt ˆdƒ}| ¡ }W d   ƒ n1 sw   Y  W n ty¡   |  d¡ Y nw |  ||¡ d S )Nr—   c                 S   s   | d u rdS |   dd¡S )NrG   r    z\n)Úreplace)Úsr   r   r   Úescape[  s   z_PrefixSuffixGoldenTestMeta.__new__.<locals>.golden_test_generator.<locals>.test.<locals>.escaper    c                 3   sp    | ]3}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_offsetrb   rC   r:   rN   N)r#   r)   r   r   rI   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.)r˜   r™   r   r%   r   r    r'   r.   r   r¯   r   r¬   r­   ÚisdirÚdirnameÚmakedirsÚwriteÚprintÚIOErrorÚfailr,   )r1   r£   r4   r5   r¤   Úresultrœ   Úgolden©Úgolden_fileÚ
input_filerÏ   r   r¦   T  s:   
ÿ


ùù
ÿ
ÿ€ÿzOPrefixSuffixGoldenTestMeta.__new__.<locals>.golden_test_generator.<locals>.testr   )rÞ   rÝ   r¦   r   rÜ   r   Úgolden_test_generatorS  s   #zAPrefixSuffixGoldenTestMeta.__new__.<locals>.golden_test_generatorÚtest_golden_prefix_suffix_r   z%d.%dé   r©   rÛ   r«   z.outrª   )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¾   Úgolden_pathr   r   r   r³   Q  s(   '
ÿþý€û	z"PrefixSuffixGoldenTestMeta.__new__Nr¿   r   r   r   r   rÇ   O  rÀ   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)rI   rJ   rK   rÂ   Ú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.úf(a)r   r_   ©rÎ   ©rÄ   Úvalueú	f(a, b=0)N)r$   r%   r   rQ   r   rR   ÚkeywordsÚappendÚkeywordÚNumr;   r0   ©r1   r4   r5   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.ré   r   r_   rê   rë   rË   rí   N)r$   r%   r   rQ   r   rR   rî   rï   rð   rñ   rì   r-   rÌ   r;   r0   rò   r   r   r   Útest_call_illegal_pos£  s   
z%ManualEditsTest.test_call_illegal_posN)rI   rJ   rK   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.Úfstringc                 C   ó2   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ì   r;   r*   r+   rò   r   r   r   Útest_fstring´  ó   

þzFstringTest.test_fstringc                 C   r÷   )Nzf"a {{{b} {{c}}"r   rø   z&f"a {{{__pasta_fstring_val_0__} {{c}}"rù   rò   r   r   r   Útest_fstring_escaping½  rû   z!FstringTest.test_fstring_escapingN)rI   rJ   rK   rÂ   r
   r–   rú   rü   r   r   r   r   rõ   ±  s    
rõ   c                 C   s   t  | ¡ |  ¡ ¡S r   )ÚdifflibÚndiffÚ
splitlines)ÚbeforeÚafterr   r   r   r/   Ç  s   r/   c                  C   s\   t  ¡ } |  t  t¡¡ |  t  t¡¡ |  t  t¡¡ |  t  t¡¡ |  t  t¡¡ | S r   )	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æ   Úsetattrr  r   r   r   rÑ   Õ  s   rÑ   Ú__main__).rÂ   Ú
__future__r   r   r   r   rý   rf   Úos.pathr¬   Úsixr   râ   r!   r±   r$   Ú
pasta.baser   r   r   r	   r*   r
   r­   Úrealpathr.   rÔ   Ú__file__r®   ÚTestCaser   rL   r   r   rŸ   rÁ   rÆ   rÇ   ræ   rè   rõ   r/   r  rÑ   rI   Úmainr   r   r   r   Ú<module>   sP   ÿJ (	;ÿ
ÿ