U
    \	aZ!                     @   s  d dl mZmZ 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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 eddk	Zdd Z d	d
 Z!dd Z"dd Z#ej$j%e dddd Z&ej$'dddddgdd Z(dd Z)dd Z*dd Z+ej$j%e	j,d kd!dd"d# Z-ej$j%e	j,d$kd%dd&d' Z.d(d) Z/ej$j%e0ed* d+dd,d- Z1d.d/ Z2d0d1 Z3d2d3 Z4dS )4    )BytesIOStringION)Path)findfontfindSystemFontsFontPropertiesfontManager	json_dump	json_loadget_fontget_fontconfig_fontsis_opentype_cff_fontMSUserFontDirectories_call_fc_list)pyplot
rc_contextz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   F/tmp/pip-unpacked-wheel-wjyw_3jo/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regularZ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_serialization/   s    



r-   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)r2   ffdresr   r   r   test_otf?   s    

r8   z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_fontsJ   s    r;   factor   r/         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   r:   )Zhinting_factor   d   abcg?)Zrtol)
r   r   r   clearZset_sizeset_textZget_width_heightnpZtestingZassert_allclose)r<   r   Zfont1expectedZhinted_fontr   r   r   test_hinting_factorO   s    

rG   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   r2   r   ).0entryr   r   r   	<genexpr>e   s    z#test_utf16m_sfnt.<locals>.<genexpr>z#Couldn't find font to test against.iX  )nextr   r1   StopIterationpytestskipr$   r   )rI   r   r   r   test_utf16m_sfntb   s
    rO   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 may be missingg      ?u   ⿓)Zfontproperties)rawsvgpdfZpsformat)r   r   r   r   rM   rN   pltsubplotstextsavefigr   )r,   figaxfmtr   r   r   test_find_ttco   s    
r\   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path or binary-mode file)match)r   rM   ZraisesFileNotFoundErrorr   strbytesmatplotlib.ft2fontr]   	TypeErrorr   )r(   Ztmp_pathr]   r   r   r   test_find_invalidz   s    rd   linuxz
Linux onlyc              	      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   rH   r   Zfont_test_filer   r   rJ      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 rg   r   rh   ri   r   r   rJ      s     )r   anyrM   rN   joinZensureshutilcopyfiler   __file__parentcontextZsetenvr`   r   cache_clearr   )r(   Zmonkeypatchrk   user_fonts_dirmr   ri   r   test_user_fonts_linux   s    

$rx   win32zWindows onlyc                     s   t jds"t jds"td d t } t fdd| D rRt  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.rf   c                 3   s   | ]} |kV  qd S rg   r   rh   ri   r   r   rJ      s     z(test_user_fonts_win32.<locals>.<genexpr>rj   r   c                 3   s   | ]} |kV  qd S rg   r   rh   ri   r   r   rJ      s     )osenvirongetrM   Zxfailr   rn   rN   r   makedirsrp   r*   r   rr   rs   r   )rk   rv   r   ri   r   test_user_fonts_win32   s    

r~   c                 C   s(   t  \}}|jt dd t   d S )NrR   rS   )rU   rV   rX   r   close)_rY   rZ   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   forkr=   )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   WARNINGZsansc                 S   s   g | ]}|  qS r   )
getMessage)rH   Zrecr   r   r   
<listcomp>   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)rU   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 )NrA   zDejaVu Sansg        )flags)waitr   r   r   rD   r`   )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)rH   r   )r   	threadingr   r   r      s   z#_test_threading.<locals>.<listcomp>)	r   rb   r   matplotlib.font_managerZfont_managerBarrierr   startro   )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 .)rM   Zimportorskipinspect
subprocessrunsys
executable	getsourcer   
returncodeZfail)r   procr   r   r   test_fontcache_thread_safe   s    
r   )5ior   r   r   rz   pathlibr   rp   r   r   r%   ZnumpyrE   rM   r   r   r   r   r   r	   r
   r   r   r   r   r   Z
matplotlibr   rU   r   whichZ
has_fclistr    r"   r-   r8   markZskipifr;   ZparametrizerG   rO   r\   rd   platformrx   r~   r   hasattrr   r   r   r   r   r   r   r   <module>   sF   4




