o
    cd                    @   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j3j4vd*G d+d, d,eZ5e
2d)ej3j4vd*G d-d. d.eZ6e
2d/ej3j4vd0G d1d2 d2eZ7e
2d3ej3j4vd4G d5d6 d6eZ8e
2d7ej3j4vd8G d9d: d:eZ9e
2d;ej3j4vd<G d=d> d>eZ:e
2d?ej3j4v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                   @      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   7lib/python3.10/site-packages/h5py/tests/test_dataset.pysetUp'   s   zBaseDataset.setUpc                 C   s   | j r
| j   d S 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                   @      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       | 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      z"TestCreateShape.test_create_scalarc                 C   r-   )z Create a size-1 dataset r!   r   Nr.   r1   r   r   r   test_create_simpleG   r4   z"TestCreateShape.test_create_simplec                 C       | j dd}| |jd dS )z+ Create a size-1 dataset with integer shaper!   r   r5   Nr.   r1   r   r   r   test_create_integerL   r4   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!   ?   r;   bar   
   <   Nr   r$   r/   r0   sizer1   r   r   r   test_create_extendedQ      z$TestCreateShape.test_create_extendedc                 C   sX   | j dd}| |jd | |jd | j dd}| |jd | |jd dS )r9   r!   r;   r:   r<   r=   r@   NrA   r1   r   r   r   test_create_integer_extendedZ   rD   z,TestCreateShape.test_create_integer_extendedc                 C   s&   | j dd}| |jtd dS )) Confirm that the default dtype is float r!   r:   z=f4Nr   r$   r/   dtypenpr1   r   r   r   test_default_dtypec   s   z"TestCreateShape.test_default_dtypec                 C   s<   |  t | jd W d   dS 1 sw   Y  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v rtdt   | |j	tj dS )rF   r!   r:   rH   )Zppc64lez(Storage of long double deactivated on %sN)
r   r$   rI   Z
longdoubleplatformmachinepytestxfailr/   rH   r1   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 )rF   r!   r:   rU   rO   N)r   r$   rI   rH   r/   r1   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   foor5   s   bar/baz)   r.   r   r2   dset2r   r   r   test_name_bytes{   s   zTestCreateShape.test_name_bytesN)r   r   r   r+   r3   r6   r8   rC   rE   rJ   rN   rT   r   skipIfhasattrrI   rV   rZ   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   0   t dd}| jjd|d}| |j|j dS )z- Create a scalar dataset from existing array r   r   r!   dataNrI   onesr   r$   r/   r0   r   r`   r2   r   r   r   r3         z!TestCreateData.test_create_scalarc                 C   r^   )z/ Create an extended dataset from existing data r:   r   r!   r_   Nra   rc   r   r   r   rC      rd   z#TestCreateData.test_create_extendedc                 C   s4   | j jdddd}| |tj | d| j v  dS )z1 Create dataset with missing intermediate groups z/foo/bar/bazr?   r?   z<i4)r0   rH   N)r   r$   r%   h5pyr   
assertTruer(   r   r   r   test_dataset_intermediate_group      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   rO   r!   r?      r0   r`   .N)rI   aranger   r$   r/   r0   assertArrayEqualreshaperc   r   r   r   test_reshape   s   zTestCreateData.test_reshapec                 C   s@   |  t t| jd j W d   dS 1 sw   Y  dS )zE Binding Dataset to a non-DatasetID identifier fails with ValueError /N)rL   
ValueErrorr   r   idr   r   r   r   test_appropriate_low_level_id   s   "z,TestCreateData.test_appropriate_low_level_idc                 C   sb   |j  }t|tjsJ | |ksJ |d u r!| sJ d S | r'J | |ks/J d S r   )rt   get_type
isinstancer   TypeStringIDget_csetis_variable_strget_size)r   r2   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                        j | tjd d d S Nr}   )r   r   
CSET_ASCIIr2   r   r   r   check_vlen_ascii      z?TestCreateData.test_create_bytestring.<locals>.check_vlen_asciia   abcr_   b   defcdrO   Nr   r$   rI   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S3rO   r_   rl   r   )r   r$   rI   r   r   r   r   r1   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                    r   r   )r   r   	CSET_UTF8r   r   r   r   check_vlen_utf8   r   z;TestCreateData.test_create_strings.<locals>.check_vlen_utf8r   abcr_   r   defr   r   rO   r   )r   r   r   r   r   test_create_strings   s   z"TestCreateData.test_create_stringsc                 C   sN   |  t | jjdtjddgddd W d    d S 1 s w   Y  d S )Nr   r   r   ZU3rO   r_   )rL   rM   r   r$   rI   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   rO   )r   r$   rg   r	   rt   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   rO   r_   )r   r$   rf   Emptyrg   r	   rt   r   r   r   r   !test_empty_create_via_Empty_class   s   z0TestCreateData.test_empty_create_via_Empty_classc                 C   sH   |  t | jjddtdd W d    d S 1 sw   Y  d S )Nr<   r#   rl   rm   )rL   rs   r   r$   rI   rn   r   r   r   r   test_create_incompatible_data   s   "z,TestCreateData.test_create_incompatible_dataN)r   r   r   r+   r3   rC   rh   rq   ru   r   r   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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rj   r?      r   r         	   r>   rW   r>   rl   c           
      C   sl   t jt|dd|}|jd||d}t j|ddd}| }	|| |	|< |||| t j	||	 d S )Nint64rO   r2   r_   )
