o
    $x`)                     @   s   d Z ddlZddlZddlmZ ddlmZ G dd dejZdZG dd	 d	ejZ	G d
d dejZ
G dd dejZG dd dejZdS )as  Tests for advice

This module was adapted from 'protocols.tests.advice', part of the Python
Enterprise Application Kit (PEAK).  Please notify the PEAK authors
(pje@telecommunity.com and tsarna@sarna.org) if bugs are found or
Zope-specific changes are required, so that the PEAK version of this module
can be kept in sync.

PEAK is a Python application framework that interoperates with (but does
not require) Zope 3 and Twisted.  It provides tools for manipulating UML
models, object-relational persistence, aspect-oriented programming, and more.
Visit the PEAK home page at http://peak.telecommunity.com for more information.
    N)_skip_under_py2)_skip_under_py3kc                   @   s8   e Zd Zdd Zedd Zdd Zdd Zd	d
 ZdS )FrameInfoTestc                 C   sL   ddl m} |j\}}}}| |d |j||fD ]
}| ||ju  qd S )Nr   advisory_testingmodule)zope.interface.testsr   ZmoduleLevelFrameInfoassertEqual__dict__
assertTrue
my_globalsselfr   kindr   f_locals	f_globalsd r   B/usr/lib/python3/dist-packages/zope/interface/tests/test_advice.pytest_w_module%   s   zFrameInfoTest.test_w_modulec                 C   s^   ddl m} |jj\}}}}| |d | ||jju  |j|fD ]
}| ||ju  q"d S Nr   r   class)r   r   ZClassicClassclassLevelFrameInfor	   r   r
   r   r   r   r   r   test_w_ClassicClass-   s   
z!FrameInfoTest.test_w_ClassicClassc                 C   sL   ddl m} |jj\}}}}| |d |j|fD ]
}| ||ju  qd S r   )r   r   ZNewStyleClassr   r	   r
   r   r   r   r   r   r   test_w_NewStyleClass;   s   z"FrameInfoTest.test_w_NewStyleClassc                 C   s`   ddl m} |t \}}}}| |d | |t u  |j|fD ]
}| |t u  q#d S )Nr   getFrameInfozfunction call)	zope.interface.advicer   sys	_getframer	   r   localsr
   globals)r   r   r   r   r   r   r   r   r   r   test_inside_function_callF   s   z'FrameInfoTest.test_inside_function_callc                 C   sn   ddl m} d|i}i }tt|| | |d d | |d |u  | |d d u  | |d |u  d S )	Nr   r   r   r   execr   r   r   )r   r   r#   _FUNKY_EXECr	   r   )r   r   Z_globalsZ_localsr   r   r   test_inside_execN   s   zFrameInfoTest.test_inside_execN)	__name__
__module____qualname__r   r   r   r   r"   r%   r   r   r   r   r   #   s    
r   zMimport sys
kind, module, f_locals, f_globals = getFrameInfo(sys._getframe())
c                   @   s<   e Zd Zedd Zedd Zedd Zedd Zd	S )
AdviceTestsc                    sn   ddl m g  G  fdddt}dD ]}| t|t |\}q|  d|fd|gfd|ggfg d S )	Nr   pingc                       s*   e Zd Z d  d  d dS )z#AdviceTests.test_order.<locals>.Foo         Nr&   r'   r(   r   logr+   r   r   Food   s    

