B
    u9a5u                 @   s  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yd dl	m
Z
 W n ek
rh   dZ
Y nX dd ZG dd dejZG dd dZG d	d
 d
eZG dd dZG dd deZG dd deZee
dkdG dd dejZedkre  dS )    N)hamtc                s   t   fdd}|S )z*Needed to make reftracking test mode work.c                 s   t  }|j f| |S )N)contextvarsContextrun)argskwargsctx)func "/usr/lib/python3.7/test_context.pywrapper   s    z!isolated_context.<locals>.wrapper)	functoolswraps)r	   r   r
   )r	   r   isolated_context   s    r   c               @   s   e Z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edd Zdd Zdd Zdd Zedd Zedd  Zed!d" Zed#d$ Zed%d& Zd'd( Zed)d* Zd+S ),ContextTestc          	   C   s   |  td t  W d Q R X |  td td W d Q R X td}| |jd | t d|_W d Q R X | t	|t	d d S )Nztakes exactly 1zmust be a str   aaabbb)
assertRaisesRegex	TypeErrorr   
ContextVarassertEqualnameassertRaisesAttributeErrorassertNotEqualhash)selfcr
   r
   r   test_context_var_new_1   s    
z"ContextTest.test_context_var_new_1c             C   s   |  tjt  d S )N)assertIsNoner   r   int)r   r
   r
   r   test_context_var_new_2)   s    z"ContextTest.test_context_var_new_2c             C   s   t d}| dt| t jddd}| dt| g }t jd|d}|| | dt| | dt| |d}| t|t| | dt| || | dt| d S )Na{   )defaultZ123z...r   z used )r   r   assertInreprappendsetassertNotInreset)r   r   Zlsttr
   r
   r   test_context_var_repr_1,   s    



z#ContextTest.test_context_var_repr_1c          	   C   s   |  td G dd dtj}W d Q R X |  td G dd dtj}W d Q R X |  td G dd dtj}W d Q R X d S )Nznot an acceptable base typec               @   s   e Zd ZdS )z<ContextTest.test_context_subclassing_1.<locals>.MyContextVarN)__name__
__module____qualname__r
   r
   r
   r   MyContextVarB   s   r1   c               @   s   e Zd ZdS )z9ContextTest.test_context_subclassing_1.<locals>.MyContextN)r.   r/   r0   r
   r
   r
   r   	MyContextG   s   r2   c               @   s   e Zd ZdS )z7ContextTest.test_context_subclassing_1.<locals>.MyTokenN)r.   r/   r0   r
   r
   r
   r   MyTokenK   s   r3   )r   r   r   r   r   Token)r   r1   r2   r3   r
   r
   r   test_context_subclassing_1@   s    z&ContextTest.test_context_subclassing_1c          	   C   s|   |  td td W d Q R X |  td tjddd W d Q R X |  td tjdd W d Q R X tjf i  d S )Nzany argumentsr   )r#   )r   r   r   r   )r   r
   r
   r   test_context_new_1N   s    zContextTest.test_context_new_1c          	   C   sn   t  }| td |d  W d Q R X | td d|k W d Q R X | td |d W d Q R X d S )NzContextVar key was expectedr   )r   r   r   r   get)r   r   r
   r
   r   test_context_typerrors_1W   s    z$ContextTest.test_context_typerrors_1c             C   s   t  }| |t j d S )N)r   copy_contextZassertIsInstancer   )r   r   r
   r
   r   test_context_get_context_1a   s    z&ContextTest.test_context_get_context_1c          	   C   s,   t  }| td |  W d Q R X d S )Nzmissing 1 required)r   r   r   r   r   )r   r   r
   r
   r   test_context_run_1e   s    zContextTest.test_context_run_1c             C   s   t  }dd }x|t|fD ]}| ||dddif | ||ddddif | |j|dd	dddd
