o
    $x`7                     @   s   d Z ddl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ZG dd deZG dd dejZ	G dd dejZ
dS )z!Resolution ordering utility tests    Nc                   @   4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )Test__mergeOrderingsc                 C      ddl m} ||S )Nr   )_legacy_mergeOrderings)zope.interface.ror   )selfZ	orderingsr    r   >/usr/lib/python3/dist-packages/zope/interface/tests/test_ro.py_callFUT      zTest__mergeOrderings._callFUTc                 C   s   |  | g g  d S NassertEqualr
   r   r   r   r	   
test_empty   s   zTest__mergeOrderings.test_emptyc                 C   s   |  | g dg d d S )N)abcr   r   r   r   r	   test_single   s   z Test__mergeOrderings.test_singlec                 C   s$   |  | dgddggddg d S )Nr   r   r   r   r   r   r	   test_w_duplicates   s   $z&Test__mergeOrderings.test_w_duplicatesc                 C   s@   g d}ddg}g d}dg}|  | ||||gg d d S )N)xyzqr   )         )r   r   r   r   r   r   r   r   )r   ZO1ZO2ZO3ZO4r   r   r	   &test_suffix_across_multiple_duplicates"   s   z;Test__mergeOrderings.test_suffix_across_multiple_duplicatesN)__name__
__module____qualname__r
   r   r   r   r   r   r   r   r	   r      s    r   c                   @   r   )Test__flattenc                 C   r   )Nr   )_legacy_flatten)r   r"   )r   obr"   r   r   r	   r
   -   r   zTest__flatten._callFUTc                 C   4   G dd dt }| }d|_| | ||g d S )Nc                   @      e Zd ZdS )z-Test__flatten.test_w_empty_bases.<locals>.FooNr   r   r    r   r   r   r	   Foo2       r'   r   object	__bases__r   r
   r   r'   Zfoor   r   r	   test_w_empty_bases1      z Test__flatten.test_w_empty_basesc                 C   *   G dd dt }| | ||t g d S )Nc                   @   r%   )z-Test__flatten.test_w_single_base.<locals>.FooNr&   r   r   r   r	   r'   9   r(   r'   r*   r   r
   r   r'   r   r   r	   test_w_single_base8      z Test__flatten.test_w_single_basec                 C   <   G dd dt }G dd d|}| | |||t g d S )Nc                   @   r%   )z'Test__flatten.test_w_bases.<locals>.FooNr&   r   r   r   r	   r'   >   r(   r'   c                   @   r%   )z'Test__flatten.test_w_bases.<locals>.BarNr&   r   r   r   r	   Bar@   r(   r5   r0   r   r'   r5   r   r   r	   test_w_bases=      zTest__flatten.test_w_basesc              
   C   sf   G dd dt }G dd d|}G dd d|}G dd d||}| | ||||t ||t g d S )	Nc                   @   r%   )z)Test__flatten.test_w_diamond.<locals>.FooNr&   r   r   r   r	   r'   E   r(   r'   c                   @   r%   )z)Test__flatten.test_w_diamond.<locals>.BarNr&   r   r   r   r	   r5   G   r(   r5   c                   @   r%   )z)Test__flatten.test_w_diamond.<locals>.BazNr&   r   r   r   r	   BazI   r(   r9   c                   @   r%   )z)Test__flatten.test_w_diamond.<locals>.QuxNr&   r   r   r   r	   QuxK   r(   r:   r0   r   r'   r5   r9   r:   r   r   r	   test_w_diamondD   s   zTest__flatten.test_w_diamondN)r   r   r    r
   r-   r2   r7   r<   r   r   r   r	   r!   +   s    r!   c                   @   sP   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd ZdS )Test_roNc                 K      ddl m} ||fi |S )Nr   )
_legacy_ro)r   r?   )r   r#   kwargsr?   r   r   r	   r
   S      zTest_ro._callFUTc                 C   r$   )Nc                   @   r%   )z'Test_ro.test_w_empty_bases.<locals>.FooNr&   r   r   r   r	   r'   X   r(   r'   r   r)   r,   r   r   r	   r-   W   r.   zTest_ro.test_w_empty_basesc                 C   r/   )Nc                   @   r%   )z'Test_ro.test_w_single_base.<locals>.FooNr&   r   r   r   r	   r'   _   r(   r'   r0   r1   r   r   r	   r2   ^   r3   zTest_ro.test_w_single_basec                 C   r4   )Nc                   @   r%   )z!Test_ro.test_w_bases.<locals>.FooNr&   r   r   r   r	   r'   d   r(   r'   c                   @   r%   )z!Test_ro.test_w_bases.<locals>.BarNr&   r   r   r   r	   r5   f   r(   r5   r0   r6   r   r   r	   r7   c   r8   zTest_ro.test_w_basesc                 C   sb   G dd dt }G dd d|}G dd d|}G dd d||}| | |||||t g d S )	Nc                   @   r%   )z#Test_ro.test_w_diamond.<locals>.FooNr&   r   r   r   r	   r'   k   r(   r'   c                   @   r%   )z#Test_ro.test_w_diamond.<locals>.BarNr&   r   r   r   r	   r5   m   r(   r5   c                   @   r%   )z#Test_ro.test_w_diamond.<locals>.BazNr&   r   r   r   r	   r9   o   r(   r9   c                   @   r%   )z#Test_ro.test_w_diamond.<locals>.QuxNr&   r   r   r   r	   r:   q   r(   r:   r0   r;   r   r   r	   r<   j   s   zTest_ro.test_w_diamondc                 C   sb   G dd dt }|d}|d|}|d|}|d|}|d|}|d|||}|||||||gfS )	Nc                   @   s   e Zd Zdd Zdd ZdS )z Test_ro._make_IOErr.<locals>.Fooc                 W      || _ || _d S r   r   r+   )r   namebasesr   r   r	   __init__y      
z)Test_ro._make_IOErr.<locals>.Foo.__init__c                 S      | j S r   r   r   r   r   r	   __repr__|      z)Test_ro._make_IOErr.<locals>.Foo.__repr__N)r   r   r    rF   rJ   r   r   r   r	   r'   x   s    r'   IExIStdErrIEnvErrIIOErrIOSErrIOErr)r*   )r   r'   rL   rM   rN   rO   rP   rQ   r   r   r	   _make_IOErrv   s   	



zTest_ro._make_IOErrc                 C   s"   |   \}}| | || d S r   )rR   r   r
   )r   rQ   rE   r   r   r	   test_non_orderable   s   zTest_ro.test_non_orderablec           
      C   s   ddl m} ddl m} ddl m} ddl m} G dd d|}||G dd	 d	t}G d
d d|}G dd dt}G dd d||}	| | ||	 ||	|||||||||tg d S )Nr   )implementer	Interface
providedBy)implementedByc                   @   r%   )z?Test_ro.test_mixed_inheritance_and_implementation.<locals>.IFooNr&   r   r   r   r	   IFoo   r(   rZ   c                   @   r%   )zHTest_ro.test_mixed_inheritance_and_implementation.<locals>.ImplementsFooNr&   r   r   r   r	   ImplementsFoo   s    r[   c                   @   r%   )zETest_ro.test_mixed_inheritance_and_implementation.<locals>.ExtendsFooNr&   r   r   r   r	   
ExtendsFoo   r(   r\   c                   @   r%   )zLTest_ro.test_mixed_inheritance_and_implementation.<locals>.ImplementsNothingNr&   r   r   r   r	   ImplementsNothing   r(   r]   c                   @   r%   )zVTest_ro.test_mixed_inheritance_and_implementation.<locals>.ExtendsFooImplementsNothingNr&   r   r   r   r	   ExtendsFooImplementsNothing   r(   r^   )zope.interfacerT   rV   rX   rY   r*   r   r
   )
r   rT   rV   rX   rY   rZ   r[   r\   r]   r^   r   r   r	   )test_mixed_inheritance_and_implementation   s*   z1Test_ro.test_mixed_inheritance_and_implementation)r   r   r    ZmaxDiffr
   r-   r2   r7   r<   rR   rS   r`   r   r   r   r	   r=   Q   s    r=   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )	C3Settingc                 C   rB   r   )_setting_value)r   Zsettingvaluer   r   r	   rF      rG   zC3Setting.__init__c                 C   s$   ddl m} t|j| jj| j d S Nr   ro)r_   rg   setattrC3rb   r   rc   )r   rg   r   r   r	   	__enter__      zC3Setting.__enter__c                 C   s$   ddl m} t|j| jj| j d S re   )r_   rg   rh   ri   rb   r   )r   tvtbrg   r   r   r	   __exit__   rk   zC3Setting.__exit__N)r   r   r    rF   rj   ro   r   r   r   r	   ra      s    ra   c                       sh   e Zd Zdd Zdd ZefddZdd Zd	d
 Zdd Z	dd Z
