a
    ze                     @   s(  d dl Z d dlmZ d dlZd dlZd dlZd dlZejjZ	de	 Z
e
d ZdZdZd dde
e
d? ddgZd	Zede	 D ]Zeed  ed> Zqz[ed
d eD dd eD  7 ZejjZejjZejjZejjZde dee d   Zdd Zdd ZG dd de jZ e!dkr$e "  dS )    N)support      F      l   UU*UU* l   *UU*UU
    c                 C   s   g | ]
}| qS  r   .0xr   r   $/usr/lib/python3.9/test/test_long.py
<listcomp>       r   c                 C   s   g | ]
}| qS r   r   r	   r   r   r   r      r   c                 C   s   t jjd }t jj| }d|> }g d}| dkr4dS | dk rHt|   S |  | }|dk rf| | > n| |? t| d|>  @ B }|||d@  7 }|||k |krtd|d	 dkr|d	 dt jj ksJ |d|  t jjksJ t	
t||S )
z9
    Correctly-rounded integer-to-float conversion.

    r   r   )r   r   r   r   r   r   r           r      z%integer too large to convert to floatr   )sys
float_infomant_digmax_expint_to_float
bit_lengthboolOverflowErrormaxmathldexpfloat)nZ	PRECISIONZ	SHIFT_MAXZQ_MAXZROUND_HALF_TO_EVEN_CORRECTIONshiftqr   r   r   r   '   s     ,$r   c                 C   s  | |A dk }t | t | } }|s*td| t| kr>td|  |  }|dkrf| d| | ks|dk r| d|   |kr|d7 }t|tt }| t| d> |t|d>  } }t| |\}}d| |ksd| |kr|d dkr|d7 }t	
||}|r| S |S )z-Correctly-rounded true division for integers.r   zdivision by zeroz)int/int too large to represent as a floatr   r   )absZeroDivisionErrorDBL_MIN_OVERFLOWr   r   r   DBL_MIN_EXPDBL_MANT_DIGdivmodr   r   )abnegativedexpr!   rresultr   r   r   truedivU   s     2 $r/   c                   @   s  e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zejdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd[d2d3Zejd4d5 Zd6d7 Zd8d9 Z ej!d:d; Z"ej!ej#e$j%d< d=d>d?d@dA Z&dBdC Z'ej!ej#e$j%dD dEd>d?dFdG Z(ej!dHdI Z)dJdK Z*dLdM Z+dNdO Z,dPdQ Z-dRdS Z.dTdU Z/dVdW Z0dXdY Z1dZS )\LongTestc                 C   s   |  |d |t }|t d }d}d}tt td  dB }||k r|d? d }t||| }| d|  koxtkn   || }||> }|d@ r|d|> d B }tt td  }q@| ||  ko|kn   t dk r| }|S )Nr   r   r         ?)ZassertGreaterSHIFTintrandommin
assertTrue)selfndigitsZnbits_hiZnbits_loanswerZnbitsr-   bitsr   r   r   getran{   s&    zLongTest.getranc                 C   s<   d}t | D ]}|t> tdtB }qt dk r8| }|S )Nr   r1   )ranger2   r4   randintMASK)r8   r9   ir   r   r   getran2   s    zLongTest.getran2c           
      C   s   | j }| j||d t||\}}|| ||  }}|| ||  }}	|||	d |||d |||d |||| | d |dkr| d|  ko|k n  d n | ||  k odkn  d W d    n1 s0    Y  d S )Nr   yzmultiplication does not commutez(divmod returns different quotient than /z#divmod returns different mod than %zx != q*y + r after divmodr   zbad mod from divmod)assertEqualsubTestr'   r6   )
r7   r   rB   eqr!   r-   Zq2Zr2ZpabZpbar   r   r   check_division   s    "zLongTest.check_divisionc                 C   s   t tdtd t tttd  }|td  |D ]2}| |}|D ]}| |pXd}| || qHq6| dd | dd | dd	 | d
d | dd | dd | dd | dd | dd | dd | dd | dd d S )Nr         l   !Us/w3al   ZW3al   +Q@{dB]OlNl   OOlNl   teo%gqCgx<l   &ghrsGl   Q5K4+o-bkl   C4+o-bkl   .#wflD&I-Xl   ZnSu9bl   cv<Il   rdFBu'pl   PhbIi|$l   1m{Wqi8l   s~5^Fiy+l   'H
<{Cl   `<{Cl   ED_5(Nl   oybal   =2zz6 l   9tm)listr<   	MAXDIGITSKARATSUBA_CUTOFFappendr;   rF   )r7   digitslenxr   lenyrB   r   r   r   test_division   sB    
zLongTest.test_divisionc           	   
   C   s   t tddt tttd  }|td td g dd |D }|D ]}d|> d }|D ]|}||k rjq\| j||dP d|> d }|| }d|| > d|>  d|>  d }| || W d    q\1 s0    Y  q\qHd S )Nr      
   d   c                 S   s   g | ]}|t  qS r   )r2   )r
   digitr   r   r   r      r   z+LongTest.test_karatsuba.<locals>.<listcomp>)abitsbbits)rI   r<   rK   extendrD   rC   )	r7   rM   r:   rU   r(   rV   r)   r   rB   r   r   r   test_karatsuba   s*    
zLongTest.test_karatsubac              	   C   s  | j }| j|d ||d@ d ||dB | ||dA | ||d@ | ||dB d ||dA |  |||   |||@ | |||B | |||A d ||| @ d ||| B d ||| A d || d|   || |d   W d    n1 s0    Y  tdt D ]}d| }| j|||dx |||> |? | ||| ||?  ||| ||>  ||| @ ||? |>  ||| @ ||d  @  W d    n1 s0    Y  q"d S )N)r   r   r   r   r   )r   r   p2)rC   rD   r<   r2   )r7   r   rE   r   rY   r   r   r   check_bitop_identities_1   s2    2z!LongTest.check_bitop_identities_1c                 C   s  | j }| j||d |||@ ||@  |||B ||B  |||A ||A  |||A |A | |||@ | | B   |||B | | @   |||A ||B ||@  @  |||A || @ | |@ B  |||A ||B | | B @  W d    n1 s0    Y  d S )NrA   rC   rD   )r7   r   rB   rE   r   r   r   check_bitop_identities_2  s    z!LongTest.check_bitop_identities_2c                 C   s   | j }| j|||d |||@ |@ |||@ @  |||B |B |||B B  |||A |A |||A A  ||||B @ ||@ ||@ B  ||||@ B ||B ||B @  W d    n1 s0    Y  d S )N)r   rB   zr[   )r7   r   rB   r]   rE   r   r   r   check_bitop_identities_3  s    z!LongTest.check_bitop_identities_3c              
   C   s   t D ]}| | qtdtd }|D ]T}| |}| | |D ]6}| |}| || | ||| || d  qBq&d S )Nr   r   )specialrZ   r<   rJ   r;   r\   r^   )r7   r   rM   rN   rO   rB   r   r   r   test_bitop_identities  s    


zLongTest.test_bitop_identitiesc                 C   s   g }d}|dk rd|  }}|r>t ||\}}|t| q|  |pNdg}dd | ddddd|  dd	d
 |D  S )Nr   r   -Z0bZ0o 0x)r      rR      c                 s   s   | ]}d | V  qdS )Z0123456789abcdefNr   r
   r?   r   r   r   	<genexpr>1  r   z'LongTest.slow_format.<locals>.<genexpr>)r'   rL   r3   reversejoin)r7   r   baserM   signr-   r   r   r   slow_format%  s    

zLongTest.slow_formatc              	   C   s   dt fdtfdtfdtfdtffD ]\}}||}| j||jd( | ||}| || W d    n1 sp0    Y  | j|d" | t	|d| W d    q"1 s0    Y  q"d S )Nr   rd   rR   re   )r   mapper)gotr   )
binoctstrreprhexrD   __name__rl   rC   r3   )r7   r   rj   rm   rn   expectedr   r   r   check_format_13  s    **zLongTest.check_format_1c                 C   sN   t D ]}| | qtdD ],}tdtd D ]}| |}| | q.qd S )NrR   r   )r_   rv   r<   rJ   r;   )r7   r   r?   rN   r   r   r   test_format<  s    
zLongTest.test_formatc           
      C   s"  dddd fg}|D ]j\}}dD ]\}dD ]R}|| | }|}|dkrR|t urR| }z| t|| W q( t yx   Y q(0 q(q q| t td | t td	 | t td
 | t td | t tdd | t tdd | tddd | tddd | tddd | tddd | tddd | tddd | tddd | tddd | tddd | tddd | tddd | td dd | t td!d | t td"d d#d$d%d&d'd(d)d*d+d,d d,d  g}|D ]}	| t td-|	 q| t td. d S )/N)Z100000000000000000000l      Fx:^V Ze10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000rR   rS   )rb   +ra   )rb    	z  		  ra   Z123LZ123lZ0Lz-37LZ0x32Lre   Z1L      +   Z000r   Z0o123S   Z0x123i#  Z0b100r   z	 0O123   z 0X123  z 0B100 0z+0z-0Z00Z08z-012395is        i   l                    l         l        r   Z42u   こんにちは)
ValueErrorrC   r3   assertRaises)
r7   ZLLsvrk   prefixssZvvZinvalid_basesrj   r   r   r   	test_longD  sT    
zLongTest.test_longc                 C   sB   G dd d}|  tt|  G dd d}| t| d d S )Nc                   @   s   e Zd Zdd ZdS )z*LongTest.test_conversion.<locals>.JustLongc                 S   s   dS N*   r   r7   r   r   r   __long__  s    z3LongTest.test_conversion.<locals>.JustLong.__long__N)rt   
__module____qualname__r   r   r   r   r   JustLong  s   r   c                   @   s   e Zd Zdd Zdd ZdS )z+LongTest.test_conversion.<locals>.LongTruncc                 S   s   dS r   r   r   r   r   r   r     s    z4LongTest.test_conversion.<locals>.LongTrunc.__long__c                 S   s   dS )N  r   r   r   r   r   	__trunc__  s    z5LongTest.test_conversion.<locals>.LongTrunc.__trunc__N)rt   r   r   r   r   r   r   r   r   	LongTrunc  s   r   r   )r   	TypeErrorr3   rC   )r7   r   r   r   r   r   test_conversion}  s    zLongTest.test_conversionc                 C   sh   zt |}W n ty"   d}Y n0 zt|}W n tyF   d}Y n0 d|||}| ||| d S )NoverflowzAError in conversion of integer {} to float.  Got {}, expected {}.)r   r   r   formatrC   )r7   r   actualru   msgr   r   r   check_float_conversion  s    

zLongTest.check_float_conversionc           
      C   s  g d}|D ](}|  t|| |  t| |  qdD ]B\}}tdD ]0}|  ttd| d|  d| d|   qJq:dD ]B\}}tdD ]0}|  ttd| d|  d| d|   qqtt}dt }|| d }|  t|t |  t|d t |  t|d t | tt| |  td| t  | tt|  | tt|d  | tt| | tt|d  | ttd| d  | ttd|  | tt||  td	D ]b}d| d
 d }d| d }|  tt|| d| d
 }d| d }|  tt|| q|d ||d |d ||d |d ||d d| d d| || g}|| tddD ].}tddD ]}|	d|d  |  qq~|D ]}	| 
|	 | 
|	  qd S )N)r   r   r   l    l    l                       l   l             l         )r   r   )r   r   rH   r   r   r   rQ   r   )   r   r   rd   r   r   r   ))r   r   r   )r   r   r   r   r   )r   rd   r   )rd   rd   )	   rd   )rR   rd   )      )r   r   )   r   )rG   re   )r   re   r   r   rS   l         r   rd      5   )rC   r   r<   r3   DBL_MAXDBL_MAX_EXPr   r   rW   rL   r   )
r7   Zexact_valuesr   rB   pZint_dbl_maxZ	top_powerZhalfwayZtest_valuesvaluer   r   r   test_float_conversion  sX    
00

zLongTest.test_float_conversionc                 C   sr   dD ]}|  tt|| qd}dd> }| }|||td}dD ]}| tt|| qB| t|t|d d S )N)g             r         ?       @AX  123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345r   i0u  )hugemhugeshuger   )$float(huge)float(mhuge)zcomplex(huge)zcomplex(mhuge)zcomplex(huge, 1)zcomplex(mhuge, 1)zcomplex(1, huge)zcomplex(1, mhuge)z	1. + hugez	huge + 1.z
1. + mhugez
mhuge + 1.z	1. - hugez	huge - 1.z
1. - mhugez
mhuge - 1.z	1. * hugez	huge * 1.z
1. * mhugez
mhuge * 1.z
1. // hugez
huge // 1.z1. // mhugezmhuge // 1.z	1. / hugez	huge / 1.z
1. / mhugez
mhuge / 1.z
1. ** hugez
huge ** 1.z1. ** mhugezmhuge ** 1.zmath.sin(huge)zmath.sin(mhuge)zmath.sqrt(huge)zmath.sqrt(mhuge)z(float(shuge) should not equal int(shuge))rC   r   r3   r   r   r   evalZassertNotEqual)r7   r   r   r   r   	namespacetestr   r   r   test_float_overflow  s    zLongTest.test_float_overflowc                 C   s   t t j}ttdg d D ]@}d| }t |}| || || }t |}| || q dd>  ddfD ]$}| tt j| | tt j| qrd S )NrR   )rS     '  r   r   r   r   )	r   log10erI   r<   ZassertAlmostEquallogr   r   )r7   ZLOG10Er,   r   r   ru   r   Zbadr   r   r   	test_logs  s    

zLongTest.test_logsc           
         s  | j }G  fddd g d}dD ]B}||d |d ||d |d t|d t|t|d g q$|ddd	tjttjg td
}|ddd	dd> |d ||d g |dd |D  |D ]} |}|D ]} |}||k||k  }| j|||d ||k||k  }	|||	 |||k|dk |||k|dk |||k |dk  |||k|dk |||k|dk |||k|dk W d    q1 s0    Y  qqd S )Nc                       sH   e Zd Zdd Z fddZdd Zdd Zd	d
 Zdd Zdd Z	dS )z)LongTest.test_mixed_compares.<locals>.Ratc           	      S   s,  t |tr|| _d| _nt |trtt|\}}|dksZd|  krTdk sZn J d}d}|rt||}t|}||? dksJ ||> |B }||8 }d|  krdk sn J ||8 }qb|dkr||> }d}n|}d| > }|dk r| }|| _|| _t|t| |ks(J nt	d| d S )Nr   r   r1   r      r   zcan't deal with %r)

isinstancer3   r   r+   r   r   frexpr"   r   r   )	r7   r   fr   ZCHUNKtoprT   r   r+   r   r   r   __init__  s6    

"

z2LongTest.test_mixed_compares.<locals>.Rat.__init__c                    s<   t | s |}| j|j | j|j  }}||k||k  S )N)r   r   r+   )r7   otherr   rB   Ratr   r   _cmp__F  s    
z0LongTest.test_mixed_compares.<locals>.Rat._cmp__c                 S   s   |  |dkS Nr   r   r7   r   r   r   r   __eq__K  s    z0LongTest.test_mixed_compares.<locals>.Rat.__eq__c                 S   s   |  |dkS r   r   r   r   r   r   __ge__M  s    z0LongTest.test_mixed_compares.<locals>.Rat.__ge__c                 S   s   |  |dkS r   r   r   r   r   r   __gt__O  s    z0LongTest.test_mixed_compares.<locals>.Rat.__gt__c                 S   s   |  |dkS r   r   r   r   r   r   __le__Q  s    z0LongTest.test_mixed_compares.<locals>.Rat.__le__c                 S   s   |  |dk S r   r   r   r   r   r   __lt__S  s    z0LongTest.test_mixed_compares.<locals>.Rat.__lt__N)
rt   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s   (r   )r   gMbP?gGz?r   g      ?g@xDZbti)g      Bg      Cg      @Cr   g333333?r   r   r   r   i N  c                 S   s   g | ]
}| qS r   r   r	   r   r   r   r   a  r   z0LongTest.test_mixed_compares.<locals>.<listcomp>)r   rB   Rcmp)rC   rW   r3   r   maxsizer   rD   )
r7   rE   Zcasestr   ZRxrB   ZRyr   Zxycmpr   r   r   test_mixed_compares  s2    9$
zLongTest.test_mixed_comparesc                 C   s  |  tddd |  tddd |  tddd |  tddd |  tdd	d
 |  tdd	d |  tddd |  tddd |  tddd |  tddd |  tddd |  tddd |  tddd |  tddd |  tddd |  tddd |  tddd |  tddd |  tddd |  tddd |  tddd |  tddd |  td dd |  td dd |  ttd!d"dd! |  ttd!d"dd# |  ttd!d" dd$ |  ttd!d" dd% | ttd&d' |  td&d(d) |  td&d*d+ |  tdd,d |  td d,d |  tdd,d- |  tdd,d. |  tdd/d- |  tdd/d. |  tdd0d1 |  tdd0d. |  tdd2d3 |  tdd2d. | ttd&d4 |  td&d5d6 |  tdd7d8 |  td d7d9 |  tdd7d: |  tdd7d; |  tdd<d: |  tdd<d; |  tdd=d> |  tdd=d; |  tdd?d@ |  tdd?d; | ttd&dA |  tdBdCdD | ttddE | ttddF | ttddG | ttddH | tdItddJ | tdItddK | tdItddL | tdItddM | tdNtddO | tdPtddQ dRdS ttdTtdUd D dVdS ttdWtdXd D  D ]j}|dYvr| ttdZ| | ttd| | ttd| | ttd[d\ | | ttd[d\  | qd]D ].}d^D ]"}|  t||tt|| qXqPd S )_Ni[r+   Z	123456789,z123,456,789_Z123_456_789r   ra   1r   z-1z-3z  1z -1z+3z +1z 3ry   z 1rH   r   3Xi  Z4d2i.z-4d2Z8xz     4d2z    -4d2bere   ZBEz-bez-BEIz,xZ_xZ	4996_02d2Z_XZ	4996_02D2oZ2322z-2322z-oz oz 2322z+oz+2322z,oZ_oZ111_4540_1322r)   Z11z-11Z10011010010z-10011010010z-bz bz 10011010010z+bz+10011010010z,b90  Z_bZ11_0000_0011_1001z1.3Z_cz,cz+czCannot specify bothz_,z,_z_,dz,_dzCannot specify ',' with 's'z,szCannot specify '_' with 's'Z_sc                 S   s   g | ]}t |qS r   chrr	   r   r   r   r     r   z+LongTest.test__format__.<locals>.<listcomp>r(   r]   c                 S   s   g | ]}t |qS r   r   r	   r   r   r   r     r   AZzbcdoxXeEfFgGn%r   r   rS   zeEfFgG%)r   r   r   rS   r   i.i)	rC   r   r3   r   r   ZassertRaisesRegexr<   ordr   )r7   format_specr   r   r   r   test__format__q  s    
zLongTest.test__format__c                 C   s:   |  tttd |  tttd |  tttd d S )Ninfz-infnan)r   r   r3   r   r   r   r   r   r   test_nan_inf  s    zLongTest.test_nan_infc                 C   s   |  t dd }W d    n1 s(0    Y  | dd | dd | dd | dd | dd | dd | dd | dd d S )Nr   r   rH   r   r   r   r#   rC   r7   r   r   r   r   test_mod_division  s    &zLongTest.test_mod_divisionc                 C   s  dd> }| }|  || d |  || d |  || d |  || d |  d| d |  d| d |  d| d |  d| d |  d| |d?  | d |  d| |d?  | d |  d| |d?  | d |  d| |d?  | d |  ||d>  d	 |  d
| | d
 ||d}dD ]}| tt|| q4dD ]"}t||}|  |dd|  qPdD ]}| tt|| qxd S )Nr   i@  r   r   r   i  g     Ԅ@g     Ԅr1   i@B )r   r   )r   r   zhuge / 1zhuge / 2z	huge / -1z	huge / -2zmhuge / 100zmhuge / 200)z1 / hugez2 / hugez	-1 / hugez	-2 / hugez100 / mhugez200 / mhugezexpected underflow to 0 from %r)zhuge / 0z	mhuge / 0)rC   r   r   r   r#   )r7   r   r   r   r   Z	underflowr.   Zzeror   r   r   test_true_division  s4    

zLongTest.test_true_divisionc                 C   s   |  t dd }W d    n1 s(0    Y  | dd | dd | dd | dd | dd | dd | dd | dd | dd | dd | dd | dd d S )Nr   r   r   rH   r   r   r   r   r   r   r   test_floordiv  s    &zLongTest.test_floordivTc              
   C   s   |r"t t|t|dt k r"dS ztt||}W n* tyJ   d}Y n ty^   d}Y n0 zt|| }W n* ty   d}Y n ty   d}Y n0 | ||d|||| dS )zVerify that the result of a/b is correctly rounded, by
        comparing it with a pure Python implementation of correctly
        rounded division.  b should be nonzero.r   Nr   Zzerodivisionz7Incorrectly rounded division {}/{}: expected {}, got {})	r   r"   r&   rr   r/   r   r#   rC   r   )r7   r(   r)   Z
skip_smallru   rn   r   r   r   check_truediv  s"    	

zLongTest.check_truedivc                 C   s  |  dd |  dd |  dd |  dd |  dd |  ddt  d |  dd	dtt    |  ddd
  d |  dddd   dttttt f}|D ]p}t|d |d D ]X}|  ddt|d  ddt| d   |  ddt|d  ddt| d   qqddddddd
 ddddddd  fD ]B}tddD ]0}|  |t | | |  |t | |  qLq>tdD ]6}|  dt d d dd  d|  dt d  q|  dd |  d d! td"D ]6}|  d|d  d|  |  d| d|d   qddd#dd$d%dd&ddd
 ddddddd  fD ]0}tddD ]}|  dt | | | qVqHtd'd(D ]}|  |dd)  qd*dd
 dd" fD ]n}td"D ]^}td|}t|d| d }	|  ||	 |  | |	 |  ||	  |  | |	  qqtd+D ]r}
td"}tdd"}td| }tdd| }|  || |  ||  |  | | |  | |  q&d S ),N{   r   i8rH   r   ige~ r   r   iNF rS   í l       90r   Q   r   i0& iC r      r   r   ii)   2   rR         i
  l   E,J_   l     Jb   r   r   rd   re       i   i4  l    d(	 r   )	r   r   r&   r%   r<   r   r$   r4   	randrange)r7   basesrj   r,   mr   r?   Mr(   r)   r   Za_bitsZb_bitsr   rB   r   r   r   $test_correctly_rounded_true_division8  sn    *."
 
z-LongTest.test_correctly_rounded_true_divisionc                 C   s   |  t dd>  W d    n1 s(0    Y  |  t ddd>  >  W d    n1 s`0    Y  |  t dd?  W d    n1 s0    Y  |  t ddd>  ?  W d    n1 s0    Y  d S )Nr   r   r   r   )r   r   r   r   r   r   test_negative_shift_count  s    &,&z"LongTest.test_negative_shift_countc                 C   s   |  dd |  dd | t dd>  W d    n1 s@0    Y  |  ddd> > d | t ddd>  >  W d    n1 s0    Y  d S )Nr   r   r   r   )rC   r   r   r   r   r   r   test_lshift_of_zero  s    &zLongTest.test_lshift_of_zeroc                 C   s,   |  dtj> d |  dtjd > d d S )Nr   r   rC   r   r   r   r   r   r   test_huge_lshift_of_zero  s    z!LongTest.test_huge_lshift_of_zeror   g?F)Zmemusedry_runc                 C   s$   |  dtjd > dd> tj>  d S )Nr   r   r	  )r7   sizer   r   r   test_huge_lshift  s    zLongTest.test_huge_lshiftc                 C   s,   |  ddd> ? d |  ddd> ? d d S )Nr   r   r   r   ir   )rC   r   r   r   r   test_huge_rshift  s    zLongTest.test_huge_rshift  g?c                 C   sJ   dd> d t j> }| |t jd ? dd> d  | |t jd ? d d S )Nr   r  r   i  rQ   r   r   )r   r   rC   )r7   r  r   r   r   r   test_huge_rshift_of_huge  s    z!LongTest.test_huge_rshift_of_hugec                 C   s>   dd }| d }|d }|  || d |  || d d S )Nr   rS   r   )assertIs)r7   r(   r)   cr   r   r   #test_small_ints_in_huge_calculation  s
    