f | |j|ddd	dddd
f i }| |j|df|dddif | |i  q W d S )Nc              _   s   d|d< | d7 } | |fS )Nfoospam)barr
   )r   r   r
   r
   r   r	   n   s    z,ContextTest.test_context_run_2.<locals>.func)r>   r=   r<   r   )r   r>      )r#   )r#   r=      )r@   r>   )r   r   r   partialr   r   )r   r   r	   fr#   r
   r
   r   test_context_run_2k   s     zContextTest.test_context_run_2c          	   C   s   t  }dd }| t || W d Q R X | t ||dd W d Q R X | t |j|dddd W d Q R X d S )Nc              _   s   dd  d S )Nr   r   r
   )r   r   r
   r
   r   r	      s    z,ContextTest.test_context_run_3.<locals>.funcr   r?   r$   )r#   )r   r   r   ZeroDivisionErrorr   )r   r   r	   r
   r
   r   test_context_run_3   s    zContextTest.test_context_run_3c                sp   t  }t   t dfdd fdd}||}|| | d | d S )Nvarc                  s     d  d S )N)r    r7   r
   )r   rF   r
   r   func2   s    z-ContextTest.test_context_run_4.<locals>.func2c                 sb    d  d   d d t } t| d |  d | S )Nr=   r   )r    r7   r)   r   r   r   r9   len)Zcur)ctx2rG   r   rF   r
   r   func1   s    

z-ContextTest.test_context_run_4.<locals>.func1r=   )r   r   r   r   r   r&   )r   ctx1rJ   Zreturned_ctxr
   )rI   rG   r   rF   r   test_context_run_4   s    

zContextTest.test_context_run_4c          	      sT   t  }t d fdd} t || W d Q R X  d  d S )NrF   c                  s&     d  d dd  d S )Nr=   r   r   )r    r7   r)   r
   )r   rF   r
   r   r	      s    
z,ContextTest.test_context_run_5.<locals>.func)r   r   r   r   rD   r   r    r7   )r   r   r	   r
   )r   rF   r   test_context_run_5   s    
zContextTest.test_context_run_5c                s4   t  t jddd  fdd}| d S )Nr#   r   )r%   c                  sP      d    d    d   d d S )Nr   *   )r   r7   r    r)   r
   )r   r   r   r
   r   fun   s
    
z+ContextTest.test_context_run_6.<locals>.fun)r   r   r   r   )r   rO   r
   )r   r   r   r   test_context_run_6   s    zContextTest.test_context_run_6c                s&   t    fdd  d S )Nc            	      s&    td   W d Q R X d S )Nzis already entered)r   RuntimeErrorr   r
   )r   rO   r   r
   r   rO      s    z+ContextTest.test_context_run_7.<locals>.fun)r   r   r   )r   r
   )r   rO   r   r   test_context_run_7   s    zContextTest.test_context_run_7c          	   C   s  t d}| t |  W d Q R X | |d  |d}| | d | |d d | |j	|j
 | |j	t jj
 | |j| |d}| | d | |d d | |j	d || | | d | |d d |d | td || W d Q R X | | d t  }| || || | td || W d Q R X | |d  | || | || d | ||dd | t|d | t| |dfg | t| dg | t| |g | t||g t  }| || | t ||  W d Q R X | ||dd | t|d | t|g  d S )	Nr   rN   r=   Zspam2zhas already been usedaar   r   )r   r   r   LookupErrorr7   r    r)   r   assertIs	old_valueMISSINGr4   rF   r+   r   rQ   r9   r&   rH   listitemsvalueskeysr*   KeyError)r   r   Zt0r,   rK   rI   r
   r
   r   test_context_getset_1   sT    





z!ContextTest.test_context_getset_1c          	   C   sD   t d}t d}|d}| td || W d Q R X d S )Nv1v2rN   zby a different)r   r   r)   r   
ValueErrorr+   )r   r^   r_   Zt1r
   r
   r   test_context_getset_2  s
    


