a
    zeDE                 "   @   s4  d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlmZmZmZmZmZmZmZmZmZmZmZ ddlZddlZddlZejdkred eddgdZeddgd	ZddlZed
d
gdZeej d< ed
d
gdZ!eej d< eeee!iZ"eej d< eer6e#e$ j%& ndee#e$ j%& iZ'eer~ej(ej)ej*ej+ej,ej-ej.ej/ej0g	ndeej(ej)ej*ej+ej,ej-ej.ej/ej0g	iZ1dd Z2ej3Z3ej4Z4ej5Z5ej6Z6ej7Z7ej8Z8ej9Z9ej:Z:e3e4e5e6e7e8e9e:gZ;eere$  ndee$  iZ<dd Z=dZ>e?dkr@ej@d ZAneBZAejCDeApVejEZFeFejG e> ejG ZHejCIeH aJdZKeLedrdndZMeNeMdZOePeMdZQG dd dejRZSG dd deSZTG dd deSZUG dd dejRZVG dd deVZWG d d! d!eVZXG d"d# d#ejRZYG d$d% d%eYZZG d&d' d'eYZ[G d(d) d)ejRZ\G d*d+ d+e\Z]G d,d- d-e\Z^G d.d/ d/ejRZ_G d0d1 d1e_Z`G d2d3 d3e_Zad4d5 Zbd6d7 ZcG d8d9 d9ejRZdG d:d; d;edZeG d<d= d=edZfG d>d? d?ejRZgG d@dA dAegZhG dBdC dCegZiG dDdE dEejRZjG dFdG dGejZkG dHdI dIejZlG dJdK dKejRZmG dLdM dMemZnG dNdO dOemZoG dPdQ dQejRZpG dRdS dSepZqG dTdU dUepZrG dVdW dWejRZsG dXdY dYesZtG dZd[ d[esZuG d\d] d]ejRZvG d^d_ d_evZwG d`da daevZxG dbdc dcejRZyG ddde deeyZzG dfdg dgeyZ{G dhdi diejRZ|G djdk dke|Z}G dldm dme|Z~eQG dndo doejRZG dpdq dqejRZG drds dseZG dtdu dueZG dvdw dwejRZG dxdy dyejRZG dzd{ d{ejRZG d|d} d}ejRZeeNed~G dd dejRZeWeXeZe[e]e^e`eaeeefeheiekeleneoeqereteuewexeze{e}e~eeeeeeeTeUg"Zeseddd Znede ede dddZe?dkr0ddlZedZejddddd ejddddd e \ZZejr
eddd n&er$eddeejd neddd dS )ag  
These are the test cases for the Decimal module.

There are two groups of tests, Arithmetic and Behaviour. The former test
the Decimal arithmetic using the tests provided by Mike Cowlishaw. The latter
test the pythonic behaviour according to PEP 327.

Cowlishaw's tests can be downloaded from:

   http://speleotrove.com/decimal/dectest.zip

This test module can be called from command line with one parameter (Arithmetic
or Behaviour) to test each part, or without parameter to test both parts. If
you're working through IDLE, you can import this test module and call test_main()
with the corresponding argument.
    N)run_unittestrun_doctestis_resource_enabledrequires_IEEE_754requires_docstringsimport_fresh_module
TestFailedrun_with_localecpython_onlydarwin_malloc_err_warningcheck_sanitizerdarwinZtest_decimaldecimalZ_decimal)Zfresh)Zblocked	fractionsc                    s,   t || | t fdd D  d S )Nc                 3   s(   | ] }|v r | n |  V  qd S N .0sdexpectedr   '/usr/lib/python3.9/test/test_decimal.py	<genexpr>Q       z!assert_signals.<locals>.<genexpr>)getattr
assertTrueall)clscontextattrr   r   r   r   assert_signalsO   s    
r!   c                 C   s2   | sd S | j dttt|  dd}| | d S )N	   r   )precroundingtraps)ContextROUND_HALF_EVENdictfromkeysSignals
setcontext)mZDefaultTestContextr   r   r   inith   s
    r-   Zdecimaltestdata__main__F
DecClampedTz.test requires build with -DEXTRA_FUNCTIONALITYztest requires regular buildc                   @   sp   e Zd 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S )IBMTestCasesz?Class which tests the Decimal class against the IBM test cases.c              &   C   sx  | j  | _| j  | _dg| _tg d| _| j tkr| jd | jd | jd | jd | jd | jd | jd	 | jd
 | j	| j
| j| j| j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/d0d1%| _ttttttttd2| _| j j| j j| j j| j j| j j| j j| j j| j j| j j| j j| j j| j j d3| _!d4| _"d S )5N#)Zscbx164Zscbx165Zexpx901Zexpx902Zexpx903Zexpx905Zlnx901Zlnx902Zlnx903Zlnx905Zlogx901Zlogx902Zlogx903Zlogx905Zpowx1183Zpowx1184Zpowx4001Zpowx4002Zpowx4003Zpowx4005Zpowx4008Zpowx4010Zpowx4012Zpowx4014Zpwsx803Zpwsx805Zpowx4302Zpowx4303Zpowx4342Zpowx4343Zpwmx325Zpwmx326)Z	precisionr$   ZmaxexponentZminexponentclamplogical_and_applynumber_classcompare_signalcompare_totalcompare_total_magcopy_decimalcopy_abscopy_negate	copy_sign
divide_intlogical_invertis_canonical	is_finiteis_infiniteis_nan	is_normalis_qnan	is_signedis_snanis_subnormalis_zeromax_magmin_mag
next_minus	next_plusnext_toward
logical_or	normalizeremainder_nearsame_quantumsqrtto_eng_stringto_integral_valueto_integral_exactto_sci_stringlogical_xor)%andZapplyclassZ
comparesigZcomparetotalZcomparetotmagcopyZcopyabsZ
copynegatecopysignZ	divideintinvertZiscanonicalisfiniteZ
isinfiniteisnanZisnormalZisqnanZissignedZissnanZissubnormalZiszeroZmaxmagZminmagZ	nextminusZnextplusZ
nexttowardorreduceZremaindernearZsamequantumZ
squarerootZtoengZ
tointegralZtointegralxZtoscixor)ZceilingZdownfloorZ	half_downZ	half_evenZhalf_upZupZ05up)ZclampedZconversion_syntaxZdivision_by_zeroZdivision_impossibleZdivision_undefinedZinexactZinvalid_contextZinvalid_operationZoverflowZroundedZ	subnormalZ	underflow)r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rQ   )#r   r&   r   readcontextignore_listsetskipped_test_idsCaddchange_precisionchange_rounding_methodchange_max_exponentchange_min_exponentchange_clamp
ChangeDictNameAdapterROUND_CEILING
ROUND_DOWNROUND_FLOORROUND_HALF_DOWNr'   ROUND_HALF_UPROUND_UP
ROUND_05UPRoundingDictClampedInvalidOperationDivisionByZeroInexactOverflowRounded	Subnormal	Underflow
ErrorNamesLogicalFunctionsselfr   r   r   setUp   s    $
'
zIBMTestCases.setUpc                 C   sX   | j tkrF| j jdkrF| jd | jd | jd | j|S | j ||S dS )a2  Work around the limitations of the 32-bit _decimal version. The
           guaranteed maximum values for prec, Emax etc. are 425000000,
           but higher values usually work, except for rare corner cases.
           In particular, all of the IBM tests pass with maximum values
           of 1070000000.@Ti?i9N)	r   rg   MAX_EMAXrc   _unsafe_setprec_unsafe_setemax_unsafe_setemincreate_decimalDecimal)r   vr   r   r   r   read_unlimited  s    zIBMTestCases.read_unlimitedc                 C   s   t r
tjt|}|D ]j}|dddd}z| |}W q | jjy } z&| d|j	j
 d |  W Y d }~qd }~0 0 qW d    n1 s0    Y  d S )Nz
 
zException "z" raised on line )skip_expectedunittestZSkipTestopenreplace	eval_liner   DecimalExceptionfail	__class____name__)r   fileflinet	exceptionr   r   r   	eval_file#  s    
zIBMTestCases.eval_filec                 C   s   | ddkrX|d d dkrX|dsX|dd d |dd dd   }n|dd  }| jD ]}| |dkrp d S qp|sd S d|v r| |S | |S d S )	Nz -> r      --z  --->   :)find
startswithsplitstriprd   eval_directiveeval_equation)r   r   ignorer   r   r   r   2  s    (


zIBMTestCases.eval_linec                 C   sj   dd | dD \}}|dkr,| j| }n zt|}W n tyJ   Y n0 | j|dd }|| d S )Nc                 s   s   | ]}|   V  qd S r   )r   lowerr   xr   r   r   r   E  r   z.IBMTestCases.eval_directive.<locals>.<genexpr>r   r$   c                  W   s   d S r   r   )argsr   r   r   <lambda>N  r   z-IBMTestCases.eval_directive.<locals>.<lambda>)r   rw   int
ValueErrorrn   get)r   r   functvaluer   r   r   r   D  s    zIBMTestCases.eval_directivec                    s  t st dk rd S  j  zt|d}|d   }|d }trTtd|dd |d  }|dd  }|d   }|d }|dd  }W n  t	t
tfy    jjY n0 d	d
 }	| jv rd S  j||}
|
dkrd S t j|
}g }d}d} fdd|D t j D ]}d jj|< qD ]}d jj|< q0t|D ]&\}}|dd dkrrd| }|r|d | }qLn|| }d}|	|}|
dv rZtrLD ]}d jj|< z| j| W nR |y   Y nR t j y( } z  d|||f  W Y d }~nd }~0 0  d||f  d jj|< q j|}n | j}|| qL|	|}tr|
dvrD ]}d jj|< z||  W nR |y   Y nR t j y  } z  d|||f  W Y d }~nd }~0 0  d||f  d jj|< qfddt j D }|D ]}d jj|< z||  W nV |yp   Y nV t j y } z$ dt|||f  W Y d }~nd }~0 0  d||f  q@|D ]}d jj|< qtrtd j z,t|| }|
 jv rttt |}W nT t j y^ } z d||f  W Y d }~n d }~0    td|  Y n0  ! }|j"t#d j"t#d  $||d| d |   $|d| d t|  d S )Ng?r   r   zTest  )endr   r   c                 S   s@   |  dd dd} |  dd dd} |  dd dd} | S )Nz''ZSingleQuotez""ZDoubleQuote'r   ")r   )valr   r   r   	FixQuotese  s    z-IBMTestCases.eval_equation.<locals>.FixQuotesZrescaler   c                    s   g | ]} j |  qS r   )r   r   r   r   r   r   
<listcomp>u  r   z.IBMTestCases.eval_equation.<locals>.<listcomp>r   )rV   rS   z Raised %s in %s when %s disabledzDid not raise %s in %sc                    s   g | ]}| v r|qS r   r   r   e)theirexceptionsr   r   r     r   zRaised %s in %s; expected %sr   zRaised %s in %szERROR:keyzIncorrect answer for z -- got zIncorrect flags set in )%TEST_ALLrandomr   clear_flagsr   r   DEBUGprintr   	TypeErrorAttributeError
IndexErrorr   ry   rf   ro   r   r   r*   r%   	enumeratecountEXTENDEDERRORTESTr   r   r   appendOrderedSignalstypestrr   r   evalgetexceptionssortreprassertEqual)r   r   ZSidesLidr   Zvalstempans
exceptionsr   ZfnameZvalsZconglomeratequoter   ir   r   errorr   Zordered_errorsresultZmyexceptionsr   )r   r   r   r   Q  s    



&
zIBMTestCases.eval_equationc                    s    fddt  j D S )Nc                    s   g | ]} j j| r|qS r   )r   flagsr   r   r   r   r     r   z.IBMTestCases.getexceptions.<locals>.<listcomp>)r*   r   r   r   r   r   r     s    zIBMTestCases.getexceptionsc                 C   s0   | j tkr$| j jdkr$| j| n|| j_d S Nr   )r   rg   MAX_PRECr   r   r#   )r   r#   r   r   r   ri     s    zIBMTestCases.change_precisionc                 C   s   || j _d S r   )r   r$   )r   r$   r   r   r   rj     s    z#IBMTestCases.change_rounding_methodc                 C   s0   | j tkr$| j jdkr$| j| n|| j_d S r   )r   rg   r   r   r   Eminr   expr   r   r   rl     s    z IBMTestCases.change_min_exponentc                 C   s0   | j tkr$| j jdkr$| j| n|| j_d S r   )r   rg   r   r   r   Emaxr   r   r   r   rk     s    z IBMTestCases.change_max_exponentc                 C   s   || j _d S r   )r   r2   )r   r2   r   r   r   rm     s    zIBMTestCases.change_clampN)r   
__module____qualname____doc__r   r   r   r   r   r   r   ri   rj   rl   rk   rm   r   r   r   r   r0      s     r0   c                   @   s   e Zd ZeZdS )CIBMTestCasesNr   r   r   rg   r   r   r   r   r   r     s   r   c                   @   s   e Zd ZeZdS )PyIBMTestCasesNr   r   r   Pr   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdd Zdd Zdd Zdd	 Zed
d Z	dd Z
dd Zdd Zdd Zedd Zdd Zdd Zdd ZdS )ExplicitConstructionTestz6Unit tests for Explicit Construction cases of Decimal.c                 C   s   | j j}| | |d d S )N0r   r   r   r   r   r   r   r   test_explicit_empty  s    z,ExplicitConstructionTest.test_explicit_emptyc                 C   s   | j j}| t|d  d S r   )r   r   assertRaisesr   r   r   r   r   test_explicit_from_None  s    z0ExplicitConstructionTest.test_explicit_from_Nonec                 C   s   | j j}|d}| t|d |d}| t|d |d}| t|d |d}| t|d tdd	D ]J}d
D ]@}tddD ]0}|d| |  }||}| t|t| qqzqrd S )N-   45{e	500000123-45r   r       r      r   )r   r   r   r   range)r   r   r   nsignr   r   r   r   r   test_explicit_from_int  s    z/ExplicitConstructionTest.test_explicit_from_intc                 C   s  | j j}| j j}| j j}| t|dd | t|dd | t|dd | t|dd | t|dd | t|dd	 | t|d
d | t|dd | t|dd | t|dd dD ]*}dD ] }| t||d | d qq| }d|j|< | ||d | t|ddd | ||d | ||d | ||d | ||d | ||d | ||d W d    n1 s0    Y  d S )Nr   NaNr   45.34Z45e2z4.5E+3uglyz1.3E4 
z1.3E+4z  -7.89z-7.89z  3.45679  z3.45679z	1_3.3e4_0z1.33E+41Z1_0_0_01000)r   r       u    z	9.311E+28Txyz1234r   yu   1 2 3u    1 2 r  u     z12 3z1_2_ 3)	r   r   ry   localcontextr   r   r%   r   r   )r   r   ry   r
  Zleadtrailcr   r   r   test_explicit_from_string  s8    
z2ExplicitConstructionTest.test_explicit_from_stringc                 C   sR   dd l }| jj}| j }|d}| t||d | t||d d S )Nr   9.999999)	_testcapir   r   r&   unicode_legacy_stringr   r   r   )r   r  r   r   r   r   r   r   test_from_legacy_stringsM  s    

z1ExplicitConstructionTest.test_from_legacy_stringsc                 C   s6  | j j}|d}| t|d |d}| t|d |d}| t|d |d}| t|d |d	}| t|d
 | t|d | t|d | t|d | t||dddf | t|d | t|d | t|d | t|d | t|d | t|d | t|d | t|d d S )Nr   r   r   r   r   )   r   r   r   r   r  r      r  r  r   	r  r  r  r"   r   r  r   r  r  -4.34913534E-17)r   r   FInfinity)r   r  r  r  r"   r   )   r   r   )        r   r   r   r   r   )r   r   zwrong!)r   r   r"  )r   r   1)r   r  r   )r   )r  r  r  Nr   r   )r   )r  r  r"   r   r   )r   )r  
   r  r"   r   r   )r   )r  r  r  ar   r   )r   r   r   r   r   r   r   r   r   r   r   r   test_explicit_from_tuplesW  s.    z2ExplicitConstructionTest.test_explicit_from_tuplesc                 C   s   | j j}|ddgdg}| t|d |dg ddg}| t|d |g d}| t|d |dg ddf}| t|d d S )Nr   r   r   r  r  r  r  r   r   r   r   r'  r   r   r   test_explicit_from_list  s    z0ExplicitConstructionTest.test_explicit_from_listc                 C   s\   | j j}| t|dd | t|dd | |d|d | |d|d d S )Nr   Fr   T)r   r   assertIsboolr   r   r   r   r   test_explicit_from_bool  s
    z0ExplicitConstructionTest.test_explicit_from_boolc                 C   s   | j j}|d}||}| t|d |d}||}| t|d |d}||}| t|d |d}||}| t|d d S )	Nr   r   r   r   r   r   r   r   r)  r   r   r   r   r   r   r   test_explicit_from_Decimal  s    z3ExplicitConstructionTest.test_explicit_from_Decimalc                 C   s2  | j j}|d}| t|| | t|d | |td  | |td  | |td  | t|tdt|d | t|tdt|d | t|tdt|d | t|td	t|d
 t	dD ]2}t
