o
    6ÎhÓd  ã                   @   s6  d dl Z d dlZzd dlZW n ey   d dlZY nw 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 d dlmZmZmZmZ ddlmZmZmZmZ ddlmZmZmZmZmZmZmZ ddlm Z  ddl!m"Z" i Z#ej$dkrwd	e#d
< i Z%dej&v rƒde%d< nde%d< G dd„ dej'ƒZ(G dd„ dej'ƒZ)dS )é    N)ÚgivenÚassumeÚsettingsÚexampleé   )ÚCurveFpÚPointJacobiÚINFINITYÚPoint)Úgenerator_256Ú	curve_256Úgenerator_224Úgenerator_brainpoolp160r1Úcurve_brainpoolp160r1Úgenerator_112r2Úcurve_112r2)Úinverse_mod)Ú	randrange)é   é   iˆ  Údeadlinez--fastr   Úmax_examplesé
   c                   @   sœ  e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Z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edŸi e ¤Že!e"j#d9e$e% &¡ d: ƒd;ƒd<d=„ ƒƒZ'edŸi e ¤Že!e"j#d9e$e% &¡ d: ƒd;ƒe(d9ƒe(e$e% &¡ ƒƒd>d?„ ƒƒƒƒZ)edŸi e ¤Že!e"j#d:e$e% &¡ d: ƒd;e"j#d:e$e% &¡ d: ƒd;ƒe(d@d@ƒdAdB„ ƒƒƒZ*edŸi e ¤Že!e"j#d:e$e% &¡ d: ƒd;e"j#d:e$e% &¡ d: ƒd;e"j#d:e$e+ ,¡ d: ƒd;ƒdCdD„ ƒƒZ-e.j/j0edŸi e ¤Že!e"j#d:e$e% &¡ d: ƒd;e"j#d:e$e% &¡ d: ƒd;e"j#d:e$e+ ,¡ d: ƒd;ƒe(d:d:d:ƒe(d@d@d@ƒe(dEe$e% &¡ dE ƒd:ƒe(dEe$e% &¡ dE ƒd@ƒdFdG„ ƒƒƒƒƒƒƒZ1dHdI„ Z2e.j/j0edŸi e ¤Že!e"j#d:e$e% &¡ d: ƒd;e"j#d:e$e% &¡ d: ƒd;e"j3e"j#d:e$e+ ,¡ d: ƒd;dEdEdJdKƒe(dEdEdEd:gƒe(dEdEdEd@gƒe(dEe$e% &¡ dE ƒdEd@gƒe(dEe$e% &¡ dE ƒdEd:gƒdLdM„ ƒƒƒƒƒƒƒZ4dNdO„ Z5dPdQ„ Z6dRdS„ Z7dTdU„ Z8dVdW„ Z9dXdY„ Z:dZd[„ Z;d\d]„ Z<d^d_„ Z=d`da„ Z>dbdc„ Z?ddde„ Z@dfdg„ ZAdhdi„ ZBdjdk„ ZCdldm„ ZDdndo„ ZEdpdq„ ZFdrds„ ZGe!e"j#d9e$eH &¡ d: ƒd;e"j#d9e$eH &¡ d: ƒd;e"j#d9e$eH &¡ d: ƒd;ƒe(dtdEduƒdvdw„ ƒƒZIdxdy„ ZJdzd{„ ZKd|d}„ ZLd~d„ ZMd€d„ ZNd‚dƒ„ ZOd„d…„ ZPd†d‡„ ZQdˆd‰„ ZRdŠd‹„ ZSdŒd„ ZTdŽd„ ZUdd‘„ ZVd’d“„ ZWe.j/j0edŸi eX¤Že.j/jYeZ [¡ d”kd•d–e!e"j#d:d—d;ƒd˜d™„ ƒƒƒƒZ\e.j/j0e.j/jYeZ ]¡ dškpÃeZ [¡ d”kd›d–dœd„ ƒƒZ^džS ) Ú