z!ContextTest.test_context_getset_2c                s4   t jddd t   fdd}| d S )Nr   rN   )r%   c           	      s      d t    W d Q R X     dd    t g   d}  t  g    d  	|   t g  t    W d Q R X d S )NrN   r=   r   )
r   r7   r   r\   r    r*   rX   r[   r)   r+   )r,   )r   r   r   r
   r   rO     s    

z.ContextTest.test_context_getset_3.<locals>.fun)r   r   r   r   )r   rO   r
   )r   r   r   r   test_context_getset_3  s    z!ContextTest.test_context_getset_3c          	   C   sJ   t jddd}t  }||jd}| td || W d Q R X d S )Nr   rN   )r%   r   zdifferent Context)r   r   r   r   r)   r   r`   r+   )r   r   r   tokr
   r
   r   test_context_getset_4*  s
    z!ContextTest.test_context_getset_4c                sH   t jddd  g   fdd}t  |   g  d S )Nr   rN   )r%   c                  s.     g    d   dg d S )NrN   )r)   r7   r(   r   r
   )r   r   r
   r   rO   9  s    
z.ContextTest.test_context_getset_5.<locals>.fun)r   r   r)   r9   r   r   r7   )r   rO   r
   )r   r   r   test_context_getset_54  s
    
z!ContextTest.test_context_getset_5c                sD   t  t jddd  fdd} fdd| d S )Nr   rN   )r%   c                 sz     d  } |   d   d   d |   d |    d |   d d S )N
         )r)   copyr   r   )rI   )r   rK   ctx2_funr   r
   r   ctx1_funE  s    


z1ContextTest.test_context_copy_1.<locals>.ctx1_func                  s.      d  d    d d S )Nrf   rh   )r   r7   r)   r
   )r   r   r
   r   rj   S  s    
z1ContextTest.test_context_copy_1.<locals>.ctx2_fun)r   r   r   r   )r   rk   r
   )r   rK   rj   r   r   test_context_copy_1A  s
    zContextTest.test_context_copy_1c                sb   t d  fdd}tjjdd}zt||td}W d |  X 	|ttd d S )Ncvarc                sJ   xDt dD ]8} | |  ttdd   | |  q
W | S )Nrf   gMbP?g?)ranger)   timeZsleeprandomZuniformr   r7   )Znumi)rm   r   r
   r   sub^  s
    z/ContextTest.test_context_threads_1.<locals>.subrf   )max_workers)
r   r   
concurrentZfuturesZThreadPoolExecutorrX   maprn   Zshutdownr   )r   rr   tpresultsr
   )rm   r   r   test_context_threads_1Z  s    

z"ContextTest.test_context_threads_1N)r.   r/   r0   r   r"   r   r-   r5   r6   r8   r:   r;   rC   rE   rL   rM   rP   rR   r]   ra   rb   rd   re   rl   rx   r
   r
   r
   r   r      s*   	
	6	
r   c               @   s6   e Zd ZdZddddZdd Zdd Zd	d
 ZdS )HashKeyN)error_on_eq_toc            C   s   || _ || _|| _d S )N)r   r   rz   )r   r   r   rz   r
   r
   r   __init__s  s    zHashKey.__init__c             C   s   d| j  d| j dS )Nz
<Key name:z hash:>)r   r   )r   r
   r
   r   __repr__y  s    zHashKey.__repr__c             C   s   | j d k	r| j jrt| jS )N)_crashererror_on_hashHashingErrorr   )r   r
   r
   r   __hash__|  s    zHashKey.__hash__c             C   s   t |tstS | jd k	r$| jjr$t| jd k	rL| j|krLtd| d||jd k	rt|j| krttd|d| | j| j	f|j|j	fkS )Nzcannot compare z to )

isinstancery   NotImplementedr~   error_on_eqEqErrorrz   r`   r   r   )r   otherr
   r
   r   __eq__  s    
