U
    /e                     @  sD  d dl m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 d dlZd dlmZ dZdd	 Zd
d ZddddddZdddddZdddddZdddddZd-ddddddZdddddZd ddd!d"Zd.dddd$d%d&Zdddd'd(ZG d)d* d*eeZG d+d, d,eZdS )/    )annotationsN)UserDict)	ItemsViewKeysViewMutableMapping
ValuesView)ThreadPoolExecutor)ZictBase   c                   s`   t dg }tjtj  t| D ]8}||}d fddt|D }|| q"|S )N*    c                 3  s   | ]}  V  qd S N)choice).0_charsr 9/tmp/pip-unpacked-wheel-z3s6s24u/zict/tests/utils_test.py	<genexpr>   s     z*generate_random_strings.<locals>.<genexpr>)	randomRandomstringascii_lowercasedigitsrangerandintjoinappend)nZmin_lenmax_lenoutr   Zncharssr   r   r   generate_random_strings   s    
r$   c                 C  s   t | tr| S | dS d S )Nlatin1)
isinstancebytesencode)r#   r   r   r   to_bytestring!   s    
r)   r   zlist[tuple[str, bytes]]None)zexpected_itemsreturnc                 C  sr  t |  }t|t|ks tt|t|ks4tt |  dd |D ksRtt |  dd |D ksptt | dd |D kstt|  tstt|  t	stt|  t
st|d |  kst|d d |  kst|d d | kst|d d |  kstt t f|  ks6tt |  ksJtt | ksZtt |  ksntd S )Nc                 S  s   g | ]\}}|qS r   r   r   kvr   r   r   
<listcomp>-   s     zcheck_items.<locals>.<listcomp>c                 S  s   g | ]\}}|qS r   r   r.   r   r   r   r1   .   s     c                 S  s   g | ]\}}|qS r   r   r.   r   r   r   r1   /   s     r   r
   )listitemslenAssertionErrorsortedkeysvaluesr&   r   r   r   object)r+   r,   r3   r   r   r   check_items(   s"    r:   )r+   r-   c                 C  s6  t d}ttj}dd tt|ddD }|   t| dksFtt	||D ]\}}|| |< qPt| t|ksvtt
| t
|kstt
|  t
t	||ksttdD ]}|| || t	||D ]\}}|| |< qt| tt	|| || || | t	|| t| tt	|| qd S )Nr   c                 S  s   g | ]}t |qS r   )r)   )r   r#   r   r   r   r1   F   s     z/stress_test_mapping_updates.<locals>.<listcomp>r
   
   r      )r   r   r2   r   r   r$   r4   clearr5   zipr6   r3   r   shuffler:   update)r+   r   r7   r8   r/   r0   r   r   r   r   stress_test_mapping_updates?   s(    







rA   c                 C  s   | rt t| t|    kr(g ks.n t t|  g ksBt t|  g ksVt t| dksft d| ksrt d|  kst d|  kst d|  kst d S )Nr   x)rB      123rC   )r5   r2   r7   r8   r3   r4   r+   r   r   r   check_empty_mapping^   s    &rE   c              	   C  s  t | jt| kstt | jt| ks,tt| ts:tt|  d| d< d| d< t| dksbt| d dksrtt	| ddg d| kstd| kstd| kstt
 | ksttt | d  W 5 Q R X | jd	d
d t	| dddg | ddg t	| dddg | ddi t	| dddg | tddg t	| dddddg | d= tt | d  W 5 Q R X tt | d= W 5 Q R X d| kstt| ddddhkstt| dkstd| d< t| dkst| d dkstd| kstt|  dS )zSee also test_zip.check_mapping   456abc   12xyz   )rG   rF   )rI   rH   def   707   000)rI   uvw)rI   rL   )rN   rM   )rI   s   654)rN   s   999   321)rI   rO   )foos   132)bars   887rN   rP   rQ      s       N)type__name__strr5   reprr&   r   rE   r4   r:   r9   pytestraisesKeyErrorr@   itersetrA   rD   r   r   r   check_mappingj   sX    r]   Fbool)r+   allow_keyerrorr-   c              	     st   t dddg fdd}td6}||ddd}||ddd	}|  |  W 5 Q R X rptd S )
NrJ   r   c              	     s      tdd D r||< z| |ks4t|= W n tk
rZ    rTY q Y nX |kshttt | }W 5 Q R X tt |= W 5 Q R X tdkst|   d7  < qd S )Nc                 s  s   | ]}|d k V  qdS r;   Nr   r   cr   r   r   r      s     zBcheck_different_keys_threadsafe.<locals>.worker.<locals>.<genexpr>)r   r
   r
   )waitanyr5   rZ   rX   rY   r4   )idxkeyvaluer   r_   barriercountersr+   r   r   worker   s"    
z/check_different_keys_threadsafe.<locals>.workerrB   rC   r
   yrF   )	threadingBarrierr   submitresultr5   )r+   r_   rk   exf1f2r   rh   r   check_different_keys_threadsafe   s    

rt   c              	     s   t d ddddg fdd} fdd} fdd} fd	d
}td<}||||||||g}|D ]}|  qW 5 Q R X dd  d S )NrR   r   c                     s8       tdd D r4dd< d  d7  < qd S )Nc                 s  s   | ]}|d k V  qdS r`   r   ra   r   r   r   r      s     z;check_same_key_threadsafe.<locals>.w_set.<locals>.<genexpr>rC   rB   r   r
   )rc   rd   r   ri   rj   r+   r   r   w_set   s    z(check_same_key_threadsafe.<locals>.w_setc                     s<       tdd D r8jdd d  d7  < qd S )Nc                 s  s   | ]}|d k V  qdS r`   r   ra   r   r   r   r      s     z>check_same_key_threadsafe.<locals>.w_update.<locals>.<genexpr>rF   )rB   r
   )rc   rd   r@   r   ru   r   r   w_update   s    z+check_same_key_threadsafe.<locals>.w_updatec                     sP       tdd D rLzd= d  d7  < W q tk
rH   Y qX qd S )Nc                 s  s   | ]}|d k V  qdS r`   r   ra   r   r   r   r      s     z;check_same_key_threadsafe.<locals>.w_del.<locals>.<genexpr>rB   rJ   r
   )rc   rd   rZ   r   ru   r   r   w_del   s    z(check_same_key_threadsafe.<locals>.w_delc                     sZ       tdd D rVz$d dks,td  d7  < W q tk
rR   Y qX qd S )Nc                 s  s   | ]}|d k V  qdS r`   r   ra   r   r   r   r      s     z;check_same_key_threadsafe.<locals>.w_get.<locals>.<genexpr>rB   )rC   rF   r<   r
   )rc   rd   r5   rZ   r   ru   r   r   w_get   s    z(check_same_key_threadsafe.<locals>.w_getrB   )rm   rn   r   ro   rp   pop)r+   rv   rw   rx   ry   rq   Zfuturesfr   ru   r   check_same_key_threadsafe   s    
		
r|   r	   c                 C  s   |    d S r   )closerD   r   r   r   check_closing   s    r~   T)r+   has_delr-   c              	   C  s   t  }|| kst||  ks"t|df|  ks6ttt d| |< W 5 Q R X tt | |di W 5 Q R X tt | |  W 5 Q R X |rtt | |= W 5 Q R X dS )zxz does not accept any Hashable as keys.
    Test that it reacts correctly when confronted with an invalid key type.
    rC   N)	r9   r5   r7   r3   rX   rY   	TypeErrorr@   rZ   )r+   r   badr   r   r   check_bad_key_types   s    r   c              	   C  sp   t  }||  kstd|f|  ks*ttt || d< W 5 Q R X tt | d|i W 5 Q R X dS )zz does not accept any Python object as values.
    Test that it reacts correctly when confronted with an invalid value type.
    rB   N)r9   r8   r5   r3   rX   rY   r   r@   )r+   r   r   r   r   check_bad_value_types  s    r   c                   @  s   e Zd Zdd ZdS )
SimpleDictc                 C  s   t |  t|  d S r   )r	   __init__r   )selfr   r   r   r     s    
zSimpleDict.__init__N)rU   
__module____qualname__r   r   r   r   r   r     s   r   c                      s4   e Zd Z fddZ fddZ fddZ  ZS )SlowDictc                   s   || _ t |  d S r   )delaysuperr   )r   r   	__class__r   r   r   %  s    zSlowDict.__init__c                   s   t | j t |S r   )timesleepr   r   __getitem__)r   rf   r   r   r   r   )  s    zSlowDict.__getitem__c                   s   t | j t || d S r   )r   r   r   r   __setitem__)r   rf   rg   r   r   r   r   -  s    zSlowDict.__setitem__)rU   r   r   r   r   r   __classcell__r   r   r   r   r   $  s   r   )F)T) 
__future__r   r   r   rm   r   collectionsr   collections.abcr   r   r   r   concurrent.futuresr   rX   Zzict.commonr	   ZREPEAT_STRESS_TESTSr$   r)   r:   rA   rE   r]   rt   r|   r~   r   r   r   r   r   r   r   r   <module>   s0   ; #/