TestJacobic                 C   sj   t ƒ }d}d}d}d}t|||||ƒ}|  | ¡ |¡ |  | ¡ |¡ |  | ¡ |¡ |  | ¡ |¡ d S )Nr   é   r   é   )Úobjectr   ÚassertEqualÚorderÚassertIsÚcurveÚxÚy)Úselfr    r!   r"   Úzr   Úpj© r&   úe/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/ecdsa/test_jacobi.pyÚtest___init__,   s   zTestJacobi.test___init__c                 C   sL   t  t¡}t  t¡}|  t¡ ||  W d   ƒ d S 1 sw   Y  d S ©N)r   Úfrom_affiner   r   ÚassertRaisesÚ
ValueError©r#   Úp_aÚp_br&   r&   r'   Útest_add_with_different_curves9   s
   


"ÿz)TestJacobi.test_add_with_different_curvesc                 C   s   |   tt¡ d S r)   )ÚassertNotEqualr   r   ©r#   r&   r&   r'   Útest_compare_different_curves@   s   z(TestJacobi.test_compare_different_curvesc                 C   ó   t  t¡}|  |d¡ d S )NÚvalue©r   r*   r   r1   ©r#   r%   r&   r&   r'   Útest_equality_with_non_pointC   ó   
z'TestJacobi.test_equality_with_non_pointc                 C   s"   t  t¡}| ¡ }|  t|¡ d S r)   ©r   r*   r   Ú	to_affiner   ©r#   r%   Úpwr&   r&   r'   Útest_conversionH   s   
zTestJacobi.test_conversionc                 C   sF   t  t¡}t ¡ }| ¡ }|  | ¡ | ¡ ¡ |  | ¡ | ¡ ¡ d S r)   )r   r*   r   Údoubler   r!   r"   r<   r&   r&   r'   Útest_single_doubleN   ó
   
