U
    CvfF                     @  s   d dl mZ d dlZd dlZd dlZd dlmZm	Z	 d dl
mZ d dlmZmZ d dlmZ G dd dZG d	d
 d
ZG dd dZdS )    )annotationsN)dtypesmerge)
MergeError)assert_equalassert_identical)create_test_datac                   @  s   e Zd Zdd ZdS )TestMergeInternalsc              	   C  s   t tddgtdddgg}|dddks6tt tdddggtdddgg}|dddkspttt, t tdddggtddgg W 5 Q R X d S )Nx   y   r
   r   )r   Zbroadcast_dimension_sizexrVariableAssertionErrorpytestraises
ValueError)selfactual r   ;/tmp/pip-unpacked-wheel-h316xyqg/xarray/tests/test_merge.pytest_broadcast_dimension_size   s     z0TestMergeInternals.test_broadcast_dimension_sizeN)__name__
__module____qualname__r   r   r   r   r   r	      s   r	   c                   @  s\  e Zd Zdd Zdd Zdd Zdd Zej	d	d
dddddddddddfd
dddi ddddfd
i dddddddfd
dddddddddddfdddddddi dfdddddddddddfdddddddddddfddddddddddddfddddddddddddddfdde
dge
dgdde
dgddde
dgdddfdd dddddddddddddfgdd Zej	dd
dddddddddddfd
dddi ddddfd
i dddddddfd
dddddddddddfdddddddi dfdddddddddddfdddddddddddfddddddddddddfddddddddddddddfd d dddddddddddddfg
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d3d4 Zd5d6 Zd7d8 Zd9d: Zd;S )<TestMergeFunctionc                 C  s6   t dd}t|j|jg}|ddg }t|| d S NFZ	add_attrsvar1var2)r   r   r   r    r!   r   r   datar   expectedr   r   r   test_merge_arrays    s    
z#TestMergeFunction.test_merge_arraysc                 C  sV   t dd}t|dg |dg g}|ddg }t|| t||g}t|| d S r   )r   r   r   r   r"   r   r   r   test_merge_datasets'   s    

z%TestMergeFunction.test_merge_datasetsc              	   C  s<   t jddgdd}tjtdd t |g W 5 Q R X d S )Nr   r   r
   )Zdimsz"without providing an explicit namematch)r   	DataArrayr   r   r   r   )r   r#   r   r   r   test_merge_dataarray_unnamed1   s    z.TestMergeFunction.test_merge_dataarray_unnamedc                 C  s~   ddd}ddd}ddd}t dd}|dd	g  }||j_||j_||_||j_||j_t|j|jg}t|| d S )
Nr   r   ab   r,   cFr   r    r!   )r   copyr    attrsr!   r   r   r   )r   
var1_attrs
var2_attrsexpected_attrsr#   r$   r   r   r   r   test_merge_arrays_attrs_default6   s    



z1TestMergeFunction.test_merge_arrays_attrs_defaultzGcombine_attrs, var1_attrs, var2_attrs, expected_attrs, expect_exceptionno_conflictsr   r   r+   r.   r/   r,   r-   r0   F   Tdrop	identicaloverride   drop_conflictsr-   r0   dr,   r0   r@   c                 C  s   | d S Nr   r   r2   contextr   r   r   <lambda>r       zTestMergeFunction.<lambda>c           
   	   C  sv   t j|d}t j|d}|rJtjtdd t j||g|d}W 5 Q R X n(t j||g|d}t j|d}	t||	 d S )Nr2   combine_attrsr'   rH   r   Datasetr   r   r   r   r   )
r   rH   r3   r4   r5   expect_exceptiondata1data2r   r$   r   r   r   test_merge_arrays_attrsF   s    7z)TestMergeFunction.test_merge_arrays_attrsz?combine_attrs, attrs1, attrs2, expected_attrs, expect_exceptionc                 C  s   | d S rB   r   rC   r   r   r   rE      rF   c           
   	   C  s   t jddg |fiddg |fid}t jddg |fiddg |fid}|rvtjtdd t j||g|d}W 5 Q R X n>t j||g|d}t jddg |fiddg |fid}	t||	 dS )z=check that combine_attrs is used on data variables and coordsr    Zdim1ZcoordsrH   r'   rI   NrJ   )
r   rH   attrs1attrs2r5   rL   rM   rN   r   r$   r   r   r   !test_merge_arrays_attrs_variables   s"    1  z3TestMergeFunction.test_merge_arrays_attrs_variablesc                 C  sN   t jddid}t jddid}t j||gdd}d|jd< |jdksJtd S )Nr
   r   rG   r   r<   rI   r   )r   rK   r   r2   r
   r   )r   ds1ds2ds3r   r   r   test_merge_attrs_override_copy   s
    
