U
    md                    @   s  d Z ddlZddl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 ddlmZ ddlmZmZmZ ddlmZmZ ddlmZmZ dd	lmZ dd
lmZ ddlZddlm  m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Z"G dd dZ#G dd deZ$G dd deZ%G dd deZ&ej'(de)dfej*dfej+dfe,dfej-dfej.dfej/dd d!d"fej/d#d d!d"fej/dd$d"fej/d#d$d"fe/ d"fgd%d& Z0G d'd( d(eZ1e
2d)ej3j4kd*G d+d, d,eZ5e
2d)ej3j4kd*G d-d. d.eZ6e
2d/ej3j4kd0G d1d2 d2eZ7e
2d3ej3j4kd4G d5d6 d6eZ8e
2d7ej3j4kd8G d9d: d:eZ9e
2d;ej3j4kd<G d=d> d>eZ:e
2d?ej3j4kd@G dAdB dBeZ;G dCdD dDeZ<G dEdF dFeZ=G dGdH dHeZ>G dIdJ dJeZ?G dKdL dLeZ@G dMdN dNeZAG dOdP dPeZBG dQdR dReZCG dSdT dTeZDG dUdV dVeZEG dWdX dXeZFG dYdZ dZeZGG d[d\ d\eZHG d]d^ d^eZIG d_d` d`eZJej'jKejjLdakdbdcZMG ddde deeZNG dfdg dgeZOG dhdi dieZPG djdk dkeZQG dldm dmeZRe
SejjLdnkdodpdq ZTe
SejjLdrkp|ejjLdsko|ejjLdtk dudvdw ZUdxdy ZVdzd{ ZWd|d} ZXd~d ZYdd ZZdd Z[ej'j\ejjLdk ddcdd Z]dd Z^G dd deZ_G dd deZ`dS )z
    Dataset testing operations.

    Tests all dataset operations, including creation, with the exception of:

    1. Slicing operations for read and write, handled by module test_slicing
    2. Type conversion for read and write (currently untested)
    N   )utTestCase)get_data_file_path)FileGroupDataset)is_empty_dataspaceproduct)h5fh5t)H5pyDeprecationWarning)versionc                   @   s   e Zd Zdd Zdd ZdS )BaseDatasetc                 C   s   t |  d| _d S )Nw)r   mktempfself r   P/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/h5py/tests/test_dataset.pysetUp'   s    zBaseDataset.setUpc                 C   s   | j r| j   d S N)r   closer   r   r   r   tearDown*   s    zBaseDataset.tearDownN)__name__
__module____qualname__r   r   r   r   r   r   r   &   s   r   c                   @   s   e Zd ZdZdd ZdS )TestReprz5
        Feature: repr(Dataset) behaves sensibly
    c                 C   s<   | j dd}| t|t | j   | t|t dS )z( repr() works on live and dead datasets foo   N)r   create_datasetassertIsInstancereprstrr   r   dsr   r   r   test_repr_open4   s    
zTestRepr.test_repr_openN)r   r   r   __doc__r(   r   r   r   r   r   /   s   r   c                   @   st   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eeed ddd Zdd ZdS )TestCreateShapez@
        Feature: Datasets can be created from a shape only
    c                 C   s    | j dd}| |jd dS )z Create a scalar dataset r   r   Nr   r"   assertEqualshaper   dsetr   r   r   test_create_scalarB   s    z"TestCreateShape.test_create_scalarc                 C   s    | j dd}| |jd dS )z Create a size-1 dataset r   r   Nr+   r.   r   r   r   test_create_simpleG   s    z"TestCreateShape.test_create_simplec                 C   s    | j dd}| |jd dS )z+ Create a size-1 dataset with integer shaper   r   r1   Nr+   r.   r   r   r   test_create_integerL   s    z#TestCreateShape.test_create_integerc                 C   sX   | j dd}| |jd | |jd | j dd}| |jd | |jd dS ) Create an extended dataset r   ?   r6   bar   
   <   Nr   r"   r,   r-   sizer.   r   r   r   test_create_extendedQ   s    z$TestCreateShape.test_create_extendedc                 C   sX   | j dd}| |jd | |jd | j dd}| |jd | |jd dS )r4   r   r6   r5   r7   r8   r;   Nr<   r.   r   r   r   test_create_integer_extendedZ   s    z,TestCreateShape.test_create_integer_extendedc                 C   s&   | j dd}| |jtd dS )) Confirm that the default dtype is float r   r5   z=f4Nr   r"   r,   dtypenpr.   r   r   r   test_default_dtypec   s    z"TestCreateShape.test_default_dtypec              	   C   s&   |  t | jd W 5 Q R X dS )z  Missing shape raises TypeError r   NassertRaises	TypeErrorr   r"   r   r   r   r   test_missing_shapeh   s    z"TestCreateShape.test_missing_shapec                 C   sF   | j jddtjd}t dkr2tdt   | |j	tj dS )r@   r   r5   rB   )ppc64lez(Storage of long double deactivated on %sN)
r   r"   rC   Z
longdoubleplatformmachinepytestxfailr,   rB   r.   r   r   r   test_long_doublem   s    z TestCreateShape.test_long_double
complex256zNo support for complex256c                 C   s0   | j jddtdd}| |jtd dS )r@   r   r5   rP   rI   N)r   r"   rC   rB   r,   r.   r   r   r   test_complex256t   s    
zTestCreateShape.test_complex256c                 C   s<   | j dd}| |jd | j dd}| |jd d S )Ns   foor1   s   bar/baz)   r+   r   r/   dset2r   r   r   test_name_bytes{   s    zTestCreateShape.test_name_bytesN)r   r   r   r)   r0   r2   r3   r>   r?   rD   rH   rO   r   skipIfhasattrrC   rQ   rU   r   r   r   r   r*   <   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 )TestCreateDatazA
        Feature: Datasets can be created from existing data
    c                 C   s0   t dd}| jjd|d}| |j|j dS )z- Create a scalar dataset from existing array r   r   r   dataNrC   onesr   r"   r,   r-   r   rZ   r/   r   r   r   r0      s    z!TestCreateData.test_create_scalarc                 C   s0   t dd}| jjd|d}| |j|j dS )z/ Create an extended dataset from existing data r5   r   r   rY   Nr[   r]   r   r   r   r>      s    z#TestCreateData.test_create_extendedc                 C   s4   | j jdddd}| |tj | d| j k dS )z1 Create dataset with missing intermediate groups z/foo/bar/bazr:   r:   z<i4)r-   rB   N)r   r"   r#   h5pyr   
assertTruer&   r   r   r   test_dataset_intermediate_group   s    z.TestCreateData.test_dataset_intermediate_groupc                 C   sH   t jddd}| jjdd|d}| |jd | |d |d dS )	z8 Create from existing data, and make it fit a new shape    r   rI   r   r:      r-   rZ   .N)rC   aranger   r"   r,   r-   assertArrayEqualreshaper]   r   r   r   test_reshape   s    zTestCreateData.test_reshapec              	   C   s*   |  t t| jd j W 5 Q R X dS )zE Binding Dataset to a non-DatasetID identifier fails with ValueError /N)rF   
ValueErrorr   r   idr   r   r   r   test_appropriate_low_level_id   s    z,TestCreateData.test_appropriate_low_level_idc                 C   s`   |j  }t|tjst| |ks*t|d kr@| s\tn| rLt| |ks\td S r   )	rl   get_type
isinstancer   TypeStringIDAssertionErrorget_csetis_variable_strget_size)r   r/   csetlengthtidr   r   r   check_h5_string   s    
zTestCreateData.check_h5_stringc                    sz    fdd}| j jddd | j jdddgd | j jddgdggd | j jd	tjddgtd
d dS )z= Creating dataset with byte string yields vlen ASCII dataset c                    s    j | tjd d d S Nrv   )rx   r   
CSET_ASCIIr/   r   r   r   check_vlen_ascii   s    z?TestCreateData.test_create_bytestring.<locals>.check_vlen_asciia   abcrY   b   defcdrI   Nr   r"   rC   arrayobject)r   r}   r   r   r   test_create_bytestring   s     z%TestCreateData.test_create_bytestringc                 C   s4   | j jdtjddgddd}| j|tjdd d S )	Nr~   r   r   ZS3rI   rY   rd   rz   )r   r"   rC   r   rx   r   r{   r.   r   r   r   test_create_np_s   s    zTestCreateData.test_create_np_sc                    sz    fdd}| j jddd | j jdddgd | j jddgdggd | j jd	tjddgtd
d d S )Nc                    s    j | tjd d d S ry   )rx   r   	CSET_UTF8r|   r   r   r   check_vlen_utf8   s    z;TestCreateData.test_create_strings.<locals>.check_vlen_utf8r~   abcrY   r   defr   r   rI   r   )r   r   r   r   r   test_create_strings   s     z"TestCreateData.test_create_stringsc              	   C   s8   |  t$ | jjdtjddgddd W 5 Q R X d S )Nr~   r   r   ZU3rI   rY   )rF   rG   r   r"   rC   r   r   r   r   r   test_create_np_u   s    zTestCreateData.test_create_np_uc                 C   s*   | j jddd | t| j d j d S )Nr   r   rI   )r   r"   r`   r	   rl   r   r   r   r    test_empty_create_via_None_shape   s    z/TestCreateData.test_empty_create_via_None_shapec                 C   s2   | j jdtjddd | t| j d j d S )Nr   r   rI   rY   )r   r"   r_   Emptyr`   r	   rl   r   r   r   r   !test_empty_create_via_Empty_class   s    z0TestCreateData.test_empty_create_via_Empty_classc              	   C   s2   |  t | jjddtdd W 5 Q R X d S )Nr7   r!   rd   re   )rF   rk   r   r"   rC   rf   r   r   r   r   test_create_incompatible_data   s    z,TestCreateData.test_create_incompatible_dataN)r   r   r   r)   r0   r>   ra   ri   rm   rx   r   r   r   r   r   r   r   r   r   r   r   rX      s   