zTestJacobi.test_single_doublec                 C   s&   t tdddƒ}| ¡ }|  |t¡ d S ©Nr   r   ©r   r   r?   r   r	   r7   r&   r&   r'   Útest_double_with_zero_pointW   ó   z&TestJacobi.test_double_with_zero_pointc                 C   s&   t tdddƒ}| ¡ }|  |t¡ d S ©Nr   rC   r7   r&   r&   r'   Ú&test_double_with_zero_equivalent_point^   rE   z1TestJacobi.test_double_with_zero_equivalent_pointc                 C   s*   t tddt ¡ ƒ}| ¡ }|  |t¡ d S rB   ©r   r   Úpr?   r   r	   r7   r&   r&   r'   Ú<test_double_with_zero_equivalent_point_non_zero_z_non_zero_ye   ó   zGTestJacobi.test_double_with_zero_equivalent_point_non_zero_z_non_zero_yc                 C   s*   t tddt ¡ ƒ}| ¡ }|  |t¡ d S rF   rH   r7   r&   r&   r'   Ú1test_double_with_zero_equivalent_point_non_zero_zl   rK   z<TestJacobi.test_double_with_zero_equivalent_point_non_zero_zc                 C   s.   t  t¡}| ¡ }|  ||¡ |  ||¡ d S r)   r:   ©r#   r%   Úpar&   r&   r'   Útest_compare_with_affine_points   s   
z)TestJacobi.test_compare_with_affine_pointc                 C   s&   t tdddƒ}| ¡ }|  |t¡ d S rF   )r   r   r;   r   r	   rM   r&   r&   r'   Útest_to_affine_with_zero_pointz   rE   z)TestJacobi.test_to_affine_with_zero_pointc                 C   s.   t  t¡}| ¡ }|| }|  || ¡ ¡ d S r)   ©r   r*   r   r;   r   r?   ©r#   r%   rN   Úsr&   r&   r'   Útest_add_with_affine_point   ó   
z%TestJacobi.test_add_with_affine_pointc                 C   s.   t  t¡}| ¡ }|| }|  || ¡ ¡ d S r)   rQ   rR   r&   r&   r'   Útest_radd_with_affine_point‰   rU   z&TestJacobi.test_radd_with_affine_pointc                 C   s"   t  t¡}|t }|  ||¡ d S r)   )r   r*   r   r	   r   )r#   r%   rS   r&   r&   r'   Útest_add_with_infinity‘   ó   
z!TestJacobi.test_add_with_infinityc                 C   s4   t  t¡ ¡ }t tdddƒ}|| }|  ||¡ d S rF   )r   r*   r   r;   r   r   )r#   rN   r%   rS   r&   r&   r'   Útest_add_zero_point_to_affine˜   s   z(TestJacobi.test_add_zero_point_to_affinec                 C   s"   t  t¡}|d }|  |t¡ d S rF   )r   r*   r   r   r	   r7   r&   r&   r'   Útest_multiply_by_zero    rX   z TestJacobi.test_multiply_by_zeroc                 C   s&   t tdddƒ}|d }|  |t¡ d S rB   )r   r   r   r	   r7   r&   r&   r'   Útest_zero_point_multiply_by_one§   rE   z*TestJacobi.test_zero_point_multiply_by_onec                 C   óF   t  t¡}td }|d }|  | ¡ | ¡ ¡ |  | ¡ | ¡ ¡ d S ©Nr   ©r   r*   r   r   r!   r"   r<   r&   r&   r'   Útest_multiply_by_one®   rA   zTestJacobi.test_multiply_by_onec                 C   r\   ©Nr   r^   r<   r&   r&   r'   Útest_multiply_by_two·   rA   zTestJacobi.test_multiply_by_twoc                 C   s*   t  t¡}td }d| }|  ||¡ d S r`   ©r   r*   r   r   r<   r&   r&   r'   Útest_rmul_by_twoÀ   s   
zTestJacobi.test_rmul_by_twoc                 C   s   t  t¡}|  |t¡ d S r)   )r   r*   r   r1   r	   r7   r&   r&   r'   Ú#test_compare_non_zero_with_infinityÈ   r9   z.TestJacobi.test_compare_non_zero_with_infinityc                 C   s   t tdddƒ}|  |t¡ d S )Nr   r   ©r   r   r   r	   r7   r&   r&   r'   Ú-test_compare_non_zero_bad_scale_with_infinityÍ   s   z8TestJacobi.test_compare_non_zero_bad_scale_with_infinityc                 C   s<   t dddƒ}t|dddƒ}|  | dd¡¡ |  |t¡ d S ©Né   r   r   ©r   r   Ú
assertTrueÚcontains_pointr1   r	   ©r#   Úc_23r%   r&   r&   r'   Ú"test_eq_x_0_on_curve_with_infinityÑ   ó   z-TestJacobi.test_eq_x_0_on_curve_with_infinityc                 C   s<   t dddƒ}t|dddƒ}|  | dd¡¡ |  |t¡ d S )Nrh   r   r   r   ri   rl   r&   r&   r'   Ú"test_eq_y_0_on_curve_with_infinityÙ   ro   z-TestJacobi.test_eq_y_0_on_curve_with_infinityc                 C   s8   t dddƒ}t|dddƒ}t|dddƒ}|  ||¡ d S )Nrh   r   r   é   )r   r   r1   )r#   rm   r.   r/   r&   r&   r'   Útest_eq_with_same_x_different_yá   s   z*TestJacobi.test_eq_with_same_x_different_yc                 C   s   t tdddƒ}|  |t¡ d S rF   re   r7   r&   r&   r'   Ú%test_compare_zero_point_with_infinityè   s   z0TestJacobi.test_compare_zero_point_with_infinityc                 C   s*   t  t¡}| ¡ }|d }|  ||¡ d S r`   )r   r*   r   r?   r   )r#   r%   ÚdblÚmlplr&   r&   r'   Ú!test_compare_double_with_multiplyí   s   
z,TestJacobi.test_compare_double_with_multiplyr   r   )Ú	min_valueÚ	max_valuec                 C   sR   t  t¡}| ¡ | }|| }|  | ¡ | ¡ f| ¡ | ¡ f¡ |  ||¡ d S r)   )r   r*   r   r;   r   r!   r"   )r#   Úmulr%   r=   r&   r&   r'   Útest_multiplicationsô   s
   
