
    xKgJ                     ~   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 Z G d de      Z G d de      Z G d de      Z  G d de       Z! G d de       Z" G d de       Z# G d de      Z$e%dk(  r ejL                          yy)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                     t        |       S Nhashxs    \/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/numba/tests/test_hashing.pyhash_usecaser      s    7N    c                       e Zd Zd Zy)TestHashingSetupc                 f    d}t        j                  t        j                  dt	        |      g       y )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works     r   test_warn_on_fnvz!TestHashingSetup.test_warn_on_fnv!   s)    %L 	s~~tVD\BCr   N)__name__
__module____qualname__r#    r   r   r   r      s    (Dr   r   c                   z    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 Zd ZddZd Zy)TestHashAlgs)\r*   r*   r*   )iL̇l   LL//+?iTSlqU:~@[ )0&Owq!~ r+   r,   )u   uC- r-   r.   )|#|   |#8
^ r/   r0   )i=վlBT='8 i\el   \e+=" )i[l$E,; iwmHloa_gv )pG   nYD~ r1   r2   )SjxY_oWs r3   r4   )     /l r5   r6   )iJkl   J:8`~ il)wJ )iQ	l .GUJG iO{l]D] )djba33x	siphash13	siphash24c                 ,   |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 )Nr7   little   r   big      )r   	hash_infocutoff	algorithmr   	IS_32BITS	byteorderknown_hashes)r!   positionlengthrB   IS_64BITplatforms         r   get_expected_hashzTestHashAlgs.get_expected_hashx   s    CMM(((!I//I'''==H$$q!H==E)*)$q!H  +H5h??r   c                     d|z  S )Nzprint(hash(eval(%a)))r'   )r!   repr_s     r   get_hash_commandzTestHashAlgs.get_hash_command   s    &..r   Nc                    t         j                  j                         }|t        |      |d<   n|j	                  dd        t        | j                  |      |      \  }}|j                         j                         }t        |      S )NPYTHONHASHSEED)codeenv)
osenvironcopystrpopr   rM   decodestripint)r!   rL   seedrQ   out_stdouts          r   get_hashzTestHashAlgs.get_hash   sr    jjoo$'IC !GG$d+"(=(=e(D'*,Q##%6{r   c                     d}|D ]k  \  }}}| j                  ||      5  | j                  t        |      |      }| j                  |t	        |            }| j                  ||       d d d        m y # 1 sw Y   xxY w)N))abcr   r   )r`   *   r<   )abcdefghijkra   r?   )
   äú∑ℇr   r>   )rc   ra      )	input_strrZ   )rZ   )subTestr^   reprrJ   lenassertEqual)r!   argsre   rZ   rF   gotexpecteds          r   test_against_cpython_goldz&TestHashAlgs.test_against_cpython_gold   sw    > *.%ItX	=mmDO$m?11(C	NK  h/ >= *.==s   A
A44A=	r   )r$   r%   r&   rE   rJ   rM   r^   rm   r'   r   r   r)   r)   L   sZ     :N	 MNNQP
  ONPOR
)!LF@/		0r   r)   c                   B    e Zd Zd Zd Zej                  fdZd Zd Z	y)BaseTestc                 :     t        d      t              | _        y )NTnopython)r   r   cfuncr!   s    r   setUpzBaseTest.setUp   s    'S$'5
r   c           	      z   | j                   }t        |      D ]<  } ||      }| j                  |t               	 | j	                  |t        |             > y # t        $ rY}t        d       t        ||t        |             t        d       t        t        |      t        j                  dz
         |d }~ww xY w)Nzval, nb_hash, hash(val)z%abs(val), hashing._PyHASH_MODULUS - 1r<   )rs   listassertIsInstancerY   ri   r   AssertionErrorprintabsr   _PyHASH_MODULUS)r!   valuesrs   valnb_hashes         r   check_hash_valueszBaseTest.check_hash_values   s    

<CCjG!!'3/  $s)4	  
 " /0c7DI.=>c#h 7 7! ;<s   A	B:!AB55B:c              #     K   dD ]{  }t        j                  |      }|j                  |cxk  r|j                  k  sn :d}t	        |||z          t	        ||d|z  z   d       t	        ||d|z  z   d       dg } y w)N)r   ii`  l        d      )npiinfominmaxrange)r!   typstartinfons        r   int_sampleszBaseTest.int_samples   s     -E88C=D88u00Auqy))usQw44usQw44$J .s   BBc              #   ,  K   t        j                  |      }dd|j                  dz  |j                  dz  fD ]  }d}t        |j                  ||j                  z        }d|dz  |fD ]T  }||k  r	t        j
                  ||||z  z   |      }|j                  |      }| |  ||j                         z    V  dddd	t        d
      t        d
       g}t        j                  dk  r|j                  t        d              ||       y w)Nr   
         ?g     @@r   g333333?g        g       g      infr>   r   nan)r   finfor   tiny
