U
    Fvf@                  
   @   s  d dl Z d dlm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
d dlZd dlmZ d dlmZ d dlmZ e
 dd ZG dd	 d	ejZd
d Ze
jjdeedgdgddd Zdd ZejdG dd deZdddddddgZdd Z e
jde  e
jjdeedgdgddd  Z!e
jd!e
j"d"e
jj#ej$%  d#d$d%e
j"d&e
jj#ej&%  d'd$d%ge
jd(d)d*d+ge
jjdeedgdgdd,d- Z'e
jjdd.e(e)d/d0gdgdd1d2 Z*d3d4 Z+e
jd5e
j"d6e
jj#ej,ej-d7  d8d$d%d9ge
jjded:d;gdgdd<d= Z.e
jd5e
j"d6e
jj#ej,ej-d7  d8d$d%d9ge
jjded:d;gdgdd>d? Z/e
jj#e j0d@kdAd$dBdC Z1e
jdDdEdFgdGdH Z2e
jdIddJd:dKdLgdMdN Z3dOdP Z4dQdR Z5edSgdTdUdV Z6e
jjdeedgdgddWdX Z7e
jjdeedgdgddYdZ Z8e
jjdeedgdgdd[d\ Z9d]d^ Z:dS )_    N)Path)pyplot)	animation)check_figures_equalc                    s   t  \}}|g g \ |dd |dd  fdd} fdd}tt| d	i }|d
tj	}d|krxd|d< |f |||d|S )z)Create a simple animation (with options).r   
      c                      s     g g   fS Nset_data liner   C/tmp/pip-unpacked-wheel-7vhvci0g/matplotlib/tests/test_animation.pyinit   s    zanim.<locals>.initc                    s.   t ddd}t ||  } ||  fS )Nr   r   d   )nplinspacesinr   )ixyr   r   r   animate   s    zanim.<locals>.animateparamklassframes   )figfunc	init_func)
pltsubplotsplotset_xlimset_ylimdictgetattrpopr   FuncAnimation)requestr   axr   r   kwargsr   r   r   r   anim   s    r,   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	NullMovieWritera  
    A minimal MovieWriter.  It doesn't actually write anything.
    It just saves the arguments that were given to the setup() and
    grab_frame() methods as attributes, and counts how many times
    grab_frame() is called.

    This class doesn't have an __init__ method with the appropriate
    signature, and it doesn't define an isAvailable() method, so
    it cannot be added to the 'writers' registry.
    c                 G   s"   || _ || _|| _|| _d| _d S )Nr   )r   outfiledpiargs_count)selfr   r.   r/   r0   r   r   r   setup9   s
    zNullMovieWriter.setupc                 K   s   || _ |  jd7  _d S )Nr   )savefig_kwargsr1   )r2   r4   r   r   r   
grab_frame@   s    zNullMovieWriter.grab_framec                 C   s   d S r	   r   r2   r   r   r   finishD   s    zNullMovieWriter.finishN)__name__
__module____qualname____doc__r3   r5   r7   r   r   r   r   r-   -   s   r-   c                 C   s   dt jd< d}d}tdd}t }| j||||d |jt dksHt|j|ksVt|j	|ksdt|j
d	ksrt| D ]\}}|j| |ksztqz|j| jkstd S )
Nautozsavefig.facecolorunused.null2   r   )Zfoo)r/   writerr4   r   r   )r    rcParamsr%   r-   saver   figureAssertionErrorr.   r/   r0   itemsr4   r1   _save_count)r,   filenamer/   r4   r?   kvr   r   r   test_null_movie_writerH   s    


