o
    DDi/                     @   sl   d dl m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
mZmZ d dlmZ G dd	 d	eZdS )
    )MockN)parse_module)MetadataException)CSTTransformer)BatchableMetadataProviderMetadataWrapperVisitorMetadataProvider)UnitTestc                   @   sp   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S )MetadataProviderTestreturnNc                    sd   | G dd dt t G fdddt t  G  fdddt}td}t||  dS )	z
        Tests that visitor providers are resolved correctly.

        Sets 2 metadata entries for every node:
            SimpleProvider -> 1
            DependentProvider - > 2
        c                   @   s    e Zd ZdejdefddZdS )zBMetadataProviderTest.test_visitor_provider.<locals>.SimpleProvidernoder   c                 S   s   |  |d dS N   Tset_metadataselfr    r   e/var/www/Datamplify/venv/lib/python3.10/site-packages/libcst/metadata/tests/test_metadata_provider.pyon_visit!      zKMetadataProviderTest.test_visitor_provider.<locals>.SimpleProvider.on_visitN)__name__
__module____qualname__cstCSTNodeboolr   r   r   r   r   SimpleProvider    s    r   c                       *   e Zd Z fZdejdef fddZdS )zEMetadataProviderTest.test_visitor_provider.<locals>.DependentProviderr   r   c                    s   |  ||  |d  dS r   )r   get_metadatar   r   r   r   r   (   s   zNMetadataProviderTest.test_visitor_provider.<locals>.DependentProvider.on_visitNr   r   r   METADATA_DEPENDENCIESr   r   r   r   r   r    r   r   DependentProvider%       r#   c                       sL   e Zd Z fZdejddf fddZdejddf fddZdS )zDMetadataProviderTest.test_visitor_provider.<locals>.DependentVisitorr   r   Nc                    ,    | |d  |  |d d S Nr      assertEqualr   r   r#   r   testr   r   visit_Module0      zQMetadataProviderTest.test_visitor_provider.<locals>.DependentVisitor.visit_Modulec                    r%   r&   r(   r   r*   r   r   
visit_Pass5   r-   zOMetadataProviderTest.test_visitor_provider.<locals>.DependentVisitor.visit_Pass	r   r   r   r"   r   Moduler,   Passr.   r   r*   r   r   DependentVisitor,   s     r2   passN)r   intr   r   r   visitr   r2   moduler   r*   r   test_visitor_provider   s   	z*MetadataProviderTest.test_visitor_providerc                    s   | t  G fdddtt  G fdddtt G  fdddt}td}t||  j	  j
	  dS )	z
        Tests that batchable providers are resolved correctly.

        Sets metadata on:
            - pass: BatchedProviderA -> 1
                    BatchedProviderB -> "a"

        c                       $   e Zd Zdejddf fddZdS )zDMetadataProviderTest.test_batched_provider.<locals>.BatchedProviderAr   r   Nc                           | |d d S Nr   	visited_ar   r   mockr   r   r.   J      zOMetadataProviderTest.test_batched_provider.<locals>.BatchedProviderA.visit_Passr   r   r   r   r1   r.   r   r>   r   r   BatchedProviderAI       rB   c                       r9   )zDMetadataProviderTest.test_batched_provider.<locals>.BatchedProviderBr   r   Nc                    r:   )Na	visited_br   r   r>   r   r   r.   O   r@   zOMetadataProviderTest.test_batched_provider.<locals>.BatchedProviderB.visit_PassrA   r   r>   r   r   BatchedProviderBN   rC   rG   c                       s0   e Zd Z fZdejddf fddZdS )zDMetadataProviderTest.test_batched_provider.<locals>.DependentVisitorr   r   Nc                    s,    |  |d  | |d d S )Nr   rD   r(   r   rB   rG   r+   r   r   r.   V   r-   zOMetadataProviderTest.test_batched_provider.<locals>.DependentVisitor.visit_Passr   r   r   r"   r   r1   r.   r   rH   r   r   r2   S   s     r2   r3   N)r   r   r4   strr   r   r   r5   r=   assert_called_oncerF   r6   r   )rB   rG   r?   r+   r   test_batched_provider=   s   	
z*MetadataProviderTest.test_batched_providerc                    s   | t  G fdddtt G fdddtt  G fdddtt G  fdddtt G  fd	d
d
tt G  fdddt}td}t||  j	  j
	  j	  j	  dS )z
        Tests that a mixed set of providers is resolved properly.

        Sets metadata on pass:
            BatchedProviderA -> 2
            BatchedProviderB -> 3
            DependentProvider -> 5
            DependentBatched -> 4
        c                       r9   )zAMetadataProviderTest.test_mixed_providers.<locals>.SimpleProviderr   r   Nc                    r:   r;   visited_simpler   r   r>   r   r   r.   p   r@   zLMetadataProviderTest.test_mixed_providers.<locals>.SimpleProvider.visit_Pass)r   r   r   r   r   r.   r   r>   r   r   r   o   rC   r   c                       *   e Zd Z fZdejddffddZdS )zCMetadataProviderTest.test_mixed_providers.<locals>.BatchedProviderAr   r   Nc                    r:   Nr'   r<   r   r>   r   r   r.   w   r@   zNMetadataProviderTest.test_mixed_providers.<locals>.BatchedProviderA.visit_PassrI   r   r   r?   r   r   rB   t   r$   rB   c                       rO   )zCMetadataProviderTest.test_mixed_providers.<locals>.BatchedProviderBr   r   Nc                    r:   )N   rE   r   r>   r   r   r.   ~   r@   zNMetadataProviderTest.test_mixed_providers.<locals>.BatchedProviderB.visit_PassrI   r   rQ   r   r   rG   {   r$   rG   c                       s.   e Zd Z fZdejdef fddZdS )zDMetadataProviderTest.test_mixed_providers.<locals>.DependentProviderr   r   c                    s,   |   |d|  |d }| || dS )Nr   T)r   r   )r   r   sumrB   rG   r   r   r      s
   zMMetadataProviderTest.test_mixed_providers.<locals>.DependentProvider.on_visitNr!   r   rT   r   r   r#      s    r#   c                       s,   e Zd Z fZdejddf fddZdS )zCMetadataProviderTest.test_mixed_providers.<locals>.BatchedProviderCr   r   Nc                    s$      | ||  |d  d S rP   )	visited_cr   r   r   rB   r?   r   r   r.      s   zNMetadataProviderTest.test_mixed_providers.<locals>.BatchedProviderC.visit_PassrI   r   rV   r   r   BatchedProviderC       rW   c                       sR   e Zd Z fZdejddffddZdejddf fddZdS )zCMetadataProviderTest.test_mixed_providers.<locals>.DependentVisitorr   r   Nc                        |  |d d S )Nr   r(   r   )r#   r+   r   r   r,      s   zPMetadataProviderTest.test_mixed_providers.<locals>.DependentVisitor.visit_Modulec                    sT    |  |d  | |d  | |d  | |d d S )Nr'   rR         r(   r   rB   rG   rW   r#   r+   r   r   r.      s   zNMetadataProviderTest.test_mixed_providers.<locals>.DependentVisitor.visit_Passr/   r   r\   r   r   r2      s    $r2   r3   N)r   r   r4   r   r   r   r   r5   rN   rK   r=   rF   rU   r6   r   )rB   rG   rW   r#   r   r?   r+   r   test_mixed_providersb   s   