resolutionlinspaceastypemeanfloatr
   	PYVERSIONappend)r!   r   r   r   r   min_stepstepas           r   float_sampleszBaseTest.float_samples   s     xx}TXX_dhh.?@EA499edoo&=>Hh#ox8(?KKuq4x'7;HHSMb!&&(l" 9 A #tT5<%,@ ??W$HHU5\"!fs   DDc              #   B  K   | j                  |      D ]  }| j                  |      D ]q  }|d t        |       }|d t        |       }| |d      |z  z   }t        j                  dk\  r.t	        j
                  t	        j                  |            ri| n| s  y w)Ny              ?r   )r   rh   r
   r   r   anyisnan)r!   r   float_tyrealimagr   s         r   complex_sampleszBaseTest.complex_samples   s     &&x0D**84JSY'JSY'3r7T>) ??g-66"((1+.G 5 1s   BBBN)
r$   r%   r&   ru   r   r   int64r   r   r   r'   r   r   ro   ro      s$    6 !hh 	2r   ro   c                   b     e Zd ZdZ fdZd fdZd Zd Zd Zd Z	d Z
d	 Zed
        Z xZS )TestNumberHashingz'
    Test hashing of number types.
    c                     t         dk\  r.t        j                         | _        t        j                  d       t
        |          S Nr?   r   legacyr   r   _get_promotion_stateinitial_state_set_promotion_statesuperru   r!   	__class__s    r   ru   zTestNumberHashing.setUp   8    F" "$!8!8!:D##H-w}r   c                 p    t         dk\  rt        j                  | j                         t        |          S Nr   r   r   r   r   r   tearDownr   s    r   r   zTestNumberHashing.tearDown   /    F" ##D$6$67w!!r   c                     | j                  |      D ]B  }| j                  |j                  t        j                  |             | j	                  |       D y r   )r   ri   dtyper   r   )r!   r   r   s      r   check_floatszTestNumberHashing.check_floats   sA    ##C(AQWWbhhsm4""1% )r   c                     | j                  ||      D ]B  }| j                  |j                  t        j                  |             | j	                  |       D y r   )r   ri   r   r   r   )r!   r   r   r   s       r   check_complexzTestNumberHashing.check_complex  sC    %%c84AQWWbhhsm4""1% 5r   c                     | j                  t        j                         | j                  t        j                         y r   )r   r   float32float64rt   s    r   test_floatszTestNumberHashing.test_floats  s&    "**%"**%r   c                     | j                  t        j                  t        j                         | j                  t        j                  t        j
                         y r   )r   r   	complex64r   
complex128r   rt   s    r   test_complexzTestNumberHashing.test_complex
  s2    2<<42=="**5r   c                 *    | j                  ddg       y )NFTr   rt   s    r   	test_boolzTestNumberHashing.test_bool  s    t}-r   c           	         g }t         j                  t         j                  t         j                  t         j                  t         j
                  t         j                  t         j                  t         j                  fD ]_  }| j                  |      D ]  }| j                  |        t        j                  |      }| j                   |d      g       | j                   |d      g       dt        |      v} |       j                  }|j                  |j                  fD ]  }d|z  }|}	t!        |      D ]  }
