U
    ÉZj†7  ã                   @   sê   d Z ddlZddlmZm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mZ dd„ ZG dd	„ d	ejƒZeZG d
d„ deƒZG dd„ deeƒZeZG dd„ dƒZG dd„ deƒZG dd„ dƒZG dd„ dƒZdd„ Z dS )z½Tests suite for MaskedArray & subclassing.

:author: Pierre Gerard-Marchant
:contact: pierregm_at_uga_dot_edu
:version: $Id: test_subclassing.py 3473 2007-10-29 15:18:13Z jarrod.millman $

é    N)Úassert_Úassert_raises)Úassert_equal)ÚarrayÚarangeÚmaskedÚMaskedArrayÚmasked_arrayÚlogÚaddÚhypotÚdivideÚasarrayÚ
asanyarrayÚnomaskc                 C   s   t | d t|ƒ… |ƒ d S ©N)r   Úlen)ÚaÚb© r   úb/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/numpy/ma/tests/test_subclassing.pyÚassert_startswith   s    r   c                       s@   e Zd Zi fdd„Z‡ fdd„Z‡ fdd„Z‡ fdd„Z‡  ZS )	ÚSubArrayc                 C   s   t  |¡ | ¡}| ¡ |_|S r   )Únpr   ÚviewÚcopyÚinfo)ÚclsZarrr   Úxr   r   r   Ú__new__   s    
zSubArray.__new__c                    s"   t ƒ  |¡ t|di ƒ ¡ | _d S ©Nr   )ÚsuperÚ__array_finalize__Úgetattrr   r   )ÚselfÚobj©Ú	__class__r   r   r"      s    zSubArray.__array_finalize__c                    s(   t ƒ  |¡}|j dd¡d |jd< |S )NÚaddedr   é   )r!   Ú__add__r   Úget©r$   ÚotherÚresultr&   r   r   r*   #   s    zSubArray.__add__c                    s(   t ƒ  |¡}|j dd¡d |jd< |S )NÚiaddedr   r)   )r!   Ú__iadd__r   r+   r,   r&   r   r   r0   (   s    zSubArray.__iadd__)Ú__name__Ú
__module__Ú__qualname__r   r"   r*   r0   Ú__classcell__r   r   r&   r   r      s   r   c                       s"   e Zd ZdZd‡ fdd„	Z‡  ZS )ÚSubMaskedArrayz<Pure subclass of MaskedArray, keeping some info on subclass.Nc                    s   t ƒ j| f|Ž}||jd< |S r    )r!   r   Ú_optinfo)r   r   Úkwargsr%   r&   r   r   r   3   s    
zSubMaskedArray.__new__)N)r1   r2   r3   Ú__doc__r   r4   r   r   r&   r   r5   1   s   r5   c                   @   s&   e Zd Zi efdd„Zedd„ ƒZdS )Ú	MSubArrayc                 C   s&   t ||ƒ}tj| ||d�}|j|_|S )N)ÚdataÚmask)r   r   r   r   )r   r:   r   r;   ZsubarrÚ_datar   r   r   r   ;   s    
zMSubArray.__new__c                 C   s   |   t¡}d|_|S )NF)r   r   Z_sharedmask)r$   Z_viewr   r   r   Ú_seriesA   s    
zMSubArray._seriesN)r1   r2   r3   r   r   Úpropertyr=   r   r   r   r   r9   9   s   r9   c                   @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )ÚCSAIteratorzß
    Flat iterator object that uses its own setter/getter
    (works around ndarray.flat not propagating subclass setters/getters
    see https://github.com/numpy/numpy/issues/4564)
    roughly following MaskedIterator
    c                 C   s   || _ | tj¡j| _d S r   )Ú	_originalr   r   ÚndarrayÚflatÚ	_dataiter)r$   r   r   r   r   Ú__init__V   s    zCSAIterator.__init__c                 C   s   | S r   r   ©r$   r   r   r   Ú__iter__Z   s    zCSAIterator.__iter__c                 C   s4   | j  |¡}t|tjƒs | ¡ }| t| jƒ¡}|S r   )	rC   Ú__getitem__Ú
