a
    ze-                     @   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 )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   $/usr/lib/python3.9/test/test_hash.pylcg   s    r   c                 C   s^   d|   krdk sn J | dkr,| d }n| }| | d? A d@ }|dkrR|d }n|}||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>   fnv	siphash24z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 ]J}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                   @   s   e Zd ZdS )DefaultHashNr9   r:   r;   r   r   r   r   r<   ]       r<   *   c                   @   s   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;   rC   r   r   r   r   r@   `   s   r@   c                   @   s   e Zd Zdd ZdS )OnlyEqualityc                 C   s   | |u S rA   r   r$   otherr   r   r   __eq__e   s    zOnlyEquality.__eq__N)r9   r:   r;   rH   r   r   r   r   rE   d   s   rE   c                   @   s   e Zd Zdd ZdS )OnlyInequalityc                 C   s   | |uS rA   r   rF   r   r   r   __ne__i   s    zOnlyInequality.__ne__N)r9   r:   r;   rJ   r   r   r   r   rI   h   s   rI   c                   @   s   e Zd ZdS )InheritedHashWithEqualityNr=   r   r   r   r   rK   l   r>   rK   c                   @   s   e Zd ZdS )InheritedHashWithInequalityNr=   r   r   r   r   rL   m   r>   rL   c                   @   s   e Zd ZdZdS )NoHashNrD   r   r   r   r   rM   o   s   rM   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 rA   )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 rA   )fixed_expectedr5   r#   rB   rQ   r   r   r   test_fixed_hash   s    
z'HashInheritanceTestCase.test_fixed_hashc                 C   s   | j D ]}| tt| qd S rA   )error_expectedZassertRaises	TypeErrorr#   rQ   r   r   r   test_error_hash   s    
z'HashInheritanceTestCase.test_error_hashc                 C   s&   | j | j }|D ]}| |t qd S rA   )rO   rT   ZassertIsInstancer   )r$   ZobjectsrR   r   r   r   test_hashable   s
    z%HashInheritanceTestCase.test_hashablec                 C   s   | j D ]}| |t qd S rA   )rV   ZassertNotIsInstancer   rQ   r   r   r   test_not_hashable   s    
z)HashInheritanceTestCase.test_not_hashableN)r9   r:   r;   objectr<   rI   rO   r@   rK   rL   rT   rM   rE   rV   rS   rU   rX   rY   rZ   r   r   r   r   rN   r   s    rN   c                   @   s$   e Zd ZedZdd Zdd ZdS )DefaultIterSeq
   c                 C   s
   t | jS rA   )lenseqr*   r   r   r   __len__   s    zDefaultIterSeq.__len__c                 C   s
   | j | S rA   )r_   )r$   indexr   r   r   __getitem__   s    zDefaultIterSeq.__getitem__N)r9   r:   r;   r
   r_   r`   rb   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 )HashBuiltinsTestCaser]   c                   C   s   dS )Nr   r   r   r   r   r   <lambda>   r>   zHashBuiltinsTestCase.<lambda>r   c                 C   s*   t j}| jD ]}| t||| qd S rA   )r[   rC   hashes_to_checkr5   r#   )r$   rP   rR   r   r   r   test_hashes   s    
z HashBuiltinsTestCase.test_hashesN)	r9   r:   r;   	enumerater
   iterr\   re   rf   r   r   r   r   rc      s
   
rc   c                   @   s&   e Zd Zdd ZdddZdd ZdS )	HashRandomizationTestsc                 C   s   d| S )Nzprint(hash(eval(%a)))r   r$   repr_r   r   r   get_hash_command   s    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   rl   stripr.   )r$   rk   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rs   )rv   rk   assertNotEqual)r$   Zrun1Zrun2r   r   r   test_randomized_hash   s    z+HashRandomizationTests.test_randomized_hash)N)r9   r:   r;   rl   rv   rz   r   r   r   r   ri      s   
ri   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r2tr,dnd}nt jdks@J trHd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   rx   )r   ry   rv   rk   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?   rx   )r   r5   rv   rk   r$   r%   r   r   r   rU     s    z0StringlikeHashRandomizationTests.test_fixed_hashc                 C   s6   | j d u rd S | dd}| | j| j dd| d S )Nr      r?   rx   )	repr_longr   r5   rv   r   r   r   r   test_long_fixed_hash  s    
z5StringlikeHashRandomizationTests.test_long_fixed_hash)r9   r:   r;   rk   r   r   r   r   r   rU   r   r   r   r   r   r{      s0   	'

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   s   |  tdd d S )N r   r5   r#   r*   r   r   r   test_empty_string  s    z+StrHashRandomizationTests.test_empty_stringc                 C   sL   |  dd}| | j| jdd| |  dd}| | j| jdd| d S )Nr      r   rx      r?   )r   r5   rv   	repr_ucs2r   r   r   r   test_ucs2_string   s    z*StrHashRandomizationTests.test_ucs2_stringN)
r9   r:   r;   reprrk   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   s   |  tdd d S Nr>   r   r   r*   r   r   r   r   ,  s    z-BytesHashRandomizationTests.test_empty_stringN)r9   r:   r;   r   rk   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;   rk   r   r   r   r   r   r   r   r   0  s   r   c                   @   s   e Zd Zdd ZdS )DatetimeTestsc                 C   s   d| S )Nz import datetime; print(hash(%s))r   rj   r   r   r   rl   :  s    zDatetimeTests.get_hash_commandN)r9   r:   r;   rl   r   r   r   r   r   9  s   r   c                   @   s   e Zd ZeedddZdS )DatetimeDateTestsi*  r]      N)r9   r:   r;   r   datetimedaterk   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   rk   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   timerk   r   r   r   r   r   C  s   r   c                   @   s   e Zd Zdd ZdS )HashDistributionTestCasec              	   C   s   d}t dt|D ]}|d | }| j|dz t }t }t dD ]0}t|t| }||d@  ||d@  qD| t|d| | t|d| W d    q1 s0    Y  qd S )	NZabcdefghabcdefgr    )prefix      r      r3   )r
   r^   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   rm   r   r   Ztest.support.script_helperr   collections.abcr   maxsizer   r   r   r   ZTestCaser   r[   rC   rP   r<   rB   r@   rE   rI   rK   rL   rM   rN   r\   rc   ri   r{   r   r   r   r   r   r   r   r   r9   mainr   r   r   r   <module>   sP   


*%Q		
