o
    HXh-                     @   s  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	d8ddZ
dd	 Zd
d ZG dd dejZejZG dd deZ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eZG dd deeZG dd deZG dd dejZG dd  d eZG d!d" d"ejZG d#d$ d$ZG d%d& d&eZG d'd( d(eejZG d)d* d*eejZ G d+d, d,eejZ!G d-d. d.eZ"G d/d0 d0e"ejZ#G d1d2 d2e"ejZ$G d3d4 d4e"ejZ%G d5d6 d6ejZ&e'd7kre(  dS dS )9    N)assert_python_ok)Hashable           c                 C   sN   | dkrt |S t|}t|D ]}d|  d d@ } | d? d@ ||< qt |S )zLinear congruential generatorr   iC iÞ& r      )bytes	bytearrayrange)xlengthouti r   8/opt/python-3.10.19/usr/lib/python3.10/test/test_hash.pylcg   s   r   c                 C   sf   d|   krdk sJ  J | dkr| d }n| }| | d? A d@ }|dkr-|d }||fS |}||fS )z*Convert SipHash24 output to Py_hash_t
    r   l            l        l    r   r   r   )Zuint64Zint64Zuint32Zint32r   r   r   	pysiphash   s   
r   c                 C   s&   t jjdv }d}|r| S t|| S )z8Skip decorator for tests that depend on SipHash24 or FNV>   	siphash24fnvzRequires SipHash24 or FNV)sys	hash_info	algorithmunittestskip)testokmsgr   r   r   skip_unless_internalhash+   s   r   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )HashEqualityTestCasec                 G   s@   t tt|}|dd  D ]}||d kr| d|f  qd S )N   r   zhashed values differ: %r)listmaphashZfail)selfZobjlistZhashedhr   r   r   	same_hash4   s   zHashEqualityTestCase.same_hashc                 C   s>   |  dddd |  ddd |  ddd	 |  d
dd d S )Nr    g      ?y      ?        r           y                g      y              g       y               )r&   r$   r   r   r   test_numeric_literals<   s   z*HashEqualityTestCase.test_numeric_literalsc              	   C   s   |  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            r&   intfloatcomplexr*   r   r   r   test_coerced_integersB   s   z*HashEqualityTestCase.test_coerced_integersc                 C   s.   |  tdtd |  tdtdd d S )Ng쏈b=~g      ?r'   r-   r*   r   r   r   test_coerced_floatsM   s   z(HashEqualityTestCase.test_coerced_floatsc                 C   s`   dd }t dD ]%}t dD ]}||d|  }t||d|  }| t|t| qqd S )Ns#   123456789abcdefghijklmnopqrstuvwxyz   r   )r
   
memoryviewassertEqualr#   )r$   br   jZalignedZ	unalignedr   r   r   test_unaligned_buffersQ   s   z+HashEqualityTestCase.test_unaligned_buffersN)__name__
__module____qualname__r&   r+   r1   r2   r8   r   r   r   r   r   2   s    r   c                   @      e Zd ZdS )DefaultHashNr9   r:   r;   r   r   r   r   r=   ]       r=   *   c                   @      e Zd Zdd ZdS )	FixedHashc                 C   s   t S N)_FIXED_HASH_VALUEr*   r   r   r   __hash__a   s   zFixedHash.__hash__Nr9   r:   r;   rE   r   r   r   r   rB   `       rB   c                   @   rA   )OnlyEqualityc                 C   s   | |u S rC   r   r$   otherr   r   r   __eq__e      zOnlyEquality.__eq__N)r9   r:   r;   rK   r   r   r   r   rH   d   rG   rH   c                   @   rA   )OnlyInequalityc                 C   s   | |uS rC   r   rI   r   r   r   __ne__i   rL   zOnlyInequality.__ne__N)r9   r:   r;   rN   r   r   r   r   rM   h   rG   rM   c                   @   r<   )InheritedHashWithEqualityNr>   r   r   r   r   rO   l   r?   rO   c                   @   r<   )InheritedHashWithInequalityNr>   r   r   r   r   rP   m   r?   rP   c                   @   s   e Zd ZdZdS )NoHashNrF   r   r   r   r   rQ   o   s    rQ   c                   @   s`   e Zd Ze e e gZe e e	 gZ
e e gZdd Zdd Zdd Zdd Zd	d
 ZdS )HashInheritanceTestCasec                 C   s$   | j D ]}| t|t| qd S rC   )default_expectedr5   r#   _default_hashr$   objr   r   r   test_default_hash   s   
