
    d26                     .   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e          Z G d	 d
e          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G 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                       e Zd Zd Zd ZdS )BaseSlicingc                 T    t          |                                 d          | _        d S )Nw)r	   mktempfselfs    7lib/python3.11/site-packages/h5py/tests/test_slicing.pysetUpzBaseSlicing.setUp   s    dkkmmS))    c                 J    | j         r| j                                          d S d S Nr   closer   s    r   tearDownzBaseSlicing.tearDown    )    6 	FLLNNNNN	 	r   N)__name__
__module____qualname__r   r    r   r   r   r      s2        * * *    r   r   c                   0    e Zd ZdZd Zd Zd Zd Zd ZdS )TestSingleElementzM
        Feature: Retrieving a single element works with NumPy semantics
    c                     | j                             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outs      r   test_single_indexz#TestSingleElement.test_single_index*   sE    v$$S$d$;;1gc27+++++r   c                     | j                             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-   s      r   test_single_nullz"TestSingleElement.test_single_null0   s]    v$$S$d$;;2hc2:...D)))))r   c                     | j                             ddd          }|d         }|                     |t          j                   |                     |j        d           dS )z* Slicing with [...] yields scalar ndarray r#   r   r   r5   r'   .Nr2   r-   s      r   test_scalar_indexz#TestSingleElement.test_scalar_index7   s]    v$$S#$>>3ic2:...B'''''r   c                     | j                             ddd          }|d         }|                     |t          j                   dS )z' Slicing with [()] yields array scalar r#   r   r%   r8   Nr(   r-   s      r   test_scalar_nullz"TestSingleElement.test_scalar_null>   sE    v$$S$$??2hc27+++++r   c                 (   t          j        ddg          }t          j        d|          }| j                            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)   r4   r*   void)r   dtvr.   s       r   test_compoundzTestSingleElement.test_compoundD   s    Xz*-..GD###v$$UDq$99a!A$'''d1grw/////r   N)	r   r   r   __doc__r0   r6   r9   r;   rI   r   r   r   r!   r!   $   si         , , ,* * *( ( (, , ,0 0 0 0 0r   r!   c                   0    e Zd ZdZd Zd Zd Zd Zd ZdS )TestObjectIndexzH
        Feature: numpy.object_ subtypes map to real Python objects
    c                     | j                             ddt          j                  }| 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refr4   type	Referencer   r.   s     r   test_referencezTestObjectIndex.test_referenceR   sU    v$$S$dn$EE&*Qd1g77777r   c                    | j                             dd          }|j        d         }| j                             ddt          j                  }||d<   |                     t          |d                   t          j                   dS )	zL Indexing a region reference dataset returns a h5py.RegionReference
        r#   )
   rW   .yr$   r&   r   N)r   r)   	regionrefrO   regionref_dtyper4   rR   RegionReference)r   dset1regrefdset2s       r   test_regrefzTestObjectIndex.test_regrefX   sx     %%c733%%%c4t7K%LLaeAh)=>>>>>r   c                 (   t          j        ddt          j        fg          }| j                            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 )r=   ir?   r#   r$   r&   *   /r   r   N)
