U
    Cvf8                     @   sV  d Z ddlZddlZddlmZmZmZ ddlZddl	Z
ddlmZmZmZ ddlm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	Zd
d Zdd Zd1ddZedd Zedd Z ed2ddZ!dd Z"ed3ddZ#ed4dd Z$d!d" Z%d5d#d$Z&d6eed%d&d'Z'ee(d(d)d*Z)ee(d+d,d-Z*eeeef e(d.d/d0Z+dS )7z)Testing functions exposed to the user API    N)HashableSetUnion)duck_array_ops
formattingutils)	DataArray)Dataset)IndexPandasIndexPandasMultiIndexdefault_indexes)IndexVariableVariable)assert_allcloseassert_chunks_equalassert_duckarray_equalassert_duckarray_allcloseassert_equalassert_identicalc                    s   t   fdd}|S )Nc               
      s@   d}t  * dd t jD t _ | |W  5 Q R  S Q R X d S )NTc                 S   s   g | ]}|d  dkr|qS )r   error ).0fr   r   2/tmp/pip-unpacked-wheel-h316xyqg/xarray/testing.py
<listcomp>"   s      z4ensure_warnings.<locals>.wrapper.<locals>.<listcomp>)warningscatch_warningsfilters)argskwargs__tracebackhide__funcr   r   wrapper   s    
z ensure_warnings.<locals>.wrapper)	functoolswraps)r#   r$   r   r"   r   ensure_warnings   s    	r'   c                 C   s"   | j jdkrtjj| ddS | S )NSzutf-8replace)dtypekindnpcoreZdefchararraydecode)datar   r   r   _decode_string_data)   s    r0   h㈵>:0yE>Tc                    st   t dd | |fD r*|r*t| } t|}dddddg t  fdd| |fD r^t| |S tj| |||d	S d S )
Nc                 s   s   | ]}|j jd kV  qdS )r(   Nr*   r+   r   Zarrr   r   r   	<genexpr>0   s     z*_data_allclose_or_equiv.<locals>.<genexpr>MmOr(   Uc                 3   s   | ]}|j j kV  qd S Nr3   r4   Zexact_dtypesr   r   r5   4   s     rtolatol)anyr0   r   array_equivallclose_or_equiv)Zarr1Zarr2r=   r>   decode_bytesr   r;   r   _data_allclose_or_equiv/   s    rC   c                 C   s   d}t | t |kstt| ttfrD| |s~tt| |dn:t| trl| |s~tt	| |dnt
t |  ddS )a  Like :py:func:`numpy.testing.assert_array_equal`, but for xarray
    objects.

    Raises an AssertionError if two objects are not equal. This will match
    data values, dimensions and coordinates, but not names or attributes
    (except for Dataset objects for which the variable names must match).
    Arrays with NaN in the same location are considered equal.

    Parameters
    ----------
    a : xarray.Dataset, xarray.DataArray or xarray.Variable
        The first object to compare.
    b : xarray.Dataset, xarray.DataArray or xarray.Variable
        The second object to compare.

    See Also
    --------
    assert_identical, assert_allclose, Dataset.equals, DataArray.equals
    numpy.testing.assert_array_equal
    Tequals& not supported by assertion comparisonN)typeAssertionError
isinstancer   r   rD   r   diff_array_reprr	   diff_dataset_repr	TypeErrorabr!   r   r   r   r   :   s    
r   c                 C   s   d}t | t |kstt| tr@| |stt| |dnvt| trx| j|jksZt| |stt| |dn>t| t	tfr| |stt
| |dntt |  ddS )a  Like :py:func:`xarray.testing.assert_equal`, but also matches the
    objects' names and attributes.

    Raises an AssertionError if two objects are not identical.

    Parameters
    ----------
    a : xarray.Dataset, xarray.DataArray or xarray.Variable
        The first object to compare.
    b : xarray.Dataset, xarray.DataArray or xarray.Variable
        The second object to compare.

    See Also
    --------
    assert_equal, assert_allclose, Dataset.equals, DataArray.equals
    T	identicalrE   N)rF   rG   rH   r   rO   r   rI   r   namer	   rJ   rK   rL   r   r   r   r   Z   s    

r   c                    s
  d}t | t |ksttjt|||d d _ fdd}t| trj|| |}|shttj	| | dnt| t