rI   rn   r
   rp   r$   fullcopyread_directtestingassert_array_equal)
r   writable_filesource_shape
dest_shape
source_seldest_selZsource_valuesr2   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 )Nr2   r?   r?   r   rO   r_   )r$   rI   rn   rb   r   r   r   r   r   r2   r   r   r   r   test_no_sel   s   
zTestReadDirectly.test_no_selc                 C   sl   |j ddd}tdd}tt ||tjdd tjdd  W d    d S 1 s/w   Y  d S 	NZedsetr   rO   r   r   r?   r   r@   )r$   rI   rb   rR   raisesrM   r   s_)r   r   
empty_dsetr   r   r   r   
test_empty   s
   $"zTestReadDirectly.test_emptyc                 C   T   |j dddd}td}tt || W d    d S 1 s#w   Y  d S Nr2   r   r   rO      r$   rI   rb   rR   r   rM   r   r   r   r   r   test_wrong_shape   
   
"z!TestReadDirectly.test_wrong_shapec                 C   X   |j dddd}tjddd}tt || W d    d S 1 s%w   Y  d S Nr2   re   r   rO   F)Zorderr   r   r   r   r   test_not_c_contiguous  
   "z&TestReadDirectly.test_not_c_contiguous)r   r   r   r+   rR   markparametrizerI   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   rW   r>   rl   c           	      C   sj   |j d|ddd}tt||}tj|ddd}|| ||< |||| tj|d d  | d S )Nr2   int32r   rH   	fillvaluerO   )	r$   rI   rn   r
   rp   r   write_directr   r   )	r   r   r   r   r   r   r2   r   r   r   r   r   test_write_direct  s   	z#TestWriteDirectly.test_write_directc                 C   sf   |j ddd}tt |tdtjdd tjdd  W d    d S 1 s,w   Y  d S r   )r$   rR   r   rM   r   rI   rb   r   )r   r   r   r   r   r   r   !  s   *"zTestWriteDirectly.test_emptyc                 C   r   r   r$   rI   rb   rR   r   rM   r   r   r   r   r   r   &  r   z"TestWriteDirectly.test_wrong_shapec                 C   r   r   r   r   r   r   r   r   ,  r   z'TestWriteDirectly.test_not_c_contiguous)r   r   r   r+   rR   r   r   rI   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!   rk   r   N)r   require_datasetr%   r   r/   r0   r1   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!   rk   r   Nr   r   r/   rX   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   r<   r   Zbazs   bazNr   rX   r   r   r   test_create_1DE  s   z TestCreateRequire.test_create_1Dc                 C   sP   | j ddd | t | j ddd W d   dS 1 s!w   Y  dS )z6 require_dataset with shape conflict yields TypeError r!   rk   r   )r?   r#   Nr   r$   rL   rM   r   r   r   r   r   test_shape_conflictS  s   "z%TestCreateRequire.test_shape_conflictc                 C   sL   | j d | t | j ddd W d   dS 1 sw   Y  dS )z< require_dataset with object type conflict yields TypeError r!   rk   r   N)r   Zcreate_grouprL   rM   r   r   r   r   r   test_type_conflictY  s   "z$TestCreateRequire.test_type_conflictc                 C   sP   | j ddd}| t | j ddd W d   dS 1 s!w   Y  dS )zL require_dataset with dtype conflict (strict mode) yields TypeError
        r!   rk   r   ZS10Nr   r1   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!   rk   r   TexactN)r   r$   r   r/   rX   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!   rk   i4i2Fr   N)r   r$   r   r/   rH   rI   rX   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                   @   X   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   r0   chunksNr   r$   r/   r   r1   r   r   r   test_create_chunks|     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   r1   r   r   r   test_create_chunks_integer  r   z,TestCreateChunked.test_create_chunks_integerc                 C   B   |  t | jjdddd W d   dS 1 sw   Y  dS )z& Illegal chunk size raises ValueError r!   r   r   r   NrL   rs   r   r$   r   r   r   r   test_chunks_mismatch     "z&TestCreateChunked.test_chunks_mismatchc                 C   D   |  t | jjddddd W d   dS 1 sw   Y  dS )z3 Chunked format required for given storage options r!   r   r   F)r0   maxshaper   Nr   r   r   r   r   test_chunks_false  s   "z#TestCreateChunked.test_chunks_falsec                 C   r   )z> Attempting to create chunked scalar dataset raises TypeError r!   r   )r   r   NrK   r   r   r   r   test_chunks_scalar  r   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   rW   N)r   r$   r%   r   tupler/   lenr1   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!   rl   Z