z)HashInheritanceTestCase.test_default_hashc                 C   s    | j D ]
}| t|t qd S rC   )fixed_expectedr5   r#   rD   rU   r   r   r   test_fixed_hash   s   
z'HashInheritanceTestCase.test_fixed_hashc                 C   s   | j D ]	}| tt| qd S rC   )error_expectedZassertRaises	TypeErrorr#   rU   r   r   r   test_error_hash   s   
z'HashInheritanceTestCase.test_error_hashc                 C   s&   | j | j }|D ]}| |t qd S rC   )rS   rX   ZassertIsInstancer   )r$   ZobjectsrV   r   r   r   test_hashable   s   z%HashInheritanceTestCase.test_hashablec                 C   s   | j D ]}| |t qd S rC   )rZ   ZassertNotIsInstancer   rU   r   r   r   test_not_hashable   s   
z)HashInheritanceTestCase.test_not_hashableN)r9   r:   r;   objectr=   rM   rS   rB   rO   rP   rX   rQ   rH   rZ   rW   rY   r\   r]   r^   r   r   r   r   rR   r   s"    rR   c                   @   s$   e Zd ZedZdd Zdd ZdS )DefaultIterSeq
   c                 C   s
   t | jS rC   )lenseqr*   r   r   r   __len__      
zDefaultIterSeq.__len__c                 C   s
   | j | S rC   )rc   )r$   indexr   r   r   __getitem__   re   zDefaultIterSeq.__getitem__N)r9   r:   r;   r
   rc   rd   rg   r   r   r   r   r`      s    r`   c                   @   s6   e Zd Zeedee edd dgZdd ZdS )HashBuiltinsTestCasera   c                   C   s   dS )Nr   r   r   r   r   r   <lambda>   s    zHashBuiltinsTestCase.<lambda>r   c                 C   s*   t j}| jD ]}| t||| qd S rC   )r_   rE   hashes_to_checkr5   r#   )r$   rT   rV   r   r   r   test_hashes   s   
z HashBuiltinsTestCase.test_hashesN)	r9   r:   r;   	enumerater
   iterr`   rj   rk   r   r   r   r   rh      s    
rh   c                   @   s&   e Zd Zdd ZdddZdd ZdS )	HashRandomizationTestsc                 C      d| S )Nzprint(hash(eval(%a)))r   r$   repr_r   r   r   get_hash_command   rL   z'HashRandomizationTests.get_hash_commandNc                 C   s`   t j }d|d< |d urt||d< n|dd  td| |fi |}|d  }t|S )NTZ
__cleanenvZPYTHONHASHSEEDz-cr    )	osenvironcopystrpopr   rr   stripr.   )r$   rq   seedenvr   stdoutr   r   r   get_hash   s   

zHashRandomizationTests.get_hashc                 C   s0   | j | jdd}| j | jdd}| || d S )Nrandomry   )r|   rq   assertNotEqual)r$   Zrun1Zrun2r   r   r   test_randomized_hash   s   z+HashRandomizationTests.test_randomized_hashrC   )r9   r:   r;   rr   r|   r   r   r   r   r   rn      s    
rn   c                   @   s   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dZdd Zdd Zedd Z	edd Z
dS ) StringlikeHashRandomizationTestsN)\r   r   r   )iL̇l   LL//+?iTSlqU:~@[ )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   c                 C   s^   |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)r$   Zpositionr   r   platformr   r   r   get_expected_hash   s   
z2StringlikeHashRandomizationTests.get_expected_hashc                 C   s<   |  dd}| | | j| | | j| jdd| d S )Nr   r   r~   )r   r   r|   rq   r5   )r$   Zknown_hash_of_objr   r   r   test_null_hash   s   z/StringlikeHashRandomizationTests.test_null_hashc                 C   s(   |  dd}| | j| jdd| d S )Nr    r   r@   r~   )r   r5   r|   rq   r$   r%   r   r   r   rY     s   z0StringlikeHashRandomizationTests.test_fixed_hashc                 C   s6   | j d u rd S | dd}| | j| j dd| d S )Nr      r@   r~   )	repr_longr   r5   r|   r   r   r   r   test_long_fixed_hash  s   
z5StringlikeHashRandomizationTests.test_long_fixed_hash)r9   r:   r;   rq   r   r   r   r   r   rY   r   r   r   r   r   r      s2    	'

