
    1VhL>                        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.                  j1                  e	j.                  j3                  e	j.                  j5                  ej6                        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jZ                          yy)#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y)PrefixSuffixTestc                   
 t        j                  d      }d}d |D ]  \  
}|j                  |      }t        j                  |      }t        j                  
fd      }|j                  |       |j                  d   }d}t        t        j                  |d
z              }	| j                  ||	d	|||j                  d
j                  t        |	|            fz         | j                  |t        j                   |              y )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              xr t        |d         t        j
                  k(  S )Nr   )getattr
isinstancelisttypeastPass)nodechildren_attrvals      H/home/dcms/DCMS/lib/python3.12/site-packages/pasta/base/annotate_test.pyis_node_for_suffixz>PrefixSuffixTest.test_block_suffix.<locals>.is_node_for_suffixH   s3    D-.cT"?tCF|sxx'??    )
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+   s   oo 	 	GJ$@
 &0 4!zNNjN1c
++c
a--
>@k  #d)h3774!2]!BCDf

F
I4dii	&(0K&LMN NO UZZ]34r   c                     d}t        j                  |      }| j                  ||j                  d      d  t	        j
                  |d             y )Nzfoo
#bar

#baz
z#barsuffix)r(   r)   assertEqualindexr.   r/   r5   r8   r9   s      r   test_module_suffixz#PrefixSuffixTest.test_module_suffix\   sA    
CCAS6*+,cgga.BCr   c                     d}t        j                  |      }| j                  t        j                  |j
                  d   d             y )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   s7    
'CCAcggaffQi)<=>r   c                     d}t        j                  |      }| j                  dt        j                  |j
                  d   d             | j                  dt        j                  |j
                  d   d             y )Nza

foo


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

def foo():
  return bar


b
r$   rI   rJ    r?   rK   rB   s      r   test_statement_prefix_suffixz-PrefixSuffixTest.test_statement_prefix_suffixl   s[    
2CCAT377166!9h78RH56r   N)__name__
__module____qualname__r=   rC   rG   rL   rO   r"   r   r   r   r   )   s    /4bD
?
9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y)IndentationTestc                    t        j                  d      }t        j                  |      }t	        j
                  |t        j                  f      }|j                  d        |\  }}}}}}	}
| j                  dt        j                  |d             | j                  dt        j                  |d             | j                  dt        j                  |d             | j                  dt        j                  |d             | j                  dt        j                  |d             | j                  dt        j                  |	d             | j                  dt        j                  |
d             y )	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0O1%/"E2r2r2sR12T3772x01VSWWR23Xswwr845VSWWR23T3772x01Rh/0r   c                    d}t        j                  |      }|j                  d   }|j                  \  }}| j                  t	        j
                  |d             | j                  t	        j
                  |d             y )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   sa    
CCAffQiG<<DAqcgga/0cgga/0r   c                    d}d}t        j                  ||      D ]B  \  }}|j                  ||      }t        j                  |      }|j
                  d   }|j
                  d   }|j
                  d   }	| j                  dt        j                  |d             | j                  dt        j                  |d             | j                  |t        j                  |d             | j                  |t        j                  |d             | j                  ||z   t        j                  |	d             | j                  |t        j                  |	d             E y )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   s!   <H>G"**7G< BvOO%O7c