rX   c                   @   s   e Zd ZdZejdddejdd ejdd fddejdd ejd	d
 fddejd
dd
d
f ejd
d
d
df fddejdd
ddf ejd
d
 fgdd Z	dd Z
dd Zdd Zdd Zd
S )TestReadDirectlyzI
        Feature: Read data directly from Dataset into a Numpy array
    +source_shape,dest_shape,source_sel,dest_seld   r   r:   2   r;   F   Z   Nrb   r:      r   r         	   r9   rR   r9   rd   c           
      C   sl   t jt|dd|}|jd||d}t j|ddd}| }	|| |	|< |||| t j	||	 d S )Nint64rI   r/   rY   )
rC   rf   r
   rh   r"   fullcopyread_directtestingassert_array_equal)
r   writable_filesource_shape
dest_shape
source_seldest_selZsource_valuesr/   arrexpectedr   r   r   test_read_direct   s    	z!TestReadDirectly.test_read_directc                 C   sN   |j ddtjdddd}tjddd}|| tj|tjddd d S )Nr/   r:   r:   r   rI   rY   )r"   rC   rf   r\   r   r   r   r   r   r/   r   r   r   r   test_no_sel   s    
zTestReadDirectly.test_no_selc              	   C   sV   |j ddd}tdd}tt( ||tjdd tjdd  W 5 Q R X d S 	NZedsetr   rI   r   r   r:   r   r;   )r"   rC   r\   rM   raisesrG   r   s_)r   r   
empty_dsetr   r   r   r   
test_empty   s    zTestReadDirectly.test_emptyc              	   C   s>   |j dddd}td}tt || W 5 Q R X d S Nr/   r   r   rI      r"   rC   r\   rM   r   rG   r   r   r   r   r   test_wrong_shape   s    
z!TestReadDirectly.test_wrong_shapec              	   C   sB   |j dddd}tjddd}tt || W 5 Q R X d S Nr/   r^   r   rI   F)orderr   r   r   r   r   test_not_c_contiguous  s    z&TestReadDirectly.test_not_c_contiguous)r   r   r   r)   rM   markparametrizerC   r   r   r   r   r   r   r   r   r   r   r      s   .$

r   c                   @   s   e Zd ZdZejdddejdd ejdd fddejdd ejd	d
 fddejd
dd
d
f ejd
d
d
df fddejdd
ddf ejd
d
 fgdd Z	dd Z
dd Zdd Zd
S )TestWriteDirectlyz>
        Feature: Write Numpy array directly into Dataset
    r   r   r   r:   r   r;   r   r   Nr   r   r   r   r   rR   r9   rd   c           	      C   sj   |j d|ddd}tt||}tj|ddd}|| ||< |||| tj|d d  | d S )Nr/   int32r   rB   	fillvaluerI   )	r"   rC   rf   r
   rh   r   write_directr   r   )	r   r   r   r   r   r   r/   r   r   r   r   r   test_write_direct  s    	z#TestWriteDirectly.test_write_directc              	   C   sP   |j ddd}tt. |tdtjdd tjdd  W 5 Q R X d S r   )r"   rM   r   rG   r   rC   r\   r   )r   r   r   r   r   r   r   !  s    zTestWriteDirectly.test_emptyc              	   C   s>   |j dddd}td}tt || W 5 Q R X d S r   r"   rC   r\   rM   r   rG   r   r   r   r   r   r   &  s    
z"TestWriteDirectly.test_wrong_shapec              	   C   sB   |j dddd}tjddd}tt || W 5 Q R X d S r   r   r   r   r   r   r   ,  s    z'TestWriteDirectly.test_not_c_contiguous)r   r   r   r)   rM   r   r   rC   r   r   r   r   r   r   r   r   r   r     s   .$
r   c                   @   sP   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S )TestCreateRequirezS
        Feature: Datasets can be created only if they don't exist in the file
    c                 C   s.   | j ddd}| |t | |jd dS )z& Create new dataset with no conflicts r   rc   r   N)r   require_datasetr#   r   r,   r-   r.   r   r   r   test_create9  s    zTestCreateRequire.test_createc                 C   s0   | j ddd}| j ddd}| || dS )z) require_dataset yields existing dataset r   rc   r   Nr   r   r,   rS   r   r   r   test_create_existing?  s    z&TestCreateRequire.test_create_existingc                 C   s   | j ddd}| j ddd}| || | j ddd}| j ddd}| || | j ddd}| j ddd}| || dS )	z; require_dataset with integer shape yields existing datasetr   r:   r   r7   r   Zbazs   bazNr   rS   r   r   r   test_create_1DE  s    z TestCreateRequire.test_create_1Dc              	   C   s:   | j ddd | t | j ddd W 5 Q R X dS )z6 require_dataset with shape conflict yields TypeError r   rc   r   )r:   r!   Nr   r"   rF   rG   r   r   r   r   r   test_shape_conflictS  s    z%TestCreateRequire.test_shape_conflictc              	   C   s6   | j d | t | j ddd W 5 Q R X dS )z< require_dataset with object type conflict yields TypeError r   rc   r   N)r   Zcreate_grouprF   rG   r   r   r   r   r   test_type_conflictY  s    z$TestCreateRequire.test_type_conflictc              	   C   s:   | j ddd}| t | j ddd W 5 Q R X dS )zL require_dataset with dtype conflict (strict mode) yields TypeError
        r   rc   r   ZS10Nr   r.   r   r   r   test_dtype_conflict_  s    z%TestCreateRequire.test_dtype_conflictc                 C   s4   | j ddd}| j jddddd}| || dS )z* require_dataset with exactly dtype match r   rc   r   TexactN)r   r"   r   r,   rS   r   r   r   test_dtype_exactf  s    z"TestCreateRequire.test_dtype_exactc                 C   sH   | j ddd}| j jddddd}| || | |jtd dS )zJ require_dataset with convertible type succeeds (non-strict mode)
        r   rc   i4i2Fr   N)r   r"   r   r,   rB   rC   rS   r   r   r   test_dtype_closem  s    z"TestCreateRequire.test_dtype_closeN)r   r   r   r)   r   r   r   r   r   r   r   r   r   r   r   r   r   3  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S )TestCreateChunkedzL
        Feature: Datasets can be created by manually specifying chunks
    c                 C   s$   | j jdddd}| |jd dS )z Create via chunks tuple r   r   r   r-   chunksNr   r"   r,   r   r.   r   r   r   test_create_chunks|  s    z$TestCreateChunked.test_create_chunksc                 C   s$   | j jdddd}| |jd dS )z Create via chunks integer r   r   r:   r   r   Nr   r.   r   r   r   test_create_chunks_integer  s    z,TestCreateChunked.test_create_chunks_integerc              	   C   s,   |  t | jjdddd W 5 Q R X dS )z& Illegal chunk size raises ValueError r   r   r   r   NrF   rk   r   r"   r   r   r   r   test_chunks_mismatch  s    z&TestCreateChunked.test_chunks_mismatchc              	   C   s.   |  t | jjddddd W 5 Q R X dS )z3 Chunked format required for given storage options r   r   r   F)r-   maxshaper   Nr   r   r   r   r   test_chunks_false  s    z#TestCreateChunked.test_chunks_falsec              	   C   s,   |  t | jjdddd W 5 Q R X dS )z> Attempting to create chunked scalar dataset raises TypeError r   r   )r   r   NrE   r   r   r   r   test_chunks_scalar  s    z$TestCreateChunked.test_chunks_scalarc                 C   s6   | j jdddd}| |jt | t|jd dS )z Auto-chunking of datasets r   )r   r   Tr   rR   N)r   r"   r#   r   tupler,   lenr.   r   r   r   test_auto_chunks  s    z"TestCreateChunked.test_auto_chunksc                 C   s&   | j jddddd}| |jd dS )z7 Auto-chunking with pathologically large element sizes r   rd   Z
