3
dMS                 @   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
 ddlmZmZ ddlmZ ddlmZ ddlmZ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 m!Z!m"Z" edk	rdd
l#m$Z$ G dd deZ%dd 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Z/G d!d" d"eZ0G d#d$ d$eZ1G d%d& d&eZ2G d'd( d(eZ3G d)d* d*e3Z4G d+d, d,ej5Z6G d-d. d.eZ7G d/d0 d0ej5Z8dS )1z1 General regression tests for a variety of bugs.     N)DefaultValue)HasStrictTraits	HasTraitsPropertyon_trait_change)numpyrequires_numpy)
TraitError)TraitListObject)NoDefaultSpecified	TraitType)BoolDelegatesToDictEitherEnum
ExpressionInstanceIntListselfSetStrUnion)Arrayc               @   s   e Zd ZedZdS )Dummy
   N)__name__
__module____qualname__r   x r!   r!   >/tmp/pip-build-7vycvbft/traits/traits/tests/test_regression.pyr   /   s   r   c              C   s   G dd dt } | S )Nc               @   s   e Zd ZdS )z"_create_subclass.<locals>.SubclassN)r   r   r   r!   r!   r!   r"   Subclass4   s   r#   )r   )r#   r!   r!   r"   _create_subclass3   s    r$   c               @   s   e Zd ZedZeeZdS )Dummy2   N)r   r   r   r   yr   r   dummyr!   r!   r!   r"   r%   :   s   r%   c               @   sP   e Zd Zeef dZeeZedZ	e
dZdd Zeddd Zd	d
 ZdS )DelegateMess)argsdummy2Fc             C   s   t | jdS )N)r(   )r%   dummy1)r   r!   r!   r"   _dummy2_defaultG   s    zDelegateMess._dummy2_defaultzdummy1.xc             C   s
   d| _ d S )NT)handler_called)r   r!   r!   r"   _on_dummy1_xK   s    zDelegateMess._on_dummy1_xc             C   s:   x4dD ],}| j j| }t| d|d  |f|  qW dS )z] Force the DelegatesTo listener to hook up first to exercise the
        worst case.
        r'   r/   z_init_trait_%s_listenerr   N)r'   r/   )	__class__Z__listener_traits__getattr)r   namedatar!   r!   r"   _init_trait_listenersO   s    
z"DelegateMess._init_trait_listenersN)r   r   r   r   r   r,   r%   r+   r   r'   r   r.   r-   r   r/   r4   r!   r!   r!   r"   r)   ?   s   r)   c               @   s4   e Zd ZeeddZedddZee	ddidZ
dS )	DelegateLeak
can_enable)
depends_onflagr    )prefix*   )kwN)r   r   r   r   r   Zvisibler   r6   r   r   r8   r!   r!   r!   r"   r5   X   s   r5   c               @   s*   e Zd ZeeZee ddZdd Z	dS )	Presenterzobj.x)r7   c             C   s   | j jS )N)objr    )r   r!   r!   r"   _get_yd   s    zPresenter._get_yN)
r   r   r   r   r   r=   r   r   r'   r>   r!   r!   r!   r"   r<   `   s   r<   c               @   s,   e Zd ZeZeZedZeddd Z	dS )ListUpdatesTestr   za[], b[]c             C   s   |  j d7  _ d S )N   )events_received)r   r!   r!   r"   _receive_eventsm   s    zListUpdatesTest._receive_eventsN)
r   r   r   r   abr   rA   r   rB   r!   r!   r!   r"   r?   h   s   r?   c               @   s$   e Zd ZeZeeddZdd ZdS )SimplePropertyr    )r7   c             C   s
   | j d S )Nr@   )r    )r   r!   r!   r"   r>   w   s    zSimpleProperty._get_yN)r   r   r   r   r    r   r'   r>   r!   r!   r!   r"   rE   r   s   rE   c               @   s.   e Zd ZeeZedZedgdd Z	dS )ExtendedListenerInListFzdummy:xc             C   s
   d| _ d S )NT)changed)r   r!   r!   r"   set_changed   s    z"ExtendedListenerInList.set_changedN)