isinstancer   rA   Ú	__array__r   Útyper@   )r$   ZindxÚoutr   r   r   rG   ]   s
    zCSAIterator.__getitem__c                 C   s   | j  |¡| j|< d S r   )r@   Ú_validate_inputrC   )r$   ÚindexÚvaluer   r   r   Ú__setitem__d   s    zCSAIterator.__setitem__c                 C   s   t | jƒ ¡  t| jƒ¡S r   )ÚnextrC   rI   r   rJ   r@   rE   r   r   r   Ú__next__g   s    zCSAIterator.__next__N)	r1   r2   r3   r8   rD   rF   rG   rO   rQ   r   r   r   r   r?   O   s   r?   c                       sh   e Zd Zdd„ Zdd„ Zdd„ Z‡ fdd„Z‡ fd	d
„Zedd„ ƒZ	e	j
dd„ ƒZ	d‡ fdd„	Z‡  ZS )ÚComplicatedSubArrayc                 C   s   d|   t¡› d�S )Nz	myprefix z
 mypostfix)r   r   rE   r   r   r   Ú__str__m   s    zComplicatedSubArray.__str__c                 C   s   d| j j› d| › d�S )Nú<ú ú>)r'   r1   rE   r   r   r   Ú__repr__p   s    zComplicatedSubArray.__repr__c                 C   s   t |tƒstdƒ‚|S )Nz!Can only set to MySubArray values)rH   rR   Ú
ValueError)r$   rN   r   r   r   rL   t   s    
z#ComplicatedSubArray._validate_inputc                    s   t ƒ  ||  |¡¡ d S r   )r!   rO   rL   ©r$   ÚitemrN   r&   r   r   rO   y   s    zComplicatedSubArray.__setitem__c                    s*   t ƒ  |¡}t|tjƒs&| ¡  t¡}|S r   )r!   rG   rH   r   rA   rI   r   rR   rY   r&   r   r   rG   ~   s    zComplicatedSubArray.__getitem__c                 C   s   t | ƒS r   )r?   rE   r   r   r   rB   …   s    zComplicatedSubArray.flatc                 C   s   |   ¡ }||d d …< d S r   )Zravel)r$   rN   Úyr   r   r   rB   ‰   s    Nc                    s@   t ƒ  ||¡}|d k	r<|d tjkr<|j dd¡d |jd< |S )Nr   Z
multipliedr)   )r!   Ú__array_wrap__r   Úmultiplyr   r+   )r$   r%   Úcontextr&   r   r   r\   Ž   s    z"ComplicatedSubArray.__array_wrap__)N)r1   r2   r3   rS   rW   rL   rO   rG   r>   rB   Úsetterr\   r4   r   r   r&   r   rR   k   s   

rR   c                   @   st   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S )ÚTestSubclassingc                 C   s2   t jddd�}t|dddddgd�}||f| _d S )Né   Úfloat)Zdtyper   r)   ©r;   )r   r   Ú	msubarrayr:   ©r$   r   Úmxr   r   r   Úsetup™   s    zTestSubclassing.setupc                 C   sZ   t  d¡}dddddg}t|ƒ}t||d�}tt|tƒƒ t|j|ƒ tt|jtƒƒ d S )Nra   r   r)   rc   )	r   r   r   r	   r   rH   r   r   r<   )r$   r   ÚmÚxsubZxmsubr   r   r   Útest_data_subclassingž   s    
z%TestSubclassing.test_data_subclassingc                 C   s   | j \}}tt|jtƒƒ d S r   )r:   r   rH   r<   Úsubarrayre   r   r   r   Útest_maskedarray_subclassing¨   s    
z,TestSubclassing.test_maskedarray_subclassingc              	   C   sL   | j \}}tjdd��, ttt|ƒtƒƒ tt|ƒt |¡ƒ W 5 Q R X d S )NÚignore)r   )r:   r   Zerrstater   rH   r
   rd   r   re   r   r   r   Útest_masked_unary_operations­   s    
