o
    1&i.M                     @   s<  d Z ddl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mZmZm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 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"G dd de Z#G dd deZ$e%dkre&  dS dS )z*
Test hashing of various supported types.
    N)defaultdict)dedent)jitconfigtypedtypeof)typesutils)TestCaseskip_unless_py10_or_laterrun_in_subprocess)compile_time_get_string_data)hashing)numpy_versionc                 C   s   t | S Nhashx r   CC:\wamp64\www\opt\env\Lib\site-packages\numba/tests/test_hashing.pyhash_usecase      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g dg dgg dg dg dg dg dgg dg d	g d
g dg dgdZdd Zdd ZdddZdd ZdS )TestHashAlgs)\r$   r$   r$   )iL̇l   LL//+?iTSlqU:~@[ )0&Owq!~ r%   r&   )u   uC- r'   r(   )|#|   |#8
^ r)   r*   )i=վlBT='8 i\el   \e+=" )i[l$E,; iwmHloa_gv )pG   nYD~ r+   r,   )SjxY_oWs r-   r.   )     /l r/   r0   )iJkl   J:8`~ il)wJ )iQ	l .GUJG iO{l]D] )djba33xZ	siphash13Z	siphash24c                 C   sf   |t jjk r	d}nt jj}tj }t jdkr|rdnd}nt jdks$J |r(dnd}| j| | | S )Nr1   little   r   big      )r   	hash_infocutoff	algorithmr   Z	IS_32BITS	byteorderknown_hashes)r   positionlengthr9   ZIS_64BITplatformr   r   r   get_expected_hashx   s   
zTestHashAlgs.get_expected_hashc                 C   s   d| S )Nzprint(hash(eval(%a)))r   )r   repr_r   r   r   get_hash_command   r   zTestHashAlgs.get_hash_commandNc                 C   sV   t j }|d urt||d< n|dd  t| ||d\}}|  }t	|S )NZPYTHONHASHSEED)codeenv)
osenvironcopystrpopr   rA   decodestripint)r   r@   seedrC   out_stdoutr   r   r   get_hash   s   


zTestHashAlgs.get_hashc              	   C   st   d}|D ]3\}}}| j ||d | jt||d}| |t|}| || W d    n1 s2w   Y  qd S )N))abcr   r   )rQ   *   r3   )ZabcdefghijkrR   r6   )
   äú∑ℇr   r5   )rS   rR      )	input_strrL   )rL   )ZsubTestrP   reprr?   lenassertEqual)r   argsrU   rL   r<   gotexpectedr   r   r   test_against_cpython_gold   s   z&TestHashAlgs.test_against_cpython_goldr   )r    r!   r"   r;   r?   rA   rP   r\   r   r   r   r   r#   L   s*    	#
r#   c                   @   sB   e Zd Zdd Zdd ZejfddZ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   setUp   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 - 1r3   )r_   listZassertIsInstancerK   rX   r   AssertionErrorprintabsr   _PyHASH_MODULUS)r   valuesr_   valZnb_hasher   r   r   check_hash_values   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 tdtt|j ||S )NrK   )getattrrn   rG   ro   bitsview)r   rs   valuer   r   r   safe_construct   s   $zBaseTest.safe_constructc                 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}||V  d S )Nr   
         ?g     @@rk   g333333?g        g       g      inf)	rn   Zfinforq   Ztiny
resolutionZlinspaceZastypemeanfloat)r   rs   ru   rt   rv   Zmin_stepstepar   r   r   float_samples   s    