S100000000Tr0   rH   r   r5   Nr   r1   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!   )rl   r   r   )r   r   r   r   r?   r   N(         r   rW   )r   r$   rI   r   rg   allr1   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 d   n1 sw   Y  t jtdd}| jjdddd	 W d   dS 1 s<w   Y  dS )
z, Auto-chunking of empty datasets not allowedr   )matchr!   ZS100T)rH   r   Nr   rH   r   )rR   r   rM   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/   r1   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assertNotIsInstancerI   ndarrayr1   r   r   r   test_property  ri   z!TestCreateFillvalue.test_propertyc                 C   r7   )z0 .fillvalue property works correctly if not set r!   r   r   N)r   r$   r/   r   r1   r   r   r   test_property_none  r4   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   Zi8r5   rO   r   r!   r   r   r#   N)rI   rH   rb   r   r$   r/   r   ZassertAlmostEqual)r   dtvr2   r   r   r   test_compound  s
   z!TestCreateFillvalue.test_compoundc                 C   sH   |  t | jjddddgdd}W d   dS 1 sw   Y  dS )z$ Bogus fill value raises ValueError r!   r   r   i)r   r   *   r   Nr   r1   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   encodingr}       asciir  c                 C   s"   |j dd| d}|j|ksJ d S )Nr!   r   rO   )r$   r   )r  r   r   r2   r   r   r   test_get_unset_fill_value  s   r  c                   @   r   )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   rO   N)	rI   rH   r   r$   r/   rt   rv   rg   Z	committedr1   r   r   r   
test_named  s
   zTestCreateNamedType.test_namedN)r   r   r   r+   r   r   r   r   r   r        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   rj   r"  r   compressioncompression_optsNr   r$   r/   r&  r'  r1   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(  r1   r   r   r   test_gzip_implicit     z!TestCreateGzip.test_gzip_implicitc                 C   s   | j jdddd}| |jd | |jd tjjj}z4t	 tjj_| 
t | j jdddd}W d   n1 s<w   Y  W |tjj_dS W |tjj_dS |tjj_w )z. Create with gzip level by specifying integer r!   r$  r   r*  r"  N)r   r$   r/   r&  r'  rf   _hldataset_LEGACY_GZIP_COMPRESSION_VALSr   rL   rs   )r   r2   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 d   n1 sw   Y  |  t | jjdddd W d   n1 s9w   Y  |  t | jjddddd W d   dS 1 sYw   Y  dS )	z= Illegal gzip level (explicit or implicit) raises ValueError r!   r$     r*  Nr"  r%  )rL   rs   RuntimeErrorr   r$   r   r   r   r   test_gzip_exc#  s   "zTestCreateGzip.test_gzip_excN)r   r   r   r+   r)  r+  r1  r5  r   r   r   r   r#    s    r#  c                   @       e Zd ZdZdd Zdd ZdS )TestCreateCompressionNumberz?
        Feature: Datasets created with a compression code
    c                 C   sj   t jjj}zt t jj_| jjddt jjdd}W |t jj_n|t jj_w | 	|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)rf   r-  r.  r/  r   r   r$   h5zFILTER_DEFLATEr/   r&  r'  )r   r0  r2   r   r   r   test_compression_number5  s   
