o
    µ2śh6  ć                   @   s“   d Z ddlZddlmZ ddlZddlmZ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eZG dd deZG dd deZG dd deZdS )a  
    Dataset slicing test module.

    Tests all supported slicing operations, including read/write and
    broadcasting operations.  Does not test type conversion except for
    corner cases overlapping with slicing; for example, when selecting
    specific fields of a compound type.
é    Né   )ŚTestCase)ŚFileŚMultiBlockSlicec                   @   s   e Zd Zdd Zdd ZdS )ŚBaseSlicingc                 C   s   t |  ” d| _d S )NŚw)r   ŚmktempŚf©Śself© r   śR/var/www/html/chatgem/venv/lib/python3.10/site-packages/h5py/tests/test_slicing.pyŚsetUp   s   zBaseSlicing.setUpc                 C   ó   | j r
| j  ”  d S d S ©N©r	   Ścloser
   r   r   r   ŚtearDown   ó   ’zBaseSlicing.tearDownN)Ś__name__Ś
__module__Ś__qualname__r   r   r   r   r   r   r      s    r   c                   @   ó8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )ŚTestSingleElementzM
        Feature: Retrieving a single element works with NumPy semantics
    c                 C   s,   | j jdddd}|d }|  |tj” dS )z; Single-element selection with [index] yields array scalar Śx©r   Śi1©Śdtyper   N©r	   Ścreate_datasetŚassertIsInstanceŚnpŚint8©r   ŚdsetŚoutr   r   r   Śtest_single_index)   ó   z#TestSingleElement.test_single_indexc                 C   ó:   | j jdddd}|d }|  |tj” |  |jd” dS )z3 Single-element selection with [()] yields ndarray r   r   r   r   r   N©r	   r    r!   r"   ŚndarrayŚassertEqualŚshaper$   r   r   r   Śtest_single_null/   ó   z"TestSingleElement.test_single_nullc                 C   r)   )z* Slicing with [...] yields scalar ndarray r   r   r	   ©r-   r   .Nr*   r$   r   r   r   Śtest_scalar_index6   r/   z#TestSingleElement.test_scalar_indexc                 C   s,   | j jdddd}|d }|  |tj” dS )z' Slicing with [()] yields array scalar r   r   r   r0   Nr   r$   r   r   r   Śtest_scalar_null=   r(   z"TestSingleElement.test_scalar_nullc                 C   sX   t  ddg”}t jd|d}| jjdd|d}|  |d |d ” |  |d t j” dS )	z6 Compound scalar is numpy.void, not tuple (issue 135) )ŚaŚi4)ŚbŚf8)é   r   Śfoo©Śdatar   N)r"   r   Śonesr	   r    r,   r!   Śvoid)r   ŚdtŚvr%   r   r   r   Śtest_compoundC   s
   zTestSingleElement.test_compoundN)	r   r   r   Ś__doc__r'   r.   r1   r2   r?   r   r   r   r   r   #   s    r   c                   @   r   )ŚTestObjectIndexzH
        Feature: numpy.object_ subtypes map to real Python objects
    c                 C   s:   | j jddtjd}| j j|d< |  t|d tj” dS )z@ Indexing a reference dataset returns a h5py.Reference instance r   r   r   r   N©r	   r    Śh5pyŚ	ref_dtypeŚrefr,   ŚtypeŚ	Reference©r   r%   r   r   r   Śtest_referenceQ   ó   zTestObjectIndex.test_referencec                 C   sN   | j  dd”}|jd }| j jddtjd}||d< |  t|d tj” dS )	zL Indexing a region reference dataset returns a h5py.RegionReference
        r   )é
   rK   .Śyr   r   r   N)r	   r    Ś	regionrefrC   Śregionref_dtyper,   rF   ŚRegionReference)r   Śdset1ŚregrefŚdset2r   r   r   Śtest_regrefW   s
   