$zTestJacobi.test_multiplicationsc                 C   s:   t }|  |j¡ t t ¡}|| }|| }|  ||¡ d S r)   )r   rj   Ú_PointJacobi__precomputer   r*   r   )r#   ry   Úprecompr%   ÚaÚbr&   r&   r'   Útest_precompute  s   	
zTestJacobi.test_precomputer   c                 C   sF   t  t¡}t  || ¡}t  || ¡}|| }|  ||||  ¡ d S r)   )r   r*   r   r   )r#   Úa_mulÚb_mulÚj_gr}   r~   Úcr&   r&   r'   Útest_add_scaled_points  s
   
z!TestJacobi.test_add_scaled_pointsc           
      C   s’   t  t¡}t  || ¡}t  || ¡}t ¡ }tt||ƒƒ || | }t t| ¡ | | | ¡ | | | |ƒ}|| }	|  	|	|||  ¡ d S r)   ©
r   r*   r   r   rI   r   r   r!   r"   r   ©
r#   r€   r   Únew_zr‚   r}   r~   rI   Únew_zzrƒ   r&   r&   r'   Útest_add_one_scaled_point(  s   
üz$TestJacobi.test_add_one_scaled_pointr   c           
      C   s¼   t  t¡}t  || ¡}t  || ¡}t ¡ }tt||ƒƒ || | }t t| ¡ | | | ¡ | | | |ƒ}t t| ¡ | | | ¡ | | | |ƒ}|| }	|  	|	|||  ¡ d S r)   r…   r†   r&   r&   r'   Útest_add_same_scale_pointsH  s(   