z3TestCreateCompressionNumber.test_compression_numberc                 C   s   |  t}| jjdddd W d   n1 sw   Y  | dt|j |  t}| jjdddd W d   n1 s@w   Y  | dt|j tjj	j
}z6t tjj	_
|  t | jjddtjjd W d   n1 suw   Y  W |tjj	_
dS W |tjj	_
dS |tjj	_
w )	z* Create with invalid compression numbers  r!   r$  ir*  NzInvalid filterr   zUnknown compression)rL   rs   r   r$   ZassertInr'   Z	exceptionrf   r-  r.  r/  r   
IndexErrorr8  r9  )r   er0  r   r   r   test_compression_number_invalidA  s"   
z;TestCreateCompressionNumber.test_compression_number_invalidN)r   r   r   r+   r:  r=  r   r   r   r   r7  .  s    r7  lzfzLZF is not installedc                   @   r6  )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   r<   )r`   r&  r   )	r   r$   r/   r&  r'  rI   rn   flushro   )r   r2   testdatareaddatar   r   r   test_lzf]  s   

zTestCreateLZF.test_lzfc                 C   r   )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+   rD  rE  r   r   r   r   r?  V  s    r?  szipzSZIP is not installedc                   @   r   )TestCreateSZIPr@  c                 C   s   | j jddddd}dS )z Create with explicit szip r!   r$  rF  )Zec   r%  N)r   r$   r1   r   r   r   	test_szip{  s   
zTestCreateSZIP.test_szipN)r   r   r   r+   rI  r   r   r   r   rG  t      rG  shufflezSHUFFLE is not installedc                   @   r   )TestCreateShufflez8
        Feature: Datasets can use shuffling filter
    c                 C   "   | j jdddd}| |j dS )z Enable shuffle filter r!   r$  T)rK  N)r   r$   rg   rK  r1   r   r   r   test_shuffle     zTestCreateShuffle.test_shuffleN)r   r   r   r+   rN  r   r   r   r   rL    rJ  rL  
fletcher32zFLETCHER32 is not installedc                   @   r   )TestCreateFletcher32z=
        Feature: Datasets can use the fletcher32 filter
    c                 C   rM  )z Enable fletcher32 filter r!   r$  T)rP  N)r   r$   rg   rP  r1   r   r   r   test_fletcher32  rO  z$TestCreateFletcher32.test_fletcher32N)r   r   r   r+   rR  r   r   r   r   rQ    r!  rQ  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   D   |  t | jjddtdd}W d   dS 1 sw   Y  dS )z[ Ensure that a scale factor is required for scaleoffset compression of floating point data r!   r$  TrH   rS  NrL   rs   r   r$   floatr1   r   r   r    test_float_fails_without_options     "z6TestCreateScaleOffset.test_float_fails_without_optionsc                 C   rU  )z# Check when scaleoffset is negetiver!   r$  grV  NrW  r1   r   r   r   test_non_integer  rZ  z&TestCreateScaleOffset.test_non_integerc                 C   rU  )z% Check when dtype is unsupported typer!   r$  TrV  N)rL   rM   r   r$   boolr1   r   r   r   test_unsupport_dtype  rZ  z*TestCreateScaleOffset.test_unsupport_dtypec                 C   s   d}d}dd|  }t jj| d | }| jjd|t|d}|jdus%J ||d	< | jj}| j  t	
|d
| _| jd d	 }| j||d|  d ||k rSJ dS )z2 Scaleoffset filter works for floating point data r#   r   i,  r   r?   g      ?r!   rV  N.r)Z	precision)rI   randomrandr   r$   rX  rS  filenamer   rf   r   ro   r  )r   Zscalefacr0   rangerB  r2   rb  rC  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
us"J ||d< | jj}| j  t	
|d| _| jd d }| || d
S )zB Scaleoffset filter works for integer data with default precision r   r^  r   rW   r   rB   r!   TrV  N.r_  )rI   r`  randintr   r$   intrS  rb  r   rf   r   ro   r   Znbitsr0   rB  r2   rb  rC  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   r^  r   rW   re  r!   rV  .r_  N)rI   r`  rf  r   r$   rg  rg   rS  rb  r   rf   r   ro   rh  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 rHJ dS )rj  r   r^  r   rW   r   re  r!   rV  .r_  N)rI   r`  rf  r   r$   rg  rg   rS  rb  r   rf   r   r  rh  r   r   r   test_int_with_minbits_lossy  s   
z1TestCreateScaleOffset.test_int_with_minbits_lossyN)r   r   r   r+   rY  r[  r]  rd  ri  rk  rl  r   r   r   r   rT    s    rT  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us*J t	|d}|
 }W d   n1 s>w   Y  || ksKJ tjjd	krot|j    }t| jjj }	||	ksqJ dS dS )
