o
    i-F                     @   s8  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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"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tagCompilationCacheskip_unless_py10_or_laterrun_in_subprocess)compile_time_get_string_data)hashingc                 C   s   t | S Nhashx r   g/var/www/html/eduruby.in/lip-sync/lip-sync-env/lib/python3.10/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 r0   r1   )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 )Nr2   little   r   big      )r   	hash_infocutoff	algorithmr   Z	IS_32BITS	byteorderknown_hashes)r   positionlengthr:   ZIS_64BITplatformr   r   r   get_expected_hashw   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   rB   decodestripint)r   rA   seedrD   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   )rR   *   r4   )ZabcdefghijkrS   r7   )
   äú∑ℇr   r6   )rT   rS      )	input_strrM   )rM   )ZsubTestrQ   reprr@   lenassertEqual)r   argsrV   rM   r=   gotexpectedr   r   r   test_against_cpython_gold   s   z&TestHashAlgs.test_against_cpython_goldr   )r!   r"   r#   r<   r@   rB   rQ   r]   r   r   r   r   r$   K   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   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 - 1r4   )r`   listZassertIsInstancerL   rY   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 |}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     @@rl   g333333?g        g       g      infr6   ry   nan)ro   Zfinforr   Ztiny
resolutionZlinspaceZastypemeanfloatr	   	PYVERSIONappend)r   rt   rv   ru   rw   Zmin_stepstepar   r   r   float_samples   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              ?r|   )r   rX   r	   r   ro   anyisnan)r   rt   float_tyrealimagr   r   r   r   complex_samples   s   
zBaseTest.complex_samplesN)
r!   r"   r#   rb   rk   ro   int64rx   r   r   r   r   r   r   r^      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   )r   rY   dtypero   rk   )r   rt   r   r   r   r   check_floats   s   zTestNumberHashing.check_floatsc                 C   s4   |  ||D ]}| |jt| | | qd S r   )r   rY   r   ro   rk   )r   rt   r   r   r   r   r   check_complex   s   zTestNumberHashing.check_complexc                 C   s   |  tj |  tj d S r   )r   ro   float32float64ra   r   r   r   test_floats   s   zTestNumberHashing.test_floatsc                 C   s$   |  tjtj |  tjtj d S r   )r   ro   Z	complex64r   Z
complex128r   ra   r   r   r   test_complex   s   zTestNumberHashing.test_complexc                 C   s   |  ddg d S )NFTrk   ra   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 )Nrn   r   Zuint      *UU*UU
    UU*UU* r4   l    l    l l l i  i
  id  )ro   Zint8Zuint8Zint16Zuint16Zint32Zuint32r   uint64rx   rk   rp   rH   itemsizerq   rr   rs   r   maxsizer   )r   Zminmaxtyr   rv   signedszr   ZshiftsyiZtwiddle1Ztwiddle2valsZtwri   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 )r}   )r   ).0r   r   r   r   
<listcomp>?      z9TestNumberHashing.test_py310_nan_hash.<locals>.<listcomp>ry   c                    s   g | ]}  |qS r   )r`   )r   zra   r   r   r   @  s    r4   )rs   setZassertGreaterrX   )r   r   rN   r   ra   r   test_py310_nan_hash6  s   	z%TestNumberHashing.test_py310_nan_hashN)r!   r"   r#   __doc__r   r   r   r   r   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   r   splitr   r   r   K  r   z1TestTupleHashing.check_tuples.<locals>.<listcomp>r   )r   Zvalue_generatorr   rh   Ztuplesr   r   r   check_tuplesI  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.
            r   r   r   r   rt   r   r   split2Q  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   split3Z  s
   


z8TestTupleHashing.test_homogeneous_tuples.<locals>.split3)   )r   )r   r   )rz   )rz   r   )r6   )rU      )ro   r   r   rx   rk   )r   r   r   r   r   r   test_homogeneous_tuplesN  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?)ro   r   r   )r   r   br   r   r   r   p  s   z9TestTupleHashing.test_heterogeneous_tuples.<locals>.split)r   rx   )r   Zmodulor   r   r   r   test_heterogeneous_tuplesm  s   z*TestTupleHashing.test_heterogeneous_tuplesN)r!   r"   r#   r   r   r   r   r   r   r   r   r   D  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   🐍⚡ )rs   rX   rk   joinrc   )r   kind1_stringr   sepZkind2_stringZkind4_stringZempty_stringr   r   r   test_basic_unicodez  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>.fnrn   r   r   
assertTruerY   r   r   r   
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>.fnrn   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   rn   )r   r   rY   r   )r   r   ri   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_   Frn   )r   r   rY   r   )r   r   ZjittedZcompute_hashr\   r[   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   x  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 )NrU   Tr_   zunhashable type: '')r   Dictemptyr   r   ListZ
empty_listro   Zonesr   r   assertRaises	TypeErrorrH   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   ro   cosr   r   r   r   foo  r   z0TestUnhashable.test_no_generic_hash.<locals>.fooz"No __hash__ is defined for object )r   r   r   r   rH   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   rE   r   r   collectionsr   textwrapr   numpyro   Znumbar   r   r   r   Z
numba.corer   r	   Znumba.tests.supportr
   r   r   r   r   Znumba.cpython.unicoder   Znumba.cpythonr   r   r   r$   r^   r   r   r   r   r!   mainr   r   r   r   <module>   s2   -SG_4Z 