üüz%TestJacobi.test_add_same_scale_pointsc                 C   s˜   t }t ¡ }|d }| ¡  d}tt| ¡ |d  | | ¡ |d  | |ƒ}tt| ¡ |d  | | ¡ |d  | |ƒ}|| }|  ||| ¡ d S )Né   é   r   r   ©r   r   rI   Úscaler   r!   r"   r   )r#   r‚   rI   r}   Úz1r!   r"   rƒ   r&   r&   r'   Ú!test_add_same_scale_points_statics  s&   üüz,TestJacobi.test_add_same_scale_points_staticT)Úmin_sizeÚmax_sizeÚuniquec                 C   sþ   t  t¡}t  || ¡}t  || ¡}t ¡ }tt|d |ƒƒ tt|d |ƒƒ |d |d  | }|d |d  | }	t t| ¡ | | | ¡ | |d  | |d ƒ}t t| ¡ |	 | | ¡ |	 |d  | |d ƒ}|| }
|  	|
|||  ¡ d S rB   r…   )r#   r€   r   r‡   r‚   r}   r~   rI   Únew_zz0Únew_zz1rƒ   r&   r&   r'   Útest_add_different_scale_pointsŠ  s,   
üüz*TestJacobi.test_add_different_scale_pointsc           	      C   sœ   t }t ¡ }|d }| ¡  d}tt| ¡ |d  | | ¡ |d  | |ƒ}d}tt| ¡ |d  | | ¡ |d  | |ƒ}|| }|  ||| ¡ d S )Nr‹   rŒ   r   r   é   r   )	r#   r‚   rI   r}   r   r!   Úz2r"   rƒ   r&   r&   r'   Ú&test_add_different_scale_points_static¾  s(   üüz1TestJacobi.test_add_different_scale_points_staticc           	      C   s    t }t ¡ }|d }| ¡  |d }d}tt| ¡ |d  | | ¡ |d  | |ƒ}tt| ¡ |d  | | ¡ |d  | |ƒ}|| }|  ||| ¡ d S )Nr‹   é   rŒ   r   r   r   )	r#   r‚   rI   r}   r~   r$   r!   r"   rƒ   r&   r&   r'   Ú+test_add_different_points_same_scale_staticÖ  s(   üüz6TestJacobi.test_add_different_points_same_scale_staticc                 C   s€   t }t ¡ }d}|| }| ¡  tt| ¡ |d  | | ¡ |d  | |ƒ}tt| ¡ | ¡ dƒ}|| }|  ||| ¡ d S )Nr‹   r   r   r   )r   r   rI   rŽ   r   r!   r"   r   )r#   r‚   rI   r$   r}   r!   r"   rƒ   r&   r&   r'   Ú5test_add_same_point_different_scale_second_z_1_staticî  s&   üüz@TestJacobi.test_add_same_point_different_scale_second_z_1_staticc                 C   s^   t }d}|| }| ¡  | }tt| ¡ | ¡ dƒ}tt| ¡ | ¡ dƒ}|  t|| ¡ d S )Nr‹   r   )r   rŽ   r   r   r!   r"   r   r	   )r#   r‚   r$   r}   r~   r!   r"   r&   r&   r'   Útest_add_to_infinity_static  s$   üüz&TestJacobi.test_add_to_infinity_staticc                 C   s&   t  t¡}|  |d || | ¡ d S )Nr   rb   ©r#   r‚   r&   r&   r'   Útest_add_point_3_times  s   
z!TestJacobi.test_add_point_3_timesc                 C   s.   t tt ¡ t ¡ dƒ}|  |t ¡  t¡ d S r]   )r   r   r   r!   r"   r   r   r	   rž   r&   r&   r'   Útest_mul_without_order#  s   z!TestJacobi.test_mul_without_orderc                 C   s$   t  t¡}|  || dtd¡¡ d S r]   ©r   r*   r   r   Úmul_addr	   rž   r&   r&   r'   Útest_mul_add_inf(  s   
zTestJacobi.test_mul_add_infc                 C   s(   t  t¡}|  |d | d|d¡¡ d S )Nr   r   ©r   r*   r   r   r¢   rž   r&   r&   r'   Útest_mul_add_same-  s   
zTestJacobi.test_mul_add_samec                 C   ój   t  td¡}t  |d d¡}|  |d || ¡ |  |d |d |d  ¡ |  |d | d|d¡¡ d S )NTéÿ   é   iþ  é   r   ©r   r*   r   r   r¢   ©r#   r‚   r~   r&   r&   r'   Útest_mul_add_precompute2  s
   z"TestJacobi.test_mul_add_precomputec                 C   r¦   )NTr§   r¨   éþð é ÿ  éðð  rª   r«   r&   r&   r'   Útest_mul_add_precompute_large:  s   ÿÿz(TestJacobi.test_mul_add_precompute_largec                 C   s0   t  t¡}|d }| d|d¡}|  ||¡ d S )Nr   r   r   )r   r*   r   r¢   r   )r#   r‚   r}   r~   r&   r&   r'   Útest_mul_add_to_mulF  s   