++c
affQim#((+m$$Q'i
r377=(;<
r377=-@A
ucggmX>?
ucggm]CD
uv~swwy('CD
vswwy-@ABr   c                 (   t        j                  d      }t        j                  |      }|j                  d   j                  \  }}| j                  dt        j                  |d             | j                  dt        j                  |d             y )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   q    
//  C 	CA66!9>>IyT3779h78T3779h78r   c                 (   t        j                  d      }t        j                  |      }|j                  d   j                  \  }}| j                  dt        j                  |d             | j                  dt        j                  |d             y )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 ]l  }t        j                  |j                  |            }| j                  |j	                  d      dz   t        j                  |j                  d   d             n d}dD ]l  }t        j                  |j                  |            }| j                  |j	                  d      dz   t        j                  |j                  d   d	             n d
}dD ]]  }t        j                  |j                  |            }| j                  |dz   t        j                  |j                  d   d             _ y )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   s$   4H* =[[GHd
~,,S1C7wwtyy|];==
 7H* >[[GHd
~,,S1C7wwtyy|^<>>
 8H* >[[GHd
~+wwtyy|^<>>r   c                     t        j                  d      }t        j                  |      }|j                  d   }|j                  d   }| j                  dt        j                  |d             y )Nz#        if a:

          b
        r   rY   rh   r{   r5   r8   r9   ri   rj   s        r   test_indent_extra_newlinesz*IndentationTest.test_indent_extra_newlines   sZ    
//  C
 	CAffQiGQAT3771m45r   c                     t        j                  d      }t        j                  |      }|j                  d   }|j                  d   }| j                  dt        j                  |d             y )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   sZ    
//  C 	CAffQiGQAT3771m45r   c                 R   t        j                  d      }t        j                  d      }t        j                  |      }t	        j
                  t	        j                  d            |j                  d   j                  d<   | j                  |t        j                  |             y )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9AFF1INN1hq(9:r   mixed_tabs_spacesc                 t    t        j                  t        j                  d      j	                  d             y )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   s,    	KK !  V4V 	"r   c                 H   t        dd      D ]  }t        j                  t        j                  d      j                  dd|z              }|j                  d   j                  d   j                  d   }| j                  t        j                  |d      dd|z
  z          y )	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    Aqk O

++hoo '  vTcJ&6v7	9a
 vvay~~a %%a(f
swwv}5sa*n7MNOr   c                 <   t        dd      D ]  }t        j                  t        j                  d      j                  dd|z              }|j                  d   j                  d   j                  d   }| j                  t        j                  |d      d        y )	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    Aqk =

++hoo '  vTcJ&6v7	9a
 vvay~~a %%a(f
swwv}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    141B$
9
9>&	6
6;   : 34" 5"  : 34O 5O  : 34= 5=r   rT   c                     t        | d      5 }	 t        j                  |j                                	 d d d        y# t        $ r Y d d d        yw xY w# 1 sw Y   yxY w)NrFT)openr   r)   readSyntaxError)filepathfs     r   _is_syntax_validr     s]    Hc a	ii
 
  	 
 
s&   A#<	AAAAAc                       e Zd Zd Zy)SymmetricTestMetac                    d }d}t         j                  j                  t        d      }t        j                  |      D ]t  \  }}}	|	D ]i  }
|
j                  d      st         j                  j                  ||
      } t        j                  t        |       d       ||            |||
d d z   <   k v t        j                  | |||      S )Nc                       fd}|S )Nc                 v   t        d      5 }|j                         }d d d        t        j                        }t	        j
                  |      }|j                  |       | j                  t        j                  |      |       | j                  g |j                  j                  d       y # 1 sw Y   xY w)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#	OOC ))#.	!!'.."3S9Y--557IJ	 	s   B//B8r"   )r   r   s   ` r   symmetric_test_generatorz;SymmetricTestMeta.__new__.<locals>.symmetric_test_generator'  s    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    	 +ww||L%0H " 1 9u 9(U#ggll7H5);(//(33I; -Y7;9)&#26
799 <<T5)44r   NrP   rQ   rR   r   r"   r   r   r   r   #  s    5r   r   c                       e Zd ZdZy)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                 f    dD ],  }t        t        | |d       t              st        | |d      c S  y)N)r   r   attrargmodulerN   )r   r   r-   )r   r   s     r   _get_node_identifierr   H  s8    5 %d'$d+S1T4$$% 
r   c                       e Zd Zd Zy)PrefixSuffixGoldenTestMetac           
         d }d}t         j                  j                  t        d      }dt        j
                  d d z  }t        j                  |      D ]  \  }}	}
|
D ]  }|j                  d      st         j                  j                  ||      }t         j                  j                  |d||d d d	z         } t        j                  t        |       d
       |||            |||d d z   <     t        j                  | |||      S )Nc                       fd}|S )Nc                    t        
