B
    u9a8                 @   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x*ede	 D ]Zeed  ed> Zq|W [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.7/test_long.py
<listcomp>   s    r   c             C   s   g | ]
}| qS r   r   )r	   r
   r   r   r   r      s    c             C   s   t jjd }t jj| }d|> }ddddddddg}| dkr@dS | dk rTt|   S |  | }|dk rr| | > n| |? t| d|>  @ B }|||d@  7 }|||k |krtdt	t
||S )	z9
    Correctly-rounded integer-to-float conversion.

    r   r   r   g           z%integer too large to convert to float)sys
float_infomant_digmax_expint_to_float
bit_lengthboolOverflowError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   max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dWd2d3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(dHdI Z)dJdK Z*dLdM Z+dNdO Z,dPdQ Z-dRdS Z.dTdU Z/dVS )XLongTestc             C   s   |  |d |t }|t d }d}d}tt td  dB }x||k r|d? d }t||| }| d|  koztkn   || }||> }|d@ r|d|> d B }tt td  }qBW | ||  ko|kn   t dk r| }|S )Nr   r   r   g      ?)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}x$t | D ]}|t> tdtB }qW t dk r<| }|S )Nr   g      ?)ranger.   r0   ZrandintMASK)r4   r5   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 Q R X 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$   r2   )
r3   r
   r<   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  x>|D ]6}| |}x&|D ]}| |p\d}| || qLW q8W | 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)listr8   	MAXDIGITSKARATSUBA_CUTOFFappendr7   r@   )r3   digitslenxr
   lenyr<   r   r   r   test_division   s4    


