a
    ze]v                     @   s   d Z ddlmZ ddlm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 ddlmZmZ ejZG dd deZG d	d
 d
eZG dd dejZdd ZG dd dejZedkre  dS )zTests for Lib/fractions.py.    )Decimal)requires_IEEE_754N)copydeepcopy)dumpsloadsc                   @   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eZdS )
DummyFloatz8Dummy float class for testing comparisons with Fractionsc                 C   s   t |tstd|| _d S )Nz-DummyFloat can only be initialized from float)
isinstancefloat	TypeErrorvalueselfr    r   )/usr/lib/python3.9/test/test_fractions.py__init__   s    
zDummyFloat.__init__c                 C   s>   t |tjr|t| j|S t |tr6|| j|jS tS d S N)r	   numbersRationalF
from_floatr   r   NotImplemented)r   otheropr   r   r   _richcmp   s
    
zDummyFloat._richcmpc                 C   s   |  |tjS r   )r   operatoreqr   r   r   r   r   __eq__!       zDummyFloat.__eq__c                 C   s   |  |tjS r   )r   r   ler   r   r   r   __le__"   r   zDummyFloat.__le__c                 C   s   |  |tjS r   )r   r   ltr   r   r   r   __lt__#   r   zDummyFloat.__lt__c                 C   s   |  |tjS r   )r   r   ger   r   r   r   __ge__$   r   zDummyFloat.__ge__c                 C   s   |  |tjS r   )r   r   gtr   r   r   r   __gt__%   r   zDummyFloat.__gt__c                 C   s   dsJ dd S )NFz/__float__ should not be invoked for comparisonsr   r   r   r   r   	__float__(   s    zDummyFloat.__float__c                 C   s   dsJ dd S )NFz-__sub__ should not be invoked for comparisonsr   r   r   r   r   __sub__,   s    zDummyFloat.__sub__N)__name__
__module____qualname____doc__r   r   r   r!   r#   r%   r'   r)   r*   __rsub__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S )DummyRationalzATest comparison of Fraction with a naive rational implementation.c                 C   s$   t ||}|| | _|| | _d S r   )mathgcdnumden)r   r3   r4   gr   r   r   r   4   s    
zDummyRational.__init__c                 C   s,   t |tjr$| j|jko"| j|jkS tS d S r   )r	   	fractionsFractionr3   
_numeratorr4   _denominatorr   r   r   r   r   r   9   s
    
zDummyRational.__eq__c                 C   s   | j |j | j|j k S r   r3   r9   r4   r8   r   r   r   r   r#   @   s    zDummyRational.__lt__c                 C   s   | j |j | j|j kS r   r:   r   r   r   r   r'   C   s    zDummyRational.__gt__c                 C   s   | j |j | j|j kS r   r:   r   r   r   r   r!   F   s    zDummyRational.__le__c                 C   s   | j |j | j|j kS r   r:   r   r   r   r   r%   I   s    zDummyRational.__ge__c                 C   s   dsJ dd S )NFz__float__ should not be invokedr   r(   r   r   r   r)   N   s    zDummyRational.__float__N)r+   r,   r-   r.   r   r   r#   r'   r!   r%   r)   r   r   r   r   r0   1   s   r0   c                   @   s   e Zd ZdZdS )DummyFractionz6Dummy Fraction subclass for copy and deepcopy testing.N)r+   r,   r-   r.   r   r   r   r   r;   Q   s   r;   c                 C   s   | j | jfS r   )	numeratordenominator)rr   r   r   _componentsU   s    r?   c                   @   s   e 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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%dES )FFractionTestc                 C   s$   |  t|t| |  || dS )z4Asserts that both the types and values are the same.N)assertEqualtyper   Zexpectedactualr   r   r   assertTypedEquals[   s    zFractionTest.assertTypedEqualsc                 C   s0   |  || | ttt|ttt| dS )zBAsserts that both the types and values in the tuples are the same.N)ZassertTupleEqualZassertListEquallistmaprB   rC   r   r   r   assertTypedTupleEquals`   s    z#FractionTest.assertTypedTupleEqualsc              
   O   s\   z||i | W n4 |yF } z|  |t| W Y d}~nd}~0 0 | d|j  dS )z@Asserts that callable(*args, **kwargs) raises exc_type(message).Nz%s not raised)rA   strZfailr+   )r   exc_typemessagecallableargskwargser   r   r   assertRaisesMessagee   s
    &z FractionTest.assertRaisesMessagec              	   C   s  |  dtt  |  dttd |  dtttdd |  dttdd |  dttdd |  d	ttd
