
    -ShL>                        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ej                  Z G d dej                  Zd Z  G d de!          Z" G d d ee"ej                            Z#d Z$ G d de!          Z% G d d ee%ej                            Z& G d dej                  Z' G d dej                  Z(d Z)d  Z*d! Z+e,d"k    r ej-                     dS dS )#zTests for annotate.    )absolute_import)division)print_functionN)with_metaclass)annotate)	ast_utils)codegen)
formatting)
test_utilsz../testdatac                   ,    e Zd Zd Zd Zd Zd Zd ZdS )PrefixSuffixTestc                 :  
 t          j        d          }d}d |D ]\  
}|                    |          }t          j        |          }t          j        
fd          }|                    |           |j        d         }d}t          t          j        |d
z                      }	|                     ||	d	|||j        d
                    t          |	|                    fz             |                     |t          j        |                     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                     t          | |d           }t          |t                    o"t          |d                   t          j        k    S )Nr   )getattr
isinstancelisttypeastPass)nodechildren_attrvals      ^/var/www/html/movieo_spanner_bot/venv/lib/python3.11/site-packages/pasta/base/annotate_test.pyis_node_for_suffixz>PrefixSuffixTest.test_block_suffix.<locals>.is_node_for_suffixH   s9    D-..cT""?tCF||sx'??    )
open_blockc                      |           S N )r   r   r   s    r   <lambda>z4PrefixSuffixTest.test_block_suffix.<locals>.<lambda>Q   s    ))$>> r   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   s             @@r   test_block_suffixz"PrefixSuffixTest.test_block_suffix+   sQ   o 	 	 	GJ$@ @ @
 &0 4 4!zNNjN11c
+c

a-
>
>
>
>
>@ @k #d)h374!2]!BCCDDf

F
I4dii	&(0K0K&L&LMN NO O O UZ]]33334 4r   c                     d}t          j        |          }|                     ||                    d          d          t	          j        |d                     d S )Nzfoo
#bar

#baz
z#barsuffix)r(   r)   assertEqualindexr.   r/   r5   r8   r9   s      r   test_module_suffixz#PrefixSuffixTest.test_module_suffix\   sU    
CCAS6**++,cga.B.BCCCCCr   c                     d}t          j        |          }|                     t          j        |j        d         d                     d S )Nzif x:  return y
  #a
#b
r   block_suffix_body)r(   r)   assertIsNoner.   r/   r   rB   s      r   .test_no_block_suffix_for_single_line_statementz?PrefixSuffixTest.test_no_block_suffix_for_single_line_statementa   sC    
'CCAcgafQi)<==>>>>>r   c                    d}t          j        |          }|                     dt          j        |j        d         d                     |                     dt          j        |j        d         d                     d S )Nza

foo


b
r$      prefixr?   r(   r)   r@   r.   r/   r   rB   s      r   test_expression_prefix_suffixz.PrefixSuffixTest.test_expression_prefix_suffixf   sl    
CCAT3716!9h77888T3716!9h7788888r   c                    d}t          j        |          }|                     dt          j        |j        d         d                     |                     dt          j        |j        d         d                     d S )Nza

def foo():
  return bar


b
r$   rI   rJ    r?   rK   rB   s      r   test_statement_prefix_suffixz-PrefixSuffixTest.test_statement_prefix_suffixl   sl    
2CCAT3716!9h77888RH5566666r   N)__name__
__module____qualname__r=   rC   rG   rL   rO   r"   r   r   r   r   )   sc        /4 /4 /4bD D D
? ? ?
9 9 97 7 7 7 7r   r   c                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Z ej        d
          d             Z ej        d
          d             Z ej        d
          d             ZdS )IndentationTestc                    t          j        d          }t          j        |          }t	          j        |t          j        f          }|                    d            |\  }}}}}}	}