z0TestMergeFunction.test_merge_attrs_override_copyc                 C  st   t jddddd}t jddddd}t jdddddd}t j|||gdd}t jdddd	d}t|| d S )
Nr   r8   rG   r   r?   )r,   r-   r0   er>   rI   )r,   r@   rX   r   rK   r   r   )r   rT   rU   rV   r   r$   r   r   r   test_merge_attrs_drop_conflicts   s    z1TestMergeFunction.test_merge_attrs_drop_conflictsc              	   C  sd   t ddg ddifi}t ddg ddifi}tjt jdd t j||gddd	 W 5 Q R X d
S )z2make sure compat="minimal" does not silence errorsr,   r
   r   r   rH   r'   r7   Zminimal)rH   compatNr   rK   r   r   r   r   )r   rT   rU   r   r   r   ,test_merge_attrs_no_conflicts_compat_minimal   s    z>TestMergeFunction.test_merge_attrs_no_conflicts_compat_minimalc                 C  s<   t ddiddiddig}t dddd}t|| d S )Nfoor   barZonebazg      @)r^   r_   r`   r   r   rK   r   r   r   r$   r   r   r   test_merge_dicts_simple   s    z)TestMergeFunction.test_merge_dicts_simplec                 C  sD   t dddgfiddgig}t dgddgfd}t|| d S )Nr   r
         r   ra   rb   r   r   r   test_merge_dicts_dims   s    z'TestMergeFunction.test_merge_dicts_dimsc              	   C  s<   t ddi}tt j t ||d g W 5 Q R X d S )Nr
   r   r   r\   r   dsr   r   r   test_merge_error   s    z"TestMergeFunction.test_merge_errorc              	   C  sX   t jdddgid}t jdddgid}tjtdd t j||gdd	 W 5 Q R X d S )
Nr
   r   r   rP   r.   z&cannot align.*join.*exact.*not equal.*r'   exactjoin)r   rK   r   r   r   r   )r   rh   otherr   r   r   test_merge_alignment_error   s    z,TestMergeFunction.test_merge_alignment_errorc              	   C  s   t jtdd tdg W 5 Q R X tjdddgid}t jtdd td|i W 5 Q R X t jtdd t|dg W 5 Q R X d S )Nzobjects must be an iterabler'   r   r
   r   rP   r,   )r   r   	TypeErrorr   r   rK   rg   r   r   r   test_merge_wrong_input_error   s    z.TestMergeFunction.test_merge_wrong_input_errorc              	   C  s  t dddgfddgd}t dddgfddgd}t ddddgfdddgd}|t j||gddstt|t j||gddst|t j||gdd	d
st|t j||gddd
stt ddgfdgd}|t j||gddd
sttt j4 t dddgfddgd}t j||gdd W 5 Q R X tt j4 t dddgfddgd}t j||gdd W 5 Q R X d S Nr
   r   r   r   r,   r
   r.   r7   r[   left)r[   rl   rightinnerc   r   )r,   r   r   rK   r;   r   r   r   r   r   )r   rT   rU   r$   rV   r   r   r   "test_merge_no_conflicts_single_var  s"     
z4TestMergeFunction.test_merge_no_conflicts_single_varc                 C  s   t dd}|jdd}|jdd}|ddg }tj|j|jgdd}t|| tj|d d d d d	f< tj|d d d d	d f< tj|d d d
d d f< tj|d d
d d d f< |d= tj||gdd}t	|| d S )NFr   T)deepr    r!   r7   rs   r=   r9   var3)
r   r1   r   r   r    r!   r   npnanr   )r   r#   rM   rN   r$   r   r   r   r   !test_merge_no_conflicts_multi_var  s    

z3TestMergeFunction.test_merge_no_conflicts_multi_varc                 C  s8   t dg dddifi}t j||gdd}t|| d S )Nr
   r   r^   r_   r7   rI   rY   )r   r#   r   r   r   r   &test_merge_no_conflicts_preserve_attrs)  s    z8TestMergeFunction.test_merge_no_conflicts_preserve_attrsc                 C  s   t dddgfit dtjig}t |}t dddgfi}t|| t ddtjgfit ddig}t |}t|| d S )Nr
   r   r   )r   rK   r|   r}   r   r   )r   Zdatasetsr   r$   r   r   r   !test_merge_no_conflicts_broadcast.  s    $

$
z3TestMergeFunction.test_merge_no_conflicts_broadcastN)r   r   r   r%   r&   r*   r6   r   markparametrizer|   arrayrO   rS   rW   rZ   r]   rc   rf   ri   rn   rp   ry   r~   r   r   r   r   r   r   r      s   