z,TestSubclassing.test_masked_unary_operationsc                 C   sž   | j \}}ttt||ƒtƒƒ ttt||ƒtƒƒ tt||ƒ|| ƒ ttt||ƒjtƒƒ ttt ||¡tƒƒ ttt	||ƒtƒƒ ttt	||ƒtƒƒ d S r   )
r:   r   rH   r   rd   r   r<   rk   Úouterr   re   r   r   r   Útest_masked_binary_operations´   s    
z-TestSubclassing.test_masked_binary_operationsc                 C   s`   | j \}}t|j  ¡ |jd�}ttt||ƒtƒƒ ttt||ƒtƒƒ tt||ƒt||ƒƒ d S )Nrc   )	r:   r	   rI   r;   r   rH   r   rd   r   )r$   r   rf   Zxmxr   r   r   Útest_masked_binary_operations2Á   s
    
z.TestSubclassing.test_masked_binary_operations2c                 C   s’  t tdƒdgdgd  d�}tt|ƒƒ}t|ƒ}|d }tt|tƒƒ tt|tƒ ƒ tt|j	t
ƒƒ t|j	ji ƒ |d }tt|tƒƒ tt|tƒƒ tt|j	t
ƒƒ t|j	jd dkƒ |d7 }tt|tƒƒ tt|tƒƒ tt|j	t
ƒƒ t|j	jd dkƒ | dddddg¡ t|jdddddgƒ |j dddddg¡ t|jdddddgƒ t|dd	id
�}t|ƒ}tt|dƒƒ t|j|jƒ d S )Nra   r   r)   é   rc   r(   r/   Únamer   )r   r   )r   r   r	   rk   rd   r   rH   r   r9   r<   r   r   r   Z	_set_maskÚ_maskr=   Úhasattr)r$   r   ZmyZymÚzri   Úmxsubr   r   r   Útest_attributepropagationÉ   s4    z)TestSubclassing.test_attributepropagationc                 C   s  t  d¡}dddddg}dd„ t||ƒD ƒ}t||d|id�}t|dd	�}tt|tƒ ƒ tt|tƒƒ t|j	|ƒ t
|ƒ}tt|tƒ ƒ tt|tƒƒ t|j	|ƒ t|d
d	�}tt|tƒƒ t|j|jƒ t|j	|j	ƒ t|ƒ}tt|tƒƒ t|j|jƒ t|j	|ƒ d S )Nra   r   r)   c                 S   s   g | ]\}}||f‘qS r   r   )Ú.0ÚiÚjr   r   r   Ú
<listcomp>î   s     z=TestSubclassing.test_subclasspreservation.<locals>.<listcomp>ri   )r;   r   F)ZsubokT)r   r   Úzipr9   r	   r   rH   r   r   rt   r   r   r   )r$   r   rh   Zxinfori   rw   r   r   r   Útest_subclasspreservationê   s(    
z)TestSubclassing.test_subclasspreservationc                 C   sÊ  t  d¡}t|ƒ}t|dddddgd�}tt|d tƒƒ tt|d tƒƒ tt|dd… tƒƒ tt|d tƒƒ tt|d jtƒƒ t|d tkƒ tt|d	 jtƒƒ tt|dd… jtƒƒ tt|jd jtƒƒ t|jd tkƒ tt|jdd… j	tƒƒ t
t|jd|d ƒ t
t|jd|d ƒ t
t|jtddƒ|dd… ƒ |d |d< |dd… |dd…< t
t|jjd|d ƒ t
t|jjtddƒ|dd… ƒ |d |jd< |dd… |jdd…< d
S )z,test that getter and setter go via baseclassra   TFrc   r)   ©r)   .rr   r   ©r   .N)r   r   rR   r	   r   rH   r:   r   rB   Úbaser   rX   rO   Úslice)r$   r   ÚxcsubÚmxcsubr   r   r   Útest_subclass_items  s.    
 z#TestSubclassing.test_subclass_itemsc                 C   sj   t  d¡}t|ƒ}t|ƒ}tt|d jtƒƒ tt|d jtƒƒ tt|d tƒƒ tt|d tƒƒ d S )Nra   r   r€   r)   r   )r   r   rR   r	   r   rH   r:   )r$   r   rƒ   Zmxcsub_nomaskr   r   r   Útest_subclass_nomask_items*  s    
z*TestSubclassing.test_subclass_nomask_itemsc                 C   sh   t  d¡}t|dddddgd�}tt|ƒdƒ t|ƒ}t|dddddgd�}tt|ƒdtj› d�ƒ dS )	zOtest that repr uses the name of the subclass
        and 'array' for np.ndarrayra   TFrc   r	   Zmasked_z(data=[--, 1, --, 3, 4]N)r   r   r	   r   Úreprr   r1   )r$   r   rf   ri   rw   r   r   r   Útest_subclass_repr5  s    
ÿz"TestSubclassing.test_subclass_reprc                 C   s|   t  d¡}t|ƒ}t|dddddgd�}tt|ƒdƒ t|ƒ}tt|j	dt j
jjƒ t|dddddgd�}tt|ƒdƒ dS )	z7test str with subclass that has overridden str, setitemra   TFrc   z[-- 1 -- 3 4]r   z myprefix [-- 1 -- 3 4] mypostfixN)r   r   r   r	   r   ÚstrrR   r   rX   rO   ÚmaÚcoreZmasked_print_option)r$   r   ri   rw   rƒ   r„   r   r   r   Útest_subclass_str@  s    

ÿz!TestSubclassing.test_subclass_strc                 C   s†   t dddddddgd�}t d	dddddgd�}t ||¡}td
|jkƒ t|jd
 dkƒ || }td
|jkƒ t|jd
 dkƒ d S )NÚtestr)   é   é   rr   ra   é   )r:   r   r   )r5   r   Úsubtractr   r6   )r$   Zarr1Zarr2Zdiff1Zdiff2r   r   r   Ú$test_pure_subclass_info_preservationN  s    z4TestSubclassing.test_pure_subclass_info_preservationN)r1   r2   r3   rg   rj   rl   rn   rp   rq   rx   r~   r…   r†   rˆ   rŒ   r’   r   r   r   r   r`   –   s   
