U
    1ÜŸj�8  ã                   @   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
ƒ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                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚTest__mergeOrderingsc                 C   s   ddl m} ||ƒS )Nr   )Ú_legacy_mergeOrderings)Úzope.interface.ror   )ÚselfZ	orderingsr   © r   ú@/tmp/pip-unpacked-wheel-qz07cfz6/zope/interface/tests/test_ro.pyÚ_callFUT   s    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"   |   |  dddg¡dddg¡ 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   sN   dddg}ddg}dddg}dg}|   |  ||||g¡dddddddg¡ d S )NÚxÚyÚzÚqé   é   é   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                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚTest__flattenc                 C   s   ddl m} ||ƒS )Nr   )Ú_legacy_flatten)r   r   )r   Úobr   r   r   r   r   0   s    zTest__flatten._callFUTc                 C   s2   G dd„ dƒ}|ƒ }d|_ |  |  |¡|g¡ d S )Nc                   @   s   e Zd ZdS )z-Test__flatten.test_w_empty_bases.<locals>.FooN©r   r   r   r   r   r   r   ÚFoo6   s   r"   r   ©Ú	__bases__r   r   ©r   r"   Zfoor   r   r   Útest_w_empty_bases4   s    z Test__flatten.test_w_empty_basesc                 C   s(   G dd„ dƒ}|   |  |¡|tg¡ d S )Nc                   @   s   e Zd ZdS )z-Test__flatten.test_w_single_base.<locals>.FooNr!   r   r   r   r   r"   ?   s   r"   ©r   r   Úobject©r   r"   r   r   r   Útest_w_single_base=   s    z Test__flatten.test_w_single_basec                 C   s:   G dd„ dƒ}G dd„ d|ƒ}|   |  |¡||tg¡ d S )Nc                   @   s   e Zd ZdS )z'Test__flatten.test_w_bases.<locals>.FooNr!   r   r   r   r   r"   F   s   r"   c                   @   s   e Zd ZdS )z'Test__flatten.test_w_bases.<locals>.BarNr!   r   r   r   r   ÚBarI   s   r+   r'   ©r   r"   r+   r   r   r   Útest_w_basesD   s    zTest__flatten.test_w_basesc              
   C   sd   G dd„ dƒ}G dd„ d|ƒ}G dd„ d|ƒ}G dd„ d||ƒ}|   |  |¡|||t||tg¡ d S )	Nc                   @   s   e Zd ZdS )z)Test__flatten.test_w_diamond.<locals>.FooNr!   r   r   r   r   r"   P   s   r"   c                   @   s   e Zd ZdS )z)Test__flatten.test_w_diamond.<locals>.BarNr!   r   r   r   r   r+   S   s   r+   c                   @   s   e Zd ZdS )z)Test__flatten.test_w_diamond.<locals>.BazNr!   r   r   r   r   ÚBazV   s   r.   c                   @   s   e Zd ZdS )z)Test__flatten.test_w_diamond.<locals>.QuxNr!   r   r   r   r   ÚQuxY   s   r/   r'   ©r   r"   r+   r.   r/   r   r   r   Útest_w_diamondN   s    ÿzTest__flatten.test_w_diamondN)r   r   r   r   r&   r*   r-   r1   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   s   ddl m} ||f|ŽS )Nr   )Ú