S100000000Tr-   rB   r   r1   Nr   r.   r   r   r   test_auto_chunks_abuse  s    z(TestCreateChunked.test_auto_chunks_abusec                 C   s   | j jddtjdd}d|ddddf< | t|ddddf dk d	|d< | t|d d	k d
|dd< | t|dd d
k dS )z+ Test scalar assignment of chunked dataset r   )rd   r   r   )r   r   r   r   r:   r   N(         r   rR   )r   r"   rC   r   r`   allr.   r   r   r   test_scalar_assignment  s    
 "z(TestCreateChunked.test_scalar_assignmentc              	   C   s\   t jtdd}| jjdddd W 5 Q R X t jtdd}| jjdddd W 5 Q R X d	S )
z, Auto-chunking of empty datasets not allowedr   )matchr   ZS100T)rB   r   r   rB   r   N)rM   r   rG   r   r"   )r   errr   r   r   test_auto_chunks_no_shape  s    z+TestCreateChunked.test_auto_chunks_no_shapeN)r   r   r   r)   r   r   r   r   r   r   r   r   r   r   r   r   r   r   v  s   r   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 )TestCreateFillvaluez>
        Feature: Datasets can be created with fill value
    c                 C   s6   | j jdddd}| |d d | |d d dS )z- Fill value is reflected in dataset contents r   r   g      @r   r   r   N)r   r"   r,   r.   r   r   r   test_create_fillval  s    z'TestCreateFillvalue.test_create_fillvalc                 C   s4   | j jdddd}| |jd | |jtj dS )z( Fill value is recoverable via property r   r   g      @r   N)r   r"   r,   r   ZassertNotIsInstancerC   ndarrayr.   r   r   r   test_property  s    z!TestCreateFillvalue.test_propertyc                 C   s    | j dd}| |jd dS )z0 .fillvalue property works correctly if not set r   r   r   N)r   r"   r,   r   r.   r   r   r   test_property_none  s    z&TestCreateFillvalue.test_property_nonec                 C   sV   t ddg}t jd|dd }| jjdd||d}| |j| | |d	 | d
S )z& Fill value works with compound types )r~   f4)r   i8r1   rI   r   r   r   r   r!   N)rC   rB   r\   r   r"   r,   r   ZassertAlmostEqual)r   dtvr/   r   r   r   test_compound  s
    z!TestCreateFillvalue.test_compoundc              	   C   s2   |  t | jjddddgdd}W 5 Q R X dS )z$ Bogus fill value raises ValueError r   r   r~   i)r   r   *   r   Nr   r.   r   r   r   test_exc  s
    
 zTestCreateFillvalue.test_excN)	r   r   r   r)   r   r   r   r   r  r   r   r   r   r     s   r   zdt,expected        utf-8r   encodingrv       asciir  c                 C   s"   |j dd| d}|j|kstd S )Nr   r   rI   )r"   r   rq   )r   r   r   r/   r   r   r   test_get_unset_fill_value  s    r  c                   @   s   e Zd ZdZdd ZdS )TestCreateNamedTypezC
        Feature: Datasets created from an existing named type
    c                 C   sn   t d| jd< | jjdd| jd d}| |jt d | |j | jd j | |j   dS )z7 Named type object works and links the dataset to type Zf8typexr   rI   N)	rC   rB   r   r"   r,   rl   rn   r`   Z	committedr.   r   r   r   
test_named  s
    zTestCreateNamedType.test_namedN)r   r   r   r)   r  r   r   r   r   r    s   r  gzipzDEFLATE is not installedc                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )TestCreateGzipz=
        Feature: Datasets created with gzip compression
    c                 C   s4   | j jddddd}| |jd | |jd dS )z# Create with explicit gzip options r   r   rb   r  r   compressioncompression_optsNr   r"   r,   r  r  r.   r   r   r   	test_gzip  s
    zTestCreateGzip.test_gzipc                 C   s2   | j jdddd}| |jd | |jd dS )z+ Create with implicit gzip level (level 4) r   r  r  r  r!   Nr  r.   r   r   r   test_gzip_implicit  s    z!TestCreateGzip.test_gzip_implicitc              	   C   s   | j jdddd}| |jd | |jd tjjj}z8t	 tjj_| 
t | j jdddd}W 5 Q R X W 5 |tjj_X dS )z. Create with gzip level by specifying integer r   r  r   r  r  N)r   r"   r,   r  r  r_   _hldataset_LEGACY_GZIP_COMPRESSION_VALSr   rF   rk   )r   r/   original_compression_valsr   r   r   test_gzip_number  s    
 zTestCreateGzip.test_gzip_numberc              	   C   s   |  ttf | jjdddd W 5 Q R X |  t | jjdddd W 5 Q R X |  t | jjddddd W 5 Q R X dS )	z= Illegal gzip level (explicit or implicit) raises ValueError r   r     r  r  r  N)rF   rk   RuntimeErrorr   r"   r   r   r   r   test_gzip_exc#  s    zTestCreateGzip.test_gzip_excN)r   r   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 )TestCreateCompressionNumberz?
        Feature: Datasets created with a compression code
    c                 C   s`   t jjj}z(t t jj_| jjddt jjdd}W 5 |t jj_X | 	|j
d | 	|jd dS )z^ Create with compression number of gzip (h5py.h5z.FILTER_DEFLATE) and a compression level of 7r   r  )r   r  r  r   N)r_   r  r  r  r   r   r"   h5zFILTER_DEFLATEr,   r  r  )r   r  r/   r   r   r   test_compression_number5  s    
z3TestCreateCompressionNumber.test_compression_numberc              	   C   s   |  t}| jjdddd W 5 Q R X | dt|j |  t}| jjdddd W 5 Q R X | dt|j tjj	j
}z<t tjj	_
|  t | jjddtjjd W 5 Q R X W 5 |tjj	_
X dS )	z* Create with invalid compression numbers  r   r  ir  zInvalid filterr   zUnknown compressionN)rF   rk   r   r"   ZassertInr%   	exceptionr_   r  r  r  r   
IndexErrorr%  r&  )r   er  r   r   r   test_compression_number_invalidA  s    
$z;TestCreateCompressionNumber.test_compression_number_invalidN)r   r   r   r)   r'  r+  r   r   r   r   r$  .  s   r$  lzfzLZF is not installedc                   @   s    e Zd ZdZdd Zdd ZdS )TestCreateLZF<
        Feature: Datasets created with LZF compression
    c                 C   s   | j jdddd}| |jd | |jd td}| j jd|dd}| |jd | |jd | j   | j d d	 }| || dS )
z Create with explicit lzf r   r  r,  r  Nr   r7   )rZ   r  r   )	r   r"   r,   r  r  rC   rf   flushrg   )r   r/   testdatareaddatar   r   r   test_lzf]  s    

zTestCreateLZF.test_lzfc              	   C   s.   |  t | jjddddd W 5 Q R X dS )z& Giving lzf options raises ValueError r   r  r,  r!   r  Nr   r   r   r   r   test_lzf_excm  s    zTestCreateLZF.test_lzf_excN)r   r   r   r)   r2  r3  r   r   r   r   r-  V  s   r-  szipzSZIP is not installedc                   @   s   e Zd ZdZdd ZdS )TestCreateSZIPr.  c                 C   s   | j jddddd}dS )z Create with explicit szip r   r  r4  )ec   r  N)r   r"   r.   r   r   r   	test_szip{  s    zTestCreateSZIP.test_szipN)r   r   r   r)   r8  r   r   r   r   r5  t  s   r5  shufflezSHUFFLE is not installedc                   @   s   e Zd ZdZdd ZdS )TestCreateShufflez8
        Feature: Datasets can use shuffling filter
    c                 C   s"   | j jdddd}| |j dS )z Enable shuffle filter r   r  T)r9  N)r   r"   r`   r9  r.   r   r   r   test_shuffle  s    zTestCreateShuffle.test_shuffleN)r   r   r   r)   r;  r   r   r   r   r:    s   r:  