r+   r'   rO   rP   r   r)   rQ   r4   rR   rS   r   rG   r.   r/   s       r   test_reference_fieldz$TestObjectIndex.test_reference_fielda   s    Xz3"7899v$$S$b$99tvc{'Q1gc!ft~66666r   c                     | j                             ddt          j                  }| j         j        |d<   |                     t          |d                   t          j                   dS )z: Indexing returns a real Python object on scalar datasets r#   r   r&   NrN   rT   s     r   test_scalarzTestObjectIndex.test_scalark   sU    v$$S"DN$CC6:Rd2h88888r   c                     | j                             ddt          j        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)   rO   string_dtyper4   rR   bytesrT   s     r   test_bytestrzTestObjectIndex.test_bytestrq   s^     v$$S$d6GQX6Y6Y6Y$ZZ!Qd1g.....r   N)	r   r   r   rJ   rU   r_   re   rg   rm   r   r   r   rL   rL   L   si         8 8 8? ? ?7 7 79 9 9/ / / / /r   rL   c                   *    e Zd ZdZd Zd Zd Zd ZdS )TestSimpleSlicingzQ
        Feature: Simple NumPy-style slices (start:stop:step) are supported.
    c                     t          |                                 d          | _        t          j        d          | _        | j                            d| j                  | _        d S )Nr   rW   r#   rC   )r	   r   r   r+   arangearrr)   r.   r   s    r   r   zTestSimpleSlicing.setUp~   sL    dkkmmS))9R==F))#DH)==			r   c                 J    | j         r| j                                          d S d S r   r   r   s    r   r   zTestSimpleSlicing.tearDown   r   r   c                 f    |                      | j        dd         | j        dd                    dS )z0 Negative stop indexes work as they do in NumPy    N)assertArrayEqualr.   rr   r   s    r   test_negative_stopz$TestSimpleSlicing.test_negative_stop   s2    di"otx"~>>>>>r   c                    | j                             dd          }t          j        d          }|dddf         |dddf<   |                     t
                    5  ||dddf<   ddd           dS # 1 swxY w Y   dS )z0Assigning to a 1D slice of a 2D dataset
        x2)rW   ru   )rW   r   Nr   r   )r   r)   r+   zerosassertRaises	TypeError)r   r.   r#   s      r   
test_writezTestSimpleSlicing.test_write   s     v$$T733HWqqq!tWQQQT
y)) 	 	DAJ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   
A44A8;A8N)r   r   r   rJ   r   r   rx   r~   r   r   r   ro   ro   x   sZ         > > >
  ? ? ?    r   ro   c                   0    e Zd ZdZd Zd Zd Zd Zd ZdS )TestArraySlicingz<
        Feature: Array types are handled appropriately
    c                    t          j        d          }| j                            dd|          }|                     |j        d           |                     |j        |           |d         }|                     |j        t          j        d                     |                     |j        d           |d         }|                     |j        t          j        d                     |                     |j        d	           |d
dd
         }|                     |j        t          j        d                     |                     |j        d           dS )z; Read arrays tack array dimensions onto end of shape tuple (3,)f8r#   rW   r&   .r@   )rW      r   r   ru      )r   r   N)r+   r'   r   r)   r4   r5   rd   s       r   	test_readzTestArraySlicing.test_read   s2   Xhv$$SR$88U+++R((( 3iBHTNN333F+++ 1gBHTNN333D))) 1Qq5kBHTNN333E*****r   c                     t          j        d          }| j                            dd|          }|                     t
                    5  d|d<   ddd           dS # 1 swxY w Y   dS )z@ Array fill from constant is not supported (issue 211).
        (3,)ir#   r   r&   rb   .N)r+   r'   r   r)   r|   r}   )r   rG   r.   s      r   test_write_broadcastz%TestArraySlicing.test_write_broadcast   s     Xgv$$S%r$::y)) 	 	DI	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   AA#&A#c                    t          j        d          }| j                            dd|          }t          j        g d          }||d<   |d         }|                     t          j        ||k                         dS )zA Write a single element to the array

        Issue 211.
        r   r#   r   r&   )r   ru   g      @rA   N)r+   r'   r   r)   array