zLongTest.test_divisionc       	      C   s   t tddt tttd  }|td td g dd |D }x|D ]}d|> d }xp|D ]h}||k rnq`| j||dF d|> d }|| }d|| > d|>  d|>  d }| || W d Q R X q`W qJW d S )Nr      
   d   c             S   s   g | ]}|t  qS r   )r.   )r	   digitr   r   r   r      s    z+LongTest.test_karatsuba.<locals>.<listcomp>)abitsbbits)rC   r8   rE   extendr>   r=   )	r3   rG   r6   rO   r%   rP   r&   r
   r<   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 Q R X xtdt D ]}d| }| j|||dn |||> |? | ||| ||?  ||| ||>  ||| @ ||? |>  ||| @ ||d  @  W d Q R X qW d S )N)r
   r   r   r   r   )r
   r   p2)r=   r>   r8   r.   )r3   r
   r?   r   rS   r   r   r   check_bitop_identities_1   s2    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 Q R X d S )N)r
   r<   )r=   r>   )r3   r
   r<   r?   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 Q R X d S )N)r
   r<   z)r=   r>   )r3   r
   r<   rV   r?   r   r   r   check_bitop_identities_3  s    z!LongTest.check_bitop_identities_3c          
   C   s   xt D ]}| | qW tdtd }x`|D ]X}| |}| | x>|D ]6}| |}| || | ||| || d  qJW q,W d S )Nr   r   )specialrT   r8   rD   r7   rU   rW   )r3   r
   rG   rH   rI   r<   r   r   r   test_bitop_identities  s    





zLongTest.test_bitop_identitiesc             C   s   g }d}|dk rd|  }}x$|r@t ||\}}|t| qW |  |pRdg}dd | ddddd|  dd	d
 |D  S )Nr   r   -Z0bZ0o 0x)r      rL      c             s   s   | ]}d | V  qdS )Z0123456789abcdefNr   )r	   r:   r   r   r   	<genexpr>1  s    z'LongTest.slow_format.<locals>.<genexpr>)r$   rF   r/   reversejoin)r3   r
   baserG   signr*   r   r   r   slow_format%  s    
zLongTest.slow_formatc          
   C   s   xdt fdtfdtfdtfdtffD ]n\}}||}| j||jd | ||}| || W d Q R X | j|d | t	|d| W d Q R X q$W d S )Nr   r]   rL   r^   )r
   mapper)gotr   )
binoctstrreprhexr>   __name__rd   r=   r/   )r3   r
   rb   re   rf   expectedr   r   r   check_format_13  s    ,zLongTest.check_format_1c             C   sZ   xt D ]}| | qW x<tdD ]0}x*tdtd D ]}| |}| | q6W q"W d S )NrL   r   )rX   rn   r8   rD   r7   )r3   r
   r:   rH   r   r   r   test_format<  s    

zLongTest.test_formatc       
      C   s4  dddd fg}x||D ]t\}}xjdD ]b}x\dD ]T}|| | }|}|dkrX|t k	rX| }y| t|| W q. t k
r   Y q.X q.W q$W qW | 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}x|D ]}	| t td-|	 qW | t td. d S )/N)Z100000000000000000000l      Fx:^V Ze10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000rL   rM   )r[   +rZ   )r[    	z  		  rZ   Z123LZ123lZ0Lz-37LZ0x32Lr^   Z1L      +   Z000r   Z0o123S   Z0x123i#  Z0b100r   z	 0O123   z 0X123  z 0B100 0z+0z-0Z00Z08z-012395isil        i   l    l    l            l         l        r   Z42u   こんにちは)
ValueErrorr=   r/   assertRaises)
r3   ZLLsvrc   prefixssZvvZinvalid_basesrb   r   r   r   	test_longD  sP    


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   )r3   r   r   r   __long__  s    z3LongTest.test_conversion.<locals>.JustLong.__long__N)rl   
__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 )Nr   r   )r3   r   r   r   r     s    z4LongTest.test_conversion.<locals>.LongTrunc.__long__c             S   s   dS )Ni  r   )r3   r   r   r   	__trunc__  s    z5LongTest.test_conversion.<locals>.LongTrunc.__trunc__N)rl   r   r   r   r   r   r   r   r   	LongTrunc  s   r   i  )ry   	TypeErrorr/   r=   )r3   r   r   r   r   r   test_conversion}  s    zLongTest.test_conversionc             C   sl   yt |}W n tk
r$   d}Y nX yt|}W n tk
rJ   d}Y nX d|||}| ||| d S )NoverflowzAError in conversion of integer {} to float.  Got {}, expected {}.)r   r   r   formatr=   )r3   r   actualrm   msgr   r   r   check_float_conversion  s    


zLongTest.check_float_conversionc       
      C   s  ddddddddd	d
ddg}x0|D ](}|  t|| |  t| |  q"W xNdD ]F\}}x<tdD ]0}|  ttd| d|  d| d|   qfW qTW xNdD ]F\}}x<tdD ]0}|  ttd| d|  d| d|   qW qW t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||  xntdD ]b}d| d d }d| d }|  tt|| d| d }d| d }|  tt|| qW |d ||d |d ||d |d ||d d| d d| || g}|| x@tddD ]2}x*tddD ]}|	d|d  |  qW qW x$|D ]}	| 
|	 | 
|	  qW d S )Nr   r   r   l    l    l    l          l         l   l   l          l         ))r   r   )r   r   )rB   r   )r   r   )rK   r   )   r   )r   r]   r   ))r   r   )r   r   )r   r   )rB   r   )r   r   )rK   r   )r   r]   )r   r]   )r]   r]   )	   r]   )rL   r]   )      )r   r   )   r   )rA   r^   )r   r^   rM   l         r]   i   5   )r=   r   r8   r/   DBL_MAXDBL_MAX_EXPry   r   rQ   rF   r   )
r3   Zexact_valuesr
   r<   pZint_dbl_maxZ	top_powerZhalfwayZtest_valuesvaluer   r   r   test_float_conversion  sh    
44
"

zLongTest.test_float_conversionc             C   sz   x dD ]}|  tt|| qW d}dd> }| }|||td}xdD ]}| tt|| qHW | t|t|d d S )N)g       g      g        g      ?g       @AX  123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345r   i0u  )hugemhugeshuger   )$zfloat(huge)z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))r=   r   r/   r   ry   r   evalZassertNotEqual)r3   r
   r   r   r   	namespacetestr   r   r   test_float_overflow  s    

zLongTest.test_float_overflowc             C   s   t t j}xZttddddg D ]@}d| }t |}| || || }t |}| || q$W x8dd>  ddfD ]$}| tt j| | tt j| qzW d S )NrL   rM   i  i'  r   r   r   )	r   log10erC   r8   ZassertAlmostEquallogry   rx   )r3   ZLOG10Er)   r   r   rm   r   Zbadr   r   r   	test_logs  s    

zLongTest.test_logsc       
         s  | j }G  fddd ddddddd	g}xJd
D ]B}||d |d ||d |d t|d t|t|d g q0W |dddtjttjg td	}|ddddd> |d ||d g |dd |D  x|D ]} |}x|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 Q R X qW qW d 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| _nt |trtt|\}}d}d}x8|rtt||}t|}||> |B }||8 }||8 }q>W |dkr||> }d}n|}d| > }|dk r| }|| _|| _nt	d| d S )Nr      r   zcan't deal with %r)

isinstancer/   r   r(   r   r   Zfrexpr   r   r   )	r3   r   fr   ZCHUNKtoprN   r   r(   r   r   r   __init__  s0    


z2LongTest.test_mixed_compares.<locals>.Rat.__init__c                s<   t | s |}| j|j | j|j  }}||k||k  S )N)r   r   r(   )r3   otherr
   r<   )Ratr   r   _cmp__F  s    
z0LongTest.test_mixed_compares.<locals>.Rat._cmp__c             S   s   |  |dkS )Nr   )r   )r3   r   r   r   r   __eq__K  s    z0LongTest.test_mixed_compares.<locals>.Rat.__eq__c             S   s   |  |dkS )Nr   )r   )r3   r   r   r   r   __ge__M  s    z0LongTest.test_mixed_compares.<locals>.Rat.__ge__c             S   s   |  |dkS )Nr   )r   )r3   r   r   r   r   __gt__O  s    z0LongTest.test_mixed_compares.<locals>.Rat.__gt__c             S   s   |  |dkS )Nr   )r   )r3   r   r   r   r   __le__Q  s    z0LongTest.test_mixed_compares.<locals>.Rat.__le__c             S   s   |  |dk S )Nr   )r   )r3   r   r   r   r   __lt__S  s    z0LongTest.test_mixed_compares.<locals>.Rat.__lt__N)
rl   r   r   r   r   r   r   r   r   r   r   )r   r   r   r     s   (r   r   gMbP?gGz?g      ?g      ?g@xDgZbti)g      Bg      Cg      @Cg333333?r   r   i N  c             S   s   g | ]
}| qS r   r   )r	   r
   r   r   r   r   a  s    z0LongTest.test_mixed_compares.<locals>.<listcomp>)r
   r<   Rcmp)r=   rQ   r/   r   maxsizer   r>   )
r3   r?   Zcasestr
   ZRxr<   ZRyr   Zxycmpr   )r   r   test_mixed_compares  s0    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 xdRdS ttdTtdUd D dVdS ttdWtdXd D  D ]j}|dYkr| ttdZ| | ttd| | ttd| | ttd[d\ | | ttd[d\  | qW x:d]D ]2}x*d^D ]"}|  t||tt|| q`W qVW d S )_Ni[r(   Z	123456789,z123,456,789_Z123_456_789r   rZ   1r   z-1z-3z  1z -1z+3z +1z 3rq   z 1rB   r
   3Xi  Z4d2i.z-4d2Z8xz     4d2z    -4d2ber^   ZBEz-bez-BEi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,bi90  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   )chr)r	   r
   r   r   r   r     s    z+LongTest.test__format__.<locals>.<listcomp>r%   rV   c             S   s   g | ]}t |qS r   )r   )r	   r
   r   r   r   r     s    AZzbcdoxXeEfFgGn%r   r   rM   zeEfFgG%)r   r   r   rM   iiIi.i)	r=   r   r/   ry   rx   ZassertRaisesRegexr8   ordr   )r3   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)ry   r   r/   r   rx   )r3   r   r   r   test_nan_inf  s    zLongTest.test_nan_infc          	   C   s   |  t dd }W d Q R X | dd | dd | dd | dd | dd | dd | dd | dd d S )Nr   r   rB   r   ir   )ry   r   r=   )r3   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}xdD ]}| tt|| q6W x*dD ]"}t||}|  |dd|  qVW xdD ]}| tt|| qW d S )Nr   i@  g      ?g      g        i  g     Ԅ@g     Ԅg      ?i@B )r   r   )zfloat(huge)zfloat(mhuge)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)r=   ry   r   r   r   )r3   r   r   r   r   Z	underflowr+   Zzeror   r   r   test_true_division  s2    




