U
    Cvf3I                     @  sd  d dl mZ d dlZd dlZd dlZd dlZd dlZd dl	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 d dlmZ d dlmZmZmZmZ d d	lmZ G d
d dZ G dd dZ!ddddZ"eG dd dZ#eG dd dZ$G dd deeZ%eG dd deZ&G dd dZ'dd Z(dd Z)ed d! Z*ddd"d#Z+d$d% Z,dS )&    )annotationsN)DatasetSerializationWarningVariablecftime_rangecodingconventionsopen_dataset)WritableCFDataStore)InMemoryDataStore)	decode_cf)assert_identical)assert_array_equalrequires_cftimerequires_daskrequires_netCDF4)CFEncodedBasec                   @  s   e Zd ZddddZdS )TestBoolTypeArrayNonereturnc                 C  sR   t jdddddgdd}t|}|jtks0tt|t jdddddgtd d S )N   r   i1dtypeTF)nparrayr   ZBoolTypeArrayr   boolAssertionErrorr   )selfxZbx r!   A/tmp/pip-unpacked-wheel-h316xyqg/xarray/tests/test_conventions.pytest_booltype_array!   s    
z%TestBoolTypeArray.test_booltype_arrayN)__name__
__module____qualname__r#   r!   r!   r!   r"   r       s   r   c                   @  s   e Zd ZddddZdS )TestNativeEndiannessArrayr   r   c                 C  s\   t jddd}t jddd}t|}|j|jks6t|j|d d  jksNtt|| d S )N   z>i8r   int64)r   aranger   ZNativeEndiannessArrayr   r   r   )r   r    expectedar!   r!   r"   test)   s    
zTestNativeEndiannessArray.testN)r$   r%   r&   r-   r!   r!   r!   r"   r'   (   s   r'   r   r   c               	   C  s  t dgtjtjdgddi} t dgtddddd}tjd	d
2}td|}t||  dt	|d j
ksrtW 5 Q R X t dgtdddi} t dgtddtjtjd}td|}t||  t dgtddttjttjd}td|}t||  d S )Nt   unitsfoobar   r   r   )r0   missing_value
_FillValueTrecordhas multiple fill
   )r   r   nanr*   warningscatch_warningsr   decode_cf_variabler   strmessager   Zfloat32)r+   varwactualr!   r!   r"   2test_decode_cf_with_conflicting_fill_missing_value2   s8      

 


	rB   c                   @  s   e Zd ZddddZddddZddddZddd	d
ZddddZddddZddddZ	e
ddddZdS )TestEncodeCFVariabler   r   c              
   C  s   t dgtjdddddit dgtdgddit dgdd	d
gddidd
it dgdd	d
gddidd
ig}|D ]$}tt t| W 5 Q R X qrd S )Nr.   
2000-01-01r2   Zperiodsr0   r1   z1 dayr   r   r/   Z
add_offsetr4   )	r   pd
date_rangeZto_timedeltapytestraises
ValueErrorr   encode_cf_variable)r   Zinvalid_varsr?   r!   r!   r"   test_incompatible_attributesU   s      z1TestEncodeCFVariable.test_incompatible_attributesc              	   C  sN   t dgttjdddg}ddi|_tjtdd t	| W 5 Q R X d S )	Nr    r   r/   r2   r   Zint16z!floating point data as an integermatch)
r   r   r   r9   encodingrH   warnsWarningr   rK   )r   vr!   r!   r"   test_missing_fillvalueb   s    
z+TestEncodeCFVariable.test_missing_fillvaluec           
      C  s  t d}t d}t d}tddg|di fddg|di fddg|di fddg|di fddg|di fddg|di fd	ddg|d
difd	ddg|d
difd	ddg|d
difd	dgddifd
}t|}t|\}}|d jd
d}|d jd
d}|d jd
d}	t	|
 ddhks@tt	|
 ddhksZtt	|	
 ddhksttd