d      5 }|j                         }d d d        t        j                        }t	        j
                  |      }|j                  |       d dj                  fdt        j                  |      D              dz   }t        | dd      rt        j                  j                  t        j                  j                  	            s2t        j                  t        j                  j                  	             t        	d      5 }|j!                  |       d d d        t#        d	z          y 	 t        	d      5 }|j                         }d d d        | j)                  |       y # 1 sw Y   axY w# 1 sw Y   ^xY w# 1 sw Y   5xY w# t$        $ r | j'                  d	       Y Tw xY w)
Nr   c                 .    | dS | j                  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   j  K   | ]  }d j                  t        t        |dd      t        |dd      f      t        |      j                  dz   t        |      z    t        j                  |d             t        j                  |d             t        j                  |d                    yw)	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LMQ  3&)=a)@@swwq(+,swwq(+,swwq(+,."s   B0B3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  so   *c" 	f#	OOC ))#.		=  " XXa[" " %)) 4+U3rww{;<KK45K% GGFO
	K'
(
	,K% VVXF
 	!!&&1C	 	,   	,
))*
+	,sA   E?FF$ F$F$ ?F	FF!F$ $G Gr"   )r   r   r   s   `` r   golden_test_generatorzAPrefixSuffixGoldenTestMeta.__new__.<locals>.golden_test_generatorS  s    "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  s   $N 6ww||L%0Hs//33N " 1 	Cu C(U#ggll7H5)Wh%-cr]V%;=+;(//(33I; *)[A;C)&#26
7C	C <<T5)44r   Nr   r"   r   r   r   r   O  s    65r   r   c                       e Zd ZdZdZy)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y)ManualEditsTestzTests that we can handle ASTs that have been modified.

  Such ASTs may lack position information (lineno/col_offset) on some nodes.
  c                 T   d}t        j                  |      }t        j                  |t        j
                  f      d   }|j                  j                  t	        j                  dt	        j                  d                   | j                  dt        j                  |             y)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  so    
CCA''CHH;7:DMMCGGaLAB[%**Q-0r   c                    d}t        j                  |      }t        j                  |t        j
                  f      d   }|j                  j                  t	        j                  dt	        j                  d                   d|j                  d   j                  _        d|j                  d   j                  _        | j                  dt        j                  |             y)	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''CHH;7:DMMCGGaLAB &'DMM"")*DMM"&[%**Q-0r   N)rP   rQ   rR   r   r  r  r"   r   r   r  r    s    
11r   r  c                   p    e Zd ZdZ ej
                  d      d        Z ej
                  d      d        Zy)FstringTestz$Tests fstring support more in-depth.fstringc                     d}t        j                  |      }|j                  d   j                  }| j	                  t        j                  |d      d       y )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  sF    
CCA66!9??Di FHr   c                     d}t        j                  |      }|j                  d   j                  }| j	                  t        j                  |d      d       y )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  sE    
CCA66!9??Di 02r   N)rP   rQ   rR   r   r   r   r  r  r"   r   r   r  r    sG    ,:	*H +H  :	*2 +2r   r  c                 f    t        j                  |j                         | j                               S r!   )difflibndiff
splitlines)beforeafters     r   r3   r3     s%    	u'')6+<+<+>	??r   c                     t        j                         } | j                  t        j                  t                     | j                  t        j                  t
                     | j                  t        j                  t                     | j                  t        j                  t                     | j                  t        j                  t                     | S r!   )	r   	TestSuiteaddTests	makeSuiter  r   r   r  r  r   s    r   suiter(    s    &//($$_56//($$]34//($$%567//($$%;<=//($$[12	-r   c                      t        j                         } | j                  t        j                  t                     t        t        dd       | S )Nr   T)r   r$  r%  r&  r  setattrr'  s    r   r   r     s;    &//($$%;<=	
 "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     sH    '  % 
     
        ( !wwGGLL0-@BG7z** G7Td=j)) d=N5 5:N#4j6I6IJ 85 85v^,F,6,?,?A 1j)) 182*%% 2,@ z(--/ r   