r   r   r   r   r   r(   r   rG   r   rH   r!   r!   r!   r"   rF   {   s   rF   c               @   s&   e Zd ZdZdZejZdZdd Z	dS )RaisingValidatorz Trait type whose ``validate`` method raises an inappropriate exception.

    Used for testing propagation of that exception.
    ZbogusNc             C   s   t dd S )NzJust testing)ZeroDivisionError)r   objectr2   valuer!   r!   r"   validate   s    zRaisingValidator.validate)
r   r   r   __doc__Z	info_textr   constantdefault_value_typedefault_valuerM   r!   r!   r!   r"   rI      s
   rI   c               @   s   e Zd Ze ZdS )WrapperN)r   r   r   r   rL   r!   r!   r!   r"   rR      s   rR   c                   s.   e Zd Zd fdd	Zdd Zdd Z  ZS )	WrapperTrait c                s.   | j | jd d |\| _}t j|f| d S )N)_get_default_valuerM   rP   super__init__)r   rQ   metadata)r0   r!   r"   rW      s    zWrapperTrait.__init__c             C   s4   t |trt|dS t |tr"|S | jd d | d S )N)rL   )
isinstancestrrR   error)r   rK   r2   rL   r!   r!   r"   rM      s
    


zWrapperTrait.validatec             C   s   t jtf d|jiffS )NrL   )r   callable_and_argsrR   rL   )r   rL   r!   r!   r"   rU      s    zWrapperTrait._get_default_value)rT   )r   r   r   rW   rM   rU   __classcell__r!   r!   )r0   r"   rS      s   rS   c                   s>   e Zd Zd
 fdd	Zdd Zdd Zef fdd		Z  ZS )CloneWrapperTraitrT   c                s.   | j | jd d |\| _}t j|f| d S )N)rU   rM   rP   rV   rW   )r   rQ   rX   )r0   r!   r"   rW      s    zCloneWrapperTrait.__init__c             C   s4   t |trt|dS t |tr"|S | jd d | d S )N)rL   )rY   rZ   rR   r[   )r   rK   r2   rL   r!   r!   r"   rM      s
    


zCloneWrapperTrait.validatec             C   s   t jtf d|jiffS )NrL   )r   r\   rR   rL   )r   rL   r!   r!   r"   rU      s    z$CloneWrapperTrait._get_default_valuec                sD   t  j|f|}|tk	r@|jd d |}|j|\}}||_||_|S )N)rV   cloner   rM   rU   rP   rQ   )r   rQ   rX   newtyperL   )r0   r!   r"   r_      s    zCloneWrapperTrait.clone)rT   )	r   r   r   rW   rM   rU   r   r_   r]   r!   r!   )r0   r"   r^      s   r^   c               @   s   e Zd ZejZdS )DisallowDefaultValueN)r   r   r   r   ZdisallowrP   r!   r!   r!   r"   rb      s   rb   c               @   sP   e Zd Ze ZedZe Ze	e
ZedZe ZedZe Ze Ze ZdS )SubclassDefaultsSuperz[]barN)r   r   r   r   a_strr   an_exprr   a_listr   rR   an_instancerS   a_wrapper_1a_wrapper_2r^   clone_wrapper_1clone_wrapper_2rb   disallow_defaultr   
self_traitr!   r!   r!   r"   rc      s   rc   c               @   sJ   e Zd ZdZedZdddgZe ZdZ	eddZ
dZeddZe ZdS )SubclassDefaultsSubfooz	[1, 2, 3]r@         )rL   N)r   r   r   re   r   rf   rg   rR   rh   ri   rj   rk   rl   rc   rn   r!   r!   r!   r"   ro      s   