zLongTest.test_true_divisionc          	   C   s   |  t dd }W d Q R X | 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   rB   r   r   )ry   r   r=   )r3   r   r   r   r   test_floordiv  s    zLongTest.test_floordivTc          
   C   s   |r"t t|t|dt k r"dS ytt||}W n. tk
rL   d}Y n tk
rb   d}Y nX yt|| }W n. tk
r   d}Y n tk
r   d}Y nX | ||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#   rj   r,   r   r   r=   r   )r3   r%   r&   Z
skip_smallrm   rf   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}x||D ]t}xnt|d |d D ]X}|  ddt|d  ddt| d   |  ddt|d  ddt| d   qW qW xpddddddd
 ddddddd  gD ]F}x>tddD ]0}|  |t | | |  |t | |  qXW qHW xBtdD ]6}|  dt d d dd  d|  dt d  qW |  dd |  d d! xBtd"D ]6}|  d|d  d|  |  d| d|d   qW xfddd#dd$d%dd&ddd
 ddddddd  gD ]4}x,tddD ]}|  dt | | | qrW qbW x$td'd(D ]}|  |dd)  qW xd*dd
 dd" gD ]r}xjtd"D ]^}td|}t|d| d }	|  ||	 |  | |	 |  ||	  |  | |	  qW qW x~td+D ]r}
