o
    i e                    @   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   F/var/www/myenv/lib/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   )ppc64lez(Storage of long double deactivated on %sN)
r   r$   rI   
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:   rW   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   rV   r   skipIfhasattrrI   rX   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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   rb   r2   r   r   r   r3         z!TestCreateData.test_create_scalarc                 C   r`   )z/ Create an extended dataset from existing data r:   r   r!   ra   Nrc   re   r   r   r   rC      rf   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   rb   .N)rI   aranger   r$   r/   r0   assertArrayEqualreshapere   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   )rv   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   abcra   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   S3rO   ra   rn   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   abcra   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   U3rO   ra   )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$   ri   r	   rv   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   ra   )r   r$   rh   Emptyri   r	   rv   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#   rn   ro   )rL   ru   r   r$   rI   rp   r   r   r   r   test_create_incompatible_data   s   "z,TestCreateData.test_create_incompatible_dataN)r   r   r   r+   r3   rC   rj   rs   rw   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rl   r?      r   r         	   r>   rY   r>   rn   c           
      C   sl   t jt|dd|}|jd||d}t j|ddd}| }	|| |	|< |||| t j	||	 d S )Nint64rO   r2   ra   )
rI   rp   r
   rr   r$   fullcopyread_directtestingassert_array_equal)
r   writable_filesource_shape
dest_shape
source_seldest_sel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   ra   )r$   rI   rp   rd   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 	Nedsetr   rO   r   r   r?   r   r@   )r$   rI   rd   rT   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   rd   rT   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   rg   r   rO   F)orderr   r   r   r   r   test_not_c_contiguous  
   "z&TestReadDirectly.test_not_c_contiguous)r   r   r   r+   rT   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   rY   r>   rn   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   rp   r
   rr   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$   rT   r   rM   r   rI   rd   r   )r   r   r   r   r   r   r   !  s   *"zTestWriteDirectly.test_emptyc                 C   r   r   r$   rI   rd   rT   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+   rT   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!   rm   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!   rm   r   Nr   r   r/   rZ   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   bazs   bazNr   rZ   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!   rm   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!   rm   r   N)r   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!   rm   r   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!   rm   r   TexactN)r   r$   r   r/   rZ   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!   rm   i4i2Fr   N)r   r$   r   r/   rH   rI   rZ   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   ru   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   rY   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!   rn   
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!   )rn   r   r   )r   r   r   r  r?   r   N(         r   rY   )r   r$   rI   r   ri   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!   S100T)rH   r   Nr   rH   r   )rT   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   assertNotIsInstancerI   ndarrayr1   r   r   r   test_property  rk   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   i8r5   rO   r   r!   r   r   r#   N)rI   rH   rd   r   r$   r/   r   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 f8typexr   rO   N)	rI   rH   r   r$   r/   rv   rx   ri   	committedr1   r   r   r   
test_named  s
   zTestCreateNamedType.test_namedN)r   r   r   r+   r1  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   rl   r3  r   compressioncompression_optsNr   r$   r/   r7  r8  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!   r5  r3  r7  r#   Nr9  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!   r5  r   r;  r3  N)r   r$   r/   r7  r8  rh   _hldataset_LEGACY_GZIP_COMPRESSION_VALSr  rL   ru   )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!   r5     r;  Nr3  r6  )rL   ru   RuntimeErrorr   r$   r   r   r   r   test_gzip_exc#  s   "zTestCreateGzip.test_gzip_excN)r   r   r   r+   r:  r<  rB  rF  r   r   r   r   r4    s    r4  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!   r5  )r   r6  r3  r   N)rh   r>  r?  r@  r  r   r$   h5zFILTER_DEFLATEr/   r7  r8  )r   rA  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!   r5  ir;  NzInvalid filterr   zUnknown compression)rL   ru   r   r$   assertInr'   	exceptionrh   r>  r?  r@  r  
IndexErrorrI  rJ  )r   erA  r   r   r   test_compression_number_invalidA  s"   
z;TestCreateCompressionNumber.test_compression_number_invalidN)r   r   r   r+   rK  rP  r   r   r   r   rH  .  s    rH  lzfzLZF is not installedc                   @   rG  )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!   r5  rQ  r;  Nr   r<   )rb   r7  r   )	r   r$   r/   r7  r8  rI   rp   flushrq   )r   r2   testdatareaddatar   r   r   test_lzf]  s   

zTestCreateLZF.test_lzfc                 C   r   )z& Giving lzf options raises ValueError r!   r5  rQ  r#   r6  Nr   r   r   r   r   test_lzf_excm  s
   "zTestCreateLZF.test_lzf_excN)r   r   r   r+   rW  rX  r   r   r   r   rR  V  s    rR  szipzSZIP is not installedc                   @   r   )TestCreateSZIPrS  c                 C   s   | j jddddd}dS )z Create with explicit szip r!   r5  rY  )ec   r6  N)r   r$   r1   r   r   r   	test_szip{  s   
zTestCreateSZIP.test_szipN)r   r   r   r+   r]  r   r   r   r   rZ  t      rZ  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!   r5  T)r_  N)r   r$   ri   r_  r1   r   r   r   test_shuffle     zTestCreateShuffle.test_shuffleN)r   r   r   r+   rb  r   r   r   r   r`    r^  r`  
fletcher32zFLETCHER32 is not installedc                   @   r   )TestCreateFletcher32z=
        Feature: Datasets can use the fletcher32 filter
    c                 C   ra  )z Enable fletcher32 filter r!   r5  T)rd  N)r   r$   ri   rd  r1   r   r   r   test_fletcher32  rc  z$TestCreateFletcher32.test_fletcher32N)r   r   r   r+   rf  r   r   r   r   re    r2  re  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!   r5  TrH   rg  NrL   ru   r   r$   floatr1   r   r   r    test_float_fails_without_options     "z6TestCreateScaleOffset.test_float_fails_without_optionsc                 C   ri  )z# Check when scaleoffset is negetiver!   r5  grj  Nrk  r1   r   r   r   test_non_integer  rn  z&TestCreateScaleOffset.test_non_integerc                 C   ri  )z% Check when dtype is unsupported typer!   r5  Trj  N)rL   rM   r   r$   boolr1   r   r   r   test_unsupport_dtype  rn  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!   rj  N.r)	precision)rI   randomrandr   r$   rl  rg  filenamer   rh   r   rq   r  )r   scalefacr0   rangerU  r2   rw  rV  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  rr  r   rY   r   rB   r!   Trj  N.rs  )rI   ru  randintr   r$   intrg  rw  r   rh   r   rq   r   nbitsr0   rU  r2   rw  rV  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  rr  r   rY   r{  r!   rj  .rs  N)rI   ru  r|  r   r$   r}  ri   rg  rw  r   rh   r   rq   r~  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 )r  r  rr  r   rY   r   r{  r!   rj  .rs  N)rI   ru  r|  r   r$   r}  ri   rg  rw  r   rh   r   r  r~  r   r   r   test_int_with_minbits_lossy  s   
z1TestCreateScaleOffset.test_int_with_minbits_lossyN)r   r   r   r+   rm  ro  rq  rz  r  r  r  r   r   r   r   rh    s    rh  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   ru  r   r   	UNLIMITEDr   r$   rH   r  openreadtobytesrh   r   hdf5_version_tuplepathlibPathrv   get_access_plistget_efile_prefixdecodeas_posixrw  parent)
r   r0   rU  ext_filer  r2   fidcontentsr  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_prefixr  r   r!   r  .Nr  r  )r  r   )rI   ru  r   ospathbasenamer   r  r   r$   rH   dirnamer  r  r  r  rh   r   r  r  r  rv   r  r  r  r  r  r   )r   r0   rU  r  r  r2   r  r  r  r  r[   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!   r  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!   r  r  N)r   r$   r  r  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>poor  r  N)r   iterry  r   r$   r  r  )r   Nr  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 r  r   zh5f.UNLIMITEDr!   r  N)r   rM   r   r  ru   rL   r   r$   )r   r0   r  exc_typer  r   r   r   test_invalid\  s   

	zTestExternal.test_invalidN)
r   r   r   r+   r  r  r  r  r  r  r   r   r   r   r    s    	r  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   )	rv   rx   r/   r.  rh   r   rz   r{   r|   )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  rh   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   bcr  rO   r  N)	chrr   r  rh   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  rh   r   r   r/   rv   rx   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   lollike_lol)r   r   )	rI   rp   rr   r   create_dataset_liker/   r0   assertIsr   )r   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 )
Nhondar  T)rb   track_timesr   hyundaiibmFlenovo)r   r$   rI   rp   assertNotEqualrh   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/   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!   r5  r   r@   r  Nr   r$   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!   r5  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  )rl   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!   r5  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!   r5  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!   r5  r  r  r   r   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!   r5  r  r  r   rY   r  N)r   r$   rL   ru   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                   @   rG  )	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) rs  r!  r!   r  N)rI   rH   float16r   r$   r/   )r   	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                   @   rG  )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                   @   rG  )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 rl   r   rO   rm   r!   ra   rn   N)	rI   rp   rr   r   r$   zipr/   r  rq   )r   rb   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)rh   string_dtyper   r$   rv   rx   r/   r.  r   rz   r{   r   check_string_dtyperH   r'  r   r  r)   r   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rh   r  r   r$   r/   asstrr  r   r   r  
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)rh   r  r   r$   rv   rx   r/   r.  r   rz   r{   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)rh   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$   rv   rx   r/   r.  rh   r   rz   assertFalser|   r}   r{   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   rY   r#   r>      Ur?   S)rh   r  r   r$   rv   rx   r/   r{   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)	rh   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)rh   r  r   r$   r/   r.  bytesr   r  r)   rb   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   )	rh   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   r1  r   r)  ignorefiltelatin-1r?   r   )r   r$   rh   r  r  rL   UnicodeDecodeErrorr/   r  r  rI   r   r   r   r   asarray)r   r)   rb   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)  r3  r   r5  r   )rh   r  r   r$   rI   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   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   r1  r   N)rh   r  r   r$   rL   UnicodeEncodeError)r   r  r)   rb   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)	rh   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)rh   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/  r0  r2  r9  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)weightcputimewalltimeparents_offset	n_parentsstatusendpoint_typer\  rO   r   test.N)rI   rH   float64uint32uint8r  fieldsru  r   ri   r  r/   )r   r  rU  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 )
NrC  rn   rI  rJ  rO   r{  r   rK  .)rI   rH   rL  rN  r  rO  ru  r0   r   r$   ri   r  r/   )r   r  rU  rP  r)   rQ  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  rJ  rO   r   rK  r\  )rI   rH   rL  r  rO  ru  r   r   r   r7  r   astyper  )r   r  rU  rP  dt_intr   r   r   test_fieldsU  s0   

$" zTestCompound.test_fieldsN)r   r   r   r+   rR  rS  rV  r   r   r   r   rB  *  s
    rB  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   3int8rO   r   rY   rn   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 rX  )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   rW  y  s    rW  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"  )REDGREEN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!  basetyper/  r  rO   N)rh   
enum_dtypeEDICTr   r$   rH   check_enum_dtyper/   )r   r  r)   dt2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   ra  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   )	rh   rc  rd  r   r$   r/   rq   rI   r   r)  r   r   r   test_readwrite  s   &zTestEnum.test_readwriteN)r   r   r   r+   rd  r   rj  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   rd   rq   )r   r  r2   rb   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)rl  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   
IEEE_F16LErH   r   r   r   r   test_mini_mapping  s   
zTestFloats.test_mini_mappingN)r   r   r   r+   rl  r   
skipUnlessr^   rI   rm  ro  r   r   r   r   rk    s    
rk  c                   @   rG  )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$   rh   r  r  r  r  r/   )r   r)   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"   nullrr  NrK   r   r   r   r   test_invalid_track_times  r   z'TestTrackTimes.test_invalid_track_timesN)r   r   r   r+   rt  rv  r   r   r   r   rq    s    rq  c                   @   rG  )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/  rx  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+   rz  r|  r   r   r   r   rw    s    rw  )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/  ra   .)	r   r   rI   rp   rr   rb   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  rh  r?   r   r   N)rI   r   r2   	regionrefrq   rb   r   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   r  rB   )r   r  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 )Nscalar      ?r  rb   rH      .r   )r   r$   rh   h5screateSCALARselect_noneh5rrv   DATASET_REGIONr   rI   rH   
select_all)r   r)   sidr  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  rh  r?   r   r   )r?      N)rI   r   r2   r  r/   r0   	selectionr  r   r   r   test_ref_shape  s   zTestRegionRefs.test_ref_shapeN)
r   r   r   r+   r   r  empty_regionref_xfailr  r  r  r   r   r   r   r    s    

r  c                   @   rA  )	
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   rp   rT  rq   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 r  )r   r$   rI   rp   r/   r  rT  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 r  )r   r$   rI   rp   r7  rT  rq   r  r   r   r   test_astype_wrapper_asarray3  s   z&TestAstype.test_astype_wrapper_asarrayN)r   r   r   r+   r  r  r  r   r   r   r   r  $  s
    r  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+   r  r   r   r   r   r  :  s    r  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   rn   r   r   rZ  rY   r   r#   )
rh   
vlen_dtyper}  r   r$   rI   rp   rq   r   r   r)  r   r   r   r  I  s    
&"zTestVlen.test_intc                 C   s6   t t}| jjdd|d}| jdd|d j d S )Nr  r5   rO   vlen2r   )rh   r  r}  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   r  r5   rO   r  r   )	r}  rh   r  r   r$   rw  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 )Nr  r  rO   gffffff?333333?r   r   )r  rY   rn   rY   rZ  )皙?g?g @g@r#   r#   r   )r  r  皙@)皙?r  r  rn   )
rh   r  r}  r   r$   rI   r   rq   rp   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 )Nr  )rY   rY   rO   r   ry  rn   rY   )	rh   r  r}  r   r$   rI   rp   r   r   r)  r   r   r   test_multidimy  s   
zTestVlen.test_multidimr  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   )r         @g      >@)g33333Y@gi@gfffffX@g      %g     r)r   rY   r#  r   )r  r  g      @r$  g      )r   ir   r   i'  r   r   r   rY   rn   r#   g333333?r  N)rh   r  r   r$   rI   r   rH   rT  rq   rT  r   )r   np_dtdataset_namer  r)   array_0array_1array_2casted_array_2list_3list_array_3list_4list_array_4r   r   r   _help_float_testing  s2   


zTestVlen._help_float_testingc                 C      t d}| | d S )Nr  rI   rH   r  r   r  r   r   r   test_numpy_float16     
zTestVlen.test_numpy_float16c                 C   r  )Nfloat32r  r  r   r   r   test_numpy_float32  r  zTestVlen.test_numpy_float32c                 C   r  )NrL  r  r  r   r   r   test_numpy_float64_from_dtype  r  z&TestVlen.test_numpy_float64_from_dtypec                 C   s   t j}| | d S r   )rI   rL  r  r  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 correctlyncr   rp  rO   )TFTTFFFNrY   r   z != nc2int8)rY   r#   r   r   r   rn   r   )r   r$   rh   r  rI   r   r  )r   r/  r  r   r   r   test_non_contiguous_arrays  s   FJz#TestVlen.test_non_contiguous_arraysN)r  )r   r   r   r  r  r  r  r  r  r  r  r  r  r  r   r   r   r   r  H  s    
	0r  c                   @   r   )TestLowOpenc                 C   s   | j dd}|j }dS )z Test H5Dget_access_plist r!   r"   N)r   r$   rv   r  )r   r)   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)rh   h5pr  DATASET_ACCESSr   r$   h5dr  rv   r%   	DatasetID)r   daplr2   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   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   rK  r  rg   r   r0   r   rH   r   rs  r   r?   ry  )ior  rh   r   r$   seekrv   get_num_chunksry  r  rI   r   unravel_indexget_chunk_infochunk_offsetfilter_maskbyte_offsetrB   get_chunk_info_by_coord)r  buffoutfinr)   joffsetsir   r   r   test_get_chunk_details  s.   



"r  )r   r  rn   )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   r  r   rK  r  rg   r   r  r   Nrs  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   )
chunk_infoknowncir   r   callback  s
   
z!test_chunk_iter.<locals>.callback)r  r  rh   r   r$   r  rv   r  ry  r  r  
chunk_iter)r  r  r   r  
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   r  r   r{  rN  rO   rs  )
r  r  rh   r   r$   r  r   rv   
get_offsetget_storage_size)r  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/  r  rO   )
rI   iinfor   maxr$   uint64rH   r   r   r   )r   rb   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 )	Nrb   )r   r  rY   rO      )r   rn   rY   r{  )r   rY   r#   .)r$   rI   rN  ru  r|  )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.h5DS1r   s   Partingr   r   r   r   r   r   test_vlen_spacepadH     "r  c                  C   r  )Nzvlen_string_dset_utc.h5ds1r   s   2009-12-20T10:16:18.662409Zr  r  r   r   r   test_vlen_nulltermM  r  r  )r   r?   rn   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   rb   rg   T)r0   rH   r7  allow_unknown_filter)r$   rI   rN  r'   _filters)r   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   r  r   r/  )r?   r   )r   r#   r       r    )r0   r   rH   rdcc_nbytesrdcc_w0rdcc_nslotsr   N)r  r  r  rs    0 q=
ףp?  )r0   rH   r  r  r  )r  r	  r
  )r  r  rh   r   r$   rv   r  get_chunk_cache	get_cacher  r   )r  r  r  r)   ds_chunk_cacher  r   r   r   test_dset_chunk_cache`  s*   
"r  c                   @   rG  )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   rK  rH   rb   r   gMbP?N)	r   r$   rl  rI   ru  rv  rL  r  nanmax)r   r0   r2   valdelta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  rK  r  r$  N)r   r$   rl  rI   ru  rv  )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?   rY   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/virtualrK  )rH   rb   virtual_prefix)r   r$   rl  rI   ru  rv  r  r  rv   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!   rm   r   )r  )r   r   r  r  rv   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   r  r  r  r   r   r   r   r    s    

r  )ar+   r  r  r  numpyrI   rR   rT   warningscommonr   r   
data_filesr   rh   r   r   r   h5py._hl.baser	   r
   r   r   h5py.h5py_warningsr   r   h5py._hl.selectionsr>  
selectionsselr   r    r,   r_   r   r   r   r   r  r   r   r}  r   r   rl  r  rL  r  r+  r,  r]   filtersr  r4  rH  rR  rZ  r`  re  rh  r  r  r  r  r  r  r  r
  r  rB  rW  r]  rk  rq  rw  rU   r  r  r  r  r  r  r  rp  r  r  r  r  r  r  r  r  skipifr  r  r  r  r   r   r   r   <module>   s   			FY0(CC&

,'qc,D TO
0 





-