d
 |  dttdd |  dttdd |  dttd |  dtttddd |  dttdtdd |  dtttddtdd | tdtdd | ttd | ttd d | ttdd! | ttdd" | ttddd d S )#Nr      )   rR   rS   rS      rU   )rR   rV   rR   )rR   rR   )rR         
   )rS      r[   )      m+?R rR   r\   )rU   M      )rY   rX   	   )i	  i	     c  q   zFraction(12, 0)   r   y      ?      @3/2y                y              ?)rA   r?   r   rP   ZeroDivisionErrorassertRaisesr   r(   r   r   r   testInito   s(    "zFractionTest.testInitc                 C   sv   |  dttd |  dttd |  dttd | tttd | tttd | tttd	 d S )
N)rY   rX         @rQ          )   L33f l          皙?naninf-inf)rA   r?   r   rh   
ValueErrorr
   OverflowErrorr(   r   r   r   testInitFromFloat   s    
zFractionTest.testInitFromFloatc                 C   s   |  dtttd |  dtttd |  dtttd | tttd | tttd | tttd	 | tttd
 d S )N)r^   rZ   z1.1)rS      z3.5e-2rQ   z.000e20rn   snanro   rp   )rA   r?   r   r   rh   rq   rr   r(   r   r   r   testInitFromDecimal   s    z FractionTest.testInitFromDecimalc                 C   s  |  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t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ttd | tdtd | tdtd | tdtd  | td!td" | td#td$ | td%td& | td'td( | td)td* | td+td, | td-td. d S )/N)rY   rR   5)rU   rX   rf   z 
  +3/2)rX   z-3/2  )   rX   z    013/02 
  )   rY   z 3.2 )irY   z -3.2 )rx   rR   z -3. )rU   rY   z .6 )rR   i5  z32.e-5)i@B rR   z1E+06)irR   z-1.23e4rQ   z .0e+0	z-0.000e0zFraction(3, 0)z3/0z"Invalid literal for Fraction: '3/'z3/z"Invalid literal for Fraction: '/2'z/2z$Invalid literal for Fraction: '3 /2'z3 /2z$Invalid literal for Fraction: '3/+2'z3/+2z%Invalid literal for Fraction: '+ 3/2'z+ 3/2z#Invalid literal for Fraction: '3a2'Z3a2z%Invalid literal for Fraction: '3/7.2'z3/7.2z%Invalid literal for Fraction: '3.2/7'z3.2/7z!Invalid literal for Fraction: '.'.)rA   r?   r   rP   rg   rq   r(   r   r   r   testFromString   sl    zFractionTest.testFromStringc                 C   s   t dd}|dd | dt| | tt|dd | tt|dd	 | dt| d
|_d|_| dt| | 	t d
d| d S )NrS   rU   rX   r[   rT   r<   re   r=         )r~   rX   )
r   r   rA   r?   rh   AttributeErrorsetattrr8   r9   assertNotEqualr   r>   r   r   r   testImmutable   s    
zFractionTest.testImmutablec                 C   s*  |  ttjd | dttd d}| |dftt| | dttd | dttd | d	ttd
 | dttd | tdttd | dttd | dttd d}|| }| tdtj| | tdtj|  | t	dtj| d S )N      @      @)rZ   rR   rZ   l   {C	 rR   rQ   rk         $@)rX   g      )l      l+?R rR   J-Dr\   )rl   l           g	@g      (cannot convert Infinity to integer ratio#cannot convert NaN to integer ratio)
rh   r   r   r   rA   r?   r
   rP   rr   rq   )r   Zbigintro   rn   r   r   r   testFromFloat   s:    zFractionTest.testFromFloatc                 C   s  |  ttjd | tddtd | tdttd | tddttd | tddttd	 | td
ttd | dtdd ttd | tdtjtd | tdtjtd | tdtjtd | tdtjtd d S )Nr   rZ   rR   r   z-0rY   z0.5i  z5e-3i  Z5e3l       73Me'z 0.999999999999999999999999999999r   ro   rp   r   rn   ru   )	rh   r   r   Zfrom_decimalrA   r   rP   rr   rq   r(   r   r   r   testFromDecimal  s2    



