o
    GfOE                  
   @   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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g d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! 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$g d%ejjdeedgdgdd&d' Z)ejjdd(e*e+d)d*gdgdd+d, Z,d-d. Z-ejd/ej$d0ejj%ej.ej/d1  d2d d!d3gejjded4d5gdgdd6d7 Z0ejd/ej$d0ejj%ej.ej/d1  d2d d!d3gejjded4d5gdgdd8d9 Z1ejj%e2d:du d;d d<d= Z3ejd>d?d@gdAdB Z4ejdCg dDdEdF Z5dGdH Z6dIdJ Z7edKgdLdMdN Z8ejjdeedgdgddOdP Z9ejjdeedgdgddQdR Z:ejjdeedgdgddSdT Z;dUdV Z<dS )W    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|vr<d|d< |d|||d|S )z)Create a simple animation (with options).r   
      c                           g g   fS Nset_data liner   ?lib/python3.10/site-packages/matplotlib/tests/test_animation.pyinit      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_funcNr   )
pltsubplotsplotset_xlimset_ylimdictgetattrpopr   FuncAnimation)Z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/   r0   r1   r   r   r   setup:   s
   
zNullMovieWriter.setupc                 K   s,   ddl m} || || _|  jd7  _d S )Nr   )_validate_grabframe_kwargsr   )Zmatplotlib.animationr5   savefig_kwargsr2   )r3   r6   r5   r   r   r   
grab_frameA   s   zNullMovieWriter.grab_framec                 C      d S r
   r   r3   r   r   r   finishG      zNullMovieWriter.finishN)__name__
__module____qualname____doc__r4   r7   r:   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s$J |j|ks+J |j|ks2J |j	d	ks9J |
 D ]\}}|j| |ksJJ q=|j| jksSJ d S )
Nautozsavefig.facecolorunused.null2   r   )Zfoo)r0   writerr6   r   r   )r"   rcParamsr'   r.   saver   figurer/   r0   r1   itemsr6   r2   _save_count)r-   filenamer0   r6   rC   kvr   r   r   test_null_movie_writerK   s   


rL   )r   )Zindirectc                 C   sf   t  dkrtj  tjdi | } tjt	dd ~ tj  W d    d S 1 s,w   Y  d S )NPyPyzAnimation was deletedmatchr   )
platformpython_implementationr   testingbreak_cyclesr   r*   pytestwarnsWarningr-   r   r   r   test_animation_deletea   s   
"rX   c                  C   s^   G dd dt j} t }d}d}d}d}dg}| ||||}||| |j|jks-J d S )Nc                   @   s   e Zd Zdd ZdS )z7test_movie_writer_dpi_default.<locals>.DummyMovieWriterc                 S   r8   r
   r   r9   r   r   r   _runp   r;   z<test_movie_writer_dpi_default.<locals>.DummyMovieWriter._runN)r<   r=   r>   rY   r   r   r   r   DummyMovieWritero   s    rZ   rA   r   Zunusedr   )r   ZMovieWriterr"   rF   r4   r0   )rZ   r   rI   fpscodecbitrate
extra_argsrC   r   r   r   test_movie_writer_dpi_defaultn   s   r_   nullc                   @   s&   e Zd Z		dddZedd ZdS )RegisteredNullMovieWriterNc                 C   r8   r
   r   )r3   r[   r\   r]   r^   Zmetadatar   r   r   __init__      z"RegisteredNullMovieWriter.__init__c                 C   s   dS )NTr   )clsr   r   r   isAvailable   rc   z%RegisteredNullMovieWriter.isAvailable)NNNNN)r<   r=   r>   rb   classmethodre   r   r   r   r   ra      s    	