z' Create and access an external dataset r>   r   r   r!   z	${ORIGIN}rH   externalefile_prefix.Nrbr   r?   r   )rI   r`  r   r   	UNLIMITEDr   r$   rH   rp  openreadtobytesrf   r   hdf5_version_tuplepathlibPathrt   get_access_plistget_efile_prefixdecodeas_posixrb  parent)
r   r0   rB  ext_filerp  r2   fidcontentsrq  r  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us2J t|d}| }W d   n1 sFw   Y  || ksSJ tjjdkrut|j    }t|j }	||	ksuJ | jjd||j
tj|d	}
|
jdusJ |
d
 |k dS )z< Create and access an external dataset using an efile_prefixrn  r   r!   ro  .Nrr  rs  )rq  r   )rI   r`  r   ospathbasenamer   rt  r   r$   rH   dirnamerp  ru  rv  rw  rf   r   rx  ry  rz  rt   r{  r|  r}  r~  r  r   )r   r0   rB  r  rp  r2   r  r  rq  r  rY   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!   rn  rp  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!   rn  r  N)r   r$   ry  rz  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s%J 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  r  r   r   	<genexpr>X  s    z/TestExternal.test_iter_multi.<locals>.<genexpr>Zpoorn  r  N)r   iterrc  r   r$   r   rp  )r   Nrp  r2   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 ]"\}}| | | jjd||d W d   n1 sPw   Y  q3dS )z" Test with invalid external lists rn  r   zh5f.UNLIMITEDr!   r  N)r   rM   r   rt  rs   rL   r   r$   )r   r0   r  exc_typerp  r   r   r   test_invalid\  s   

	zTestExternal.test_invalidN)
r   r   r   r+   r  r  r  r  r  r  r   r   r   r   rm    s    	rm  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   sF   |j  }| t|tjj | | | |r| s!J d S d S r   )	rt   rv   r/   r  rf   r   rx   ry   rz   )r   r)   r|   variabler~   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yrO   zN)r   r  rf   r   r   rI   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   Zbcr  rO   r  N)	chrr   r  rf   r   r   rI   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)rI   string_r   r  rf   r   r   r/   rt   rv   r{   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                   @   $   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   )	rI   rn   rp   r   create_dataset_liker/   r0   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)r`   track_timesr   ZhyundaiZibmFZlenovo)r   r$   rI   rn   assertNotEqualrf   h5gget_objinfo_idmtimer  r/   )r   Z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   Zsimr   N)r   r$   r  r/   r0   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                   @   r  )TestChunkIteratorc                 C   sF   | j dd}| t |  W d    d S 1 sw   Y  d S )Nr!   r   )r   r$   rL   rM   iter_chunksr1   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  rI   r   r   r2   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     
 
 
0zTestChunkIterator.test_2dN)r   r   r   r  r  r  r   r   r   r   r    s    r  c                   @   r   )
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   r1   r   r   r   r     r,  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  Nr<   r  r1   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/   r0   resizer1   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  )rj   Nr  r1   r   r   r   test_resize_1D  s   
zTestResize.test_resize_1Dc                 C   sL   | j jdddd}| t |d W d   dS 1 sw   Y  dS )z. Resizing past maxshape triggers an exception r!   r$  r  r  )r   r   N)r   r$   rL   	Exceptionr  r1   r   r   r   test_resize_over  s   "zTestResize.test_resize_overc                 C   sH   | j dd}| t |d W d   dS 1 sw   Y  dS )z/ Resizing non-chunked dataset raises TypeError r!   r$  r  N)r   r$   rL   rM   r  r1   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/   r0   r1   r   r   r   test_resize_axis  r,  zTestResize.test_resize_axisc                 C   sP   | j jdddd}| t |jddd W d   dS 1 s!w   Y  dS )	z  Illegal axis raises ValueError r!   r$  r  r  r   rW   r  N)r   r$   rL   rs   r  r1   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/   r0   r   r1   r   r   r   test_zero_dim  r,  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                   @   r6  )	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   |S10NrG   r1   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) r_  r  r!   r  N)rI   rH   float16r   r$   r/   )r   Z	complex32r2   r   r   r   test_dtype_complex32#  s   zTestDtype.test_dtype_complex32N)r   r   r   r+   r  r  r   r   r   r   r        r  c                   @   r6  )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   r1   r   r   r   test_len1  s   zTestLen.test_lenc                 C   s~   | j dd}| |jd tjdkr-| t t| W d   n1 s'w   Y  n| t|d | | d dS )z Python len() vs Dataset.len() r!   )        r  iNr  )	r   r$   r/   r0   sysmaxsizerL   OverflowErrorr   r1   r   r   r   test_len_big6  s   