rtj| j|j|do|| j|j}|sttj	| | dnVt| tr| j|jkotj| j|j|d}|sttj| | dntt |  ddS )	a-  Like :py:func:`numpy.testing.assert_allclose`, but for xarray objects.

    Raises an AssertionError if two objects are not equal up to desired
    tolerance.

    Parameters
    ----------
    a : xarray.Dataset, xarray.DataArray or xarray.Variable
        The first object to compare.
    b : xarray.Dataset, xarray.DataArray or xarray.Variable
        The second object to compare.
    rtol : float, optional
        Relative tolerance.
    atol : float, optional
        Absolute tolerance.
    decode_bytes : bool, optional
        Whether byte dtypes should be decoded to strings as UTF-8 or not.
        This is useful for testing serialization methods on Python 3 that
        return saved strings as bytes.

    See Also
    --------
    assert_identical, assert_equal, numpy.testing.assert_allclose
    T)r=   r>   rB   allclosec                    s>   t | d| } t |d|}| j|jko<| j|jkp< | j|jS )Nvariable)getattrdims_datar/   )rM   rN   equivr   r   compat_variable   s    z(assert_allclose.<locals>.compat_variable)compatrE   N)rF   rG   r%   partialrC   __name__rH   r   r   rI   r   r   Z
dict_equivZcoordsrR   r	   _coord_names	variablesrJ   rK   )rM   rN   r=   r>   rB   r!   rX   rQ   r   rV   r   r   y   s<       


  
  r   c                 C   s   | | }t t|}d}t|}|j}| d| }	t|| d }
d|d|	 d|
ddd	| d
| g}|r|d| d|g7 }d|S )Nznot implementedz / d   zArrays are not equalzMismatched elements: z (z.0fz%)zMax absolute difference: zMax relative difference: z x: z y: 
)maxabsr,   Zcount_nonzerosizefloatjoin)xyerr_msgverboseZdiffZabs_diffZrel_diffZn_diffZn_totalfraction
percentagepartsr   r   r   _format_message   s&    
rl   Hz> c                 C   s2   d}t j| |||d}|s.tt| |||ddS )z6Like `np.testing.assert_allclose`, but for duckarrays.Tr<   rg   rh   N)r   rA   rG   rl   )actualZdesiredr=   r>   rg   rh   r!   rQ   r   r   r   r      s    r   c                 C   s   d}t | s"t | s"t| } t |s@t |s@t|}t | rTt |sht | rvt |rv| |k }nt| |}|stt	| |||ddS )z8Like `np.testing.assert_array_equal`, but for duckarraysTro   N)
r   Zis_duck_arrayZ	is_scalarr,   Zasarrayallr   r@   rG   rl   )re   rf   rg   rh   r!   rW   r   r   r   r      s    

r   c                 C   s@   t | tt |tkrtd|  }| }|j|jks<tdS )a  
    Assert that chunksizes along chunked dimensions are equal.

    Parameters
    ----------
    a : xarray.Dataset or xarray.DataArray
        The first object to compare.
    b : xarray.Dataset or xarray.DataArray
        The second object to compare.
    za and b have mismatched typesN)rH   r   rK   Zunify_chunkschunksrG   )rM   rN   leftrightr   r   r   r      s
    r   c           
         sh  t | tst| tdd |  D s>tdd |  D dd | D }|  |ksltt| |f|  D ]\}}t |tr|j	}|| }|j
f|jkst||f||j
kr|j|jkst|j|jft |jjtjst|jj||jjst||ft |trt|j	}|j	jD ]}	|	|ksBt||f||	 }|j
f|jksft||f|j|	 |jkst|j|	 |jft |jjtjst|jj||jjst||f|	| kst|	t| f|| |	 ks(t|| |	 j	fq(qt|rdt|| |    ks<tt| t ft fdd|  D sdt|  fd S )Nc                 s   s   | ]}t |tV  qd S r:   )rH   r
   r   vr   r   r   r5     s     z4_assert_indexes_invariants_checks.<locals>.<genexpr>c                 S   s   i | ]\}}|t |qS r   rF   r   krv   r   r   r   
<dictcomp>  s     z5_assert_indexes_invariants_checks.<locals>.<dictcomp>c                 S   s   h | ]\}}t |tr|qS r   )rH   r   rx   r   r   r   	<setcomp>  s    
 z4_assert_indexes_invariants_checks.<locals>.<setcomp>c                 3   s    | ]\}}|  | V  qd S r:   )rD   rx   defaultsr   r   r5   -  s     )rH   dictrG   rq   valuesitemskeyssetr   indexZdimrT   Zcoord_dtyper*   rU   arraypdr
   rD   r   namesZlevel_coords_dtypeZ