zHashKey.__eq__)r.   r/   r0   r~   r{   r}   r   r   r
   r
   r
   r   ry   p  s
   ry   c                   s(   e Zd Z fddZ fddZ  ZS )KeyStrc                s    t jd k	rt jjrtt  S )N)ry   r~   r   r   superr   )r   )	__class__r
   r   r     s    zKeyStr.__hash__c                s"   t jd k	rt jjrtt |S )N)ry   r~   r   r   r   r   )r   r   )r   r
   r   r     s    zKeyStr.__eq__)r.   r/   r0   r   r   __classcell__r
   r
   )r   r   r     s   r   c               @   s,   e Zd ZdddddZdd Zdd Zd	S )
HaskKeyCrasherF)r   r   c            C   s   || _ || _d S )N)r   r   )r   r   r   r
   r
   r   r{     s    zHaskKeyCrasher.__init__c             C   s   t jd k	rtd| t _d S )Nzcannot nest crashers)ry   r~   rQ   )r   r
   r
   r   	__enter__  s    
zHaskKeyCrasher.__enter__c             G   s
   d t _d S )N)ry   r~   )r   excr
   r
   r   __exit__  s    zHaskKeyCrasher.__exit__N)r.   r/   r0   r{   r   r   r
   r
   r
   r   r     s   r   c               @   s   e Zd ZdS )r   N)r.   r/   r0   r
   r
   r
   r   r     s   r   c               @   s   e Zd ZdS )r   N)r.   r/   r0   r
   r
   r
   r   r     s   r   z!_testcapi lacks "hamt()" functionc               @   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-S ).HamtTestc             C   sn   t dd}t dd}| || | t|t| t }d||< d||< | || d | || d d S )Nrf   r   r   r#   b)ry   r   r   r   dict)r   k1k2dr
   r
   r   test_hashkey_helper_1  s    

zHamtTest.test_hashkey_helper_1c             C   s   t  }d }d S )N)r   )r   hr
   r
   r   test_hamt_basics_1  s    zHamtTest.test_hamt_basics_1c             C   sB  t  }| t|d |dd}| || | t|d | t|d | |d | |ddd | |dd |dd}| || | t|d | t|d | t|d | |dd | |dd | |d | |d | |d | |dd d  } }}d S )Nr   r#   r   r   rN   rf   r?   )r   r   rH   r)   assertIsNotr    r7   )r   r   h2h3r
   r
   r   test_hamt_basics_2  s*    zHamtTest.test_hamt_basics_2c             C   s4   t  }t }|d|}|d|}| || d S )N1)r   objectr)   rU   )r   r   oh1r   r
   r
   r   test_hamt_basics_3  s
    zHamtTest.test_hamt_basics_3c             C   sf   t  }|dg }|dg }| || | t|d | t|d | |d|d d S )Nkeyr   )r   r)   r   r   rH   r7   )r   r   r   r   r
   r
   r   test_hamt_basics_4  s    zHamtTest.test_hamt_basics_4c       	      C   s  t dd}t dd}t dd}t }||d}||d}| ||d  | ||d  | ||d | ||d  | ||d | ||d ||d}||d}| ||d | ||d | ||d | ||d | ||d  | ||d | ||d | ||d | ||d | t|d	 | t|d
 | t|d | t|d | t|d d S )Nrf   r   r   Zcccr#   r   ZccrS   r   r   r?      )ry   r   r)   r   r7   rH   )	r   r   r   Zk3r   r   r   Zh4Zh5r
   r
   r   test_hamt_collision_1  s8    


zHamtTest.test_hamt_collision_1c             C   s  d}d}d}d}d}xt |D ]}t }t }xt |D ]}	t|	}
|	| stdd( | t ||
|	 W d Q R X W d Q R X ||
|	}|	| stdd* | t |	t|	 W d Q R X W d Q R X |	||
< | 
t|t| |	| s>| 
t| t|  | 
t| t|  q>W | 
t|| x*t |D ]}
| 
|	t|
d	|
 qRW tt |}t| x8t|D ]*\}}	t|	}
|| stdd& | t ||
 W d Q R X W d Q R X || s,tdd* | t |t|	 W d Q R X W d Q R X ||
}| 
|	|
d	d	 ||
= | 
t|t| ||d
 kr~|}| }|| s| 