fletcher32zFLETCHER32 is not installedc                   @   s   e Zd ZdZdd ZdS )TestCreateFletcher32z=
        Feature: Datasets can use the fletcher32 filter
    c                 C   s"   | j jdddd}| |j dS )z Enable fletcher32 filter r   r  T)r<  N)r   r"   r`   r<  r.   r   r   r   test_fletcher32  s    z$TestCreateFletcher32.test_fletcher32N)r   r   r   r)   r>  r   r   r   r   r=    s   r=  scaleoffsetzSCALEOFFSET is not installedc                   @   sH   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S )TestCreateScaleOffsetz?
        Feature: Datasets can use the scale/offset filter
    c              	   C   s.   |  t | jjddtdd}W 5 Q R X dS )z[ Ensure that a scale factor is required for scaleoffset compression of floating point data r   r  TrB   r?  NrF   rk   r   r"   floatr.   r   r   r    test_float_fails_without_options  s    z6TestCreateScaleOffset.test_float_fails_without_optionsc              	   C   s.   |  t | jjddtdd}W 5 Q R X dS )z# Check when scaleoffset is negetiver   r  grA  NrB  r.   r   r   r   test_non_integer  s    z&TestCreateScaleOffset.test_non_integerc              	   C   s.   |  t | jjddtdd}W 5 Q R X dS )z% Check when dtype is unsupported typer   r  TrA  N)rF   rG   r   r"   boolr.   r   r   r   test_unsupport_dtype  s    z*TestCreateScaleOffset.test_unsupport_dtypec                 C   s   d}d}dd|  }t jj| d | }| jjd|t|d}|jdk	sJt||d	< | jj}| j	  t
|d
| _| jd d	 }| j||d|  d ||k rtdS )z2 Scaleoffset filter works for floating point data r!   r   i,  r   r:   g      ?r   rA  N.r)	precision)rC   randomrandr   r"   rC  r?  rq   filenamer   r_   r   rg   r   )r   Zscalefacr-   ranger0  r/   rM  r1  r   r   r   
test_float  s    
z TestCreateScaleOffset.test_floatc                 C   s   d}d}t jjdd| d |d}| jjd|tdd	}|jd
k	sDt||d< | jj}| j	  t
|d| _| jd d }| || d
S )zB Scaleoffset filter works for integer data with default precision r   rH  r   rR   r   r=   r   TrA  N.rI  )rC   rK  randintr   r"   intr?  rq   rM  r   r_   r   rg   r   nbitsr-   r0  r/   rM  r1  r   r   r   test_int  s    
zTestCreateScaleOffset.test_intc                 C   s   d}d}t jjdd| |d}| jjd|t|d}| |jdk ||d< | jj}| j	  t
|d	| _| jd d }| || d
S )D Scaleoffset filter works for integer data with specified precision r   rH  r   rR   rP  r   rA  .rI  N)rC   rK  rQ  r   r"   rR  r`   r?  rM  r   r_   r   rg   rS  r   r   r   test_int_with_minbits  s    
z+TestCreateScaleOffset.test_int_with_minbitsc                 C   s   d}d}t jjdd|d  d |d}| jjd|t|d}| |jdk ||d	< | jj}| j	  t
|d
| _| jd d	 }||k rtdS )rV  r   rH  r   rR   r   rP  r   rA  .rI  N)rC   rK  rQ  r   r"   rR  r`   r?  rM  r   r_   r   r   rq   rS  r   r   r   test_int_with_minbits_lossy  s    
z1TestCreateScaleOffset.test_int_with_minbits_lossyN)r   r   r   r)   rD  rE  rG  rO  rU  rW  rX  r   r   r   r   r@    s   r@  c                   @   s@   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S )TestExternalzB
        Feature: Datasets with the external storage property
    c           
   	   C   s   d}t j|}|  }|dtjfg}| jjd||j|dd}||d< |jdk	sTt	t
|d}| }W 5 Q R X || kst	tjjd	krt|j    }t| jjj }	||	kst	dS )
z' Create and access an external dataset r9   r   r   r   z	${ORIGIN}rB   externalefile_prefix.Nrbr   r:   r   )rC   rK  r   r   	UNLIMITEDr   r"   rB   r\  rq   openreadtobytesr_   r   hdf5_version_tuplepathlibPathrl   get_access_plistget_efile_prefixdecodeas_posixrM  parent)
r   r-   r0  ext_filer\  r/   fidcontentsr]  rk  r   r   r   test_contents  s    zTestExternal.test_contentsc              	   C   s  d}t j|}|  }tj|dtjfg}| jj	d||j
|tj|d}||d< |jdk	sdtt|d}| }W 5 Q R X || ksttjjdkrt|j    }t|j }	||	kst| jjd||j
tj|d	}
|
jdk	st|
d
 |k dS )z< Create and access an external dataset using an efile_prefixrZ  r   r   r[  .Nr^  r_  )r]  r   )rC   rK  r   ospathbasenamer   r`  r   r"   rB   dirnamer\  rq   ra  rb  rc  r_   r   rd  re  rf  rl   rg  rh  ri  rj  rk  r   )r   r-   r0  rl  r\  r/   rm  rn  r]  rk  rT   r   r   r   test_contents_efile_prefix*  s"     z'TestExternal.test_contents_efile_prefixc                 C   s   | j jdd|  d dS )z/ External argument may be a file name str only r   rZ  r\  N)r   r"   r   r   r   r   r   test_name_strH  s    zTestExternal.test_name_strc                 C   s    | j jddt|  d dS )z0 External argument may be a file name path only r   rZ  ru  N)r   r"   re  rf  r   r   r   r   r   test_name_pathM  s    
zTestExternal.test_name_pathc                    sN   |    d}t fddt|D }| jjdd|d}t|j|ksJtdS )z9 External argument may be an iterable of multiple tuples r   c                 3   s   | ]} |d  d fV  qdS )  Nr   .0r  rl  r   r   	<genexpr>X  s     z/TestExternal.test_iter_multi.<locals>.<genexpr>ZpoorZ  ru  N)r   iterrN  r   r"   r   r\  rq   )r   Nr\  r/   r   r{  r   test_iter_multiS  s
    zTestExternal.test_iter_multic              
   C   s   d}|   }t|gft|dgft|dtjgft|fgft|dfgft|dtjdfgft|ddfgffD ]0\}}| | | jjd||d W 5 Q R X qfdS )z" Test with invalid external lists rZ  r   zh5f.UNLIMITEDr   ru  N)r   rG   r   r`  rk   rF   r   r"   )r   r-   rl  exc_typer\  r   r   r   test_invalid\  s    

	zTestExternal.test_invalidN)
r   r   r   r)   ro  rt  rv  rw  r  r  r   r   r   r   rY    s   	rY  c                   @   s2   e Zd ZdZdddZdd Zdd Zd	d
 ZdS )TestAutoCreatezP
        Feature: Datasets auto-created from data produce the correct types
    Tc                 C   sB   |j  }| t|tjj | | | |r>| s>t	d S r   )
rl   rn   r,   r  r_   r   rp   rr   rs   rq   )r   r'   ru   variablerw   r   r   r   assert_string_typet  s
    
z!TestAutoCreate.assert_string_typec                 C   sx   d| j d< | | j d tjj ddg| j d< | | j d tjj tjddgtjd| j d< | | j d tjj dS )	z<Assigning byte strings produces a vlen string ASCII dataset s   Hello therer     as   bcyrI   zN)r   r  r_   r   r{   rC   r   object_r   r   r   r   test_vlen_bytes{  s    
zTestAutoCreate.test_vlen_bytesc                 C   s   dt d | jd< | | jd tjj ddg| jd< | | jd tjj tjddggtjd| jd< | | jd tjj d	S )
z?Assigning unicode strings produces a vlen string UTF-8 dataset Hello there4   r  r~   bcr  rI   r  N)	chrr   r  r_   r   r   rC   r   r  r   r   r   r   test_vlen_unicode  s    z TestAutoCreate.test_vlen_unicodec                 C   sH   t d| jd< | jd }| j|tjjdd | |j	 
 d dS )zV Assignment of fixed-length byte string produces a fixed-length
        ascii dataset r  r  F)r  r   N)rC   string_r   r  r_   r   r{   r,   rl   rn   rt   r&   r   r   r   test_string_fixed  s    
z TestAutoCreate.test_string_fixedN)T)r   r   r   r)   r  r  r  r  r   r   r   r   r  o  s
   
r  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )TestCreateLikec                 C   sV   t ddd| jd< | jd| jd  | jd }| |jd | |jd  d S )N   r   ZlolZlike_lol)r   r   )	rC   rf   rh   r   create_dataset_liker,   r-   ZassertIsr   )r   Zdsliker   r   r   test_no_chunks  s
    