r2   )r,   r-   r.   r,   r-   r.   )%zope.interface.tests.advisory_testingr+   objectr   
isinstancelistr	   )r   r2   ir   r0   r   
test_order`   s   (zAdviceTests.test_orderc                    sL   ddl m G dd dt G  fddd }|\}| |j u  d S )Nr   r*   c                   @      e Zd ZdS )z8AdviceTests.test_single_explicit_meta.<locals>.MetaclassNr/   r   r   r   r   	Metaclasst       r:   c                          e Zd Z Zg d dS )z7AdviceTests.test_single_explicit_meta.<locals>.Concreter,   Nr&   r'   r(   Z__metaclass__r   r:   r+   r   r   Concretew       r?   )r3   r+   typer   	__class__)r   r?   r   r>   r   test_single_explicit_metap   s
   z%AdviceTests.test_single_explicit_metac                    s   ddl m G dd dt G dd dtG  fddd}G fd	d
d
}zG fddd||}| d W n	 tyC   Y nw G dd d G fddd||}| t|t |\}| t| d S )Nr   r*   c                   @   r9   )z0AdviceTests.test_mixed_metas.<locals>.Metaclass1Nr/   r   r   r   r   
Metaclass1   r;   rD   c                   @   r9   )z0AdviceTests.test_mixed_metas.<locals>.Metaclass2Nr/   r   r   r   r   
Metaclass2   r;   rE   c                          e Zd Z ZdS )z+AdviceTests.test_mixed_metas.<locals>.Base1Nr=   r   )rD   r   r   Base1       rG   c                       rF   )z+AdviceTests.test_mixed_metas.<locals>.Base2Nr=   r   )rE   r   r   Base2   rH   rI   c                          e Zd Z g d dS z-AdviceTests.test_mixed_metas.<locals>.Derivedr,   Nr/   r   r*   r   r   Derived       rL   z(Should have gotten incompatibility errorc                   @   r9   )z0AdviceTests.test_mixed_metas.<locals>.Metaclass3Nr/   r   r   r   r   
Metaclass3   r;   rN   c                       r<   rK   r=   r   )rN   r+   r   r   rL      r@   )r3   r+   rA   Zfail	TypeErrorr   r5   r6   )r   rG   rI   rL   r   )rD   rE   rN   r+   r   test_mixed_metas   s    zAdviceTests.test_mixed_metasc                    sD   ddl m  ddlm} G  fddd}|\}| t|| d S )Nr   r*   	ClassTypec                       rJ   )z-AdviceTests.test_meta_no_bases.<locals>.Thingr,   Nr/   r   r*   r   r   Thing   rM   rS   )r3   r+   typesrR   r	   rA   )r   rR   rS   klassr   r*   r   test_meta_no_bases   s
   zAdviceTests.test_meta_no_basesN)r&   r'   r(   r   r8   rC   rP   rV   r   r   r   r   r)   ^   s    


!r)   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
Test_isClassAdvisorc                 O      ddl m} ||i |S )Nr   )isClassAdvisor)r   rY   )r   argskwrY   r   r   r   _callFUT      zTest_isClassAdvisor._callFUTc                 C   s   |  | | d d S )NFr	   r\   r   r   r   r   test_w_non_function      z'Test_isClassAdvisor.test_w_non_functionc                 C   s   dd }|  | |d d S )Nc                   S      t  NNotImplementedErrorr   r   r   r   foo      z7Test_isClassAdvisor.test_w_normal_function.<locals>.fooFr^   )r   rf   r   r   r   test_w_normal_function   s   z*Test_isClassAdvisor.test_w_normal_functionc                 C   s&   dd }t  |_| | |d d S )Nc                   S   rb   rc   rd   r   r   r   r   bar   rg   z8Test_isClassAdvisor.test_w_advisor_function.<locals>.barT)r4   ZpreviousMetaclassr	   r\   )r   ri   r   r   r   test_w_advisor_function   s   z+Test_isClassAdvisor.test_w_advisor_functionN)r&   r'   r(   r\   r`   rh   rj   r   r   r   r   rW      s
    rW   c                   @   sx   e Zd Zdd Zedd Zdd Zdd Zed	d
 Ze	dd Z