t| t|  | 
t| t|  qW | 
t|d | 
t|d x(|D ] }
| 
|	t|
||
  qW | 
t|t| xt|D ]\}	}
|t|
}| 
|	t|
d	d	 |t|
d  | 
t|t| |	| s.| 
t| t|  | 
t| t|  q.W | 
t|d | 
t|d | 
t| g  q W d S )NiX  i  a   r@   r   T)r   )r   z	not foundr?   r   )rn   r   r   r   r   r   r   r)   r   r7   r   rH   rY   rX   rp   Zshuffle	enumeratedeleteri   r[   strpoprZ   )r   ZCOLLECTION_SIZEZTEST_ITERS_EVERYZCRASH_HASH_EVERYZCRASH_EQ_EVERYZ
RUN_XTIMES_r   r   rq   r   Zkeys_to_deleteZiter_iZhmZdmr
   r
   r   test_hamt_stress  s     " 


"

"
 
"zHamtTest.test_hamt_stressc          	   C   sb  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}||d}||d}||d}t|}	||}| t||	d  | td || W d Q R X ||}| t||	d  ||}
| |
| ||}| t||	d  | |	|dd | |	|d | |	|d d S )Nd   Ae   Bf   Cg   Dh   EiZEr)rz   r#   r   r   r   er   zcannot comparer?   r   rN   )
ry   r   r)   rH   r   r   r   r`   rU   r7   )r   r   r   r   r   r   r   r   r   orig_lenr   r
   r
   r   test_hamt_delete_1t  s6    





	



zHamtTest.test_hamt_delete_1c       
   	   C   s  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}||d}||d}||d}t|}	| td || W d Q R X ||}| t||	 ||}| t||	d  ||}| t||	d  ||}| t||	d  | ||d | ||d ||}||}||}||}| t|d d S )Nr   r   i) r   i r   r   r   r   r   ir   r   )rz   r#   r   r   r   r   zcannot comparer   r?   r   r   )	ry   r   r)   rH   r   r`   r   r   r7   )
r   r   r   r   r   r   r   r   r   r   r
   r
   r   test_hamt_delete_2  s>    













zHamtTest.test_hamt_delete_2c             C   s   t dd}t dd}t dd}t dd}t dd	}t }||d
}||d}||d}||d}||d}t|}||}| t||d  ||}| t||d  | ||d | ||d d S )Nr   r   r   r   i r   r   r   r   r#   r   r   r   r   r   r?   )ry   r   r)   rH   r   r   r7   )r   r   r   r   r   r   r   r   r
   r
   r   test_hamt_delete_3  s$    






zHamtTest.test_hamt_delete_3c             C   s  t dd}t dd}t dd}t dd}t dd}t }||d	}||d
}||d}||d}||d}t|}||}| t||d  ||}| t||d  ||}| t||d  ||}| t||d  ||}| t|d d S )Nr   r   r   r   i r   r   r   r#   r   r   r   r   r   r?   r      r   )ry   r   r)   rH   r   r   )r   r   r   r   r   r   r   r   r
   r
   r   test_hamt_delete_4  s,    









zHamtTest.test_hamt_delete_4c             C   s,  t  }g }x:tdD ].}t|t|}|| ||d| }qW tdd}||d}| t|d ||d }| t|d ||}| t|d ||d }| t|d ||d	 }| t|d
 ||d	 }| t|d
 x|D ]}||}qW | t|d d S )N   zval-   Z18Z	collision   r?      r      r   )	r   rn   ry   r   r(   r)   r   rH   r   )r   r   r[   rq   r   Zcollision_key16r
   r
   r   test_hamt_delete_5#  s,    



zHamtTest.test_hamt_delete_5c       	   
   C   s   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t||df|df|df|df|df|dfh d S )Nr   r   i) r   i r   r   r   r   r   n   Fr#   r   r   r   r   rB   )ry   r   r)   rY   r   rX   )	r   r   r   r   r   r   r   r   itr
   r
   r   test_hamt_items_1T  s"    