zTestCreateLike.test_no_chunksc                 C   s   | j jdtddd}| dtj|jj	 | j 
d|}| dtj|jj	 | j jdtddd}| dtj|jj	 | j 
d	|}| dtj|jj	 d S )
NZhondar   T)rZ   track_timesr   ZhyundaiZibmFZlenovo)r   r"   rC   rf   assertNotEqualr_   h5gget_objinfo_idmtimer  r,   )r   origsimilarr   r   r   test_track_times  s    zTestCreateLike.test_track_timesc                 C   s@   | j jdddd}| j d|}| |jd | |jd dS )z) Test when other.maxshape != other.shape otherr   r   r   simr   N)r   r"   r  r,   r-   r   )r   r  r  r   r   r   test_maxshape  s    zTestCreateLike.test_maxshapeN)r   r   r   r  r  r  r   r   r   r   r    s   r  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )TestChunkIteratorc              	   C   s0   | j dd}| t |  W 5 Q R X d S )Nr   r   )r   r"   rF   rG   iter_chunksr.   r   r   r   r    s    z TestChunkIterator.test_no_chunksc                 C   s   | j jdddd}tdddftdddftdd	dftd	d
dff}| t| t| tdddftdd	dftd	ddff}| t|tjdd t| d S )Nr   r   )    r   r   r  r   @   `   r   r   a   r   r"   slicer,   listr  rC   r   r   r/   r   r   r   r   test_1d  s    $(zTestChunkIterator.test_1dc                 C   s(  | j jdddd}tdddtdddftdddtdd	dftdddtdddftdddtdd	dftdd
dtdddftdd
dtdd	dftd
d	dtdddftd
d	dtdd	dff}| t| t| tdddtdddff}| t|tjddddf t| d S )Nr   r   r   )r  r  r  r   r  r   r  r   r  0   4   r   r   r  r  r   r   r   test_2d  s$     
 

 

zTestChunkIterator.test_2dN)r   r   r   r  r  r  r   r   r   r   r    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S )
TestResizezF
        Feature: Datasets created with "maxshape" may be resized
    c                 C   s2   | j jdddd}| |jd | |jd dS )z  Create dataset with "maxshape" r   r  r   r;   r  Nr   r"   ZassertIsNotr   r,   r   r.   r   r   r   r     s    zTestResize.test_createc                 C   sR   | j jdddd}| |jd | |jd | j jdddd}| |jd dS )z6 Create dataset with "maxshape" using integer maxshaper   r  r   r  Nr7   r  r.   r   r   r   r     s
    zTestResize.test_create_1Dc                 C   sT   | j jdddd}| |jd |d | |jd |d | |jd dS )z( Datasets may be resized up to maxshape r   r  r  r  r   r   Nr   r"   r,   r-   resizer.   r   r   r   test_resize  s    

zTestResize.test_resizec                 C   s<   | j jdddd}| |jd |d | |jd dS )z> Datasets may be resized up to maxshape using integer maxshaper   r   r   r  r  )rb   Nr  r.   r   r   r   test_resize_1D  s    
zTestResize.test_resize_1Dc              	   C   s6   | j jdddd}| t |d W 5 Q R X dS )z. Resizing past maxshape triggers an exception r   r  r  r  )r   r   N)r   r"   rF   	Exceptionr  r.   r   r   r   test_resize_over  s    zTestResize.test_resize_overc              	   C   s2   | j dd}| t |d W 5 Q R X dS )z/ Resizing non-chunked dataset raises TypeError r   r  r  N)r   r"   rF   rG   r  r.   r   r   r   test_resize_nonchunked  s    z!TestResize.test_resize_nonchunkedc                 C   s2   | j jdddd}|jddd | |jd d	S )
z Resize specified axis r   r  r  r  r   r   Zaxisr  N)r   r"   r  r,   r-   r.   r   r   r   test_resize_axis  s    zTestResize.test_resize_axisc              	   C   s:   | j jdddd}| t |jddd W 5 Q R X dS )	z  Illegal axis raises ValueError r   r  r  r  r   rR   r  N)r   r"   rF   rk   r  r.   r   r   r   test_axis_exc  s    zTestResize.test_axis_excc                 C   s2   | j jdddd}| |jd | |jd dS )z? Allow zero-length initial dims for unlimited axes (issue 111) r   )   r   )r  Nr  N)r   r"   r,   r-   r   r.   r   r   r   test_zero_dim  s    zTestResize.test_zero_dimN)r   r   r   r)   r   r   r  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 )	TestDtypezD
        Feature: Dataset dtype is available as .dtype property
    c                 C   s(   | j ddd}| |jtd dS )z Retrieve dtype from dataset r   r   |S10NrA   r.   r   r   r   
test_dtype  s    zTestDtype.test_dtypec                 C   s<   t dt jfdt jfg}| jdd|}| |j| dS )z7 Retrieve dtype from complex float16 dataset (gh-2156) rI  r  r   r  N)rC   rB   float16r   r"   r,   )r   Z	complex32r/   r   r   r   test_dtype_complex32#  s    zTestDtype.test_dtype_complex32N)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 )TestLenzG
        Feature: Size of first axis is available via Python's len
    c                 C   s"   | j dd}| t|d dS )z Python len() (under 32 bits) r   )8  r  r  N)r   r"   r,   r   r.   r   r   r   test_len1  s    zTestLen.test_lenc              	   C   sj   | j dd}| |jd tjdkrF| t t| W 5 Q R X n| t|d | | d dS )z Python len() vs Dataset.len() r   )        r  ir  N)	r   r"   r,   r-   sysmaxsizerF   OverflowErrorr   r.   r   r   r   test_len_big6  s    
zTestLen.test_len_bigN)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 )TestIterz;
        Feature: Iterating over a dataset yields rows
    c                 C   sX   t jdddd}| jjd|d}t||D ]$\}}| t|d | || q.dS )	z& Iterating over a dataset yields rows rb   r   rI   rc   r   rY   rd   N)	rC   rf   rh   r   r"   zipr,   r   rg   )r   rZ   r/   r  r  r   r   r   	test_iterH  s
    zTestIter.test_iterc              	   C   s8   | j jddd}| t dd |D  W 5 Q R X dS )z0 Iterating over scalar dataset raises TypeError r   r   )r-   c                 S   s   g | ]}|qS r   r   ry  r   r   r   
<listcomp>T  s     z-TestIter.test_iter_scalar.<locals>.<listcomp>N)r   r"   rF   rG   r.   r   r   r   test_iter_scalarP  s    zTestIter.test_iter_scalarN)r   r   r   r)   r  r  r   r   r   r   r  B  s   r  c                   @   s   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d Zdd Zd d! Zd"d# Zd$S )%TestStringszr
        Feature: Datasets created with vlen and fixed datatypes correctly
        translate to and from HDF5
    c                 C   sn   t jdd}| jjdd|d}|j }| t|t jj	 | |
 t jj t |j}| |jd dS )z3 Vlen bytes dataset maps to vlen ascii in the file r
  r  r  r   rI   N)r_   string_dtyper   r"   rl   rn   r,   r  r   rp   rr   r{   check_string_dtyperB   r  r   r   r'   rw   Zstring_infor   r   r   r  ^  s    
zTestStrings.test_vlen_bytesc                 C   sp   t jdd}d}| jjdd||d}| | jd d | | | jd  d |  | | jd j| dS )	& Vlen bytes dataset handles fillvalue r
  r     barr  r   r   r   Nr_   r  r   r"   r,   asstrri  r   r   r   Z
fill_valuer'   r   r   r   test_vlen_bytes_fillvalueh  s    z%TestStrings.test_vlen_bytes_fillvaluec                 C   sj   t  }| jjdd|d}|j }| t|t jj	 | |
 t jj t |j}| |jd dS )z5 Vlen unicode dataset maps to vlen utf-8 in the file r  r   rI   r  N)r_   r  r   r"   rl   rn   r,   r  r   rp   rr   r   r  rB   r  r  r   r   r   r  q  s    
zTestStrings.test_vlen_unicodec                 C   st   t  }d}| jjdd||d}| | jd d |d | | jd  d | | | jd j|d dS )( Vlen unicode dataset handles fillvalue    bárr  r   r   r   r  N)r_   r  r   r"   r,   encoder  r   r  r   r   r   test_vlen_unicode_fillvalue{  s    z'TestStrings.test_vlen_unicode_fillvaluec                 C   s   t d}| jjdd|d}|j }| t|tj	j
 | |  | | d | | tj	j t|j}| |jd | |jd dS )zK Fixed-length bytes dataset maps to fixed-length ascii in the file
        r  r  r   rI   r:   r
  N)rC   rB   r   r"   rl   rn   r,   r  r_   r   rp   ZassertFalsers   rt   rr   r{   r  r  rv   r  r   r   r   test_fixed_ascii  s    

zTestStrings.test_fixed_asciic                 C   sr   t jddd}d}| jjdd||d}| | jd d | | | jd  d |  | | jd j| d	S )
r  r
  r:   r  r  r  r   r   r   Nr  r  r   r   r   test_fixed_bytes_fillvalue  s    z&TestStrings.test_fixed_bytes_fillvaluec              	   C   s  t jddd}| jjdd|d}|j }| | t jj	 d}|
d|d< ||d	< ||g|d
d< tj||gtd|dd< tj|
dgd
 |d|dd< | t  tj||gdd|dd< W 5 Q R X tj|d d tj|
dgd dd d S )Nr  r   r  r  r   rI      cùr   r   rR   r!   r9      Ur:   S)r_   r  r   r"   rl   rn   r,   rr   r   r   r  rC   r   r   rF   rG   r   r   )r   r   r'   rw   sr   r   r   test_fixed_utf8  s    
"$zTestStrings.test_fixed_utf8c                 C   sz   t jddd}dd}| jjdd||d}| | jd d | | | jd  d |d | | jd j| d	S )
r  r  r:   r  r  r  r   r   r   N)	r_   r  r  r   r"   r,   r  ri  r   r  r   r   r   test_fixed_utf_8_fillvalue  s    
 z&TestStrings.test_fixed_utf_8_fillvaluec              	   C   s6   t d}| t | jjdd|d}W 5 Q R X dS )zA Fixed-length unicode datasets are unsupported (raise TypeError) z|U10r  r   rI   N)rC   rB   rF   rG   r   r"   r   r   r'   r   r   r   test_fixed_unicode  s    
zTestStrings.test_fixed_unicodec                 C   sR   t jdd}| jjdd|d}d}||d< |d }| t|t | || dS )	zN writing and reading to vlen bytes dataset preserves type and content
        r
  r  r  r   rI      Hellor   N)r_   r  r   r"   r,   r  bytesr   r   r'   rZ   outr   r   r   test_roundtrip_vlen_bytes  s    z%TestStrings.test_roundtrip_vlen_bytesc                 C   sR   t d}| jjdd|d}d}||d< |d }| t|t j | || dS )z[ Writing to and reading from fixed-length bytes dataset preserves
        type and content r  r  r   rI   r  r   N)rC   rB   r   r"   r,   r  r  r  r   r   r   test_roundtrip_fixed_bytes  s    
z&TestStrings.test_roundtrip_fixed_bytesc                 C   s^   t  }| jjdd|d}d}||d< | |d t | d }| |t | || d S )Nr  r   rI      fàilter   )	r_   r  r   r"   r#   r  r  r%   r,   r  r   r   r   test_retrieve_vlen_unicode  s    z&TestStrings.test_retrieve_vlen_unicodec              	   C   s   | j jddt d}d}||d< |d}| t |d }W 5 Q R X | |ddd d | |d	d | | d
t	|  t
j| d d t
j|gtd t
jt
| d d t
j|gtd d S )Nr  r   rI   r  r   r
  ignoreZfiltelatin-1r:   r   )r   r"   r_   r  r  rF   UnicodeDecodeErrorr,   r  r   rC   r   r   r   r   asarray)r   r'   rZ   Zstrwrap1r  r   r   r   
test_asstr  s"    
  zTestStrings.test_asstrc                 C   s   t jdd}| jjdd|d}d}tj|d|d|d< | |d tj |	 d }| |t
 | || | |	d	d
d d | |	dd | tj|	 d d tj|gtd d S )Nr   rz   r  r   rI   r  r  r   r
  r  r   r  r   )r_   r  r   r"   rC   r   r  r#   bytes_r  r%   r,   r  r   r   r   r  r   r   r   test_asstr_fixed  s     zTestStrings.test_asstr_fixedc              	   C   sB   t d}| jjdd|d}d}| t ||d< W 5 Q R X dS )zGEncoding error when writing a non-ASCII string to an ASCII vlen datasetr
  r  r   rI   r  r   N)r_   r  r   r"   rF   UnicodeEncodeError)r   r   r'   rZ   r   r   r   test_unicode_write_error  s
    
z$TestStrings.test_unicode_write_errorc                 C   s\   t  }| jjdd|d}dtd d}||d< |d }| t|t | || dS )	zJ Writing valid utf-8 byte strings to a unicode vlen dataset is OK
        r  r   rI   r  r  utf8r   N)	r_   r  r   r"   r  r  r,   r  r  r  r   r   r   test_unicode_write_bytes  s    z$TestStrings.test_unicode_write_bytesc                 C   sV   t d}| jjdd|d}d}||d< |d }| t|t | ||d dS )z: Writing an ascii str to ascii vlen dataset is OK
        r
  r  r   rI   zASCII stringr   N)r_   r  r   r"   r,   r  r  r  r  r   r   r   test_vlen_bytes_write_ascii_str  s    
z+TestStrings.test_vlen_bytes_write_ascii_strN)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  W  s$   
	
			
r  c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	TestCompoundz:
        Feature: Compound types correctly round-trip
    c              
   C   s   t dt jfdt jfdt jfdt jfdt jfdt jfdt jfg}t jd|d	}|jD ]}t jdd
 ||< qV|| jd< | jd d }| 	t 
||k | |j|j dS )z: Compound types are read back in correct order (issue 236)weightZcputimeZwalltimeZparents_offsetZ	n_parentsstatusendpoint_typer7  rI   r   test.N)rC   rB   float64Zuint32uint8r   fieldsrK  r   r`   r   r,   )r   r   r0  keyoutdatar   r   r   test_rt0  s    