_legacy_ro)r   r3   )r   r    Úkwargsr3   r   r   r   r   c   s    zTest_ro._callFUTc                 C   s2   G dd„ dƒ}|ƒ }d|_ |  |  |¡|g¡ d S )Nc                   @   s   e Zd ZdS )z'Test_ro.test_w_empty_bases.<locals>.FooNr!   r   r   r   r   r"   i   s   r"   r   r#   r%   r   r   r   r&   g   s    zTest_ro.test_w_empty_basesc                 C   s(   G dd„ dƒ}|   |  |¡|tg¡ d S )Nc                   @   s   e Zd ZdS )z'Test_ro.test_w_single_base.<locals>.FooNr!   r   r   r   r   r"   r   s   r"   r'   r)   r   r   r   r*   p   s    zTest_ro.test_w_single_basec                 C   s:   G dd„ dƒ}G dd„ d|ƒ}|   |  |¡||tg¡ d S )Nc                   @   s   e Zd ZdS )z!Test_ro.test_w_bases.<locals>.FooNr!   r   r   r   r   r"   y   s   r"   c                   @   s   e Zd ZdS )z!Test_ro.test_w_bases.<locals>.BarNr!   r   r   r   r   r+   |   s   r+   r'   r,   r   r   r   r-   w   s    zTest_ro.test_w_basesc                 C   s`   G dd„ dƒ}G dd„ d|ƒ}G dd„ d|ƒ}G dd„ d||ƒ}|   |  |¡||||tg¡ d S )	Nc                   @   s   e Zd ZdS )z#Test_ro.test_w_diamond.<locals>.FooNr!   r   r   r   r   r"   ƒ   s   r"   c                   @   s   e Zd ZdS )z#Test_ro.test_w_diamond.<locals>.BarNr!   r   r   r   r   r+   †   s   r+   c                   @   s   e Zd ZdS )z#Test_ro.test_w_diamond.<locals>.BazNr!   r   r   r   r   r.   ‰   s   r.   c                   @   s   e Zd ZdS )z#Test_ro.test_w_diamond.<locals>.QuxNr!   r   r   r   r   r/   Œ   s   r/   r'   r0   r   r   r   r1   �   s    ÿzTest_ro.test_w_diamondc                 C   s`   G dd„ dƒ}|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   s   || _ || _d S r	   ©r   r$   )r   ÚnameÚbasesr   r   r   Ú__init__–   s    z)Test_ro._make_IOErr.<locals>.Foo.__init__c                 S   s   | j S r	   ©r   r   r   r   r   Ú__repr__š   s    z)Test_ro._make_IOErr.<locals>.Foo.__repr__N)r   r   r   r8   r:   r   r   r   r   r"   •   s   r"   ÚIExÚIStdErrÚIEnvErrÚIIOErrÚIOSErrÚIOErrr   )r   r"   r;   r<   r=   r>   r?   r@   r   r   r   Ú_make_IOErr’   s    




