a
    .;bo3                     @   s   d Z ddlZddlZddlZddlmZ ddlmZ ddlZ	ddl
mZ ddlmZmZ ddlZddlmZmZmZmZ ddlmZ dd	lmZ d
d 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edkre  dS )z*
Test hashing of various supported types.
    N)defaultdict)dedent)jit)typesutils)TestCasetagCompilationCacheskip_unless_py10_or_later)compile_time_get_string_data)hashingc                 C   s   t | S Nhashx r   7lib/python3.9/site-packages/numba/tests/test_hashing.pyhash_usecase   s    r   c                   @   s   e Zd Zdd ZdS )TestHashingSetupc                 C   s   d}t tjdt|g d S )Na  
        import sys
        import warnings
        from collections import namedtuple

        # hash_info is a StructSequence, mock as a named tuple
        fields = ["width", "modulus", "inf", "nan", "imag", "algorithm",
                  "hash_bits", "seed_bits", "cutoff"]

        hinfo = sys.hash_info
        FAKE_HASHINFO = namedtuple('FAKE_HASHINFO', fields)

        fd = dict()
        for f in fields:
            fd[f] = getattr(hinfo, f)

        fd['algorithm'] = 'fnv'

        fake_hashinfo = FAKE_HASHINFO(**fd)

        # replace the hashinfo with the fnv version
        sys.hash_info = fake_hashinfo
        with warnings.catch_warnings(record=True) as warns:
            # Cause all warnings to always be triggered.
            warnings.simplefilter("always")
            from numba import njit
            @njit
            def foo():
                hash(1)
            foo()
            assert len(warns) > 0
            expect = "FNV hashing is not implemented in Numba. See PEP 456"
            for w in warns:
                if expect in str(w.message):
                    break
            else:
                raise RuntimeError("Expected warning not found")
        z-c)
subprocessZ
check_callsys
executabler   )selfZworkr   r   r   test_warn_on_fnv   s    &z!TestHashingSetup.test_warn_on_fnvN)__name__
__module____qualname__r   r   r   r   r   r      s   r   c                   @   s:   e Zd Zdd Zdd ZejfddZdd Zd	d
 Z	dS )BaseTestc                 C   s   t ddt| _d S )NTZnopython)r   r   cfuncr   r   r   r   setUpL   s    zBaseTest.setUpc                 C   s   | j }t|D ]}||}| |t z| |t| W q ty } zDtd t||t| td tt|t	j