| 	                    dt          j        |d                     | 	                    dt          j        |d                     | 	                    dt          j        |d                     | 	                    dt          j        |d                     | 	                    dt          j        |d                     | 	                    dt          j        |	d                     | 	                    dt          j        |
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                     | j         S r!   )r1   )r   s    r   r#   z4IndentationTest.test_indent_levels.<locals>.<lambda>   s    T[ r   )keyrN   indent      z      )r%   r&   r(   r)   r   find_nodes_by_typer   Callsortr@   r.   r/   )r5   r8   r9   
call_nodesbegina1b1c1b2a2ends              r   test_indent_levelsz"IndentationTest.test_indent_levelsu   s_   
/   C 	CA-a#(==JOO00O111%/"E2r2r2sR11222T372x00111VSWR22333Xswr844555VSWR22333T372x00111Rh//00000r   c                     d}t          j        |          }|j        d         }|j        \  }}|                     t	          j        |d                     |                     t	          j        |d                     d S )Nzif a: b; c
r   indent_diff)r(   r)   r   rF   r.   r/   )r5   r8   r9   if_nodebcs         r   test_indent_levels_same_linez,IndentationTest.test_indent_levels_same_line   sr    
CCAfQiG<DAqcga//000cga//00000r   c                    d}d}t          j        ||          D ]Q\  }}|                    ||          }t          j        |          }|j        d         }|j        d         }|j        d         }	|                     dt          j        |d                     |                     dt          j        |d                     |                     |t          j        |d                     |                     |t          j        |d                     |                     ||z   t          j        |	d                     |                     |t          j        |	d                     Sd S )Nz(if a:
{first}if b:
{first}{second}foo()
) rY   rZ   z        	z		)firstsecondr   rN   rX   rh   )		itertoolsproductr'   r(   r)   r   r@   r.   r/   )
r5   templateindentsrp   rq   r8   r9   outer_if_nodeinner_if_node	call_nodes
             r   test_indent_depthsz"IndentationTest.test_indent_depths   sV   <H>G"*7G<< B BvOO%O77c
+c

afQim#(+m$Q'i
r37=(;;<<<
r37=-@@AAA
ucgmX>>???
ucgm]CCDDD
uv~swy('C'CDDD
vswy-@@AAAAB Br   c                 $   t          j        d          }t          j        |          }|j        d         j        \  }}|                     dt          j        |d                     |                     dt          j        |d                     d S )NzQ        class A:
          """Doc
             string."""
          pass
        r   rY   rX   r%   r&   r(   r)   r   r@   r.   r/   r5   r8   r9   	docstring	pass_stmts        r   test_indent_multiline_stringz,IndentationTest.test_indent_multiline_string       
/   C 	CA6!9>IyT379h77888T379h7788888r   c                 $   t          j        d          }t          j        |          }|j        d         j        \  }}|                     dt          j        |d                     |                     dt          j        |d                     d S )NzR        class A:
          """Doc

             string."""
          pass
        r   rY   rX   r{   r|   s        r   )test_indent_multiline_string_with_newlinez9IndentationTest.test_indent_multiline_string_with_newline   r   r   c                    d}dD ]t}t          j        |                    |                    }|                     |                    d          dz   t          j        |j        d         d                     ud}dD ]t}t          j        |                    |                    }|                     |                    d          dz   t          j        |j        d         d	                     ud
}dD ]a}t          j        |                    |                    }|                     |dz   t          j        |j        d         d                     bd S )Nz#def foo(a, b{trailing_comma}): pass)rN   ,z , )trailing_commarn   )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   )r5   rt   r   trees       r   test_scope_trailing_commaz)IndentationTest.test_scope_trailing_comma   sj   4H* = =[GGHHd
~,,S11C7wty|];;= = = = 7H* > >[GGHHd
~,,S11C7wty|^<<> > > > 8H* > >[GGHHd
~+wty|^<<> > > >> >r   c                     t          j        d          }t          j        |          }|j        d         }|j        d         }|                     dt          j        |d                     d S )Nz#        if a:

          b
        r   rY   rh   r{   r5   r8   r9   ri   rj   s        r   test_indent_extra_newlinesz*IndentationTest.test_indent_extra_newlines   sg    
/   C
 	CAfQiGQAT371m4455555r   c                     t          j        d          }t          j        |          }|j        d         }|j        d         }|                     dt          j        |d                     d S )Nz9        if a:
            #not here

          b
        r   rY   rh   r{   r   s        r   'test_indent_extra_newlines_with_commentz7IndentationTest.test_indent_extra_newlines_with_comment   sg    
/   C 	CAfQiGQAT371m4455555r   c                 B   t          j        d          }t          j        d          }t          j        |          }t	          j        t	          j        d                    |j        d         j        d<   |                     |t          j
        |                     d S )Nz5        def a():
            b
            c
        z<        def a():
            b
            new_node
        new_node)idr   rI   )r%   r&   r(   r)   r   ExprNamer   r0   r	   to_str)r5   r8   r;   r9   s       r   test_autoindentzIndentationTest.test_autoindent   s    
