
    <et0                     f   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 ej        dk    Z	d5dZ
d Zd Z G d	 d
ej                  Zej        Z G d de          ZdZ G d de          Z G d de          Z G d de          Z G d dee          Z G d dee          Z G d de          Z G d dej                  Z G d de          Z G d dej                  Z G d  d!          Z G d" d#e          Z G d$ d%eej                  Z G d& d'eej                  Z  G d( d)eej                  Z! G d* d+e          Z" G d, d-e"ej                  Z# G d. d/e"ej                  Z$ G d0 d1e"ej                  Z% G d2 d3ej                  Z&e'd4k    r ej(                     dS dS )6    N)assert_python_ok)Hashable           c                     | dk    rt          |          S t          |          }t          |          D ]}d| z  dz   dz  } | dz	  dz  ||<   t          |          S )zLinear congruential generatorr   iC iÞ& r      )bytes	bytearrayrange)xlengthoutis       %/usr/lib/python3.11/test/test_hash.pylcgr      sl    AvvV}}
F

C6]] " "aZ'!Z/r'T!A::    c                 z    d| cxk    rdk     sn J | dk    r| dz
  }n| }| | dz	  z  dz  }|dk    r|dz
  }n|}||fS )z*Convert SipHash24 output to Py_hash_t
    r   l            l        l    r   r    )uint64int64uint32int32s       r   	pysiphashr      s~     """"'""""""'"v|#z1F'"%<r   c                 n    t           j        j        dv }d}|r| n t          j        |          |           S )z8Skip decorator for tests that depend on SipHash24 or FNV>   fnv	siphash13	siphash24z$Requires SipHash13, SipHash24 or FNV)sys	hash_info	algorithmunittestskip)testokmsgs      r   skip_unless_internalhashr(   +   s;    		 $E	EB
0C344-8=--d333r   c                   ,    e Zd Zd Zd Zd Zd Zd ZdS )HashEqualityTestCasec                     t          t          t          |                    }|dd          D ]&}||d         k    r|                     d|           'd S )N   r   zhashed values differ: )listmaphashfail)selfobjlisthashedhs       r   	same_hashzHashEqualityTestCase.same_hash4   sg     c$(()) 	C 	CAF1I~~			ABBB	C 	Cr   c                     |                      dddd           |                      ddd           |                      ddd	           |                      d
dd           d S )Nr,   g      ?y      ?        r           y                g      y              g       y               )r5   r1   s    r   test_numeric_literalsz*HashEqualityTestCase.test_numeric_literals<   sb    q!S(+++q#x(((r4+++r4+++++r   c           
         |                      t          d          t          d          t          d          t          d          t          d          t          d                     |                      t          d          t          d                     |                      t          d          t          d                     |                      t          d          t          d                     |                      t          d          t          d                     |                      t          d          t          d                     |                      t          d	          t          d	                     d S )
Nr,   1z1.0i   i  r   l        l         l            r5   intfloatcomplexr:   s    r   test_coerced_integersz*HashEqualityTestCase.test_coerced_integersB   s   s1vvs1vvuQxx3xxu	/ 	/ 	/s6{{E&MM222s7||U7^^444s7||U7^^444s5zz5<<000s6{{E&MM222s5zz5<<00000r   c                     |                      t          d          t          d                     |                      t          d          t          dd                     d S )Ng쏈b=~g      ?r7   r>   r:   s    r   test_coerced_floatsz(HashEqualityTestCase.test_coerced_floatsM   sL    s8}}eHoo666uSzz73#4#455555r   c                    ddz  }t          d          D ]k}t          d          D ]Y}||d|z            }t          |          |d|z            }|                     t          |          t          |                     Zld S )Ns#   123456789abcdefghijklmnopqrstuvwxyz   r   )r   
memoryviewassertEqualr/   )r1   br   jaligned	unaligneds         r   test_unaligned_buffersz+HashEqualityTestCase.test_unaligned_buffersQ   s     3S8r 	A 	AA2YY A AAc!eG*&qMM!CE'2	  gY@@@@A	A 	Ar   N)__name__
__module____qualname__r5   r;   rB   rD   rM   r   r   r   r*   r*   2   sg        C C C, , ,	1 	1 	16 6 6A A A A Ar   r*   c                       e Zd ZdS )DefaultHashNrN   rO   rP   r   r   r   rR   rR   ]             r   rR   *   c                       e Zd Zd ZdS )	FixedHashc                     t           S N)_FIXED_HASH_VALUEr:   s    r   __hash__zFixedHash.__hash__a   s      r   NrN   rO   rP   r[   r   r   r   rW   rW   `   #        ! ! ! ! !r   rW   c                       e Zd Zd ZdS )OnlyEqualityc                 
    | |u S rY   r   r1   others     r   __eq__zOnlyEquality.__eq__e   s    u}r   N)rN   rO   rP   rc   r   r   r   r_   r_   d   s#            r   r_   c                       e Zd Zd ZdS )OnlyInequalityc                 
    | |uS rY   r   ra   s     r   __ne__zOnlyInequality.__ne__i   s    5  r   N)rN   rO   rP   rg   r   r   r   re   re   h   r]   r   re   c                       e Zd ZdS )InheritedHashWithEqualityNrS   r   r   r   ri   ri   l   rT   r   ri   c                       e Zd ZdS )InheritedHashWithInequalityNrS   r   r   r   rk   rk   m   rT   r   rk   c                       e Zd ZdZdS )NoHashNr\   r   r   r   rm   rm   o   s        HHHr   rm   c                       e Zd Z e             e             e            gZ e             e             e	            gZ
 e             e            gZd Zd Zd Zd Zd ZdS )HashInheritanceTestCasec                 z    | j         D ]2}|                     t          |          t          |                     3d S rY   )default_expectedrH   r/   _default_hashr1   objs     r   test_default_hashz)HashInheritanceTestCase.test_default_hash   sE    ( 	< 	<CT#YYc(:(:;;;;	< 	<r   c                 j    | j         D ]*}|                     t          |          t                     +d S rY   )fixed_expectedrH   r/   rZ   rs   s     r   test_fixed_hashz'HashInheritanceTestCase.test_fixed_hash   s>    & 	; 	;CT#YY(9::::	; 	;r   c                 \    | j         D ]#}|                     t          t          |           $d S rY   )error_expectedassertRaises	TypeErrorr/   rs   s     r   test_error_hashz'HashInheritanceTestCase.test_error_hash   s9    & 	4 	4Cis3333	4 	4r   c                 d    | j         | j        z   }|D ]}|                     |t                     d S rY   )rq   rw   assertIsInstancer   )r1   objectsrt   s      r   test_hashablez%HashInheritanceTestCase.test_hashable   sG    (&' 	1 	1C!!#x0000	1 	1r   c                 P    | j         D ]}|                     |t                     d S rY   )rz   assertNotIsInstancer   rs   s     r   test_not_hashablez)HashInheritanceTestCase.test_not_hashable   s7    & 	4 	4C$$S(3333	4 	4r   N)rN   rO   rP   objectrR   re   rq   rW   ri   rk   rw   rm   r_   rz   ru   rx   r}   r   r   r   r   r   ro   ro   r   s        #&((  ikk//111133N fhh"lnnN< < <; ; ;4 4 41 1 14 4 4 4 4r   ro   c                   0    e Zd Z ed          Zd Zd ZdS )DefaultIterSeq
   c                 *    t          | j                  S rY   )lenseqr:   s    r   __len__zDefaultIterSeq.__len__   s    48}}r   c                     | j         |         S rY   )r   )r1   indexs     r   __getitem__zDefaultIterSeq.__getitem__   s    xr   N)rN   rO   rP   r   r   r   r   r   r   r   r   r      s?        
%))C      r   r   c                   z    e Zd Z e ed                     e e                       ed d          gZd ZdS )HashBuiltinsTestCaser   c                      dS )Nr   r   r   r   r   <lambda>zHashBuiltinsTestCase.<lambda>   s    A r   r   c                     t           j        }| j        D ].}|                     t	          |           ||                     /d S rY   )r   r[   hashes_to_checkrH   r/   )r1   rr   rt   s      r   test_hashesz HashBuiltinsTestCase.test_hashes   sN    ' 	< 	<CT#YYc(:(:;;;;	< 	<r   N)	rN   rO   rP   	enumerater   iterr   r   r   r   r   r   r   r      se         yr++tNN,,--tIIq))O
< < < < <r   r   c                   "    e Zd Zd ZddZd ZdS )HashRandomizationTestsc                     d|z  S )Nzprint(hash(eval(%a)))r   r1   repr_s     r   get_hash_commandz'HashRandomizationTests.get_hash_command   s    &..r   Nc                 2   t           j                                        }d|d<   |t          |          |d<   n|                    dd            t          d|                     |          fi |}|d                                         }t          |          S )NT
__cleanenvPYTHONHASHSEEDz-cr,   )	osenvironcopystrpopr   r   stripr?   )r1   r   seedenvr   stdouts         r   get_hashzHashRandomizationTests.get_hash   s    joo L$'IIC !!GG$d+++$''..   Q6{{r   c                     |                      | j        d          }|                      | j        d          }|                     ||           d S )Nrandomr   )r   r   assertNotEqual)r1   run1run2s      r   test_randomized_hashz+HashRandomizationTests.test_randomized_hash   sL    }}TZh}77}}TZh}77D$'''''r   rY   )rN   rO   rP   r   r   r   r   r   r   r   r      sF        
/ / /   ( ( ( ( (r   r   c            	           e Zd Zd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g dg dg dg dg dgdZd Zd Zed             Z	ed             Z
dS ) StringlikeHashRandomizationTestsN)\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   r   )iJkl   J:8`~ il)wJ )iQ	l .GUJG iO{l]D] )Г   P'ABS! r   r   )ilm]]Ri ilTe] )iX0l'W=>0 iel;u )il   g,g i5$fl`bTNV)i l9\R>| iQlkT<h4 )djba33xr   r   r   c                     |t           j        j        k     rd}nt           j        j        }t           j        dk    rt
          rdnd}nt           j        dk    sJ t
          rdnd}| j        |         |         |         S )Nr   littler,   r   big      )r    r!   cutoffr"   	byteorderIS_64BITknown_hashes)r1   positionr   r"   platforms        r   get_expected_hashz2StringlikeHashRandomizationTests.get_expected_hash   sy    CM(((!II/I=H$$$+qq!HH=E))))$+qq!H +H5h??r   c                     |                      dd          }|                     |                     | j                  |           |                     |                     | j        d          |           d S )Nr   r   r   )r   r   r   r   rH   )r1   known_hash_of_objs     r   test_null_hashz/StringlikeHashRandomizationTests.test_null_hash
  sp     221a88 	DMM$*557HIII 	tz::<MNNNNNr   c                     |                      dd          }|                     |                     | j        d          |           d S )Nr,   r   rU   r   )r   rH   r   r   r1   r4   s     r   rx   z0StringlikeHashRandomizationTests.test_fixed_hash  sG     ""1a((tz;;Q?????r   c                     | j         d S |                     dd          }|                     |                     | j         d          |           d S )Nr      rU   r   )	repr_longr   rH   r   r   s     r   test_long_fixed_hashz5StringlikeHashRandomizationTests.test_long_fixed_hash  sR    >!F""1b))t~B??CCCCCr   )rN   rO   rP   r   r   r   r   r   r(   rx   r   r   r   r   r   r      sc       EI :99NNN	 MLLNNNNNNQQQPPP
  ONNNNNPPPOOORRR
" " "# # ## # #" " "# # #
C2 2Lh
@ 
@ 
@O O O @ @ @ D D D D Dr   r   c                   |    e Zd Z ed          Z ed          Z ed          Zed             Zed             Z	dS )StrHashRandomizationTestsabcabcdefghijku
   äú∑ℇc                 L    |                      t          d          d           d S )N r   rH   r/   r:   s    r   test_empty_stringz+StrHashRandomizationTests.test_empty_string)  s$    b1%%%%%r   c                    |                      dd          }|                     |                     | j        d          |           |                      dd          }|                     |                     | j        d          |           d S )Nr      r   r      rU   )r   rH   r   	repr_ucs2r   s     r   test_ucs2_stringz*StrHashRandomizationTests.test_ucs2_string-  s    ""1a((t~A>>BBB""1a((t~B??CCCCCr   N)
rN   rO   rP   reprr   r   r   r(   r   r   r   r   r   r   r   #  sz        DKKE]##I\""I& & & D D D D Dr   r   c                   P    e Zd Z ed          Z ed          Zed             ZdS )BytesHashRandomizationTestss   abcs   abcdefghijkc                 L    |                      t          d          d           d S Nr   r   r   r:   s    r   r   z-BytesHashRandomizationTests.test_empty_string9  s$    cA&&&&&r   N)rN   rO   rP   r   r   r   r(   r   r   r   r   r   r   4  sJ        DLLE^$$I' ' ' ' 'r   r   c                   ,    e Zd ZdZdZed             ZdS ) MemoryviewHashRandomizationTestszmemoryview(b'abc')zmemoryview(b'abcdefghijk')c                 f    |                      t          t          d                    d           d S r   )rH   r/   rG   r:   s    r   r   z2MemoryviewHashRandomizationTests.test_empty_stringB  s,    joo..22222r   N)rN   rO   rP   r   r   r(   r   r   r   r   r   r   =  s8         E,I3 3 3 3 3r   r   c                       e Zd Zd ZdS )DatetimeTestsc                     d|z  S )Nz import datetime; print(hash(%s))r   r   s     r   r   zDatetimeTests.get_hash_commandG  s    1E99r   N)rN   rO   rP   r   r   r   r   r   r   F  s#        : : : : :r   r   c                   D    e Zd Z e ej        ddd                    ZdS )DatetimeDateTestsi*  r      N)rN   rO   rP   r   datetimedater   r   r   r   r   r   J  s-        DtR,,--EEEr   r   c                   L    e Zd Z e ej        ddddddd                    ZdS )	DatetimeDatetimeTestsr,   r   r   r      r      N)rN   rO   rP   r   r   r   r   r   r   r   r   M  s7        D""1aAq!Q7788EEEr   r   c                   @    e Zd Z e ej        d                    ZdS )DatetimeTimeTestsr   N)rN   rO   rP   r   r   timer   r   r   r   r   r   P  s)        Dq!!""EEEr   r   c                       e Zd Zd ZdS )HashDistributionTestCasec           	      H   d}t          dt          |                    D ] }|d |         }|                     |          5  t                      }t                      }t          d          D ]Q}t	          |t          |          z             }|                    |dz             |                    |dz             R|                     t          |          d|           |                     t          |          d|           d d d            n# 1 swxY w Y   d S )	Nabcdefghabcdefgr,   )prefix      r	      rF   )r   r   subTestsetr/   chraddassertGreater)r1   baser   r  s15s255cr4   s           r   test_hash_distributionz/HashDistributionTestCase.test_hash_distributionV  sP    q#d))$$ 	; 	;A"1"XFV,, 	; 	;eeuus ' 'AVc!ff_--AGGAG$$$HHQX&&&&""3s88Q777""3t99c6:::	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	;	; 	;s   CDD	D	N)rN   rO   rP   r  r   r   r   r   r   T  s#        ; ; ; ; ;r   r   __main__)r   ))r   r   r    r#   test.support.script_helperr   collections.abcr   maxsizer   r   r   r(   TestCaser*   r   r[   rr   rR   rZ   rW   r_   re   ri   rk   rm   ro   r   r   r   r   r   r   r   r   r   r   r   r   rN   mainr   r   r   <module>r     s]    				 



  7 7 7 7 7 7 $ $ $ $ $ $;     $4 4 4'A 'A 'A 'A 'A8, 'A 'A 'AT      &    ! ! ! ! ! ! ! !    6   ! ! ! ! !V ! ! ! ? > > > >	< > > > B B B B B)^ B B B    V   !4 !4 !4 !4 !4h/ !4 !4 !4J    V   	< 	< 	< 	< 	<8, 	< 	< 	<( ( ( ( ( ( ( (8[D [D [D [D [D'= [D [D [D|D D D D D @ ( 1D D D"' ' ' ' '"B"*"3' ' '3 3 3 3 3'G'/'83 3 3: : : : :* : : :. . . . .x'8 . . .9 9 9 9 9M8+< 9 9 9# # # # #x'8 # # #; ; ; ; ;x0 ; ; ;$ zHMOOOOO r   