U
    9%e-F                     @   s6  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r2e&  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   W/var/www/html/Darija-Ai-API/env/lib/python3.8/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)
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ddgddddggddddgdd	dd	gd
dd
dgddddgddddggddddgddddgddddgddddgddd d!ggd"Zd#d$ Zd%d& Zd,d(d)Zd*d+ Zd'S )-TestHashAlgsi\iL̇l   LL//+?iTSlqU:~@[ i0&lOwq!~ iul   uC- i|#|l   |#8
^ i=վlBT='8 i\el   \e+=" i[l$E,; iwmHloa_gv ipGl   nYD~ iSljxY_oWs i l    /l 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:|r4dnd}nt jdksHt|rPdnd}| j| | | S )Nr$   little   r   big      )	r   	hash_infocutoff	algorithmr   Z	IS_32BITS	byteorderAssertionError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   s    zTestHashAlgs.get_hash_commandNc                 C   sV   t j }|d k	r t||d< n|dd  t| ||d\}}|  }t	|S )NZPYTHONHASHSEED)codeenv)
osenvironcopystrpopr   r5   decodestripint)r   r4   seedr7   out_stdoutr   r   r   get_hash   s    


zTestHashAlgs.get_hashc              
   C   s`   d}|D ]R\}}}| j ||d4 | jt||d}| |t|}| || W 5 Q R X qd S )N))abcr   r   )rE   *   r&   )ZabcdefghijkrF   r)   )
   äú∑ℇr   r(   )rG   rF      )	input_strr@   )r@   )ZsubTestrD   reprr3   lenassertEqual)r   argsrI   r@   r0   gotexpectedr   r   r   test_against_cpython_gold   s    z&TestHashAlgs.test_against_cpython_gold)N)r    r!   r"   r/   r3   r5   rD   rP   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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 - 1r&   )rS   listZassertIsInstancer?   rL   r   r.   printabsr   _PyHASH_MODULUS)r   valuesrS   valZnb_hasher   r   r   check_hash_values   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(   rk   nan)ra   Zfinford   Ztiny
resolutionZlinspaceZastypeZmeanfloatr	   	PYVERSIONappend)r   rf   rh   rg   ri   Zmin_stepstepar   r   r   float_samples   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              ?rn   )rv   rK   r	   rr   ra   anyisnan)r   rf   float_tyrealimagru   r   r   r   complex_samples   s    
zBaseTest.complex_samplesN)
r    r!   r"   rU   r]   ra   int64rj   rv   r|   r   r   r   r   rQ      s
   rQ   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   )rv   rL   dtypera   r]   )r   rf   ru   r   r   r   check_floats   s    zTestNumberHashing.check_floatsc                 C   s4   |  ||D ]"}| |jt| | | qd S r   )r|   rL   r   ra   r]   )r   rf   ry   ru   r   r   r   check_complex   s    zTestNumberHashing.check_complexc                 C   s   |  tj |  tj d S r   )r   ra   float32float64rT   r   r   r   test_floats   s    zTestNumberHashing.test_floatsc                 C   s$   |  tjtj |  tjtj d S r   )r   ra   Z	complex64r   Z
complex128r   rT   r   r   r   test_complex   s    zTestNumberHashing.test_complexc                 C   s   |  ddg d S )NFTr]   rT   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 )Nr`   r   Zuint      *UU*UU
    UU*UU* r&   l    l    l l l i  i
  id  )ra   Zint8Zuint8Zint16Zuint16Zint32Zuint32r}   uint64rj   r]   rb   r;   itemsizerc   rd   re   r   maxsizers   )r   Zminmaxtyru   rh   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 )ro   )rq   ).0r   r   r   r   
<listcomp>?  s     z9TestNumberHashing.test_py310_nan_hash.<locals>.<listcomp>rk   c                    s   g | ]}  |qS r   )rS   )r   zrT   r   r   r   @  s     r&   )re   setZassertGreaterrK   )r   r   rA   r   rT   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   ru   splitr   r   r   K  s     z1TestTupleHashing.check_tuples.<locals>.<listcomp>r   )r   Zvalue_generatorr   rZ   Ztuplesr   r   r   check_tuplesI  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   r   rf   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   )rl   )rl   r   )r(   )rH      )ra   r   r   rj   r]   )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?)ra   r}   r   )r   ru   br   r   r   r   p  s    z9TestTupleHashing.test_heterogeneous_tuples.<locals>.split)r   rj   )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 qHd}|t|}t t|D ]}| |d | g qd}| | d S )Nabcdefghijklmnopqrstuvwxyzu   眼u   🐍⚡ )re   rK   r]   joinrV   )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   TrR   c                 S   s   | j S r   )_hashr   r   r   r   fn  s    z4TestUnicodeHashing.test_hash_passthrough.<locals>.fnr`   r   r   
assertTruerL   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   TrR   c                 S   s   | j t| fS r   )r   r   r   r   r   r   r     s    z9TestUnicodeHashing.test_hash_passthrough_call.<locals>.fnr`   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 )NTrR   c                  S   s   d} | S )Nr   r   r   r   r   r   r     s    z0TestUnicodeHashing.test_hash_literal.<locals>.fnr   r`   )r   r   rL   r   )r   r   r[   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>.implTrR   Fr`   )r   r   rL   r   )r   r   ZjittedZcompute_hashrO   rN   ru   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 ]H}| t}|| W 5 Q R X dtt| d}| |t|j q>d S )NrH   TrR   zunhashable type: '')r   Dictemptyr   r}   ListZ
empty_listra   Zonesr   r   assertRaises	TypeErrorr;   r   assertIn	exception)r   ZunhashablesrS   r   raisesrO   r   r   r   test_hash_unhashable  s    z#TestUnhashable.test_hash_unhashablec              	   C   sH   t dddd }| t}|  W 5 Q R X d}| |t|j d S )NTrR   c                   S   s   t tj d S r   )r   ra   cosr   r   r   r   foo  s    z0TestUnhashable.test_no_generic_hash.<locals>.fooz"No __hash__ is defined for object )r   r   r   r   r;   r   )r   r   r   rO   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   r8   r   r   collectionsr   textwrapr   numpyra   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#   rQ   r~   r   r   r   r    mainr   r   r   r   <module>   s.   -SG_4Z 
