o
    DDi*                     @   sT   d dl mZmZmZ d dlZd dlmZ d dl	m
Z d dlmZ G dd deZdS )    )DictSequenceUnionN)UnitTestc                   @   sz   e Zd ZdddZdddZdddZdd	d
ZdddZdddZdddZ	dddZ
dddZdddZdddZdS )MatchersReplaceTestreturnNc              	   C   s   dt jdtttt jtt j f f dt jfdd}tt jj	t
dt
dB |}| |t jj	 tt jjt
dt
dB |}| |t jj d S )Nnode
extractionr   c                 S   $   t t | t jjdkrdS dS NFalseTruecstNameensure_typevaluer   r	    r   [/var/www/Datamplify/venv/lib/python3.10/site-packages/libcst/matchers/tests/test_replace.py_swap_bools   
   z>MatchersReplaceTest.test_replace_sentinel.<locals>._swap_boolsr   r   )r   CSTNoder   strr   r   mreplaceRemovalSentinelREMOVEr   assertEqualMaybeSentinelDEFAULT)selfr   replacedr   r   r   test_replace_sentinel   s   
	z)MatchersReplaceTest.test_replace_sentinelc              	   C   s   dt jdtttt jtt j f f dt jfdd}t d}t t	|t
dt
dB |t j}| || | t|t| d S )	Nr   r	   r   c                 S   r
   r   r   r   r   r   r   r   #   r   z:MatchersReplaceTest.test_replace_noop.<locals>._swap_boolsz.foo: int = 5
def bar() -> str:
    return 's'
r   r   )r   r   r   r   r   r   parse_moduler   r   r   r   Module
assertTruedeep_equalsassertNotEqualidr!   r   originalr"   r   r   r   test_replace_noop"   s   

	z%MatchersReplaceTest.test_replace_noopc              	   C   sJ   t d}t t|tdtdB t dt jj}| |d d S )N5foo: bool = True
def bar() -> bool:
    return False
r   r   booleanz:foo: bool = boolean
def bar() -> bool:
    return boolean
)	r   r$   r   r   r   r   r%   coder   r!   r+   r"   r   r   r   test_replace_simple6   s   "z'MatchersReplaceTest.test_replace_simplec                 C   s<   t d}t t|t t  t jj}| 	|d d S )Nz2def bar(x: int, y: int) -> bool:
    return False
z$def bar() -> bool:
    return False
)
r   r$   r   r   r   ParamRemoveFromParentr%   r/   r   r0   r   r   r   test_replace_simple_sentinelC   s   z0MatchersReplaceTest.test_replace_simple_sentinelc              	   C   sv   dt jdtttt jtt j f f dt jfdd}t d}t t	|t
dt
dB |t jj}| |d	 d S )
Nr   r	   r   c                 S   r
   r   r   r   r   r   r   r   N   r   z<MatchersReplaceTest.test_replace_actual.<locals>._swap_boolsr-   r   r   z5foo: bool = False
def bar() -> bool:
    return True
)r   r   r   r   r   r   r$   r   r   r   r   r%   r/   r   r*   r   r   r   test_replace_actualM   s&   
	z'MatchersReplaceTest.test_replace_actualc              	   C   sj   dt jdtttt jtt j f f dt jfdd}t d}t t	|t
 |t jj}| |d d S )Nr   r	   r   c                 S   s"   t ttt | t jjd S )N   )r   Integerr   intr   r   r   r   r   r   _add_onec   s   "z:MatchersReplaceTest.test_replace_add_one.<locals>._add_onez.foo: int = 36
def bar() -> int:
    return 41
z.foo: int = 37
def bar() -> int:
    return 42
)r   r   r   r   r   r   r$   r   r   r   r7   r%   r/   r   )r!   r9   r+   r"   r   r   r   test_replace_add_oneb   s   

z(MatchersReplaceTest.test_replace_add_onec                 C   s   dt jdtttt jtt j f f dt jfdd}t d}t t	|tj
tdttt dgd	|t jj}| |d
 d S )Nr   r	   r   c                 S   s<   |  t|d tjtttt|d tjjd S )Nargr6   )deep_replacer   r   r   r7   r   r8   r   r   r   r   r   _add_one_to_argq   s   zMMatchersReplaceTest.test_replace_add_one_to_foo_args.<locals>._add_one_to_argzKfoo: int = 37
def bar(baz: int) -> int:
    return baz

biz: int = bar(41)
barr;   )funcargszKfoo: int = 37
def bar(baz: int) -> int:
    return baz

biz: int = bar(42)
)r   r   r   r   r   r   r$   r   r   r   Callr   ArgSaveMatchedNoder7   r%   r/   r   )r!   r=   r+   r"   r   r   r    test_replace_add_one_to_foo_argsp   s6   

z4MatchersReplaceTest.test_replace_add_one_to_foo_argsc                 C   s   dt jdtttt jtt j f f dt jfdd}t d}t t	|tj
tjttt gddd|t jj}| |d	 d S )
Nr   r	   r   c                 S   s*   t | t jjt jtt|d ddS )NparamsrE   )r   r   FunctionDefwith_changes
Parameterslistreversedr   r   r   r   _reverse_params   s   zJMatchersReplaceTest.test_replace_sequence_extract.<locals>._reverse_paramsz;def bar(baz: int, foo: int, ) -> int:
    return baz + foo