ro   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e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/d0 Zd1d2 Zd3S )4TestRegressionc             C   sH   t  }| j|ji  |jd}|j|d}| j|d | j|ji  dS )zV Make sure that CTrait.default_value_for() does not cache the
        result.
        r    r   N)r   assertEqual__dict__traitdefault_value_for)r   r(   ctraitdefaultr!   r!   r"   test_default_value_for_no_cache  s    
z.TestRegression.test_default_value_for_no_cachec             C   s(   t j d }t  }| j|j|d dS )zL Don't segfault when calling default_value_for on a Property trait.
        r'   N)rE   Zclass_traitsZassertIsNonerw   )r   Zy_traitZsimple_propertyr!   r!   r"   test_default_value_for_property  s    z.TestRegression.test_default_value_for_propertyc             C   s<   t j }t  t  t  t  tj  | j|t j  dS )zc Make sure that dynamically created subclasses are not held
        strongly by HasTraits.
        N)r   __subclasses__r$   gccollectassertCountEqual)r   Zprevious_subclassesr!   r!   r"   test_subclasses_weakref  s    z&TestRegression.test_subclasses_weakrefc             C   s4   G dd dt }| }| jtj|jdjd dS )z9 the property ctrait constructor shouldn't leak a tuple. c               @   s   e Zd Ze ZdS )z4TestRegression.test_leaked_property_tuple.<locals>.AN)r   r   r   r   propr!   r!   r!   r"   A-  s   r   r   r@   N)r   rt   sysgetrefcountrv   Zproperty_fields)r   r   rC   r!   r!   r"   test_leaked_property_tuple*  s    z)TestRegression.test_leaked_property_tuplec             C   s*   t  }| j|j d|j_| j|j d S )Nr&   )r)   assertFalser.   r,   r    
assertTrue)r   Zmessr!   r!   r"   test_delegate_initializer3  s    z(TestRegression.test_delegate_initializerc             C   sd   t  }|jdd}| jt|jdd t|d}| jt|jdd ~| jt|jdd dS )z` Extended trait change notifications should not leaf
        TraitChangeNotifyWrappers.
        r    rq   Tr   )r=   r@   N)r   Z_traitrt   lenZ
_notifiersr<   )r   r(   rx   Z	presenterr!   r!   r"   test_no_leaking_notifiers9  s    
z(TestRegression.test_no_leaking_notifiersc             C   s:   t  }|jjd dddg|_d|jd< | j|jd dS )zl Using two lists with bracket notation in extended name notation
        should not raise an error.
        r   r@   rq   rr   N)r?   rC   appendrD   rt   rA   )r   Z	list_testr!   r!   r"   test_init_list_dependsE  s
    