dt

 d d  }| |t|| qd S )N皙?90.1000000000000000055511151231257827021181583404541015625naninf-infr  r  	-Infinity-0.0-0   {Gz?       @      ?)r   r   r   r   r   r   floatrD   rA   r   r   expovariate)r   r   rr   r   r   r   r   test_explicit_from_float  s0    




z1ExplicitConstructionTest.test_explicit_from_floatc                 C   s  | j j}| j j}| j j}t| j  }d|_| }| t|d |	 }| t|d | 
t|j	d  |	d}| || | |	d|	d |d}| t|d |	d}| t|d | t|	dd	 |d
}| t|d |	d
}| t|d |d}||}| t|d |	|}| t|d d|_d|j|< dD ]0}|	|}| t|| | t|| qbd|_d|j|< | 
||j	d d|_| t|	dd | t|	dd | t|	dd | t|	dd | 
||j	d | 
t|j	d | 
t|j	dd | 
||j	d | 
||j	d d|_| 
||j	d  | 
||j	|d  d!|j|< | t|	d d	 | |j|  d!|j|< | t|	|d d	 | |j|  d S )"Nr  r     in  z457E+2Z456789z4.57E+5z3.14
r  r  r  z	-4.35E-17r   r   z5.00E+8   T)	l        l         l    i   r   l                          z0E-017z0E-17r   -Infr5  NaN123r  )r   r  r  r  Z5678z 1234Z12_34ZNaN12345F)r   r   ry   r}   rZ   
getcontextr#   r   r   r   r   r   assertIsInstancer%   r   
isinstancer   r   r   )r   r   ry   r}   ncr   Zprevdecr   r   r   r   $test_explicit_context_create_decimal  sv    









z=ExplicitConstructionTest.test_explicit_context_create_decimalc                 C   s^  | j j}| j  }|d}| t|| | t|d | |td	  | |td
  | |td
  | t|tdt|d | t|tdt|d | t|tdt|d | t|td	t|d
 d|_tdD ]6}tdt d d  }| |t|| q"d S )Nr0  z0.1000000000000000055511151231r2  r3  r4  r  r  r5  r6  r7  d   r8  r9  r:  r;  )r   r   r&   r   r   r   r   r   r<  rD   rA   r#   r   r   r=  )r   r   rK  r>  r   r   r   r   r   'test_explicit_context_create_from_float!  s0    

z@ExplicitConstructionTest.test_explicit_context_create_from_floatc                 C   s>   | j j}dddd}| D ]\}}| t||| qd S )Nr#  z	0.0000372z-NaN2400)u   １u   ٠.٠٣٧٢e-٣u   -nan౨౪౦౦)r   r   itemsr   r   )r   r   test_valuesinputr   r   r   r   test_unicode_digits9  s    z,ExplicitConstructionTest.test_unicode_digitsN)r   r   r   r   r   r   r  r  r
   r  r(  r*  r-  r/  r   r?  rL  rN  rR  r   r   r   r   r     s    8
	+
Yr   c                   @   s   e Zd ZeZdS )CExplicitConstructionTestNr   r   r   r   r   rS  D  s   rS  c                   @   s   e Zd ZeZdS )PyExplicitConstructionTestNr   r   r   r   r   rT  F  s   rT  c                   @   s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )ImplicitConstructionTestz6Unit tests for Implicit Construction cases of Decimal.c                 C   s   | j j}| ttdt  d S )NzDecimal(5) + Noner   r   r   r   r   localsr   r   r   r   test_implicit_from_NoneL  s    z0ImplicitConstructionTest.test_implicit_from_Nonec                 C   s<   | j j}| t|dd d | |dd |d d S )Nr   r   Z50l   2}r r)  r   r   r   r   test_implicit_from_intP  s    z/ImplicitConstructionTest.test_implicit_from_intc                 C   s   | j j}| ttdt  d S )NzDecimal(5) + "3"rV  r   r   r   r   test_implicit_from_stringX  s    z2ImplicitConstructionTest.test_implicit_from_stringc                 C   s   | j j}| ttdt  d S )NzDecimal(5) + 2.2rV  r   r   r   r   test_implicit_from_float\  s    z1ImplicitConstructionTest.test_implicit_from_floatc                 C   s(   | j j}| |d|d |d d S )Nr   r   2   r   r   r   r   r   test_implicit_from_Decimal`  s    z3ImplicitConstructionTest.test_implicit_from_Decimalc                    s*  | j j}G dd d}| t| |dd | t|d| d | tdd | tdd	 | td
d | tdd | tdd | tdd g d}|D ]r\} t|  fdd t|fdd | td| d d  d  | td| d d d  qd S )Nc                   @   sL   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S )z,ImplicitConstructionTest.test_rop.<locals>.Ec                 S   s   dt | S )Nzdivmod r   r   otherr   r   r   
__divmod__i  s    z7ImplicitConstructionTest.test_rop.<locals>.E.__divmod__c                 S   s   t |d S )Nz rdivmodr^  r_  r   r   r   __rdivmod__k  s    z8ImplicitConstructionTest.test_rop.<locals>.E.__rdivmod__c                 S   s   dt | S )Nzlt r^  r_  r   r   r   __lt__m  s    z3ImplicitConstructionTest.test_rop.<locals>.E.__lt__c                 S   s   dt | S )Nzgt r^  r_  r   r   r   __gt__o  s    z3ImplicitConstructionTest.test_rop.<locals>.E.__gt__c                 S   s   dt | S )Nzle r^  r_  r   r   r   __le__q  s    z3ImplicitConstructionTest.test_rop.<locals>.E.__le__c                 S   s   dt | S )Nzge r^  r_  r   r   r   __ge__s  s    z3ImplicitConstructionTest.test_rop.<locals>.E.__ge__c                 S   s   dt | S )Nzeq r^  r_  r   r   r   __eq__u  s    z3ImplicitConstructionTest.test_rop.<locals>.E.__eq__c                 S   s   dt | S )Nzne r^  r_  r   r   r   __ne__w  s    z3ImplicitConstructionTest.test_rop.<locals>.E.__ne__N)r   r   r   ra  rb  rc  rd  re  rf  rg  rh  r   r   r   r   Eh  s   ri  r%  z	divmod 10z
10 rdivmodzDecimal(10) < E()zgt 10zDecimal(10) > E()zlt 10zDecimal(10) <= E()zge 10zDecimal(10) >= E()zle 10zDecimal(10) == E()zeq 10zDecimal(10) != E()zne 10))+__add____radd__)-__sub____rsub__)*__mul____rmul__)/__truediv____rtruediv__)%__mod____rmod__)z//__floordiv____rfloordiv__)z**__pow____rpow__c                    s   d  t | S Nr   r^  r_  )lopr   r   r     r   z3ImplicitConstructionTest.test_rop.<locals>.<lambda>c                    s   t |  d S r}  r^  r_  )ropr   r   r     r   zE()zDecimal(10)r   10)r   r   r   divmodr   setattr)r   r   ri  ZoplistZsymr   )r~  r  r   test_ropd  s(    


z!ImplicitConstructionTest.test_ropN)
r   r   r   r   rX  rY  rZ  r[  r]  r  r   r   r   r   rU  I  s   rU  c                   @   s   e Zd ZeZdS )CImplicitConstructionTestNr   r   r   r   r   r    s   r  c                   @   s   e Zd ZeZdS )PyImplicitConstructionTestNr   r   r   r   r   r    s   r  c                   @   s:   e Zd ZdZdd Zdd Zedddd	 Zd
d ZdS )
FormatTestz#Unit tests for the format function.c                 C   sN   | j j}g d}|D ] \}}}| t|||| q| t|djd d S )N))r   0E-15z0e-15)r   z2.3E-15z2.3e-15)r   z2.30E+2z2.30e+2)r   z2.30000E-15z2.30000e-15)r   z1.23456789123456789e40z1.23456789123456789e+40)r   1.5z1.5e+0)r   z0.15z1.5e-1)r   z0.015z1.5e-2)r   z0.0000000000015z1.5e-12)r   z15.0z1.50e+1)r   -15z-1.5e+1)r   r   z0e+0)r   0E10e+1)r   0.0z0e-1)r   0.000e-2).6er  z0.000000e-9)r  r   z0.000000e+6)r  r  z9.999999e+0)r  z	9.9999999z1.000000e+1)r  z-1.23e5z-1.230000e+5)r  z1.23456789e-3z1.234568e-3)r   r   r   )r   r  r  )r   0E-2r  )r   z0.00E-8z0.0000000000)r   r  r   )r   z3.2E132)r   z3.2E2320)r   z3.20E2r  )r   z3.200E2z320.0)r   z3.2E-6z	0.0000032).6fr  0.000000)r  r  r  )r  r   r  ).0fr   r   )r  r  r   )r  
3.141592653)z.1fr  3.1)z.4fr  3.1416)r  r  3.141593)z.7fr  	3.1415926)z.8fr  r  )z.9fr  z3.141592650)gr   r   )r  r  r  )r  r  r  )Gr  z0E+1)r  z0E-5z0.00000)r  z0E-6r  )r  z0E-7z0e-7)r  z-0E2z-0e+2).0gr  r  )z.0nr  r  )z.1gr  r  )z.2gr  r  )z.5gr  r  )z.7gr  r  )z.8gr  r  )z.9gr  r  )z.10gr  r  )rv  r  0%)rv  Z0E0r  )rv  z0E-1r  )rv  r  r  )rv  z0E-3z0.0%)rv  z0E-4z0.00%).3%r   0.000%)r  0E10r  )r  z0E-10r  )r  z2.34z234.000%)r  z1.234567z123.457%).0%1.23z123%)r   r  r  )r   -NaN123r  )z+gZNaN456z+NaN456)z.3eInfr  )z.16frF  r5  )r  -sNaNr  )r   1.00r  )6123   123)z<6r  z123   )z>6r  r  )z^6r  z 123  )z=+6r  z+  123)#<10r  z
NaN#######)r  z-4.3z
-4.3######)z#<+100.0130z
+0.0130###)z#< 10r  z
 0.0130###)z@>10rF  z
@-Infinity)z#>5rF  r5  )z?^5r  z?123?)z%^6r  z%123%%)z ^6-45.6z-45.6 )z/=10r  z
-/////45.6)z/=+1045.6z
+/////45.6)z/= 10r  z
 /////45.6)z =10r4  z
- Infinity)z ^16r4  z   -Infinity    )z >101.2345z
    1.2345)z <10r  z
1.2345    ),Z1234567z	1,234,567)r  123456123,456)r  Z1234512,345)r  r  z1,234)r  r  r  )r  12r  )r  r#  r#  )r  r   r   )r  z-1234567z
-1,234,567)r  -123456-123,456)z7,r  r  )z8,r   123,456)08,r  z	0,123,456)z+08,r  z+123,456)z 08,r  r  )r  r  r  )z+09,r  z
+0,123,456)z07,1234.561,234.56)r  r  r  )z09,r  z	01,234.56)z010,r  z
001,234.56)z011,r  0,001,234.56)z012,r  r  )z08,.1fz1234.5z01,234.5)r  
1.23456789r  )z,%z
123.456789z12,345.6789%)z,er  z
1.23456e+5)z,Er  z
1.23456E+5)za=-7.0z0.12345zaaaa0.1)z	<^+15.20%r3  z<<+Infinity%<<<)z>,%ZsNaN1234567zsNaN1234567%)z=10.10%rG  z
   NaN123%r   s   -020)r   r   r   formatr   r   
__format__)r   r   rP  fmtr   r   r   r   r   test_formatting  s     zFormatTest.test_formattingc           	         s8  j j zddlm} W n ty4   d Y n0 fdd}dA fdd	}d	|g d
dd}d||gdd}d|g d
dd}d|ddd|gdd}dd|g 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,|d0d1 |d,|d2d1 |d,|d3d4 |d5|d*d6 |d5|d.d6 |d5|d0d6 |d5|d2d7 |d5|d3d8 |d5|d9d8 |d5|d:d; |d5|d<d= | d>|d?d@ d S )BNr   CHAR_MAXlocale.CHAR_MAX not availablec                    s"    j tkrddd | D S | S )Nr   c                 S   s   g | ]}t |qS r   chrr   r   r   r   r   E  r   zCFormatTest.test_n_format.<locals>.make_grouping.<locals>.<listcomp>)r   rg   joinZlstr   r   r   make_groupingD  s    z/FormatTest.test_n_format.<locals>.make_groupingr   c                    s0   j tkr | ||S  | j||dS d S )N)_localeconv)r   rg   r  r   overrider  r   r   r   r   get_fmtG  s    
z)FormatTest.test_n_format.<locals>.get_fmt.r  r  r   r  decimal_pointgroupingthousands_sepr   r   &r   r  r   rm  s   ¿zutf-8s   ´z12.7z12,7z1-2&7i[z123,456,789Z	123456789z123 456 789l   c}z123456-78-9012-3z.6nz
1.23457e+8z
1,23457e+8z
1&23457e+8rE  Z03nr  Z04nZ05nZ01234Z06nZ00123490  r  Z07nz012,345Z08nz	0,012,345Z09nZ010nz
00,012,345i@ z1-2345-6z	01-2345-6z0-01-2345-6Z011nZ012nz00-01-2345-6Z013nz000-01-2345-6-1.5Z020nu   -0´000´000´000´001¿5)Nr   )r   r   localer  ImportErrorskipTestdecoder   )	r   r  r  r  en_USfr_FRru_RUZcrazyZdotsep_wider   r  r   test_n_format<  sx    


zFormatTest.test_n_formatLC_ALLps_AFc                 C   sn   | j j}t d }t d }|dkr:| d|d |dkrT| d|d | t|ddd	 d S )
Nr  r  u   ٫z5inappropriate decimal point separator ({!a} not {!a})u   ٬z1inappropriate thousands separator ({!a} not {!a})z100000000.123r   u   100٬000٬000٫123)r   r   r  
localeconvr  r  r   )r   r   r  r  r   r   r   &test_wide_char_separator_decimal_point  s    z1FormatTest.test_wide_char_separator_decimal_pointc                 C   sP   G dd d| j j}|d}| | j j|j |d}| | j j|j d S )Nc                   @   s   e Zd Zdd ZdS )z;FormatTest.test_decimal_from_float_argument_type.<locals>.Ac                 S   s   t || _d S r   )r   a_type)r   r&  r   r   r   __init__  s    zDFormatTest.test_decimal_from_float_argument_type.<locals>.A.__init__Nr   r   r   r  r   r   r   r   A  s   r  g     @E@*   )r   r   
from_floatr   r  )r   r  r&  r   r   r   %test_decimal_from_float_argument_type  s
    

z0FormatTest.test_decimal_from_float_argument_typeN)	r   r   r   r   r  r  r	   r  r  r   r   r   r   r    s     Y
r  c                   @   s   e Zd ZeZdS )CFormatTestNr   r   r   r   r   r    s   r  c                   @   s   e Zd ZeZdS )PyFormatTestNr   r   r   r   r   r    s   r  c                   @   sh   e Zd 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S )ArithmeticOperatorsTestz:Unit tests for all arithmetic operators, binary and unary.c                 C   s   | j j}|d}|d}| || |d | || |d |d }| ||d | t|t| d| }| ||d | t|t| ||7 }| ||d |d7 }| ||d d S )N-11.122.2z11.1r   z-6.116.1r   r   r   r   r   r   d1d2r  r   r   r   test_addition  s    z%ArithmeticOperatorsTest.test_additionc                 C   s   | j j}|d}|d}| || |d | || |d |d }| ||d | t|t| d| }| ||d | t|t| ||8 }| ||d |d8 }| ||d d S )	Nr  r  z-33.3z33.3r   z-16.1r  z-38.3r  r  r   r   r   test_subtraction  s    z(ArithmeticOperatorsTest.test_subtractionc                 C   s   | j j}|d}|d}| || |d | || |d |d }| ||d | t|t| d| }| ||d | t|t| ||9 }| ||d |d9 }| ||d d S )N-5r  r  r   z-25z-75r  r  r   r   r   test_multiplication  s    z+ArithmeticOperatorsTest.test_multiplicationc                 C   s   | j j}|d}|d}| || |d | || |d |d }| ||d | t|t| d| }| ||d | t|t| || }| ||d |d }| ||d d S )	Nr  2-2.5z-0.4r  z-1.25z-0.8z-0.625r  r  r   r   r   test_division  s    z%ArithmeticOperatorsTest.test_divisionc                 C   s   | j j}|d}|d}| || |d | || |d |d }| ||d | t|t| d| }| ||d | t|t| || }| ||d |d }| ||d d S )N5r  r   r  r#     r   r  r  r   r   r   test_floor_division(  s    z+ArithmeticOperatorsTest.test_floor_divisionc                 C   s   | j j}|d}|d}| || |d | || |d |d }| ||d | t|t| d| }| ||d | t|t| ||C }| ||d |dC }| ||d	 d S )
Nr  r  Z25r  r  Z625r  Z16807Z390625r  r  r   r   r   test_poweringD  s    z%ArithmeticOperatorsTest.test_poweringc                 C   s   | j j}|d}|d}| || |d | || |d |d }| ||d | t|t| d| }| ||d | t|t| ||; }| ||d |d; }| ||d d S Nr  r  r#  r  r  r  r  r   r   r   test_module`  s    z#ArithmeticOperatorsTest.test_modulec                 C   s  | j j}|d}|d}t||\}}| ||d | ||d | t|t| | t|t| t|d\}}| ||d | ||d | t|t| | t|t| td|\}}| ||d | ||d | t|t| | t|t| d S r   )r   r   r  r   r   )r   r   r  r  pqr   r   r   test_floor_div_module|  s$    z-ArithmeticOperatorsTest.test_floor_div_modulec                 C   sT   | j j}| |d
 |d | |d |d | t|dt|d d S )Nr   r   )r   r   r   absr   r   r   r   test_unary_operators  s    z,ArithmeticOperatorsTest.test_unary_operatorsc                 C   s   | j j}| j j}| j j}|d}|d}|d}|d}||f||f||f||f||ff}||f||f||f||f||f||f||ff}	tjtjtjtjf}