edd Ze	dd Zedd Ze	dd ZdS )Test_determineMetaclassc                 O   rX   )Nr   )determineMetaclass)r   rl   )r   rZ   r[   rl   r   r   r   r\      r]   z Test_determineMetaclass._callFUTc                 C   s"   ddl m} | | d| d S )Nr   rQ   r   )rT   rR   r	   r\   )r   rR   r   r   r   
test_empty   s   z"Test_determineMetaclass.test_emptyc                 C   s(   G dd dt }| | d|| d S )Nc                   @   r9   )zDTest_determineMetaclass.test_empty_w_explicit_metatype.<locals>.MetaNr/   r   r   r   r   Meta   r;   rn   r   rA   r	   r\   r   rn   r   r   r   test_empty_w_explicit_metatype      z6Test_determineMetaclass.test_empty_w_explicit_metatypec                 C   s(   G dd dt }| | |ft  d S )Nc                   @   r9   )z1Test_determineMetaclass.test_single.<locals>.MetaNr/   r   r   r   r   rn      r;   rn   ro   rp   r   r   r   test_single   rr   z#Test_determineMetaclass.test_singlec                    s>   G dd dt  G  fdddt }| | |t f  d S )Nc                   @   r9   )z<Test_determineMetaclass.test_meta_of_class.<locals>.MetametaNr/   r   r   r   r   Metameta   r;   rt   c                       rF   )z8Test_determineMetaclass.test_meta_of_class.<locals>.MetaNr=   r   rt   r   r   rn      rH   rn   ro   rp   r   ru   r   test_meta_of_class   s   z*Test_determineMetaclass.test_meta_of_classc                 C   sF   d g d}i }t|| |d }|d }| | |tf| d S )N
)zclass Metameta(type):    passz%class Meta(type, metaclass=Metameta):rx   rn   rt   )joinr#   r	   r\   rA   )r   EXECglobsrn   rt   r   r   r   test_meta_of_class_py3k   s   
z/Test_determineMetaclass.test_meta_of_class_py3kc                    sb   G dd dt  G dd d G  fdddt }G fdddt }| | ||f d S )	Nc                   @   r9   )zBTest_determineMetaclass.test_multiple_in_hierarchy.<locals>.Meta_ANr/   r   r   r   r   Meta_A   r;   r}   c                   @   r9   )zBTest_determineMetaclass.test_multiple_in_hierarchy.<locals>.Meta_BNr/   r   r   r   r   Meta_B   r;   r~   c                       rF   )z=Test_determineMetaclass.test_multiple_in_hierarchy.<locals>.ANr=   r   r}   r   r   A   rH   r   c                       rF   )z=Test_determineMetaclass.test_multiple_in_hierarchy.<locals>.BNr=   r   r~   r   r   B   rH   r   ro   r   r   r   r   r}   r~   r   test_multiple_in_hierarchy   s
   z2Test_determineMetaclass.test_multiple_in_hierarchyc                 C   sV   d g d}i }t|| |d }|d }|d }|d }| | ||f| d S )Nrw   )class Meta_A(type):rx   zclass Meta_B(Meta_A):rx    class A(type, metaclass=Meta_A):rx    class B(type, metaclass=Meta_B):rx   r}   r~   r   r   )ry   r#   r	   r\   r   rz   r{   r}   r~   r   r   r   r   r   test_multiple_in_hierarchy_py3k   s   

