a
    w=ic
                  	   @   s  d 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
mZ ddlmZ ddlmZ ddlmZ d	d
 Zdd ZG dd dZG dd deZd!ddZd"ddZd#eeeeeeedddZG dd deZG dd deZG dd  d eZdS )$zHelpers for writing unit tests.    )Iterable)BytesION)TestCase)Configtobytes)	XMLWriterc                 C   s   t  }d}t| tr|| 7 }nPt| tr8|t| d7 }n6t| tr\|ddd | D 7 }ntdt| j	 |d7 }|j
|d |jd	 S )
aA  Parses a snippet of XML.

    Input can be either a single string (unicode or UTF-8 bytes), or a
    a sequence of strings.

    The result is in the same format that would be returned by
    XMLReader, but the parser imposes no constraints on the root
    element so it can be called on small snippets of TTX files.
    s   <root>utf-8    c                 s   s   | ]}t |d V  qdS )r	   Nr   ).0s r   i/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/fontTools/misc/testTools.py	<genexpr>"   r
   zparseXML.<locals>.<genexpr>z0expected string or sequence of strings; found %rs   </root>r      )TestXMLReader_
isinstancebytesstrr   r   join	TypeErrortype__name__parserParseroot)
xmlSnippetreaderxmlr   r   r   parseXML   s    



r   c                 C   sB   dd t | D }|D ]\}}}|||||  q|  |S )Nc                 S   s   g | ]}t |ts|qS r   )r   r   )r   er   r   r   
<listcomp>,   r
   z parseXmlInto.<locals>.<listcomp>)r   stripZfromXMLZpopulateDefaults)ZfontZ	parseIntor   Z
parsed_xmlnameattrscontentr   r   r   parseXmlInto+   s
    r&   c                   @   sf   e Zd Zdd Zdd Zdd Zddd	Zd
d Zdd Zdd Z	dd Z
dd Zdd Zdd ZdS )FakeFontc                 C   s2   || _ dd t|D | _d| _i | _t | _d S )Nc                 S   s   i | ]\}}||qS r   r   )r   igr   r   r   
<dictcomp>6   r
   z%FakeFont.__init__.<locals>.<dictcomp>F)glyphOrder_	enumeratereverseGlyphOrderDict_lazytablesr   cfg)selfZglyphsr   r   r   __init__4   s
    zFakeFont.__init__c                 C   s
   | j | S Nr/   )r1   tagr   r   r   __getitem__;   s    zFakeFont.__getitem__c                 C   s   || j |< d S r3   r4   )r1   r5   tabler   r   r   __setitem__>   s    zFakeFont.__setitem__Nc                 C   s   | j ||S r3   )r/   get)r1   r5   defaultr   r   r   r9   A   s    zFakeFont.getc                 C   s
   | j | S r3   r-   r1   r#   r   r   r   
getGlyphIDD   s    zFakeFont.getGlyphIDc                    s    fdd|D S )Nc                    s   g | ]}  |qS r   )r=   r   gidr1   r   r   r!   H   r
   z+FakeFont.getGlyphIDMany.<locals>.<listcomp>r   r1   lstr   r@   r   getGlyphIDManyG   s    zFakeFont.getGlyphIDManyc                 C   s$   |t | jk r| j| S d| S d S )Nz	glyph%.5d)lenr+   )r1   ZglyphIDr   r   r   getGlyphNameJ   s    
zFakeFont.getGlyphNamec                    s    fdd|D S )Nc                    s   g | ]}  |qS r   )rE   r>   r@   r   r   r!   P   r
   z-FakeFont.getGlyphNameMany.<locals>.<listcomp>r   rA   r   r@   r   getGlyphNameManyO   s    zFakeFont.getGlyphNameManyc                 C   s   | j S r3   )r+   r@   r   r   r   getGlyphOrderR   s    zFakeFont.getGlyphOrderc                 C   s   | j S r3   r;   r@   r   r   r   getReverseGlyphMapU   s    zFakeFont.getReverseGlyphMapc                 C   s   t |  S r3   )sortedrG   r@   r   r   r   getGlyphNamesX   s    zFakeFont.getGlyphNames)N)r   
__module____qualname__r2   r6   r8   r9   r=   rC   rE   rF   rG   rH   rJ   r   r   r   r   r'   3   s   
r'   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
r   c                 C   sB   ddl m} | | _| j| j_| j| j_| j| j_d | _	g | _
d S )Nr   )ParserCreate)Zxml.parsers.expatrM   r   startElement_StartElementHandlerendElement_EndElementHandleraddCharacterData_CharacterDataHandlerr   stack)r1   rM   r   r   r   r2   ]   s    