zTestLen.test_len_bigN)r   r   r   r+   r  r  r   r   r   r   r  +  r  r  c                   @   r6  )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 rj   r   rO   rk   r!   r_   rl   N)	rI   rn   rp   r   r$   zipr/   r   ro   )r   r`   r2   r  r  r   r   r   	test_iterH  s   zTestIter.test_iterc                 C   sN   | j jddd}| t dd |D  W d   dS 1 s w   Y  dS )z0 Iterating over scalar dataset raises TypeError r!   r   )r0   c                 S   s   g | ]}|qS r   r   r  r   r   r   
<listcomp>T  s    z-TestIter.test_iter_scalar.<locals>.<listcomp>N)r   r$   rL   rM   r1   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   rO   N)rf   string_dtyper   r$   rt   rv   r/   r  r   rx   ry   r   check_string_dtyperH   r  r   r  r)   r~   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rf   r  r   r$   r/   asstrr}  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   rO   r  N)rf   r  r   r$   rt   rv   r/   r  r   rx   ry   r   r  rH   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)rf   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   rO   r?   r  N)rI   rH   r   r$   rt   rv   r/   r  rf   r   rx   ZassertFalserz   r{   ry   r   r  r  r}   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 d    n1 sow   Y  tj|d d tj|
dgd dd d S )Nr  r   r  r  r   rO      cùr   r   rW   r#   r>      Ur?   S)rf   r  r   r$   rt   rv   r/   ry   r   r   r  rI   r   r   rL   rM   r   r   )r   r  r)   r~   sr   r   r   test_fixed_utf8  s   
"0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)	rf   r  r  r   r$   r/   r  r}  r   r  r   r   r   test_fixed_utf_8_fillvalue  s   
 z&TestStrings.test_fixed_utf_8_fillvaluec                 C   sL   t d}| t | jjdd|d}W d   dS 1 sw   Y  dS )zA Fixed-length unicode datasets are unsupported (raise TypeError) z|U10r  r   rO   N)rI   rH   rL   rM   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   rO      Hellor   N)rf   r  r   r$   r/   r  bytesr   r  r)   r`   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   rO   r  r   N)rI   rH   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   rO      fàilter   )	rf   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 d    n1 s*w   Y  | |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   rO   r  r   r  ignoreZfiltelatin-1r?   r   )r   r$   rf   r  r  rL   UnicodeDecodeErrorr/   r  r   rI   r   r   r   r   asarray)r   r)   r`   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   r   r  r   rO   r  r  r   r  r
  r   r  r   )rf   r  r   r$   rI   r   r  r%   Zbytes_r  r'   r/   r  r   r   r   r  r   r   r   test_asstr_fixed  s   zTestStrings.test_asstr_fixedc                 C   sX   t d}| jjdd|d}d}| t ||d< W d   dS 1 s%w   Y  dS )zGEncoding error when writing a non-ASCII string to an ASCII vlen datasetr  r  r   rO   r  r   N)rf   r  r   r$   rL   UnicodeEncodeError)r   r  r)   r`   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   rO   r  r  utf8r   N)	rf   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   rO   zASCII stringr   N)rf   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                   @   (   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
 ||< q+|| 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rH  rO   r   test.N)rI   rH   float64Zuint32uint8r
  fieldsr`  r   rg   r  r/   )r   r  rB  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 ||< q| jj	dd|d}|jD ]}|| ||< q6| jd d	 }| 
t ||k | |j|j d S )
Nr  rl   r  r  rO   re  r   r  .)rI   rH   r  r  r
  r  r`  r0   r   r$   rg   r  r/   )r   r  rB  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 ||< q|| 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sJ d S )	Nr  r  r  r  rO   r   r  rH  )rI   rH   r  r
  r  r`  r   r   r   r  r   astyper   )r   r  rB  r  Zdt_intr   r   r   test_fieldsU  s0   

$" zTestCompound.test_fieldsN)r   r   r   r+   r!  r"  r$  r   r   r   r   r  *  s
    r  c                   @   r   )TestSubarrayc                 C   sl   | j jdddd}g d|d< tj|d d  g dg g dg|d d < tj|d d  g dg d S Nr   r5   Z3int8rO   r   rW   rl   r   )r#   r   r>   )r   r$   rI   r   r   r(   r   r   r   test_write_listz  s
    zTestSubarray.test_write_listc                 C   sx   | j jdddd}tg d|d< tj|d d  g dg tg dg|d d < tj|d d  g dg d S r&  )r   r$   rI   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  rO   N)rf   
enum_dtypeEDICTr   r$   rH   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  rO   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   )	rf   r,  r-  r   r$   r/   ro   rI   r   r   r   r   r   test_readwrite  s   &zTestEnum.test_readwriteN)r   r   r   r+   r-  r   r0  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   rO   .)r   r$   r/   rH   rI   rb   ro   )r   r  r2   r`   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)r2  rI   rH   r   r   r   r   	test_mini  s   zTestFloats.test_minic                 C   s>   t tdr| tjjtd dS | tjjtd dS )z Test mapping for float16 r  z<f2z<f4N)r\   rI   r/   r   Z
IEEE_F16LErH   r   r   r   r   test_mini_mapping  s   
zTestFloats.test_mini_mappingN)r   r   r   r+   r2  r   
skipUnlessr\   rI   r3  r4  r   r   r   r   r1    s    
r1  c                   @   r6  )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$   rf   r  r  r  r  r/   )r   r)   Zds_mtimer   r   r   test_disable_track_times  s   z'TestTrackTimes.test_disable_track_timesc                 C   r   )z3 check that when give track_times an invalid value r!   r"   Znullr7  NrK   r   r   r   r   test_invalid_track_times  r   z'TestTrackTimes.test_invalid_track_timesN)r   r   r   r+   r8  r9  r   r   r   r   r6    s    r6  c                   @   r6  )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/   r0   rI   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  rO   .r   N)r   r$   rI   emptyr/   r0   rH   )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?   r>   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  r_   .)	r   r   rI   rn   rp   r`   r   r$   r2   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)rI   r   r2   	regionrefro   r`   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J d S )Nr   )r2   rC  rB   )r   rE  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/J |  tj|jdtjj	|}|| |d ksIJ d S )NZscalar      ?r  r`   rH      .r   )r   r$   rf   Zh5screateZSCALARZselect_noneZh5rrt   ZDATASET_REGIONr   rI   rH   Z
select_all)r   r)   ZsidrE  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)rI   r   r2   rC  r/   r0   Z	selectionrD  r   r   r   test_ref_shape  s   zTestRegionRefs.test_ref_shapeN)
r   r   r   r+   r   rF  empty_regionref_xfailrG  rL  rN  r   r   r   r   rB    s    

rB  c                   @   r  )	
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   rO   r   .r  )r   r$   rI   rn   r#  ro   r   r2   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 rQ  )r   r$   rI   rn   r/   r   r#  r1   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 rQ  )r   r$   rI   rn   r  r#  ro   rR  r   r   r   test_astype_wrapper_asarray3  s   z&TestAstype.test_astype_wrapper_asarrayN)r   r   r   r+   rS  rT  rU  r   r   r   r   rP  $  s
    rP  c                   @   r   )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   rO   r   r  )rI   rH   r   r$   r/   )r   r  r2   r   r   r   test_scalar_compoundA  s   z'TestScalarCompound.test_scalar_compoundN)r   r   r   r+   rW  r   r   r   r   rV  :  s    rV  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   sR  t t}| jjdd|d}td|d< td|d< g d|d< td|d< | |d td | |d td | |d tg d | |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"   rO   rl   r   r   r'  rW   r   r#   )
rf   
vlen_dtyperg  r   r$   rI   rn   ro   r   r   r   r   r   r   ri  I  s    
&"zTestVlen.test_intc                 C   s6   t t}| jjdd|d}| jdd|d j d S )NrY  r5   rO   vlen2r   )rf   rZ  rg  r   r$   rH   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   rY  r5   rO   r[  r   )	rg  rf   rZ  r   r$   rb  r   r   rH   )r   r  r)   fnamer   r   r   test_reuse_struct_from_other`  s   
$z%TestVlen.test_reuse_struct_from_otherc                 C   s@  t t}| jjdd|d}tddg|d< tdg|d< g d|d	< | |d tddg | |d tdg | |d	 tg d
 tjg dtdgt	d|dd	< | |d td | |d td ttg dtg dg|dd	< | |d td | |d td d S )NrY  r   rO   gffffff?333333?r   r   )r_  rW   rl   rW   r'  )皙?g?g @g@r#   r#   r   )r`  r_  皙@)皙?r_  ra  rl   )