zTestCompound.test_rtc                 C   s   t dt jdffdt jfg}t jd|d}|jD ] }t jj|| jdd ||< q2| jj	dd|d}|jD ]}|| ||< ql| jd d	 }| 
t ||k | |j|j d S )
Nr  rd   r  r  rI   rP  r   r  .)rC   rB   r	  r
  r   r  rK  r-   r   r"   r`   r   r,   )r   r   r0  r  r'   r  r   r   r   test_assignD  s    

zTestCompound.test_assignc                 C   s@  t dt jfdt jfdt jfg}t jd|d}|jD ]}t jdd ||< q6|| jd< t j| jd ddgd d  |ddg  t j| jd dd d  |d  t jt 	| jd ddg|ddg  t dt j
fg}t jt j	| jd dg|d|dg | t| jd ddks<td S )	Nr  r  r  r  rI   r   r  r7  )rC   rB   r	  r   r  rK  r   r   r   r  r   astyper   rq   )r   r   r0  r  Zdt_intr   r   r   test_fieldsU  s6    

 
  
zTestCompound.test_fieldsN)r   r   r   r)   r  r  r  r   r   r   r   r  *  s   r  c                   @   s   e Zd Zdd Zdd ZdS )TestSubarrayc                 C   st   | j jdddd}dddg|d< tj|d d  dddgg d	d
dgg|d d < tj|d d  d	d
dgg d S Nr~   r1   Z3int8rI   r   rR   rd   r   r!   r   r9   )r   r"   rC   r   r   r&   r   r   r   test_write_listz  s
    zTestSubarray.test_write_listc                 C   s   | j jdddd}tdddg|d< tj|d d  dddgg td	d
dgg|d d < tj|d d  d	d
dgg d S r  )r   r"   rC   r   r   r   r&   r   r   r   test_write_array  s
    zTestSubarray.test_write_arrayN)r   r   r   r  r  r   r   r   r   r  y  s   r  c                   @   s,   e Zd ZdZddddZdd Zdd	 Zd
S )TestEnumzM
        Feature: Enum datatype info is preserved, read/write as integer
    r   r   r  )ZREDZGREENZBLUEc                 C   sD   t j| jdd}| jjdd|d}|j}t |}| || j dS )z= Enum datasets can be created and type correctly round-trips r  Zbasetyper  r  rI   N)r_   
enum_dtypeEDICTr   r"   rB   Zcheck_enum_dtyper,   )r   r   r'   Zdt2Zdict2r   r   r   r     s
    
zTestEnum.test_createc                 C   sp   t j| jdd}| jjdd|d}d|d< d|dd	d	f< | |d d | |dd	d	f tjd
dd d	S )z/ Enum datasets can be read/written as integers r   r  r  r  rI   r  )#   %   r   N)dr   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   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   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   r   r   r   r   r   r   r   r   r   r   r   r   )	r_   r  r  r   r"   r,   rg   rC   r   r  r   r   r   test_readwrite  s    zTestEnum.test_readwriteN)r   r   r   r)   r  r   r  r   r   r   r   r    s   r  c                   @   s:   e Zd ZdZdd Zeeedddd Z	dd	 Z
d
S )
TestFloatszA
        Test support for mini and extended-precision floats
    c                 C   sJ   | j jdd|d}| |j| tjd|d}||d< | |d | d S )Nr  r   rI   .)r   r"   r,   rB   rC   r\   rg   )r   r   r/   rZ   r   r   r   	_exectest  s
    zTestFloats._exectestr  zNumPy float16 support requiredc                 C   s   |  td dS )z Mini-floats round trip r  N)r  rC   rB   r   r   r   r   	test_mini  s    zTestFloats.test_minic                 C   s<   t tdr"| tjjtd n| tjjtd dS )z Test mapping for float16 r  z<f2z<f4N)rW   rC   r,   r   Z
IEEE_F16LErB   r   r   r   r   test_mini_mapping  s    
zTestFloats.test_mini_mappingN)r   r   r   r)   r  r   
skipUnlessrW   rC   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 )TestTrackTimesz"
        Feature: track_times
    c                 C   s2   | j jdddd}tj|jj}| d| dS )zC check that when track_times=False, the time stamp=0 (Jan 1, 1970) r   r    Fr  r   N)r   r"   r_   r  r  r  r  r,   )r   r'   Zds_mtimer   r   r   test_disable_track_times  s    z'TestTrackTimes.test_disable_track_timesc              	   C   s,   |  t | jjdddd W 5 Q R X dS )z3 check that when give track_times an invalid value r   r    nullr#  NrE   r   r   r   r   test_invalid_track_times  s    z'TestTrackTimes.test_invalid_track_timesN)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 )TestZeroShapez7
        Features of datasets with (0,)-shape axes
    c                 C   s|   | j jdddd}| |jt|j | j jdddd}| |jt|j | j jdd	d