td"}tdd"}td| }tdd| }|  || |  ||  |  | | |  | |  qTW d S ),N{   r   i8rB   r   ige~ r   i90  iNF rM   í l       90r   Q   r   i0& iC r      r   r   ii)   2   irL         i
  l   E,J_   l     Jb   i  r   r]   r^       i   i4  l    d(	 i'  )	r   r   r#   r"   r8   r!   r    r0   	randrange)r3   basesrb   r)   mr   r:   Mr%   r&   r   Za_bitsZb_bitsr
   r<   r   r   r   $test_correctly_rounded_true_division8  sf    
*2""$
z-LongTest.test_correctly_rounded_true_divisionc          	   C   s   |  t dd>  W d Q R X |  t ddd>  >  W d Q R X |  t dd?  W d Q R X |  t ddd>  ?  W d Q R X d S )Nr   r   r   i  )ry   rx   )r3   r   r   r   test_negative_shift_count  s    z"LongTest.test_negative_shift_countc          	   C   sr   |  dd |  dd | t dd>  W d Q R X |  ddd> > d | t ddd>  >  W d Q R X d S )Nr   r   r   i  )r=   ry   rx   )r3   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   )r=   r   r   )r3   r   r   r   test_huge_lshift_of_zero  s    z!LongTest.test_huge_lshift_of_zeroi  g?F)ZmemuseZdry_runc             C   s$   |  dtjd > dd> tj>  d S )Nr   i  )r=   r   r   )r3   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   i  r   ir   )r=   )r3   r   r   r   test_huge_rshift  s    zLongTest.test_huge_rshifti  g?c             C   sJ   dd> d t j> }| |t jd ? dd> d  | |t jd ? d d S )Nr   i  r   i  rK   i  r   )r   r   r=   )r3   r   r   r   r   r   test_huge_rshift_of_huge  s    z!LongTest.test_huge_rshift_of_hugec             C   s   xt ddD ]}| ||d  | ||d  | ||d  | ||d  | ||d@  | ||dB  | ||dA  | ||   | ||d  | |tt| | ||d> d? t| qW d}| || d | d| d d S )Nr   i  r   r   r   r   l            )r8   assertIsr/   ri   )r3   r:   r   r   r   test_small_ints  s    zLongTest.test_small_intsc             C   s  d}xt ddD ]}| }| |tt|d |dkrn| d|d  t|  kodd| k n   n| |d |dkr| |dt	t
t|t
d |   qW | d d | d d | d d | d d | d	 d xd
D ]}d| }| |d  | | d|  | | | |d  | |  |d  | |d  |d  | | d  |d  q
W d S )Ng|=ii  z-0br   r   r   r   r   )r   rB   r   r^   r      r   !   ?   @      )r8   r   r=   lenrg   lstripr2   r   r   Zfloorr   )r3   Ztinyr
   kr:   r%   r   r   r   test_bit_length  s.    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}x\t dddD ]L}xF| D ]:\}}t|| d}|| }| || | t|t qJW q<W | 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 xNt ddD ]@}td| d5 d}d| d6 }| || | t|t qW xXt d7D ]L}xDt dD ]8}	td8d9}
t|
|}| ||
 | t|t qW qW x4d:d;d<d=d>d dd fD ]}| td?|d? qlW xBt dD ]6}	td8d9}
t|
}| ||
 | t|t qW d@}x|D ]}| 	t
tdA| qW d S )BNr   rL   r   )r   r   r   rB   r   rK   r   r   r]   r   rL   r   r   r   rA   r   r^   r         ii  r   ijr   i8ikiiiir   1   r   3   rM         r   r      i,  iԡ r   i i i l   ! l   ! l   ~! l    ! r   l   ! r   l   `! il    ! il    '! il    z+ il    v|o il    ,Gx iiiiF i rK   ii'  il        l    l            r   i{ )Zbriang       @y                rB   )r8   itemsroundr=   r   typer/   r0   r   ry   r   )r3   Z	test_dictoffsetr   r{   rf   rm   expectr   r:   r
   Zhuge_nZbad_exponentsr   r   r   r   
test_round  sx    

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                sr   xl|   D ]`\}}y  |jt|||d| W q
 tk