/   C
     H
 	CAZ!8!8!899AF1IN1hq(9(9:::::r   mixed_tabs_spacesc                 z    t          j        t          j        d                              d                     d S )Nz:        if a:
                b
        {ONETAB}c
        ro   )ONETAB)r(   r)   r%   r&   r'   )r5   s    r   "test_mixed_tabs_spaces_indentationz2IndentationTest.test_mixed_tabs_spaces_indentation   sD    	K !   V4V  	" " " " "r   c                 L   t          dd          D ]}t          j        t          j        d                              dd|z                      }|j        d         j        d         j        d         }|                     t          j	        |d          dd|z
  z             d S )	NrI      zB          if a:
          {WS}if b:
          {ONETAB}c
          ro   rn   r   WSr   rh   
ranger(   r)   r%   r&   r'   r   r@   r.   r/   r5   
num_spacesr9   node_cs       r   test_tab_below_spacesz%IndentationTest.test_tab_below_spaces  s    Aqkk O O

+ho '   vTcJ&6v77	9 9a
 vay~a %a(f
swv}55sa*n7MNNNNO Or   c                 @   t          dd          D ]}t          j        t          j        d                              dd|z                      }|j        d         j        d         j        d         }|                     t          j	        |d          d           d S )	NrI   r   zR          if a:
          {WS}{ONETAB}if b:
          {ONETAB}{ONETAB}c
          ro   rn   r   r   rh   r   r   s       r   test_tabs_below_spaces_and_tabz.IndentationTest.test_tabs_below_spaces_and_tab  s    Aqkk = =

+ho '   vTcJ&6v77	9 9a
 vay~a %a(f
swv}55t<<<<= =r   N)rP   rQ   rR   rf   rl   ry   r   r   r   r   r   r   r   requires_featuresr   r   r   r"   r   r   rT   rT   s   s       1 1 141 1 1B B B$
9 
9 
9
9 
9 
9> > >&	6 	6 	6
6 
6 
6; ; ;   : 344" " 54"  : 344O O 54O  : 344= = 54= = =r   rT   c                     t          | d          5 }	 t          j        |                                           n# t          $ r Y d d d            dS w xY w	 d d d            n# 1 swxY w Y   dS )NrFT)openr   r)   readSyntaxError)filepathfs     r   _is_syntax_validr     s    Hc a	i   	                      
 
s1   A#&:A#
AA#AA##A'*A'c                       e Zd Zd ZdS )SymmetricTestMetac                    d }d}t           j                            t          d          }t          j        |          D ]\  }}}	|	D ]z}
|
                    d          rct           j                            ||
          } t          j        t          |           d           ||                    |||
d d         z   <   {t          
                    | |||          S )Nc                       fd}|S )Nc                    t          d          5 }|                                }d d d            n# 1 swxY w Y   t          j        |          }t	          j        |          }|                    |           |                     t          j	        |          |           | 
                    g |j        j        d           d S )Nr   zUnmatched parens)r   r   r   r)   r   AstAnnotatorr+   r0   r	   r   r@   tokens_parens)r5   handler8   r9   	annotatorr   s        r   testzISymmetricTestMeta.__new__.<locals>.symmetric_test_generator.<locals>.test(  s    (C   	F#	 	 	 	 	 	 	 	 	 	 	 	 	 	 	OC  )#..	!!'."3"3S999Y-57IJJJJJs   377r"   )r   r   s   ` r   symmetric_test_generatorz;SymmetricTestMeta.__new__.<locals>.symmetric_test_generator'  s(    K K K K K kr   test_symmetric_r   .in3Test contains syntax not supported by this version.)ospathr2   TESTDATA_DIRwalkendswithunittestskipIfr   r   __new__)mcsnamebases	inst_dictr   test_method_prefixdata_dirdirpathdirsfilesfilename	full_paths               r   r   zSymmetricTestMeta.__new__%  s    	 	 	 +w||L%00H " 1 1 9 9u 9 9(U## 	9gll7H55);(/(333I; ; -,Y77;9 ;9)&#2#6
79 <<T5)444r   NrP   rQ   rR   r   r"   r   r   r   r   #  s#        5 5 5 5 5r   r   c                       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)rP   rQ   rR   __doc__r"   r   r   r   r   @  s           r   r   c                 ~    dD ]9}t          t          | |d           t                    rt          | |d          c S :dS )N)r   r   attrargmodulerN   )r   r   r-   )r   r   s     r   _get_node_identifierr   H  sQ    5 % %d'$d++S11 %T4$$$$$%	r   c                       e Zd Zd ZdS )PrefixSuffixGoldenTestMetac           
      J   d }d}t           j                            t          d          }dt          j        d d         z  }t          j        |          D ]\  }}	}