z)MetadataProviderTest.test_mixed_providersc                    sr   | t  G fdddtt  G  fdddt}G  fddd|}td}t||  j  dS )	zg
        Tests that classes inherit access to metadata declared by their base
        classes.
        c                       r9   )zDMetadataProviderTest.test_inherited_metadata.<locals>.SimpleProviderr   r   Nc                    r:   r;   rM   r   r>   r   r   r.      r@   zOMetadataProviderTest.test_inherited_metadata.<locals>.SimpleProvider.visit_PassrA   r   r>   r   r   r      rC   r   c                          e Zd Z fZdS )z>MetadataProviderTest.test_inherited_metadata.<locals>.VisitorANr   r   r   r"   r   r    r   r   VisitorA       
r`   c                       s&   e Zd Zdejddf fddZdS )z>MetadataProviderTest.test_inherited_metadata.<locals>.VisitorBr   r   Nc                    rY   r;   r(   r   r   test_runnerr   r   r.      s   zIMetadataProviderTest.test_inherited_metadata.<locals>.VisitorB.visit_PassrA   r   rb   r   r   VisitorB   s    rd   r3   N)	r   r   r4   r   r   r   r5   rN   rK   )r   r`   rd   r7   r   )r   r?   rc   r   test_inherited_metadata   s   z,MetadataProviderTest.test_inherited_metadatac                    s   | t  G fdddtt  G  fdddtt }G  fddd|G fdddt}td	}t||  j  j	  d
S )zi
        Tests that providers inherit access to metadata declared by their base
        classes.
        c                       r9   )zHMetadataProviderTest.test_provider_inherited_metadata.<locals>.ProviderAr   r   Nc                    r:   r;   r<   r   r>   r   r   r.      r@   zSMetadataProviderTest.test_provider_inherited_metadata.<locals>.ProviderA.visit_PassrA   r   r>   r   r   	ProviderA   rC   rf   c                       r^   )zHMetadataProviderTest.test_provider_inherited_metadata.<locals>.ProviderBNr_   r   rf   r   r   	ProviderB   ra   rh   c                       (   e Zd Zdejddf fddZdS )zHMetadataProviderTest.test_provider_inherited_metadata.<locals>.ProviderCr   r   Nc                           |  |d d S r;   rU   r)   r   r   rf   r?   rc   r   r   r.         zSMetadataProviderTest.test_provider_inherited_metadata.<locals>.ProviderC.visit_PassrA   r   rl   r   r   	ProviderC        rn   c                       r^   )zFMetadataProviderTest.test_provider_inherited_metadata.<locals>.VisitorNr_   r   rn   r   r   Visitor   ra   rq   r3   N)
