U
    f-                     @   s  d dl mZm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
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mZmZmZmZmZmZmZmZmZmZmZmZmZ d dl m!Z"m#Z#m$Z% e
&ddk	Z'dd	 Z(d
d Z)dd Z*dd Z+ej,j-ej.dkpe' dddd Z/ej,0dddddgdd Z1dd Z2dd Z3d d! Z4d"d# Z5ej,j-ej.d$kple' d%dd&d' Z6d(d) Z7ej,j-ej.dkd*dd+d, Z8d-d. Z9ej,j-e:ed/ d0dd1d2 Z;d3d4 Z<d5d6 Z=d7d8 Z>d9d: Z?d;d< Z@ej,j-ej.dkd=dd>d? ZAd@dA ZBdS )B    )BytesIOStringION)Path)Image)findfontfindSystemFonts	FontEntryFontPropertiesfontManager	json_dump	json_loadget_fontis_opentype_cff_fontMSUserFontDirectories_get_fontconfig_fontsft2fontttfFontPropertycbook)pyplot
rc_contextfigurezfc-listc               	   C   st   t dddgid ttdgd} W 5 Q R X t| jdks@tt| } |  }t|dks`t|d	 d
ksptd S )Nfont.sans-serifZcmmi10Bitstream Vera Sans)rc
sans-seriffamilyz
cmmi10.ttf   i"     )	r   r   r	   r   nameAssertionErrorr   Zget_charmaplen)fontZcmap r#   I/tmp/pip-target-lpfmz8o1/lib/python/matplotlib/tests/test_font_manager.pytest_font_priority   s    
r%   c                   C   s   dt ddkstdt ddks(tdt dd  k rLt ddk sRn tdt dd  k rvt ddk s|n tt ddt ddkstd S )Nr   Zregularboldi  normal)r
   Zscore_weightr    r#   r#   r#   r$   test_score_weight'   s    



r(   c              	   C   s   t | d}tt| t|}t Z tdd ddiddddd	ifD ].}tf |}tj|d
d|j|d
dksJt	qJW 5 Q R X d S )Nzfontlist.jsonignorez findfont: Font family.*not foundr   ZSTIXGeneralr   i  )r   weightzno such font familyF)Zrebuild_if_missing)
r   r   r
   r   warningscatch_warningsfilterwarningsr	   r   r    )tmpdirpathcopypropfpr#   r#   r$   test_json_serialization2   s    



r3   c               
   C   sn   d} t |  rt| sttjD ]F}d|jkr"t|jd}|ddk}W 5 Q R X |t|jks"tq"d S )Nz//usr/share/fonts/opentype/freefont/FreeMono.otfZotfrb   s   OTTO)	r   existsr   r    r
   ttflistfnameopenread)r8   ffdresr#   r#   r$   test_otfB   s    

r>   win32zno fontconfig installed)reasonc                   C   s   t t dkstd S )N   )r!   r   r    r#   r#   r#   r$   test_get_fontconfig_fontsM   s    rB   factor   r5         c                 C   s   t tdgd}t|dd}|  |dd |d | }t|| d}|  |dd |d tjj	| |dd	 d S )
Nr   r   rA   )Zhinting_factor   d   abcg?)Zrtol)
r   r	   r   clearZset_sizeset_textZget_width_heightnptestingZassert_allclose)rC   r"   Zfont1expectedZhinted_fontr#   r#   r$   test_hinting_factorS   s    

rO   c                  C   sJ   zt dd tjD } W n tk
r6   td Y nX | jdksFtd S )Nc                 s   s"   | ]}t |jjd kr|V  qdS )zseguisbi.ttfN)r   r8   r   ).0entryr#   r#   r$   	<genexpr>i   s    z#test_utf16m_sfnt.<locals>.<genexpr>z0Couldn't find seguisbi.ttf font to test against.iX  )nextr
   r7   StopIterationpytestskipr*   r    )rQ   r#   r#   r$   test_utf16m_sfntf   s
    rW   c                  C   sd   t dgd} tt| jdkr(td t \}}|jddd| d dD ]}|j	t
 |d	 qJd S )
NzWenQuanYi Zen Heir   zwqy-zenhei.ttcz"Font wqy-zenhei.ttc may be missing      ?u   ⿓ZfontpropertiesrawsvgpdfZpsformatr	   r   r   r   rU   rV   pltsubplotstextsavefigr   )r2   figaxfmtr#   r#   r$   test_find_ttcs   s    
rh   c                  C   sr   t ddgd} tt| j}|dkr6td| d t \}}|jddd| d	 d
D ]}|j	t
 |d qXd S )NzNoto Sans CJK SCzNoto Sans CJK JPr   )zNotoSansCJKsc-Regular.otfzNotoSansCJK-Regular.ttcz,Noto Sans CJK SC font may be missing (found )rX   u   Hello, 你好rY   rZ   r^   r`   )r2   r   re   rf   rg   r#   r#   r$   test_find_noto}   s    rj   c              	   C   s   t | }tt t|d  W 5 Q R X tt tt|d  W 5 Q R X tt tt|d  W 5 Q R X ddlm} tjt	dd |t
  W 5 Q R X d S )Nznon-existent-font-name.ttfr   )FT2Fontzfont file or a binary-mode file)match)r   rU   raisesFileNotFoundErrorr   strbytesmatplotlib.ft2fontrk   	TypeErrorr   )r.   Ztmp_pathrk   r#   r#   r$   test_find_invalid   s    rs   linuxz$only Linux with fontconfig installedc              	      s   d t  }t fdd|D r0t  d | d}|jdd ttt	j
  |  | >}|dt|  t  t  }t fd	d|D stW 5 Q R X t  d S )