zTestJacobi.test_mul_add_to_mulc                 C   s0   t  t¡}|d }|  | d|d¡|d ¡ d S )Nr   r   r   r¤   )r#   r‚   Úw_ar&   r&   r'   Útest_mul_add_differntN  s   
z TestJacobi.test_mul_add_differntc                 C   s@   t  t¡}|d }|d }|  | d|d¡|d |d  ¡ d S )Nr   r   r   r¤   )r#   r‚   r²   Úw_br&   r&   r'   Útest_mul_add_slightly_differentU  s   
&z*TestJacobi.test_mul_add_slightly_differentc                 C   sH   t  t¡}td }td }|d }| d|d¡}|  | ¡ || ¡ d S )Nr§   i€  é¨   éð   ©r   r*   r   r¢   r   r;   ©r#   r‚   r²   r´   Új_bÚretr&   r&   r'   Útest_mul_add]  s   
zTestJacobi.test_mul_addc                 C   sH   t  t¡}td }td }|d }| d|d¡}|  | ¡ || ¡ d S )Nr§   r   r¶   r¸   r¹   r&   r&   r'   Útest_mul_add_zeroh  s   
zTestJacobi.test_mul_add_zeroc                 C   sf   t  t¡}t  |d ¡}|  |d || ¡ |  |d |d |d  ¡ |  |d | d|d¡¡ d S )Nr§   r¨   r­   r®   r¯   r¤   r«   r&   r&   r'   Útest_mul_add_larget  s   
ÿÿzTestJacobi.test_mul_add_largec                 C   sB   t  t¡}t ¡ }t  td ¡}|  | |d ||d ¡t¡ d S )Nr¨   )r   r*   r   r   r   r¢   r	   )r#   r‚   r   r~   r&   r&   r'   Ú$test_mul_add_with_infinity_as_result€  s   
"z/TestJacobi.test_mul_add_with_infinity_as_resultc                 C   sf   t tt ¡ t ¡ dƒ}t ¡ }td }| ¡  t t| ¡ | ¡ dƒ}|  | |d ||d ¡t	¡ d S )Nr   é"   )
r   r   r   r!   r"   r   rŽ   r   r¢   r	   )r#   r‚   r   r´   r~   r&   r&   r'   Útest_mul_add_without_order‰  s   "z%TestJacobi.test_mul_add_without_orderc                 C   s2   t  td ¡}d|  }|  | d|d¡t¡ d S )Né   r   r   r¡   )r#   r‚   Údbl_negr&   r&   r'   Ú,test_mul_add_with_doubled_negation_of_itself•  s   
z7TestJacobi.test_mul_add_with_doubled_negation_of_itselfiµ  iÝ  c                 C   s<   t  t¡}t| }| |||¡}|  ||| ||  ¡ d S r)   )r   r*   r   r¢   r   )r#   Úmul1Úmul2Úmul3r.   r/   Úresr&   r&   r'   Útest_mul_add_randomœ  s   
zTestJacobi.test_mul_add_randomc                 C   sH   t tddddƒddddd}t tddddƒddddd}|  ||¡ d S ©Nrh   r   r   r   ©r    r!   r"   r$   r   )r   r   r   )r#   Úpj1Úpj2r&   r&   r'   Útest_equalityª  s   zTestJacobi.test_equalityc                 C   r4   )Nrš   r6   rž   r&   r&   r'   Ú!test_equality_with_invalid_object¯  r9   z,TestJacobi.test_equality_with_invalid_objectc                 C   s$   t  t¡}t  t¡}|  ||¡ d S r)   )r   r*   r   r   r1   r-   r&   r&   r'   Útest_equality_with_wrong_curves´  s   