dd Zdd Z fddZ  ZS )
Test_c3_roc                 C   s4   t |  ddlm} |d | _}| |j d S )Nr   )InstalledHandlerzzope.interface.ro)r=   setUpZzope.testing.loggingsupportrq   log_handlerZ
addCleanupZ	uninstall)r   rq   handlerr   r   r	   rr      s   
zTest_c3_ro.setUpc                 K   r>   re   )r   rg   )r   r#   r@   rg   r   r   r	   r
      rA   zTest_c3_ro._callFUTc           	      C   s   |}G dd d|}G dd d|}G dd d|}G dd d||}G d	d
 d
||}G dd d||}t |drE| | | | |S )Nc                   @   r%   )z*Test_c3_ro.test_complex_diamond.<locals>.FNr&   r   r   r   r	   F   r(   ru   c                   @   r%   )z*Test_c3_ro.test_complex_diamond.<locals>.ENr&   r   r   r   r	   E   r(   rv   c                   @   r%   )z*Test_c3_ro.test_complex_diamond.<locals>.DNr&   r   r   r   r	   D   r(   rw   c                   @   r%   )z*Test_c3_ro.test_complex_diamond.<locals>.CNr&   r   r   r   r	   C   r(   rx   c                   @   r%   )z*Test_c3_ro.test_complex_diamond.<locals>.BNr&   r   r   r   r	   B   r(   ry   c                   @   r%   )z*Test_c3_ro.test_complex_diamond.<locals>.ANr&   r   r   r   r	   A   r(   rz   mro)hasattrr   r{   r
   )	r   baseOru   rv   rw   rx   ry   rz   r   r   r	   test_complex_diamond   s   
