o
    cd26  ć                   @   sĢ   d Z ddlZddlmZmZ ddlZddlmZmZm	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é   )ŚutŚTestCase)Śh5sŚh5tŚh5d)Ś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   ś7lib/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ŚnpZ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_null0   ó   z"TestSingleElement.test_single_nullc                 C   r,   )z* Slicing with [...] yields scalar ndarray r   r   r   ©r0   r"   .Nr-   r'   r   r   r   Śtest_scalar_index7   r2   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    r3   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) )ŚaZi4)ŚbŚf8)é   r!   Zfoo©Śdatar   N)r&   r"   Śonesr   r$   r/   r%   Zvoid)r   ŚdtŚvr(   r   r   r   Śtest_compoundD   s
   zTestSingleElement.test_compoundN)	r   r   r   Ś__doc__r*   r1   r4   r5   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_referenceR   ó   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$   Z	regionrefrC   Zregionref_dtyper/   rF   ZRegionReference)r   Zdset1ZregrefZdset2r   r   r   Śtest_regrefX   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 )r6   Śir7   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_fielda   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_scalark   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   Zstring_dtyper/   rF   ŚbytesrH   r   r   r   Śtest_bytestrq   s   zTestObjectIndex.test_bytestrN)	r   r   r   r@   rI   rM   rR   rS   rW   r   r   r   r   rA   L   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   r:   )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(   rZ   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
        Zx2)rK   r[   )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   r^   rb   r   r   r   r   rX   x   s    rX   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!   .r8   )rK   é   r   ©rf   r[   é   )rf   rf   N)r&   r"   r   r$   r/   r0   rQ   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   re   r!   rO   .N)r&   r"   r   r$   r`   ra   )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.
        rd   r   re   r!   )r   r[   g      @r9   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 rj   )r[   r!   )r9   é   r   )rK   é	   é   r   r[   r9   rf   r   rp   é   rr   N)r&   r"   r<   r   r$   r]   )r   r=   Z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.
        rd   r   re   r!   .N)r&   r"   r   r$   rm   rn   rQ   r   r   r   Śtest_roundtripŁ   s
   
zTestArraySlicing.test_roundtripN)	r   r   r   r@   ri   rk   ro   ru   rv   r   r   r   r   rc      s    
rc   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   rf   )r   r[   r   śx%dr   ©r"   Śmaxshape.Nr   r[   )r   r   ©
Ś	enumerater   r$   ŚintŚlenr/   r0   r%   r&   r.   ©r   rN   r0   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 ))rf   r   )r   r[   r   )r[   r   r   ry   r   rz   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 )rg   )r[   r[   )r[   r   rp   ry   r   )r;   r{   r   rx   N)r}   r   r$   r&   r_   r~   r   r/   r0   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   rw   ē   s
    
rw   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
    ))r6   r   )r7   rN   )ŚcZ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 r6   N)r]   r(   r;   r   r   r   r   ri     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 r6   rO   N)r]   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 r6   r[   .r7   r9   rf   r   )r6   r   N©r;   r   r(   rm   r&   rn   ©r   rt   r   r   r   rb   +  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      š?r7   .Nr   r   r   r   r   Śtest_write_noncompound9  s   

z%TestFieldNames.test_write_noncompoundN)r   r   r   r@   r&   r"   r=   r<   r;   r   ri   r   rb   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   r:   )Śsuperr   r&   rY   rZ   r   r$   r(   r   ©Ś	__class__r   r   r   C  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(   rZ   ©r   Zmbslicer   r   r   Śtest_defaultH  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_explicitO  s   z)TestMultiBlockSlice.test_default_explicitc                 C   ó>   t dd}|  | d”d” tj | j| t g d¢”” d S )Nr9   )r   rK   )r9   r   rs   r   )r9   rp   rs   é   rh   rq   ©r	   r/   r   r&   r   r   r(   rl   r   r   r   r   Ś
test_startU  ó   
"zTestMultiBlockSlice.test_startc                 C   r   )Nr   ©r   rK   )r   r   r   r   )r   r   r[   rf   r9   rp   rs   r    r   r   r   r   Ś
test_count[  s
   
’zTestMultiBlockSlice.test_countc                 C   sD   t dd}|  t” | d” W d    d S 1 sw   Y  d S )Nrr   r£   rK   ©r	   r`   Ś
ValueErrorr   r   r   r   r   Ś!test_count_more_than_length_errorc  s   
"’z5TestMultiBlockSlice.test_count_more_than_length_errorc                 C   r   )Nr[   )r   rK   )r   r[   rp   r   )r   r[   r9   rs   rh   r    r   r   r   r   Śtest_strideh  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   )r`   r¦   r	   r   r   r   r   r   Śtest_stride_zero_errorn  s   "žz*TestMultiBlockSlice.test_stride_zero_errorc                 C   s8   t ddd}|  | d”d” tj | j| | j” d S )Nr[   r©   rK   )r   r[   rp   r[   r   r   r   r   r   Śtest_stride_block_equals  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 )Nrf   )r   r[   r©   )r`   r¦   r	   r   r   r   r   Ś!test_block_more_than_stride_errory  s   ’"’z5TestMultiBlockSlice.test_block_more_than_stride_errorc                 C   s@   t ddd}|  | d”d” tj | j| t g d¢”” d S )Nrf   r[   r©   rK   )r   rf   rf   r[   )r   r   rf   r9   rs   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 )Nr[   rp   r9   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   r[   rp   r9   r   rK   )r   rp   r[   r9   )r   r[   rf   r9   rs   r   rh   rq   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   rf   r[   ©r   r   r   rK   )r   rf   rf   r[   )r   r[   r9   rp   r   rh   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 )Nrh   r9   rf   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   A  s     r   )r@   Znumpyr&   Ścommonr   r   rC   r   r   r   r   r	   r
   r   rA   rX   rc   rw   r   r   r   r   r   r   Ś<module>   s   			(,R*0