U
    ,do3                     @   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   </tmp/pip-unpacked-wheel-eu7e0c37/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)
subprocess
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k
r } z<td t||t| td tt|t	j
d  |W 5 d }~X Y qX 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)r2   Zfinfor5   Ztiny
resolutionZlinspaceZastypeZmeanfloatr   	PYVERSIONappend)r   r7   r9   r8   r:   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?   )rH   lenr   rD   r2   anyisnan)r   r7   float_tyrealimagrG   r   r   r   complex_samples   s    
zBaseTest.complex_samplesN)
r   r   r   r#   r.   r2   int64r;   rH   rO   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   )rH   r'   dtyper2   r.   )r   r7   rG   r   r   r   check_floats   s    zTestNumberHashing.check_floatsc                 C   s4   |  ||D ]"}| |jt| | | qd S r   )rO   r'   rR   r2   r.   )r   r7   rL   rG   r   r   r   check_complex   s    zTestNumberHashing.check_complexc                 C   s   |  tj |  tj d S r   )rS   r2   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   )rT   r2   Z	complex64rU   Z
complex128rV   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|k}| 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 )Nr1   r   Zuint      *UU*UU
    UU*UU* r$   l    l    l l l i  i
  id  )r2   Zint8Zuint8Zint16Zuint16Zint32Zuint32rP   uint64r;   r.   r3   stritemsizer4   r5   r6   r   maxsizerE   )r   ZminmaxtyrG   r9   signedszr   ZshiftsyiZtwiddle1Ztwiddle2valsZtwr,   vr   r   r   	test_ints   sX       



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 )rA   )rC   ).0rf   r   r   r   
<listcomp>   s     z9TestNumberHashing.test_py310_nan_hash.<locals>.<listcomp>r<   c                    s   g | ]}  |qS r   )r!   )rj   zr"   r   r   rk      s     r$   )r6   setZassertGreaterrI   )r   r   outr   r"   r   test_py310_nan_hash   s    	z%TestNumberHashing.test_py310_nan_hashN)r   r   r   __doc__rS   rT   rW   rX   rZ   ri   r
   ro   r   r   r   r   rQ      s   7rQ   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   )rj   rG   splitr   r   rk      s     z1TestTupleHashing.check_tuples.<locals>.<listcomp>rY   )r   Zvalue_generatorrs   r+   Ztuplesr   rr   r   check_tuples   s    zTestTupleHashing.check_tuplesc                    sV   t j  fdd} fdd}| |  | | |  | | ddddd	g d S )
Nc                    s     | } |  d@ |  d@ fS )z9
            Split i's bits into 2 integers.
            r]   r\   r   rf   r7   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   ru   rv   r   r   split3  s
    


z8TestTupleHashing.test_homogeneous_tuples.<locals>.split3   )r   )r   r   )r=   )r=   ry   )r@   )      )r2   r^   rt   r;   r.   )r   rw   rx   r   rv   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 )Nr]   l   *UU     g-C6?)r2   rP   rV   )rf   rG   br   r   r   rs     s    z9TestTupleHashing.test_heterogeneous_tuples.<locals>.split)rt   r;   )r   Zmodulors   r   r   r   test_heterogeneous_tuples  s    z*TestTupleHashing.test_heterogeneous_tuplesN)r   r   r   rp   rt   r~   r   r   r   r   r   rq      s   rq   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   🐍⚡ )r6   rI   r.   joinr%   )r   kind1_stringrf   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>.fnr1   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>.fnr1   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   r1   )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    Fr1   )r   r   r'   r   )r   r   ZjittedZcompute_hashexpectedgotrG   r   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__) rp   r   r   r   collectionsr   textwrapr   Znumpyr2   Znumbar   Z
numba.corer   r   Znumba.tests.supportr   r   r	   r
   Znumba.cpython.unicoder   Znumba.cpythonr   r   r   r   rQ   rq   r   r   mainr   r   r   r   <module>   s(   -G_4Z