zTestObjectIndex.test_regrefc                 C   s\   t  ddtjfg”}| jjdd|d}d| jd jf|d< |d }|  t|d	 tj	” d
S )z> Compound types of which a reference is an element work right )r3   Śir5   r   r   r   é*   ś/r   r   N)
r"   r   rC   rD   r	   r    rE   r,   rF   rG   ©r   r=   r%   r&   r   r   r   Śtest_reference_field`   s
   z$TestObjectIndex.test_reference_fieldc                 C   s:   | j jddtjd}| j j|d< |  t|d tj” dS )z: Indexing returns a real Python object on scalar datasets r   r   r   NrB   rH   r   r   r   Śtest_scalarj   rJ   zTestObjectIndex.test_scalarc                 C   s:   | j jddtjddd}d|d< |  t|d t” dS )	zJ Indexing a byte string dataset returns a real python byte string
        r   r   Śascii)Śencodingr   s   Hello there!r   N)r	   r    rC   Śstring_dtyper,   rF   ŚbytesrH   r   r   r   Śtest_bytestrp   s   zTestObjectIndex.test_bytestrN)	r   r   r   r@   rI   rS   rX   rY   r^   r   r   r   r   rA   K   s    	
rA   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )ŚTestSimpleSlicingzQ
        Feature: Simple NumPy-style slices (start:stop:step) are supported.
    c                 C   s4   t |  ” d| _t d”| _| jjd| jd| _d S )Nr   rK   r   r9   )r   r   r	   r"   ŚarangeŚarrr    r%   r
   r   r   r   r   }   s   zTestSimpleSlicing.setUpc                 C   r   r   r   r
   r   r   r   r      r   zTestSimpleSlicing.tearDownc                 C   s$   |   | jdd | jdd ” dS )z0 Negative stop indexes work as they do in NumPy é   éž’’’N)ŚassertArrayEqualr%   ra   r
   r   r   r   Śtest_negative_stop   s   $z$TestSimpleSlicing.test_negative_stopc                 C   st   | j  dd”}t d”}|dddf |dddf< |  t” ||dddf< W d   dS 1 s3w   Y  dS )z0Assigning to a 1D slice of a 2D dataset
        Śx2)rK   rb   )rK   r   Nr   r   )r	   r    r"   ŚzerosŚassertRaisesŚ	TypeError)r   r%   r   r   r   r   Ś
test_write   s   
"’zTestSimpleSlicing.test_writeN)r   r   r   r@   r   r   re   rj   r   r   r   r   r_   w   s    r_   c                   @   r   )ŚTestArraySlicingz<
        Feature: Array types are handled appropriately
    c                 C   sĄ   t  d”}| jjdd|d}|  |jd” |  |j|” |d }|  |jt  d”” |  |jd” |d }|  |jt  d”” |  |jd	” |d
dd
 }|  |jt  d”” |  |jd” dS )z; Read arrays tack array dimensions onto end of shape tuple ś(3,)f8r   ©rK   r   .r6   )rK   é   r   ©rn   rb   é   )rn   rn   N)r"   r   r	   r    r,   r-   rW   r   r   r   Ś	test_read   s   
zTestArraySlicing.test_readc                 C   sT   t  d”}| jjdd|d}|  t” d|d< W d   dS 1 s#w   Y  dS )z@ Array fill from constant is not supported (issue 211).
        ś(3,)ir   rm   r   rU   .N)r"   r   r	   r    rh   ri   )r   r=   r%   r   r   r   Śtest_write_broadcast°   s
   

"’z%TestArraySlicing.test_write_broadcastc                 C   sR   t  d”}| jjdd|d}t  g d¢”}||d< |d }|  t  ||k”” dS )zA Write a single element to the array

        Issue 211.
        rl   r   rm   r   )r   rb   g      @r7   N)r"   r   r	   r    ŚarrayŚ
assertTrueŚall)r   r=   r%   r:   r&   r   r   r   Śtest_write_elementŗ   s   
z#TestArraySlicing.test_write_elementc                 C   s   t  d”}t jd|d}t jd|d}| jjdd|d}||dddd	f< |  |dddd	f |” ||d
ddddf< |  |d
ddddf |” dS )z Write slices to array type rr   )rb   r   )r7   é   r   )rK   é	   é   r   rb   r7   rn   r   rx   é   rz   N)r"   r   r;   r	   r    rd   )r   r=   Śdata1Śdata2r%   r   r   r   Śtest_write_slicesČ   s   
"z"TestArraySlicing.test_write_slicesc                 C   sH   t  d”}| jjdd|d}|d }||d< |  t  |d |k”” dS )zO Read the contents of an array and write them back

        Issue 211.
        rl   r   rm   r   .N)r"   r   r	   r    ru   rv   rW   r   r   r   Śtest_roundtripŲ   s
   