zFractionTest.testFromDecimalc                 C   s\   |  tdd d |  tdd d |  tdd d |  tdd d d S )	Nr~   r}   )rX   rU   )rW   rU   ir   rQ   )rA   r   as_integer_ratior(   r   r   r   test_as_integer_ratio  s    z"FractionTest.test_as_integer_ratioc                 C   s   t d}| |dt dd | |d t dd | |dt dd | |dt dd | t d	d
dt d | t d	d
dt dd | t ddt d dD ]}| tdt dj| qd S )Nz3.1415926535897932i'  rc   rd   ip   iM  j      rt   d   rR   e   f   r   )r   rV   z$max_denominator should be at least 1)r   rA   Zlimit_denominatorrP   rq   )r   Zrpiir   r   r   testLimitDenominator  s    
z!FractionTest.testLimitDenominatorc                 C   sr  |  dttdd |  dttdd |  dttdd |  dttdd |  dttdd |  dttdd |  dttdd |  dttd	d |  dttd
d |  dttdd | dt	tdd | dt	tdd |  dt
tdd | tt
td | dt
ttdtd |  dttdd d S )NrV   irZ   rR   r^   rW   r`   r   r   FTrU   rX   rm   A  22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222227gUUUUUU?A  33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333331?        )rE   r1   truncr   floorceilintroundrA   boolr
   rh   rr   assertAlmostEqualcomplexr(   r   r   r   testConversions-  s$    zFractionTest.testConversionsc                 C   sr   t jG dd d}tj| |d}t|}| |j| | t|d |d}t|}| t|d d S )Nc                   @   s8   e Zd ZdZdd Zdd Zedd Zdd	 ZeZ	d
S )z=FractionTest.testBoolGuarateesBoolReturn.<locals>.CustomValuerR   c                 S   s
   || _ d S r   )r   r   r   r   r   r   L  s    zFFractionTest.testBoolGuarateesBoolReturn.<locals>.CustomValue.__init__c                 S   s
   t | jS r   )r   r   r(   r   r   r   __bool__O  s    zFFractionTest.testBoolGuarateesBoolReturn.<locals>.CustomValue.__bool__c                 S   s   | S r   r   r(   r   r   r   r<   R  s    zGFractionTest.testBoolGuarateesBoolReturn.<locals>.CustomValue.numeratorc                 S   s   t dd S )Nz&Avoid comparisons in Fraction.__bool__)AssertionErrorr   r   r   r   r   W  s    zDFractionTest.testBoolGuarateesBoolReturn.<locals>.CustomValue.__eq__N)
r+   r,   r-   r=   r   r   propertyr<   r   r#   r   r   r   r   CustomValueH  s   
r   rR   Tr   F)		functoolstotal_orderingr   r   registerr   ZassertIsr<   r   )r   r   r<   r>   r   r   r   testBoolGuarateesBoolReturnE  s    z(FractionTest.testBoolGuarateesBoolReturnc                 C   s   |  tdttdd |  tdttdd |  tdttdd |  tddttd	d
d |  tddttdd
d d S )Ni8ijrW   i      rV   rZ   r   r   rR   i)rE   r   r   r(   r   r   r   	testRoundi  s
    zFractionTest.testRoundc                 C   s  |  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tddtdd  | dtddtdd  | d	td	dtd  |  tdd
tddtdd  |  tddtddtdd  |  tdtdd
fttddtdd |  tdtddfttddtdd |  tddtddtd  |  tddtddtd  | dtdtdd  |  tddtdd
  ttdtdd}| |jd |  |jd tddd }|  |tdd |  |jd |  |j	d tddd }|  |tdd |  |jd |  |j	d tddd }|  |tdd |  |jd |  |j	d d S )NrR   rX   rZ   rY   rx      r~   ra   r\   r}   rS   rU   r   rW                @rV   r   )
rA   r   rE   divmodpowr   realimagr<   r=   )r   zpr   r   r   testArithmeticp  s:    """""",,  zFractionTest.testArithmeticc              	   C   s^  |  tddtdd d dtddd d   |  tddtd	d
  dtdd	d
   | dtddfttdd d dtddd d  |  d	d  d td	d
  dtdd	d
   |  dtdd	d
 tdd	d
   |  dtd	d	d
 fttdd	d
 tdd	d
  | d	d  d tddfttd	d
  dtdd	d
  d S )Nl     b;efOpUmnP|} l   ~Jw5PHyT#/jei4T rZ   #   rR   l     P ~cegrS   l                rX   r   rU   rY   l   _rt   r[   )rE   r   rH   r   r(   r   r   r   testLargeArithmetic  sH    "$z FractionTest.testLargeArithmeticc                 C   s  |  tddtddd  |  dtddd  |  dtddd  |  tdddtdd  |  ddtdd  |  ddtdd  |  tddtddd  |  d	tddd  |  d
tddd  |  tdddtdd  |  ddtdd  |  ddtdd  |  tddtddd  |  dtddd  |  dtddd  |  tdddtdd  |  ddtdd  |  ddtdd  |  tddtddd  |  dtddd  |  dtddd  |  tdddtdd  |  ddtdd  |  ddtdd  |  dtddd  |  dtddd  |  ddtdd  |  ddtdd  |  ddtdd  |  tddtddd  |  dtddd  |  tdddtdd  |  ddtdd  |  dtddtd  |  tdtddtd  |  tdtddtd  |  dtddtd  | dtddfttddd | tddttddd | dtdftdtdd | tddtdtdd | tdtdttddtd | tdtdttddtd | tdtdttddtd | tdtdttddtd |  tddtddd  |  tddtddd  |  dtddd  |  dtddd  |  ddtdd  tdtdd}| d|j | d|j	 |  tdddtdd  |  d dtdd  |  d!d tdd  |  ddtdd  | 
ttjtddd d S )"Nr^   rZ   rR   g?g      ?y?        y      ?        r_   gy        ra   g?y?        rm   r   r   y      $@        r           r\   l     d&O!g      "@g?ro   rp   rV   gr   rW   rX   r~   r   g      ?)rE   r   r
   rH   r   r   r   r   rA   r   rh   rg   r   )r   r   r   r   r   testMixedArithmetic  sx    " &&&&

z FractionTest.testMixedArithmeticc                 C   s<   |  ttjtddtd |  ttjtdtdd d S )NrU   r^   z	3.1415926)rh   r   r   addr   r   r(   r   r   r   testMixingWithDecimal  s    

z"FractionTest.testMixingWithDecimalc                 C   s   |  tddtddk  | tddtddk  |  tddtddk |  tddtddk | tddtddk |  tddtddk | tddtddk | tddtddk |  tddtddk d S )NrR   rX   rU   )
assertTruer   assertFalser(   r   r   r   testComparisons  s    zFractionTest.testComparisonsc                 C   s  |  tddtddk |  tddtddk | tddtddk | tddtddk |  tddtddk  | tddtddk  | tddtddk  | tddtddk | tddtddk |  tddtddk |  tddtddk |  tddtddk | tddtddk | tddtddk |  tddtddk |  tddtddk |  tddtddk  | tddtddk  | tddtddk  | tddtddk | tddtddk |  tddtddk |  tddtddk |  tddtddk | tddtddk | tddtddk |  tddtddk |  tddtddk d S )NrR   rX   rU   r~   rS   )r   r   r0   r   r(   r   r   r   testComparisonsDummyRational	  s8    z)FractionTest.testComparisonsDummyRationalc                 C   s   t d}tdd}| ||k | ||k p2||k | ||k | ||koV||k | ||k | ||k pz||k | ||k | ||ko||k d S )NgUUUUUU?rR   rU   )r   r   r   r   )r   xyr   r   r   testComparisonsDummyFloat)  s    
z&FractionTest.testComparisonsDummyFloatc                 C   s4  |  dtddk  | dtddk  |  tdddk  | tdddk  |  tdddk  | tdddk  |  dtddk  | dtddk  | td	tddk  |  td
tddk  | tdtddk  |  tddtd	k  | tddtd
k  | tddtdk  d S )NrX   rY   r~   rU   rR   333333?皙?      ?ro   rp   r   rZ   rn   rx   rS      re      r   r   r   r
   r(   r   r   r   testMixedLess5  s    zFractionTest.testMixedLessc                 C   s4  |  dtddk | dtddk |  tdddk | tdddk |  dtddk | dtddk |  tdddk | tdddk | td	tddk |  td
tddk | tdtddk |  tddtd	k | tddtd
k | tddtdk d S )Nr   rR   rX   r   r   r~   rU   rY   ro   rp   r   rZ   rn   rx   rS   r   re   r   r   r   r(   r   r   r   testMixedLessEqualG  s    zFractionTest.testMixedLessEqualc                 C   s   |  tdtdk |  dtttdd k  | dttdd k  |  dttdd k | dttdd k |  dttdd k d S )Nr\   r   rR   )r   r   r
   r1   r   r   r(   r   r   r   testBigFloatComparisonsX  s     z$FractionTest.testBigFloatComparisonsc                 C   s   |  tdtdk | ttjtdtd | ttjtdtd tdd}tdd}tdd}| ||k |  ||k |  ||k | ||k tj	tjtjtj
fD ]D}| t||| | t||| | t||| | t||| qd S )Nr\   rU   r   g      ?r   g?)r   r   r   rh   r   r   r&   r    r   r"   r$   )r   r   r   wr   r   r   r   testBigComplexComparisonsb  s    


z&FractionTest.testBigComplexComparisonsc                 C   s  |  dtddk | dtddk |  tdddk | tdddk |  dtddk | dtddk |  tdddk | tdddk | tddtd	k | td	tdd
k | tddtdk | tdtddk d S )Nr   rR   rX   r   r   r~   rU   rY   rn   rS   ro   rp   r   r(   r   r   r   testMixedEqualt  s    zFractionTest.testMixedEqualc                 C   sp   |  dttdd |  dttd |  dttdd |  d	ttdd |  d
ttdd d S )NzFraction(7, 3)rS   rU   z Fraction(6283185307, 2000000000)z3.1415926535z#Fraction(-1, 100000000000000000000)rR   l   Fx:^V z7/37)rA   reprr   rI   r(   r   r   r   testStringification  s    
z FractionTest.testStringificationc                 C   s   t jj}t jj}| tdttdd | tdd ttdd  | ttdttd | |ttd| | ttdtd	  d S )	Nrj   rY   rX   rZ   2   r\   rR   rV   )
sys	hash_infomodulusro   rA   hashr   r   r
   __hash__)r   ZhmodZhinfr   r   r   testHash  s     zFractionTest.testHashc           	      C   s   t d}d|dddddf\}}}}}}}t|| t ddkr||}|| |d  }}|| |d  }}|| | }||7 }q(| tj| d S )NrU   r   rR       ʚ;r       )r   absr   r1   pi)	r   ZthreelaststsnZnaddar   r   r   testApproximatePi  s     
zFractionTest.testApproximatePic                 C   s   t d}ddt ddddf\}}}}}}t|| t ddkr|}|d7 }|||d  9 }||| 9 }|d9 }||| | 7 }q(| td| d S )NrR   r   r   rX   rV   )r   r   r   r1   cos)r   r   r   r   r   Zfactr3   signr   r   r   testApproximateCos1  s     z FractionTest.testApproximateCos1c                 C   s   t dd}tdd}| |tt| | t|tt| | t|tt| | t|tt| | t|tt| | 	|t| | 	|t| d S )Nry   rS   )
r   r;   rA   r   r   idr   r   r   rE   )r   r>   Zdrr   r   r   test_copy_deepcopy_pickle  s    

z&FractionTest.test_copy_deepcopy_picklec                 C   s    t dd}| tt|dd d S )Nry   rS   arZ   )r   rh   r   r   r   r   r   r   
test_slots  s    
zFractionTest.test_slotsc                 C   sh   G dd dt }t|d|d}| |jd | |jd | t|j| | t|j| d S )Nc                   @   s<   e Zd Zdd Zdd Zdd Zedd Zed	d
 ZdS )z-FractionTest.test_int_subclass.<locals>.myintc                 S   s   t | t| t| S r   rB   r   r   r   r   r   __mul__  s    z5FractionTest.test_int_subclass.<locals>.myint.__mul__c                 S   s   t | t| t| S r   r   r   r   r   r   __floordiv__  s    z:FractionTest.test_int_subclass.<locals>.myint.__floordiv__c                 S   s   t | t| t| }|S r   r   )r   r   r   r   r   r   __mod__  s    z5FractionTest.test_int_subclass.<locals>.myint.__mod__c                 S   s   t | t| S r   r   r(   r   r   r   r<     s    z7FractionTest.test_int_subclass.<locals>.myint.numeratorc                 S   s   t | dS )NrR   )rB   r(   r   r   r   r=     s    z9FractionTest.test_int_subclass.<locals>.myint.denominatorN)	r+   r,   r-   r   r   r   r   r<   r=   r   r   r   r   myint  s   
r   rU   r}   rR   rX   )r   r6   r7   rA   r<   r=   rB   )r   r   fr   r   r   test_int_subclass  s    zFractionTest.test_int_subclassN)&r+   r,   r-   rE   rH   rP   ri   r   rs   rv   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@   Y   sF   


5$ "E 
	r@   __main__)r.   decimalr   Ztest.supportr   r1   r   r   r6   r   r   Zunittestr   r   pickler   r   r7   r   objectr   r0   r;   r?   ZTestCaser@   r+   mainr   r   r   r   <module>   s0          