tj	tj
f}||	 D ]P\}}|
| D ]>}|||}|tj
u rdnd}| ||d||j||| qq| }d|j|< |D ]R\}}|D ]B}|||}|tj
u rBdnd}| ||d||j||| q$q|	D ]:\}}|D ]*}| |tj	|| | |tj
|| q|qp||	 D ]&\}}|
D ]}| |||| qqW d    n1 s0    Y  d S )	Nr  sNaNr  r  TFz8expected {0!r} for operator.{1}({2!r}, {3!r}); got {4!r}r   )r   r   ry   r
  operatorltlegtgeeqner+  r  r   r%   r   )r   r   ry   r
  r   r   r   r   Z
qnan_pairsZ
snan_pairsZ	order_opsZequality_opsr   r	  opZgotr   ctxr   r   r   test_nan_comparisons  sL    ".


z,ArithmeticOperatorsTest.test_nan_comparisonsc                 C   sH   | j j}|d|d}| |dd| | t|djd d S )Nr   r  -2)r   r   r<   r   r   r   r'  r   r   r   test_copy_sign  s    z&ArithmeticOperatorsTest.test_copy_signN)r   r   r   r   r  r  r  r  r  r  r  r  r  r  r  r   r   r   r   r    s   7r  c                   @   s   e Zd ZeZdS )CArithmeticOperatorsTestNr   r   r   r   r   r    s   r  c                   @   s   e Zd ZeZdS )PyArithmeticOperatorsTestNr   r   r   r   r   r    s   r  c              	   C   s  | j j}| j j}| j j}| j j}| j j}| j j}| j j}| j j}|d}	|d}
|	|
 }| j	
  | j  |	|
 }| }| |j|  | ||j|	d | |j|  | X}| |j|  | |j|  | ||j|	|d | |j|  ~W d    n1 s0    Y  | |j|  ~W d    n1 sF0    Y  | ||d | ||d | }| |j|  ||||fD ]}| |j|  qd S )Nr   r  r   r  0.333333333333333333333333)r   r   ry   rz   r|   r   r{   rH  r
  finish1re   synchrowaitr   r   r   dividecompareassertFalser   )r   r   ry   rz   r|   r   r{   rH  r
  r  d3test1test2c2c3c1sigr   r   r   thfunc1  s@    

""r$  c              	   C   s  | j j}| j j}| j j}| j j}| j j}| j j}| j j}| j j}|d}	|d}
|	|
 }| }d|_	|	|
 }| }| 
|j|  | ||j|dd | 
|j|  ||b}| 
|j|  | |j|  d|j|< | ||j|dd | 
|j|  ~W d    n1 s0    Y  | |j|  | |j|  ~W d    n1 s^0    Y  | j  | j  | ||d | ||d	 | |j|  | 
|j|  ||||fD ]}| |j|  qd S )
Nr   r     Z1e425000000  Tz1e-425000000r  z0.333333333333333333)r   r   ry   rz   r|   r   r{   rH  r
  r#   r   r   r   multiplyr  r%   r  r  re   finish2r   )r   r   ry   rz   r|   r   r{   rH  r
  r  r  r  Zthiscontextr  r   r!  r#  r   r   r   thfunc2
  sH    

""

r)  c                   @   s   e Zd ZdZdd ZdS )ThreadingTestz0Unit tests for thread local contexts in Decimal.c                 C   s   | j j}| j tkr$| j js$| d |j}|j}|j}d|_d|_d|_t	 | _
t	 | _t	 | _tjt| fd}tjt| fd}|  |  | j  | j  t| j  D ]}| |j|  q|  |  ||_||_||_d S )Nzcompiled without threading   r   )targetr   )r   DefaultContextrg   HAVE_THREADSr  r#   r   r   	threadingEventr  r  r(  Threadr$  r)  startr  r*   r  r   r  )r   r.  Z	save_precZ	save_emaxZ	save_eminZth1Zth2r#  r   r   r   test_threading<  s2    





zThreadingTest.test_threadingN)r   r   r   r   r4  r   r   r   r   r*  6  s   r*  c                   @   s   e Zd ZeZdS )CThreadingTestNr   r   r   r   r   r5  c  s   r5  c                   @   s   e Zd ZeZdS )PyThreadingTestNr   r   r   r   r   r6  f  s   r6  c                   @   s   e Zd 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d d! Zd"d# Zd$d% Zd&d' Zd(S ))UsabilityTestz*Unit tests for Usability cases of Decimal.c                 C   s  | j j}|d}|d}|d}| || | || | || | || | || | || | || | || | |d | d| | |d | |d | |d | |t  | |t t	t
|td}|d d  }t| |  | || d S )Nz23.42r      r   r  gY@@rM  )r   r   assertGreaterassertGreaterEqual
assertLessassertLessEqualr   assertNotEqualobjectlistmapr   r   shuffler   )r   r   dadbdcr&  br   r   r   test_comparison_operatorsl  s0    
z'UsabilityTest.test_comparison_operatorsc                 C   s   | j j}|d}|d}| |d | |d | |d | |d | |d | |d | d| | d| | d| | d| | d| | d| | d|d d S )N0.253.0      @      ?g      ?r0  0.1)r   r   r;  r<  r9  r:  r=  r   r   r   rB  rC  r   r   r   test_decimal_float_comparison  s     z+UsabilityTest.test_decimal_float_comparisonc                 C   s   | j j}|d}|d}| |d | d| | |d | d| | d| | |d | |d | d| | |dt | |dt | |dt | |dt d S )NrG  rH  y      ?        y      ?        y      @        y      @      ?)	r   r   r=  r   r+  rc  NotImplementedre  rd  rL  r   r   r   test_decimal_complex_comparison  s    z-UsabilityTest.test_decimal_complex_comparisonc           
      C   s  | j j}t| j  j}| j j}| j j}| j j}tr6tjnd}trDtj	nd}trRtj
nd}|||d}	||	 ||	_| |d|dd | |dd|d | |dd|d	t|  | |d
t| |dd | |dd|d	t|  | |d
t| |dd | |d|dd | |dd|d d|	_| |dd |dd | |dd|dd  | |dd|dt|  | |dt| |dd | |d|dd | |d|dd | |d|dd | |d|dd | ||dj|dd | t|dd|d | |d|dd | |dd|d W d    n1 s0    Y  d S )Nɚ;6eilʈr   r   r   r   l	   ZmH;5B r   Z1ez-1el   !0QYrK  r%  i,  r  i6l   c(	 Z9er3  l   g] {   lg] r4  r2  i)r   r   r   ZFractionr&   r
  ry   rg   r   MIN_EMIN	MIN_ETINYr#   r;  r   r   r=  r<  r:  r9  r   rd  r+  rN  rc  )
r   Dr  r&   r
  ry   emaxeminZetinyr  r   r   r    test_decimal_fraction_comparison  s@    z.UsabilityTest.test_decimal_fraction_comparisonc                 C   sP   | j j}|d}t|}| t|t| t|}| t|t| d S )Nz43.24)r   r   rZ   r   r   deepcopy)r   r   r   r  rD  r   r   r   test_copy_and_deepcopy_methods  s    

z,UsabilityTest.test_copy_and_deepcopy_methodsc                    s  j j j j}fdd}| d | d | d | d | d  fdd	d
D }| d d d d d d d d d d d d d d d dg |D ]}|||t| q؈| d|d tt d 	| d 	| d g d}|D ]*}t
|} |}|||| qP| }	 d}
d |	_||
}d!|	_||
}d"|	_||
}|| || d#|	_d$d% }
| |
||
 W d    n1 s
0    Y  d S )&Nc                    s    t | }|  } || |S r   )hash__hash__r   )r   r&  rE  r   r   r   hashit  s    z.UsabilityTest.test_hash_method.<locals>.hashitr8  r  r5  Znan123-NaNc                    s:   g | ]2}t d dD ]"}dD ]} |d| |  qqqS )r%  r   r   )r   )r   r,   r   r   r   r   r   r     s   z2UsabilityTest.test_hash_method.<locals>.<listcomp>)r                     r   !   =   >   ?   @   A   B   -1r7  r  z-0.000r  z-0E1210.0z	-23.00000Z1230E100z
-4.5678E50l       z	1.634E100z
90.697E100z
188.83E100z
1652.9E100Z	56531E100r  r  rF  )r3  rF  r  z-.0e1z34.02.5z
112390.625z	-0.515625z123456789.1   r%  rd  '  iL  i  )r   r   r
  extendr   r   r   r   r\  r   r<  r#   )r   r
  r^  rP  r   Ztest_stringsr   r   r   r  r   Zh1Zh2Zh3r   r  r   test_hash_method  sj    
zUsabilityTest.test_hash_methodc                 C   s   | j j}|d}|d}d}d}| t||| | t||| | t||| | t||| | t||| | t||| | t||| | t||| d S )N15.32z28.5rc  rA  )r   r   r+  minmax)r   r   r  r  l1l2r   r   r   test_min_and_max_methods>  s    z&UsabilityTest.test_min_and_max_methodsc                 C   s(   | j j}| |d | |d d S )Nr   z0.372)r   r   r  r   r   r   r   r   test_as_nonzeroR  s    zUsabilityTest.test_as_nonzeroc                 C   s4   | j j}|d}| t|d | t|d d S )Nrv  zDecimal('15.32'))r   r   r   r   r   r'  r   r   r   test_tostring_methodsZ  s    z#UsabilityTest.test_tostring_methodsc           
      C   s6  | j j}|d}|d}| t|d | t|d | t|d | t|d g d}|D ]\}}| t||| qd| ttj|d | ttj|d | ttj|d	 | t	tj|d
 | t	tj|d g d}|D ]\}}| t
||| q| ttj
|d | ttj
|d | ttj
|d	 | t	tj
|d
 | t	tj
|d g d}|D ]\}}| t||| q| tt|d | tt|d | tt|d	 | t	t|d
 | t	t|d g d}|D ]&\}}}	| tt||||	 q
d S )NZ66rv  rn  rc  gp=
ף.@)	z123.00rS  3.2r  )3.54r  )3.899r  )-2.3r$  z-11.0ir  r   z-0E3r   )89891211712379812736.1l   {#'s{M r_  r  rG  r  rF  )	r~  )r  r  r  r  r  r  r  r  r  r  r  )r  l   {#'s{M )r~  r  r  r  r  r  r  r  )z-3.5)r  r  )r  r  )-0.5r   )0.5r   )r  r   )rq  r   )z3.5r  ))123.456r  z0E+4)r  r$  z0E+3)r  r  z1E+2)r  r   z1.2E+2)r  r   r  )r  r   z123.5)r  r   123.46)r  r  r  )r  r  z123.4560)z123.455r   r  )z123.445r   z123.44)r  r  r  )rF  ir  )ZsNaN314r  ZNaN314)r   r   r   r   r<  mathrb   r   r   OverflowErrorceilroundr   )
r   r   r  r  Z
test_pairsr   r   Ztest_triplesr   r>  r   r   r   test_tonum_methodsb  sD    z UsabilityTest.test_tonum_methodsc                 C   sX   | j j}dD ]F}t||}| t| td|}| ||drLdnd qd S )N)r2  Znan1234-nanz-nan2468r;  rm  g      )	r   r   r<  r   r  r^   r[   r   r   )r   r   r   r   r   r   r   r   test_nan_to_float  s    zUsabilityTest.test_nan_to_floatc                 C   s,   | j j}dD ]}||}| tt| qd S )N)snanz-snanZsnan1357z	-snan1234)r   r   r   r   r<  )r   r   r   r   r   r   r   test_snan_to_float  s    z UsabilityTest.test_snan_to_floatc                 C   s|   | j j}|d}| |tt| |d}| |tt| |d}| |tt| |d}| |tt| d S )Nr  r  r  r  )r   r   r   r   r   r'  r   r   r   test_eval_round_trip  s    z"UsabilityTest.test_eval_round_tripc                 C   sD  | j j}|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 S )Nr   r  r   r  r  r  r  )r   r  r  )r   r   r   r  r   r   r  r  r  )r   r  r   r   r  r  r  )r   r   r   r   %   )r   r  r  )r   r   r  )r   r  r   )r   r  r   )r   r  Nr   r   r  )r   r   r   )r   r  r  )r   )r   r   r  r   r  )r   r  r  )r   r   r   as_tupler'  r   r   r   test_as_tuple  s6    zUsabilityTest.test_as_tuplec           	   	   C   s  | j j}| t|j|d | t|j|d | t|j|d | t|j|d tddD ]}tdD ]}dD ]}|d	|||f }| }|\}}| |t | |t	 | |t	 | 
|d
 | t||d | |||| | qvqnqbd S )Nr3  r4  r  Zsnan123r  r     )rj  rm  z%s%dE%dr   r   )r   r   r   r  as_integer_ratior   r   rI  tupler   r9  r   r  gcd)	r   r   r   Zcoeffr   r   Zpqr  r  r   r   r   test_as_integer_ratio  s2    



z#UsabilityTest.test_as_integer_ratioc                 C   sd  | j j}G dd d|}|d}|d}|| }| t|| ||}| t|| t|}| t|| | || t|}| t|| | || |d}||}| t|| | || ||}| t|| | || | |jd  ||}| t|| | || d|_||}| t|| | || | |jd  d S )Nc                   @   s   e Zd ZdZdS )z1UsabilityTest.test_subclassing.<locals>.MyDecimalN)r   r   r   r	  r   r   r   r   	MyDecimal>  s   r  r   r   1.0r"   )	r   r   r+  r   rx  rZ   r   rZ  r	  )r   r   r  r  r  r   r   r,   r   r   r   test_subclassing:  s<    