d  |W Y d }~qd }~0 0 qd S )Nzval, nb_hash, hash(val)z%abs(val), hashing._PyHASH_MODULUS - 1   )r    listZassertIsInstanceintassertEqualr   AssertionErrorprintabsr   Z_PyHASH_MODULUS)r   valuesr    valZnb_hasher   r   r   check_hash_valuesO   s    zBaseTest.check_hash_valuesc                 c   s|   dD ]r}t |}|j|  kr*|jks.q qd}t||| V  t||d|  dV  t||d|  dV  dgV  qd S )N)r   ii`  l        d      )npiinfominmaxrange)r   typstartinfonr   r   r   int_samples]   s    
zBaseTest.int_samplesc                 c   s   t |}dd|jd |jd fD ]t}d}t|j||j }d|d |fD ]J}||k rXqJt ||||  |}||}|V  | V  ||  V  qJq"dddd	td
td
 g}t	j
dk r|td ||V  d S )Nr   
         ?g     @@r.   g333333?g        g       g      inf   r;   nan)r1   Zfinfor4   ZtinyZ
resolutionZlinspaceZastypeZmeanfloatr   	PYVERSIONappend)r   r6   r8   r7   r9   Zmin_stepstepar   r   r   float_samplesh   s     


zBaseTest.float_samplesc                 c   s|   |  |D ]l}|  |D ]\}|d t| }|d t| }||d|  }tjdkrntt|st|V  q|V  qq
d S )Ny              ?r>   )rF   lenr   rB   r1   anyZisnan)r   r6   float_tyrealimagrE   r   r   r   complex_samples   s    
zBaseTest.complex_samplesN)
r   r   r   r"   r-   r1   int64r:   rF   rL   r   r   r   r   r   J   s
   r   c                   @   sL   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	e
dd ZdS )TestNumberHashingz'
    Test hashing of number types.
    c                 C   s2   |  |D ]"}| |jt| | | q
d S r   )rF   r&   dtyper1   r-   )r   r6   rE   r   r   r   check_floats   s    zTestNumberHashing.check_floatsc                 C   s4   |  ||D ]"}| |jt| | | qd S r   )rL   r&   rO   r1   r-   )r   r6   rI   rE   r   r   r   check_complex   s    zTestNumberHashing.check_complexc                 C   s   |  tj |  tj d S r   )rP   r1   float32float64r!   r   r   r   test_floats   s    zTestNumberHashing.test_floatsc                 C   s$   |  tjtj |  tjtj d S r   )rQ   r1   Z	complex64rR   Z
complex128rS   r!   r   r   r   test_complex   s    zTestNumberHashing.test_complexc                 C   s   |  ddg d S )NFTr-   r!   r   r   r   	test_bool   s    zTestNumberHashing.test_boolc                 C   s  g }t jt jt jt jt jt jt jt jfD ]*}| 	|D ]}| 
| q8t |}| 
|dg | 
|dg dt|v}| j}|j|jfD ]}d| }|}	t|D ]}
d}d}|	g}||fD ] }|	|@ }|tjk r|| q|D ]}| 
||g q|r0|D ]$}||jkr
| 
|| g q
|dkrH|	dB d> }	q|	d? }	qqq(| 
t dg | 
t d	g | 
t dg | 
t d	g | 
t d
g | 
t dg | 
t dg | 
t dg | 
t dg | 
t dg d S )Nr0   r   Zuint      *UU*UU
    UU*UU* r#   l    l    l l l i  i
  id  )r1   Zint8Zuint8Zint16Zuint16Zint32Zuint32rM   uint64r:   r-   r2   stritemsizer3   r4   r5   r   maxsizerC   )r   ZminmaxZtyrE   r8   ZsignedZszr   ZshiftsyiZtwiddle1Ztwiddle2ZvalsZtwr+   vr   r   r   	test_ints   sR    



zTestNumberHashing.test_intsc                    s<   dd t dD }t fdd|D } t|d d S )Nc                 S   s   g | ]}t d qS )r@   )rA   ).0r`   r   r   r   
<listcomp>       z9TestNumberHashing.test_py310_nan_hash.<locals>.<listcomp>r;   c                    s   g | ]}  |qS r   )r    )rc   zr!   r   r   rd      re   r#   )r5   setZassertGreaterrG   )r   r   outr   r!   r   test_py310_nan_hash   s    	z%TestNumberHashing.test_py310_nan_hashN)r   r   r   __doc__rP   rQ   rT   rU   rW   rb   r
   ri   r   r   r   r   rN      s   7rN   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	TestTupleHashingz!
    Test hashing of tuples.
    c                    s*   |D ] } fdd|D }|  | qd S )Nc                    s   g | ]} |qS r   r   )rc   rE   splitr   r   rd      re   z1TestTupleHashing.check_tuples.<locals>.<listcomp>rV   )r   Zvalue_generatorrm   r*   Ztuplesr   rl   r   check_tuples   s    zTestTupleHashing.check_tuplesc                    sP   t j  fdd} fdd}| |  | | |  | | g d d S )Nc                    s     | } |  d@ |  d@ fS )z9
            Split i's bits into 2 integers.
            rZ   rY   r   r`   r6   r   r   split2   s    

z8TestTupleHashing.test_homogeneous_tuples.<locals>.split2c                    s*    | } |  d@ |  d@ |  d@ fS )z9
            Split i's bits into 3 integers.
            l   $$$$ l   $I$I$I$I l   IIII	 r   ro   rp   r   r   split3  s
    


z8TestTupleHashing.test_homogeneous_tuples.<locals>.split3)   )r   )r   r   )r<   )r<   rs   )r?   )      )r1   r[   rn   r:   r-   )r   rq   rr   r   rp   r   test_homogeneous_tuples   s    	
z(TestTupleHashing.test_homogeneous_tuplesc                 C   s    d}dd }|  |  | d S )Nl            c                 S   s4   | d@ }| d@ | d? d@ A }t |t |d fS )NrZ   l   *UU     g-C6?)r1   rM   rS   )r`   rE   br   r   r   rm     s    z9TestTupleHashing.test_heterogeneous_tuples.<locals>.split)rn   r:   )r   Zmodulorm   r   r   r   test_heterogeneous_tuples  s    z*TestTupleHashing.test_heterogeneous_tuplesN)r   r   r   rj   rn   rx   r{   r   r   r   r   rk      s   rk   c                   @   s>   e Zd Zdd Zdd Zdd Zeddd	 Zd
d Z	dS )TestUnicodeHashingc                 C   s   d}t t|D ]}| |d | g qd}|t|}t t|D ]}| |d | g qHd}|t|}t t|D ]}| |d | g qd}| | d S )Nabcdefghijklmnopqrstuvwxyzu   眼u   🐍⚡ )r5   rG   r-   joinr$   )r   kind1_stringr`   sepZkind2_stringZkind4_stringZempty_stringr   r   r   test_basic_unicode&  s    z%TestUnicodeHashing.test_basic_unicodec                 C   sD   d}t dddd }t|d }| |dk | ||| d S )Nr}   Tr   c                 S   s   | j S r   )_hashr   r   r   r   fn=  s    z4TestUnicodeHashing.test_hash_passthrough.<locals>.fnr0   r   r   
assertTruer&   r   r   r   Z
hash_valuer   r   r   test_hash_passthrough8  s    
z(TestUnicodeHashing.test_hash_passthroughc                 C   sH   d}t dddd }t|d }| |dk | ||||f d S )Nr}   Tr   c                 S   s   | j t| fS r   )r   r   r   r   r   r   r   I  s    z9TestUnicodeHashing.test_hash_passthrough_call.<locals>.fnr0   r   r   r   r   r   test_hash_passthrough_callE  s    
z-TestUnicodeHashing.test_hash_passthrough_callz/Needs hash computation at const unpickling timec                 C   s8   t dddd }| }td}| |t|d  d S )NTr   c                  S   s   d} | S )Nr}   r   r   r   r   r   r   U  s    z0TestUnicodeHashing.test_hash_literal.<locals>.fnr}   r0   )r   r   r&   r   )r   r   r+   tmpr   r   r   test_hash_literalQ  s
    
z$TestUnicodeHashing.test_hash_literalc                 C   s   dd }t dd|}d}||}||}t|}t|}| |d d |d d  | |d |d k d}||}||}t|}t|}| || d S )Nc                 S   s    d}d}|| }| rt | |S )NZaaaau   眼眼眼眼r   )Zdo_hashZconst1Zconst2newr   r   r   impl`  s    z:TestUnicodeHashing.test_hash_on_str_creation.<locals>.implTr   Fr0   )r   r   r&   r   )r   r   ZjittedZcompute_hashZexpectedZgotrE   rz   r   r   r   test_hash_on_str_creation]  s    z,TestUnicodeHashing.test_hash_on_str_creationN)
r   r   r   r   r   r   unittestskipr   r   r   r   r   r   r|   $  s   
r|   __main__) rj   r   r   r   collectionsr   textwrapr   Znumpyr1   Znumbar   Z
numba.corer   r   Znumba.tests.supportr   r   r	   r
   Znumba.cpython.unicoder   Znumba.cpythonr   r   r   r   rN   rk   r|   r   mainr   r   r   r   <module>   s(   -G_4Z