z,LongTest.test_small_ints_in_huge_calculationc                 C   s   t ddD ]}| ||d  | ||d  | ||d  | ||d  | ||d@  | ||dB  | ||dA  | ||   | ||d  | |tt| | ||d> d? t| q
d}| || d | d| d d S )Nr   i  r   r   r   r   l            )r<   r  r3   rq   )r7   r?   r   r   r   test_small_ints  s    zLongTest.test_small_intsc                 C   s  d}t ddD ]}| }| |tt|d |dkrl| d|d  t|  kobd| k n   n| |d |dkr| |dt	t
t|t
d |   q| d d | d d | d d | d d | d	 d d
D ]}d| }| |d  | | d|  | | | |d  | |  |d  | |d  |d  | | d  |d  qd S )Ng|=ii  z-0br   r   r   r   r   )r   rH   r   re   r      r   !   ?   @      )r<   r   rC   lenro   lstripr6   r"   r   floorr   )r7   Ztinyr   kr?   r(   r   r   r   test_bit_length  s0    0
zLongTest.test_bit_lengthc                 C   s  ddddddddddddddddddddd}t dddD ]H}| D ]:\}}t|| d}|| }| || | t|t qFq:| tdd	d
 | tdd	d | tdd	d | tdd	d | tdd	d | tdd	d | tdd	d | tdd	d | tdd	d | tdd	d | tdd	d | tdd	d | tdd	d | tdd	d | tdd	d | tddd | tddd | td dd! | td d	d" | td dd# | td d$d% | td d&d' | td d(d) | td d*d+ | td d,d- | td d.d/ | td d0d1 | td d2d | td d3d | td d4d t ddD ]@}td| d5 d}d| d6 }| || | t|t qt d7D ]H}t dD ]8}	td8d9}