d}| |jt|j dS )z1 Empty datasets can be converted to NumPy arrays r  r   Nr  r  r   r   r  r   r   )NN)r   r"   r,   r-   rC   r   r&   r   r   r   test_array_conversion  s    z#TestZeroShape.test_array_conversionc                 C   s~   ddg}| j jdd|dd}tjd|d}| |d j|j | |d j|j | |d	 j|j | |d	 j|j d
S )z- Slicing into empty datasets works correctly )r~   r   )r   r  r  r(  r   r   rI   .r   N)r   r"   rC   emptyr,   r-   rB   )r   r   r'   r   r   r   r   test_reading  s    zTestZeroShape.test_readingN)r   r   r   r)   r*  r,  r   r   r   r   r'    s   r'  )r   r:   r9   z+Issue with empty region refs in HDF5 1.10.6reasonc                   @   s@   e Zd ZdZdd Zdd Zedd Zedd	 Zd
d Z	dS )TestRegionRefsz3
        Various features of region references
    c                 C   s@   t |  tdd| _| jjd| jd| _| j| jd< d S )Ni'  r  r  rY   .)	r   r   rC   rf   rh   rZ   r   r"   r/   r   r   r   r   r     s    
zTestRegionRefs.setUpc                 C   s@   t jdddddf }| jj| }| | j| | j|  dS )z4 Region references can be used as slicing arguments r  r  r:   r   r   N)rC   r   r/   	regionrefrg   rZ   r   Zslicrefr   r   r   test_create_ref   s    zTestRegionRefs.test_create_refc                 C   s,   | j jd d }| j | }|jdks(td S )Nr   )r/   r0  r=   rq   )r   r2  r  r   r   r   test_empty_region  s    
z TestRegionRefs.test_empty_regionc                 C   s   | j jdddd}tjtjj}|  tj|jdtjj	|}|| t
tdks^t|  tj|jdtjj	|}|| |d kstd S )NZscalar      ?r   rZ   rB      .r   )r   r"   r_   Zh5screateZSCALARZselect_noneZh5rrl   ZDATASET_REGIONr   rC   rB   rq   Z
select_all)r   r'   Zsidr2  r   r   r   test_scalar_dataset  s    z"TestRegionRefs.test_scalar_datasetc                 C   sX   t jdddddf }| jj| }| | jj|| jj | | jj|d dS )z, Region reference shape and selection shape r  r  r:   r   r   )r:      N)rC   r   r/   r0  r,   r-   Z	selectionr1  r   r   r   test_ref_shape  s    zTestRegionRefs.test_ref_shapeN)
r   r   r   r)   r   r3  empty_regionref_xfailr4  r9  r;  r   r   r   r   r/    s   

r/  c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	
TestAstypez(.astype() wrapper & context manager
    c                 C   sL   | j jdddd}td|d< |dd d  }| |tjddd d S Nr  r   r   rI   r   .r   )r   r"   rC   rf   r  rg   r   r/   r   r   r   r   test_astype_wrapper'  s    zTestAstype.test_astype_wrapperc                 C   s:   | j jdddd}td|d< | dt|d d S r>  )r   r"   rC   rf   r,   r   r  r.   r   r   r   test_astype_wrapper_len.  s    z"TestAstype.test_astype_wrapper_lenc                 C   sN   | j jdddd}td|d< tj|ddd}| |tjddd d S r>  )r   r"   rC   rf   r  r  rg   r?  r   r   r   test_astype_wrapper_asarray3  s    z&TestAstype.test_astype_wrapper_asarrayN)r   r   r   r)   r@  rA  rB  r   r   r   r   r=  $  s   r=  c                   @   s   e Zd ZdZdd ZdS )TestScalarCompoundzl
        Retrieval of a single field from a scalar compound dataset should
        strip the field info
    c                 C   s:   t dg}| jjdd|d}| |d jt d d S )Nr  r  r   rI   r~   r  )rC   rB   r   r"   r,   )r   r   r/   r   r   r   test_scalar_compoundA  s    z'TestScalarCompound.test_scalar_compoundN)r   r   r   r)   rD  r   r   r   r   rC  :  s   rC  c                   @   sf   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdddZdd Z	dd Z
dd Zdd Zdd ZdS )TestVlenc                 C   sV  t t}| jjdd|d}td|d< td|d< dddg|d< td|d< | |d td | |d td | |d tdddg | |d td tjtdtd	gt	d|dd< | |d td | |d td	 ttdtdg|dd< | |d td | |d td d S )
Nvlenr    rI   rd   r   r   rR   r   r!   )
r_   
vlen_dtyperR  r   r"   rC   rf   rg   r   r   r  r   r   r   rU  I  s     
&"zTestVlen.test_intc                 C   s6   t t}| jjdd|d}| jdd|d j d S )NrF  r1   rI   vlen2r   )r_   rG  rR  r   r"   rB   r  r   r   r   test_reuse_from_other[  s    
zTestVlen.test_reuse_from_otherc                 C   sl   dt fdtt fg}| jjdd|d}| jj}| j  t|d| _| jdd| jd d d j d S )Nr~   r   rF  r1   rI   rH  r   )	rR  r_   rG  r   r"   rM  r   r   rB   )r   r   r'   fnamer   r   r   test_reuse_struct_from_other`  s    
z%TestVlen.test_reuse_struct_from_otherc                 C   sN  t t}| jjdd|d}tddg|d< tdg|d< ddd	g|d< | |d tddg | |d tdg | |d tddd	g tjd
ddddgtdgt	d|dd< | |d td | |d td ttd
ddgtdddgg|dd< | |d td	 | |d td	 d S )NrF  r   rI   gffffff?g333333?r   r   rR   rd   g?g?g @g@r!   r   皙@皙?)
r_   rG  rR  r   r"   rC   r   rg   rf   r   r  r   r   r   test_converth  s     
*zTestVlen.test_convertc                 C   s   t t}| jjdd|d}td|d< tjtdtdgtdtdggtd|d d d d f< ttdtdgtdtdgg|d d d d f< d S )NrF  )rR   rR   rI   r   r)  rd   rR   )	r_   rG  rR  r   r"   rC   rf   r   r   r  r   r   r   test_multidimy  s    
zTestVlen.test_multidimrF  c                 C   sh  t |}| jj|d|d}tjdddg|d}tjdddd	d
g|d}tjdddgtdd}||}dddddg}	tj|	|d}
ddddddg}tj||d}||d< ||d< ||d< |	|d< ||d< | ||d  | ||d  | ||d  | |
|d  | ||d  tjddg|d}
|
dd |d< | |
|d  | j	  | j
  dS )z
        Helper for testing various vlen numpy data types.
        :param np_dt: Numpy datatype to test
        :param dataset_name: String name of the dataset to create for testing.
        r  rI   r5  g       @g      >@g33333Y@gi@gfffffX@g      %g     rr   rR   r  r   g      @r  g      r   ir   i'  r   rd   r!   g333333?rL  N)r_   rG  r   r"   rC   r   rB   r  rg   r/  r   )r   np_dtZdataset_namer   r'   Zarray_0Zarray_1Zarray_2Zcasted_array_2Zlist_3Zlist_array_3Zlist_4Zlist_array_4r   r   r   _help_float_testing  s2    


zTestVlen._help_float_testingc                 C   s   t d}| | d S )Nr  rC   rB   rQ  r   rP  r   r   r   test_numpy_float16  s    
zTestVlen.test_numpy_float16c                 C   s   t d}| | d S )Nfloat32rR  rS  r   r   r   test_numpy_float32  s    
zTestVlen.test_numpy_float32c                 C   s   t d}| | d S )Nr	  rR  rS  r   r   r   test_numpy_float64_from_dtype  s    
z&TestVlen.test_numpy_float64_from_dtypec                 C   s   t j}| | d S r   )rC   r	  rQ  rS  r   r   r   test_numpy_float64_2  s    zTestVlen.test_numpy_float64_2c              	   C   s"  | j jddtdd tdddddddg}|ddd | j d d	< t| j d d	 |ddd kst| j d d	  d
|ddd  | j jddtdd tdddddddg}|ddd | j d d	< t| j d d	 |ddd kst| j d d	  d
|ddd  dS )z4Test that non-contiguous arrays are stored correctlyncr   rF  rI   TFNrR   r   z != Znc2Zint8r!   r   r   r   rd   r   )r   r"   r_   rG  rC   r   r   rq   )r   r  r  r   r   r   test_non_contiguous_arrays  s    Fz#TestVlen.test_non_contiguous_arraysN)rF  )r   r   r   rU  rI  rK  rN  rO  rQ  rT  rV  rW  rX  rZ  r   r   r   r   rE  H  s   	
0rE  c                   @   s   e Zd Zdd Zdd ZdS )TestLowOpenc                 C   s   | j dd}|j }dS )z Test H5Dget_access_plist r   r    N)r   r"   rl   rg  )r   r'   Zp_listr   r   r   test_get_access_list  s    z TestLowOpen.test_get_access_listc                 C   sH   t jt jj}| jdd}~t j| jjd|}| 	|t jj
 dS )z# Test the dapl keyword to h5d.open r  r      xN)r_   Zh5pr8  ZDATASET_ACCESSr   r"   Zh5dra  rl   r#   Z	DatasetID)r   Zdaplr/   dsidr   r   r   	test_dapl  s
    zTestLowOpen.test_daplN)r   r   r   r\  r_  r   r   r   r   r[    s   r[  )r   r:   r   z#chunk info requires  HDF5 >= 1.10.5c               	   C   s@  ddl m}  |  }t|d(}|jddddd d	|d d d < W 5 Q R X |d t|d
}|d j}| dks~tt	dD ]`}t
tt|dd }||}|j|kst|jdkst|jd k	st|jdkstq|d}|jdkst|jdkst|jd k	s"t|jdks2tW 5 Q R X d S )Nr   BytesIOr   r  r  r^   r   r-   r   rB   r   rI  r   r:   r)  )iora  r_   r   r"   seekrl   get_num_chunksrq   rN  r   rC   r   Zunravel_indexget_chunk_infochunk_offsetfilter_maskbyte_offsetr=   Zget_chunk_info_by_coord)ra  buffoutfinr'   joffsetsir   r   r   test_get_chunk_details  s*    



rp  )r   r   rd   )r   r:   r:   )r   r:   c   zJchunk iteration requires  HDF5 1.10.10 and later 1.10, or 1.12.3 and laterc               	      s   ddl m}  |  }t|d(}|jddddd d	|d d
d
< W 5 Q R X |d t|d`}|d j}| }|dksti  t	|D ]}|
|}| |j< q fdd}|| W 5 Q R X d
S )z%H5Dchunk_iter() for chunk informationr   r`  r   r  r  r^   r   rb  r   NrI  r   c                    sN    | j  }| j |j kst| j|jks*t| j|jks:t| j|jksJtd S r   )rg  rq   rh  ri  r=   )Z
chunk_infoZknowncir   r   callback  s
    
z!test_chunk_iter.<locals>.callback)rc  ra  r_   r   r"   rd  rl   re  rq   rN  rf  rg  Z
chunk_iter)ra  rj  r   r^  Z
num_chunksrm  ro  rt  r   rr  r   test_chunk_iter  s     


ru  c                 C   s.   | j ddd}|jd kst|jd ks*td S )Nr+  r   rI   )r"   r-   rq   r   )r   r'   r   r   r   test_empty_shape  s    rv  c               	   C   s   ddl m}  |  }t|d}|jddd W 5 Q R X |d t|dD}|d jd ksbt|d j	 d ksxt|d j
 dkstW 5 Q R X d S )Nr   r`  r   r+  r
  rI   rI  )rc  ra  r_   r   r"   rd  r   rq   rl   Z
get_offsetZget_storage_size)ra  rj  rk  rl  r   r   r   test_zero_storage_size%  s    
rw  c                 C   s   t t jjt t jjd g}| jd|t jd}|jt t jksHtt j	|d d  t j
|t jd ||d d < t j	|d d  t j
|t jd d S )Nr   r  r6  rI   )rC   Ziinfor   maxr"   Zuint64rB   rq   r   r   r   )r   rZ   r'   r   r   r   test_python_int_uint643  s     "ry  c                 C   s>   | j ddtjd}tjjddd}||d d ddd	gd
f< d S )NrZ   )r   rx  rR   rI      )r   rd   rR   rP  r   rR   r!   .)r"   rC   r
  rK  rQ  )r   r   blockr   r   r   test_setitem_fancy_indexingA  s    r|  c               	   C   s0   t td} | d d dks"tW 5 Q R X d S )Nzvlen_string_dset.h5ZDS1r   s   Partingr   r   rq   r   r   r   r   test_vlen_spacepadH  s    r  c               	   C   s0   t td} | d d dks"tW 5 Q R X d S )Nzvlen_string_dset_utc.h5Zds1r   s   2009-12-20T10:16:18.662409Zr}  r~  r   r   r   test_vlen_nulltermM  s    r  )r   r:   rd   z>Appears you cannot pass an unknown filter id for HDF5 < 1.10.3c                 C   s0   d}| j ddtj|dd}t||jks,td S )N   rZ   r^   T)r-   rB   r  Zallow_unknown_filter)r"   rC   r
  r%   _filtersrq   )r   Zfake_filter_idr'   r   r   r   test_allow_unknown_filterR  s       r  c               
   C   s   ddl m}  |  }t|dV}|jdddddd	d
d}|j  }|j  dd |ksdt	|dkspt	W 5 Q R X |
d t|dT}|jddddddd}|j  }|j  dd |kst	|dkst	W 5 Q R X dS )z2Chunk cache configuration for individual datasets.r   r`  r   r  )r:   r   )r   r!   r       rM    )r-   r   rB   rdcc_nbytesrdcc_w0rdcc_nslotsr   N)r  r  rM  rI    0 q=
ףp?  )r-   rB   r  r  r  )r  r  r  )rc  ra  r_   r   r"   rl   rg  Zget_chunk_cacheZ	get_cacherq   rd  r   )ra  rj  rk  r'   Zds_chunk_cacherl  r   r   r   test_dset_chunk_cache`  s8         
    r  c                   @   s    e Zd ZdZdd Zdd ZdS )TestCommutativez|
    Test the symmetry of operators, at least with the numpy types.
    Issue: https://github.com/h5py/h5py/issues/1947
    c                 C   s   d}| j jd|ttjj| d}t|d }t||k||kksHtt||k||kksbtd}t	|| }t||k||kkstt||k||kkstdS )z
        Create a h5py dataset, extract one element convert to numpy
        Check that it returns symmetric response to == and !=
        r   r   r  rB   rZ   r   gMbP?N)
r   r"   rC  rC   rK  rL  r	  r   rq   Znanmax)r   r-   r/   valdeltaZnvalr   r   r   test_numpy_commutative{  s    
z&TestCommutative.test_numpy_commutativec                 C   sT   d}| j jd|ttjj| d}td}||k||kks<t||k||kksPtdS )z
        Create a h5py dataset and check basetype compatibility.
        Check that operation is symmetric, even if it is potentially
        not meaningful.
        r  r  r  r  N)r   r"   rC  rC   rK  rL  rq   )r   r-   r/   r  r   r   r   test_basetype_commutative  s    
z)TestCommutative.test_basetype_commutativeN)r   r   r   r)   r  r  r   r   r   r   r  v  s   r  c                   @   sH   e Zd ZdZejejdk dddd Zejejdk dddd Z	d	S )
TestVirtualPrefixz%
    Test setting virtual prefix
    )r   r:   rR   z8Virtual prefix does not exist before HDF5 version 1.10.2r-  c                 C   sR   d}d}| j jd|ttjj| |d}t|j	 
   }||ksNtd S )Nr  /path/to/virtualr  )rB   rZ   virtual_prefix)r   r"   rC  rC   rK  rL  re  rf  rl   rg  get_virtual_prefixri  rj  rq   )r   r-   r  r/   virtual_prefix_readbackr   r   r   test_virtual_prefix_create  s    
z,TestVirtualPrefix.test_virtual_prefix_createc                 C   s^   d}| j jddd|d}t|j    }| 	|| | 
|t | 	|jd d S )Nr  r   rc   r   )r  )r   r   re  rf  rl   rg  r  ri  rj  r,   r#   r   r-   )r   r  r/   r  r   r   r   test_virtual_prefix_require  s    z-TestVirtualPrefix.test_virtual_prefix_requireN)
r   r   r   r)   r   rV   r   rd  r  r  r   r   r   r   r    s   

r  )ar)   re  rp  r  numpyrC   rK   rM   warningscommonr   r   
data_filesr   r_   r   r   r   Zh5py._hl.baser	   r
   r   r   Zh5py.h5py_warningsr   r   Zh5py._hl.selectionsr  Z
selectionsselr   r   r*   rX   r   r   r   r   r   r   r   rR  r   r   rC  rU  r	  r  r  r  rV   filtersr  r  r$  r-  r5  r:  r=  r@  rY  r  r  r  r  r  r  r  r  r  r  r  r  r"  r'  rN   rd  r<  r/  r=  rC  rE  r[  r!  rp  ru  rv  rw  ry  r|  r  r  Zskipifr  r  r  r  r   r   r   r   <module>
   s   		FY0(CC&

,'qc,D TO
0 





-