zTestXMLReader_.__init__c                 C   s<   ||g f}| j r&| j d d | n|| _| j | d S Nr   )rT   appendr   )r1   r#   r$   elementr   r   r   rN   f   s
    
zTestXMLReader_.startElement_c                 C   s   | j   d S r3   )rT   popr<   r   r   r   rP   n   s    zTestXMLReader_.endElement_c                 C   s   | j d d | d S rU   )rT   rW   )r1   datar   r   r   rR   q   s    z TestXMLReader_.addCharacterData_N)r   rK   rL   r2   rN   rP   rR   r   r   r   r   r   \   s   	r   
c                 C   s(   t t | d}|jd |j  |S )N)
newlinestrr   )r   r   fileseektruncate)r\   writerr   r   r   makeXMLWriteru   s    
ra   c                 C   s6   t  }| || |j d}|ds.J | S )zCall the passed toXML function and return the written content as a
    list of lines (unicode strings).
    Result is stripped of XML declaration and OS-specific newline characters.
    r	   r[   )ra   r]   getvaluedecodeendswith
splitlines)funcZttFontr`   r   r   r   r   getXML~   s
    
rg   TF)stringttLibVersioncheckSumAdjustmentmodifiedcreatedsfntVersionreturnc                 C   s^   |rt dd| } |r$t dd| } |r6t dd| } |rHt dd| } |rZt dd| } | S )zJStrip stuff like ttLibVersion, checksums, timestamps, etc. from TTX dumps.z ttLibVersion="[^"]+" z sfntVersion="[^"]+"z#<checkSumAdjustment value="[^"]+"/>z<modified value="[^"]+"/>z<created value="[^"]+"/>)resub)rh   ri   rj   rk   rl   rm   r   r   r   stripVariableItemsFromTTX   s    
rr   c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )MockFontzYA font-like object that automatically adds any looked up glyphname
    to its glyphOrder.c                    s4   dg _ G  fdddt}|ddi _d _d S )Nz.notdefc                       s   e Zd Z fddZdS )z)MockFont.__init__.<locals>.AllocatingDictc                    s     j | t| }|| |< |S r3   )_glyphOrderrW   rD   )ZreverseDictkeyr?   r@   r   r   __missing__   s    z5MockFont.__init__.<locals>.AllocatingDict.__missing__N)r   rK   rL   rv   r   r@   r   r   AllocatingDict   s   rw   r   F)rt   dict_reverseGlyphOrderr.   )r1   rw   r   r@   r   r2      s    zMockFont.__init__c                 C   s   | j | }|S r3   ry   )r1   Zglyphr?   r   r   r   r=      s    
zMockFont.getGlyphIDc                 C   s   | j S r3   rz   r@   r   r   r   rH      s    zMockFont.getReverseGlyphMapc                 C   s
   | j | S r3   rt   )r1   r?   r   r   r   rE      s    zMockFont.getGlyphNamec                 C   s   | j S r3   r{   r@   r   r   r   rG      s    zMockFont.getGlyphOrderN)	r   rK   rL   __doc__r2   r=   rH   rE   rG   r   r   r   r   rs      s   rs   c                   @   s   e Zd Zdd ZdS )r   c                 C   s"   t | | t| ds| j| _d S )NassertRaisesRegex)	_TestCaser2   hasattrZassertRaisesRegexpr}   )r1   
methodNamer   r   r   r2      s    
zTestCase.__init__N)r   rK   rL   r2   r   r   r   r   r      s   r   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )DataFilesHandlerc                 C   s   d | _ d| _d S )Nr   )tempdirZnum_tempfilesr@   r   r   r   setUp   s    zDataFilesHandler.setUpc                 C   s   | j rt| j  d S r3   )r   shutilrmtreer@   r   r   r   tearDown   s    zDataFilesHandler.tearDownc                 C   s&   t jtj| j j}t j|d|S )NrZ   )ospathdirnamesysmodulesrK   __file__r   )r1   Ztestfilefolderr   r   r   getpath   s    zDataFilesHandler.getpathc                 C   s   | j st | _ d S r3   )r   tempfilemkdtempr@   r   r   r   temp_dir   s    zDataFilesHandler.temp_dirc                 C   s(   |    tj| j|}t|| |S r3   )r   r   r   r   r   r   copy2)r1   Z	font_path	file_nameZtemppathr   r   r   	temp_font   s    zDataFilesHandler.temp_fontN)r   rK   rL   r   r   r   r   r   r   r   r   r   r      s
   r   )r[   )N)TTTTF)r|   collections.abcr   ior   r   rp   r   r   r   Zunittestr   r~   ZfontTools.configr   ZfontTools.misc.textToolsr   ZfontTools.misc.xmlWriterr   r   r&   r'   objectr   ra   rg   r   boolrr   rs   r   r   r   r   r   <module>   sD   )
	
     