t|
|}| ||
 | t|t q qd:d;d<d=d>d dd fD ]}| td?|d? qVt dD ]6}	td8d9}
t|
}| ||
 | t|t qxd@}|D ]}| 	t
tdA| qd S )BNr   rR   r  )r   r   r   rH   r   rQ   r   r   rd   r   rR   r   r   r   rG   r   re   r         ii  r   ijr   i8ikr   iiir   1   r   3   rS         r   r      i,  iԡ r   i i i l   ! l   ! l   ~! l    ! r   l   ! r   l   `! il    ! r   l    '! il    z+ il    v|o r   l    ,Gx iiiiF i rQ   ir   r   r   r   r   r   i{ )Zbrianr   y                rH   )r<   itemsroundrC   r  typer3   r4   r  r   r   )r7   Z	test_dictoffsetr  r   rn   ru   expectr   r?   r   Zhuge_nZbad_exponentsr   r   r   r   
test_round  sz    

zLongTest.test_roundc                    s  d0 fdd	}dddddd	d
ddddddddddd}||ddd ddddddd
dddddd	ddddd}||d dd ddd
ddddd!d"d#d$
}||ddd ddd
dddd	dd"d%d$
}||d dd  j td&jd'ddd  j td&jd'ddd  j td&jd'd dd  j td&jd'd dd  j td(jd)ddd  j td(jd)d dd  d*d*dd+  d'd,dd-  d*d,dd.  d(jd,dddd/   td'jd*d d S )1NFc                    sp   |   D ]b\}}z  |jt|||d| W q tyh } z td||||W Y d }~qd }~0 0 qd S )Nsignedz7failed to convert {0} with byteorder={1} and signed={2})r&  rC   to_bytesr  	ExceptionAssertionErrorr   tests	byteorderr-  r   ru   errr   r   r   checkF  s    z%LongTest.test_to_bytes.<locals>.check                                            s                  )r   r   r   r                         bigTr,                               little            )
r   r   rH  r   rL  rM  rN     rP          rM  r   r   r   r   r   rQ   s       s        s   )F)r   r   r.  rC   )r7   r5  tests1tests2tests3tests4r   r   r   test_to_bytesE  s    zLongTest.test_to_bytesc           
         s  d3 fdd	}dddddddddd	d
ddddddddddd}||ddd dddddddddd	d
ddddddddddd}||ddd dddd
dddddddd}||ddd dddd
dddddddd}||ddd G d d! d!t } t|d"d|  |d#dd  t|jd"ddd|  |jd#dddd  t|d"d|  |d#dd  t|jd"ddd|  |jd#dddd  t jg d$dddd  t jd$dddd  t jtd%dddd  t jtd%dddd  t jtd&d%dddd  t jtd%dddd  t	t jdgd  t	t jdgd'  t	t jdgd(  t
t jd)d  t
t jd*d  t
t jdd  t
t jddd  t
|jd)d  t
|jd*d  t
|jdd  t
t jddd G d+d, d,t }|d#d} t||  |d- G d.d/ d/t }	|	d#d} t||	  |d  t|d0d1d2 d S )4NFc                    sl   |   D ]^\}}z tj|||d| W q tyd } z td||||W Y d }~qd }~0 0 qd S )Nr,  z9failed to convert {0} with byteorder={1!r} and signed={2})r&  rC   r3   
from_bytesr/  r0  r   r1  r   r   r   r5    s    z'LongTest.test_from_bytes.<locals>.checkr   r   r   rF  r   rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  )r   r6       r7  rV  r8  r]  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  r\  rC  rD  rE  rS  Tr,  )r   r6  rh  r7  rV  r8  r]  r9  r:  rB  r<  rT  rU  r@  r?  rV  r;  rW  rX  rY  rZ  r[  r   r_  r`  )r   r6  r7  r<  r:  r8  rA  rB  r\  r]  r^  )r   r6  r7  r<  r:  r8  rV  r;  rW  r]  ra  c                   @   s   e Zd ZdS )z'LongTest.test_from_bytes.<locals>.myintNrt   r   r   r   r   r   r   myint  s   rj  r6  r7  )rL  r   r   rD  Bzbig zlittle rb    c                   @   s   e Zd Zdd ZdS )z(LongTest.test_from_bytes.<locals>.myint2c                 S   s   t | |d S )Nr   )r3   __new__)clsr   r   r   r   rm  .  s    z0LongTest.test_from_bytes.<locals>.myint2.__new__Nrt   r   r   rm  r   r   r   r   myint2-  s   rp  r   c                   @   s   e Zd Zdd ZdS )z(LongTest.test_from_bytes.<locals>.myint3c                 S   s
   d| _ d S )Nbar)foo)r7   r   r   r   r   r   6  s    z1LongTest.test_from_bytes.<locals>.myint3.__init__N)rt   r   r   r   r   r   r   r   myint35  s   rs  rr  Znonerq  )F)r3   r  r(  rg  rC   	bytearrayarray
memoryviewr   r   r   getattr)
r7   r5  rb  rc  rd  re  rj  rp  r?   rs  r   r   r   test_from_bytes  s   