zTest_c3_ro.test_complex_diamondc                 C   s6   ddl m} | |}| dd |jD g d d S )Nr   rU   c                 S   s   g | ]}|j qS r   rI   ).0r   r   r   r	   
<listcomp>   s    z=Test_c3_ro.test_complex_diamond_interface.<locals>.<listcomp>)rz   ry   rx   rw   rv   ru   rV   )r_   rV   r   r   __iro__)r   rV   ZIAr   r   r	   test_complex_diamond_interface   s   
z)Test_c3_ro.test_complex_diamond_interfacec                 C   s>   ddl m} | |}| j|dd}| |j| |   d S )Nr   rU   T)use_legacy_ro)r_   rV   r   r
   ZassertNotEqualr   _check_handler_complex_diamond)r   rV   rz   Zlegacy_A_iror   r   r	   (test_complex_diamond_use_legacy_argument   s
   
z3Test_c3_ro.test_complex_diamond_use_legacy_argumentc                 C   sB   ddl m} | |}| j|dd}| t||j |   d S )Nr   rU   T)log_changed_ro)r_   rV   r   r
   r   tupler   r   )r   rV   rz   Zcomputed_A_iror   r   r	   ,test_complex_diamond_compare_legacy_argument   s
   
z7Test_c3_ro.test_complex_diamond_compare_legacy_argumentc                 C   sJ   | j }| dt|j |jd }| ddd |  D d d S )Nr   r   
c                 s   s    | ]}|  V  qd S r   )rstrip)r   lr   r   r	   	<genexpr>  s    z<Test_c3_ro._check_handler_complex_diamond.<locals>.<genexpr>a  Object <InterfaceClass zope.interface.tests.test_ro.A> has different legacy and C3 MROs:
  Legacy RO (len=7)                 C3 RO (len=7; inconsistent=no)
  ==================================================================
    zope.interface.tests.test_ro.A    zope.interface.tests.test_ro.A
    zope.interface.tests.test_ro.B    zope.interface.tests.test_ro.B
  - zope.interface.tests.test_ro.E
    zope.interface.tests.test_ro.C    zope.interface.tests.test_ro.C
    zope.interface.tests.test_ro.D    zope.interface.tests.test_ro.D
                                    + zope.interface.tests.test_ro.E
    zope.interface.tests.test_ro.F    zope.interface.tests.test_ro.F
    zope.interface.Interface          zope.interface.Interface)rs   r   lenrecordsjoin