z*TestJacobi.test_equality_with_wrong_curvesc              	   C   sN   t tddddƒddddd}| ddddddd¡\}}}|  |||fd¡ d S )	Nrh   r   r   r   rË   r©   r   )r   r   r   )r   r   Ú_addr   )r#   rÌ   r!   r"   r$   r&   r&   r'   Útest_add_with_point_at_infinityº  s   z*TestJacobi.test_add_with_point_at_infinityc                 C   sj   t dddƒ}t|dddƒ}| ¡ }|  | ¡ | ¡ fd¡ |  |t¡ | ¡ }|  |t¡ |  |t¡ d S ©Nrh   r   r‹   é   ©r   r   )	r   r   r?   r   r!   r"   r1   r	   r   ©r#   rm   rI   Úp2Úp3r&   r&   r'   Útest_double_to_infinityÀ  ó   z"TestJacobi.test_double_to_infinityc                 C   s>   t dddƒ}t|dddƒ}| ¡ }|  | ¡ | ¡ fd¡ d S )Nrh   r   r   é	   )r   é   )r   r   r?   r   r!   r"   )r#   Úc_23_2rI   r×   r&   r&   r'   Útest_double_to_x_0Ê  s   zTestJacobi.test_double_to_x_0c                 C   sj   t dddƒ}t|dddƒ}|d }|  | ¡ | ¡ fd¡ |  |t¡ |d }|  |t¡ |  |t¡ d S )Nrh   r   r‹   rÔ   r   rÕ   ©r   r   r   r!   r"   r1   r	   r   rÖ   r&   r&   r'   Útest_mul_to_infinityÑ  rÚ   zTestJacobi.test_mul_to_infinityc                 C   sj   t dddƒ}t|dddƒ}|| }|  | ¡ | ¡ fd¡ |  |t¡ || }|  |t¡ |  |t¡ d S rÓ   rß   rÖ   r&   r&   r'   Útest_add_to_infinityÛ  rÚ   zTestJacobi.test_add_to_infinityc                 C   ó>   t dddƒ}t|dddƒ}|d }|  | ¡ | ¡ fd¡ d S )Nrh   r   rÛ   r   rŒ   ©r   rq   ©r   r   r   r!   r"   ©r#   rm   rI   r×   r&   r&   r'   Útest_mul_to_x_0å  ó   zTestJacobi.test_mul_to_x_0c                 C   râ   )Nrh   r   rÛ   r   é   rÕ   rä   rå   r&   r&   r'   Útest_mul_to_y_0ì  rç   zTestJacobi.test_mul_to_y_0c                 C   óB   t dddƒ}t|dddƒ}|d | }|  | ¡ | ¡ fd¡ d S )Nrh   r   rÛ   r   rš   rã   rä   rå   r&   r&   r'   Útest_add_to_x_0ó  ó   zTestJacobi.test_add_to_x_0c                 C   rê   )Nrh   r   rÛ   r   rŒ   rÕ   rä   rå   r&   r&   r'   Útest_add_to_y_0ú  rì   zTestJacobi.test_add_to_y_0c                 C   s:   t dddƒ}t|dddƒ}|d |d  }|  |t¡ d S )Nrh   r   rÛ   r   rÔ   é   )r   r   r   r	   )r#   rm   rI   rƒ   r&   r&   r'   Útest_add_diff_z_to_infinity  s   z&TestJacobi.test_add_diff_z_to_infinityc                 C   s8   t tddddƒddddd}|  t t |¡¡|¡ d S rÊ   )r   r   r   ÚpickleÚloadsÚdumpsr7   r&   r&   r'   Útest_pickle  s   zTestJacobi.test_pickleÚPyPyz!threading on PyPy breaks coverage)Úreasonr   c                 C   s¬   t d  t }t| ¡ | ¡ | ¡ d| ¡ dƒ}|  |jg ¡ dd„ }g }t|ƒD ]}| 	t
j||fd¡ q(|D ]}| ¡  q8||ƒ |D ]}| ¡  qE|  |jt j¡ d S )Nr   r   Tc                 S   ó&   |   ¡ }tdƒD ]}| t|ƒ  qd S )Nr   ©r   Úranger   ©Ú	generatorr   Ú_r&   r&   r'   Úrunner  ó   ÿz.TestJacobi.test_multithreading.<locals>.runner©ÚtargetÚargs)r   r   r    r!   r"   r   r   r{   rø   ÚappendÚ	threadingÚThreadÚstartÚjoin)r#   Ú
thread_numÚgenrü   Úthreadsrû   Útr&   r&   r'   Útest_multithreading  s"   	"

þzTestJacobi.test_multithreadingÚWindowszFthere are no signals on Windows, and threading breaks coverage on PyPyc                 C   sD  d}t d  t }t| ¡ | ¡ | ¡ d| ¡ dƒ}|  |jg ¡ dd„ }dd„ }g }t|ƒD ]}| 	t
j||fd	¡ q.t
 ¡ }| ¡  t
 ¡ }| ¡  t
 ¡ }	|	 ¡  | 	t
j||||	fd	¡ |D ]}
|
 ¡  qc|  t¡ | ¡  | ¡  ||ƒ |	 ¡  W d   ƒ n1 sŠw   Y  |D ]}
|
 ¡  q‘|  |jt j¡ d S )
Nr   r   r   Tc                 S   rö   )Né2   r÷   rù   r&   r&   r'   rü   E  rý   z>TestJacobi.test_multithreading_with_interrupts.<locals>.runnerc                 S   s.   |   ¡  | ¡  t t ¡ tj¡ |  ¡  d S r)   )ÚreleaseÚacquireÚosÚkillÚgetpidÚsignalÚSIGINT)Úbarrier_startÚbarrier_endÚ	lock_exitr&   r&   r'   ÚinterrupterJ  s   zCTestJacobi.test_multithreading_with_interrupts.<locals>.interrupterrþ   )r   r   r    r!   r"   r   r   r{   rø   r  r  r  ÚLockr  r  r+   ÚKeyboardInterruptr  r  )r#   r  r  rü   r  r  rû   r  r  r  r	  r&   r&   r'   Ú#test_multithreading_with_interrupts3  sH   "þÿ