zUsabilityTest.test_subclassingc                 C   s@   | j j}| j j}| }| t|d t||d d S Nr   )r   r   rH  r   r   rR   r   r   rH  r  r   r   r   test_implicit_contexti  s    z#UsabilityTest.test_implicit_contextc              	   C   s  | j j}| j j}| j j}| j j}| j j}| j j}| j j}| j j}| j j	}	| j j
}
| j j}|| 
}d|_d|_d|_|d}|d}|d}|  | t|jd dd | |j|	  | |j|
  |  | j||jd d | |j|  | |jd dd	 | |jd dd
 |  | t|jd dd | |j|	  | |j|
  |  | j||djd d | |j|  |  | t|jd dd | |j|	  | |j|
  |  | j||djd d | |j|  |  | t|jd dd | j||djd d | |j|  |  | t|jd dd | j||jd d | |j|  |  | t|jd dd | j||djd d | |j|  |  | t|jd dd | j||djd d | |j|  |  | t|jd dd | j||jd d | |j|  | t|j d dd |  | t|j!d dd | |j|  | |j|	  | |j|
  | |j|  | |j|  |  | j||j!d d | |j|  d|_"| t|j#d dd d|_"|  t|j$|dd d}| |d | j||j$|dd d | |j|  |  t|j%dd d}| |d | j||j%|dd d | |j|  |  t|j&dd d}| |d | j||j&dd d | |j|  |  t|j'dd d}| |d | j||j'dd d | |j|  |  t|j(dd d}| |d  | j||j(dd d | |j|  |  t|j)dd d}| |d | j||j)|dd d | |j|  |  t|j*dd d}| |d | j||j*|dd d | |j|  |  t|j+dd d}| |d | j||j+|dd d | |j|  |  t|j,dd d}| |d | j||j,|dd d | |j|  |  t|j-dd d}| |d  | j||j-dd d | |j|  |  t|j.d!d d}| |d" | j||j.dd d | |j|  |  t|j/dd d}| |d# | j||j/d$d d | |j|  |  t|j0d!d d}| |d" | j||j0d$d d | |j|  |  t|j1d!d%d d}| |d& | j||j1|dd%d d | |j|  t2|_3t|d'j4d d d(}| |d t5|_3t|d'j4d d d(}| |d) t|d'j4t6d d(}| |d |  | j||dj4d d | |j|  t2|_3t|d'j7d d d(}| |d t5|_3t|d'j7d d d(}| |d) t|d'j7t6d d(}| |d |  | j||dj7d d | |j|  t2|_3t|d'j8d d d(}| |d t5|_3t|d'j8d d d(}| |d) t|d'j8t6d d(}| |d |  | j||dj8d d | |j|  t6|_3t|d*j9|d+d d d,}| |d- t5|_3t|d*j9|d+d d d,}| |d. t|d*j9|d+t6d d,}| |d- |  | j||j9|d/t6d d( | |j|  W d    n1 s0    Y  || x}d|_d|_d|_|d d0:}| |jd | |jd | |jd W d    n1 sz0    Y  W d    n1 s0    Y  d S )1Nr  r&  iZ111Z1e9999z1e-9999r   z1.609487E+48FTz4.709530r   z2.045323r  r   Z1111000z9.999999E+999r  r  r   
+Subnormalz0E-1005r   ZNan891287828Z
NaN1287828i    ro  r  e   Z101rS  r  r   Z11100z1.11E+9rs  r  Z225r  r$   r   r#  z1.50001z1e-3)r   r$   r   z1.501z1.500z1e-10)r  ):r   r   r&   r
  ry   rz   r|   r   r~   r{   r}   rx   r#   r   r   r   r   r   r   r   r   r   r+  rC   rG   lnlog10logbr>   rK   rL   rO   r5   rR   capitalsrS   r  r6   r3   rN   rW   rx  rI   rw  rJ   rP   rotatescalebshiftfmar'   r$   to_integralrq   ru   rT   rU   quantize)r   r   r&   r
  ry   rz   r|   r   r~   r{   r}   rx   r  r   r	  zr   r   r   r   r   test_none_argsr  s   0zUsabilityTest.test_none_argsc                 C   s   | j j}| |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|d|d | |dd|d|d|d|d d S )Nr  r  iu'    i7  rS  rE  rM  i   r   r  z9.123r@  r   ir   C   )r   r   r   r  r6   r7   r8   r3   rN   rW   rx  rI   rw  rJ   rM   r  rP   r  rQ   r  r  r  r   r   r   r   test_conversions_from_inta	  s    z'UsabilityTest.test_conversions_from_intN)r   r   r   r   rF  rM  rO  rY  r[  ru  r{  r|  r}  r  r  r  r  r  r  r  r  r  r  r   r   r   r   r7  i  s*   $*	Tg
-!/	 pr7  c                   @   s   e Zd ZeZdS )CUsabilityTestNr   r   r   r   r   r  	  s   r  c                       s,   e Zd ZeZ fddZ fddZ  ZS )PyUsabilityTestc                    s"   t    t | _td d S NiX  superr   sysget_int_max_str_digits_previous_int_limitset_int_max_str_digitsr   r   r   r   r   	  s    

zPyUsabilityTest.setUpc                    s   t | j t   d S r   r  r  r  r  tearDownr   r  r   r   r  	  s    zPyUsabilityTest.tearDownr   r   r   r   r   r   r  __classcell__r   r   r  r   r  	  s   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S )PythonAPItestsc                 C   sT   | j j}| t|tj | t|tj | |dtj | 	|dtj d S r  )
r   r   r   
issubclassnumbersNumberr  ZRealrI  ZassertNotIsInstancer   r   r   r   test_abc	  s
    zPythonAPItests.test_abcc                 C   s  t tjd D ]}| jj}tjd }| jtjd< |d}t||}t|}| 	|| t
rt
d}td}t
tjd< t||}	ttjd< t|	}
| |
tj | 	|
| ttjd< t||}t
tjd< t|}
| |
t
j | 	|
| t
d }td }t
tjd< t||}	ttjd< t|	}
| |
tj | 	|
| ttjd< t||}t
tjd< t|}
| |
t
j | 	|
| |tjd< qd S )Nr   r   z-3.141590000z-3.123e81723)r   pickleHIGHEST_PROTOCOLr   r   r  modulesdumpsloadsr   rg   r   rI  r  ZDecimalTuple)r   protor   savedecimalr   r  r   r   r	  Zsxr>  Zsyr   r   r   test_pickle	  sL    















zPythonAPItests.test_picklec                 C   s   | j j}tddD ]R}d|d  }| t||tt| ||}|t}| |t|| q| t	t|d | t	t|d | t
t|d | t
t|d d S )	N   %0.2f      Y@r  r  r3  r4  )r   r   r   r   r   r<  r  rq   r   r   r  r   r   r   r   r   r>  r   r   r   test_int	  s    
zPythonAPItests.test_intc                 C   sl   | j j}tddD ]T}d|d  }| t||tt| ||}|t}| |t	|| qd S )Nr  r  r  r  )
r   r   r   r   r   r<  r  rq   r  truncr  r   r   r   
test_trunc	  s    
zPythonAPItests.test_truncc                 C   s|  | j j}G dd d|}| t|| |d}| t|| | t|d | |jd d}| |||| | |t	d
  | |t	d  | |t	d	  | t|t	dt|d
 | t|t	dt|d | t|t	d	t|d | t|jd tdD ]6}tdt d d  }| |t	|| q@d S )Nc                   @   s   e Zd Zdd ZdS )z1PythonAPItests.test_from_float.<locals>.MyDecimalc                 S   s
   d| _ d S )Nr	  )r   )r   _r   r   r   r  	  s    z:PythonAPItests.test_from_float.<locals>.MyDecimal.__init__Nr  r   r   r   r   r  	  s   r  r0  r1  r	  l   s\&5$3|	 r2  r3  r4  r  r  r5  abcr8  r9  r:  r;  )r   r   r   r  r  r   r   r   r   r<  rD   rA   r   r   r   r   r=  )r   r   r  r>  Zbigintr   r   r   r   r   test_from_float	  s6    




zPythonAPItests.test_from_floatc                 C   s   | j j}| j j}| j j}|dtd}| |tj|d |dt	d}| |tj|d |d|gd}| 
||jtj | t|dd | t|dd	 | t|d
d d S )Nr   )r#   r$   z3.1415r  )r#   r%          zDecimal('-0')r;  zDecimal('1')r%  zDecimal('10'))r   r   r&   r{   rq   r   create_decimal_from_floatr  piru   r   r   )r   r   r&   r{   r   r   r   r   test_create_decimal_from_float
  s8    

z-PythonAPItests.test_create_decimal_from_floatc                 C   s   | j j}| j j}| j j}|ddd}| |d|d|d | |dj|dtd|d | j||d	j|d
|d | }|d}|j||dtd}| ||d d S )Ni iayrR  z7.335z.01z7.34r$   z7.33Z10e99999Z1e100000r  z0.871831e800Z1e797)r   r   r$   z	8.71E+799)r   r   r&   ry   r   r  rq   r   )r   r   r&   ry   r  r   r   r   r   r   test_quantize6
  s(    zPythonAPItests.test_quantizec                 C   s   | j j}|d}| |j| | |jd | | | |d}| t|ttd | t	t
|dd | t	t
|dd | t	t
|dd | t	t
|d	d d S )
Nz9.8182731e181273r   r#  r   realrM  imag	conjugate__complex__)r   r   r   r  r  r  complexr<  r   r   r  )r   r   r   r   r   r   test_complexN
  s    zPythonAPItests.test_complexc                 C   s,  | j j}| j j}| j j}| j j}| j j}| }d|_d|_d|_| }|	  | 
|d|d | 
|d|dd | 
||ddd | 
||dd |	  | j||d|d | |j|  | |j|  |	  | 
|dj|dd	 | j||d
j|d | |j|  | |j|  |	  | 
|dj|d|d | j||dj|d | |j|  | |j|  | 
|dj|d|d | 
|dj|dd | 
|dj|d|d | 
|dj|d|d | 
|dj|dd | 
|dj|dd | 
|dj|dd | 
|dj|d|d | 
|dj|ddd |	  | j||dj|d|d | |j|  | |j|  | 
|dj|d|d|d | 
|dj|d|d|d | 
|dj|d |d|d  | 
|d!j|d"|d|d# | 
|d!j|d"|d|d | 
|dj|d$|d|d% |	  | j||dj |d&|d | |j|  | |j|  | 
|d'j!|d(|d|d) | 
|d*j"|d+|d	d,|d- | jt#|dj$|d | jt#|dj%|d | jt#|dj&|d | jt#|dj'|d | jt#|dj(|d | jt#|dj)|d | jt#|dj*|d | jt#|dj+|d | |dj,|d | |dj-|d | jt#|dj.|d | jt#|dj/|d | jt#|dj0|d | 
|d.j1|dd | 
|dj2|dd | 
|dj3|dd/ | 
|d0j4|dd0 | 
|d1j5|d2|dd | 
|d1j6|d2|dd | 
|d3j7|d2|dd | 
|d4j8d|dd | 
|d4j8d|dd |	  | j||d4j9d|d | |j|  | |j|  | 
|d4j:d|dd | jt#|j;d5|d | jt#|dj<|d | 
|d= d | jt#|d$j>|d | jt#|d$j?|d | jt#|dj=d6d | jt#|dj=d6d7 W d    n1 s0    Y  d S )8Nr   r   r"   r  )r   r   r   r  r   r  r!  z0.7r4  r  z-0.9z9.73z1E+1Z9999'  z-2000i0r  rS  z0.06250.2r  )r   r`  r   r2  0.01z0.0101r  z-0.3z0.02z-0.03r6  ro  rK  Z1e109.99r  r  9.9z0.9)thirdr   r`  z7E+1ir  z0.21Z11r  Z01Z23g?r   )r  )@r   r   r&   r
  ry   r|   r#   r   r   r   r   r   r   r   r  r   r  r  rK   rL   rO   r  rU   rT   rR   r  r6   rx  rI   rw  rJ   rM   r  rP   r  r   r?   r@   rA   rB   rD   rF   rE   rH   rC   rG   adjustedr  radixr  r>   r5   rS   r3   rN   rW   r  r  r  r  r  	canonicalr:   r;   )r   rV  r&   r
  ry   r|   Zxcr  r   r   r   test_named_parameters^
  s    