rf   rZ  rg  r   r$   rI   r   ro   rn   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 )NrY  )rW   rW   rO   r   r<  rl   rW   )	rf   rZ  rg  r   r$   rI   rn   r   r   r   r   r   r   test_multidimy  s   
zTestVlen.test_multidimrY  c                 C   sP  t |}| jj|d|d}tjg d|d}tjg d|d}tjg dtdd}||}g d}	tj|	|d}
g d}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  rO   )rH         @g      >@)g33333Y@gi@gfffffX@g      %g     r)r   rW   r  r   )rH  re  g      @r  g      )r   ir   r   i'  r   r   r   rW   rl   r#   g333333?ra  N)rf   rZ  r   r$   rI   r   rH   r#  ro   rA  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      t d}| | d S )Nr  rI   rH   rg  r   rf  r   r   r   test_numpy_float16     
zTestVlen.test_numpy_float16c                 C   rh  )Nfloat32ri  rj  r   r   r   test_numpy_float32  rl  zTestVlen.test_numpy_float32c                 C   rh  )Nr  ri  rj  r   r   r   test_numpy_float64_from_dtype  rl  z&TestVlen.test_numpy_float64_from_dtypec                 C   s   t j}| | d S r   )rI   r  rg  rj  r   r   r   test_numpy_float64_2  s   zTestVlen.test_numpy_float64_2c                 C   s  | j jddtdd tg d}|ddd | j d d< t| j d d |ddd ksBJ | j d d  d	|ddd  | j jd
dtdd tg d}|ddd | j d
 d< t| j d
 d |ddd ksJ | j d
 d  d	|ddd  dS )z4Test that non-contiguous arrays are stored correctlyZncr   r\  rO   )TFTTFFFNrW   r   z != Znc2Zint8)rW   r#   r   r   r   rl   r   )r   r$   rf   rZ  rI   r   r  )r   r  r  r   r   r   test_non_contiguous_arrays  s   FJz#TestVlen.test_non_contiguous_arraysN)rY  )r   r   r   ri  r\  r^  rc  rd  rg  rk  rn  ro  rp  rq  r   r   r   r   rX  H  s    
	0rX  c                   @   r   )TestLowOpenc                 C   s   | j dd}|j }dS )z Test H5Dget_access_plist r!   r"   N)r   r$   rt   r{  )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)rf   Zh5prK  ZDATASET_ACCESSr   r$   Zh5dru  rt   r%   Z	DatasetID)r   Zdaplr2   dsidr   r   r   	test_dapl  s
   zTestLowOpen.test_daplN)r   r   r   rs  rv  r   r   r   r   rr    s    rr  )r   r?   r   z#chunk info requires  HDF5 >= 1.10.5c               	   C   sb  ddl m}  |  }t|d}|jddddd d	|d d d < W d    n1 s+w   Y  |d t|d
l}|d j}| dksIJ tdD ]0}t	t
t
|dd }||}|j|kshJ |jdksoJ |jd usvJ |jdks}J qM|d}|jdksJ |jdksJ |jd usJ |jdksJ W d    d S 1 sw   Y  d S )Nr   BytesIOr   r  r  re   r   r0   r   rH   r   r_  r   r?   r<  )iorx  rf   r   r$   seekrt   get_num_chunksrc  r   rI   r   Zunravel_indexget_chunk_infochunk_offsetfilter_maskbyte_offsetrB   Zget_chunk_info_by_coord)rx  buffoutfinr)   joffsetsir   r   r   test_get_chunk_details  s.   



"r  )r   r   rl   )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 d
   n1 s+w   Y  |d t|d6}|d j}| }|dksKJ i  t|D ]}|	|}| |j
< qQ fdd}|| W d
   d
