
    %WhG                     	   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 d dlmZ  ej*                         d        Z G d d	ej.                        Zd
 Zej4                  j7                  d ee      gdg      d        Zd Zej>                  jA                  d       G d de             Z!g dZ"d Z#ej4                  j7                  d e#             ej4                  j7                  d ee      gdg      d               Z$ej4                  j7                  d e#             d        Z%ej4                  j7                  d ejL                  dej4                  jO                  ejP                  jS                          d             ejL                  dej4                  jO                  ejT                  jS                          d            g      ej4                  j7                  dg d       ej4                  j7                  d ee      gdg      d!                      Z+ej4                  j7                  dd" e, e-d#            d$gdg      d%        Z.d& Z/ej4                  j7                  d' ejL                  d(ej4                  jO                  ej>                  ja                  ejb                  d)          d*            d+g      ej4                  j7                  d ed,-      gdg      d.               Z2ej4                  j7                  d' ejL                  d(ej4                  jO                  ej>                  ja                  ejb                  d)          d*            d+g      ej4                  j7                  d ed,-      gdg      d/               Z3ej4                  jO                   ejh                  d0      du d1      d2        Z5ej4                  j7                  d3d4d5g      d6        Z6ej4                  j7                  d7g d8      d9        Z7d: Z8d; Z9 ed<g=      d>        Z:ej4                  j7                  d ee      gdg      d?        Z;ej4                  j7                  d ee      gdg      d@        Z<ej4                  j7                  d ee      gdg      dA        Z=dB Z>dC Z?y)D    N)Path)pyplot)	animation)PillowWriter)check_figures_equalc                 L   t        j                         \  }}|j                  g g       \  |j                  dd       |j	                  dd       fd}fd}t        t        | di             }|j                  dt        j                        }d	|vrd
|d	<    |d|||d|S )z)Create a simple animation (with options).r   
      c                  .     j                  g g         fS Nset_datalines   Y/var/www/html/jupyter_env/lib/python3.12/site-packages/matplotlib/tests/test_animation.pyinitzanim.<locals>.init       b"u    c                     t        j                  ddd      }t        j                  || z         }j                  ||       fS )Nr   r	   d   )nplinspacesinr   )ixyr   s      r   animatezanim.<locals>.animate!   s;    KK2s#FF1q5Maur   paramklassframes   )figfunc	init_func )
pltsubplotsplotset_xlimset_ylimdictgetattrpopr   FuncAnimation)requestr#   axr   r   kwargsr    r   s          @r   animr3      s     llnGCGGBOEDKK2KKA ''7B/0FJJw	 7 78EvxASw$A&AAr   c                   "    e Zd ZdZd Zd Zd Zy)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                 J    || _         || _        || _        || _        d| _        y )Nr   )r#   outfiledpiargs_count)selfr#   r7   r8   r9   s        r   setupzNullMovieWriter.setup;   s%    	r   c                 X    ddl m}  ||       || _        | xj                  dz  c_        y )Nr   )_validate_grabframe_kwargsr   )matplotlib.animationr>   savefig_kwargsr:   )r;   r@   r>   s      r   
grab_framezNullMovieWriter.grab_frameB   s#    C">2,qr   c                      y r   r&   r;   s    r   finishzNullMovieWriter.finishH   s    r   N)__name__
__module____qualname____doc__r<   rA   rD   r&   r   r   r5   r5   /   s    	r   r5   c                    dt         j                  d<   d}d}t        d      }t               }| j	                  ||||       |j
                  t        j                  d      k(  sJ |j                  |k(  sJ |j                  |k(  sJ |j                  d	k(  sJ |j                         D ]  \  }}|j                  |   |k(  rJ  |j                  | j                  k(  sJ y )
Nautozsavefig.facecolorunused.null2   r   )foo)r8   writerr@   r   r&   )r'   rcParamsr,   r5   saver#   figurer7   r8   r9   itemsr@   r:   _save_count)r3   filenamer8   r@   rN   kvs          r   test_null_movie_writerrW   L   s    (.CLL$%H
Ca[NFIIhC+  - ::A&&&>>X%%%::;;" $$& -1$$Q'1,,,-==D,,,,,r   r3   )r    )indirectc                 6   t        j                         dk(  rt        j                  j	                          t        j                  di | } t        j                  t        d      5  ~ t        j                  j	                          d d d        y # 1 sw Y   y xY w)NPyPyzAnimation was deletedmatchr&   )
platformpython_implementationr   testingbreak_cyclesr   r/   pytestwarnsWarningr3   s    r   test_animation_deletere   b   so    %%'61 	

!""*T*D	g%<	= "


!" " "s   & BBc                       G d dt         j                        } t        j                         }d}d}d}d}dg} | ||||      }|j	                  ||       |j
                  |j
                  k(  sJ y )Nc                       e Zd Zd Zy)7test_movie_writer_dpi_default.<locals>.DummyMovieWriterc                      y r   r&   rC   s    r   _runz<test_movie_writer_dpi_default.<locals>.DummyMovieWriter._runq   s    r   N)rE   rF   rG   rj   r&   r   r   DummyMovieWriterrh   p   s    	r   rk   rK   r"   unusedr   )r   MovieWriterr'   rQ   r<   r8   )rk   r#   rT   fpscodecbitrate
