B
    ¬»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   śI/var/www/html/venv/lib/python3.7/site-packages/h5py/tests/test_slicing.pyŚsetUp   s    zBaseSlicing.setUpc             C   s   | j r| j  ”  d S )N)r   Śclose)r   r   r   r   ŚtearDown    s    zBaseSlicing.tearDownN)Ś__name__Ś
__module__Ś__qualname__r   r   r   r   r   r   r
      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 )Ś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*   s    z#TestSingleElement.test_single_indexc             C   s:   | 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Śshape)r   r   r    r   r   r   Śtest_single_null0   s    z"TestSingleElement.test_single_nullc             C   s:   | j jdddd}|d }|  |tj” |  |jd” dS )z* Slicing with [...] yields scalar ndarray r   r   r   )r$   r   .N)r   r   r   r   r"   r#   r$   )r   r   r    r   r   r   Śtest_scalar_index7   s    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   )r$   r   N)r   r   r   r   r   )r   r   r    r   r   r   Śtest_scalar_null>   s    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   Zfoo)Śdatar   N)r   r   Śonesr   r   r#   r   Śvoid)r   ŚdtŚvr   r   r   r   Śtest_compoundD   s
    zTestSingleElement.test_compoundN)	r   r   r   Ś__doc__r!   r%   r&   r'   r2   r   r   r   r   r   $   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 )Ś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   s    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   )é
   r;   .Śy)r   )r   r   N)r   r   Z	regionrefr5   Zregionref_dtyper#   r8   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 )r(   Śir*   r   )r   )r   é*   ś/r   r   N)
r   r   r5   r6   r   r   r7   r#   r8   r9   )r   r0   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   N)r   r   r5   r6   r7   r#   r8   r9   )r   r   r   r   r   Śtest_scalark   s    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)Śencoding)r   s   Hello there!r   N)r   r   r5   Zstring_dtyper#   r8   Śbytes)r   r   r   r   r   Śtest_bytestrq   s    zTestObjectIndex.test_bytestrN)	r   r   r   r3   r:   r=   rA   rB   rF   r   r   r   r   r4   L   s   	
r4   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   r;   r   )r-   )r   r   r   r   ŚarangeŚarrr   r   )r   r   r   r   r   ~   s    zTestSimpleSlicing.setUpc             C   s   | j r| j  ”  d S )N)r   r   )r   r   r   r   r      s    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   rI   )r   r   r   r   Śtest_negative_stop   s    z$TestSimpleSlicing.test_negative_stopc          	   C   s^   | j  dd”}t d”}|dddf |dddf< |  t” ||dddf< W dQ R X dS )z0Assigning to a 1D slice of a 2D dataset
        Zx2)r;   rJ   )r;   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   r3   r   r   rM   rQ   r   r   r   r   rG   x   s
   rG   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 )Ś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 z(3,)f8r   )r;   )r   .r+   )r;   é   r   )rS   rJ   é   )rS   rS   N)r   r   r   r   r#   r$   )r   r0   r   r    r   r   r   Ś	test_read   s    
zTestArraySlicing.test_readc          	   C   s>   t  d”}| jjdd|d}|  t” d|d< W dQ R X dS )z@ Array fill from constant is not supported (issue 211).
        z(3,)ir   )r;   )r   r?   .N)r   r   r   r   rO   rP   )r   r0   r   r   r   r   Śtest_write_broadcast±   s    
z%TestArraySlicing.test_write_broadcastc             C   sT   t  d”}| jjdd|d}t  dddg”}||d< |d }|  t  ||k”” d	S )
zA Write a single element to the array

        Issue 211.
        z(3,)f8r   )r;   )r   r   rJ   g      @r,   N)r   r   r   r   ŚarrayŚ
assertTrueŚall)r   r0   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 z(3,)i)rJ   )r   )r,   é   r   )r;   é	   é   r   rJ   r,   rS   r   r[   é   r]   N)r   r   r.   r   r   rL   )r   r0   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.
        z(3,)f8r   )r;   )r   .N)r   r   r   r   rX   rY   )r   r0   r   r    r   r   r   Śtest_roundtripŁ   s
    
