U
    \	ax-                  
   @   s  d dl Z 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
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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e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:d0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:d0gdgdd=d> Z,e	jj ej-d?kd@d%dAdB Z.e	jdCdDdEgdFdG Z/e	jdHddId:dJdKgdLdM Z0dS )N    N)Path)pyplot)	animationc                    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-wjyw_3jo/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plotZset_xlimZ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,   r-   r   r   r   setup7   s
    zNullMovieWriter.setupc                 K   s   || _ |  jd7  _d S )Nr   )savefig_kwargsr.   )r/   r1   r   r   r   
grab_frame>   s    zNullMovieWriter.grab_framec                 C   s   d S r   r   r/   r   r   r   finishB   s    zNullMovieWriter.finishN)__name__
__module____qualname____doc__r0   r2   r4   r   r   r   r   r*   +   s   r*   c                 C   s   d}d}t dd}t }| j||||d |jtdks>t|j|ksLt|j|ksZt|j	dksht|j
|ksvt|j| jkstd S )Nunused.null2   r   )Zfoo)r,   writerr1   r   r   )r"   r*   saver   r   figureAssertionErrorr+   r,   r-   r1   r.   Z
save_count)r)   filenamer,   r1   r;   r   r   r   test_null_movie_writerF   s    

r@   )r   )Zindirectc              	   C   s4   t jf | } tjtdd ~ t  W 5 Q R X d S )NzAnimation was deleted)match)r   r%   pytestwarnsWarninggcZcollectr)   r   r   r   test_animation_deleteX   s    rG   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   r3   r   r   r   _runb   s    z<test_movie_writer_dpi_default.<locals>.DummyMovieWriter._runN)r5   r6   r7   rH   r   r   r   r   DummyMovieWritera   s   rI   r9   r   Zunusedr   )r   ZMovieWriterr   r=   r0   r,   r>   )rI   r   r?   fpscodecbitrate
extra_argsr;   r   r   r   test_movie_writer_dpi_default`   s    rN   nullc                   @   s"   e Zd ZdddZedd ZdS )RegisteredNullMovieWriterNc                 C   s   d S r   r   )r/   rJ   rK   rL   rM   metadatar   r   r   __init__|   s    z"RegisteredNullMovieWriter.__init__c                 C   s   dS )NTr   )clsr   r   r   isAvailable   s    z%RegisteredNullMovieWriter.isAvailable)NNNNN)r5   r6   r7   rR   classmethodrT   r   r   r   r   rP   s   s   	    
rP   )ffmpeg	movie.mp4)Zffmpeg_filerW   )ZavconvrW   )Zavconv_filerW   )imagemagick	movie.gif)Zimagemagick_filerY   )ZpillowrY   )htmlz
movie.html)rO   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_availablerB   markskipr   r   r#   )r;   outputr_   Zwriter_classframe_formatr   r   r   gen_writers   s    

rc   zwriter, frame_format, outputc              	   C   s   |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 t	d  ~W 5 Q R X d S )	Nzanimation.frame_formatrV   )g33333%@gQk"@g      Y@Zh264   i  )rJ   r;   rL   r,   rK   )
r   rcParamsr   r%   Z_figZset_size_inchesas_cwdr<   rB   rC   )tmpdirr;   rb   ra   r)   r,   rK   r   r   r   test_save_animation_smoketest   s    

rh   r;   rV   Requires FFMpeg)reasonr[   rX   zRequires ImageMagickz
html, want)noneN)html5z<video width)Zjshtmlz<script c              	   C   s   | 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sht	t
t ~W 5 Q R X n||kst	d S )NrX   rl   ri   )animation.writerzanimation.html)r   FFMpegWriterrT   rB   r`   r%   r   
rc_contextZ_repr_html_r>   rC   UserWarning)r;   rZ   Zwantr)   r   r   r   test_animation_repr_html   s    

rq   r   )r   c                 C   s   | j dt d d S )Nr9   r;   )r<   r*   rF   r   r   r   test_no_length_frames   s    rs   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_pathrV   win32truewhere)
lenr   r]   _registeredr>   mplre   r^   sysplatform)binr   r   r   test_movie_writer_registry   s    

r}   method_nameZto_html5_videorm   zanimation writer not installedZ	to_jshtmlr   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_levelrf   ry   ro   r#   rw   recordsr>   name	levelname)r~   Zcaplogrg   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   )rf   r#   listr   striterdirr>   )r~   rg   r)   r   r   r   test_cleanup_temporaries   s    
r   posixzrequires a POSIX OSc              
   C   sx   |   f |ddtjd   tt| d}|d t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.:rV   z#!/bin/sh
[[ $@ -eq 0 ]]
i  z	test.mpegN)rf   Zsetenvosenvironr   r   
write_textchmodrB   raises
subprocessCalledProcessErrorr<   )rg   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}tj||||| d	}t }|jd
|d tdkst	D ]}| d k| kst	qd S )Nc                   @   s   e Zd ZdS )z2test_funcanimation_cache_frame_data.<locals>.FrameN)r5   r6   r7   r   r   r   r   Frame%  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_generator3  s    z=test_funcanimation_cache_frame_data.<locals>.frames_generator)r   r   r   r9   rr   r   )
r   r    r!   r"   r   r%   r*   r<   rw   r>   )	r   r   r'   r   r   r   r)   r;   fr   )r   r   r   r   #test_funcanimation_cache_frame_data   s     
r   return_valuestring)r   artistc              	      sP   t  \}}|g \  fdd}tt tj||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    z test_draw_frame.<locals>.animateT)Zblit)r   r    r!   rB   r   RuntimeErrorr   r%   )r   r   r'   r   r   r   r   test_draw_frameM  s
    	r   )1rE   r   pathlibr   r   rz   r   Znumpyr   rB   Z
matplotlibry   r   r   r   Zfixturer)   ZAbstractMovieWriterr*   r@   r_   Zparametrizer"   rG   rN   r]   registerrP   r\   rc   rh   r   Zskipifrn   rT   ZImageMagickWriterrq   iterr   rs   r}   r^   re   r   r   r   r   r   r   r   r   r   r   <module>   s   


 
 





,