extra_argsrN   s           r   test_movie_writer_dpi_defaultrr   o   sp    900 
 **,CH
CEGJc5':>F
LLh::   r   nullc                   (    e Zd Z	 	 ddZed        Zy)RegisteredNullMovieWriterNc                      y r   r&   )r;   rn   ro   rp   rq   metadatas         r   __init__z"RegisteredNullMovieWriter.__init__   s    r   c                      y)NTr&   )clss    r   isAvailablez%RegisteredNullMovieWriter.isAvailable   s    r   )NNNNN)rE   rF   rG   rx   classmethodr{   r&   r   r   ru   ru      s#     6:+/  r   ru   ))ffmpeg	movie.mp4)ffmpeg_filer~   )imagemagick	movie.gif)imagemagick_filer   )pillowr   )htmlz
movie.html)rs   z
movie.nullc               #     K   t         D ]  \  } }t        j                  j                  |       set        j
                  j                  d|  d      }t	        j                  | d ||g       t	        j                  | d t        |      |g       t        j                  |    }t        |dd g      D ]  }| ||f | |t        |      f   y w)Nzwriter 'z' not available on this systemmarkssupported_formats)
WRITER_OUTPUTr   writersis_availablera   markskipr   r   r-   )rN   outputr   writer_classframe_formats        r   gen_writersr      s     ' 5  --f5;;##6("@ACD,,vtVD6BB,,vtT&\$HH ((0#L2EvN 	5L,..,V44	55s   CCzwriter, frame_format, outputc           	      $   ||t         j                  d<   t        j                  d	i |}d }d }|dk(  r|j                  j                  d       d}d}| j                         5  |j                  |d|d||       d d d        ~y # 1 sw Y   ~y xY w)
Nanimation.frame_formatr}   g33333%@gQk"@      Y@h264   i  )rn   rN   rp   r8   ro   r&   )r'   rO   r   r/   _figset_size_inchesas_cwdrP   )tmpdirrN   r   r   r3   r8   ro   s          r   test_save_animation_smoketestr      s     1=-.""*T*D
CE		!!-0 
 		&b# 	 	 		 	s   #BBc                 4   t         j                  |   }||t        j                  d<   t        j                         \  }}d }d }|dk(  r|j                  d       d}d} |       }	| j                         5  |	j                  |||      5  |	j                          dD ]E  }
t        j                  t        d|
      5   |	j                  d	i |
t               i d d d        G 	 d d d        d d d        y # 1 sw Y   cxY w# 1 sw Y   xY w# 1 sw Y   y xY w)
Nr   r}   r   r   r   >   r8   formatbbox_inchesz.grab_frame got an unexpected keyword argument r[   r&   )r   r   r'   rO   r(   r   r   savingrA   ra   raises	TypeErrorobject)r   rN   r   r   WriterClassr#   r1   r8   ro   test_writerrU   s              r   test_grabframer      s   ##F+K1=-.llnGC
CEM*-K 
 	<VS1 	<""$5 <]]! NqeT < +K**;a];	< <<	<	< 	<