zLongTest.test_from_bytesc                    sF   G dd dt   fddtdD }tt |D ]}| |d q0d S )Nc                   @   s   e Zd ZdddZdS )z<LongTest.test_access_to_nonexistent_digit_0.<locals>.Integerr   c                 S   s   t | |}d|_|S )Nrr  )r3   rm  rr  )rn  r   r7   r   r   r   rm  C  s    zDLongTest.test_access_to_nonexistent_digit_0.<locals>.Integer.__new__N)r   ro  r   r   r   r   IntegerB  s   ry  c                    s   g | ]} d qS )r   r   rf   ry  r   r   r   H  r   z?LongTest.test_access_to_nonexistent_digit_0.<locals>.<listcomp>r   r   )r3   r<   maprC   )r7   Zintegersr   r   rz  r   "test_access_to_nonexistent_digit_0>  s    z+LongTest.test_access_to_nonexistent_digit_0c                 C   s@   dD ]6}dD ],}|  t||> t |  t||? t qqd S )N)TF)r   r   )rC   r(  r3   )r7   r   r    r   r   r   test_shift_boolL  s    zLongTest.test_shift_boolc              	   C   s   G dd dt }ddddtjd dd|d	g}|D ]H}| \}}| ||ft |df | t|t  | t|t  q2d S )
Nc                   @   s   e Zd ZdS )z-LongTest.test_as_integer_ratio.<locals>.myintNri  r   r   r   r   rj  T  s   rj  rR   r   r   r   TFr   )r3   r   r   as_integer_ratiorC   r(  )r7   rj  r2  r   	numeratordenominatorr   r   r   test_as_integer_ratioS  s    zLongTest.test_as_integer_ratioN)T)2rt   r   r   r;   r@   rF   rP   rX   rZ   r\   r^   r`   rl   rv   rw   r   r   r   r   Zrequires_IEEE_754r   r   r   r   r   r   r   r   r   r   r  r  r  Zcpython_onlyr
  Z
bigmemtestr   r   r  r  r  r  r  r  r+  rf  rx  r|  r}  r  r   r   r   r   r0   s   sd   '		9
E\a"

[
	

"Jc r0   __main__)#Zunittestr   r   r   r4   r   ru  int_infobits_per_digitr2   ZBASEr>   rK   rJ   r_   rY   r<   r?   rL   r   r   r   r   r   min_expr%   r   r&   r$   r   r/   ZTestCaser0   rt   mainr   r   r   r   <module>   sH   
 .         t