z%TestRegression.test_init_list_dependsc                sv   d}d}g }dd   fdd}x0t |D ]$}|  tj  |jttj  q*W | j||d ||d d   d S )	N   r   c               S   s   d S )Nr!   r!   r!   r!   r"   handlerX  s    zATestRegression.test_has_traits_notifiers_refleak.<locals>.handlerc                 s   t  } | j  d S )N)r   r   )r=   )r   r!   r"   f[  s    z;TestRegression.test_has_traits_notifiers_refleak.<locals>.fr@   )ranger}   r~   r   r   get_objectsrt   )r   warmupcyclescountsr   _r!   )r   r"   !test_has_traits_notifiers_refleakP  s    z0TestRegression.test_has_traits_notifiers_refleakc             C   sb   d}d}g }x0t |D ]$}t  tj  |jttj  qW | j||d ||d d   d S )Nr   r   r@   r   )r   r5   r}   r~   r   r   r   rt   )r   r   r   r   r   r!   r!   r"   test_delegation_refleakh  s    z&TestRegression.test_delegation_refleakc             C   s2   G dd dt }|tjddgd}tdd d S )Nc               @   s   e Zd ZedeZdS )zYTestRegression.test_exception_from_numpy_comparison_ignored.<locals>.MultiArrayDataSourceN)r   r   r   r   r   r3   r!   r!   r!   r"   MultiArrayDataSourcey  s   r   r@   rq   )r3   gn!	@)r   r   arrayround)r   r   rD   r!   r!   r"   ,test_exception_from_numpy_comparison_ignoredu  s    z;TestRegression.test_exception_from_numpy_comparison_ignoredc             C   s6   t dd}t|d}| j|j d|_| j|j d S )Nr   )r    )r(      )r   rF   r   rG   r    r   )r   r(   modelr!   r!   r"   0test_on_trait_change_with_list_of_extended_names  s
    

z?TestRegression.test_on_trait_change_with_list_of_extended_namesc             C   s   G dd dt }| jt |dd W d Q R X | jt |f ddi W d Q R X | }| jt t|dd W d Q R X d S )Nc               @   s   e Zd ZeZdS )zATestRegression.test_set_disallowed_exception.<locals>.StrictDummyN)r   r   r   r   rp   r!   r!   r!   r"   StrictDummy  s   r   5   )	forbiddenr   )r   assertRaisesr	   setattr)r   r   rC   r!   r!   r"   test_set_disallowed_exception  s    z,TestRegression.test_set_disallowed_exceptionc             C   sR   G dd dt }| }| jt d|_W d Q R X | jt d|_W d Q R X d S )Nc               @   s   e Zd Ze Zede ZdS )z<TestRegression.test_validate_exception_propagates.<locals>.AN)r   r   r   rI   rp   r   rd   r!   r!   r!   r"   r     s   r   rp   )r   r   rJ   rp   rd   )r   r   rC   r!   r!   r"   "test_validate_exception_propagates  s    z1TestRegression.test_validate_exception_propagatesc          	   C   sz   G dd dt }|dgdgd}|j }| j|jdg |jjd | j|jdg | jt |jjd W d Q R X d S )Nc               @   s"   e Zd ZeeZeeddZdS )z;TestRegression.test_clone_list_of_enum_trait.<locals>.Ordermenu)valuesN)r   r   r   r   r   r   r   	selectionr!   r!   r!   r"   Order  s   r   fish)r   r   Zbouillabaisse)r   Zclone_traitsrt   r   r   r   r	   )r   r   orderr_   r!   r!   r"   test_clone_list_of_enum_trait  s    z,TestRegression.test_clone_list_of_enum_traitc             C   sN   t  }dddg}||}|j \}}| j|tj | j|| | j|| d S )Nr@   rq   rr   )r   rQ   rt   r   Ztrait_list_objectassertIsNot)r   tnew_defaultt_clonedefault_value_kindrQ   r!   r!   r"   test_clone_list_trait_default  s    
z,TestRegression.test_clone_list_trait_defaultc             C   sP   t  }dddd}||}|j \}}| j|tj | j|| | j|| d S )Nr@   rq   rr   )rC   rD   c)r   rQ   rt   r   Ztrait_dict_objectr   )r   r   r   r   r   rQ   r!   r!   r"   test_clone_dict_trait_default  s    z,TestRegression.test_clone_dict_trait_defaultc             C   sN   t  }dddh}||}|j \}}| j|tj | j|| | j|| d S )Nr@   rq   rr   )r   rQ   rt   r   Ztrait_set_objectr   )r   r   r   r   r   rQ   r!   r!   r"   test_clone_set_trait_default  s    
z+TestRegression.test_clone_set_trait_defaultc          	   C   s(   t  }| jt |d W d Q R X d S )Nzdefault value)rb   r   r	   )r   r   r!   r!   r"   !test_clone_disallow_default_value  s    z0TestRegression.test_clone_disallow_default_valuec             C   s8   t  }|d}|j \}}| j|tj | j|d d S )N3)r   rQ   rt   r   rO   )r   r   r   r   rQ   r!   r!   r"   !test_clone_setattr_original_value  s
    z0TestRegression.test_clone_setattr_original_valuec             C   s:   t  }t  }| j|jd | j|jd | j|jd d S )Nrp   z	[1, 2, 3])ro   rt   re   rf   )r   s1s2r!   r!   r"   test_subclass_default_constant  s
    z-TestRegression.test_subclass_default_constantc             C   s   t  }t  }| j|jt | j|jt | j|j|j | j|jt | j|jt | j|j|j | j|jt | j|jt | j|j|j d S )N)ro   assertIsInstancerh   rR   assertIsri   rj   )r   r   r   r!   r!   r"   'test_subclass_default_callable_and_args  s    z6TestRegression.test_subclass_default_callable_and_argsc             C   sJ   t  }t  }| j|jt | j|jt | j|j|j | j||j d S )N)ro   r   rn   rc   r   r   )r   r   r   r!   r!   r"   !test_subclass_default_object_kind  s    z0TestRegression.test_subclass_default_object_kindc             C   sV   t  }t  }| j|jdddg | j|jdddg | j|j|j | j|jt d S )Nr@   rq   rr   )ro   rt   rg   r   r   r
   )r   r   r   r!   r!   r"   'test_subclass_default_trait_list_object  s    z6TestRegression.test_subclass_default_trait_list_objectc             C   sh   t  }t  }| j|jt | j|jt | j|j|j | j|jt | j|jt | j|j|j d S )N)ro   r   rk   rR   r   rl   )r   r   r   r!   r!   r"   /test_subclass_callable_and_args_overrides_clone  s    z>TestRegression.test_subclass_callable_and_args_overrides_clonec             C   s*   | j t G dd dt}W d Q R X d S )Nc               @   s   e Zd ZdZdS )zMTestRegression.test_subclass_disallow_default_value.<locals>.OverrideDisallowza default valueN)r   r   r   rm   r!   r!   r!   r"   OverrideDisallow,  s   r   )r   r	   rc   )r   r   r!   r!   r"   $test_subclass_disallow_default_value*  s    z3TestRegression.test_subclass_disallow_default_valueN)r   r   r   rz   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r!   r!   r!   r"   rs     s2   	