|kstd S )N)r   r(   r2   )r      r2   )r   r(      x1y1r   Zx2y2timecoordinatesz	lon1 lat1z	lon2 lat2z	lon3 lat3g        r0   zhours since 2017-01-01)
lon1lon2lon3lat1lat2lat3foo1foo2foo3rY   ra    rb   rc   r^   r[   r_   r\   r`   r]   )r   zerosr   Zsqueezer   r   encode_dataset_coordinatesattrsgetsetsplitr   )
r   Zzeros1Zzeros2Zzeros3origencrg   Zfoo1_coordsZfoo2_coordsZfoo3_coordsr!   r!   r"   !test_multidimensional_coordinatesh   s2    



z6TestEncodeCFVariable.test_multidimensional_coordinatesc                 C  s   t ddtdddifidtdfdtdfdtdfdd}t|\}}|d jdd}t| dd	d
hkst	d|kst	d S )NvaluesrY   r/   rZ   ztime lon lat)rY   latloncoordsrd   ro   rp   )
r   r   re   r   rf   rg   rh   ri   rj   r   )r   rk   rl   rg   Zvalues_coordsr!   r!   r"   test_var_with_coord_attr   s    	z-TestEncodeCFVariable.test_var_with_coord_attrc              	   C  s   t dddgddddgfddd	d
gfdddddgfddddgfdd}d|d jd< d|d jd< t|\}}|d jd dkst|d jd dkstd|d jd< tjtdd t| W 5 Q R X d S )Nr   r   r/   r    r(   rT         	   r8   )r    yzr2   r,   b)rr   	data_varsrw   r,   rZ   rx   rz   fooz!'coordinates' found in both attrsrM   )	r   rO   r   rf   rg   r   rH   rI   rJ   r   rk   rl   _r!   r!   r"   &test_do_not_overwrite_user_coordinates   s    $z;TestEncodeCFVariable.test_do_not_overwrite_user_coordinatesc                 C  s   t ddddtjdtjdid}d |d jd< t|\}}d|d jksPtd|d jksbt|d	 j	ddksztd|d	 jkstd S 
Nr   ry   r.   z2004-11-01T00:00:00r   rq   r,   rZ   rz   )
r   r   r   
datetime64rg   r   rf   r   rO   rh   r}   r!   r!   r"   (test_emit_coordinates_attribute_in_attrs   s    z=TestEncodeCFVariable.test_emit_coordinates_attribute_in_attrsc                 C  s   t ddddtjdtjdid}d |d jd< t|\}}d|d jksPtd|d jksbt|d	 j	ddksztd|d	 jkstd S r   )
r   r   r   r   rO   r   rf   rg   r   rh   r}   r!   r!   r"   +test_emit_coordinates_attribute_in_encoding   s    z@TestEncodeCFVariable.test_emit_coordinates_attribute_in_encodingc              	   C  sN   t dtjddgtd }tjtdd t	|}W 5 Q R X t
|| d S )Nr    r|   barr   zdask array with dtype=objectrM   )r   r   r   objectchunkrH   rP   r   r   rK   r   )r   originalencodedr!   r!   r"   test_string_object_warning   s    z/TestEncodeCFVariable.test_string_object_warningN)r$   r%   r&   rL   rS   rm   rs   r   r   r   r   r   r!   r!   r!   r"   rC   S   s   "rC   c                   @  s   e Zd ZddddZddddZddddZddd	d
ZddddZddddZe	j
dddddZeddddZeddddZeddddZeddddZddddZdS )TestDecodeCFr   r   c                 C  s   t ddddgddifddddgddd	fdd
ddgddifd}t dddddgddifitjddddddtjgfd}t|}t|| d S )Nr.   r   r   r/   r0   days since 2000-01-01rw   r   rZ   r0   r(   r8   r4   r.   r|   rw   r|   rD   r2   rE   g      @g      $@)r.   rw   r   rF   rG   r   r9   r   r   r   r   r   r+   rA   r!   r!   r"   test_dataset   s    
zTestDecodeCF.test_datasetc                 C  s2   t ddddgddifi}t|}t|| d S )Nr|   r.   r   r/   rZ   invalid)r   r   r   r   r   r   rA   r!   r!   r"   test_invalid_coordinates   s    
z%TestDecodeCF.test_invalid_coordinatesc                 C  sF   t dddgddifdddgfd}t|}|jjd dksBtd S )	Nr.   r   r/   rZ   r    rU   r(   )r|   r    )r   r   r   r|   rO   r   r   r!   r!   r"   test_decode_coordinates   s
    
z$TestDecodeCF.test_decode_coordinatesc                 C  s@   t dtdddid}t dtd}t|}t|| d S )Nr!   r   r   r)   )rO   )r   r   Zint32r)   r   Zmaybe_encode_nonstring_dtyper   r   r!   r!   r"   test_0d_int32_encoding   s    
z#TestDecodeCF.test_0d_int32_encodingc              	   C  s   t dgdddgdtddgi}t dgtjtjdgi }tjdd2}td|}t|| dt	|d j
ksttW 5 Q R X d S )	Nr.   r   r   r/   r3   Tr5   r7   )r   r   r   r9   r:   r;   r   r<   r   r=   r>   r   )r   r   r+   r@   rA   r!   r!   r"   +test_decode_cf_with_multiple_missing_values   s    "
z8TestDecodeCF.test_decode_cf_with_multiple_missing_valuesc              	   C  s   t ddddgddifddd	d
gddifddddgdddgdddggddifddddgddifd}t tjdddddddgdddgdddggddifdddtjgfd}tj|dd}tj|dd}t|| t|| d S )Nr.   r   r   r/   r0   r   r    rv   ru   rt   km)r.   r    r   r(   r8   r   r4   )r.   r    r|   rw   rD   r2   rE   r   r   )Zdrop_variablesr   )r   r   r+   rA   Zactual2r!   r!   r"   "test_decode_cf_with_drop_variables  s.    
z/TestDecodeCF.test_decode_cf_with_drop_variablesz&ignore:Ambiguous reference date stringc              	   C  s@   t ddddgddifi}tjtdd t| W 5 Q R X d S )NrY   r   r   r0   zfoobar since 123unable to decode timerM   r   rH   rI   rJ   r   )r   dsr!   r!   r"   &test_invalid_time_units_raises_eagerly"  s    z3TestDecodeCF.test_invalid_time_units_raises_eagerlyc              	   C  s   ddd}t  < t dd ttddddg|fi}d	t|ksJtW 5 Q R X d
di}ttddddg|fi}dt|kstd S )Nzdays since 0001-01-01Znoleap)r0   calendarignorer   rY   r   r   z(time) objectr0   zdays since 1900-01-01z(time) datetime64[ns])r:   r;   filterwarningsr   r   reprr   )r   rg   r   r!   r!   r"   (test_dataset_repr_with_netcdf4_datetimes(  s    

z5TestDecodeCF.test_dataset_repr_with_netcdf4_datetimesc              	   C  s   ddl m } tdddgid}d}t|d|j_t  tdd	 t	|}W 5 Q R X t
|d
dddd|dddddg}t|jj| d S )Nr   )datetimerY   iB{ rq   zdays since 2000-01-01 00:00:00)r0   r   r   i  r   i  r8      )r   r   dictrY   rg   r:   r;   r   r   r   r   r   r   rn   )r   r   r   r0   Z
ds_decodedr+   r!   r!   r"   -test_decode_cf_datetime_transition_to_invalid5  s    
&z:TestDecodeCF.test_decode_cf_datetime_transition_to_invalidc              	     s   dd l m  tddddgddifddddgddd	fd
ddgfddgddifddddgddifd }t|t t fddj	 D st
tt|  d S )Nr   r.   r   r/   r0   r   rw   r   r   Zstring2   a   br    s   abcZ	_Encodingzutf-8r(   r8   r   r4   )r.   r|   r   Zbazrw   c                 3  s*   | ]"\}}|j krt|j jV  qd S N)Zxindexes
isinstancedataArray).0namer?   dadecodedr!   r"   	<genexpr>T  s   
z8TestDecodeCF.test_decode_cf_with_dask.<locals>.<genexpr>)Z
dask.arrayr   r   r   r   r   printall	variablesitemsr   r   Zcomputer   r   r!   r   r"   test_decode_cf_with_daskE  s    
	
z%TestDecodeCF.test_decode_cf_with_daskc                 C  sR   t i ddiddddiddd	d
dgdid}tt| t|  d S )NrY   r(   Z
average_T1)rY   r0   zdays since 1958-01-01 00:00:00g    f@g    }@g    P@g     @g    @)dimsrg   r   rr   r   r{   )r   	from_dictr   r   r   r   r   r!   r!   r"   test_decode_dask_times[  s    z#TestDecodeCF.test_decode_dask_timesc              	   C  sX  t tjdddgdddddid	tjdddgddd
ddid	ddddddtddid}t|}|jjtdkst	|j
jtdkst	tj|dd}|jjtdkst	|j
jtdkst	tj|ddd}|jjtdkst	|j
jtdkst	tj|ddd}|jjtdks<t	|j
jtdksTt	d S )Nr   r/   r2   r)   r   	timedeltar0   days)r   r   rg   rY   r   )r   rY   )rY   r   r,   )r2   r2   )r   r   r   zm8[ns]zM8[ns]F)decode_timesT)r   Zdecode_timedelta)r   r   r   r   Zonesr   r   r   r   r   rY   )r   r   Zdscr!   r!   r"   test_decode_cf_time_kwargso  s8     
z'TestDecodeCF.test_decode_cf_time_kwargsN)r$   r%   r&   r   r   r   r   r   r   rH   markr   r   r   r   r   r   r   r   r   r!   r!   r!   r"   r      s"   
r   c                   @  s   e Zd Zdd ZdS )CFEncodedInMemoryStorec                 C  s   t jjdd}||}|S )zencode one variableT)Zallows_unicode)r   stringsZEncodedStringCoderencode)r   r?   Zcoderr!   r!   r"   encode_variable  s    
z&CFEncodedInMemoryStore.encode_variableN)r$   r%   r&   r   r!   r!   r!   r"   r     s   r   c                   @  sn   e Zd Zejdd ZejdddZej	ddd	d
dZ
dd	ddZdd	ddZdd	ddZdS )TestCFEncodedDataStorec                 c  s   t  V  d S r   )r   r   r!   r!   r"   create_store  s    z#TestCFEncodedDataStore.create_storeNFc                 c  s>   |d kri }|d kri }t  }|j|f| t|f|V  d S r   )r   Zdump_to_storer	   )r   r   Zsave_kwargsZopen_kwargsZallow_cleanup_failurestorer!   r!   r"   	roundtrip  s    z TestCFEncodedDataStore.roundtripz;cannot roundtrip coordinates yet for CFEncodedInMemoryStorer   r   c                 C  s   d S r   r!   r   r!   r!   r"   test_roundtrip_coordinates  s    z1TestCFEncodedDataStore.test_roundtrip_coordinatesc                 C  s   d S r   r!   r   r!   r!   r"   "test_invalid_dataarray_names_raise  s    z9TestCFEncodedDataStore.test_invalid_dataarray_names_raisec                 C  s   d S r   r!   r   r!   r!   r"   test_encoding_kwarg  s    z*TestCFEncodedDataStore.test_encoding_kwargc                 C  s   d S r   r!   r   r!   r!   r"   &test_encoding_kwarg_fixed_width_string  s    z=TestCFEncodedDataStore.test_encoding_kwarg_fixed_width_string)NNF)r$   r%   r&   
contextlibcontextmanagerr   r   rH   r   skipr   r   r   r   r!   r!   r!   r"   r     s   
     
r   c                   @  s   e Zd ZddddZdS )"TestDecodeCFVariableWithArrayUnitsr   r   c                 C  s>   t dgdddgdtjdgtdi}td|}t|| d S )	Nr.   r   r/   r2   r0   r1   r   Ztest2)r   r   r   r   r   r<   r   )r   rR   Z	v_decodedr!   r!   r"   (test_decode_cf_variable_with_array_units  s    $zKTestDecodeCFVariableWithArrayUnits.test_decode_cf_variable_with_array_unitsN)r$   r%   r&   r   r!   r!   r!   r"   r     s   r   c                  C  s>   t dgtjddd} td| }|ji ks0tt||  d S )NrY   Z1Dr/   rE   )r   rF   Ztimedelta_ranger   r<   rO   r   r   variabler   r!   r!   r"   #test_decode_cf_variable_timedelta64  s    r   c                  C  s>   t dgtjddd} td| }|ji ks0tt||  d S NrY   2000r/   rE   )r   rF   rG   r   r<   rO   r   r   r   r!   r!   r"   "test_decode_cf_variable_datetime64  s    r   c                  C  s<   t dgtddd} td| }|ji ks.tt||  d S r   )r   r   r   r<   rO   r   r   r   r!   r!   r"   test_decode_cf_variable_cftime  s    r   c                  C  s8   t dgtjtjdgdtji} td| }t||  d S )Nr.   r/   r0   )r   r   r9   r   r<   r   )r?   rA   r!   r!   r"   test_scalar_units  s    r   c               	   C  s<   t dg dddifi} tjtdd t|  W 5 Q R X d S )Nr   g yhGr0   r   z#Failed to decode variable 'invalid'rM   r   )r   r!   r!   r"   +test_decode_cf_error_includes_variable_name  s    r   )-
__future__r   r   r:   Znumpyr   ZpandasrF   rH   Zxarrayr   r   r   r   r   r   r	   Zxarray.backends.commonr
   Zxarray.backends.memoryr   Zxarray.conventionsr   Zxarray.testingr   Zxarray.testsr   r   r   r   Zxarray.tests.test_backendsr   r   r'   rB   rC   r   r   r   r   r   r   r   r   r   r!   r!   r!   r"   <module>   s>   $	
!  >#