""""z$PythonAPItests.test_named_parametersc                 C   s  | j }|j}|j}|j}|j}|j}|j}|j}|j}	|j	}
|j
}| t|t | t|| | t|| | t|t | t|| | t|t | t||
 | t||	 | t|| | t||	 | t||
 | t|| | t|| | t|| | t|	| | t|
| | t|| | t|j| | t|j| | t|j| | t|jt | t|j| d S r   )r   r   ry   FloatOperationrz   r|   r   r~   r{   r}   rx   r   r  ArithmeticErrorr   ZeroDivisionErrorZConversionSyntaxZDivisionImpossibleZDivisionUndefinedZInvalidContext)r   r   r   ry   r  rz   r|   r   r~   r{   r}   rx   r   r   r   test_exception_hierarchy
  sB    z'PythonAPItests.test_exception_hierarchyN)r   r   r   r  r  r  r  r  r  r  r  r  r   r   r   r   r   r  	  s   3 pr  c                   @   s   e Zd ZeZdS )CPythonAPItestsNr   r   r   r   r   r  
  s   r  c                   @   s   e Zd ZeZdS )PyPythonAPItestsNr   r   r   r   r   r  
  s   r  c                   @   s  e Zd Zdd Ze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d!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Z d;d< Z!d=d> Z"d?d@ Z#dAdB Z$dCdD Z%dEdF Z&dGdH Z'dIdJ Z(dKdL Z)dMdN Z*dOdP Z+dQdR Z,dSdT Z-dUdV Z.dWdX Z/dYdZ Z0d[d\ Z1d]d^ Z2d_d` Z3dadb Z4dcdd Z5dedf Z6dgdh Z7didj Z8dkdl Z9dmdn Z:dodp Z;dqdr Z<dsdt Z=dudv Z>dwdx Z?dydz Z@d{d| ZAd}d~ ZBdS )ContextAPItestsc              
   C   s   | j j}| j j}| j j}| j j}| }|d d d d d d d d d}||fD ]z}| |jd | |jt | |j	d | |j
d | |jd | |jd t| |dg  t| |d|||g qFd S )	N)r#   r$   r   r   r  r2   r   r%   rA  ?B r   r   r   r%   )r   r&   ry   rz   r|   r   r#   r$   r'   r   r   r  r2   r!   )r   r&   ry   rz   r|   r"  r   r  r   r   r   r  
  s&    
zContextAPItests.test_none_argsc                 C   sr   dd l }| j }tD ]}|||_| |j| q|d}| tt	|d| |d}| tt	|d| d S )Nr   r   r$   z	ROUND_ UP)
r  r   r&   RoundingModesr  r$   r   r   r   r  )r   r  r  Zrndr   r   r   r   r    s    


z(ContextAPItests.test_from_legacy_stringsc                 C   s  t tjd D ]l}| jj}tjd }| jtjd< | }tt||}| 	|j
|j
 | 	|j|j | 	|j|j | 	|j|j | 	|j|j | 	|j|j | 	|j|j | 	|j|j trttfttfgnttfg}|D ]\}}ttD ]n\}	}
tt| D ]V\}}
tt| D ]<\}}
tdd}tdd}tdd}td}td}|tjd< |j|||t|	 ||t| d | t| d | d}t||}|tjd< t|}| ||j | 	|j
| | 	|j| | 	|j| | 	|jt|	  | 	|j| | 	|j| t| |dt| d |  t| |d	t| d |  q*qqq|tjd< qd S )
Nr   r   rM  r  r   r   )r#   r   r   r$   r  r2   r   r%   r   r%   )r   r  r  r   r&   r  r  r  r  r   r#   r   r   r$   r  r2   r   r%   rg   r   r   r  r   r   	randrangerI  r!   )r   r  r&   r  r  r   combinationsZdumperloaderZrir  fiZtir#   rX  rW  capsr2   r   r   r   r   r   r     sZ    





&zContextAPItests.test_picklec                 C   sB   | j j}| |ddd|ddi g | |ddddi g d S )Nr%  r&  r;  )r   r   )r   r   ZassertInZassertNotInr   r   r   r   test_equality_with_other_types]  s    z.ContextAPItests.test_equality_with_other_typesc                 C   s   | j j}| j j}| }| }| t|t| | t|jt|j | t|jt|j t|j	 }t|j	 }| 
|| | 
|j|j d S r   )r   r   r&   rZ   r=  r   r   r%   re   keysr   )r   r   r&   r  r   Zk1Zk2r   r   r   	test_copyc  s    zContextAPItests.test_copyc                 C   s"   | j j}| }| tt|d d S )NZ_clamp)r   r&   r   r   r   r   r&   r  r   r   r   test__clampr  s    zContextAPItests.test__clampc                 C   sJ   | j j}| j j}| }||d}| |d| | t|jd d S Nr   ro  )r   r   r&   r  r   r   r   r   r   r&   r  r   r   r   r   test_abs}  s    zContextAPItests.test_absc                 C   s   | j j}| j j}| }||d|d}| |dd| | ||dd| | |d|d| | t|jdd | t|jdd d S Nr   r#  )r   r   r&   rh   r   r   r   r  r   r   r   test_add  s    zContextAPItests.test_addc                 C   s   | j j}| j j}| }||d|d}| |dd| | ||dd| | |d|d| | t|jdd | t|jdd d S r  )r   r   r&   r  r   r   r   r  r   r   r   test_compare  s    zContextAPItests.test_comparec                 C   s   | j j}| j j}| }||d|d}| |dd| | ||dd| | |d|d| | t|jdd | t|jdd d S r  )r   r   r&   r6   r   r   r   r  r   r   r   test_compare_signal  s    z#ContextAPItests.test_compare_signalc                 C   s   | j j}| j j}| }||d|d}| |dd| | ||dd| | |d|d| | t|jdd | t|jdd d S r  )r   r   r&   r7   r   r   r   r  r   r   r   test_compare_total  s    z"ContextAPItests.test_compare_totalc                 C   s   | j j}| j j}| }||d|d}| |dd| | ||dd| | |d|d| | t|jdd | t|jdd d S r  )r   r   r&   r8   r   r   r   r  r   r   r   test_compare_total_mag  s    z&ContextAPItests.test_compare_total_magc                 C   sJ   | j j}| j j}| }||d}| |d| | t|jd d S r  )r   r   r&   r:   r   r   r   r  r   r   r   test_copy_abs  s    zContextAPItests.test_copy_absc                 C   sJ   | j j}| j j}| }||d}| |d| | t|jd d S r  )r   r   r&   r9   r   r   r   r  r   r   r   test_copy_decimal  s    z!ContextAPItests.test_copy_decimalc                 C   sJ   | j j}| j j}| }||d}| |d| | t|jd d S r  )r   r   r&   r;   r   r   r   r  r   r   r   test_copy_negate  s    z ContextAPItests.test_copy_negatec                 C   s   | j j}| j j}| }||d|d}| |dd| | ||dd| | |d|d| | t|jdd | t|jdd d S )Nr   r  r#  r  )r   r   r&   r<   r   r   r   r  r   r   r   r    s    zContextAPItests.test_copy_signc                 C   s   | j j}| j j}| }||d|d}| |dd| | ||dd| | |d|d| | t|jdd | t|jdd d S Nr   r   r#  r  )r   r   r&   r  r   r   r   r  r   r   r   test_divide  s    zContextAPItests.test_dividec                 C   s   | j j}| j j}| }||d|d}| |dd| | ||dd| | |d|d| | t|jdd | t|jdd d S r  )r   r   r&   r=   r   r   r   r  r   r   r   test_divide_int  s    zContextAPItests.test_divide_intc                 C   s   | j j}| j j}| }||d|d}| |dd| | ||dd| | |d|d| | t|jdd | t|jdd d S r  )r   r   r&   r  r   r   r   r  r   r   r   test_divmod  s    zContextAPItests.test_divmodc                 C   sJ   | j j}| j j}| }||d}| |d| | t|jd d S Nr%  r  )r   r   r&   r   r   r   r   r  r   r   r   test_exp  s    zContextAPItests.test_expc                 C   s^  | j j}| j j}| }||d|d|d}| |ddd| | ||ddd| | |d|dd| | |dd|d| | ||d|dd| | t|jddd | t|jddd | t|jddd | t|j|d|dd	 | t|j|d
|dd | t|dj|dd	 | t|d
j|dd d S )Nr   r  r  r  r  4r  r   znot a decimalr   r  gZd;O?)r   r   r&   r  r   r   r   r  r   r   r   test_fma  s0    

zContextAPItests.test_fmac                 C   sJ   | j j}| j j}| }||d}| |d| | t|jd d S r!  )r   r   r&   r@   r   r   r   r  r   r   r   test_is_finite0  s    zContextAPItests.test_is_finitec                 C   sJ   | j j}| j j}| }||d}| |d| | t|jd d S r!  )r   r   r&   rA   r   r   r   r  r   r   r   test_is_infinite9  s    z ContextAPItests.test_is_infinitec                 C   sJ   | j j}| j j}| }||d}| |d| | t|jd d S r!  )r   r   r&   rB   r   r   r   r  r   r   r   test_is_nanB  s    zContextAPItests.test_is_nanc                 C   sJ   | j j}| j j}| }||d}| |d| | t|jd d S r!  )r   r   r&   rC   r   r   r   r  r   r   r   test_is_normalK  s    zContextAPItests.test_is_normalc                 C   sJ   | j j}| j j}| }||d}| |d| | t|jd d S r!  )r   r   r&   rD   r   r   r   r  r   r   r   test_is_qnanT  s    zContextAPItests.test_is_qnanc                 C   sJ   | j j}| j j}| }||d}| |d| | t|jd d S r!  )r   r   r&   rE   r   r   r   r  r   r   r   test_is_signed]  s    zContextAPItests.test_is_signedc                 C   sJ   | j j}| j j}| }||d}| |d| | t|jd d S r!  )r   r   r&   rF   r   r   r   r  r   r   r   test_is_snanf  s    zContextAPItests.test_is_snanc                 C   sJ   | j j}| j j}| }||d}| |d| | t|jd d S r!  )r   r   r&   rG   r   r   r   r  r   r   r   test_is_subnormalo  s    z!ContextAPItests.test_is_subnormalc                 C   sJ   | j j}| j j}| }||d}| |d| | t|jd d S r!  )r   r   r&   rH   r   r   r   r  r   r   r   test_is_zerox  s    zContextAPItests.test_is_zeroc                 C   sJ   | j j}| j j}| }||d}| |d| | t|jd d S r!  )r   r   r&   r  r   r   r   r  r   r   r   test_ln  s    zContextAPItests.test_lnc                 C   sJ   | j j}| j j}| }||d}| |d| | t|jd d S r!  )r   r   r&   r  r   r   r   r  r   r   r   
test_log10  s    zContextAPItests.test_log10c                 C   sJ   | j j}| j j}| }||d}| |d| | t|jd d S r!  )r   r   r&   r  r   r   r   r  r   r   r   	test_logb  s    zContextAPItests.test_logbc                 C   s   | j j}| j j}| }||d|d}| |dd| | ||dd| | |d|d| | t|jdd | t|jdd d S r  )r   r   r&   r3   r   r   r   r  r   r   r   test_logical_and  s    z ContextAPItests.test_logical_andc                 C   sJ   | j j}| j j}| }||d}| |d| | t|jd d S )Nr  r  )r   r   r&   r>   r   r   r   r  r   r   r   test_logical_invert  s    z#ContextAPItests.test_logical_invertc                 C   s   | j j}| j j}| }||d|d}| |dd| | ||dd| | |d|d| | t|jdd | t|jdd d S r  )r   r   r&   rN   r   r   r   r  r   r   r   test_logical_or  s    zContextAPItests.test_logical_orc                 C   s   | j j}| j j}| }||d|d}| |dd| | ||dd| | |d|d| | t|jdd | t|jdd d S r  )r   r   r&   rW   r   r   r   r  r   r   r   test_logical_xor  s    z ContextAPItests.test_logical_xorc                 C   s   | j j}| j j}| }||d|d}| |dd| | ||dd| | |d|d| | t|jdd | t|jdd d S r  )r   r   r&   rx  r   r   r   r  r   r   r   test_max  s    zContextAPItests.test_maxc                 C   s   | j j}| j j}| }||d|d}| |dd| | ||dd| | |d|d| | t|jdd | t|jdd d S r  )r   r   r&   rI   r   r   r   r  r   r   r   test_max_mag  s    zContextAPItests.test_max_magc                 C   s   | j j}| j j}| }||d|d}| |dd| | ||dd| | |d|d| | t|jdd | t|jdd d S r  )r   r   r&   rw  r   r   r   r  r   r   r   test_min  s    zContextAPItests.test_minc                 C   s   | j j}| j j}| }||d|d}| |dd| | ||dd| | |d|d| | t|jdd | t|jdd d S r  )r   r   r&   rJ   r   r   r   r  r   r   r   test_min_mag  s    zContextAPItests.test_min_magc                 C   sJ   | j j}| j j}| }||d}| |d| | t|jd d S r!  )r   r   r&   Zminusr   r   r   r  r   r   r   
test_minus  s    zContextAPItests.test_minusc                 C   s   | j j}| j j}| }||d|d}| |dd| | ||dd| | |d|d| | t|jdd | t|jdd d S r  )r   r   r&   r'  r   r   r   r  r   r   r   test_multiply  s    zContextAPItests.test_multiplyc                 C   sJ   | j j}| j j}| }||d}| |d| | t|jd d S r!  )r   r   r&   rK   r   r   r   r  r   r   r   test_next_minus  s    zContextAPItests.test_next_minusc                 C   sJ   | j j}| j j}| }||d}| |d| | t|jd d S r!  )r   r   r&   rL   r   r   r   r  r   r   r   test_next_plus  s    zContextAPItests.test_next_plusc                 C   s   | j j}| j j}| }||d|d}| |dd| | ||dd| | |d|d| | t|jdd | t|jdd d S r  )r   r   r&   rM   r   r   r   r  r   r   r   test_next_toward   s    z ContextAPItests.test_next_towardc                 C   sJ   | j j}| j j}| }||d}| |d| | t|jd d S r!  )r   r   r&   rO   r   r   r   r  r   r   r   test_normalize,  s    zContextAPItests.test_normalizec                 C   sn   | j j}| j j}| }| |d||d | |d||d | |d||d d S )NrS  r   r   )r   r   r&   r   r5   )r   r   r&   r  r   r   r   test_number_class5  s    z!ContextAPItests.test_number_classc                 C   sJ   | j j}| j j}| }||d}| |d| | t|jd d S r!  )r   r   r&   plusr   r   r   r  r   r   r   	test_plus>  s    zContextAPItests.test_plusc                 C   s   | j j}| j j}| }||d|d}| |dd| | ||dd| | |d|d| | ||d|d| | t|jdd | t|jdd | |jddddd d S )	Nr   r  r#  r#  r   r!  r   )modulorE  r&  )r   r   r&   powerr   r   r   r  r   r   r   
test_powerG  s    zContextAPItests.test_powerc                 C   s   | j j}| j j}| }||d|d}| |dd| | ||dd| | |d|d| | t|jdd | t|jdd d S r  )r   r   r&   r  r   r   r   r  r   r   r   r  U  s    zContextAPItests.test_quantizec                 C   s   | j j}| j j}| }||d|d}| |dd| | ||dd| | |d|d| | t|jdd | t|jdd d S r  )r   r   r&   	remainderr   r   r   r  r   r   r   test_remaindera  s    zContextAPItests.test_remainderc                 C   s   | j j}| j j}| }||d|d}| |dd| | ||dd| | |d|d| | t|jdd | t|jdd d S r  )r   r   r&   rP   r   r   r   r  r   r   r   test_remainder_nearm  s    z#ContextAPItests.test_remainder_nearc                 C   s   | j j}| j j}| }||d|d}| |dd| | ||dd| | |d|d| | t|jdd | t|jdd d S r  )r   r   r&   r  r   r   r   r  r   r   r   test_rotatey  s    zContextAPItests.test_rotatec                 C   sJ   | j j}| j j}| }||d}| |d| | t|jd d S r!  )r   r   r&   rR   r   r   r   r  r   r   r   	test_sqrt  s    zContextAPItests.test_sqrtc                 C   s   | j j}| j j}| }||d|d}| |dd| | ||dd| | |d|d| | t|jdd | t|jdd d S r  )r   r   r&   rQ   r   r   r   r  r   r   r   test_same_quantum  s    z!ContextAPItests.test_same_quantumc                 C   s   | j j}| j j}| }||d|d}| |dd| | ||dd| | |d|d| | t|jdd | t|jdd d S r  )r   r   r&   r  r   r   r   r  r   r   r   test_scaleb  s    zContextAPItests.test_scalebc                 C   s   | j j}| j j}| }||d|d}| |dd| | ||dd| | |d|d| | t|jdd | t|jdd d S r  )r   r   r&   r  r   r   r   r  r   r   r   
test_shift  s    zContextAPItests.test_shiftc                 C   s   | j j}| j j}| }||d|d}| |dd| | ||dd| | |d|d| | t|jdd | t|jdd d S r  )r   r   r&   subtractr   r   r   r  r   r   r   test_subtract  s    zContextAPItests.test_subtractc                 C   sJ   | j j}| j j}| }||d}| |d| | t|jd d S r!  )r   r   r&   rS   r   r   r   r  r   r   r   test_to_eng_string  s    z"ContextAPItests.test_to_eng_stringc                 C   sJ   | j j}| j j}| }||d}| |d| | t|jd d S r!  )r   r   r&   rV   r   r   r   r  r   r   r   test_to_sci_string  s    z"ContextAPItests.test_to_sci_stringc                 C   sJ   | j j}| j j}| }||d}| |d| | t|jd d S r!  )r   r   r&   rU   r   r   r   r  r   r   r   test_to_integral_exact  s    z&ContextAPItests.test_to_integral_exactc                 C   s\   | j j}| j j}| }||d}| |d| | t|jd | t|jdd d S )Nr%  r  r   )r   r   r&   rT   r   r   r   r  r   r   r   test_to_integral_value  s    z&ContextAPItests.test_to_integral_valueN)Cr   r   r   r  r
   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r"  r$  r%  r&  r'  r(  r)  r*  r+  r,  r-  r.  r/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  rA  rD  r  rF  rG  rH  rI  rJ  rK  rL  rN  rO  rP  rQ  rR  r   r   r   r   r  
  s   
=																												r  c                   @   s   e Zd ZeZdS )CContextAPItestsNr   r   r   r   r   rS    s   rS  c                   @   s   e Zd ZeZdS )PyContextAPItestsNr   r   r   r   r   rT    s   rT  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S )ContextWithStatementc                 C   sv   | j j}| j j}| }| }| }W d    n1 s80    Y  | }| ||d | ||d | ||d d S )N!did not restore context correctlydid not copy the context __enter__ returned wrong context)r   rH  r
  r+  assertIsNot)r   rH  r
  orig_ctx	enter_ctxset_ctx	final_ctxr   r   r   test_localcontext  s    $z&ContextWithStatement.test_localcontextc           	      C   s   | j j}| j j}| j j}| j j}| }|dd}||}| }W d    n1 sT0    Y  | }| ||d | |j|jd | ||d | ||d d S )Nr  r#   rV  zdid not set correct contextrW  rX  )r   r&   rH  r
  r+  r   r#   rY  )	r   r&   rH  r
  rZ  new_ctxr[  r\  r]  r   r   r   test_localcontextarg  s    

$z)ContextWithStatement.test_localcontextargc              	   C   s  | j j}| j j}| j j}| j j}| j j}| j j}| }|  |dd}| }	| |	j	|j	 | |	j
|j
 d|	j
|< d|	_| |jd | ||	jd | |	j	|  ||h}
| |
j	|j	 | |
j
|j
 | ||
j|dd | |
j	|  | |
j	|  ~
W d    n1 s(0    Y  | |	j	|  ~	W d    n1 sZ0    Y  | |jd | |j	|  | |j	|  | |j	|  | |j	|  d S )N  r   Tz0e-999z3.4e200r   )r   r   r&   rH  r
  rx   r|   r   r   r   r%   r   r=  r   r   r   rC  r  )r   r   r&   rH  r
  rx   r|   rZ  r`  r"  r   r   r   r   test_nested_with_statements
  s>    



""z0ContextWithStatement.test_nested_with_statementsc                 C   s   | j j}| }~| b}~| :}~| }~W d    n1 sD0    Y  W d    n1 sb0    Y  W d    n1 s0    Y  W d    n1 s0    Y  d S r   r   r
  r   r
  r"  r   r!  c4r   r   r   test_with_statements_gc1-  s    z-ContextWithStatement.test_with_statements_gc1c                 C   s   | j j}| }||h}~||>}~||}~~W d    n1 sJ0    Y  W d    n1 sh0    Y  W d    n1 s0    Y  W d    n1 s0    Y  d S r   rf  rg  r   r   r   test_with_statements_gc29  s    


z-ContextWithStatement.test_with_statements_gc2c                 C   s~  | j j}| j j}| j j}| j j}| @}~|dd}|| || }~| |jd ~|dd}|| ~| | jd |dd}	||	 | | jd ||	~}
~	| |
jd ~
|dd}|| ~| | jd |  }| |jd ~W d    n1 s0    Y  W d    n1 s00    Y  W d    n1 sP0    Y  W d    n1 sp0    Y  d S )Nr   r_  r   r  r  )r   r&   r
  rH  r+   r   r#   )r   r&   r
  rH  r+   r"  Zn1r   Zn2Zn3r!  Zn4rh  r   r   r   test_with_statements_gc3E  s<    





z-ContextWithStatement.test_with_statements_gc3N)	r   r   r   r^  ra  re  ri  rj  rk  r   r   r   r   rU    s   #rU  c                   @   s   e Zd ZeZdS )CContextWithStatementNr   r   r   r   r   rl  f  s   rl  c                   @   s   e Zd ZeZdS )PyContextWithStatementNr   r   r   r   r   rm  h  s   rm  c                   @   s8   e Zd Zdd Zdd Zedd Zdd Zd	d
 ZdS )ContextFlagsc              
      s   j j} j j} j j} j j} j j} j j} j j} fdd}|dddtg g d}	|	j	|dgf|	j
|dgf|	j|d	|d
gf|	j|d	|d
gf|	j|d	|d
gfg}
|g|g|g|g|g|||||gg}|
D ]\}}|	  || }dd |	j D }|D ]}|	  |D ]}||	| q|| }t|}|D ]}||vrB|| qB|jtd dd |	j D }|jtd  ||dd||f    ||dd||f   qqd S )Nc                    s2    j tkr$d| j|< | j| r.|n
| | d S NT)r   rg   r   r%   Z_raise_error)r   flagr   r   r   raise_errorx  s
    


z7ContextFlags.test_flags_irrelevant.<locals>.raise_errorr"   r,  r   )r#   r   r   r$   r%   r   z100E-425000010r   r  z
9.87654321c                 S   s   g | ]\}}|r|qS r   r   r   kr   r   r   r   r     r   z6ContextFlags.test_flags_irrelevant.<locals>.<listcomp>r   c                 S   s   g | ]\}}|r|qS r   r   rr  r   r   r   r     r   z=operation produces different answers depending on flags set: zexpected %s, got %s.z9operation raises different flags depending on flags set: zexpected %s, got %s)r   r   r&   r{   r}   r   rx   r~   r'   r4   rR   rh   r'  rM  r   r   rO  r?  r   r   r   r   )r   r   r&   r{   r}   r   rx   r~   rq  r   Z
operationsZflagsetsfnr   r   r   extra_flagsrp  Znew_ansZexpected_flagsZ	new_flagsr   r   r   test_flags_irrelevantm  s\    	


z"ContextFlags.test_flags_irrelevantc                 C   s2  | j j}| j j}| j j}| }| |j|j | |j|j |j|_| |j|j | |j|j d|j|< |j|_| |j|j | |j|j i }||j | ||j | |j| d||< | ||j | |j| |di}| ||j | |j| dg}| ||j | |j| d S )NTFr  )	r   r&   r{   r}   r=  r   r%   r   update)r   r&   r{   r}   r  r   r   r   r   test_flag_comparisons  s4    
z"ContextFlags.test_flag_comparisonsc                 C   s  | j j}| j j}| j j}| }| |j|  |  | |dd | |j	|  |  | |
dd | |j	|  |  |d}| |j	|  | |d | |j	|  |  |d}| |j	|  | |d | |j	|  d|j|< |  | ||d | |j	|  |  | ||j
d | |j	|  |  |d}| |j	|  |  |d}| |j	|  W d    n1 s0    Y  d S )Ng      @T)r   r   r  r
  r  r%   r   r   r   r   r   r  r  r   )r   r   r  r
  r  r   r   r   r   test_float_operation  sD    





z!ContextFlags.test_float_operationc                    s8  j j j j}j jj j}dfdd	 d ddd d d	d	d

 d dtdtdd 	
fdd	}d fdd	}| }||Z}|j  ||d d ||d d d|j< ||d ||d W d    n1 s*0    Y  d S )Nc                    sN   |   t| |}| kr*||| n||d |j   d S ro  )r   r   r   r+  r   r   )r&  rE  r    r   signalr   )r  r   r   r   assert_attr  s    
z7ContextFlags.test_float_comparison.<locals>.assert_attrrG  rH  rJ  rI  r  r6  r"  r  r  r5  r3  r4  c                    s  dD ]}
|| | qdD ]}|| | q
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 dd| d  d S )	N)rc  re  )rd  rf  rg  rh  rK  r0  r  r2  )r<  )r  rz  r    )r   r{  big_dbig_finf_dinf_f	neg_inf_d	neg_inf_f
neg_zero_d
neg_zero_fsmall_dsmall_fzero_dzero_fr   r   doit)  s     z0ContextFlags.test_float_comparison.<locals>.doitc                    s   |    td dg}t|d | j  |    |r\|td dg ntd dg}| j  |    d ddfv }| j  |    d ddddiv }| j  d S )	Nr  z100.0r   r;  rp  g      $@r&  rE  )r   re   r   lenr   r   r   sorted)r  rz  r   rE  )r   r  r   r   r   test_containersG  s    z;ContextFlags.test_float_comparison.<locals>.test_containers)rz  T)N)N)N)r   r   r&   r  r
  r<  r  r%   )r   r&   r
  r  r  rK  r  r   )r   r  r{  r|  r}  r~  r  r  r  r  r  r   r  r  r  r  r   test_float_comparison  s6    	(

z"ContextFlags.test_float_comparisonc                 C   s   | j j}| j j}| j j}| j j}| }| |j|  | |j|  |  d|j|< d|j|< | 	|j|  | 	|j|  d S ro  )
r   r   r&   r{   r  r  r   r%   clear_trapsr   )r   r   r&   r{   r  r   r   r   r   test_float_operation_defaultf  s    

z)ContextFlags.test_float_operation_defaultN)	r   r   r   rv  rx  r   ry  r  r  r   r   r   r   rn  k  s   B&
5[rn  c                   @   s   e Zd ZeZdS )CContextFlagsNr   r   r   r   r   r  v  s   r  c                   @   s   e Zd ZeZdS )PyContextFlagsNr   r   r   r   r   r  x  s   r  c                   @   s    e Zd ZdZdd Zdd ZdS )SpecialContextszTest the context templates.c              
   C   s4  | j j}| j j}| j j}| j j}| j j}| j j}| j j}| j j}| j j	}	t
| |d|||||	g |  }
|j}|j}d }zzFd |_|_||fD ],}|| | }| || | |jd qW n* ty } z|j}W Y d }~n
d }~0 0 W ||_||_||
 |r0|n ||_||_||
 |r.|0 d S )Nr%   i  )r   BasicContextExtendedContextrH  r+   ry   rz   r|   r   rx   r!   rZ   r#   rY  r   	Exceptionr   )r   r  r  rH  r+   ry   rz   r|   r   rx   savecontextZbasic_context_precZextended_context_precextemplater  r   r   r   r   test_context_templates~  sF    
z&SpecialContexts.test_context_templatesc              
   C   s@  | j j}| j j}| j j}| j j}| j j}| j j}| j j}| j j}| 	|j
d | 	|j
d t| |d|||g |  }	|j
}
d }zzR| }|j
}d|_
| }| 	|j
| || | }| || | 	|j
d W n, ty } z|j}W Y d }~n
d }~0 0 W |
|_
||	 |r<|n|
|_
||	 |r:|0 d S )Nr"   r%   i  )r   r.  r  r  rH  r+   ry   rz   r|   r   r#   r!   rZ   rY  r  r   )r   r.  r  r  rH  r+   ry   rz   r|   r  Zdefault_context_precr  r  Zsaveprecr   r   r   r   test_default_context  sH    
z$SpecialContexts.test_default_contextN)r   r   r   r   r  r  r   r   r   r   r  {  s   $r  c                   @   s   e Zd ZeZdS )CSpecialContextsNr   r   r   r   r   r    s   r  c                   @   s   e Zd ZeZdS )PySpecialContextsNr   r   r   r   r   r    s   r  c                   @   s   e Zd Zdd ZdS )ContextInputValidationc              	   C   sB  | j j}| j j}| }dD ]F}t||d | t||d | tt||d | t	t||d qt|dd | t|dd | tt|dd | t	t|dd | t	t|d	d | t	t|d	d
 | t	t|d	d | t	t|d	d dD ]>}| tt||d | tt||d | t	t||g d q| t
t|dd | t	t|dg  | tt|di  | tt|dddi dD ]}| t
|j| q| t	t|d
 | t	t|d
 | jt	|dd | jt	|dd | jt|dd | jt|dd | jt|dgd | jt|dgd | jt	|dd | jt	|dd d S )Nr#   r   r  r   r  r   r  r   r   r   r  r$   r"   r;  r  r2   r   rW  rM  r   r%   ry   r   )r#   r   r   r$   r  r2   r   r%   r  r2   r  r   r   Qr%   r   r   )r   r   )r   r&   r.  rZ   r  r   r   r   r   r   r   KeyError__delattr__)r   r&   r.  r  r    r   r   r   test_invalid_context  sL    z+ContextInputValidation.test_invalid_contextN)r   r   r   r  r   r   r   r   r    s   r  c                   @   s   e Zd ZeZdS )CContextInputValidationNr   r   r   r   r   r    s   r  c                   @   s   e Zd ZeZdS )PyContextInputValidationNr   r   r   r   r   r    s   r  c                   @   s   e Zd Zdd ZdS )ContextSubclassingc                    s  | j j}j j}j}j}j}j}j}j	}j
}	G  fddd }
  }|
 }dD ]}| t||t|| qh| jt|
fi ddi |
dd}| |jd | |	|j|dd	 | jt|
fi d
di |
tdd}| |jt | ||dd | jt|
fi ddi |
ddd}| |jd ||d|d}| ||d |||||fD ]}| |j|  qx| jt|
fi ddi |
ddd}| |jd | ||j|d|d | j tkr
|||fD ]}| |j|  q| jt|
fi ddi |
d	d}| |jd	 |d}| ||d | jt|
fi ddi |
ddd }| |jd ||d}| t|d! | jt|
fi d"di |
||gd#}||fD ]}| |j|  q|   t! D ]}| "|j|  q| jt|
fi d$di |
||gd%}||fD ]}| |j#|  qB|$  t! D ]}| "|j#|  qjd S )&Nc                       s   e Zd Zd fdd	ZdS )z>ContextSubclassing.test_context_subclassing.<locals>.MyContextNc	           	         s    |  |d ur|| _|d ur&|| _|d ur4|| _|d urB|| _|d urP|| _|d ur^|| _ d urt tr fddt	   D   | _
d urttrfddt	  D | _d S )Nc                    s   i | ]}|| v qS r   r   r   r   r  r   r   
<dictcomp>5  r   z[ContextSubclassing.test_context_subclassing.<locals>.MyContext.__init__.<locals>.<dictcomp>c                    s   i | ]}|| v qS r   r   r  r  r   r   r  9  r   )r  r#   r$   r   r   r  r2   rJ  r?  r   r   r%   )	r   r#   r$   r   r   r  r2   r   r%   r&   r   r   r%   r   r  #  s*    


zGContextSubclassing.test_context_subclassing.<locals>.MyContext.__init__)NNNNNNNNr  r   r  r   r   	MyContext"  s      r  r#   r$   r   r   r  r2   r   r%   r#   r   r   r_  Z9e2r   r$   XYZ)r$   r#   r  r"   r   r   )r   r#   z1e-99z2.234e-2000r  r   )r   r#   Z1e99z
2.234e2000r  r  Z1E222z1e+222r2   r   c   )r2   r   z!1.000000000000000000000000000E+99r   r  r%   r  )%r   r   r&   rx   rz   r{   r|   r}   r~   r   ry   r   r   r   r   r#   r  r   rq   r$   r@  r   rh   r   r   r   rg   r  r   rV   r2   r   r   r   r  r%   r  )r   r   rx   rz   r{   r|   r}   r~   r   ry   r  r  r   r    r   rz  r   r  r   test_context_subclassing  s|    


z+ContextSubclassing.test_context_subclassingN)r   r   r   r  r   r   r   r   r    s   r  c                   @   s   e Zd ZeZdS )CContextSubclassingNr   r   r   r   r   r    s   r  c                   @   s   e Zd ZeZdS )PyContextSubclassingNr   r   r   r   r   r    s   r  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )CheckAttributesc                 C   s   |  tjtj |  tjtj |  tjtj |  tjtj | tjdu pVtjdu  | tjdu pptjdu  |  tj	tj	 |  t
tt
t d S )NTF)r   rg   r   r   r   rT  rU  r   r/  __version__dirr   r   r   r   test_module_attributes  s    z&CheckAttributes.test_module_attributesc                 C   sJ   dd t t D }dd t t D }| t|t| t  d S )Nc                 S   s"   g | ]}d |v s| ds|qS __r  r   r   r   r   r   r     r   z;CheckAttributes.test_context_attributes.<locals>.<listcomp>c                 S   s"   g | ]}d |v s| ds|qS r  r  r   r   r   r   r     r   )r  rg   r&   r   r   re   r   r   r	  r   r   r   test_context_attributes  s    z'CheckAttributes.test_context_attributesc                 C   sN   dd t tdD }dd t tdD }| t|t| t  d S )Nc                 S   s"   g | ]}d |v s| ds|qS r  r  r   r   r   r   r     r   z;CheckAttributes.test_decimal_attributes.<locals>.<listcomp>r"   c                 S   s"   g | ]}d |v s| ds|qS r  r  r   r   r   r   r     r   )r  rg   r   r   re   r  r   r   r   test_decimal_attributes  s    z'CheckAttributes.test_decimal_attributesN)r   r   r   r  r  r  r   r   r   r   r    s   r  c                   @   st   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S )Coveragec                 C   sH   | j j}| |d d | |d d | |d d d S )NZ	1234e9999i'  r2  r   r3  )r   r   r   r  r   r   r   r   test_adjusted  s    zCoverage.test_adjustedc                 C   sL   | j j}| j j}|d }| |d | }||d}| |d d S )Nr"   )r   r   rH  r  r   )r   r   rH  r   r  r   r   r   test_canonical  s    zCoverage.test_canonicalc                 C   sp   | j j }d|_d|_d|_t|_d|_d|_	t
| j  D ]}d|j|< d|j|< q:| }d}| || d S )Nr   r,  r   r   Fz{Context(prec=425000000, rounding=ROUND_HALF_DOWN, Emin=-425000000, Emax=425000000, capitals=0, clamp=1, flags=[], traps=[]))r   r.  rZ   r#   r   r   rs   r$   r  r2   r   r   r%   __repr__r   )r   r  r#  r   r   r   r   r   test_context_repr  s    
zCoverage.test_context_reprc                 C   sH  | j j}| j j}| }d|_d|_d|_| t|dd | |dd d | |dd d	 | |dd
 d | |d|ddd | 	|dd
d
 d | t|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  W d    n1 s0    Y  | j}d|_d d! }|| }| }| || | }| || | |d}| || W d    n1 s:0    Y  d S )"Nr   r   z-10r%  7r!  r  r   r   r  z1.2r  r  Tz1.01r  FZ20Z580r  r  r"   z2E+1z-1E+1z+Normalro  z1.12345r#  r  r   rs  i  i  )!r   r   r
  r#   r   r   r   r  r  r+  rB   powr   rC   rG   r  r  r  r>   rK   rL   rO   r5   rU   r   r?   r@   rF   rE   rH   r:   r;   r<   )r   r   r
  r  r   r	  r  r   r   r   r    s^    
2
zCoverage.test_implicit_contextc                 C   s  | j j}| j j}| j j}| j j}| }t|dd\}}| ||d | ||d t|dd\}}| | o|  d|j	|< t|dd\}}| | o|  d|j	|< |
  t|d|d\}}| | o|  | |j|  |
  t|dd	\}}| | o2|  | |j|  |
  t|d
d
\}}| | ot|  | |j|  d|j	|< |
  t|dd
\}}| | o|  | |j| o|j|  W d    n1 s0    Y  d S )NZ10912837129r  Z10901935Z194r  r  Fr3  r  r      )r   r   r
  ry   rz   r  r   r   rB   r%   r   r   rA   )r   r   r
  ry   rz   r  r  r>  r   r   r   r     sB    



zCoverage.test_divmodc                 C   s   | j j}| j j}| j j}| j j}| }d|_|  | |dd |d | |j	|  d|_d|_
d|_|  d|j|< | |d|d	 |d
 | |j	|  W d    n1 s0    Y  d S )Nr  r  rM  r  r   r   Frs  r  r3  )r   r   r
  r|   r}   r#   r   r   r   r   r   r   r%   )r   r   r
  r|   r}   r  r   r   r   rD  E  s     
zCoverage.test_powerc                 C   s~   | j j}| j j}| j j}| L}d|_d|_d|_d|j|< |d|d}| 	|
  W d    n1 sp0    Y  d S )Nr   r   Fr  Z1e1)r   r   r
  ry   r#   r   r   r%   r  r   rB   r   r   r
  ry   r  r   r   r   r   r  Y  s    
zCoverage.test_quantizec                 C   s>   | j j}| j j}| }| |d d | | d d S )Nr#  r%  )r   r   rH  r   r  r  r   r   r   
test_radixf  s
    zCoverage.test_radixc                 C   s0   | j j}dD ]}| t|d|dt qd S )N)rl  ro  rr  ru  rb  rx  rz  r|  r#  r  )r   r   r+  r   rN  )r   r   r    r   r   r   r  n  s    zCoverage.test_ropc                 C   s   | j j}| j j}| }d|_| t|d d | t|d d | t|ddd | t|d	d
d | t|d	dd | t|djd | t|djdd W d    n1 s0    Y  d S )NrA  r  r  z9.99e-5r   r  r   z1.23457r  r%  z1.2345000000r`  z0E+10r  r  r!  )	r   r   r
  r#   r   r   	__round__r   r   )r   r   r
  r  r   r   r   
test_roundu  s    zCoverage.test_roundc                 C   s    | j  }| t|jdg d S )Nrv  )r   r&   r   r   r   )r   r  r   r   r   test_create_decimal  s    
zCoverage.test_create_decimalc                 C   st   | j j}| j j}| J}d|_|dd dd  }| t|d | | d W d    n1 sf0    Y  d S )Nr  i  i  r%  iS  r   r   )r   r   r
  r#   r   r   r  r   r   r
  r  r   r   r   r   r    s    zCoverage.test_intc                 C   sl   | j j}| }d|_dd  }||}| ||  ||}| ||  ||d}| ||  d S )Nrs  i  i  r   )r   r&   r#   r:   r   r;   r<   )r   r&   r  r   r	  r   r   r   r    s    


zCoverage.test_copyN)r   r   r   r  r  r  r  r   rD  r  r  r  r  r  r  r  r   r   r   r   r    s   Q)
r  c                   @   s   e Zd ZeZdS )	CCoverageNr   r   r   r   r   r    s   r  c                       s,   e Zd ZeZ fddZ fddZ  ZS )
PyCoveragec                    s"   t    t | _td d S r  r  r   r  r   r   r     s    

zPyCoverage.setUpc                    s   t | j t   d S r   r  r   r  r   r   r    s    zPyCoverage.tearDownr  r   r   r  r   r    s   r  c                   @   s   e Zd ZdZdd ZdS )PyFunctionalityz!Extra functionality in decimal.pyc                 C   s>   t j}t j}g d}|D ] \}}}| t|||| qd S )N)
)z.0er  z1e+0)z#.0er  z1.e+0)r  r  r#  )z#.0fr  1.)r  1.1r  )z#gr  r  )r  r#  r#  )z#.0gr#  r  )r  r  z100%)z#.0%r  z100.%)r   r   r
  r   r  )r   r   r
  rP  r  r   r   r   r   r   test_py_alternate_formatting  s
    z,PyFunctionality.test_py_alternate_formattingN)r   r   r   r   r  r   r   r   r   r    s   r  c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )
PyWhiteboxz White box testing for decimal.pyc                 C   s   t j}t j}| }d|_|d|d }| ||d |d|d }| ||d |d|d }|d|d	 }| ||d
 |d|d	 }|dd |d	 }d|_|d|d }d|_|dd |d }W d    n1 s0    Y  d S )Nr!  i   r  z
0.00390625z-0.6z0.0012885819Z256e7l   o z-0.0625r  Z152587890625e7r   ic
  r   Z152587890625   r   iB  )r   r   r
  r#   r   r  r   r   r   test_py_exact_power  s"    zPyWhitebox.test_py_exact_powerc                    s:  t j}t j}t j}| }tdd tt  D |_|| |d|d |d|dd4 fdd	}| j	 j	 j
 j
 j j |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
 |d0d
 |d1 |d2 |d3 d S )5Nc                 s   s   | ]}|d fV  qdS )r   Nr   r   r   r   r   r     r   z=PyWhitebox.test_py_immutability_operations.<locals>.<genexpr>z-25e55z33e+33Fc                    s   |rvt d|  d  j j j j j j jj jj jj n@t d|  d  j j j j j j d S )Nzd1.z(d2)z())r   r   _sign_int_exp)Z	operationZuseOtherb1b2r  r  r   r   r   checkSameDec  s    z@PyWhitebox.test_py_immutability_operations.<locals>.checkSameDec__abs__rk  Tra  rg  rh  re  rc  rf  rd  	__float__ry  r]  __int__	__trunc__rw  rq  __neg____bool____pos__r{  rl  rb  r  rz  rx  rr  r|  ro  __str__rn  rt  r  r  r  rx  rw  rO   r  rP   rQ   rR   rS   r  )F)r   r   r.  r+   rZ   r(   r   r%   r   r  r  r  )r   r   r.  r+   r  r  r   r  r   test_py_immutability_operations  st    


























z*PyWhitebox.test_py_immutability_operationsc                 C   s>   t j}|d}||}| t|d | t|t| d S )Nr   r   )r   r   r   r   r=  r   r.  r   r   r   test_py_decimal_id7  s
    zPyWhitebox.test_py_decimal_idc                 C   sT   t j}t j}| .}|ddt}| |  W d    n1 sF0    Y  d S )Nr  r  )r   r   r
  Z_rescaleru   r   rB   r  r   r   r   test_py_rescale?  s
    zPyWhitebox.test_py_rescalec                 C   s    t j}| t|djdt d S )Nz3.1234r   )r   r   r   r   Z_roundru   r   r   r   r   test_py__roundH  s    zPyWhitebox.test_py__roundN)	r   r   r   r   r  r  r  r  r  r   r   r   r   r    s   O	r  c                   @   s4   e Zd ZdZedd Zedd Zedd ZdS )	CFunctionalityzExtra functionality in _decimalc                 C   s  t j}t j}t j}t j}dd }||}| |jd | |jd | |jd || | ||}| |jd | |jd | |jd || | ||}| |jd	 | |jd
 | |jd || | | 	t
|d | 	t|d | 	t|d d S )Nc                 S   s.   |  |jd t| |dg  t| |dg  d S )Nr   r%   r   )r   r2   r!   )r   r   r   r   r   assert_restY  s    z7CFunctionality.test_c_ieee_context.<locals>.assert_restr  `   ird  rb  rd  "   i   irD  r   i   )rg   IEEEContext	DECIMAL32	DECIMAL64
DECIMAL128r   r#   r   r   r   r  r   )r   r  r  r  r  r  r  r   r   r   test_c_ieee_contextQ  s.    


z"CFunctionality.test_c_ieee_contextc                 C   s:   t j}|t jt jd}| |jt j | |jt j d S )Nr  )rg   r&   r/   
DecRoundedr   _flags_trapsr  r   r   r   test_c_contextu  s    zCFunctionality.test_c_contextc                 C   s  t jt jt jt jt jt jt jt jt j	t j
t jt jt jt jt jf}| t jd | t jd | t jd | t jd t|D ]\}}| |d|>  q| t jt jt jB t jB t jB t jB t j	B t j
B  | t jt jt jB  | t jt jt jB t jB  d S )Nr   rl     i   r   )rg   r/   DecConversionSyntaxDecDivisionByZeroDecDivisionImpossibleDecDivisionUndefinedDecFpuError
DecInexactDecInvalidContextDecInvalidOperationDecMallocErrorDecFloatOperationDecOverflowr  DecSubnormalDecUnderflowr   r  r  r  ZIEEE_CONTEXT_MAX_BITSr   DecIEEEInvalidOperationZ	DecErrorsZDecTraps)r   condr   r   r   r   r   test_constants}  sH    
	zCFunctionality.test_constantsN)r   r   r   r   requires_extra_functionalityr  r  r  r   r   r   r   r  N  s   
#
r  c                   @   s   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	e
dd Zdd Ze
dd Zdd Zdd Zdd Zdd Zdd Ze
dd Ze
d d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zeejd,d-eed.d.d/d0d1d2 Z d3S )4	CWhiteboxzWhitebox testing for _decimalc                 C   s   t j}t j}dd }dd }| `}d|_tdD ]@}t||}tdd}|| }	|||| }
| |	|
 q2W d    n1 s0    Y  d S )Nr%  #   $   i@B r   r  i  )rg   r   r
  r#   r   r   r  r   )r   r   r
  r  r  r  r   r&  rE  r   r	  r   r   r   test_bignum  s    zCWhitebox.test_bignumc                 C   s   |  ttjdd d S )Nr"   r  )r   r   rg   r   r   r   r   r   test_invalid_construction  s    z#CWhitebox.test_invalid_constructionc                 C   sT   t j}t j}t j}t j}||  | ||d W d    n1 sF0    Y  d S )NZ1e9999999999999999999)rg   r   ry   r&   r
  r   )r   r   ry   r&   r
  r   r   r   test_c_input_restriction  s    z"CWhitebox.test_c_input_restrictionc                 C   s   t j}t j}| }d|_d|_d|_t|_d|_	d|_
tt  D ]}d|j|< d|j|< q@d|j|< d|j|< | }d}| || d S )Nr   r,  r   r   TaQ  Context(prec=425000000, rounding=ROUND_HALF_DOWN, Emin=-425000000, Emax=425000000, capitals=0, clamp=1, flags=[Clamped, InvalidOperation, DivisionByZero, Inexact, FloatOperation, Overflow, Rounded, Subnormal, Underflow], traps=[Clamped, InvalidOperation, DivisionByZero, Inexact, FloatOperation, Overflow, Rounded, Subnormal, Underflow]))rg   r.  r  rZ   r#   r   r   rs   r$   r  r2   r   r   r%   r  r   )r   r.  r  r  r#  r   r   r   r   r   test_c_context_repr  s"    


zCWhitebox.test_c_context_reprc              	   C   s  t j}t j}t j}t j}t j}t j}t j}t jdk}| }	| 	t
|	jjdd | 	t
|	jjdd | 	t|	jj| | 	t|	jj| | 	tt|	ddg | 	tt|	ddg | 	t
t|	dddi | 	t
t|	dddi |	j }
|
|= d	|
d
< | 	t
t|	d|
 | 	t
t|	d|
 |r dnd}|r.dnd}dD ]}| 	tt|	|| q6| 	tt|	d|  | j	t||d | j	t||d | j	t|| d | j	t||d d | j	t||d d | j	t|| d d | j	t||d d | j	t||d d dD ]j}| 	tt|	||d  | 	tt|	|| d  tjdkr | 	tt|	|| | 	tt|	|| d  q t jdkr| 	tt|	d|d  | 	tt|	d|d  | 	tt|	d| d  t jdkrF| 	tt|	dd | 	tt|	dd | 	tt|	dd | 	tt|	dd | 	tt|	dd | 	tt|	dd dD ]j}| 	tt|	|d | 	tt|	|d | 	tt|	|g d  |rJ| 	tt|	|d! | 	tt|	|d" qJ| 	ttd#t  | 	ttd$t  | }| 	t|d% || d S )&Nr   i!  r   r   r   r%   r	  r   ipr  rC  rB  l     NZoi ʚ;r  r   r_  rc  )r   r   r  r  )r#   r   r   r  r2   win32r   r   r   i?r   i9r  r                 zwith localcontext("xyz"): passz-with localcontext(context=getcontext()): passr  )rg   r&   ry   r|   r  r
  rH  r+   r   r   r  r   __setitem__r%   r   __delitem__r   r  rZ   r  r  platformr   execrW  )r   r&   ry   r|   r  r
  rH  r+   HAVE_CONFIG_64r  r   int_maxZgt_max_emaxr    Zsaved_contextr   r   r   test_c_context_errors  s    


zCWhitebox.test_c_context_errorsc                 C   s   |  tjtj |  tjtj |  tjtj |  tjtj |  tjtj |  tjtj |  tj	tj	 |  tj
tj
 d S r   )r+  rg   ru   r   rq   rp   rr   rt   rs   r'   rv   r   r   r   r   test_rounding_strings_internedG  s    z(CWhitebox.test_rounding_strings_internedc              	   C   s  t j}t j}t j}t j}t j}t j}t jdk}| }|r<dnd}	| t	t
|d|	d  | t	t
|d|	 d  tjdkr| tt
|d|	 | tt
|d|	 d  dD ]f}
| t	t
||
|	d  | t	t
||
|	 d  tjdkr| tt
||
|	 | tt
||
|	 d  q| tt
|dd	 | tt
|dd | tt
|dg d
 |rr| tt
|dd | tt
|dd dD ]*}
| tt
||
d | tt
||
d qvd S )Nr   rC  rB  _allcrr   r   r  )r  r  r   r  r  r  r  r   )rg   r&   ry   r|   r
  rH  r+   r   r   r  r  r  r  r   r   )r   r&   ry   r|   r
  rH  r+   r  r  r  r    r   r   r   test_c_context_errors_extraR  s:    


z%CWhitebox.test_c_context_errors_extrac                 C   s  t j}t j}t j}t j}t j}t j}| }d|_t	|_
d|_d|_d|_d|_| |jd | |j
t	 | |jd | |jd | |jd | |jd | | d | | d t jdkr|d	 |d	 |d
 | |jd	 | |jd	 | |jd
 d S )Nr  i  iHr   r   i'i  r   rP  rQ  )rg   r.  rx   r   r{   r}   r~   rZ   r#   rt   r$   r   r   r  r2   r   ZEtinyZEtopr   r   r   r   )r   r.  rx   r   r{   r}   r~   r  r   r   r   test_c_valid_context}  s8    


zCWhitebox.test_c_valid_contextc                 C   s4   t j}| }| |jd d|_| |jd d S )Nr   r   )rg   r.  rZ   r   r  )r   r.  r  r   r   r   test_c_valid_context_extra  s
    z$CWhitebox.test_c_valid_context_extrac                 C   s   t j}t j}t j}t j}t j}t jdkr,dnd}| }d|j|< | ||dj	| d  | ||dj	| | ||dj	t
|d  | t j|dj	t
|d   | t|dj	| d  | t|dj	|d  W d    n1 s0    Y  d S )	Nr   rC  rB  Tr  r   r#  r   )rg   r   ry   r
  r   rU  r   r%   r   r  r   r  )r   r   ry   r
  r   rU  r  r  r   r   r   test_c_round  s4    

zCWhitebox.test_c_roundc                 C   s   t j}t jdk}| t|djdg d | t|djdd | t|djg  | t|djd |rndnd}| t|djd	|  d S )
Nr   r   z=10.10r"   z<>=10.10rC  rB  r  z=%d.1)rg   r   r   r   r   r  r   )r   r   r  maxsizer   r   r   test_c_format  s    
zCWhitebox.test_c_formatc                 C   sf  t j}t j}t j}|d}| | d | t|jd | t|jdd | t|jd | | d | t|jd | t|jdd | t|jd | |	 d | t|j	d | t|j	dd | t|j	d | j}|dt
}| ||d |d	t
}| ||d d|j|< | ||dj	t
 W d    n1 sX0    Y  d S )Nr%  r  r   z99999999999999999999999999.9Z100000000000000000000000000Tz999.9)rg   r   r{   r
  r   r  r   r   rT   rU   ru   r%   )r   r   r{   r
  r   r  r   r   r   test_c_integral  s.    
zCWhitebox.test_c_integralc              	   C   sT  t j}t j}t j}t j}t j}| |d d | t	t
|ddd | t	|djdd | t	|djd	dd | t	|d
j|dg  | t	|d
j|d|  | t	|d
j|dd | t	|d
j|dtd | T}|  | t	|j|ddd | t	|jd | t	|jd | t	|jdddd | t	|jdd	dd | t||dd | | d d|j|< | ||djd | ||jdd | |j|  |  d|j|< | ||djd | ||jdd | |j|  d|j|< d|_| |t
|ddd W d    n1 sF0    Y  d S )Nz9.99e10z99.9E+9r   r   r  r"   r   r	  r  r  z	1e-100000r%  r  r8  r!  Z200Tr   i  )rg   r   ry   rz   rH  r
  r   rS   r   r   r  r5   rQ   r  ru   r  r<   r  r?   r  r   r  r%   ra  r   r   r   r#   )r   r   ry   rz   rH  r
  r  r   r   r   test_c_funcs  s\    



zCWhitebox.test_c_funcsc                 C   s  t j}t j}|d}dD ]0}t||}| jt|dd | jt|dd d qdD ]0}t||}| jt|dd | jt|dd d qN| jt|jd g d | jt|ji g d | t|jg g  | jt|jd g d | jt|ji g d | t|jg g  | jt|jd g d | jt|ji g d | t|jg g  | jt|j	dddd | jt|j	dddd d | jt|j
dg d d | jt|j
dg d d	 | t|j
dg g  | }| jt|jdddd
 | jt|jddd d
 | jt|jddd d
 d S )NZ10001111111)r   rC   rG   r  r  r  r>   rK   rL   rO   r5   rR   rS   r   r  )r  r6   r3   rN   rx  rI   rw  rJ   rP   r  r  r  r  r   r   r  )mod)rg   r   r&   r   r   r   r  rT   rU   r  r  rC  )r   r   r&   r   r    funcr  r   r   r   test_va_args_exceptions,  s:    

z!CWhitebox.test_va_args_exceptionsc                 C   sL   |  tjjtjtjB tjB tjB tjB  |  tj	jtjtjB tjB  d S r   )
r   rg   r  r  r  r  r  r  r/   r.  r   r   r   r   test_c_context_templatesX  s    z"CWhitebox.test_c_context_templatesc           &         s"  t j}t j}t j}t j}t j}t j}t j}t j}t j	}	t j
}
t j}t j}t j}t j} fdd}| } ||jv  |  |j D ]}d|j|< q|j D ]} | q|  |j D ]\}} | qƈ |j|  |jdd   |jddd  t|jjddd  t|jt|j t|j}t|j}|j  }|!  ||_" |j|  |  ||_# |j|  |!  |j }d||< ||_|||j |  |j }d||< ||_|||j |t j|	t j$|
t j%|t j&|t j'|t j(|t j)|t j*|t ji	}t j+t j,t j-t j.t jt j/t j0g}tt1t  }t2|D ]V}t2|D ]D}t3D ]6}t45t1t  |}t45t1t  |}t46dd}t46d	d
}t46d
d}t46d
d} t46d
d}!t46d
d}"||||||!| t7|t7|d} |j8|  |j9|  |j:|  |j;|  |j<|!  |j=|  d
}#|D ]}$|#||$ O }#qj |j"|# d
}#|D ]}$|#||$ O }#q |j#|# qqvqh|D ](}%|%|_" |j"|@  |||j q|D ](}%|%|_# |j#|@  |||j qd S )Nc                    s4   |D ]*}|| kr   ||  q ||  qd S r   )r   r  )rz  Zsignal_dictr#  r   r   r   assertIsExclusivelySety  s    z<CWhitebox.test_c_signal_dict.<locals>.assertIsExclusivelySetTr   r	  r  r   rs  ir   r   r  )>rg   r&   r.  ry   r  rz   r|   r~   r   r}   r{   rx   r/   r   r  rZ   r   r%   r  r  valuesrO  r  r   r   r+  r   r   r   r  r  	getsizeofr  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r  r   sampler  r?  r#   r$   r   r   r  r2   )&r   r&   r.  ry   r  rz   r|   r~   r   r}   r{   rx   r/   r   r  r)  r  rs  r   r   r   Z
IntSignalsZIntCondZlimr>  r   r  r   r%   r#   rX  rW  r2   r  Zcrr   r   r  r   r   r   test_c_signal_dictd  s    





zCWhitebox.test_c_signal_dictc                    s   t j zddlm} W n ty2   | d Y n0 dd }d fdd	}d	|g d
d	d}d|g dd	d}d|g ddd}|dkr| t|d|d | t|d|d | t|d|d d S )Nr   r  r  c                 S   s   d dd | D S )Nr   c                 S   s   g | ]}t |qS r   r  r   r   r   r   r     r   zJCWhitebox.test_invalid_override.<locals>.make_grouping.<locals>.<listcomp>)r  r  r   r   r   r    s    z6CWhitebox.test_invalid_override.<locals>.make_groupingr   c                    s    |  ||S r   )r  r  ra  r   r   r    s    z0CWhitebox.test_invalid_override.<locals>.get_fmtr  )   r.  r   r  Zxxxxxr  r  Zyyyyy   r  r  )Nr   )rg   r   r  r  r  r  r   r   )r   r  r  r  Zinvalid_groupingZinvalid_dotZinvalid_sepr   ra  r   test_invalid_override  s2    



zCWhitebox.test_invalid_overridec                 C   s   t j}t j}t j}| }d|j|< dtj }| ||| dtj d  }| ||| dtj }| ||| dtj d  }| ||| W d    n1 s0    Y  d S )NTz0e%dr   z1e%d)rg   r   r
  ry   r%   r  r!  r   r  r   r   r   test_exact_conversion  s    


zCWhitebox.test_exact_conversionc                 C   s  t j}t j}t j}t j}t j}| }d|j|< d|j|< d|j|< ddtjf}| 	t
||d | ||| ddtjf}| ||j| | ||| ddtj d f}| 	t
||d | ||| ddtj d f}| ||j| | ||| ddtjd f}| t|j| | t|| ddtj d f}| t|j| | t|| d}| 	t
||d	 d
}| 	t
||d	 d}| 	t
||d W d    n1 s0    Y  d S )NTr   r   z
-0E+999999)r   r   r   z-0E-1000007r   r  r  )r   r  r  )r   r  r  z-sNaN1)rg   r   r
  ry   r|   r   r%   r  r!  r   r   r   r   r  )r   r   r
  ry   r|   r   r  r   r   r   r   test_from_tuple'  sB    



zCWhitebox.test_from_tuplec                 C   s   t j}t jdk}| |d d |rZ|dd  }|dd  }| ||d  n0|dd  }|dd  }| ||d	  d S )
Nr   r   r%  r@  i  r!        r  )rg   r   r   r9  
__sizeof__r   )r   r   r  r   r	  r   r   r   test_sizeofW  s    
zCWhitebox.test_sizeofc                    sz   t j}G dd dt}G dd dt}G dd dt G  fdddt}|||fD ] }| ||d	|d	 qTd S )
Nc                   @   s   e Zd Zdd Zdd ZdS )z<CWhitebox.test_internal_use_of_overridden_methods.<locals>.Xc                 S   s   dS Nr   r   r   r   r   r   r  j  s    zMCWhitebox.test_internal_use_of_overridden_methods.<locals>.X.as_integer_ratioc                 S   s   | S r   r   r   r   r   r   r  l  s    zDCWhitebox.test_internal_use_of_overridden_methods.<locals>.X.__abs__Nr   r   r   r  r  r   r   r   r   Xi  s   r9  c                   @   s   e Zd Zdd ZdS )z<CWhitebox.test_internal_use_of_overridden_methods.<locals>.Yc                 S   s
   dgd S Nr   r8  r   r   r   r   r   r  p  s    zDCWhitebox.test_internal_use_of_overridden_methods.<locals>.Y.__abs__N)r   r   r   r  r   r   r   r   Yo  s   r;  c                   @   s   e Zd Zdd ZdS )z<CWhitebox.test_internal_use_of_overridden_methods.<locals>.Ic                 S   s
   dgd S r:  r   r   r   r   r   
bit_lengtht  s    zGCWhitebox.test_internal_use_of_overridden_methods.<locals>.I.bit_lengthN)r   r   r   r<  r   r   r   r   Is  s   r=  c                       s    e Zd Z fddZdd ZdS )z<CWhitebox.test_internal_use_of_overridden_methods.<locals>.Zc                    s    d dfS r7  r   r   r=  r   r   r  x  s    zMCWhitebox.test_internal_use_of_overridden_methods.<locals>.Z.as_integer_ratioc                 S   s   | S r   r   r   r   r   r   r  z  s    zDCWhitebox.test_internal_use_of_overridden_methods.<locals>.Z.__abs__Nr8  r   r>  r   r   Zw  s   r?  gfffffFY@)rg   r   r<  r   r   r  )r   r   r9  r;  r?  r   r   r>  r   'test_internal_use_of_overridden_methodse  s    z1CWhitebox.test_internal_use_of_overridden_methodsZaixzEAIX: default ulimit: test is flaky because of extreme over-allocationT)addressZmemoryzVASAN/MSAN sanitizer defaults to crashing instead of returning NULL for malloc failure.c                 C   s\  g d}t j}t j}t j}|t jt jt jd}|| | |d d | |d	 d | |d
 d | |d
 d | |dd 
 d | |d	 d
 | |d d | |d |d | t|ddd | |dd d | |dd d | |dd |d W d    n1 sN0    Y  d S )N)	r>   rK   rL   r3   rN   rW   rM   r  r  )r#   r   r   r   r   rM  r   r%     l     9V    r  Z40E9z2.0E+5r  )r  r   i  r   z0.0025)rg   r   r&   r
  r   rT  r   r   r   r  r  r  rR   r  )r   ZMaxContextSkipr   r&   r
  Z
maxcontextr   r   r   test_maxcontext_exact_arith  s$    z%CWhitebox.test_maxcontext_exact_arithN)!r   r   r   r   r  r  r  r  r  r  r	  r  r  r  r   r"  r#  r$  r'  r(  r-  r0  r1  r2  r6  r@  r   skipIfr  r  r   r   rD  r   r   r   r   r
    sD   e
*&
;,

 %0r
  ztest requires C versionc                   @   s    e Zd ZdZdd Zdd ZdS )SignatureTestzFunction signaturesc           
      C   s   t tD ]}|drqtt|}tt|}|dksF|dksFt|rt|}t|}t|j	
 }dd |j	
 D }| j||d| d dd |j	 D }d	d |j	 D }	|d
kr| j||	d| d qd S )Nr  r   r&   c                 S   s   g | ]}| d s|qS )r  r  r   r   r   r   r     s   
z5SignatureTest.test_inspect_module.<locals>.<listcomp>parameter name mismatch in %smsgc                 S   s   g | ]
}|j qS r   kindr   r   r   r   r     r   c                 S   s$   g | ]}|d   ds|d jqS )r   r  r   )r   rK  r   r   r   r   r     s   r+   parameter kind mismatch in %s)r  r   r   r   rg   inspect
isfunction	signaturer?  
parametersr  r   r*  rO  )
r   r    p_funcc_funcp_sigc_sigc_namesp_namesc_kindp_kindr   r   r   test_inspect_module  s*    




z!SignatureTest.test_inspect_modulec                    s  t jj t jjttdtdtdtdtdtdtdtdtdtdddtjt dttdtdtdtdtdtdtdddtjt di fdddd	  fd
d}|d |d d S )Nr   r#  r;  )r`  r  r   r	  r  r&  rE  r  r   rB  numr   r$   r   )r`  r  r&  rE  r  r   rB  rZ  r   r$   r   c                    sp   g }i }|j  D ]T\}}|dkr$q|j krB||  |  q|jkr^|  | ||< qtdq||fS )Nr   zunexpected parameter kind)rP  rO  rK  r   r   )moduler#  r   kwargsnameZparam)POSPOS_KWDpdictr   r   mkargs  s    



z0SignatureTest.test_inspect_types.<locals>.mkargsc                 S   s(   | dkrdS | dkrdS | dkr$dS | S )zwThe C Context docstrings use 'x' in order to prevent confusion
               with the article 'a' in the descriptions.r   r&  r	  rE  r  r  r   )r   r   r   r   tr  s    z,SignatureTest.test_inspect_types.<locals>.trc              	      s  t t| }t t| }t|D ]}|dr.qt ||}t ||}t|rt|}t|}t|j	
 }fdd|j	
 D }	j|	|d| d dd |j	 D }
dd |j	 D }|
d  |d   | d	krj|d
d  |
d
d  d| d njt|t|
d| d t|\}}zt |d||i | W n& ty~   td|||f Y n0 t|\}}zt |d||i | W q ty   td|||f Y q0 qd S )Nr  c                    s   g | ]} |qS r   r   r   )rb  r   r   r     r   zBSignatureTest.test_inspect_types.<locals>.doit.<locals>.<listcomp>rG  rH  c                 S   s   g | ]
}|j qS r   rJ  r   r   r   r   r     r   c                 S   s   g | ]
}|j qS r   rJ  r   r   r   r   r     r   r   r   r   rL  r"   zinvalid signature for %s: %s %s)r   r   rg   r  r   rM  rN  rO  r?  rP  r  r   r*  r+  r  r  r   )tyZp_typeZc_typer    rQ  rR  rS  rT  rV  rU  rX  rW  r   kwds)r^  r_  ra  r   rb  r   r   r     sH    








z.SignatureTest.test_inspect_types.<locals>.doitr   r&   )	rM  Z_ParameterKindZPOSITIONAL_ONLYZPOSITIONAL_OR_KEYWORDrg   r   rt   rH  r   )r   r  r   )r^  r_  ra  r`  r   rb  r   test_inspect_types  sF    

/z SignatureTest.test_inspect_typesN)r   r   r   r   rY  re  r   r   r   r   rF    s   rF  r   r   c              
   C   s  t t t t | dur| ntda|a|du r6t}nttg}t	
tD ]l}d|vsH|dr`qH|d\}}|dur||vrqH|fdd}ttd| | ttd| | ~~~~qHzt|  |du rdd	lm}	 tjd }
trttjd< tt||	d
 ttjd< tt| |
tjd< W tr0ttt  ttt  tsPtdt ttjd urtdnNtr~ttt  ttt  tstdt ttjd urtd0 dS )z Execute the tests.

    Runs all arithmetic tests if arith is True or if the "decimal" resource
    is enabled in regrtest.py
    Nr   z.decTestr  c                 S   s   |  t| S r   )r   	directory)r   r   r   r   r   r   j  r   ztest_main.<locals>.<lambda>Ztest_r   )IGNORE_EXCEPTION_DETAIL)Zoptionflagsz*C tests skipped: no module named _decimal.zGInternal error: unbalanced number of changes to sys.modules['decimal'].)r-   rg   r   r   r   r   	all_testsr   r   oslistdirrf  r   r   r  r   doctestrg  r  r  r   r+   ORIGINAL_CONTEXTwarningswarnUserWarningorig_sys_decimalr   )arithverbose
todo_testsdebugZtest_classesfilenameheadtailZtesterrg  r  r   r   r   	test_mainO  sX    






rx  z:test_decimal.py [--debug] [{--skip | test1 [test2 [...]]}]z--debugz-d
store_truez2shows the test number and context before each test)actionhelpz--skipz-sz%skip over 90% of the arithmetic tests)rq  rr  )rq  rr  rs  rt  )NNNN)r   r  ri  r  r  rm  r  rZ   r   r  r  Ztest.supportr   r   r   r   r   r   r   r	   r
   r   r   r   rM  r0  r  rg   r   r   rp  Z
cfractionsr  Z
pfractionsr   r  rH  r   r  r*   rx   r}   r{   r~   r   r|   rz   ry   r  r   r!   ru   rq   rp   rr   rt   rs   r'   rv   r  rl  r-   ZTESTDATADIRr   argvr   __file__pathdirnamecurdirZtestdirseprf  isdirr   r   hasattrZEXTRA_FUNCTIONALITYZ
skipUnlessr	  rE  Zskip_if_extra_functionalityZTestCaser0   r   r   r   rS  rT  rU  r  r  r  r  r  r  r  r  r$  r)  r*  r5  r6  r7  r  r  r  r  r  r  rS  rT  rU  rl  rm  rn  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r
  rF  rh  insertrx  ZoptparseZOptionParserr  Z
add_option
parse_argsoptr   skiprt  r   r   r   r   <module>
   s  4



	
  e  WM    )',-      /  X     m~  P>m   U      
 	
7