rs   c               @   s|   e Zd ZeeZeeeeZeeee dZ	eeZ
eeeZeeee dZeeZeeeZeeee dZdS )NestedContainerClassN)r   r   r   r   list_of_listr   r   dict_of_listr   dict_of_union_none_or_listlist_of_dictdict_of_dictdict_of_union_none_or_dictr   list_of_setdict_of_setdict_of_union_none_or_setr!   r!   r!   r"   r   0  s   

r   c               @   sx   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d Zdd Zdd Zdd Zdd ZdS )"TestRegressionNestedContainerEventzG Regression tests for enthought/traits#281 and enthought/traits#25
    c                s   g  _  fdd}| _d S )Nc                 s    j j|  d S )N)eventsr   )r*   )r   r!   r"   change_handlerS  s    z@TestRegressionNestedContainerEvent.setUp.<locals>.change_handler)r   r   )r   r   r!   )r   r"   setUpP  s    z(TestRegressionNestedContainerEvent.setUpc             C   sF   t dg id}y|jd jd W n tk
r@   | jd Y nX d S )Nr2   )r   wordz'Mutating a nested list should not fail.)r   r   r   	Exceptionfail)r   instancer!   r!   r"   test_modify_list_in_dictX  s
    z;TestRegressionNestedContainerEvent.test_modify_list_in_dictc             C   sF   t dg id}y|jd jd W n tk
r@   | jd Y nX d S )Nr2   )r   r   z'Mutating a nested list should not fail.)r   r   r   r   r   )r   r   r!   r!   r"   )test_modify_list_in_dict_wrapped_in_uniona  s    zLTestRegressionNestedContainerEvent.test_modify_list_in_dict_wrapped_in_unionc             C   sB   t g gd}|j| jd |jd jd | jt| jdd d S )N)r   Zlist_of_list_itemsr   r@   zExpected no events.)r   r   r   r   r   rt   r   r   )r   r   r!   r!   r"   "test_modify_list_in_list_no_eventsj  s    zETestRegressionNestedContainerEvent.test_modify_list_in_list_no_eventsc             C   sB   t i gd}yd|jd d< W n tk
r<   | jd Y nX d S )N)r   r@   r   keyz'Mutating a nested dict should not fail.)r   r   r   r   )r   r   r!   r!   r"   test_modify_dict_in_listq  s
    z;TestRegressionNestedContainerEvent.test_modify_dict_in_listc             C   sP   t i gd}|jjt  yd|jd d< W n tk