|
D ]}|                    d          rt           j                            ||          }t           j                            |d||d d         d	z             } t          j	        t          |           d
           |||                    |||d d         z   <   t                              | |||          S )Nc                       fd}|S )Nc                    t          
d          5 }|                                }d d d            n# 1 swxY w Y   t          j        |          }t	          j        |          }|                    |           d d                    fdt          j	        |          D                       dz   }t          | dd          rt          j                            t          j                            	                    s1t          j        t          j                            	                     t          	d          5 }|                    |           d d d            n# 1 swxY w Y   t#          d	z              d S 	 t          	d          5 }|                                }d d d            n# 1 swxY w Y   n%# t$          $ r |                     d	           Y nw xY w|                     ||           d S )
Nr   c                 6    | dn|                      dd          S )NrN   r$   z\n)replace)ss    r   escapez_PrefixSuffixGoldenTestMeta.__new__.<locals>.golden_test_generator.<locals>.test.<locals>.escape[  s    yaiie&<&<
<r   r$   c              3     K   | ]}d                      t          t          |dd          t          |dd          f          t          |          j        dz   t          |          z    t          j        |d                     t          j        |d                     t          j        |d                              V  dS )	z5{0:12} {1:20} 	prefix=|{2}|	suffix=|{3}|	indent=|{4}|r1   
col_offsetrn   rJ   r?   rX   N)r'   r-   r   r   rP   r   r.   r/   ).0nr   s     r   	<genexpr>zbPrefixSuffixGoldenTestMeta.__new__.<locals>.golden_test_generator.<locals>.test.<locals>.<genexpr>^  s       " "  GMMWQ"--wq,/K/KLMMQ 3&)=a)@)@@swq(++,,swq(++,,swq(++,,. ." " " " " "r   generate_goldensFwzWrote: zMissing golden data.)r   r   r   r)   r   r   r+   r2   r   r   r   r   r   isdirdirnamemakedirswriteprintIOErrorfailr0   )r5   r   r8   r9   r   resultr   goldenr   golden_file
input_files           @r   r   zOPrefixSuffixGoldenTestMeta.__new__.<locals>.golden_test_generator.<locals>.testT  s   *c"" 	f#	 	 	 	 	 	 	 	 	 	 	 	 	 	 	OC  )#..		= 	= 	=  " " " " Xa[[" " " " " %)) 4+U33 	rw{;;<< 6K44555K%% GGFOOO              
	K'