S 1 stw   Y  d
S )z%H5Dchunk_iter() for chunk informationr   rw  r   r  r  re   r   ry  r   Nr_  r   c                    sN    | j  }| j |j ksJ | j|jksJ | j|jksJ | j|jks%J d S r   )r~  r  r  rB   )Z
chunk_infoZknownZcir   r   callback  s
   
z!test_chunk_iter.<locals>.callback)rz  rx  rf   r   r$   r{  rt   r|  rc  r}  r~  Z
chunk_iter)rx  r  r   ru  Z
num_chunksr  r  r  r   r  r   test_chunk_iter  s$   


"r  c                 C   s.   | j ddd}|jd u sJ |jd u sJ d S )Nr>  r   rO   )r$   r0   r   )r   r)   r   r   r   test_empty_shape  s   r  c                  C   s   ddl m}  |  }t|d}|jddd W d    n1 s!w   Y  |d t|d(}|d jd u s;J |d j d u sFJ |d j	 dksQJ W d    d S 1 s\w   Y  d S )Nr   rw  r   r>  r  rO   r_  )
rz  rx  rf   r   r$   r{  r   rt   Z
get_offsetZget_storage_size)rx  r  r  r  r   r   r   test_zero_storage_size%  s   
"r  c                 C   s   t t jjt t jjd g}| jd|t jd}|jt t jks$J t j|d d  t j	|t jd ||d d < t j|d d  t j	|t jd d S )Nr   r  rI  rO   )
rI   Ziinfor   maxr$   Zuint64rH   r   r   r   )r   r`   r)   r   r   r   test_python_int_uint643  s    "&r  c                 C   s<   | j ddtjd}tjjddd}||d d g ddf< d S )	Nr`   )r   r  rW   rO      )r   rl   rW   re  )r   rW   r#   .)r$   rI   r  r`  rf  )r   r   blockr   r   r   test_setitem_fancy_indexingA  s   r  c                  C   F   t td} | d d dksJ W d    d S 1 sw   Y  d S )Nzvlen_string_dset.h5ZDS1r   s   Partingr   r   r   r   r   r   test_vlen_spacepadH     "r  c                  C   r  )Nzvlen_string_dset_utc.h5Zds1r   s   2009-12-20T10:16:18.662409Zr  r  r   r   r   test_vlen_nulltermM  r  r  )r   r?   rl   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v sJ d S )N   r`   re   T)r0   rH   r&  Zallow_unknown_filter)r$   rI   r  r'   _filters)r   Zfake_filter_idr)   r   r   r   test_allow_unknown_filterR  s   
r  c               
   C   s  ddl m}  |  }t|d0}|jdddddd	d
d}|j  }|j  dd |ks2J |dks8J W d   n1 sBw   Y  |	d t|d0}|j
ddddddd}|j  }|j  dd |kstJ |dkszJ W d   dS 1 sw   Y  dS )z2Chunk cache configuration for individual datasets.r   rw  r   r  )r?   r   )r   r#   r       rb    )r0   r   rH   rdcc_nbytesrdcc_w0rdcc_nslotsr   N)r  r  rb  r_    0 q=
ףp?  )r0   rH   r  r  r  )r  r  r  )rz  rx  rf   r   r$   rt   r{  Zget_chunk_cacheZ	get_cacher{  r   )rx  r  r  r)   Zds_chunk_cacher  r   r   r   test_dset_chunk_cache`  s*   
"r  c                   @   r6  )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s$J t||k||kks1J d}t|| }t||k||kksGJ t||k||kksTJ dS )z
        Create a h5py dataset, extract one element convert to numpy
        Check that it returns symmetric response to == and !=
        r   r   r  rH   r`   r   gMbP?N)	r   r$   rX  rI   r`  ra  r  r  Znanmax)r   r0   r2   valZ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J ||k||kks(J 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$   rX  rI   r`  ra  )r   r0   r2   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?   rW   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s'J d S )Nr  /path/to/virtualr  )rH   r`   virtual_prefix)r   r$   rX  rI   r`  ra  ry  rz  rt   r{  get_virtual_prefixr}  r~  )r   r0   r  r2   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!   rk   r   )r  )r   r   ry  rz  rt   r{  r  r}  r~  r/   r%   r   r0   )r   r  r2   r  r   r   r   test_virtual_prefix_require  s   z-TestVirtualPrefix.test_virtual_prefix_requireN)
r   r   r   r+   r   r[   r   rx  r  r  r   r   r   r   r    s    

r  )ar+   ry  r  r  ZnumpyrI   rP   rR   warningscommonr   r   Z
data_filesr   rf   r   r   r   Zh5py._hl.baser	   r
   r   r   Zh5py.h5py_warningsr   r   Zh5py._hl.selectionsr-  Z
selectionsZselr   r    r,   r]   r   r   r   r   r  r   r   rg  r   r   rX  rm  r  r  r  r  r[   filtersr  r#  r7  r?  rG  rL  rQ  rT  rm  r  r  r  r  r  r  r  r  r  r%  r*  r1  r6  r:  rS   rx  rO  rB  rP  rV  rX  rr  r5  r  r  r  r  r  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 





-