< <		< 	<	< 	<s<   5D	4D=C6	
D%D6C?;DD	DDrN   r}   Requires FFMpeg)reasonr   r   zRequires ImageMagickz
html, want))noneN)html5z<video width)jshtmlz<script c                 @   t        j                         dk(  rt        j                  j	                          | dk(  r8|dk(  r3t
        j                  j                         st        j                  d       t        j                  di |}t        j                  | |d      5  |j                         }d d d        |F|J t        j                  t              5  ~t        j                  j	                          d d d        y ||v sJ y # 1 sw Y   XxY w# 1 sw Y   y xY w)NrZ   r   r   r   )animation.writerzanimation.htmlr&   )r]   r^   r   r_   r`   r   FFMpegWriterr{   ra   r   r/   r'   
rc_context_repr_html_rb   UserWarning)rN   r   wantr3   s       r   test_animation_repr_htmlr      s    " %%'61 	

!-DGO**668%& ""*T*D	V+/1 
2 "!" |||\\+& 	&JJ##%	& 	& t||" "
	& 	&s    D DDDr	   r"   )
save_countr!   c                 :    | j                  dt                      y )NrK   rN   )rP   r5   rd   s    r   test_no_length_framesr     s     	IImO$5I6r   c                  R   t        t        j                  j                        dkD  sJ dt        j
                  d<   t        j                  j                  d      rJ t        j                  dk7  rdnd} | t        j
                  d<   t        j                  j                  d      sJ y )Nr   not_available_ever_xxxxzanimation.ffmpeg_pathr}   win32truewhere)	lenr   r   _registeredmplrO   r   sysr]   )bins    r   test_movie_writer_registryr     s    y  ,,-111,ECLL()  --h777LLG+&C,/CLL()))(333r   method_nameto_html5_videor   zanimation writer not installed	to_jshtmlr   )r!   c                 z   |j                  d       |j                         5  t        j                  ddi      5   t	        ||               d d d        d d d        t        |j                        dk(  sJ |j                  \  }|j                  dk(  r|j                  dk(  sJ y # 1 sw Y   ZxY w# 1 sw Y   ^xY w)NWARNINGzanimation.embed_limitgư>r   zmatplotlib.animation)		set_levelr   r   r   r-   r   recordsname	levelname)r   caplogr   r3   records        r   test_embed_limitr   $  s     Y	 )^^4d;< 	)&GD+&(	)) v~~!###nnGFKK11  I-/ .-	) 	)) )s"   B1B%B1%B.	*B11B:c                     |j                         5   t        ||               t        t        t	        |            j                               g k(  sJ 	 d d d        y # 1 sw Y   y xY wr   )r   r-   listr   striterdir)r   r   r3   s      r   test_cleanup_temporariesr   6  sV     
 7"k"$DV%--/0B6667 7 7s   AAA&z/bin/shzrequires a POSIX OSc                    | j                         5  |j                  ddt        j                  d   z          t	        t        |       d      }|j                  d       t        j                  |d       t        j                  t        j                        5  |j                  d       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)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.:r}   s   #!/bin/sh
[[ $@ -eq 0 ]]
i  z	test.mpegN)r   setenvosenvironr   r   write_byteschmodra   r   
subprocessCalledProcessErrorrP   )r   monkeypatchr3   exe_paths       r   test_failing_ffmpegr   C  s     
 #64"**V*<#<=FX.;<
5!]]:889 	#IIk"	## #
	# 	## #s$   BCB:)C:C	?CCcache_frame_dataFTc                   
 t        j                         \  }}|j                  g g       \   G d dt              
fd}fd}g 
fd}d}t	        j
                  ||||| |      }t               }|j                  d|	       t              d