zTest_ro._make_IOErrc                 C   s"   |   ¡ \}}|  |  |¡|¡ d S r	   )rA   r   r   )r   r@   r7   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	ƒƒ}G d
d„ d|ƒ}G dd„ dƒ}G dd„ d||ƒ}	|  |  ||	ƒ ƒ¡||	ƒ||ƒ||ƒ||||ƒ|tƒg¡ d S )Nr   ©Ú	Interface)ÚimplementedBy)Úimplementer©Ú
providedByc                   @   s   e Zd ZdS )z?Test_ro.test_mixed_inheritance_and_implementation.<locals>.IFooNr!   r   r   r   r   ÚIFoo¶   s   rI   c                   @   s   e Zd ZdS )zHTest_ro.test_mixed_inheritance_and_implementation.<locals>.ImplementsFooNr!   r   r   r   r   ÚImplementsFoo¹   s   rJ   c                   @   s   e Zd ZdS )zETest_ro.test_mixed_inheritance_and_implementation.<locals>.ExtendsFooNr!   r   r   r   r   Ú
ExtendsFoo½   s   rK   c                   @   s   e Zd ZdS )zLTest_ro.test_mixed_inheritance_and_implementation.<locals>.ImplementsNothingNr!   r   r   r   r   ÚImplementsNothingÀ   s   rL   c                   @   s   e Zd ZdS )zVTest_ro.test_mixed_inheritance_and_implementation.<locals>.ExtendsFooImplementsNothingNr!   r   r   r   r   ÚExtendsFooImplementsNothingÃ   s   rM   )Úzope.interfacerD   rE   rF   rH   r   r   r(   )
r   rD   rE   rF   rH   rI   rJ   rK   rL   rM   r   r   r   Ú)test_mixed_inheritance_and_implementation­   s*    úþz1Test_ro.test_mixed_inheritance_and_implementation)r   r   r   ZmaxDiffr   r&   r*   r-   r1   rA   rB   rO   r   r   r   r   r2   `   s   	
r2   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )Ú	C3Settingc                 C   s   || _ || _d S r	   )Ú_settingÚ_value)r   ZsettingÚvaluer   r   r   r8   Ó   s    zC3Setting.__init__c                 C   s$   ddl m} t|j| jj| jƒ d S ©Nr   ©Úro)rN   rV   ÚsetattrÚC3rQ   r   rR   )r   rV   r   r   r   Ú	__enter__×   s    zC3Setting.__enter__c                 C   s$   ddl m} t|j| jj| jƒ d S rT   )rN   rV   rW   rX   rQ   r   )r   ÚtÚvÚtbrV   r   r   r   Ú__exit__Û   s    zC3Setting.__exit__N)r   r   r   r8   rY   r]   r   r   r   r   rP   Ñ   s   rP   c                       sl   e 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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)r2   ÚsetUpZzope.testing.loggingsupportr_   Úlog_handlerZ
addCleanupÚ	uninstall)r   r_   Úhandlerr   r   r   r`   â   s    
zTest_c3_ro.setUpc                 K   s   ddl m} ||f|ŽS rT   )r   rV   )r   r    r4   rV   r   r   r   r   è   s    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ƒr†|  | ¡ |  |¡¡ |S )Nc                   @   s   e Zd ZdS )z+Test_c3_ro._make_complex_diamond.<locals>.FNr!   r   r   r   r   ÚFï   s   rd   c                   @   s   e Zd ZdS )z+Test_c3_ro._make_complex_diamond.<locals>.ENr!   r   r   r   r   ÚEò   s   re   c                   @   s   e Zd ZdS )z+Test_c3_ro._make_complex_diamond.<locals>.DNr!   r   r   r   r   ÚDõ   s   rf   c                   @   s   e Zd ZdS )z+Test_c3_ro._make_complex_diamond.<locals>.CNr!   r   r   r   r   ÚCø   s   rg   c                   @   s   e Zd ZdS )z+Test_c3_ro._make_complex_diamond.<locals>.BNr!   r   r   r   r   ÚBû   s   rh   c                   @   s   e Zd ZdS )z+Test_c3_ro._make_complex_diamond.<locals>.ANr!   r   r   r   r   ÚAþ   s   ri   Úmro)Úhasattrr   rj   r   )r   Úbaserd   re   rf   rg   rh   ri   r   r   r   Ú_make_complex_diamondì   s    
z Test_c3_ro._make_complex_diamondc                 C   s   |   t¡ d S r	   )rm   r(   r   r   r   r   Útest_complex_diamond_object  s    z&Test_c3_ro.test_complex_diamond_objectc              
   C   s@   ddl m} |  |¡}|  dd„ |jD ƒddddd	d
dg¡ d S )Nr   rC   c                 S   s   g | ]
}|j ‘qS r   r9   )Ú.0r   r   r   r   Ú
<listcomp>  s     z=Test_c3_ro.test_complex_diamond_interface.<locals>.<listcomp>ri   rh   rg   rf   re   rd   rD   )rN   rD   rm   r   Ú__iro__)r   rD   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   rC   T)Úuse_legacy_ro)rN   rD   rm   r   ZassertNotEqualrq   Ú_check_handler_complex_diamond)r   rD   ri   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   rC   T)Úlog_changed_ro)rN   rD   rm   r   r   Útuplerq   rt   )r   rD   ri   Zcomputed_A_iror   r   r   Ú,test_complex_diamond_compare_legacy_argument  s
    