rE   rF   z;def bar(foo: int, baz: int, ) -> int:
    return baz + foo
)r   r   r   r   r   r   r$   r   r   r   rG   rI   rC   
ZeroOrMorer2   r%   r/   r   )r!   rL   r+   r"   r   r   r   test_replace_sequence_extract   s6   
	z1MatchersReplaceTest.test_replace_sequence_extractc                 C   s   dt jdtttt jtt j f f dt jfdd}t d}t |}t t	
|t	jt	tjdd d	|t jj}| |d
 d S )Nr   r	   r   c                 S      t | t jjddS Nr"   r   r   r   r   rH   r   r   r   r   _rename_foo      z>MatchersReplaceTest.test_replace_metadata.<locals>._rename_fooKfoo: int = 37
def bar(foo: int) -> int:
    return foo

biz: int = bar(42)
c                 S      t dd | D S )Nc                 s       | ]}|j d kV  qdS fooNname.0nr   r   r   	<genexpr>   s    zNMatchersReplaceTest.test_replace_metadata.<locals>.<lambda>.<locals>.<genexpr>any	qualnamesr   r   r   <lambda>   s    z;MatchersReplaceTest.test_replace_metadata.<locals>.<lambda>metadataPreplaced: int = 37
def bar(foo: int) -> int:
    return foo

biz: int = bar(42)
)r   r   r   r   r   r   r$   MetadataWrapperr   r   r   r   MatchMetadataIfTruemetaQualifiedNameProviderr%   r/   r   )r!   rS   r+   wrapperr"   r   r   r   test_replace_metadata   s<   


z)MatchersReplaceTest.test_replace_metadatac              	      s   dt jdtttt jtt j f f dt jfdd t d}t |}G  fdddtj	}t 
|| t jj}| |d	 d S )
Nr   r	   r   c                 S   rO   rP   rR   r   r   r   r   rS      rT   zKMatchersReplaceTest.test_replace_metadata_on_transform.<locals>._rename_foorU   c                       sD   e Zd ZU ejfZeej ed< de	j
de	j
de	j
f fddZdS )zOMatchersReplaceTest.test_replace_metadata_on_transform.<locals>.TestTransformerMETADATA_DEPENDENCIESoriginal_nodeupdated_noder   c                    s.   t | |tjttjdd d t jS )Nc                 S   rV   )Nc                 s   rW   rX   rZ   r\   r   r   r   r_      s    

zMatchersReplaceTest.test_replace_metadata_on_transform.<locals>.TestTransformer.leave_Module.<locals>.<lambda>.<locals>.<genexpr>r`   rb   r   r   r   rd      s    znMatchersReplaceTest.test_replace_metadata_on_transform.<locals>.TestTransformer.leave_Module.<locals>.<lambda>re   )	r   r   r   r   r   ri   rj   rk   r%   )r!   ro   rp   rS   r   r   leave_Module   s   z\MatchersReplaceTest.test_replace_metadata_on_transform.<locals>.TestTransformer.leave_ModuleN)__name__
__module____qualname__rj   rk   rn   r   	ProviderT__annotations__r   r%   rr   r   rq   r   r   TestTransformer   s   
 rx   rg   )r   r   r   r   r   r   r$   rh   r   MatcherDecoratableTransformerr   visitr%   r/   r   )r!   r+   rl   rx   r"   r   rq   r   "test_replace_metadata_on_transform   s"   

z6MatchersReplaceTest.test_replace_metadata_on_transformc                 C   s   dt jdtttt jtt j f f dt jfdd}t d}t t	|tj
ttt
 dgd|t jj}| |d	 d S )
Nr   r	   r   c              
   S   sF   t | t jjt t jt t |d t jjt jjd dgdS )Ninner
_immediaterQ   r@   )r   r   rA   rH   rB   r   r?   r   r   r   r   r   _replace_nested   s   zNMatchersReplaceTest.test_replace_updated_node_changes.<locals>._replace_nestedz]def foo(val: int) -> int:
    return val
bar = foo
baz = foo
biz = foo
foo(bar(baz(biz(5))))
r|   r~   zZdef foo(val: int) -> int:
    return val
bar = foo
baz = foo
biz = foo
foo(bar_immediate)
)r   r   r   r   r   r   r$   r   r   r   rA   rB   rC   r%   r/   r   )r!   r   r+   r"   r   r   r   !test_replace_updated_node_changes   s0   
z5MatchersReplaceTest.test_replace_updated_node_changes)r   N)rs   rt   ru   r#   r,   r1   r4   r5   r:   rD   rN   rm   r{   r   r   r   r   r   r      s    








"

+r   )typingr   r   r   libcstr   libcst.matchersmatchersr   libcst.metadatarf   rj   libcst.testing.utilsr   r   r   r   r   r   <module>   s   