r   r   r4   r   r   r   r5   r=   rK   rU   )r   rh   rq   r7   r   rf   rn   r?   rc   r    test_provider_inherited_metadata      
z5MetadataProviderTest.test_provider_inherited_metadatac                    s   | t  G fdddtt  G  fdddtt }G  fddd|G fdddt}td	}t||  j	  j
	  d
S )zs
        Tests that batchable providers inherit access to metadata declared by
        their base classes.
        c                       r9   )zRMetadataProviderTest.test_batchable_provider_inherited_metadata.<locals>.ProviderAr   r   Nc                    r:   r;   r<   r   r>   r   r   r.      r@   z]MetadataProviderTest.test_batchable_provider_inherited_metadata.<locals>.ProviderA.visit_PassrA   r   r>   r   r   rf      rC   rf   c                       r^   )zRMetadataProviderTest.test_batchable_provider_inherited_metadata.<locals>.ProviderBNr_   r   rg   r   r   rh      ra   rh   c                       ri   )zRMetadataProviderTest.test_batchable_provider_inherited_metadata.<locals>.ProviderCr   r   Nc                    rj   r;   rk   r   rl   r   r   r.      rm   z]MetadataProviderTest.test_batchable_provider_inherited_metadata.<locals>.ProviderC.visit_PassrA   r   rl   r   r   rn      ro   rn   c                       r^   )zQMetadataProviderTest.test_batchable_provider_inherited_metadata.<locals>.VisitorANr_   r   rp   r   r   r`      ra   r`   r3   N)r   r   r4   r   r   r   r   r5   r=   rK   rU   )r   rh   r`   r7   r   rr   r   *test_batchable_provider_inherited_metadata   rt   z?MetadataProviderTest.test_batchable_provider_inherited_metadatac                    sF   | G fdddt t  G  fdddt}tg |  dS )zk
        Tests a provider can access its own metadata (assuming it has been
        set properly.)
        c                       s8   e Zd ZdejdefddZdejddf fddZdS )	z:MetadataProviderTest.test_self_metadata.<locals>.ProviderAr   r   c                 S   s   |  |d dS NTr   r   r   r   r   r     r   zCMetadataProviderTest.test_self_metadata.<locals>.ProviderA.on_visitoriginal_nodeNc                    s     | t| |d d S rv   )r)   r   type)r   rw   rc   r   r   on_leave  s   zCMetadataProviderTest.test_self_metadata.<locals>.ProviderA.on_leave)r   r   r   r   r   r   r   rz   r   ry   r   r   rf     s    rf   c                       r^   )z9MetadataProviderTest.test_self_metadata.<locals>.AVisitorNr_   r   rg   r   r   AVisitor  ra   r{   N)r   r   r   r   r0   r5   r   r{   r   )rf   rc   r   test_self_metadata	  s   
z'MetadataProviderTest.test_self_metadatac                    sl   G dd dt t  G  fdddt}| td tg |  W d   dS 1 s/w   Y  dS )zI
        Tests that access to unset metadata throws a key error.
        c                   @      e Zd ZdS )z;MetadataProviderTest.test_unset_metadata.<locals>.ProviderANr   r   r   r   r   r   r   rf   $      rf   c                       r   )z:MetadataProviderTest.test_unset_metadata.<locals>.AVisitorr   r   c                    s   |   | dS rv   r   r   rg   r   r   r   *  r   zCMetadataProviderTest.test_unset_metadata.<locals>.AVisitor.on_visitNr!   r   rg   r   r   r{   '  r$   r{   zIProviderA is a dependency, but not set; did you forget a MetadataWrapper?N)r   r   r   assertRaisesRegexKeyErrorr   r0   r5   r|   r   rg   r   test_unset_metadata  s   "z(MetadataProviderTest.test_unset_metadatac                    s   G dd dt t  G dd dt t G  fdddt}| td ttg |  W d   dS 1 s<w   Y  dS )	zN
        Tests that access to undeclared metadata throws a key error.
        c                   @   r~   )z@MetadataProviderTest.test_undeclared_metadata.<locals>.ProviderANr   r   r   r   r   rf   9  r   rf   c                   @   r~   )z@MetadataProviderTest.test_undeclared_metadata.<locals>.ProviderBNr   r   r   r   r   rh   <  r   rh   c                       s,   e Zd Z fZdejdef fddZdS )z?MetadataProviderTest.test_undeclared_metadata.<locals>.AVisitorr   r   c                    s   |   |d |  | dS rv   r   r   rf   rh   r   r   r   B  s   zHMetadataProviderTest.test_undeclared_metadata.<locals>.AVisitor.on_visitNr!   r   r   r   r   r{   ?  rX   r{   zLProviderB is not declared as a dependency in AVisitor.METADATA_DEPENDENCIES.N)	r   r   r   r   r   r   r   r0   r5   r|   r   r   r   test_undeclared_metadata4  s   "z-MetadataProviderTest.test_undeclared_metadatac                    sx   G dd dt t   f _G  fdddt}| td ttg 	|  W d   dS 1 s5w   Y  dS )z@
        Tests that circular dependencies are detected.
        c                   @   r~   )z@MetadataProviderTest.test_circular_dependency.<locals>.ProviderANr   r   r   r   r   rf   R  r   rf   c                       r^   )zAMetadataProviderTest.test_circular_dependency.<locals>.BadVisitorNr_   r   rg   r   r   
BadVisitorW  ra   r   z+Detected circular dependencies in ProviderAN)
r   rJ   r"   r   r   r   r   r   r0   r5   )r   r   r   rg   r   test_circular_dependencyM  s   "z-MetadataProviderTest.test_circular_dependency)r   N)r   r   r   r8   rL   r]   re   rs   ru   r}   r   r   r   r   r   r   r   r
      s    

(
%
O




r
   )unittest.mockr   libcstr   r   libcst._exceptionsr   libcst._visitorsr   libcst.metadatar   r   r   libcst.testing.utilsr	   r
   r   r   r   r   <module>   s   