MultiIndexr   )
ZindexesZpossible_coord_variablesrT   check_defaultZ
index_varsry   r   Zpd_indexvarrP   r   r|   r   !_assert_indexes_invariants_checks   sL    

&
&r   )r   rP   c                 C   s   |d krd}n|f}t | jts0t|| jf t| jt| jjks\t|| j| jjf t | jtd t	fst|| jf t | j
td t	fst|| j
f d S )Nr   )rH   _dimstuplerG   lenrU   shape	_encodingrF   r~   _attrs)r   rP   Zname_or_emptyr   r   r   _assert_variable_invariants3  s    r   )dacheck_default_indexesc                    s  t  jtst jt j t  jts6t jtdd  j D sXt jt fdd j D st j	dd  j
 D ftdd  j
 D stdd  j
 D  j
 D ]\}}t|| q̈ jd k	rt j j j	|d d S )	Nc                 s   s   | ]}t |tV  qd S r:   rH   r   ru   r   r   r   r5   H  s     z/_assert_dataarray_invariants.<locals>.<genexpr>c                 3   s"   | ]}t |jt  jkV  qd S r:   )r   rT   ru   r   r   r   r5   I  s     c                 S   s   i | ]\}}||j qS r   )rT   rx   r   r   r   rz   K  s      z0_assert_dataarray_invariants.<locals>.<dictcomp>c                 s   s(   | ] \}}|j |fkrt|tV  qd S r:   rT   rH   r   rx   r   r   r   r5   M  s     c                 S   s   i | ]\}}|t |qS r   rw   rx   r   r   r   rz   O  s      r   )rH   Z	_variabler   rG   r   Z_coordsr~   rq   r   rT   r   _indexesr   )r   r   ry   rv   r   r   r   _assert_dataarray_invariantsC  s,    
"
   r   )dsr   c                    s  t  jtstt jtdd  j D s<t j j D ]\}}t|| qFt  j	t
spt j	 j	 j kst j	t
 jft jtkst jtdd  j D st jt
 } j D ]}||j qވ j |kstt
 j|ft fdd j D sNt jdd  j D ftdd  j D stdd  j D t fd	d j D st fd
d j D  jd k	rt j j j|d t  jtd tfstt  jtd tfstd S )Nc                 s   s   | ]}t |tV  qd S r:   r   ru   r   r   r   r5   [  s     z-_assert_dataset_invariants.<locals>.<genexpr>c                 s   s   | ]}t |tV  qd S r:   )rH   intru   r   r   r   r5   f  s     c                 3   s.   | ]&}|j D ]} j| |j | kV  qqd S r:   )sizesr   )r   rv   ry   r   r   r   r5   k  s      c                 S   s   i | ]\}}||j qS r   )r   rx   r   r   r   rz   m  s      z._assert_dataset_invariants.<locals>.<dictcomp>c                 s   s(   | ] \}}|j |fkrt|tV  qd S r:   r   rx   r   r   r   r5   n  s   c                 S   s&   i | ]\}}|j |fkr|t|qS r   )rT   rF   rx   r   r   r   rz   r  s       c                 3   s(   | ] \}}| j kr|j|fkV  qd S r:   r   rT   rx   r   r   r   r5   s  s     
 c                    s"   i | ]\}}| j kr||jqS r   r   rx   r   r   r   rz   s  s    
  r   )rH   Z
_variablesr~   rG   rF   rq   r   r   r   r\   r   r   r   updaterT   r   r   r   r   )r   r   ry   rv   Zvar_dimsr   r   r   _assert_dataset_invariantsY  sJ    """*   r   Z
xarray_objr   c                 C   sZ   t | trt|  nBt | tr,t| |d n*t | trDt| |d ntdt	| dS )zValidate that an xarray object satisfies its own internal invariants.

    This exists for the benefit of xarray's own test suite, but may be useful
    in external projects if they (ill-advisedly) create objects using xarray's
    private APIs.
    )r   z6{} is not a supported type for xarray invariant checksN)
rH   r   r   r   r   r	   r   rK   formatrF   r   r   r   r   _assert_internal_invariants  s"    	


 
 r   )r1   r2   T)r1   r2   T)rm   r   rn   T)rn   T)T)N),__doc__r%   r   typingr   r   r   Znumpyr,   Zpandasr   Zxarray.corer   r   r   Zxarray.core.dataarrayr   Zxarray.core.datasetr	   Zxarray.core.indexesr
   r   r   r   Zxarray.core.variabler   r   __all__r'   r0   rC   r   r   r   rl   r   r   r   r   r   boolr   r   r   r   r   r   r   <module>   sL   



8       
 
3( 