k(  sJ t        j                  j                          D ]  }	 |	       d u | k7  rJ  y )Nc                       e Zd Zy)2test_funcanimation_cache_frame_data.<locals>.FrameN)rE   rF   rG   r&   r   r   Framer   Z  s    r   r   c                  .     j                  g g         fS r   r   r   s   r   r   z1test_funcanimation_cache_frame_data.<locals>.init^  r   r   c                 :    j                  | d   | d          fS )Nr   r   r   )framer   s    r   r   z4test_funcanimation_cache_frame_data.<locals>.animateb  s     eCj%*-ur   c               3      K   t        d      D ]j  } t        j                  ddd      }t        j                  j	                  d      } ||      }j                  t        j                  |             | l y w)Nr"   r   r	   r   )r   r   )ranger   r   randomrandappendweakrefref)_r   r   r   r   frames_generateds       r   frames_generatorz=test_funcanimation_cache_frame_data.<locals>.frames_generatorh  sg     q 
	AAr3'A		s#AAOE ##GKK$67K
	s   A:A=r   )r%   r!   r   r   rK   r   r"   )r'   r(   r)   r,   r   r/   r5   rP   r   r   r_   r`   )r   r#   r1   r   r   r   
MAX_FRAMESr3   rN   fr   r   r   s             @@@r   #test_funcanimation_cache_frame_datar   U  s    llnGCGGBOED   J""34*:4D.8:D
 FIImFI+ A%%%JJ 1 t 00001r   return_value)Nstringr   )r   artistc                      t        j                         \  }}|j                  g       \   fd}t        j                  t
              5  t        j                  ||dd       d d d        y # 1 sw Y   y xY w)Nc                 B    j                  ddgd| g       dk(  rS S )Nr   r   r   r   )r   r   r   s    r   r   z test_draw_frame.<locals>.animate  s,    q!fq!f%8#Kr   TF)blitr   )r'   r(   r)   ra   r   RuntimeErrorr   r/   )r   r#   r1   r   r   s   `   @r   test_draw_framer     sb     llnGCGGBKED  
|	$ 
te	

 
 
s   A//A8c           	         t        j                         \  }}d }t        j                  ||t	        t        d            dd      }| j                         5  |j                  dd       d d d        t        j                  t        d	      5  |j                          d d d        y # 1 sw Y   >xY w# 1 sw Y   y xY w)
Nc                     g S r   r&   r   s    r   updatez(test_exhausted_animation.<locals>.update      	r   r	   Fr!   repeatr   test.gifr   r   	exhaustedr[   )r'   r(   r   r/   iterr   r   rP   ra   rb   r   _startr   r#   r1   r   r3   s        r   test_exhausted_animationr	    s    llnGC ""VDrOED
 
 /		*X	./ 
k	5  / / s   B(B4(B14B=c                     t        j                         \  }}d }t        j                  ||g dd      }t	        j
                  t        d      5  |j                          d d d        y # 1 sw Y   y xY w)Nc                     g S r   r&   r   s    r   r   z%test_no_frame_warning.<locals>.update  r  r   Fr  r  r[   )r'   r(   r   r/   ra   rb   r   r  r  s        r   test_no_frame_warningr    sb    llnGC ""VBuD
 
k	5   s   A**A3png)
extensionsc                    |j                         }|j                  ddt        j                  z         |j	                  dd       t        j
                  ddt        j                  z  d      |j                  g g       \  fd}fd}t        j                  |||dd	d
      }| j                         5  |j                  d       d d d        |j                         }|j                  ddt        j                  z         |j	                  dd       |j                  t        j                  dz                y # 1 sw Y   wxY w)Nr      r
   r   r   c                  .     j                  g g         fS r   r   r   s   r   r   z"test_animation_frame.<locals>.init  r   r   c                 `    j                  t        j                  | dz  z                fS )Nr   )r   r   r   )r   r   r   s    r   r   z%test_animation_frame.<locals>.animate  s)    aAG,-ur   r"   TF)r%   r!   r   r  r  g{Gz?)add_subplotr*   r   pir+   r   r)   r   r/   r   rP   r   )	r   fig_testfig_refr1   r   r   r3   r   r   s	          @@r   test_animation_framer    s	   
 
			BKK1ruu9KKA