ra   ))ffmpeg	movie.mp4)Zffmpeg_filerh   )imagemagick	movie.gif)Zimagemagick_filerj   )pillowrj   )htmlz
movie.html)r`   z
movie.nullc                  c   s    t D ]J\} }tj| s0t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  q<qd S )Nzwriter 'z' not available on this systemZmarksZsupported_formats)
WRITER_OUTPUTr   writersis_availablerT   markskipr   r   r(   )rC   outputrq   Zwriter_classframe_formatr   r   r   gen_writers   s   

ru   zwriter, frame_format, outputc              	   C   s   |d ur	|t jd< tjd	i |}d }d }|dkr#|jd d}d}|   |j|d|d||d W d    ~d S 1 s?w   Y  ~d S )
Nanimation.frame_formatrg   g33333%@gQk"@      Y@h264   i  )r[   rC   r]   r0   r\   r   )r"   rD   r   r*   Z_figset_size_inchesas_cwdrE   )tmpdirrC   rt   rs   r-   r0   r\   r   r   r   test_save_animation_smoketest   s"   


r~   c                 C   s  t j| }|d ur|tjd< t \}}d }d }|dkr%|d d}d}| }	|  V |	|||6 |	  dD ]'}
t	j
td|
d |	jd	i |
t i W d    n1 s]w   Y  q;W d    n1 smw   Y  W d    d S W d    d S 1 sw   Y  d S )
Nrv   rg   rw   rx   ry   >   Zbbox_inchesformatr0   z.grab_frame got an unexpected keyword argument rN   r   )r   ro   r"   rD   r#   r{   r|   Zsavingr7   rT   raises	TypeErrorobject)r}   rC   rt   rs   ZWriterClassr   r+   r0   r\   Ztest_writerrJ   r   r   r   test_grabframe   s6   



"r   rC   rg   Requires FFMpeg)reasonrm   ri   zRequires ImageMagickz
html, want))Z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
di |}t| |d | }W d    n1 s<w   Y  |d u ri|d u sKJ tt ~tj  W d    d S 1 sbw   Y  d S ||v soJ d S )NrM   ri   r   r   )animation.writerzanimation.htmlr   )rP   rQ   r   rR   rS   r   FFMpegWriterre   rT   rr   r*   r"   
rc_contextZ_repr_html_rU   UserWarning)rC   rl   Zwantr-   r   r   r   test_animation_repr_html   s&   



"r   r   r   )
save_countr   c                 C   s   | j dt d d S )NrA   rC   )rE   r.   rW   r   r   r   test_no_length_frames  s   r   c                  C   s^   t tjjdks
J dtjd< tjdrJ tjdkrdnd} | tjd< tjds-J d S )Nr   Znot_available_ever_xxxxzanimation.ffmpeg_pathrg   win32truewhere)	lenr   ro   Z_registeredmplrD   rp   sysrP   )binr   r   r   test_movie_writer_registry  s   

r   method_nameZto_html5_videor   zanimation writer not installedZ	to_jshtmlr   )r   c              	   C   s   | d | % tddi t||   W d    n1 s"w   Y  W d    n1 s1w   Y  t|jdks?J |j\}|jdkrM|jdksOJ d S )NZWARNINGzanimation.embed_limitgư>r   zmatplotlib.animation)	Z	set_levelr|   r   r   r(   r   ZrecordsnameZ	levelname)r   Zcaplogr}   r-   recordr   r   r   test_embed_limit#  s   


r   c                 C   sV   |   t||   ttt| g ksJ W d    d S 1 s$w   Y  d S r
   )r|   r(   listr   strZiterdir)r   r}   r-   r   r   r   test_cleanup_temporaries5  s   
"r   z/bin/shzrequires a POSIX OSc              	   C   s   |   I |ddtjd   tt| d}|d t|d t	t
j |d W d   n1 s8w   Y  W d   dS W d   dS 1 sPw   Y  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.:rg   s   #!/bin/sh
[[ $@ -eq 0 ]]
i  z	test.mpegN)r|   Zsetenvosenvironr   r   Zwrite_byteschmodrT   r   
subprocessZCalledProcessErrorrE   )r}   Zmonkeypatchr-   Zexe_pathr   r   r   test_failing_ffmpegB  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sIJ t	j
  D ]}	|	 d u | ks[J qPd S )Nc                   @   s   e Zd ZdS )z2test_funcanimation_cache_frame_data.<locals>.FrameN)r<   r=   r>   r   r   r   r   FrameY  s    r   c                      r	   r
   r   r   r   r   r   r   ]  r   z1test_funcanimation_cache_frame_data.<locals>.initc                    s     | d | d   fS )Nr   r   r   framer   r   r   r   a  s   z4test_funcanimation_cache_frame_data.<locals>.animatec                  3   sP    t dD ] } tddd}tjd} ||d}t| |V  qd S )Nr   r   r   r   )r   r   )ranger   r   ZrandomZrandappendweakrefref)_r   r   r   )r   frames_generatedr   r   frames_generatorg  s   z=test_funcanimation_cache_frame_data.<locals>.frames_generatorr   )r!   r   r   r   rA   r   r   )r"   r#   r$   r'   r   r*   r.   rE   r   r   rR   rS   )
r   r   r+   r   r   r   Z
MAX_FRAMESr-   rC   fr   )r   r   r   r   #test_funcanimation_cache_frame_dataT  s(   

r   return_value)Nstringr   )r   artistc                    sh   t  \}}|g \  fdd}tt tj||ddd W d    d S 1 s-w   Y  d S )Nc                    s$     ddgd| g dkr S S )Nr   r   r   r   r   r   r   r   r   r     s   z test_draw_frame.<locals>.animateTF)blitr   )r"   r#   r$   rT   r   RuntimeErrorr   r*   )r   r   r+   r   r   r   r   test_draw_frame  s   	"r   c                 C   s   t  \}}dd }tj||ttdddd}|   |jddd W d    n1 s.w   Y  tj	t
d	d
 |  W d    d S 1 sJw   Y  d S )Nc                 S      g S r
   r   r   r   r   r   update  r;   z(test_exhausted_animation.<locals>.updater   Fr   repeatr   test.gifrk   r   	exhaustedrN   )r"   r#   r   r*   iterr   r|   rE   rT   rU   r   _startr}   r   r+   r   r-   r   r   r   test_exhausted_animation  s   

"r   c                 C   sd   t  \}}dd }tj||g ddd}tjtdd |  W d    d S 1 s+w   Y  d S )Nc                 S   r   r
   r   r   r   r   r   r     r;   z%test_no_frame_warning.<locals>.updateFr   r   rN   )r"   r#   r   r*   rT   rU   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 d    n1 sPw   Y  |  }|ddtj  |dd |td  d S )Nr      r   r   r   c                      r	   r
   r   r   r   r   r   r     r   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   Zpir&   r   r$   r   r*   r|   rE   r   )r}   Zfig_testZfig_refr+   r   r   r-   r   r   r   test_animation_frame  s$   
r   c                 C   s   d}t td}d|dt|d}tjtt|d tj	di i | ||d} W d    n1 s7w   Y  | j
t|ksEJ |   d S )	Nr   r   %You passed in an explicit save_count=z0 which is being ignored in favor of len(frames)=.rN   r   r   r   )r   r   r   rT   rU   r   reescaper   r*   rH   
_init_drawr-   r   r   match_targetr   r   r   ,test_save_count_override_warnings_has_length  s   r   c                 C   s   d}d}d|dd d|d }t jtt|d tjd
i i | ||d	} W d    n1 s6w   Y  | j|ksBJ |   d S )Nr      r    z#which is being ignored in favor of frames=r   rN   r   r   )	rT   rU   r   r   r   r   r*   rH   r   r   r   r   r   (test_save_count_override_warnings_scaler  s   

r   c                 C   s   d}t td}d|d|d}tjtt|d tjd	i i | ||d} W d    n1 s5w   Y  | j	du sAJ | 
  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`.rN   )r   r   Fr   )r   r   rT   rU   r   r   r   r   r*   Z_cache_frame_datar   )r-   r   r   r   r   r   r   test_disable_cache_warning  s   r   c                 C   sZ   t jdkrd}nd}tjt|d | jdt d W d    d S 1 s&w   Y  d S )Nr   z,\[WinError 3] .*'\\\\foo\\\\bar\\\\aardvark'z\[Errno 2] .*'/foorN   z+/foo/bar/aardvark/thiscannotreallyexist.mp4r   )r   rP   rT   r   FileNotFoundErrorrE   r   ZFFMpegFileWriter)r-   Z	match_strr   r   r   test_movie_writer_invalid_path"  s   
"r   )=r   Zpathlibr   rP   r   shutilr   r   r   Znumpyr   rT   Z
matplotlibr   r   r"   r   Zmatplotlib.testing.decoratorsr   Zfixturer-   ZAbstractMovieWriterr.   rL   rq   Zparametrizer'   rX   r_   ro   registerra   rn   ru   r~   r   r   Zskipifr   re   ZImageMagickWriterr   r   r   r   r   rp   rD   r   r   whichr   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s    










/


!