rI   )r   )Zindirectc              	   C   sL   t  dkrtj  tjf | } tjt	dd ~ tj  W 5 Q R X d S )NPyPyzAnimation was deletedmatch)
platformpython_implementationr   testingbreak_cyclesr   r(   pytestwarnsWarningr,   r   r   r   test_animation_delete^   s    
rU   c                  C   s^   G dd dt j} t }d}d}d}d}dg}| ||||}||| |j|jksZtd S )Nc                   @   s   e Zd Zdd ZdS )z7test_movie_writer_dpi_default.<locals>.DummyMovieWriterc                 S   s   d S r	   r   r6   r   r   r   _runm   s    z<test_movie_writer_dpi_default.<locals>.DummyMovieWriter._runN)r8   r9   r:   rV   r   r   r   r   DummyMovieWriterl   s   rW   r=   r   Zunusedr   )r   ZMovieWriterr    rB   r3   r/   rC   )rW   r   rF   fpscodecbitrate
extra_argsr?   r   r   r   test_movie_writer_dpi_defaultk   s    r\   nullc                   @   s"   e Zd ZdddZedd ZdS )RegisteredNullMovieWriterNc                 C   s   d S r	   r   )r2   rX   rY   rZ   r[   metadatar   r   r   __init__   s    z"RegisteredNullMovieWriter.__init__c                 C   s   dS )NTr   )clsr   r   r   isAvailable   s    z%RegisteredNullMovieWriter.isAvailable)NNNNN)r8   r9   r:   r`   classmethodrb   r   r   r   r   r^   ~   s   	    
r^   )ffmpeg	movie.mp4)Zffmpeg_filere   )imagemagick	movie.gif)Zimagemagick_filerg   )pillowrg   )htmlz
movie.html)r]   z
movie.nullc                  c   s   t D ]\} }tj| s^tjd|  d}tj| d ||gdV  tj| d t||gdV  qtj|  }t	|dd gD ] }| ||fV  | |t|fV  qvqd S )Nzwriter 'z' not available on this systemZmarksZsupported_formats)
WRITER_OUTPUTr   writersis_availablerQ   markskipr   r   r&   )r?   outputrn   Zwriter_classframe_formatr   r   r   gen_writers   s    

rr   zwriter, frame_format, outputc              	   C   sr   |d k	r|t jd< tjf |}d }d }|dkrB|jd d}d}|   |j|d|d||d W 5 Q R X ~d S )	Nzanimation.frame_formatrd   )g33333%@gQk"@g      Y@Zh264   i  )rX   r?   rZ   r/   rY   )r    r@   r   r(   Z_figZset_size_inchesas_cwdrA   )tmpdirr?   rq   rp   r,   r/   rY   r   r   r   test_save_animation_smoketest   s    

rv   r?   rd   Requires FFMpeg)reasonrj   rf   zRequires ImageMagickz
html, want)noneN)html5z<video width)Zjshtmlz<script c              	   C   s   t  dkrtj  | dkr:|dkr:tj s:t	d tj
f |}t| |d | }W 5 Q R X |d kr|d ks~ttt ~tj  W 5 Q R X n||kstd S )NrJ   rf   rz   rw   )animation.writerzanimation.html)rM   rN   r   rO   rP   r   FFMpegWriterrb   rQ   ro   r(   r    
rc_contextZ_repr_html_rC   rR   UserWarning)r?   ri   Zwantr,   r   r   r   test_animation_repr_html   s"    


r   r   r   )
save_countr   c                 C   s   | j dt d d S )Nr=   r?   )rA   r-   rT   r   r   r   test_no_length_frames   s    r   c                  C   s^   t tjjdkstdtjd< tjdr.ttj	dkr<dnd} | tjd< tjdsZtd S )Nr   Znot_available_ever_xxxxzanimation.ffmpeg_pathrd   win32truewhere)
lenr   rl   _registeredrC   mplr@   rm   sysrM   )binr   r   r   test_movie_writer_registry   s    

r   method_nameZto_html5_videor{   zanimation writer not installedZ	to_jshtmlr   )r   c              
   C   sz   | d | , tddi t||   W 5 Q R X W 5 Q R X t|jdksVt|j\}|jdkrr|j	dksvtd S )NWARNINGzanimation.embed_limitgư>r   zmatplotlib.animation)
Z	set_levelrt   r   r}   r&   r   recordsrC   name	levelname)r   Zcaplogru   r,   recordr   r   r   test_embed_limit   s    

 
r   c              	   C   s@   |  . t||   ttt| g ks2tW 5 Q R X d S r	   )rt   r&   listr   striterdirrC   )r   ru   r,   r   r   r   test_cleanup_temporaries  s    
r   posixzrequires a POSIX OSc              
   C   st   |   b |ddtjd   tt| d}|d t|d t	t
j |d W 5 Q R X W 5 Q R X dS )a!  
    Test that we correctly raise a CalledProcessError when ffmpeg fails.

    To do so, mock ffmpeg using a simple executable shell script that
    succeeds when called with no arguments (so that it gets registered by
    `isAvailable`), but fails otherwise, and add it to the $PATH.
    PATHz.:rd   s   #!/bin/sh
[[ $@ -eq 0 ]]
i  z	test.mpegN)rt   Zsetenvosenvironr   r   write_byteschmodrQ   raises
subprocessCalledProcessErrorrA   )ru   Zmonkeypatchr,   Zexe_pathr   r   r   test_failing_ffmpeg  s    	

r   cache_frame_dataFTc           
         s   t  \}}|g g \G dd dt fdd}fdd}g  fdd}d	}tj||||| |d
}t }|jd|d tdkst	t
j  D ]}	|	 d k| kst	qd S )Nc                   @   s   e Zd ZdS )z2test_funcanimation_cache_frame_data.<locals>.FrameN)r8   r9   r:   r   r   r   r   Frame6  s   r   c                      s     g g   fS r	   r
   r   r   r   r   r   :  s    z1test_funcanimation_cache_frame_data.<locals>.initc                    s     | d | d   fS )Nr   r   r
   framer   r   r   r   >  s    z4test_funcanimation_cache_frame_data.<locals>.animatec                  3   sN   t dD ]@} tddd}tjd} ||d}t| |V  qd S )Nr   r   r   r   )r   r   )ranger   r   randomZrandappendweakrefref)_r   r   r   )r   frames_generatedr   r   frames_generatorD  s    z=test_funcanimation_cache_frame_data.<locals>.frames_generatorr   )r   r   r   r   r=   r   r   )r    r!   r"   r%   r   r(   r-   rA   r   rC   r   rO   rP   )
r   r   r*   r   r   r   Z
MAX_FRAMESr,   r?   fr   )r   r   r   r   #test_funcanimation_cache_frame_data1  s&    

r   return_valuestring)r   artistc              	      sR   t  \}}|g \  fdd}tt tj||ddd W 5 Q R X d S )Nc                    s(     ddgd| g dkr  S S d S )Nr   r   r   r
   r   r   r   r   r   r   s  s    z test_draw_frame.<locals>.animateTF)blitr   )r    r!   r"   rQ   r   RuntimeErrorr   r(   )r   r   r*   r   r   r   r   test_draw_framea  s    	   r   c              	   C   sx   t  \}}dd }tj||ttdddd}|   |jddd W 5 Q R X tj	t
d	d
 |  W 5 Q R X d S )Nc                 S   s   g S r	   r   r   r   r   r   update  s    z(test_exhausted_animation.<locals>.updater   Fr   repeatr   test.gifrh   r   	exhaustedrK   )r    r!   r   r(   iterr   rt   rA   rQ   rR   r~   _startru   r   r*   r   r,   r   r   r   test_exhausted_animation  s      
 
r   c              	   C   sN   t  \}}dd }tj||g ddd}tjtdd |  W 5 Q R X d S )Nc                 S   s   g S r	   r   r   r   r   r   r     s    z%test_no_frame_warning.<locals>.updateFr   r   rK   )r    r!   r   r(   rQ   rR   r~   r   r   r   r   r   test_no_frame_warning  s       r   Zpng)
extensionsc              	      s   |  }|ddtj  |dd tddtj d|g g \  fdd} fdd	}tj|||d
ddd}| 	  |
d W 5 Q R X |  }|ddtj  |dd |td  d S )Nr      r   r   r   c                      s     g g   fS r	   r
   r   r   r   r   r     s    z"test_animation_frame.<locals>.initc                    s      t| d    fS )Nr   )r   r   r   r   r   r   r   r   r     s    z%test_animation_frame.<locals>.animater   TF)r   r   r   r   r   g{Gz?)Zadd_subplotr#   r   pir$   r   r"   r   r(   rt   rA   r   )ru   Zfig_testZfig_refr*   r   r   r,   r   r   r   test_animation_frame  s*        
r   c              	   C   sz   d}t td}d|dt|d}tjtt|d tj	f | ||d} W 5 Q R X | j
t|ksnt|   d S )Nr   r   %You passed in an explicit save_count=z0 which is being ignored in favor of len(frames)=.rK   r   r   )r   r   r   rQ   rR   r~   reescaper   r(   rE   rC   
_init_drawr,   r   r   match_targetr   r   r   ,test_save_count_override_warnings_has_length  s    r   c              	   C   st   d}d}d|dd d|d }t jtt|d tjf | ||d	} W 5 Q R X | j|ksht| 	  d S )
Nr      r    z#which is being ignored in favor of frames=r   rK   r   )
rQ   rR   r~   r   r   r   r(   rE   rC   r   r   r   r   r   (test_save_count_override_warnings_scaler  s    

r   c              	   C   sr   d}t td}d|d|d}tjtt|d tjf | ||d} W 5 Q R X | j	dksft
|   d S )	NTr   r   ze which we can infer the length of, did not pass an explicit *save_count* and passed cache_frame_data=z.  To avoid a possibly unbounded cache, frame data caching has been disabled. To suppress this warning either pass `cache_frame_data=False` or `save_count=MAX_FRAMES`.rK   )r   r   F)r   r   rQ   rR   r~   r   r   r   r(   Z_cache_frame_datarC   r   )r,   r   r   r   r   r   r   test_disable_cache_warning  s    r   c              	   C   sP   t jdkrtd}n
td}tjt|d | jdt	 d W 5 Q R X d S )Nr   z7[WinError 3] The system cannot find the path specified:z*[Errno 2] No such file or directory: '/foorK   z+/foo/bar/aardvark/thiscannotreallyexist.mp4r   )
r   rM   r   r   rQ   r   FileNotFoundErrorrA   r   ZFFMpegFileWriter)r,   Z	match_strr   r   r   test_movie_writer_invalid_path  s    

r   );r   pathlibr   rM   r   r   r   r   Znumpyr   rQ   Z
matplotlibr   r   r    r   Zmatplotlib.testing.decoratorsr   Zfixturer,   ZAbstractMovieWriterr-   rI   rn   Zparametrizer%   rU   r\   rl   registerr^   rk   rr   rv   r   Zskipifr|   rb   ZImageMagickWriterr   r   r   r   r   rm   r@   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s   


 
 





/


!