assertTrueall)r   rG   r.   rD   r/   s        r   test_write_elementz#TestArraySlicing.test_write_element   sz    
 Xhv$$S%r$::x			""Q1gsd{++,,,,,r   c                 t   t          j        d          }t          j        d|          }t          j        d|          }| j                            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 r   )ru   r&   )rA      r#   )rW   	      r   ru   rA   r   r   r      r   N)r+   r'   rE   r   r)   rw   )r   rG   data1data2r.   s        r   test_write_slicesz"TestArraySlicing.test_write_slices   s    XgB'''R(((v$$S)2$>>Qq1Wd1Qqs7mU333"Q!QrT\d1ac1R4<0%88888r   c                     t          j        d          }| j                            dd|          }|d         }||d<   |                     t          j        |d         |k                         dS )zO Read the contents of an array and write them back

        Issue 211.
        r   r#   r   r&   .N)r+   r'   r   r)   r   r   rd   s       r   test_roundtripzTestArraySlicing.test_roundtrip   sl    
 Xhv$$S%r$::3iS	tCyC/0011111r   N)	r   r   r   rJ   r   r   r   r   r   r   r   r   r   r      si         + + +,  - - -9 9 9 2 2 2 2 2r   r   c                   $    e Zd ZdZd Zd Zd ZdS )TestZeroLengthSlicingz.
        Slices resulting in empty arrays
    c           
         t          g d          D ]C\  }}| j                            d|z  |t          dt	          |          z            }|                     |j        |           |d         }|                     |t          j	                   |                     |j        |           |dd         }|                     |t          j	                   |                     |j        |           t	          |          dk    rQ|ddddf         }|                     |t          j	                   |                     |j        dd         d	           EdS )
z] Slice a dataset with a zero in its shape vector
            along the zero-length dimension )r   )r   r   )r   ru   r   x%dr   r'   maxshape.Nr   ru   )r   r   
	enumerater   r)   intlenr4   r5   r*   r+   r3   r   ra   r5   r.   r/   s        r    test_slice_zero_length_dimensionz6TestZeroLengthSlicing.test_slice_zero_length_dimension   sL    "";";";<< 	8 	8HAu6((q%sWUXY^U_U_M_(``DTZ///s)C!!#rz222SY...qqq'C!!#rz222SY...5zzA~~111bqb5k%%c2:666  2A2777	8 	8r   c           
      v   t          g d          D ]\  }}| j                            d|z  |t          dt	          |          z            }|                     |j        |           |dd         }|                     |t          j	                   |                     |j        d|dd         z              dS )z_ Slice a dataset with a zero in its shape vector
            along a non-zero-length dimension ))r   r   )r   ru   r   )ru   r   r   r   r   r   Nr   r$   r   r   s        r   test_slice_other_dimensionz0TestZeroLengthSlicing.test_slice_other_dimension   s     ""@"@"@AA 	8 	8HAu6((q%sWUXY^U_U_M_(``DTZ///rr(C!!#rz222SYU122Y7777	8 	8r   c           	         t          g d          D ]\  }}| j                            d|z  t          j        |t
                    dt          |          z            }|                     |j        |           |dd         }| 	                    |t          j
                   |                     |j        d|dd         z              dS )z5 Get a slice of length zero from a non-empty dataset )r   )ru   ru   )ru   r   r   r   r   )rD   r   r   r   N)r   r   r)   r+   r{   r   r   r4   r5   r*   r3   r   s        r   test_slice_of_length_zeroz/TestZeroLengthSlicing.test_slice_of_length_zero  s    !"="="=>> 	8 	8HAu6((qrxs7K7KV]^abg^h^hVh(iiDTZ///qs)C!!#rz222SYU122Y7777	8 	8r   N)r   r   r   rJ   r   r   r   r   r   r   r   r      sK         8 8 8"8 8 88 8 8 8 8r   r   c                   x    e Zd ZdZ ej        g d          Z ej        de          Zd Z	d Z
d Zd Zd	 Zd
S )TestFieldNamesz*
        Field names for read & write
    ))r=   r   )r?   ra   )cf4d   r&   c                     t                               |            | j                            dd| j                  | _        | j        | j        d<   d S )Nr#   r   r&   .)r   r   r   r)   rG   r.   rD   r   s    r   r   zTestFieldNames.setUp  sG    $F))#vTW)EE		#r   c                 ^    |                      | j        d         | j        d                    dS )z! Test read with field selections r=   N)rw   r.   rD   r   s    r   r   zTestFieldNames.test_read  s*    dindin=====r   c                     |                      | j        d         | j        d                    d| j        d<   | j                                        }d|d<   |                      | j        d         |d                    dS )z, Unicode field names for for read and write r=   rb   N)rw   r.   rD   copy)r   rD   s     r   test_unicode_namesz!TestFieldNames.test_unicode_names#  so    dindin===	#y~~S	dind3i88888r   c                 8   | j                                         }|dxx         dz  cc<   || j        d<   |                     t	          j        | j        d         |k                         |dxx         dz  cc<   || j        d<   |                     t	          j        | j        d         |k                         |dxx         dz  cc<   |dxx         dz  cc<   || j        d<   |                     t	          j        | j        d         |k                         d	S )