Aq255y#&AGGBOED ""'T!%!D 
 		* 
			BKK1ruu9KKA GGArvva'k"# s   :EEc           	      f   d}t        t        d            }d|dt        |      d}t        j                  t
        t        j                  |            5  t        j                  di i | ||d} d d d        | j                  t        |      k(  sJ | j                          y # 1 sw Y   4xY w)	Nr"   r  %You passed in an explicit save_count=z0 which is being ignored in favor of len(frames)=.r[   r!   r   r&   )r   r   r   ra   rb   r   reescaper   r/   rS   
_init_drawr3   r   r!   match_targets       r   ,test_save_count_override_warnings_has_lengthr!    s     J%(^F
0ZM 2v;.	  
k<)@	A 
&& 
BBzB

 s6{***OO
 
s   B''B0c           	      ,   d}d}d|ddz   d|dz   }t        j                  t        t        j                  |            5  t        j                  d
i i | ||d	} d d d        | j                  |k(  sJ | j                          y # 1 sw Y   +xY w)Nr"      r   z#which is being ignored in favor of frames=r  r[   r  r&   )	ra   rb   r   r  r  r   r/   rS   r  r  s       r   (test_save_count_override_warnings_scalerr&    s    JF
0ZM3-	.6)1	  
k<)@	A 
&& 
BBzB


 v%%%OO
 
s   B

Bc           	      @   d}t        t        d            }d|d|d}t        j                  t        t        j                  |            5  t        j                  d	i i | ||d} d d d        | j                  du sJ | j                          y # 1 sw Y   *xY w)
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`.r[   )r   r!   Fr&   )r  r   ra   rb   r   r  r  r   r/   _cache_frame_datar  )r3   r   r!   r   s       r   test_disable_cache_warningr)    s    %(^F6+ (&( )?	?  
k<)@	A 
&& 
NN+;vN

 !!U***OO
 
s   BBc                     t         j                  dk(  rd}nd}t        j                  t        |      5  | j                  dt        j                                d d d        y # 1 sw Y   y xY w)Nr   z,\[WinError 3] .*'\\\\foo\\\\bar\\\\aardvark'z\[Errno 2] .*'/foor[   z+/foo/bar/aardvark/thiscannotreallyexist.mp4r   )r   r]   ra   r   FileNotFoundErrorrP   r   FFMpegFileWriter)r3   	match_strs     r   test_movie_writer_invalid_pathr.  #  s\    
||wC	)		(		: 7		?"335 	 	77 7 7s   &A##A,c                     t        j                         \  } }t        j                  ddddd      }|j                  |       |j	                  dd       |j                  dd       t        d      }|j                  | d	d
       |j                  d       |j                  d   }|j                         d   d   dk  sJ t        j                  |        y)zGTest animation exhaustion with transparency using PillowWriter directly)r   r   r   redg      ?)coloralphar   r   )rn   z
unused.gifr   )r8   T)transparentr
         N)r'   r(   	Rectangle	add_patchr*   r+   r   r<   rA   _frames
getextremaclose)r#   r1   rectrN   r   s        r    test_animation_with_transparencyr<  -  s    llnGC==AU#>DLLKK1KK1b!F
LLlL,
$'NN2Ea #c)))IIcNr   )@r   pathlibr   r]   r  shutilr   r   r   numpyr   ra   
matplotlibr   r   r'   r   r?   r   matplotlib.testing.decoratorsr   fixturer3   AbstractMovieWriterr5   rW   r   parametrizer,   re   rr   r   registerru   r   r   r   r   r   skipifr   r{   ImageMagickWriterr   r  r   r   r   r   rO   r   r   whichr   r   r   r	  r  r  r!  r&  r)  r.  r<  r&   r   r   <module>rI     s:   	   	   
     $   - = B B4i33 :-, $T"2!3vhG	" H	"!& F#  $"5$ 7G$T"2!3vhG H H* 7G< H<> FLL**&&2244$ + &' FLLV[[//++7799) 0 +,	$ 	  ( 
 $T"2!3vhG H	 2 
$uQx.12X  
7
74 V\\"&++*<*<**3<<8J+KLL/ += +1 2  $a.!1VHE/ F/ V\\"&++*<*<**3<<8J+KLL/ += +1 2  $a.!1VHE7 F7 LFLL+t3<QR# S#" +eT];,1 <,1^  * 

*$ ($ )$B $T"2!3vhG H$ $T"2!3vhG H$ $T"2!3vhG H&7r   