zTestArraySlicing.test_roundtripN)	r   r   r   r@   rq   rs   rw   r~   r   r   r   r   r   rk      s    
rk   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	ŚTestZeroLengthSlicingz.
        Slices resulting in empty arrays
    c                 C   sŲ   t g d¢D ]c\}}| jjd| |tdt| d}|  |j|” |d }|  |tj	” |  |j|” |dd }|  |tj	” |  |j|” t|dkri|ddddf }|  |tj	” |  |jdd d	” qdS )
z] Slice a dataset with a zero in its shape vector
            along the zero-length dimension )©r   )r   rn   )r   rb   r   śx%dr   ©r   Śmaxshape.Nr   rb   )r   r   ©
Ś	enumerater	   r    ŚintŚlenr,   r-   r!   r"   r+   ©r   rT   r-   r%   r&   r   r   r   Ś test_slice_zero_length_dimensionģ   s    ōz6TestZeroLengthSlicing.test_slice_zero_length_dimensionc                 C   s|   t g d¢D ]5\}}| jjd| |tdt| d}|  |j|” |dd }|  |tj	” |  |jd|dd  ” qdS )z_ Slice a dataset with a zero in its shape vector
            along a non-zero-length dimension ))rn   r   )r   rb   r   )rb   r   r   r   r   r   Nr   r   r   r   r   r   r   Śtest_slice_other_dimensionż   s    ūz0TestZeroLengthSlicing.test_slice_other_dimensionc                 C   s   t g d¢D ]8\}}| jjd| t |t”dt| d}|  |j|” |dd }|  	|tj
” |  |jd|dd  ” qdS )z5 Get a slice of length zero from a non-empty dataset )ro   )rb   rb   )rb   r   rx   r   r   )r:   r   r   r   N)r   r	   r    r"   rg   r   r   r,   r-   r!   r+   r   r   r   r   Śtest_slice_of_length_zero  s   &ūz/TestZeroLengthSlicing.test_slice_of_length_zeroN)r   r   r   r@   r   r   r   r   r   r   r   r   ę   s
    
r   c                   @   sT   e Zd ZdZe g d¢”ZejdedZdd Z	dd Z
d	d
 Zdd Zdd ZdS )ŚTestFieldNamesz*
        Field names for read & write
    ))r3   r	   )r5   rT   )ŚcŚf4©éd   r   c                 C   s0   t  | ” | jjdd| jd| _| j| jd< d S )Nr   r   r   .)r   r   r	   r    r=   r%   r:   r
   r   r   r   r     s   
zTestFieldNames.setUpc                 C   s   |   | jd | jd ” dS )z! Test read with field selections r3   N)rd   r%   r:   r
   r   r   r   rq     s   zTestFieldNames.test_readc                 C   sN   |   | jd | jd ” d| jd< | j ” }d|d< |   | jd |d ” dS )z, Unicode field names for for read and write r3   rU   N)rd   r%   r:   Ścopy)r   r:   r   r   r   Śtest_unicode_names"  s
   

z!TestFieldNames.test_unicode_namesc                 C   sŗ   | j  ” }|d  d9  < || jd< |  t | jd |k”” |d  d9  < || jd< |  t | jd |k”” |d  d9  < |d  d9  < || jd< |  t | jd |k”” d	S )
z" Test write with field selections r3   rb   .r5   r7   rn   r   )r3   r   N©r:   r   r%   ru   r"   rv   ©r   r}   r   r   r   rj   *  s   



zTestFieldNames.test_writec                 C   s:   | j  ” }d|d< d| jd< |  t | jd |k”” dS )z4 Test write with non-compound source (single-field) g      š?r5   .Nr   r   r   r   r   Śtest_write_noncompound8  s   