Nmpltest.ttfc                 3   s   | ]} |kV  qd S Nr#   rP   r"   Zfont_test_filer#   r$   rR      s     z(test_user_fonts_linux.<locals>.<genexpr> already exists in system fontsfontsT)dirXDG_DATA_HOMEc                 3   s   | ]} |kV  qd S rv   r#   rw   rx   r#   r$   rR      s     )r   anyrU   rV   joinZensureshutilcopyfiler   __file__parentcontextZsetenvro   r   cache_clearr    )r.   Zmonkeypatchrz   user_fonts_dirmr#   rx   r$   test_user_fonts_linux   s    

$r   c               
      st   d t tj  } z0t|   fddtjD \}tj| W 5  fddtjD }|D ]}tj| q\X dS )z/Smoke test that addfont() accepts pathlib.Path.ru   c                    s   g | ]}|j  r|qS r#   r8   endswithrw   rx   r#   r$   
<listcomp>   s    z(test_addfont_as_path.<locals>.<listcomp>c                    s   g | ]}|j  r|qS r#   r   rw   rx   r#   r$   r      s    N)r   r   r   r
   r7   removeZaddfont)r/   Z	to_remover"   addedr#   rx   r$   test_addfont_as_path   s    
r   zWindows onlyc                     s   t jds"t jds"td td d t } t fdd| D r\t  d td	 }t 	| t
ttj  | t } t fd
d| D std S )NZAPPVEYORZTF_BUILDznThis test should only run on CI (appveyor or azure) as the developer's font directory should remain unchanged.z4We need to update the registry for this test to workru   c                 3   s   | ]} |kV  qd S rv   r#   rw   rx   r#   r$   rR      s     z(test_user_fonts_win32.<locals>.<genexpr>ry   r   c                 3   s   | ]} |kV  qd S rv   r#   rw   rx   r#   r$   rR      s     )osenvirongetrU   Zxfailr   r}   rV   r   makedirsr   r0   r   r   r   r    )rz   r   r#   rx   r$   test_user_fonts_win32   s    


