U
    /e'                     @   s  d dl Z d dlZd dlmZ d dlmZ d dlZd dlmZ d dl	m
Z
 dd Zdd	 Zd
d Zdd Zdd Zdd Zdd Zdd Zejddejdddd Zejddejdddd Zejjeje
jdd Zejjeje
jd d! ZdS )"    N)UserDict)ThreadPoolExecutor)Buffer)
utils_testc                  C   s  i } i }t | |ddd d}d|d< d|d< |d dks<t|d dksLt| ddd	ks^t|jjd
ksntd|d< | dddkst|ddikst|d dkst| dddkst|ddikstd|kstd|kstd|kstd|d< | ddddkst|jjdkst|i ks,t|d= | ddd	ksFt|jjdksXt|i ksft|d= | ddiks~t|jjdkst|i kstd|kstd|d< t|t|   krddhksn tt|j}t|j}||@ rt||B t|kstd|d< d|jks2tt|j|ksFtt|jdh|B ks`td|ksnt|d dkstd S )N
   c                 S   s   |S N kvr   r   :/tmp/pip-unpacked-wheel-z3s6s24u/zict/tests/test_buffer.py<lambda>       ztest_simple.<locals>.<lambda>nweight   x   yr   r         zr   r   )r   r   missingr   r   r      ai  b)r   AssertionErrorfasttotal_weightsetkeysslow)r   r   buff	fast_keys	slow_keysr   r   r   test_simple   sV    .

r)   c                  C   s   i } i }t | |ddd d}dD ]\}}||d< |d |ks@t||d< |d |ksXtt|j}t|j}||@ rxt||B t|kst|d= d|kstd| kstd|ks tq d S )Nr   c                 S   s   |S r   r   r	   r   r   r   r   J   r   z8test_setitem_avoid_fast_slow_duplicate.<locals>.<lambda>r   ))r      )r*   r   r   )r   r    r#   r!   r%   )r   r   r&   firstsecondr'   r(   r   r   r   &test_setitem_avoid_fast_slow_duplicateG   s     

r-   c                  C   s   i } i }t | |dd}t| t| |  |jr<t|jrFt|jrPt|jj	r\t|jj
rht|jjrtt|jjrtdS )z.
    Test mapping interface for Buffer().
    r   r   N)r   r   check_mappingZcheck_closingclearr%   r    _cancel_restorer!   dweightsr"   _cancel_evictr   r   r&   r   r   r   test_mapping\   s    




r6   c                     s   g   fdd} g fdd}i }i }t ||ddd | |d}d	|d
< d|d< |d
 d	ks`t|d dkspt rxtrtd|d<  d
gkstg kst|d   d
gkstg kst|d
   d