z7Test_c3_ro.test_complex_diamond_compare_legacy_argumentc                 C   sV   | j }|  dt|jƒ¡ |jd }djdd�}|  d dd„ | ¡  ¡ D ƒ¡|¡ d S )	Nr   r   aÈ  Object <InterfaceClass {name}> 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.Interfacezzope.interface.tests.test_ro.A)r6   Ú
c                 s   s   | ]}|  ¡ V  qd S r	   )Úrstrip)ro   Úlnr   r   r   Ú	<genexpr>;  s     z<Test_c3_ro._check_handler_complex_diamond.<locals>.<genexpr>)ra   r   ÚlenÚrecordsÚformatÚjoinÚ
getMessageÚ
splitlines)r   rc   ÚrecordÚexpectedr   r   r   rt   &  s    
ôþz)Test_c3_ro._check_handler_complex_diamondc                 C   sþ   ddl m} G dd„ dƒ}|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 5 Q R X d S )Nr   rU   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   s   || _ || _d S r	   r5   )r   r6   r7   Úattrsr   r   r   r8   H  s    z^Test_c3_ro.test_ExtendedPathIndex_implement_thing_implementedby_super.<locals>._Based.__init__c                 S   s   | j S r	   r9   r   r   r   r   r:   L  s    z^Test_c3_ro.test_ExtendedPathIndex_implement_thing_implementedby_super.<locals>._Based.__repr__)r   N)r   r   r   r$   r8   r:   r   r   r   r   Ú_BasedE  s   
r†   rD   r   c                   @   s   e Zd ZdS )z^Test_c3_ro.test_ExtendedPathIndex_implement_thing_implementedby_super.<locals>.IPluggableIndexNr!   r   r   r   r   ÚIPluggableIndexQ  s   r‡   c                   @   s   e Zd ZdS )zbTest_c3_ro.test_ExtendedPathIndex_implement_thing_implementedby_super.<locals>.ILimitedResultIndexNr!   r   r   r   r   ÚILimitedResultIndexT  s   rˆ   c                   @   s   e Zd ZdS )zZTest_c3_ro.test_ExtendedPathIndex_implement_thing_implementedby_super.<locals>.IQueryIndexNr!   r   r   r   r   ÚIQueryIndexW  s   r‰   c                   @   s   e Zd ZdS )zYTest_c3_ro.test_ExtendedPathIndex_implement_thing_implementedby_super.<locals>.IPathIndexNr!   r   r   r   r   Ú
IPathIndexZ  s   rŠ   r(   Ú	PathIndexÚExtendedPathIndexTF)rv   Ústrictzused the legacy©r�   )
rN   rV   r   r   ra   r~   ÚassertInr�   ÚassertRaisesÚ InconsistentResolutionOrderError)r   rV   r†   rD   r‡   rˆ   r‰   rŠ   Úobjr‹   rŒ   Úresultrƒ   r   r   r   Ú:test_ExtendedPathIndex_implement_thing_implementedby_super?  s@    
þ  ÿø

zETest_c3_ro.test_ExtendedPathIndex_implement_thing_implementedby_superc              	   C   sN   ddl m} ddlm} |  t|tƒ ƒ ¡ ƒ|j|j	|j
|j|j|jg¡ d S )Nr   rG   )Ú
interfaces)rN   rH   Zzope.interface.commonr•   r   ÚlistÚOSErrorZ	flattenedZIOSErrorZIIOErrorZIEnvironmentErrorZIStandardErrorZ
IExceptionrD   )r   rH   r•   r   r   r   Útest_OSError_IOError„  s    úþzTest_c3_ro.test_OSError_IOErrorc                    sr  dd l }ddlm} z|`W n tk
r0   Y nX | ¡ �f | d¡ t|jj	dƒ�B t|jj
dƒ�( |  |j¡� tƒ  ¡  W 5 Q R X W 5 Q R X W 5 Q R X W 5 Q R X |  ¡ \}}|  |j¡� | j|dd� W 5 Q R X t|jjdƒ�X t|jj
dƒ�> | ¡ � | d¡ |  |¡ W 5 Q R X |  ||jj¡ W 5 Q R X W 5 Q R X | j|dd�}| j|ddd�}|  ||¡ d S )	Nr   rU   ÚerrorTFrŽ   Úignore)rs   r�   )ÚwarningsrN   rV   Ú__warningregistry__ÚAttributeErrorÚcatch_warningsÚsimplefilterrP   rX   ZWARN_BAD_IROZ
STRICT_IROr�   Z"InconsistentResolutionOrderWarningÚsuperrB   rA   r‘   r   ZTRACK_BAD_IROr�   ZBAD_IROSr   )r   r›   rV   r@   Ú_ZiroZ
legacy_iro©Ú	__class__r   r   rB   “  sL    

 ÿ ÿþ2 ÿ ÿþ

$zTest_c3_ro.test_non_orderable)r   r   r   r`   r   rm   rn   rr   ru   rx   rt   r”   r˜   rB   Ú__classcell__r   r   r¢   r   r^   à   s   

	Er^   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   )rX   )r   rX   Úresolver)r   rg   r�   Ú	base_mrosrX   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   rj   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ƒ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ÚnoTÚdirectzdirect+basesFr7   )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±   Ò  s   
r±   )
Ú__doc__rª   r«   r   r   r2   rP   r^   r¥   r±   r   r   r   r   Ú<module>   s   2q [