ù	
þz.TestJacobi.test_multithreading_with_interruptsNr&   )_Ú__name__Ú
__module__Ú__qualname__r(   r0   r3   r8   r>   r@   rD   rG   rJ   rL   rO   rP   rT   rV   rW   rY   rZ   r[   r_   ra   rc   rd   rf   rn   rp   rr   rs   rv   r   ÚSLOW_SETTINGSr   ÚstÚintegersÚintr   r   rz   r   r   r„   r   rI   r‰   ÚpytestÚmarkÚslowrŠ   r   Úlistsr–   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ó   ÚNO_OLD_SETTINGSÚskipifÚplatformÚpython_implementationr
  Úsystemr  r&   r&   r&   r'   r   +   sD   			ÿÿ	ÿÿ
ÿÿü	ÿÿù	ÿÿù
	
ÿÿÿúù	ý




þ 
ý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 )ÚTestZeroCurvez.Tests with curve that has (0, 0) on the curve.c                 C   s   t dddƒ| _d S rg   )r   r    r2   r&   r&   r'   ÚsetUp{  s   zTestZeroCurve.setUpc                 C   s   |   | j dd¡¡ d S rF   )rj   r    rk   r2   r&   r&   r'   Útest_zero_point_on_curve~  s   z&TestZeroCurve.test_zero_point_on_curvec                 C   s@   t | jdddƒ}| ¡ }|  |t¡ |  d| ¡ | ¡ f¡ d S )Nr   rÜ   ©r   r   ©r   r    r?   r1   r	   r   r!   r"   ©r#   rI   Údr&   r&   r'   Útest_double_to_0_0_point  ó   z&TestZeroCurve.test_double_to_0_0_pointc                 C   sT   d}t | jd|d  d|d  |ƒ}| ¡ }|  |t¡ |  d| ¡ | ¡ f¡ d S )Nr   r   rÜ   r   r.  r/  )r#   r$   rI   r1  r&   r&   r'   Ú'test_double_to_0_0_point_with_non_one_z‰  s
    z5TestZeroCurve.test_double_to_0_0_point_with_non_one_zc                 C   s@   t | jdddƒ}|d }|  |t¡ |  d| ¡ | ¡ f¡ d S )Nr‹   rŒ   r   rš   r.  )r   r    r1   r	   r   r!   r"   r0  r&   r&   r'   Útest_mul_to_0_0_point’  r3  z#TestZeroCurve.test_mul_to_0_0_pointc                 C   s(   t | jdddƒ}| ¡ }|  |t¡ d S rB   )r   r    r?   r   r	   r0  r&   r&   r'   Útest_double_of_0_0_pointš  s   z&TestZeroCurve.test_double_of_0_0_pointc                 C   sD   t | jdddƒ}t| jddƒ}tdƒD ]}|  || || ¡ qd S )Nr‹   rŒ   r   é   )r   r    r
   rø   r   )r#   rI   Úp_cÚir&   r&   r'   Ú"test_compare_to_old_implementation¡  s
   ÿz0TestZeroCurve.test_compare_to_old_implementationN)r  r  r  Ú__doc__r,  r-  r2  r4  r5  r6  r:  r&   r&   r&   r'   r+  x  s    	r+  )*rð   ÚsysÚ	unittest2ÚunittestÚImportErrorr  r  r"  r  r(  Úhypothesis.strategiesÚ
strategiesr  Ú
hypothesisr   r   r   r   Úellipticcurver   r   r	   r
   Úecdsar   r   r   r   r   r   r   Únumbertheoryr   Úutilr   r&  Úversion_infor  ÚargvÚTestCaser   r+  r&   r&   r&   r'   Ú<module>   sB    ÿ$	


      S