d}d}|	g}||fD ],  }|	|z  }|t"        j$                  k  s|j'                  |       . |D ]  }| j                   ||      g        |r0|D ]+  }||j                  k7  s| j                   ||       g       - |dk(  r	|	dz  dz  }	|	dz	  }	  b | j                  t        j                  d      g       | j                  t        j                  d	      g       | j                  t        j                  d      g       | j                  t        j                  d	      g       | j                  t        j                  d
      g       | j                  t        j                  d      g       | j                  t        j                  d      g       | j                  t        j
                  d      g       | j                  t        j
                  d      g       | j                  t        j
                  d      g       y )Nr   r   uint      *UU*UU
    UU*UU* r<   l    l    l l l i  i
  id  )r   int8uint8int16uint16int32uint32r   uint64r   r   r   rU   itemsizer   r   r   r   maxsizer   )r!   minmaxtyr   r   signedszr   shiftsyitwiddle1twiddle2valstwr~   vs                    r   	test_intszTestNumberHashing.test_ints  s   77BHHbhh		88RYY"))=B%%b)&&q) *88B<D ""BrF8,""BqE7+3r7*FBhh)R vA1H1H3D'2(l, KK, 3 "..1w7 "!%A DHH} $ 6 6A2x @ "& AvUqLF% ' *=N 	); <=>); <=>		*< =>?		*< =>? 	)< =>?)< =>?)< =>? 567 567 567r   c                     t        d      D cg c]  }t        d       }}t        |D cg c]  }| j                  |       c}      }| j	                  t        |      d       y c c}w c c}w )Nr   r   r<   )r   r   setrs   assertGreaterrh   )r!   r   r   zr[   s        r   test_py310_nan_hashz%TestNumberHashing.test_py310_nan_hashH  s]     $)9-9aU5\9-!,!Q4::a=!,-3s8Q' .,s
   A&A+returnN)r$   r%   r&   __doc__ru   r   r   r   r   r   r   r   r   r   __classcell__r   s   @r   r   r      sE    "&
&
&6.58n 
( 
(r   r   c                   @     e Zd ZdZ fdZd fdZd Zd Zd Z xZ	S )TestTupleHashingz!
    Test hashing of tuples.
    c                     t         dk\  r.t        j                         | _        t        j                  d       t
        |          S r   r   r   s    r   ru   zTestTupleHashing.setUp[  r   r   c                 p    t         dk\  rt        j                  | j                         t        |          S r   r   r   s    r   r   zTestTupleHashing.tearDownd  r   r   c                 h    |D ](  }|D cg c]
  } ||       }}| j                  |       * y c c}w r   r   )r!   value_generatorsplitr}   r   tupless         r   check_tupleszTestTupleHashing.check_tuplesl  s5    %F(./1eAhF/""6* &/s   /c                     t         j                  fd}fd}| j                  | j                         |       | j                  | j                         |       | j	                  g d       y )Nc                 @     |       } |  d      z  |  d      z  fS )z9
            Split i's bits into 2 integers.
            r   r   r'   r   r   s    r   split2z8TestTupleHashing.test_homogeneous_tuples.<locals>.split2t  s4     AA.//.// r   c                 T     |       } |  d      z  |  d      z  |  d      z  fS )z9
            Split i's bits into 3 integers.
            l   $$$$ l   $I$I$I$I l   IIII	 r'   r   s    r   split3z8TestTupleHashing.test_homogeneous_tuples.<locals>.split3}  sB     AA.//.//.// r   )   )r   )r   r   )r   )r   r  )r>   )rd      )r   r   r   r   r   )r!   r   r  r   s      @r   test_homogeneous_tuplesz(TestTupleHashing.test_homogeneous_tuplesq  s_    ii		 	$**,f5$**,f5
 	  > 	?r   c                 N    d}d }| j                  | j                         |       y )Nl            c                     | dz  }| dz  | dz	  dz  z  }t        j                  |      t        j                  |dz        fS )Nr   l   *UU     g-C6?)r   r   r   )r   r   bs      r   r   z9TestTupleHashing.test_heterogeneous_tuples.<locals>.split  sD    &&AZQ"W
$:;A88A;

1v: 666r   )r   r   )r!   modulor   s      r   test_heterogeneous_tuplesz*TestTupleHashing.test_heterogeneous_tuples  s'    	7
 	$**,e4r   r   )