getMessage
splitlines)r   rt   recordr   r   r	   r      s   
(z)Test_c3_ro._check_handler_complex_diamondc                 C   s  ddl m} G dd dt}|ddi }G dd d|}G d	d
 d
|}G dd d|}G dd d|}|d}|d|||f}	|d|||	f}
| j|
ddd}| ||
||	|||||g | jj\}| d|  | 	|j
 | j|
dd W d    d S 1 sw   Y  d S )Nr   rf   c                   @   s"   e Zd ZdZdddZdd ZdS )zUTest_c3_ro.test_ExtendedPathIndex_implement_thing_implementedby_super.<locals>._Basedr   Nc                 S   rB   r   rC   )r   rD   rE   Zattrsr   r   r	   rF     rG   z^Test_c3_ro.test_ExtendedPathIndex_implement_thing_implementedby_super.<locals>._Based.__init__c                 S   rH   r   rI   r   r   r   r	   rJ     rK   z^Test_c3_ro.test_ExtendedPathIndex_implement_thing_implementedby_super.<locals>._Based.__repr__)r   N)r   r   r    r+   rF   rJ   r   r   r   r	   _Based  s    
r   rV   r   c                   @   r%   )z^Test_c3_ro.test_ExtendedPathIndex_implement_thing_implementedby_super.<locals>.IPluggableIndexNr&   r   r   r   r	   IPluggableIndex!  r(   r   c                   @   r%   )zbTest_c3_ro.test_ExtendedPathIndex_implement_thing_implementedby_super.<locals>.ILimitedResultIndexNr&   r   r   r   r	   ILimitedResultIndex$  r(   r   c                   @   r%   )zZTest_c3_ro.test_ExtendedPathIndex_implement_thing_implementedby_super.<locals>.IQueryIndexNr&   r   r   r   r	   IQueryIndex'  r(   r   c                   @   r%   )zYTest_c3_ro.test_ExtendedPathIndex_implement_thing_implementedby_super.<locals>.IPathIndexNr&   r   r   r   r	   
IPathIndex*  r(   r   r*   	PathIndexExtendedPathIndexTF)r   strictzused the legacyr   )r_   rg   r*   r
   r   rs   r   assertInr   assertRaises InconsistentResolutionOrderError)r   rg   r   rV   r   r   r   r   objr   r   resultr   r   r   r	   :test_ExtendedPathIndex_implement_thing_implementedby_super  s8   