z" Test write with field selections r=   ru   .r?   rA   r   r   )r=   r   NrD   r   r.   r   r+   r   r   r   s     r   r~   zTestFieldNames.test_write+  s   	  c


a


	#ty~677888c


a


	#ty~677888c


a


c


a


"	'ty~67788888r   c                     | j                                         }d|d<   d| j        d<   |                     t	          j        | j        d         |k                         dS )z4 Test write with non-compound source (single-field) g      ?r?   .Nr   r   s     r   test_write_noncompoundz%TestFieldNames.test_write_noncompound9  sT    	  c
	#ty~67788888r   N)r   r   r   rJ   r+   r'   rG   rE   rD   r   r   r   r~   r   r   r   r   r   r     s          
777	8	8B276$$$D# # #
> > >9 9 99 9 99 9 9 9 9r   r   c                   r     e Zd Z fdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Z xZS )TestMultiBlockSlicec                     t                                                       t          j        d          | _        | j                            d| j                  | _        d S )NrW   r#   rC   )superr   r+   rq   rr   r   r)   r.   )r   	__class__s    r   r   zTestMultiBlockSlice.setUpC  sE    9R==F))#DH)==			r   c                     t                      }|                     |                    d          d           t          j                            | j        |         | j                   d S )NrW   r   r   rW   r   r
   r4   indicesr+   testingassert_array_equalr.   rr   r   mbslices     r   test_defaultz TestMultiBlockSlice.test_defaultH  sV    !##,,m<<<

%%di&8$(CCCCCr   c                     t          dddd          }|                     |                    d          d           t          j                            | j        |         | j                   d S )Nr   rW   r   startcountstrideblockr   r   r   s     r   test_default_explicitz)TestMultiBlockSlice.test_default_explicitO  sa    !AQGGG,,m<<<

%%di&8$(CCCCCr   c                     t          d          }|                     |                    d          d           t          j                            | j        |         t          j        g d                     d S )NrA   )r   rW   )rA   r   r   r   )rA   r   r      r   r   r
   r4   r   r+   r   r   r.   r   r   s     r   
test_startzTestMultiBlockSlice.test_startU  sj    !***,,l;;;

%%di&8"(CUCUCU:V:VWWWWWr   c                     t          d          }|                     |                    d          d           t          j                            | j        |         t          j        g d                     d S )Nr   r   rW   )r   r   r   r   )r   r   ru   r   rA   r   r   r   r   s     r   
test_countzTestMultiBlockSlice.test_count[  su    !***,,l;;;

%%Ig)>)>)> ? ?	
 	
 	
 	
 	
r   c                     t          d          }|                     t                    5  |                    d           d d d            d S # 1 swxY w Y   d S )Nr   r   rW   r
   r|   
ValueErrorr   r   s     r   !test_count_more_than_length_errorz5TestMultiBlockSlice.test_count_more_than_length_errorc  s    !+++z** 	  	 OOB	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	 s   AAAc                     t          d          }|                     |                    d          d           t          j                            | j        |         t          j        g d                     d S )Nru   )r   rW   )r   ru   r   r   )r   ru   rA   r   r   r   r   s     r   test_stridezTestMultiBlockSlice.test_strideh  sg    !+++,,l;;;