rh } ztd||||W d d }~X Y q
X q
W d S )N)signedz7failed to convert {0} with byteorder={1} and signed={2})r   r=   to_bytesr   	ExceptionAssertionErrorr   )tests	byteorderr   r   rm   err)r3   r   r   check>  s    
z%LongTest.test_to_bytes.<locals>.check                s      s    s   s    s    s    s   s    s    s     s     )r   r   r   iii      ii       i  i i  i  i  bigT)r   s    s   s    s    s    s     s     littles    s   s     )
r   r   r  r   r	  r
  i  i   i  i   s     r
  r   r   r   r       rK   s       s        s   )F)ry   r   r   r=   )r3   r   tests1tests2tests3tests4r   )r3   r   test_to_bytes=  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dddg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                sn   xh|   D ]\\}}y tj|||d| W q
 tk
rd } ztd||||W d d }~X Y q
X q
W d S )N)r   z9failed to convert {0} with byteorder={1!r} and signed={2})r   r=   r/   
from_bytesr   r   r   )r   r   r   r   rm   r   )r3   r   r   r     s    
z'LongTest.test_from_bytes.<locals>.checkr   r   r   iiir  r  ii r	  r
  i  i i  i  i  )r  r  s     r  s    r  s   r  r  s   r  s    s   s    s    s    s   s    s    s     s     r  T)r   )r  r  s     r  s    r  s   r  r  s   r  s    s   s    s    s    s   s    s    s     s     r  r   i   i   )r  r  r  r  r  r  s    s   s    s   s     )r  r  r  r  r  r  s    s   s    s   s     c               @   s   e Zd ZdS )z'LongTest.test_from_bytes.<locals>.myintN)rl   r   r   r   r   r   r   myint   s   r  r  r  )r	  r   r   s     Bzbig zlittle r[    c               @   s   e Zd Zdd ZdS )z(LongTest.test_from_bytes.<locals>.myint2c             S   s   t | |d S )Nr   )r/   __new__)clsr   r   r   r   r  &  s    z0LongTest.test_from_bytes.<locals>.myint2.__new__N)rl   r   r   r  r   r   r   r   myint2%  s   r  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)r3   r   r   r   r   r   .  s    z1LongTest.test_from_bytes.<locals>.myint3.__init__N)rl   r   r   r   r   r   r   r   myint3-  s   r  r  Znoner  )F)r/   r   r   r  r=   	bytearrayarray
memoryviewry   rx   r   getattr)
r3   r   r  r  r  r  r  r  r:   r  r   )r3   r   test_from_bytes  s    
zLongTest.test_from_bytesc                sJ   G dd dt   fddtdD }xtt |D ]}| |d q2W d 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 )Nr  )r/   r  r  )r  r   r3   r   r   r   r  ;  s    zDLongTest.test_access_to_nonexistent_digit_0.<locals>.Integer.__new__N)r   )rl   r   r   r  r   r   r   r   Integer:  s   r"  c                s   g | ]} d qS )r   r   )r	   r:   )r"  r   r   r   @  s    z?LongTest.test_access_to_nonexistent_digit_0.<locals>.<listcomp>i  r   )r/   r8   mapr=   )r3   Zintegersr   r   )r"  r   "test_access_to_nonexistent_digit_06  s    z+LongTest.test_access_to_nonexistent_digit_0c             C   sH   xBdD ]:}x4dD ],}|  t||> t |  t||? t qW qW d S )N)TF)r   r   )r=   r   r/   )r3   r   r   r   r   r   test_shift_boolD  s    

zLongTest.test_shift_boolN)T)0rl   r   r   r7   r;   r@   rJ   rR   rT   rU   rW   rY   rd   rn   ro   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  r!  r$  r%  r   r   r   r   r-   s   sT   '		9F\a"
\
	  "Jc r-   __main__)#Zunittestr   r   r   r0   r   r  int_infobits_per_digitr.   ZBASEr9   rE   rD   rX   rS   r8   r:   rF   r   r!   r   r   r   min_expr"   r   r#   r    r   r,   ZTestCaser-   rl   mainr   r   r   r   <module>   sH    .         b