zHamtTest.test_hamt_items_1c       	   
   C   s   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t||df|df|df|df|df|dfh d S )Nr   r   r   r   i r   r   r   r   r   r#   r   r   r   r   rB   )ry   r   r)   rY   r   rX   )	r   r   r   r   r   r   r   r   r   r
   r
   r   test_hamt_items_2i  s"    






zHamtTest.test_hamt_items_2c          	   C   s   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t| ||||||h | tt|||||||h d S )Nr   r   r   r   i r   r   r   r   r   r#   r   r   r   r   rB   )ry   r   r)   r   rX   r[   )r   r   r   r   r   r   r   r   r
   r
   r   test_hamt_keys_1~  s    





$zHamtTest.test_hamt_keys_1c             C   s2   t  }| t| d | t| g  d S )Nr   )r   r   rH   rY   rX   )r   r   r
   r
   r   test_hamt_items_3  s    zHamtTest.test_hamt_items_3c             C   s  t dd}t dd}t dd}t dd}t dd	}t }||d
}||d}||d}||d}t }||d
}| ||k | ||k ||d}| ||k | ||k ||d}| ||k | ||k ||d}| ||k | ||k ||d}| ||k | ||k ||d}| ||k | ||k ||}| ||k | ||k ||d}| ||k | ||k d S )Nr   r   r   r   i r   r   x   r   r#   r   r   r   Zd2r   )ry   r   r)   assertFalse
assertTruer   )r   r   r   r   r   r   r   r   r
   r
   r   test_hamt_eq_1  sF    





zHamtTest.test_hamt_eq_1c          	   C   s   t dd}t dd|d}t }||d}t }||d}| td ||k W d Q R X | td ||k W d Q R X d S )Nr   r   r   )rz   r#   zcannot compare)ry   r   r)   r   r`   )r   r   r   r   r   r
   r
   r   test_hamt_eq_2  s    
zHamtTest.test_hamt_eq_2c             C   s   t dd}t }|dd}t|}g }|| || g }|| || |||}~~~t  t  t  | |  d S )Nr   r   r   )	ry   r   r)   weakrefrefr(   gccollectr    )r   r   r   r   r#   r   r
   r
   r   test_hamt_gc_1  s     





zHamtTest.test_hamt_gc_1c             C   sx   t dd}t dd}t }||d}|||}t|}| }t| ~~t  t  t  | 	|  d S )Nr   r   r   r   r#   )
ry   r   r)   r   r   rY   nextr   r   r    )r   r   r   r   r   hir
   r
   r   test_hamt_gc_2  s    


zHamtTest.test_hamt_gc_2c          
   C   s   t dd}t dd}t dd}t }||d}| ||k | ||k | t$ tdd ||k W d Q R X W d Q R X | t$ tdd ||k W d Q R X W d Q R X d S )	Nr   r   r   r   r   T)r   )r   )	ry   r   r)   r   r   r   r   r   r   )r   r   AAr   r   r
   r
   r   test_hamt_in_1   s    


zHamtTest.test_hamt_in_1c          
   C   s   t dd}t dd}t dd}t }||d}| || d | || d | t ||  W d Q R X | t$ tdd ||  W d Q R X W d Q R X | t$ tdd ||  W d Q R X W d Q R X d S )	Nr   r   r   r   r   T)r   )r   )	ry   r   r)   r   r   r\   r   r   r   )r   r   r   r   r   r
   r
   r   test_hamt_getitem_1  s    


zHamtTest.test_hamt_getitem_1N)r.   r/   r0   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     s,   	%Y-4$*1/r   __main__)concurrent.futuresrt   r   r   r   rp   ro   Zunittestr   Z	_testcapir   ImportErrorr   ZTestCaser   ry   r   r   r   	Exceptionr   r   ZskipIfr   r.   mainr
   r
   r
   r   <module>   s8   
	  Y!
    |