(
(
(
&	,K%% VVXXF               	, 	, 	,
))*
+
+
+
+
+	, 	!!&&11111sT   488E%%E),E)G F6*G 6F::G =F:>G G$#G$r"   )r   r   r   s   `` r   golden_test_generatorzAPrefixSuffixGoldenTestMeta.__new__.<locals>.golden_test_generatorS  s*    "2 "2 "2 "2 "2 "2F kr   test_golden_prefix_suffix_r   z%d.%d   r   r   r   z.outr   )r   r   r2   r   sysversion_infor   r   r   r   r   r   r   )r   r   r   r   r   r   r   python_versionr   r   r   r   r   golden_paths                 r   r   z"PrefixSuffixGoldenTestMeta.__new__Q  sG   $ $ $N 6w||L%00Hs/33N " 1 1 	C 	Cu C C(U## 	Cgll7H55)Wh%-crc]V%;= =+;(/(333I; ; *))[AA;C ;C)&#2#6
7C <<T5)444r   Nr   r"   r   r   r   r   O  s#        65 65 65 65 65r   r   c                       e Zd ZdZdZdS )PrefixSuffixGoldenTestzChecks 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)rP   rQ   rR   r   maxDiffr"   r   r   r  r    s          '''r   r  c                       e Zd ZdZd Zd ZdS )ManualEditsTestzTests that we can handle ASTs that have been modified.

  Such ASTs may lack position information (lineno/col_offset) on some nodes.
  c                 P   d}t          j        |          }t          j        |t          j        f          d         }|j                            t	          j        dt	          j	        d                               | 
                    dt          j        |                     dS )zBTests that Call node traversal works without position information.f(a)r   rj   r   r   value	f(a, b=0)N)r(   r)   r   r[   r   r\   keywordsappendkeywordNumr@   r4   r5   r8   r9   r   s       r   test_call_no_posz ManualEditsTest.test_call_no_pos  s    
CCA'CH;77:DMCGaLLLAAABBB[%*Q--00000r   c                    d}t          j        |          }t          j        |t          j        f          d         }|j                            t	          j        dt	          j	        d                               d|j        d         j
        _        d|j        d         j
        _        |                     dt          j        |                     dS )	zATests that Call node traversal works even with illegal positions.r  r   rj   r  r	  r   r  N)r(   r)   r   r[   r   r\   r  r  r  r  r
  r1   r   r@   r4   r  s       r   test_call_illegal_posz%ManualEditsTest.test_call_illegal_pos  s    
CCA'CH;77:DMCGaLLLAAABBB &'DM"")*DM"&[%*Q--00000r   N)rP   rQ   rR   r   r  r  r"   r   r   r  r    s<         
1 1 11 1 1 1 1r   r  c                   v    e Zd ZdZ ej        d          d             Z ej        d          d             ZdS )FstringTestz$Tests fstring support more in-depth.fstringc                     d}t          j        |          }|j        d         j        }|                     t          j        |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  s       r   test_fstringzFstringTest.test_fstring  s\    
CCA6!9?Di  FH H H H Hr   c                     d}t          j        |          }|j        d         j        }|                     t          j        |d          d           d S )Nzf"a {{{b} {{c}}"r   r  z&f"a {{{__pasta_fstring_val_0__} {{c}}"r  r  s       r   test_fstring_escapingz!FstringTest.test_fstring_escaping  sW    
CCA6!9?Di  02 2 2 2 2r   N)rP   rQ   rR   r   r   r   r  r  r"   r   r   r  r    sm        ,,:	**H H +*H  :	**2 2 +*2 2 2r   r  c                 t    t          j        |                                |                                           S r!   )difflibndiff
splitlines)beforeafters     r   r3   r3     s,    	u''))6+<+<+>+>	?	??r   c                     t          j                    } |                     t          j        t                               |                     t          j        t
                               |                     t          j        t                               |                     t          j        t                               |                     t          j        t                               | S r!   )	r   	TestSuiteaddTests	makeSuiter  r   r   r  r  r   s    r   suiter(    s    &//($_55666//($]33444//($%566777//($%;<<===//($[11222	-r   c                      t          j                    } |                     t          j        t                               t          t          dd           | S )Nr   T)r   r$  r%  r&  r  setattrr'  s    r   r   r     sG    &//($%;<<===	
 "4d;;;	-r   __main__).r   
__future__r   r   r   r   r  rr   os.pathr   sixr   r   r%   r   r(   
pasta.baser   r   r	   r
   r.   r   r   realpathr2   r   __file__r   TestCaser   rT   r   r   r   r   r   r   r  r  r  r3   r(  r   rP   mainr"   r   r   <module>r4     s@     ' & & & & &       % % % % % % 



             



                            ( ( ( ( ( ( ! ! ! ! ! !wGLL00-@@B BG7 G7 G7 G7 G7z* G7 G7 G7Td= d= d= d= d=j) d= d= d=N  5 5 5 5 5 5 5 5:    NN#4j6IJJ     85 85 85 85 85 85 85 85v    ^^,F,6,?A A   1 1 1 1 1j) 1 1 182 2 2 2 2*% 2 2 2,@ @ @     z(-///// r   