r$   r%   r&   r   ru   r   r   r  r  r   r   s   @r   r   r   V  s!    "+
?>5r   r   c                   T    e Zd Zd Zd Zd Z ej                  d      d        Zd Z	y)TestUnicodeHashingc                    d}t        t        |            D ]  }| j                  |d | g        d}|j                  t	        |            }t        t        |            D ]  }| j                  |d | g        d}|j                  t	        |            }t        t        |            D ]  }| j                  |d | g        d}| j                  |       y )Nabcdefghijklmnopqrstuvwxyzu   眼u   🐍⚡ )r   rh   r   joinrw   )r!   kind1_stringr   sepkind2_stringkind4_stringempty_strings          r   test_basic_unicodez%TestUnicodeHashing.test_basic_unicode  s    3s<()A""L!$4#56 * xx\ 23s<()A""L!$4#56 * xx\ 23s<()A""L!$4#56 * |,r   c                     d}t        d      d        }t        |      d   }| j                  |dk7         | j                   ||      |       y )Nr  Trq   c                     | j                   S r   )_hashr   s    r   fnz4TestUnicodeHashing.test_hash_passthrough.<locals>.fn  s    77Nr   r   r   r   
assertTrueri   r!   r  r  
hash_values       r   test_hash_passthroughz(TestUnicodeHashing.test_hash_passthrough  sW     4	d		 
	 2,?C

b()L):6r   c                     d}t        d      d        }t        |      d   }| j                  |dk7         | j                   ||      ||f       y )Nr  Trq   c                 0    | j                   t        |       fS r   )r  r   r   s    r   r  z9TestUnicodeHashing.test_hash_passthrough_call.<locals>.fn  s    77DG##r   r   r  r  s       r   test_hash_passthrough_callz-TestUnicodeHashing.test_hash_passthrough_call  sZ    3	d		$ 
	$ 2,?C

b()L)J
+CDr   z/Needs hash computation at const unpickling timec                     t        d      d        } |       }t        d      }| j                  |t        |      d          y )NTrq   c                  
    d} | S )Nr  r'   r   s    r   r  z0TestUnicodeHashing.test_hash_literal.<locals>.fn  s    ,AHr   r  r   )r   r   ri   r   )r!   r  r~   tmps       r   test_hash_literalz$TestUnicodeHashing.test_hash_literal  sJ     
d		 
	 d/0;C@DFr   c                 V   d } t        d      |      }d} ||      } ||      }t        |      }t        |      }| j                  |d d |d d        | j                  |d   |d   k7         d} ||      } ||      }t        |      }t        |      }| j                  ||       y )Nc                 2    d}d}||z   }| rt        |       |S )Naaaau   眼眼眼眼r   )do_hashconst1const2news       r   implz:TestUnicodeHashing.test_hash_on_str_creation.<locals>.impl  s$    F#F6/CS	Jr   Trq   Fr   )r   r   ri   r  )r!   r0  jittedcompute_hashrl   rk   r   r
  s           r   test_hash_on_str_creationz,TestUnicodeHashing.test_hash_on_str_creation  s    	 $d#D) %\")(3)#.3B3B("2' %\")(3)#.Ar   N)
r$   r%   r&   r  r!  r$  unittestskipr(  r3  r'   r   r   r  r    s:    -$7
E X]]DE	G F	Gr   r  c                       e Zd Zd Zd Zy)TestUnhashablec                 &   t        j                         j                  t        j                  t        j                        t        j
                         j                  t        j                        t        j                  d      f} t        d      t              }|D ]e  }| j                  t              5 } ||       d d d        dt        t        |             d}| j                  |t        j                                g y # 1 sw Y   IxY w)Nrd   Trq   zunhashable type: '')r   Dictemptyr	   r   List
empty_listr   onesr   r   assertRaises	TypeErrorrU   r   assertIn	exception)r!   unhashablesrs   r   raisesrl   s         r   test_hash_unhashablez#TestUnhashable.test_hash_unhashable  s    zz|))%++u{{Czz|..u{{;wwqz# #T"<0B""9-b	 .+Cr
O+<A>HMM(C(8(8$9:	 --s   6	DD	c                     t        d      d        }| j                  t              5 } |        d d d        d}| j                  |t	        j
                               y # 1 sw Y   1xY w)NTrq   c                  6    t        t        j                         y r   )r   r   cosr'   r   r   fooz0TestUnhashable.test_no_generic_hash.<locals>.foo
  s    Lr   z"No __hash__ is defined for object )r   r?  r@  rA  rU   rB  )r!   rI  rD  rl   s       r   test_no_generic_hashz#TestUnhashable.test_no_generic_hash  s`     
d		 
	 y)VE * 9hF$4$4 56	 *)s   A  A)N)r$   r%   r&   rE  rJ  r'   r   r   r7  r7    s    	;7r   r7  __main__)'r   r4  rR   r   r   collectionsr   textwrapr   numpyr   numbar   r   r   r   
numba.corer	   r
   numba.tests.supportr   r   r   numba.cpython.unicoder   numba.cpythonr   numba.np.numpy_supportr   r   r   r)   ro   r   r   r  r7  r$   mainr'   r   r   <module>rV     s     	 
  #   , , # 4 4 ? ! 0*Dx *DZP08 P0fDx DNm( m(`B5x B5JW Wt7X 7@ zHMMO r   