r   c                   @   s<   e Zd ZedZedZedZedd Zedd Z	dS )	StrHashRandomizationTestsabcZabcdefghijku
   äú∑ℇc                 C      |  tdd d S )N r   r5   r#   r*   r   r   r   test_empty_string     z+StrHashRandomizationTests.test_empty_stringc                 C   sL   |  dd}| | j| jdd| |  dd}| | j| jdd| d S )Nr      r   r~      r@   )r   r5   r|   	repr_ucs2r   r   r   r   test_ucs2_string   s   z*StrHashRandomizationTests.test_ucs2_stringN)
r9   r:   r;   reprrq   r   r   r   r   r   r   r   r   r   r     s    
r   c                   @   s(   e Zd ZedZedZedd ZdS )BytesHashRandomizationTestss   abcs   abcdefghijkc                 C   r   N    r   r   r*   r   r   r   r   ,  r   z-BytesHashRandomizationTests.test_empty_stringN)r9   r:   r;   r   rq   r   r   r   r   r   r   r   r   '  s
    r   c                   @   s    e Zd ZdZdZedd ZdS ) MemoryviewHashRandomizationTestszmemoryview(b'abc')zmemoryview(b'abcdefghijk')c                 C   s   |  ttdd d S r   )r5   r#   r4   r*   r   r   r   r   5  s   z2MemoryviewHashRandomizationTests.test_empty_stringN)r9   r:   r;   rq   r   r   r   r   r   r   r   r   0  s
    r   c                   @   rA   )DatetimeTestsc                 C   ro   )Nz import datetime; print(hash(%s))r   rp   r   r   r   rr   :  rL   zDatetimeTests.get_hash_commandN)r9   r:   r;   rr   r   r   r   r   r   9  rG   r   c                   @   s   e Zd ZeedddZdS )DatetimeDateTestsi*  ra      N)r9   r:   r;   r   datetimedaterq   r   r   r   r   r   =  s    r   c                
   @   s&   e Zd ZeedddddddZdS )	DatetimeDatetimeTestsr    r   r   r      r      N)r9   r:   r;   r   r   rq   r   r   r   r   r   @  s    r   c                   @   s   e Zd ZeedZdS )DatetimeTimeTestsr   N)r9   r:   r;   r   r   timerq   r   r   r   r   r   C  s    r   c                   @   rA   )HashDistributionTestCasec              	   C   s   d}t dt|D ]S}|d | }| j|d= t }t }t dD ]}t|t| }||d@  ||d@  q"| t|d| | t|d| W d    n1 sWw   Y  q	d S )	NZabcdefghabcdefgr    )prefix      r      r3   )r
   rb   ZsubTestsetr#   chraddZassertGreater)r$   baser   r   Zs15Zs255cr%   r   r   r   test_hash_distributionI  s   z/HashDistributionTestCase.test_hash_distributionN)r9   r:   r;   r   r   r   r   r   r   G  s    r   __main__)r   ))r   rs   r   r   Ztest.support.script_helperr   collections.abcr   maxsizer   r   r   r   ZTestCaser   r_   rE   rT   r=   rD   rB   rH   rM   rO   rP   rQ   rR   r`   rh   rn   r   r   r   r   r   r   r   r   r   r9   mainr   r   r   r   <module>   sT   


*%Q		