%%di&8"(???:S:STTTTTr   c                     |                      t                    5  t          dd                              d           d d d            d S # 1 swxY w Y   d S )Nr   r   r   rW   )r|   r   r
   r   r   s    r   test_stride_zero_errorz*TestMultiBlockSlice.test_stride_zero_errorn  s    z** 	; 	;1A...66r:::	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	;s   %AAAc                     t          dd          }|                     |                    d          d           t          j                            | j        |         | j                   d S )Nru   r   rW   )r   ru   r   ru   r   r   s     r   test_stride_block_equalz+TestMultiBlockSlice.test_stride_block_equals  s]    !!444,,l;;;

%%di&8$(CCCCCr   c                    |                      t                    5  t          d           d d d            n# 1 swxY w Y   |                      t                    5  t          dd           d d d            d S # 1 swxY w Y   d S )Nr   )r   ru   r   )r|   r   r
   r   s    r   !test_block_more_than_stride_errorz5TestMultiBlockSlice.test_block_more_than_stride_errory  s	   z** 	% 	%!$$$$	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% z** 	/ 	/1A....	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/s   8<<A<<B B c                     t          dd          }|                     |                    d          d           t          j                            | j        |         t          j        g d                     d S )Nr   ru   r   rW   )r   r   r   ru   )r   r   r   rA   r   r   r   r   s     r   test_stride_more_than_blockz/TestMultiBlockSlice.test_stride_more_than_block  sl    !!444,,l;;;

%%di&8"(CUCUCU:V:VWWWWWr   c                     t          dddd          }|                     t                    5  |                    d           d d d            d S # 1 swxY w Y   d S )Nru   r   rA   r   rW   r   r   s     r    test_block_overruns_extent_errorz4TestMultiBlockSlice.test_block_overruns_extent_error  s    !1AFFFz** 	  	 OOB	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	 s   AAAc                     t          dddd          }|                     |                    d          d           t          j                            | j        |         t          j        g d                     d S )	Nr   ru   r   rA   r   rW   )r   r   ru   rA   )r   ru   r   rA   r   r   r   r   r   r   s     r   test_fully_describedz(TestMultiBlockSlice.test_fully_described  s{    !1AFFF,,l;;;

%%Ig)A)A)A B B	
 	
 	
 	
 	
r   c                     t          ddd          }|                     |                    d          d           t          j                            | j        |         t          j        g d                     d S )Nr   r   ru   r   r   r   rW   )r   r   r   ru   )r   ru   rA   r   r   r   r   r   s     r   test_count_calculatedz)TestMultiBlockSlice.test_count_calculated  sn    !!1===,,l;;;

%%di&8"(CUCUCU:V:VWWWWWr   c                     t          ddd          }|                     t                    5  |                    d           d d d            d S # 1 swxY w Y   d S )Nr   rA   r   r   rW   r   r   s     r    test_zero_count_calculated_errorz4TestMultiBlockSlice.test_zero_count_calculated_error  s    !!1===z** 	  	 OOB	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	 s   AAA)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__)r   s   @r   r   r   A  s       > > > > >
D D DD D DX X X
 
 
     
U U U; ; ;
D D D/ / /X X X     
 
 
X X X             r   r   )rJ   numpyr+   commonr   r   rO   r   r   r   r	   r
   r   r!   rL   ro   r   r   r   r   r   r   r   <module>r      s                                   & & & & & & & &    (   &0 &0 &0 &0 &0 &0 &0 &0P*/ */ */ */ */k */ */ */X       :O2 O2 O2 O2 O2{ O2 O2 O2d(8 (8 (8 (8 (8K (8 (8 (8T-9 -9 -9 -9 -9[ -9 -9 -9`_  _  _  _  _ + _  _  _  _  _ r   