"zETest_c3_ro.test_ExtendedPathIndex_implement_thing_implementedby_superc              	   C   s`   t tur	| d ddlm} ddlm} | t|t  	 |j
|j|j|j|j|jg d S )Nz$Requires Python 3 IOError == OSErrorr   )
interfacesrW   )OSErrorIOErrorZskipTestZzope.interface.commonr   r_   rX   r   listZ	flattenedZIOSErrorZIIOErrorZIEnvironmentErrorZIStandardErrorZ
IExceptionrV   )r   r   rX   r   r   r	   test_OSError_IOErrorP  s   
zTest_c3_ro.test_OSError_IOErrorc                    s  dd l }ddlm} z|`W n	 ty   Y nw | X |d t|jj	d< t|jj
d% | |j tt|   W d    n1 sJw   Y  W d    n1 sYw   Y  W d    n1 shw   Y  W d    n1 sww   Y  |  \}}| |j | j|dd W d    n1 sw   Y  t|jjdE t|jj
d. |  |d | | W d    n1 sw   Y  | ||jj W d    n1 sw   Y  W d    n1 sw   Y  | j|dd}| j|ddd}| || d S )	Nr   rf   errorTFr   ignore)r   r   )warningsr_   rg   Z__warningregistry__AttributeErrorcatch_warningssimplefilterra   ri   ZWARN_BAD_IROZ
STRICT_IROr   Z"InconsistentResolutionOrderWarningsuperrp   rS   rR   r   r
   ZTRACK_BAD_IROr   ZBAD_IROSr   )r   r   rg   rQ   _ZiroZ
legacy_iro	__class__r   r	   rS   b  sF   

   

 zTest_c3_ro.test_non_orderable)r   r   r    rr   r
   r*   r   r   r   r   r   r   r   rS   __classcell__r   r   r   r	   rp      s    

	?rp   c                   @   s&   e Zd Zd	ddZdd Zdd ZdS )
TestC3FNc                 C   s   ddl m} ||||S )Nr   )ri   )r   ri   Zresolver)r   rx   r   	base_mrosri   r   r   r	   _makeOne  s   zTestC3._makeOnec                 C   sF   | j t| tjtjjid}|j}| tj| | |tj j d S )N)r   )	r   typeunittestTestCase__mro__memor   ZassertIsNoneZhad_inconsistency)r   c3r   r   r   r	   test_base_mros_given  s   zTestC3.test_base_mros_givenc                 C   s>   |  t| }| |j d |_| | tt| j d S r   )	r   r   ZassertIsNotNoneZ_C3__mroZ_merger   r{   r   r   )r   r   r   r   r	   test_one_base_optimization  s   z!TestC3.test_one_base_optimization)FN)r   r   r    r   r   r   r   r   r   r	   r     s    
r   c                   @   s.   e Zd ZG dd deZd	ddZdd ZdS )
Test_ROComparisonc                   @   s   e Zd ZdZdZdS )zTest_ROComparison.MockC3FN)r   r   r    direct_inconsistencybases_had_inconsistencyr   r   r   r	   MockC3  s    r   Nr   c                 C   s    ddl m} ||p|  ||S )Nr   )_ROComparison)r   r   r   )r   r   Zc3_roZ	legacy_ror   r   r   r	   r     s   zTest_ROComparison._makeOnec                 C   s\   |   }| d|j d|j_| d|j d|j_| d|j d|j_| d|j d S )NnoTZdirectzdirect+basesFrE   )r   r   Z_inconsistent_labelr   r   r   )r   compr   r   r	   test_inconsistent_label  s   z)Test_ROComparison.test_inconsistent_label)Nr   r   )r   r   r    r*   r   r   r   r   r   r   r	   r     s    
r   )__doc__r   r   r   r!   r=   r*   ra   rp   r   r   r   r   r   r	   <module>   s   &b @