o
    8ήco3                     @   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r~e  dS 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-target-vg8gfxp4/lib/python/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   )self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nopython)r   r   cfuncr   r   r   r   setUpL   s   zBaseTest.setUpc                 C   s   | j }t|D ]>}||}| |t z
| |t| W q tyE } ztd t||t| td tt|t	j
d  |d }~ww d S )Nzval, nb_hash, hash(val)z%abs(val), hashing._PyHASH_MODULUS - 1   )r#   listassertIsInstanceintassertEqualr   AssertionErrorprintabsr   _PyHASH_MODULUS)r   valuesr#   valnb_hasher   r   r   check_hash_valuesO   s   zBaseTest.check_hash_valuesc                 c   s~    dD ]9}t |}|j|  kr|jksn 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 ]:}d}t|j||j }d|d |fD ]%}||k r-q&t ||||  |}||}|V  | V  ||  V  q&qdddd	td
td
 g}t	j
dk rf|td ||V  d S )Nr   
         ?g     @@r4   g333333?g        g       g      inf   rA   nan)r7   finfor:   tiny
resolutionlinspaceastypemeanfloatr   	PYVERSIONappend)r   r<   r>   r=   r?   min_stepstepar   r   r   float_samplesh   s$   



zBaseTest.float_samplesc                 c   s~    |  |D ]6}|  |D ].}|d t| }|d t| }||d|  }tjdkr8tt|s7|V  q|V  qqd S )Ny              ?rD   )rS   lenr   rN   r7   anyisnan)r   r<   float_tyrealimagrR   r   r   r   complex_samples   s   
zBaseTest.complex_samplesN)
r   r   r   r%   r3   r7   int64r@   rS   rZ   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   )rS   r*   dtyper7   r3   )r   r<   rR   r   r   r   check_floats   s   zTestNumberHashing.check_floatsc                 C   s4   |  ||D ]}| |jt| | | qd S r   )rZ   r*   r]   r7   r3   )r   r<   rW   rR   r   r   r   check_complex   s   zTestNumberHashing.check_complexc                 C   s   |  tj |  tj d S r   )r^   r7   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   )r_   r7   	complex64r`   
complex128ra   r$   r   r   r   test_complex   s   zTestNumberHashing.test_complexc                 C   s   |  ddg d S )NFTr3   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 ]}| 
| qt |}| 
|dg | 
|dg dt|v}| j}|j|jfD ]\}d| }|}	t|D ]O}
d}d}|	g}||fD ]}|	|@ }|tjk rq|| qa|D ]
}| 
||g qt|r|D ]}||jkr| 
|| g q|dkr|	dB d> }	qT|	d? }	qTqHq| 
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 )Nr6   r   uint      *UU*UU
    UU*UU* r&   l    l    l l l i  i
  id  )r7   int8uint8int16uint16int32uint32r[   uint64r@   r3   r8   stritemsizer9   r:   r;   r   maxsizerO   )r   minmaxtyrR   r>   signedszr   shiftsyitwiddle1twiddle2valstwr0   vr   r   r   	test_ints   sZ   




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 )rF   )rM   ).0r|   r   r   r   
<listcomp>       z9TestNumberHashing.test_py310_nan_hash.<locals>.<listcomp>rA   c                    s   g | ]}  |qS r   )r#   )r   zr$   r   r   r      s    r&   )r;   setassertGreaterrT   )r   r   outr   r$   r   test_py310_nan_hash   s   	z%TestNumberHashing.test_py310_nan_hashN)r   r   r   __doc__r^   r_   rb   re   rg   r   r
   r   r   r   r   r   r\      s    7r\   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   )r   rR   splitr   r   r      r   z1TestTupleHashing.check_tuples.<locals>.<listcomp>rf   )r   value_generatorr   r/   tuplesr   r   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.
            rk   rj   r   r|   r<   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   r   r   r   r   split3  s
   


z8TestTupleHashing.test_homogeneous_tuples.<locals>.split3)   )r   )r   r   )rB   )rB   r   )rE   )      )r7   rr   r   r@   r3   )r   r   r   r   r   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 )Nrk   l   *UU     g-C6?)r7   r[   ra   )r|   rR   br   r   r   r     s   z9TestTupleHashing.test_heterogeneous_tuples.<locals>.split)r   r@   )r   modulor   r   r   r   test_heterogeneous_tuples  s   z*TestTupleHashing.test_heterogeneous_tuplesN)r   r   r   r   r   r   r   r   r   r   r   r      s
    r   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 q$d}|t|}t t|D ]}| |d | g q@d}| | d S )Nabcdefghijklmnopqrstuvwxyzu   眼u   🐍⚡ )r;   rT   r3   joinr'   )r   kind1_stringr|   sepkind2_stringkind4_string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>.fnr6   r   r   
assertTruer*   r   r   r   
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>.fnr6   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   r6   )r   r   r*   r   )r   r   r0   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 )Naaaau   眼眼眼眼r   )do_hashconst1const2newr   r   r   impl`  s   z:TestUnicodeHashing.test_hash_on_str_creation.<locals>.implTr!   Fr6   )r   r   r*   r   )r   r   jittedcompute_hashexpectedgotrR   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__) r   r   r   r   collectionsr   textwrapr   numpyr7   numbar   
numba.corer   r   numba.tests.supportr   r   r	   r
   numba.cpython.unicoder   numba.cpythonr   r   r   r    r\   r   r   r   mainr   r   r   r   <module>   s,   -G_4Z