z7Test_determineMetaclass.test_multiple_in_hierarchy_py3kc                    s`   G dd dt  G dd dt G  fdddt }G fdddt }| t| j||f d S )	Nc                   @   r9   )zFTest_determineMetaclass.test_multiple_not_in_hierarchy.<locals>.Meta_ANr/   r   r   r   r   r}     r;   r}   c                   @   r9   )zFTest_determineMetaclass.test_multiple_not_in_hierarchy.<locals>.Meta_BNr/   r   r   r   r   r~     r;   r~   c                       rF   )zATest_determineMetaclass.test_multiple_not_in_hierarchy.<locals>.ANr=   r   r   r   r   r     rH   r   c                       rF   )zATest_determineMetaclass.test_multiple_not_in_hierarchy.<locals>.BNr=   r   r   r   r   r     rH   r   )rA   assertRaisesrO   r\   r   r   r   r   test_multiple_not_in_hierarchy  s
   z6Test_determineMetaclass.test_multiple_not_in_hierarchyc                 C   sT   d g d}i }t|| |d }|d }|d }|d }| t| j||f d S )Nrw   )r   rx   zclass Meta_B(type):rx   r   rx   r   rx   r}   r~   r   r   )ry   r#   r   rO   r\   r   r   r   r   #test_multiple_not_in_hierarchy_py3k  s   

z;Test_determineMetaclass.test_multiple_not_in_hierarchy_py3kN)r&   r'   r(   r\   r   rm   rq   rs   rv   r   r|   r   r   r   r   r   r   r   r   rk      s$    

	



rk   c                   @   sT   e Zd Zdd Zdd Zedd Zedd Zd	d
 Zdd Z	dd Z
dd ZdS )Test_minimalBasesc                 C   s   ddl m} ||S )Nr   )minimalBases)r   r   )r   Zklassesr   r   r   r   r\   4  s   zTest_minimalBases._callFUTc                 C   s   |  | g g  d S rc   r^   r_   r   r   r   rm   8  ra   zTest_minimalBases.test_emptyc                 C   s*   G dd d}|  | t|gg  d S )Nc                   @   r9   )z1Test_minimalBases.test_w_oldstyle_meta.<locals>.CNr/   r   r   r   r   C=  r;   r   r	   r\   rA   r   r   r   r   r   test_w_oldstyle_meta;  s   z&Test_minimalBases.test_w_oldstyle_metac                 C   s(   G dd d}|  | |g|g d S )Nc                   @   r9   )z2Test_minimalBases.test_w_oldstyle_class.<locals>.CNr/   r   r   r   r   r   C  r;   r   r^   r   r   r   r   test_w_oldstyle_classA  s   z'Test_minimalBases.test_w_oldstyle_classc                 C   s   |  | tgtg d S rc   r   r_   r   r   r   test_w_newstyle_metaG  s   z&Test_minimalBases.test_w_newstyle_metac                 C   s*   G dd dt }| | |g|g d S )Nc                   @   r9   )z2Test_minimalBases.test_w_newstyle_class.<locals>.CNr/   r   r   r   r   r   K  r;   r   r4   r	   r\   r   r   r   r   test_w_newstyle_classJ  s   z'Test_minimalBases.test_w_newstyle_classc                 C   s   G dd dt }G dd d|}G dd d|}G dd dt }| | |||g|g | | ||g|g | | ||g|g | | ||g|g | | |||g||g d S )	Nc                   @   r9   )z@Test_minimalBases.test_simple_hierarchy_skips_implied.<locals>.ANr/   r   r   r   r   r   P  r;   r   c                   @   r9   )z@Test_minimalBases.test_simple_hierarchy_skips_implied.<locals>.BNr/   r   r   r   r   r   R  r;   r   c                   @   r9   )z@Test_minimalBases.test_simple_hierarchy_skips_implied.<locals>.CNr/   r   r   r   r   r   T  r;   r   c                   @   r9   )z@Test_minimalBases.test_simple_hierarchy_skips_implied.<locals>.DNr/   r   r   r   r   DV  r;   r   r   )r   r   r   r   r   r   r   r   #test_simple_hierarchy_skips_impliedO  s    z5Test_minimalBases.test_simple_hierarchy_skips_impliedc                 C   s@   G dd dt }G dd dt }| | |||g||g d S )Nc                   @   r9   )z@Test_minimalBases.test_repeats_kicked_to_end_of_queue.<locals>.ANr/   r   r   r   r   r   _  r;   r   c                   @   r9   )z@Test_minimalBases.test_repeats_kicked_to_end_of_queue.<locals>.BNr/   r   r   r   r   r   a  r;   r   r   r   r   r   r   #test_repeats_kicked_to_end_of_queue^  s    z5Test_minimalBases.test_repeats_kicked_to_end_of_queueN)r&   r'   r(   r\   rm   r   r   r   r   r   r   r   r   r   r   r   r   2  s    

r   )__doc__Zunittestr   Zzope.interface._compatr   r   ZTestCaser   r$   r)   rW   rk   r   r   r   r   r   <module>   s   6Mr