zTestArraySlicing.test_roundtripN)	r   r   r   r3   rU   rV   rZ   r`   ra   r   r   r   r   rR      s   
rR   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Ž   xŲt dddgD ]Ę\}}| jjd| |tdt| d}|  |j|” |d }|  |tj	” |  |j|” |dd }|  |tj	” |  |j|” t|d	kr|dddd	f }|  |tj	” |  |jdd
 d” qW dS )z] Slice a dataset with a zero in its shape vector
            along the zero-length dimension )r   )r   rS   )r   rJ   r   zx%d)N)r   Śmaxshape.Nr   rJ   )r   r   )
Ś	enumerater   r   ŚintŚlenr#   r$   r   r   r"   )r   r>   r$   r   r    r   r   r   Ś test_slice_zero_length_dimensionķ   s     z6TestZeroLengthSlicing.test_slice_zero_length_dimensionc             C   s   x|t dddgD ]j\}}| jjd| |tdt| d}|  |j|” |dd }|  |tj	” |  |jd	|dd  ” qW dS )
z_ Slice a dataset with a zero in its shape vector
            along a non-zero-length dimension )rS   r   )r   rJ   r   )rJ   r   r   zx%d)N)r   rc   Nr   )r   )
rd   r   r   re   rf   r#   r$   r   r   r"   )r   r>   r$   r   r    r   r   r   Śtest_slice_other_dimensionž   s     z0TestZeroLengthSlicing.test_slice_other_dimensionc             C   s   xt dddgD ]p\}}| jjd| t |t”dt| d}|  |j|” |dd }|  	|tj
” |  |jd|dd	  ” qW d	S )
z5 Get a slice of length zero from a non-empty dataset )rS   )rJ   rJ   )rJ   r   r[   zx%d)N)r-   rc   r   )r   N)rd   r   r   r   rN   re   rf   r#   r$   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   r3   rg   rh   ri   r   r   r   r   rb   ē   s   
rb   c               @   sV   e Zd ZdZe dddg”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
    )r(   r   )r*   r>   )ŚcZf4)éd   )r   c             C   s0   t  | ” | jjdd| jd| _| j| jd< d S )Nr   )rl   )r   .)r
   r   r   r   r0   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 r(   N)rL   r   r-   )r   r   r   r   rU     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 r(   r?   N)rL   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 r(   rJ   .r*   r,   rS   rk   )r(   rk   N)r-   rm   r   rX   r   rY   )r   r_   r   r   r   rQ   +  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      š?r*   .N)r-   rm   r   rX   r   rY   )r   r_   r   r   r   Śtest_write_noncompound9  s    

z%TestFieldNames.test_write_noncompoundN)r   r   r   r3   r   r   r0   r.   r-   r   rU   rn   rQ   ro   r   r   r   r   rj     s   rj   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 )Nr;   r   )r-   )Śsuperr   r   rH   rI   r   r   r   )r   )Ś	__class__r   r   r   C  s    
zTestMultiBlockSlice.setUpc             C   s2   t  }|  | d”d” tj | j| | j” d S )Nr;   )r   r   r;   r   )r	   r#   Śindicesr   ŚtestingŚassert_array_equalr   rI   )r   Ś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   r;   r   )ŚstartŚcountŚstrideŚblock)r   r   r;   r   )r	   r#   rs   r   rt   ru   r   rI   )r   rv   r   r   r   Śtest_default_explicitO  s    z)TestMultiBlockSlice.test_default_explicitc             C   sF   t dd}|  | d”d” tj | j| t dddddd	g”” d S )
Nr,   )rx   r;   )r,   r   r^   r   r[   r^   é   rT   r\   )r	   r#   rs   r   rt   ru   r   rW   )r   rv   r   r   r   Ś
test_startU  s    
zTestMultiBlockSlice.test_startc             C   sH   t dd}|  | d”d” tj | j| t ddddd	d
dg”” d S )Nr}   )ry   r;   )r   r   r}   r   r   r   rJ   rS   r,   r[   r^   )r	   r#   rs   r   rt   ru   r   rW   )r   rv   r   r   r   Ś
test_count[  s    
zTestMultiBlockSlice.test_countc          	   C   s.   t dd}|  t” | d” W d Q R X d S )Nr]   )ry   r;   )r	   rO   Ś
ValueErrorrs   )r   rv   r   r   r   Ś!test_count_more_than_length_errorc  s    
z5TestMultiBlockSlice.test_count_more_than_length_errorc          
   C   sD   t dd}|  | d”d” tj | j| t dddddg”” d S )	NrJ   )rz   r;   )r   rJ   r[   r   r   r,   r^   rT   )r	   r#   rs   r   rt   ru   r   rW   )r   rv   r   r   r   Śtest_strideh  s    
zTestMultiBlockSlice.test_stridec          	   C   s,   |   t” tddd d” W d Q R X d S )Nr   )rz   r{   r;   )rO   r   r	   rs   )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 )NrJ   )rz   r{   r;   )r   rJ   r[   rJ   )r	   r#   rs   r   rt   ru   r   rI   )r   rv   r   r   r   Śtest_stride_block_equals  s    z+TestMultiBlockSlice.test_stride_block_equalc          	   C   sF   |   t” tdd W d Q R X |   t” tddd W d Q R X d S )NrS   )r{   rJ   )rz   r{   )rO   r   r	   )r   r   r   r   Ś!test_block_more_than_stride_errory  s    z5TestMultiBlockSlice.test_block_more_than_stride_errorc             C   sH   t ddd}|  | d”d” tj | j| t ddddd	d
g”” d S )NrS   rJ   )rz   r{   r;   )r   rS   rS   rJ   r   r   r,   r^   r}   )r	   r#   rs   r   rt   ru   r   rW   )r   rv   r   r   r   Śtest_stride_more_than_block  s    z/TestMultiBlockSlice.test_stride_more_than_blockc          	   C   s4   t ddddd}|  t” | d” W d Q R X d S )NrJ   r[   r,   )rx   ry   rz   r{   r;   )r	   rO   r   rs   )r   rv   r   r   r   Ś test_block_overruns_extent_error  s    z4TestMultiBlockSlice.test_block_overruns_extent_errorc             C   sP   t ddddd}|  | d”d” tj | j| t ddddd	d
ddg”” d S )Nr   rJ   r[   r,   )rx   ry   rz   r{   r;   )r   r[   rJ   r,   rS   r^   r}   rT   r\   )r	   r#   rs   r   rt   ru   r   rW   )r   rv   r   r   r   Śtest_fully_described  s    z(TestMultiBlockSlice.test_fully_describedc             C   sJ   t dddd}|  | d”d” tj | j| t ddddd	d
g”” d S )Nr   rS   rJ   )rx   rz   r{   r;   )r   rS   rS   rJ   r,   r[   r}   rT   )r	   r#   rs   r   rt   ru   r   rW   )r   rv   r   r   r   Śtest_count_calculated  s    z)TestMultiBlockSlice.test_count_calculatedc          	   C   s2   t dddd}|  t” | d” W d Q R X d S )NrT   r,   rS   )rx   rz   r{   r;   )r	   rO   r   rs   )r   rv   r   r   r   Ś test_zero_count_calculated_error  s    z4TestMultiBlockSlice.test_zero_count_calculated_error)r   r   r   r   rw   r|   r~   r   r   r   r   r   r   r   r   r   r   r   Ś__classcell__r   r   )rr   r   rp   A  s   rp   )r3   Śnumpyr   Ścommonr   r   r5   r   r   r   r   r	   r
   r   r4   rG   rR   rb   rj   rp   r   r   r   r   Ś<module>   s   	(,R*0