4









-
		r   c                   @  s  e Zd Zdd Zdd Zdd Zdd Zej	d	e
jd
dd
ddgdd Zdd Zdd Zej	dddddgdddd
ddd
ddi dfdddd
dd
d
dddd
dd dfd!ddddd
dddddfd"ddddd
dd#d$fd%ddddd
dd#d$ffd&d' Zd#S )(TestMergeMethodc              	   C  s  t  }|dg }|dg }|ddg }||}t|| ||}t|| ||}t|| |jdd|}t|| ||jdd}t|| tt ||ddi W 5 Q R X tjtdd | | W 5 Q R X tjtdd ||  W 5 Q R X d S )Nr    r{   T)r:   should be coordinates or notr'   )r   r   r   Zreset_coordsr   r   r   rename)r   r#   rT   rU   r$   r   r   r   r   
test_merge:  s(    









zTestMergeMethod.test_mergec                 C  s   t ddi}t ddddgfi}||}t|| ||}t|| | }|| t|| t dtji}t ddtjtjgfi}||}t|| d S )Nr
   r   r   )r   rK   r   r   r1   updater|   r}   )r   rT   rU   r   r   r   r   test_merge_broadcast_equalsS  s    






z+TestMergeMethod.test_merge_broadcast_equalsc              
   C  s  t ddi}t ddi}dD ]*}tt j |j||d W 5 Q R X q t dddgi}dD ],}tjtdd |j||d W 5 Q R X qbt dd	dd
difi}tt j |j|dd W 5 Q R X tjtdd |j|dd W 5 Q R X ||j|ddstd S )Nr
   r   r   )Zbroadcast_equalsequalsr;   r7   rs   )r   r;   r   r'   r   r^   r_   r;   zcompat=.* invalidZfoobarr<   )	r   rK   r   r   r   r   r   r;   r   )r   rT   rU   r[   r   r   r   test_merge_compate  s    z!TestMergeMethod.test_merge_compatc                 C  s  t dddgfddgd}t dddgfddgd}t dddtjgfdtjddgfd	ddddgi}|||st|||st|jtdd
}||j|ddst||j|ddst|jtddd
}||j|ddst||j|ddstd S )Nr
   r   r   r   rr   r.   r9   r-   r
   r+   )r
   rt   rk   ru   rv   )	r   rK   r|   r}   r;   r   r   Ziselslice)r   rT   rU   r$   r   r   r   test_merge_auto_alignz  s      z%TestMergeMethod.test_merge_auto_align
fill_valuer   g       @r   r+   c                 C  s   t dddgfddgd}t dddgfddgd}|tjkrNtj }}n$t|trj|d	 }|d
 }n| }}t ddd|gfd|ddgfdddddgi}||j	||dst
||j	||dst
|t j	||g|dst
d S )Nr
   r   r   r   rr   r.   r9   r   r,   r-   r+   )r   )r   rK   r   NAr|   r}   
isinstancedictr;   r   r   )r   r   rT   rU   Zfill_value_aZfill_value_br$   r   r   r   test_merge_fill_value  s    


z%TestMergeMethod.test_merge_fill_valuec              	   C  sv  t dddgfddgd}t dddgfddgd}t ddddgfdddgd}||j|ddspt||j|ddst||j|dd	d
st||j|ddd
stt ddgfdgd}||j|ddd
sttt j0 t dddgfddgd}|j|dd W 5 Q R X tt j0 t dddgfddgd}|j|dd W 5 Q R X d S rq   rx   )r   rT   rU   r$   Z	expected2rV   r   r   r   test_merge_no_conflicts  s     z'TestMergeMethod.test_merge_no_conflictsc                 C  s:   t ddi}t jddd}t||t ||g d S )Nr,   r   r   r-   )r#   name)r   rK   r)   r   r   )r   rh   dar   r   r   test_merge_dataarray  s    z$TestMergeMethod.test_merge_dataarrayrH   rQ   rR   r5   expect_errorr:   r   r8   r.   Fr>   r?   rA   r<   r7   NTr;   c           
   	   C  sl   t j|d}t j|d}|rDtt j |j||d W 5 Q R X n$|j||d}t j|d}	t||	 d S )NrG   rI   rJ   )
r   rH   rQ   rR   r5   r   rT   rU   r   r$   r   r   r   test_merge_combine_attrs  s    z(TestMergeMethod.test_merge_combine_attrs)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   9  s.   



r   )
__future__r   Znumpyr|   r   Zxarrayr   Zxarray.corer   r   Zxarray.core.merger   Zxarray.testingr   r   Zxarray.tests.test_datasetr   r	   r   r   r   r   r   r   <module>   s     