dgkstd
gkstd S )Nc                    s     |  d S r   appendr	   f2sr   r   f2s_cbs   s    ztest_callbacks.<locals>.f2s_cbc                    s     |  d S r   r7   r	   s2fr   r   s2f_cbx   s    ztest_callbacks.<locals>.s2f_cbr   c                 S   s   |S r   r   r	   r   r   r   r      r   z test_callbacks.<locals>.<lambda>r   r   Zfast_to_slow_callbacksZslow_to_fast_callbacksr   r   r   r   r   r   )r   r    r;   r>   r   r   r&   r   r:   r=   r   test_callbacksp   s:    	rB   c               	      s\  G dd dt  g  fdd} g fdd}i }i }t||ddd	 | |d
}d|d< d|d< |d dksrt|d dkstrtrt|dddkst|rtd|d< dgkstg kst|dddkst|ddikstt  d|d< W 5 Q R X dddgks"tg ks0t|ddiksBt|ddddksXtd S )Nc                   @   s   e Zd ZdS )z/test_callbacks_exception_catch.<locals>.MyErrorN)__name__
__module____qualname__r   r   r   r   MyError   s   rF   c                    s   |dkr   |  d S )Nr   r7   r	   )rF   r:   r   r   r;      s    z.test_callbacks_exception_catch.<locals>.f2s_cbc                    s     |  d S r   r7   r	   r<   r   r   r>      s    z.test_callbacks_exception_catch.<locals>.s2f_cbr   c                 S   s   |S r   r   r	   r   r   r   r      r   z0test_callbacks_exception_catch.<locals>.<lambda>r?   r   r   r   r   r   r   r   r      wr   )	Exceptionr   r    pytestraisesr@   r   )rF   r:   r=   r   test_callbacks_exception_catch   sD    	rL   c                  C   s   t i i dd} | jdkst| jjdks,td| _| jjdksBt| jdksPt| jjdks`td| _| jdkstt| jjdkstd S )Nr   r.   r   r   r   )r   r   r    r!   offsetr&   r   r   r   test_n_offset   s    rO   c               	      s  i } i }g  g t | |ddd  fddfddd}|dd |d	d |d
d | ddddkspt|i ks|t   krg ksn t|  | d	dikst|dddkst d
dgkstg kst   |dd | dddkst|d
dikst   kr.g ks4n t|d | i ksLt|ddddksbt d	dgksttg kstd S )Nr   c                 S   s   |S r   r   r	   r   r   r   r      r   z"test_set_noevict.<locals>.<lambda>c                    s
     | S r   r7   r	   r9   r   r   r      r   c                    s
     | S r   r7   r	   r<   r   r   r      r   r?   r   r   r   r      r   )r   r   r   )r   r   r   )r   r   r   )r   set_noevictr    Zevict_until_below_targetr0   r5   r   rA   r   test_set_noevict   sB    


rR   c               	   C   s   t dddddidd} t| dd	dgks.tt| }t|dksFt| jd t|d	ksbt| d dksrtt|dksttt	 t| W 5 Q R X d
S )zPTest that __iter__ won't be disrupted if another thread evicts or restores a keyr   r   r   r   r   r   r.   r   r   N)
r   listr    iternextr!   evictrJ   rK   StopIteration)r&   itr   r   r   test_evict_restore_during_iter  s    rY   event)r#   rQ   delwhen)beforeafterc              	      sj  t   t  G  fdddt}ti | ddd d}|dd tdv}||jj} j	d	d
srt
| dkrd|d< n(| dkr|dd n| dkst
|d=   | dkst
W 5 Q R X | dkr$|jddikst
|jrt
|jjddiks
t
t|jjdgksXt
n4|jr0t
|jr<t
|jjrJt
|jjrXt
|jjrft
dS )zJSee also:

    test_cancel_restore
    test_lru.py::test_cancel_evict
    c                       s"   e Zd Z fddZ  ZS )ztest_cancel_evict.<locals>.Slowc                    sZ   dkr0   jdds tt || n&t ||    jddsVtd S Nr]   r   timeout)r#   waitr    super__setitem__)selfr
   r   	__class__ev1ev2r\   r   r   rd   %  s    z+test_cancel_evict.<locals>.Slow.__setitem__)rC   rD   rE   rd   __classcell__r   rh   ri   r\   rg   r   Slow$  s   rm   d   c                 S   s   |S r   r   r	   r   r   r   r   /  r   z#test_cancel_evict.<locals>.<lambda>r   r   r   r   r`   r#   r   rQ   r[   )NNr   r#   rQ   N)	threadingEventr   r   rQ   r   submitr!   rV   rb   r    r#   resultr%   r3   rS   orderr4   rZ   r\   rm   r&   exZfutr   rk   r   test_cancel_evict  s4    



rw   c              
      s  t   t  G  fdddt}ti | ddd d}|dd |j  |jr^tt|j	dhksrtt
d}||jd} jd	d
st| dkrd|d< n(| dkr|dd n| dkst|d=   tjtdd |  W 5 Q R X W 5 Q R X | dkrb|jddiks&t|j	r2t|jjddiksHtt|jjdgkstn4|jrnt|j	rzt|jjrt|jjrt|jrtdS )zHSee also:

    test_cancel_evict
    test_lru.py::test_cancel_evict
    c                       s"   e Zd Z fddZ  ZS )z!test_cancel_restore.<locals>.Slowc                    sX   dkr,   jdds tt |S t |}   jddsPt|S d S r_   )r#   rb   r    rc   __getitem__)re   r
   outrf   r   r   rx   Z  s    z-test_cancel_restore.<locals>.Slow.__getitem__)rC   rD   rE   rx   rj   r   rk   rl   r   rm   Y  s   rm   rn   c                 S   s   |S r   r   r	   r   r   r   r   e  r   z%test_cancel_restore.<locals>.<lambda>r   r   r   r   r`   r#   r   rQ   r[   )matchro   N)rp   rq   r   r   rQ   r!   rV   r    r#   r%   r   rr   rx   rb   rJ   rK   KeyErrorrs   r3   rS   rt   r1   ru   r   rk   r   test_cancel_restoreN  s<    




r|   c                  C   sF   t i tdddd d} t|  | jr.t| jr8tt|  d S )NMbP?r   c                 S   s   t dddgS )Ng??皙?randomchoicer	   r   r   r   r     r   z7test_stress_different_keys_threadsafe.<locals>.<lambda>r   )r   r   SlowDictZcheck_different_keys_threadsafer!   r    r%   r/   rN   r   r   r   %test_stress_different_keys_threadsafe  s    


r   c                  C   sF   t i tdddd d} t|  | jr.t| jr8tt|  d S )Nr}   r   c                 S   s   t ddgS )Nr~   r   r   r	   r   r   r   r     r   z1test_stress_same_key_threadsafe.<locals>.<lambda>r   )r   r   r   Zcheck_same_key_threadsafer!   r    r%   r/   rN   r   r   r   test_stress_same_key_threadsafe  s    


r   )r   rp   collectionsr   concurrent.futuresr   rJ   Zzictr   Z
zict.testsr   r)   r-   r6   rB   rL   rO   rR   rY   markZparametrizerw   r|   ZstressrepeatZREPEAT_STRESS_TESTSr   r   r   r   r   r   <module>   s4   ;,8*3: