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   )self	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   O1O2O3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,   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-   r;   r6   r   r,   r;   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
   r;   G   r-   r;   c                   @   r*   )z)Test__flatten.test_w_diamond.<locals>.BazNr+   r	   r	   r	   r
   BazI   r-   r?   c                   @   r*   )z)Test__flatten.test_w_diamond.<locals>.QuxNr+   r	   r	   r	   r
   QuxK   r-   r@   r6   r   r,   r;   r?   r@   r	   r	   r
   test_w_diamondD   s   zTest__flatten.test_w_diamondN)r#   r$   r%   r   r3   r8   r=   rB   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   rE   )r   r(   kwargsrE   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.   r1   r	   r	   r
   r3   W   r4   zTest_ro.test_w_empty_basesc                 C   r5   )Nc                   @   r*   )z'Test_ro.test_w_single_base.<locals>.FooNr+   r	   r	   r	   r
   r,   _   r-   r,   r6   r7   r	   r	   r
   r8   ^   r9   zTest_ro.test_w_single_basec                 C   r:   )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
   r;   f   r-   r;   r6   r<   r	   r	   r
   r=   c   r>   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
   r;   m   r-   r;   c                   @   r*   )z#Test_ro.test_w_diamond.<locals>.BazNr+   r	   r	   r	   r
   r?   o   r-   r?   c                   @   r*   )z#Test_ro.test_w_diamond.<locals>.QuxNr+   r	   r	   r	   r
   r@   q   r-   r@   r6   rA   r	   r	   r
   rB   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#   r0   )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%   rL   rP   r	   r	   r	   r
   r,   x   s    r,   IExIStdErrIEnvErrIIOErrIOSErrIOErr)r/   )r   r,   rR   rS   rT   rU   rV   rW   r	   r	   r
   _make_IOErrv   s   	



zTest_ro._make_IOErrc                 C   s"   |   \}}| | || d S r   )rX   r   r   )r   rW   rK   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-   r`   c                   @   r*   )zHTest_ro.test_mixed_inheritance_and_implementation.<locals>.ImplementsFooNr+   r	   r	   r	   r
   ImplementsFoo   s    ra   c                   @   r*   )zETest_ro.test_mixed_inheritance_and_implementation.<locals>.ExtendsFooNr+   r	   r	   r	   r
   
ExtendsFoo   r-   rb   c                   @   r*   )zLTest_ro.test_mixed_inheritance_and_implementation.<locals>.ImplementsNothingNr+   r	   r	   r	   r
   ImplementsNothing   r-   rc   c                   @   r*   )zVTest_ro.test_mixed_inheritance_and_implementation.<locals>.ExtendsFooImplementsNothingNr+   r	   r	   r	   r
   ExtendsFooImplementsNothing   r-   rd   )zope.interfacerZ   r\   r^   r_   r/   r   r   )
r   rZ   r\   r^   r_   r`   ra   rb   rc   rd   r	   r	   r
   )test_mixed_inheritance_and_implementation   s*   z1Test_ro.test_mixed_inheritance_and_implementation)r#   r$   r%   maxDiffr   r3   r8   r=   rB   rX   rY   rf   r	   r	   r	   r
   rC   Q   s    rC   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )	C3Settingc                 C   rH   r   )_setting_value)r   settingvaluer	   r	   r
   rL      rM   zC3Setting.__init__c                 C   s$   ddl m} t|j| jj| j d S Nr   ro)re   ro   setattrC3ri   r#   rj   )r   ro   r	   r	   r
   	__enter__      zC3Setting.__enter__c                 C   s$   ddl m} t|j| jj| j d S rm   )re   ro   rp   rq   ri   r#   )r   tvtbro   r	   r	   r
   __exit__   rs   zC3Setting.__exit__N)r#   r$   r%   rL   rr   rw   r	   r	   r	   r
   rh      s    rh   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)rC   setUpzope.testing.loggingsupportry   log_handler
addCleanup	uninstall)r   ry   handlerr	   r	   r
   rz      s   
zTest_c3_ro.setUpc                 K   rD   rm   )r   ro   )r   r(   rF   ro   r	   r	   r
   r      rG   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-   r   c                   @   r*   )z*Test_c3_ro.test_complex_diamond.<locals>.ENr+   r	   r	   r	   r
   E   r-   r   c                   @   r*   )z*Test_c3_ro.test_complex_diamond.<locals>.DNr+   r	   r	   r	   r
   D   r-   r   c                   @   r*   )z*Test_c3_ro.test_complex_diamond.<locals>.CNr+   r	   r	   r	   r
   C   r-   r   c                   @   r*   )z*Test_c3_ro.test_complex_diamond.<locals>.BNr+   r	   r	   r	   r
   B   r-   r   c                   @   r*   )z*Test_c3_ro.test_complex_diamond.<locals>.ANr+   r	   r	   r	   r
   A   r-   r   mro)hasattrr   r   r   )	r   baseOr   r   r   r   r   r   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   r[   c                 S   s   g | ]}|j qS r	   rO   ).0r   r	   r	   r
   
<listcomp>   s    z=Test_c3_ro.test_complex_diamond_interface.<locals>.<listcomp>)r   r   r   r   r   r   r\   )re   r\   r   r   __iro__)r   r\   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   r[   T)use_legacy_ro)re   r\   r   r   assertNotEqualr   _check_handler_complex_diamond)r   r\   r   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   r[   T)log_changed_ro)re   r\   r   r   r   tupler   r   )r   r\   r   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)r|   r   lenrecordsjoin
getMessage
splitlines)r   r   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   rn   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   rH   r   rI   )r   rJ   rK   attrsr	   r	   r
   rL     rM   z^Test_c3_ro.test_ExtendedPathIndex_implement_thing_implementedby_super.<locals>._Based.__init__c                 S   rN   r   rO   r   r	   r	   r
   rP     rQ   z^Test_c3_ro.test_ExtendedPathIndex_implement_thing_implementedby_super.<locals>._Based.__repr__)r	   N)r#   r$   r%   r0   rL   rP   r	   r	   r	   r
   _Based  s    
r   r\   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   )re   ro   r/   r   r   r|   r   assertInr   assertRaises InconsistentResolutionOrderError)r   ro   r   r\   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   )
interfacesr]   )OSErrorIOErrorskipTestzope.interface.commonr   re   r^   r   list	flattenedIOSErrorIIOErrorIEnvironmentErrorIStandardError
IExceptionr\   )r   r   r^   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   rn   errorTFr   ignore)r   r   )warningsre   ro   __warningregistry__AttributeErrorcatch_warningssimplefilterrh   rq   WARN_BAD_IRO
STRICT_IROr   "InconsistentResolutionOrderWarningsuperrx   rY   rX   r   r   TRACK_BAD_IROr   BAD_IROSr   )r   r   ro   rW   _iro
legacy_iro	__class__r	   r
   rY   b  sF   

   

 zTest_c3_ro.test_non_orderable)r#   r$   r%   rz   r   r/   r   r   r   r   r   r   r   rY   __classcell__r	   r	   r   r
   rx      s    

	?rx   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   )rq   )r   rq   resolver)r   r   r   	base_mrosrq   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   assertIsNone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   assertIsNotNone_C3__mro_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   c3_ro	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noTdirectzdirect+basesFrK   )r   r   _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&   rC   r/   rh   rx   r   r   r	   r	   r	   r
   <module>   s   &b @