!%r`   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚArrayNoInheritancez6Quantity-like class that does not inherit from ndarrayc                 C   s   || _ || _d S r   )Ú	magnitudeÚunits)r$   r:   r•   r   r   r   rD   ]  s    zArrayNoInheritance.__init__c                 C   s   t | j|ƒS r   )r#   r”   )r$   Úattrr   r   r   Ú__getattr__a  s    zArrayNoInheritance.__getattr__N)r1   r2   r3   r8   rD   r—   r   r   r   r   r“   [  s   r“   c                  C   s  t jjdddgdddgd�} t| dƒ}t j |¡}t| j|jƒ t| j|jƒ dddg| _t| j|jƒ t|jƒ t jj|dd�}t| j|jƒ t| j|jƒ dddg| _tdddg|jƒ t|j ƒ t jj|dd	�}t| j|jƒ t| jdddgƒ t|j ƒ t|j ƒ d S )
Nr)   rŽ   r�   TFrc   Zmeters)r   )Z	keep_mask)	r   rŠ   r   r“   r   r:   r;   r   Z
sharedmask)Zdata_maskedZdata_masked_unitsZ	new_arrayr   r   r   Útest_array_no_inheritancee  s&    

r˜   )!r8   Únumpyr   Znumpy.testingr   r   Znumpy.ma.testutilsr   Znumpy.ma.corer   r   r   r   r	   r
   r   r   r   r   r   r   r   rA   r   rk   r5   r9   rd   r?   rR   r`   r“   r˜   r   r   r   r   Ú<module>   s    8+ F