zBaseTest.float_samplesc                 c   sl    |  |D ]-}|  |D ]%}|d t| }|d t| }||d|  }tt|s2|V  qqd S )Ny              ?)r   rW   rn   anyisnan)r   rs   float_tyrealimagr   r   r   r   complex_samples   s   zBaseTest.complex_samplesN)r    r!   r"   ra   rj   rn   int64rw   r|   r   r   r   r   r   r   r]      s    r]   c                       sj   e Zd ZdZ fddZd fddZdd	 Zd
d Zdd Zdd Z	dd Z
dd Zedd Z  ZS )TestNumberHashingz'
    Test hashing of number types.
    c                    .   t dkrt dkrt | _td t  S Nr6   r   r6   r3   legacyr   rn   Z_get_promotion_stateinitial_state_set_promotion_statesuperra   r`   	__class__r   r   ra         


zTestNumberHashing.setUpreturnNc                    &   t dkrt dkrt| j t  S Nr   r   r   rn   r   r   r   tearDownr`   r   r   r   r         
zTestNumberHashing.tearDownc                 C   s2   |  |D ]}| |jt| | | qd S r   )r   rX   dtypern   rj   )r   rs   r   r   r   r   check_floats   s   zTestNumberHashing.check_floatsc                 C   s4   |  ||D ]}| |jt| | | qd S r   )r   rX   r   rn   rj   )r   rs   r   r   r   r   r   check_complex   s   zTestNumberHashing.check_complexc                 C   s   |  tj |  tj d S r   )r   rn   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   rn   Z	complex64r   Z
complex128r   r`   r   r   r   test_complex  s   zTestNumberHashing.test_complexc                 C   s   |  ddg d S )NFTrj   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 rs|| qc|D ]
}| 
||g qv|r|D ]}||jkr| 
|| g q|dkr|	dB d> }	qV|	d? }	qVqJq| 
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 )Nrm   r   Zuint      *UU*UU
    UU*UU* r3   l    l    l l l i  i
  id  )rn   Zint8Zuint8Zint16Zuint16Zint32Zuint32r   uint64rw   rj   ro   r|   rG   itemsizerp   rq   rr   r   maxsizeappend)r   Zminmaxtyr   ru   signedszr   ZshiftsyiZtwiddle1Ztwiddle2valsZtwrh   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 )nan)r   ).0r   r   r   r   
<listcomp>O      z9TestNumberHashing.test_py310_nan_hash.<locals>.<listcomp>r}   c                    s   g | ]}  |qS r   )r_   )r   zr`   r   r   r   P  s    r3   )rr   setZassertGreaterrW   )r   r   rM   r   r`   r   test_py310_nan_hashF  s   	z%TestNumberHashing.test_py310_nan_hashr   N)r    r!   r"   __doc__ra   r   r   r   r   r   r   r   r   r   __classcell__r   r   r   r   r      s    	7r   c                       sF   e Zd ZdZ fddZd fddZdd	 Zd
d Zdd Z  Z	S )TestTupleHashingz!
    Test hashing of tuples.
    c                    r   r   r   r`   r   r   r   ra   Y  r   zTestTupleHashing.setUpr   Nc                    r   r   r   r`   r   r   r   r   b  r   zTestTupleHashing.tearDownc                    s*   |D ]} fdd|D }|  | qd S )Nc                    s   g | ]} |qS r   r   )r   r   splitr   r   r   l  r   z1TestTupleHashing.check_tuples.<locals>.<listcomp>r   )r   Zvalue_generatorr   rg   Ztuplesr   r   r   check_tuplesj  s   zTestTupleHashing.check_tuplesc                    sT   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.
            r   r   r|   r   r   rs   r   r   split2r  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   )r~   )r~   r   )r5   )rT      )rn   r   r   rw   rj   )r   r   r   r   r   r   test_homogeneous_tupleso  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?)rn   r   r   )r   r   br   r   r   r     s   z9TestTupleHashing.test_heterogeneous_tuples.<locals>.split)r   rw   )r   Zmodulor   r   r   r   test_heterogeneous_tuples  s   z*TestTupleHashing.test_heterogeneous_tuplesr   )
r    r!   r"   r   ra   r   r   r   r   r   r   r   r   r   r   T  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   🐍⚡ )rr   rW   rj   joinrb   )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>.fnrm   r   r   
assertTruerX   r   r   r   Z
hash_valuer   r   r   test_hash_passthrough  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        z9TestUnicodeHashing.test_hash_passthrough_call.<locals>.fnrm   r   r   r   r   r   test_hash_passthrough_call  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     s   z0TestUnicodeHashing.test_hash_literal.<locals>.fnr   rm   )r   r   rX   r   )r   r   rh   tmpr   r   r   test_hash_literal  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^   Frm   )r   r   rX   r   )r   r   ZjittedZcompute_hashr[   rZ   r   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   c                   @   s   e Zd Zdd Zdd ZdS )TestUnhashablec              	   C   s   t  tjtjt  tjtdf}t	ddt
}|D ].}| t}|| W d    n1 s5w   Y  dtt| d}| |t|j qd S )NrT   Tr^   zunhashable type: '')r   Dictemptyr   r   ListZ
empty_listrn   Zonesr   r   assertRaises	TypeErrorrG   r   assertIn	exception)r   Zunhashablesr_   r   raisesr[   r   r   r   test_hash_unhashable  s   
z#TestUnhashable.test_hash_unhashablec                 C   s\   t dddd }| t}|  W d    n1 sw   Y  d}| |t|j d S )NTr^   c                   S   s   t tj d S r   )r   rn   cosr   r   r   r   foo  r   z0TestUnhashable.test_no_generic_hash.<locals>.fooz"No __hash__ is defined for object )r   r   r   r   rG   r   )r   r   r   r[   r   r   r   test_no_generic_hash  s   
z#TestUnhashable.test_no_generic_hashN)r    r!   r"   r   r   r   r   r   r   r     s    r   __main__)'r   r   rD   r   r   collectionsr   textwrapr   numpyrn   Znumbar   r   r   r   Z
numba.corer   r	   Znumba.tests.supportr
   r   r   Znumba.cpython.unicoder   Znumba.cpythonr   Znumba.np.numpy_supportr   r   r   r#   r]   r   r   r   r   r    mainr   r   r   r   <module>   s4   -SEpEZ 