z%TestFieldNames.test_write_noncompoundN)r   r   r   r@   r"   r   r=   r;   r:   r   rq   r   rj   r   r   r   r   r   r     s    r   c                       s   e Zd Z f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  ZS )ŚTestMultiBlockSlicec                    s.   t   ”  t d”| _| jjd| jd| _d S )NrK   r   r9   )Śsuperr   r"   r`   ra   r	   r    r%   r
   ©Ś	__class__r   r   r   B  s   
zTestMultiBlockSlice.setUpc                 C   s2   t  }|  | d”d” tj | j| | j” d S )NrK   ©r   r   rK   r   ©r   r,   Śindicesr"   ŚtestingŚassert_array_equalr%   ra   ©r   Śmbslicer   r   r   Śtest_defaultG  s   z TestMultiBlockSlice.test_defaultc                 C   s<   t ddddd}|  | d”d” tj | j| | j” d S )Nr   rK   r   ©ŚstartŚcountŚstrideŚblockr   r   r    r   r   r   Śtest_default_explicitN  s   z)TestMultiBlockSlice.test_default_explicitc                 C   ó>   t dd}|  | d”d” tj | j| t g d¢”” d S )Nr7   )r¤   rK   )r7   r   r{   r   )r7   rx   r{   é   rp   ry   ©r   r,   r   r"   r   r   r%   rt   r    r   r   r   Ś
test_startT  ó   
"zTestMultiBlockSlice.test_startc                 C   r©   )NrŖ   ©r„   rK   )r   r   rŖ   r   )r   r   rb   rn   r7   rx   r{   r«   r    r   r   r   Ś
test_countZ  s
   
’zTestMultiBlockSlice.test_countc                 C   sD   t dd}|  t” | d” W d    d S 1 sw   Y  d S )Nrz   r®   rK   ©r   rh   Ś
ValueErrorr   r    r   r   r   Ś!test_count_more_than_length_errorb  s   
"’z5TestMultiBlockSlice.test_count_more_than_length_errorc                 C   r©   )Nrb   )r¦   rK   )r   rb   rx   r   )r   rb   r7   r{   rp   r«   r    r   r   r   Śtest_strideg  r­   zTestMultiBlockSlice.test_stridec                 C   sB   |   t” tddd d” W d    d S 1 sw   Y  d S )Nr   ©r¦   r§   rK   )rh   r±   r   r   r
   r   r   r   Śtest_stride_zero_errorm  s   "žz*TestMultiBlockSlice.test_stride_zero_errorc                 C   s8   t ddd}|  | d”d” tj | j| | j” d S )Nrb   r“   rK   )r   rb   rx   rb   r   r    r   r   r   Śtest_stride_block_equalr  s   z+TestMultiBlockSlice.test_stride_block_equalc                 C   sp   |   t” tdd W d    n1 sw   Y  |   t” tddd W d    d S 1 s1w   Y  d S )Nrn   )r§   rb   r“   )rh   r±   r   r
   r   r   r   Ś!test_block_more_than_stride_errorx  s   ’"’z5TestMultiBlockSlice.test_block_more_than_stride_errorc                 C   s@   t ddd}|  | d”d” tj | j| t g d¢”” d S )Nrn   rb   r“   rK   )r   rn   rn   rb   )r   r   rn   r7   r{   rŖ   r«   r    r   r   r   Śtest_stride_more_than_block  s   "z/TestMultiBlockSlice.test_stride_more_than_blockc                 C   sJ   t ddddd}|  t” | d” W d    d S 1 sw   Y  d S )Nrb   rx   r7   r£   rK   r°   r    r   r   r   Ś test_block_overruns_extent_error  s   "’z4TestMultiBlockSlice.test_block_overruns_extent_errorc                 C   sD   t ddddd}|  | d”d” tj | j| t g d¢”” d S )	Nr   rb   rx   r7   r£   rK   )r   rx   rb   r7   )r   rb   rn   r7   r{   rŖ   rp   ry   r«   r    r   r   r   Śtest_fully_described  s
   ’z(TestMultiBlockSlice.test_fully_describedc                 C   sB   t dddd}|  | d”d” tj | j| t g d¢”” d S )Nr   rn   rb   ©r¤   r¦   r§   rK   )r   rn   rn   rb   )r   rb   r7   rx   rŖ   rp   r«   r    r   r   r   Śtest_count_calculated  s   "z)TestMultiBlockSlice.test_count_calculatedc                 C   sH   t dddd}|  t” | d” W d    d S 1 sw   Y  d S )Nrp   r7   rn   r»   rK   r°   r    r   r   r   Ś test_zero_count_calculated_error  s   "’z4TestMultiBlockSlice.test_zero_count_calculated_error)r   r   r   r   r¢   rØ   r¬   rÆ   r²   r³   rµ   r¶   r·   rø   r¹   rŗ   r¼   r½   Ś__classcell__r   r   r   r   r   @  s     r   )r@   Śnumpyr"   Ścommonr   rC   r   r   r   r   rA   r_   rk   r   r   r   r   r   r   r   Ś<module>   s   			(,R*0