r   c                 C   s(   t  \}}|jt dd t   d S )Nr]   r^   )ra   rb   rd   r   close)_re   rf   r#   r#   r$   _model_handler   s    r   register_at_forkz Cannot register at_fork handlersc               	   C   s>   t d td} | jdd}|t td W 5 Q R X d S )Nr   forkrD   )Z	processes)r   multiprocessingZget_contextZPoolmaprange)ctxpoolr#   r#   r$   	test_fork   s    
r   c              	   C   sJ   dgt jd< | d td W 5 Q R X dd | jD ddgksFtd S )	Nzthis-font-does-not-existr   WARNINGsansc                 S   s   g | ]}|  qS r#   )
getMessage)rP   Zrecr#   r#   r$   r      s     z'test_missing_family.<locals>.<listcomp>zFfindfont: Font family ['sans'] not found. Falling back to DejaVu Sans.zufindfont: Generic family 'sans' not found because none of the following families were found: this-font-does-not-exist)ra   ZrcParamsZat_levelr   recordsr    )Zcaplogr#   r#   r$   test_missing_family   s    r   c                     s~   dd l ddlm  dd lm d} |  fddfddt| D }|D ]}|  qZ|D ]}|  qld S )Nr   )LOAD_NO_HINTING
   c                    s>      tdD ](}d}|jt| d d qd S )NrH   zDejaVu Sansg        )flags)waitr   r   r   rK   ro   )njr"   )r   bfmr#   r$   bad_idea  s    z!_test_threading.<locals>.bad_ideac                    s$   g | ]}j  d | |fdqS )Zbad_thread_)targetr   args)Thread)rP   r   )r   	threadingr#   r$   r     s   z#_test_threading.<locals>.<listcomp>)	r   rq   r   matplotlib.font_managerZfont_managerBarrierr   startr~   )Nthreadstr#   )r   r   r   r   r   r$   _test_threading   s    

r   c                  C   sL   t d dd l} ttjd| td g}|j	rHt 
d|j	 d d S )Nr   r   z-cz
_test_threading()z2The subprocess returned with non-zero exit status .)rU   Zimportorskipinspect
subprocessrunsys
executable	getsourcer   
returncodefail)r   procr#   r#   r$   test_fontcache_thread_safe  s    
r   c                  C   sV   t dd} |  }tt|}|jdks.t|jdks<t|  }|	dsRtd S )N	font-name)r   r   z<img src="data:image/png;base64)
r   Z
_repr_png_r   r9   r   widthr    height_repr_html_
startswith)fontentpngZimghtmlr#   r#   r$   test_fontentry_dataclass$  s    
r   c               	   C   s.   t t tddd} |   W 5 Q R X d S )Nz/randomr   )r8   r   )rU   rm   rn   r   r   )r   r#   r#   r$   %test_fontentry_dataclass_invalid_path0  s    r   zLinux or OS onlyc            	      C   s   dd dD } t | dd}t dd}g }|| D ]4}z"t|}t|}||j W q0   Y q0X q0ttt|}tt	
 }t|t|kstt|t|kst||kstd S )Nc                 S   s   g | ]}t d |qS )rz   )r   Z_get_data_path)rP   subdirr#   r#   r$   r   8  s     z'test_get_font_names.<locals>.<listcomp>)ttfr   )Zfontext)r   r   rk   r   appendr   sortedlistsetr
   Zget_font_namesr    r!   )	Z	paths_mplZ	fonts_mplZfonts_systemZ	ttf_fontsr/   r"   r1   Zavailable_fontsZmpl_font_namesr#   r#   r$   test_get_font_names6  s     

r   c                     sF   G dd d  fdd} |   t  D ]}t| r(td q(d S )Nc                   @   s   e Zd ZdS )z/test_donot_cache_tracebacks.<locals>.SomeObjectN)__name__
__module____qualname__r#   r#   r#   r$   
SomeObjectL  s   r   c               
      sj     } t  }| }|jddddd t 2}t  td |j|dd W 5 Q R X W 5 Q R X d S )NrX   ZaardvarkZdoesnotexistr   r)   r   r^   )	mfigureZFigurerb   rc   r   r+   r,   r-   rd   )xre   rf   outr   r#   r$   innerO  s    

z*test_donot_cache_tracebacks.<locals>.innerz#object from inner stack still alive)gcZget_objects
isinstancerU   r   )r   objr#   r   r$   test_donot_cache_tracebacksJ  s    

r   )Cior   r   r   r   r   pathlibr   ZPILr   r   r   r   r+   numpyrL   rU   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   Z
matplotlibr   ra   r   r   r   whichZ
has_fclistr%   r(   r3   r>   markZskipifplatformrB   ZparametrizerO   rW   rh   rj   rs   r   r   r   r   hasattrr   r   r   r   r   r   r   r   r#   r#   r#   r$   <module>   s`   @