rJ   | jd Y nX d S )N)r   r@   r   z'Mutating a nested dict should not fail.r   )r   r   r   dictr   r   )r   r   r!   r!   r"   'test_modify_dict_in_list_with_new_valuey  s    zJTestRegressionNestedContainerEvent.test_modify_dict_in_list_with_new_valuec             C   sF   t dddiid}|j| jd d|jd d< | jt| jdd	 d S )
N12rq   )r   Zdict_of_dict_itemsrr   r   r   zExpected no events.)r   r   r   r   rt   r   r   )r   r   r!   r!   r"   "test_modify_dict_in_dict_no_events  s    zETestRegressionNestedContainerEvent.test_modify_dict_in_dict_no_eventsc             C   sF   t dddiid}|j| jd d|jd d< | jt| jdd	 d S )
Nr   r   rq   )r   Z dict_of_union_none_or_dict_itemsrr   r   r   zExpected no events.)r   r   r   r   rt   r   r   )r   r   r!   r!   r"   +test_modify_dict_in_union_in_dict_no_events  s    
zNTestRegressionNestedContainerEvent.test_modify_dict_in_union_in_dict_no_eventsc             C   sF   t t gd}y|jd jd W n tk
r@   | jd Y nX d S )N)r   r   r@   z&Mutating a nested set should not fail.)r   setr   addr   r   )r   r   r!   r!   r"   test_modify_set_in_list  s
    z:TestRegressionNestedContainerEvent.test_modify_set_in_listc             C   sP   t g d}|jjt  y|jd jd W n tk
rJ   | jd Y nX d S )N)r   r   r@   z&Mutating a nested set should not fail.)r   r   r   r   r   r   r   )r   r   r!   r!   r"   &test_modify_set_in_list_with_new_value  s    
zITestRegressionNestedContainerEvent.test_modify_set_in_list_with_new_valuec             C   sH   t dt id}y|jd jd W n tk
rB   | jd Y nX d S )Nr   )r   r@   z&Mutating a nested set should not fail.)r   r   r   r   r   r   )r   r   r!   r!   r"   test_modify_set_in_dict  s
    z:TestRegressionNestedContainerEvent.test_modify_set_in_dictc             C   sH   t dt id}y|jd jd W n tk
rB   | jd Y nX d S )Nr   )r   r@   z&Mutating a nested set should not fail.)r   r   r   r   r   r   )r   r   r!   r!   r"    test_modify_set_in_union_in_dict  s    zCTestRegressionNestedContainerEvent.test_modify_set_in_union_in_dictc             C   sD   t t gd}|j| jd |jd jd | jt| jdd d S )N)r   Zlist_of_set_itemsr   r@   zExpected no events.)	r   r   r   r   r   r   rt   r   r   )r   r   r!   r!   r"    test_modify_nested_set_no_events  s
    
zCTestRegressionNestedContainerEvent.test_modify_nested_set_no_eventsN)r   r   r   rN   r   r   r   r   r   r   r   r   r   r   r   r   r   r!   r!   r!   r"   r   L  s   					r   )9rN   r}   r   ZunittestZtraits.constantsr   Ztraits.has_traitsr   r   r   r   Z$traits.testing.optional_dependenciesr   r   Ztraits.trait_errorsr	   Ztraits.trait_list_objectr
   Ztraits.trait_typer   r   Ztraits.trait_typesr   r   r   r   r   r   r   r   r   r   r   r   r   Ztraits.trait_numericr   r   r$   r%   r)   r5   r<   r?   rE   rF   rI   rR   rS   r^   rb   rc   ro   ZTestCasers   r   r   r!   r!   r!   r"   <module>   sB   <
	   -