3
d?:                 @   s  d Z ddlZddlZddlZddlmZ ddlmZmZm	Z	m
Z
mZmZmZmZmZmZmZ ddlmZ ddlmZ ddlmZ G dd	 d	eZG d
d deZG dd deZG dd deZG dd deZeeG dd deZeeeG dd deZG dd deZG dd deZ G dd deZ!G dd de!Z"G dd deZ#G d d! d!eZ$G d"d# d#eZ%G d$d% d%e&Z'G d&d' d'ej(Z)dS )(z7 Unit test case for testing interfaces and adaptation.
    N)
has_traits)	HasTraitsAdapterAdaptsToInstanceInt	InterfaceListprovidesregister_factorySupports
TraitError)reset_global_adaptation_manager)DefaultValue)InterfaceErrorc               @   s   e Zd Zdd ZdS )IFooc             C   s   dS )z Returns the current foo. N )selfr   r   >/tmp/pip-build-7vycvbft/traits/traits/tests/test_interfaces.pyget_foo&   s    zIFoo.get_fooN)__name__
__module____qualname__r   r   r   r   r   r   %   s   r   c               @   s   e Zd Zdd ZdS )IFooPlusc             C   s   dS )z Returns even more foo. Nr   )r   r   r   r   get_foo_plus+   s    zIFooPlus.get_foo_plusN)r   r   r   r   r   r   r   r   r   *   s   r   c               @   s   e Zd Zdd ZdS )IAveragec             C   s   dS )z+ Returns the average value for the object. Nr   )r   r   r   r   get_average0   s    zIAverage.get_averageN)r   r   r   r   r   r   r   r   r   /   s   r   c               @   s   e Zd Zdd ZdS )IListc             C   s   dS )z( Returns the list value for the object. Nr   )r   r   r   r   get_list5   s    zIList.get_listN)r   r   r   r   r   r   r   r   r   4   s   r   c               @   sH   e Zd ZedddZedddZedddZedZedZedZ	d	S )
Sample   T)sample               N)
r   r   r   r   s1s2s3i1i2Zi3r   r   r   r   r   9   s   r   c               @   s(   e Zd ZdZeedddgZdd ZdS )
SampleListzSampleList docstring.
         c             C   s   | j S )N)data)r   r   r   r   r   I   s    zSampleList.get_listN)r   r   r   __doc__r	   r   r0   r   r   r   r   r   r,   C   s   r,   c               @   s,   e Zd ZeedddgZdd Zdd ZdS )	SampleAveraged      i,  c             C   s   | j S )N)r0   )r   r   r   r   r   R   s    zSampleAverage.get_listc             C   s>   | j  }t|dkrdS d}x|D ]}||7 }q"W |t| S )Nr   g        )r   len)r   valueaverageitemr   r   r   r   U   s    
zSampleAverage.get_averageN)r   r   r   r	   r   r0   r   r   r   r   r   r   r2   M   s   r2   c               @   s   e Zd ZdZdd ZdS )UndeclaredAverageProviderza
    Class that conforms to the IAverage interface, but doesn't declare
    that it does so.
    c             C   s   dS )Ngffffff@r   )r   r   r   r   r   e   s    z%UndeclaredAverageProvider.get_averageN)r   r   r   r1   r   r   r   r   r   r9   `   s   r9   c               @   s   e Zd ZdS )	SampleBadN)r   r   r   r   r   r   r   r:   i   s   r:   c               @   s`   e Zd ZeeddZeeddZeeddZee	Z
eeZeeZee	ZeeZeeZdS )TraitsHolderno)ZadaptyesdefaultN)r   r   r   r   r   a_noa_yes	a_defaultr   r   list_adapted_tor   foo_adapted_tor   foo_plus_adapted_tor   list_adapts_tofoo_adapts_tofoo_plus_adapts_tor   r   r   r   r;   m   s   r;   c               @   s   e Zd Ze Ze ZdS )TraitsHolderSubN)r   r   r   r   rC   rF   r   r   r   r   rH   z   s   rH   c               @   s   e Zd Zdd ZdS )SampleListAdapterc                s    | j   fdd jddD S )Nc                s   g | ]}t  |qS r   )getattr).0name)objr   r   
<listcomp>   s    z.SampleListAdapter.get_list.<locals>.<listcomp>T)r!   )adapteeZtrait_names)r   r   )rM   r   r      s    zSampleListAdapter.get_listN)r   r   r   r   r   r   r   r   rI      s   rI   c               @   s   e Zd Zdd ZdS )ListAverageAdapterc             C   s@   | j j }t|dkrdS d}x|D ]}||7 }q$W |t| S )Nr   g        )rO   r   r5   )r   r6   r7   r8   r   r   r   r      s    

