B
    #XnTT                 @   s   d dl Z d dlZd dlZd dlZyejd dd ejZW n ek
rV   d#ddZY nX d$d	d
Ze jdejej	gd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 )%    N)startstep   c             c   s6   |d }x(t t| D ]\}}|||  V  qW d S )Nr   )	enumerate	itertoolscount)r   r   ijc r   =lib/python3.7/site-packages/fastcache/tests/test_clrucache.pyr   
   s    r   d      c             c   sV   xPt | |D ]B}x<t |D ]0}x*tt |t|dD ]\}}||fV  q4W qW qW d S )Nr   )rangezipr   )minmaxrepeatr	   rr
   kr   r   r   arg_gen   s    r   module)ZscopeZparamsc             C   s
   | j }|S )N)param)Zrequestr   r   r   r   cache   s    r   c             C   sP   dd }|  |}|j |j ks"tt|ds0tt|ds>tt|dsLtdS )z* Simple tests for attribute preservation. c             S   s   | | S )ztest function docstring.r   )abr   r   r   tfunc   s    z'test_function_attributes.<locals>.tfunc
cache_infocache_clear__wrapped__N)__doc__AssertionErrorhasattr)r   r   cfuncr   r   r   test_function_attributes   s    
r%   c                sz  dg d fdd	}| d d|}x0t ddd	D ] \}}||||||ks2tq2W d
 d< x0t ddd	D ] \}}||||||ksltqlW i }| d|d|}|dd | jdkstd|d< |dd | jdkst|dd | jdkst| jdkst|  |dd | jdks<t| jdksPtd|d< |dd | jdksvtdS )z- Test that cache returns appropriate values. TNc                s2    d dkr| ||f|| f S d|  d|  S d S )Nr   T   
   r   )r   r   r   )
cat_tuplesr   r   r   .   s    z"test_function_cache.<locals>.tfuncr   )maxsizestateK      )r   r   Fr   r   r&   *   r   ,   r   )N)r   r"   r   misseshitsclear)r   r   r$   r	   r
   dr   )r(   r   test_function_cache)   s2    




r3   c             C   s\   dd }| dd|}x@t dddD ]0\}}||||| d||||| dks$tq$W d	S )
z0 Longer running test to check for memory leaks. c             S   s.   | d d| fd| d | | | | | f S )Nr   r&   r'   r   )r   r   r   r   r   r   r   U   s    z test_memory_leaks.<locals>.tfunci  )r)   i  r,   )r   r   )r   N)r   r"   )r   r   r$   r	   r
   r   r   r   test_memory_leaksR   s    r4   c          	   C   s   | dddd }t  n t d |dgd|dgdksDt|t}t|jts^tdt	|j
kspt|jszt|jstW d	Q R X d	S )
z& Function arguments must be hashable. Zwarning)
unhashablec             S   s   | f|f S )Nr   )r   r   r   r   r   f`   s    z$test_warn_unhashable_args.<locals>.falwaysr   r&   z%Unhashable arguments cannot be cachedN)warningscatch_warningssimplefilterr    r"   popUserWarning
issubclasscategorystrmessagefilenamelineno)r   Zrecwarnr6   wr   r   r   test_warn_unhashable_args]   s    



rD   c             C   s4   | dddd }|dgd| dgdks0tdS )z& Function arguments must be hashable. ignore)r5   c             S   s   | f|f S )Nr   )r   r   r   r   r   r6   q   s    z&test_ignore_unhashable_args.<locals>.fr   r&   N)r    r"   )r   r6   r   r   r   test_ignore_unhashable_argsn   s    rF   c          	   C   sh   |  dd }t t |dgd W d Q R X | dddd }t t |dgd W d Q R X d S )Nc             S   s   | f|f S )Nr   )r   r   r   r   r   r6   x   s    z'test_default_unhashable_args.<locals>.fr   r&   error)r5   c             S   s   d S )Nr   )r   r   r   r   r   r6      s    )pytestraises	TypeError)r   r6   r   r   r   test_default_unhashable_argsw   s    rK   c          	   C   sT   dd }t t | dd| W dQ R X t t | dd| W dQ R X dS )z State must be a list or dict. c             S   s   | S )Nr   )xr   r   r   <lambda>   s    z!test_state_type.<locals>.<lambda>)r   )r*   Nr   )rH   rI   rJ   )r   r6   r   r   r   test_state_type   s
    rN   c             C   s   | dddd }|dd |dd|ddks4t |dd|ddksLt |ddd	 |ddd	|ddd	kstt |ddd	|ddd	kst d
S )z Verify typed==False. F)typedc             S   s   | | S )Nr   )r   r   r   r   r   r$      s    ztest_typed_False.<locals>.cfuncr   r&   g      ?g       @)r   N)r"   )r   r$   r   r   r   test_typed_False   s    
rP   c             C   s~   | dddd }|dd|ddk	s*t |dd|ddk	sBt |ddd	|ddd	k	s^t |ddd	|ddd	k	szt d
S )z Verify typed==True. T)rO   c             S   s   | | S )Nr   )r   r   r   r   r   r$      s    ztest_typed_True.<locals>.cfuncr   r&   g      ?g       @)r   N)r"   )r   r$   r   r   r   test_typed_True   s
    rQ   c             C   s*   dd }|  |}d|_ |j dks&td S )Nc             S   s   | S )Nr   )rL   r   r   r   rM      s    z(test_dynamic_attribute.<locals>.<lambda>r,   )Znew_attrr"   )r   r6   r$   r   r   r   test_dynamic_attribute   s    
rR   )r   r   )r   r   r   )rH   Z	fastcacher   r8   r   rJ   r   ZfixtureZ
clru_cache	lru_cacher   r%   r3   r4   rD   rF   rK   rN   rP   rQ   rR   r   r   r   r   <module>   s*   


)	