zListAverageAdapter.get_averageN)r   r   r   r   r   r   r   r   rP      s   rP   c               @   s$   e Zd ZeeZdd Zdd ZdS )SampleFooAdapterc             C   s
   || _ d S )N)object)r   rR   r   r   r   __init__   s    zSampleFooAdapter.__init__c             C   s   | j }|j|j |j S )N)rR   r'   r(   r)   )r   rR   r   r   r   r      s    zSampleFooAdapter.get_fooN)r   r   r   r   r   rR   rS   r   r   r   r   r   rQ      s   rQ   c               @   s$   e Zd Zdd Zdd Zdd ZdS )FooPlusAdapterc             C   s
   || _ d S )N)rM   )r   rM   r   r   r   rS      s    zFooPlusAdapter.__init__c             C   s
   | j j S )N)rM   r   )r   r   r   r   r      s    zFooPlusAdapter.get_fooc             C   s   | j j d S )Nr    )rM   r   )r   r   r   r   r      s    zFooPlusAdapter.get_foo_plusN)r   r   r   rS   r   r   r   r   r   r   rT      s   rT   c               @   s   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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ejd)d* Zd+S ),InterfacesTestc             C   s:   t   tttt tttt tttt tt	tt
 d S )N)r   r   rI   r   r   rP   r   rQ   r   rT   r   )r   r   r   r   setUp   s
    zInterfacesTest.setUpc             C   s   t  G dd dt}d S )Nc               @   s   e Zd ZdS )z/InterfacesTest.test_provides_none.<locals>.TestN)r   r   r   r   r   r   r   Test   s   rW   )r
   r   )r   rW   r   r   r   test_provides_none   s    z!InterfacesTest.test_provides_nonec             C   s:   t tG dd dt}| }| j|t | j|t d S )Nc               @   s   e Zd Zdd Zdd ZdS )z.InterfacesTest.test_provides_one.<locals>.Testc             S   s   dS )NZfoo_and_only_foor   )r   r   r   r   r      s    z6InterfacesTest.test_provides_one.<locals>.Test.get_fooc             S   s   dS )N*   r   )r   r   r   r   r      s    z:InterfacesTest.test_provides_one.<locals>.Test.get_averageN)r   r   r   r   r   r   r   r   r   rW      s   rW   )r
   r   r   assertIsInstanceZassertNotIsInstancer   )r   rW   testr   r   r   test_provides_one   s
    z InterfacesTest.test_provides_onec             C   sJ   t tttG dd dt}| }| j|t | j|t | j|t d S )Nc               @   s$   e Zd Zdd Zdd Zdd ZdS )z0InterfacesTest.test_provides_multi.<locals>.Testc             S   s   dS )NZtest_foor   )r   r   r   r   r      s    z8InterfacesTest.test_provides_multi.<locals>.Test.get_fooc             S   s   dS )NrY   r   )r   r   r   r   r      s    z<InterfacesTest.test_provides_multi.<locals>.Test.get_averagec             S   s   dgS )NrY   r   )r   r   r   r   r      s    z9InterfacesTest.test_provides_multi.<locals>.Test.get_listN)r   r   r   r   r   r   r   r   r   r   rW      s   rW   )r
   r   r   r   r   rZ   )r   rW   r[   r   r   r   test_provides_multi   s    
z"InterfacesTest.test_provides_multic             C   sT   t tG dd dt}| }| j|t | j|t t }||_| j|j| dS )zH Ensure that subclasses of Interfaces imply the superinterface.
        c               @   s   e Zd Zdd Zdd ZdS )z3InterfacesTest.test_provides_extended.<locals>.Testc             S   s   dS )NZsome_test_foor   )r   r   r   r   r      s    z;InterfacesTest.test_provides_extended.<locals>.Test.get_fooc             S   s   dS )NZmore_test_foor   )r   r   r   r   r      s    z@InterfacesTest.test_provides_extended.<locals>.Test.get_foo_plusN)r   r   r   r   r   r   r   r   r   rW      s   rW   N)r
   r   r   rZ   r   r;   rC   assertIs)r   rW   r[   tar   r   r   test_provides_extended   s    z%InterfacesTest.test_provides_extendedc             C   s2   | j t ttG dd dt}W d Q R X d S )Nc               @   s   e Zd ZdS )z.InterfacesTest.test_provides_bad.<locals>.TestN)r   r   r   r   r   r   r   rW      s   rW   )assertRaises	Exceptionr
   r   r   )r   rW   r   r   r   test_provides_bad   s    z InterfacesTest.test_provides_badc          
   C   sL   G dd dt }tt}| jd ||}W d Q R X | }| j|t d S )Nc               @   s   e Zd ZdS )zBInterfacesTest.test_provides_with_no_interface_check.<locals>.TestN)r   r   r   r   r   r   r   rW      s   rW   r   )r   r
   r   set_check_interfacesrZ   )r   rW   provides_ifoor[   r   r   r   %test_provides_with_no_interface_check   s    z4InterfacesTest.test_provides_with_no_interface_checkc             C   s   G dd dt }tt}| jd> | jt(}| jdtj ||}W d Q R X W d Q R X W d Q R X | }| j	|t | j
dt|j tjd\}}}| j
||j d S )Nc               @   s   e Zd ZdS )zDInterfacesTest.test_provides_with_interface_check_warn.<locals>.TestN)r   r   r   r   r   r   r   rW     s   rW   r    traitsz9the @provides decorator will not perform interface checks.)r   r
   r   rd   assertWarnsDeprecationWarningZ
assertLogsloggingWARNINGrZ   assertInstrwarningr   
rpartitionfilename)r   rW   re   warnings_cmr[   _this_moduler   r   r   'test_provides_with_interface_check_warn  s    &z6InterfacesTest.test_provides_with_interface_check_warnc             C   s   G dd dt }tt}| jd: | jt$}| jt ||}W d Q R X W d Q R X W d Q R X | }| j|t | j	dt
|j tjd\}}}| j	||j d S )Nc               @   s   e Zd ZdS )zEInterfacesTest.test_provides_with_interface_check_error.<locals>.TestN)r   r   r   r   r   r   r   rW      s   rW   r"   z9the @provides decorator will not perform interface checksrh   )r   r
   r   rd   ri   rj   ra   r   rZ   rm   rn   ro   r   rp   rq   )r   rW   re   rr   r[   rs   rt   r   r   r   (test_provides_with_interface_check_error  s    &z7InterfacesTest.test_provides_with_interface_check_errorc             C   sr   t  }yt |_W n tk
r0   | jd Y nX | jt|jt d | jt|jt d | jt|jt	 d d S )Nz;Setting instance of interface should not require adaptation)r?   )
r;   r2   r?   r   Zfailra   	trait_setr,   r   r:   )r   r_   r   r   r   test_instance_adapt_no8  s    z%InterfacesTest.test_instance_adapt_noc             C   s   t  }t |_| j|jj d | j|jt | jt|d t |_| j|jj d | j|jt	 | jt|d t
 |_| j|jj d | j|jt	 | jt|d | jt|jt d d S )Ng      i@Za_yes_g      4@g       @)r@   )r;   r2   r@   assertEqualr   rZ   assertFalsehasattrr,   rP   r   ra   r   rw   r:   )r   r_   r   r   r   test_instance_adapt_yesK  s    z&InterfacesTest.test_instance_adapt_yesc             C   s   t  }t |_| j|jj d | j|jt | jt|d t |_| j|jj d | j|jt	 | jt|d t
 |_| j|jj d | j|jt	 | jt|d t |_| j|jd  | jt|d d S )Ng      i@Z
a_default_g      4@g       @)r;   r2   rA   ry   r   rZ   rz   r{   r,   rP   r   r:   )r   r_   r   r   r   test_instance_adapt_default_  s     z*InterfacesTest.test_instance_adapt_defaultc             C   s   t  }t  |_}|jj }| jt|d xdD ]}| j|| q2W | j|jt | j|j	| t  |_
}| j|j
j d | j|j
t | j|j| tdddd |_}| j|jj d	 | j|jj d
 | j|jt | j|j| d S )Nr#   r    r"   r&   r%   r-      )r'   r(   r)   r/      )r    r"   r#   )r;   r   rB   r   ry   r5   rm   rZ   rI   Zlist_adapted_to_rC   r   rQ   Zfoo_adapted_to_rD   r   rT   Zfoo_plus_adapted_to_)r   r_   rR   resultnr   r   r   test_adapted_tou  s"    

zInterfacesTest.test_adapted_toc             C   s   t  }t  |_}| j|j| |jj }| jt|d xdD ]}| j|| q@W | j|jt	 t  |_
}| j|j
| | j|jj d | j|jt tdddd |_}| j|j| | j|jj d	 | j|jj d
 | j|jt d S )Nr#   r    r"   r&   r%   r-   r~   )r'   r(   r)   r/   r   )r    r"   r#   )r;   r   rE   ry   Zlist_adapts_to_r   r5   rm   rZ   rI   rF   Zfoo_adapts_to_r   rQ   rG   Zfoo_plus_adapts_to_r   rT   )r   r_   rR   r   r   r   r   r   test_adapts_to  s"    

zInterfacesTest.test_adapts_toc             C   s    | j tjd | j tjd d S )Nr,   zSampleList docstring.)ry   r,   r   r1   )r   r   r   r   'test_decorated_class_name_and_docstring  s    z6InterfacesTest.test_decorated_class_name_and_docstringc          	   C   s,   t  }t }| jt ||_W d Q R X d S )N)r;   r9   ra   r   r?   )r   r_   Zproviderr   r   r   test_instance_requires_provides  s    z.InterfacesTest.test_instance_requires_providesc             C   s\   t t}t }||}|j \}}| j|tj | j|t |j	 j
d d}| j|t d S )Nfoo)r   r   r   default_valuery   r   constantrZ   rQ   	as_ctraitdefault_value_for)r   i_foo_traitnew_defaulti_foo_clonedefault_value_kindr   ctrait_defaultr   r   r   test_clone_supports_defaults  s    z+InterfacesTest.test_clone_supports_defaultsc             C   s\   t t}t }||}|j \}}| j|tj | j|| |j j	d d}| j|| d S )Nr   )
r   r   r   r   ry   r   r   r^   r   r   )r   r   r   r   r   r   r   r   r   r   test_clone_adapts_to_default  s    z+InterfacesTest.test_clone_adapts_to_defaultc             C   s    t  }t  }| j|j|j d S )N)rH   r^   rC   )r   r'   r(   r   r   r   test_subclass_supports_default  s    z-InterfacesTest.test_subclass_supports_defaultc             C   s    t  }t  }| j|j|j d S )N)rH   r^   rF   )r   r'   r(   r   r   r   test_subclass_adapts_to_default  s    z.InterfacesTest.test_subclass_adapts_to_defaultc             c   s$   t j}|t _z
dV  W d|t _X dS )a  
        Context manager to temporarily set has_traits.CHECK_INTERFACES
        to the given value.

        Parameters
        ----------
        check_interfaces_value : int
            One of 0 (don't check), 1 (check and log a warning on interface
            mismatch) or 2 (check and raise on interface mismatch).

        Returns
        -------
        context manager
        N)r   ZCHECK_INTERFACES)r   Zcheck_interfaces_valueZold_check_interfacesr   r   r   rd     s
    
z#InterfacesTest.set_check_interfacesN)r   r   r   rV   rX   r\   r]   r`   rc   rf   ru   rv   rx   r|   r}   r   r   r   r   r   r   r   r   
contextlibcontextmanagerrd   r   r   r   r   rU      s*   rU   )*r1   r   rk   Zunittestrg   r   Z
traits.apir   r   r   r   r   r   r	   r
   r   r   r   Ztraits.adaptation.apir   Ztraits.constantsr   Ztraits.interface_checkerr   r   r   r   r   r   r,   r2   r9   r:   r;   rH   rI   rP   rQ   rR   rT   ZTestCaserU   r   r   r   r   <module>   s4   4
		