a
    ׶a                     @   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	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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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   h/Users/vegardjervell/Documents/master/model/venv/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)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   s*   || _ dd t|D | _d| _i | _d S )Nc                 S   s   i | ]\}}||qS r   r   )r
   igr   r   r   
<dictcomp>4   r	   z%FakeFont.__init__.<locals>.<dictcomp>F)glyphOrder_	enumeratereverseGlyphOrderDict_lazytables)selfZglyphsr   r   r   __init__2   s    zFakeFont.__init__c                 C   s
   | j | S Nr/   )r0   tagr   r   r   __getitem__8   s    zFakeFont.__getitem__c                 C   s   || j |< d S r2   r3   )r0   r4   tabler   r   r   __setitem__;   s    zFakeFont.__setitem__Nc                 C   s   | j ||S r2   )r/   get)r0   r4   defaultr   r   r   r8   >   s    zFakeFont.getc                 C   s
   | j | S r2   r-   r0   r#   r   r   r   
getGlyphIDA   s    zFakeFont.getGlyphIDc                    s    fdd|D S )Nc                    s   g | ]}  |qS r   )r<   r
   gidr0   r   r   r    E   r	   z+FakeFont.getGlyphIDMany.<locals>.<listcomp>r   r0   lstr   r?   r   getGlyphIDManyD   s    zFakeFont.getGlyphIDManyc                 C   s$   |t | jk r| j| S d| S d S )Nz	glyph%.5d)lenr+   )r0   ZglyphIDr   r   r   getGlyphNameG   s    
zFakeFont.getGlyphNamec                    s    fdd|D S )Nc                    s   g | ]}  |qS r   )rD   r=   r?   r   r   r    M   r	   z-FakeFont.getGlyphNameMany.<locals>.<listcomp>r   r@   r   r?   r   getGlyphNameManyL   s    zFakeFont.getGlyphNameManyc                 C   s   | j S r2   )r+   r?   r   r   r   getGlyphOrderO   s    zFakeFont.getGlyphOrderc                 C   s   | j S r2   r:   r?   r   r   r   getReverseGlyphMapR   s    zFakeFont.getReverseGlyphMapc                 C   s   t |  S r2   )sortedrF   r?   r   r   r   getGlyphNamesU   s    zFakeFont.getGlyphNames)N)r   
__module____qualname__r1   r5   r7   r8   r<   rB   rD   rE   rF   rG   rI   r   r   r   r   r'   1   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)xml.parsers.expatrL   r   startElement_StartElementHandlerendElement_EndElementHandleraddCharacterData_CharacterDataHandlerr   stack)r0   rL   r   r   r   r1   Z   s    


zTestXMLReader_.__init__c                 C   s<   ||g f}| j r&| j d d | n|| _| j | d S Nr   )rT   appendr   )r0   r#   r$   elementr   r   r   rN   c   s
    
zTestXMLReader_.startElement_c                 C   s   | j   d S r2   )rT   popr;   r   r   r   rP   k   s    zTestXMLReader_.endElement_c                 C   s   | j d d | d S rU   )rT   rW   )r0   datar   r   r   rR   n   s    z TestXMLReader_.addCharacterData_N)r   rJ   rK   r1   rN   rP   rR   r   r   r   r   r   Y   s   	r   
c                 C   s(   t t | d}|jd |j  |S )N)
newlinestrr   )r   r   fileseektruncate)r\   writerr   r   r   makeXMLWriterr   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   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 r2   )_glyphOrderrW   rC   )ZreverseDictkeyr>   r?   r   r   __missing__   s    z5MockFont.__init__.<locals>.AllocatingDict.__missing__N)r   rJ   rK   rk   r   r?   r   r   AllocatingDict   s   rl   r   F)ri   dict_reverseGlyphOrderr.   )r0   rl   r   r?   r   r1      s    zMockFont.__init__c                 C   s   | j | }|S r2   rn   )r0   Zglyphr>   r   r   r   r<      s    
zMockFont.getGlyphIDc                 C   s   | j S r2   ro   r?   r   r   r   rG      s    zMockFont.getReverseGlyphMapc                 C   s
   | j | S r2   ri   )r0   r>   r   r   r   rD      s    zMockFont.getGlyphNamec                 C   s   | j S r2   rp   r?   r   r   r   rF      s    zMockFont.getGlyphOrderN)	r   rJ   rK   __doc__r1   r<   rG   rD   rF   r   r   r   r   rh      s   rh   c                   @   s   e Zd Zdd ZdS )r   c                 C   s"   t | | t| ds| j| _d S )NassertRaisesRegex)	_TestCaser1   hasattrZassertRaisesRegexprr   )r0   
methodNamer   r   r   r1      s    
zTestCase.__init__N)r   rJ   rK   r1   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 r2   )rw   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modulesrJ   __file__r   )r0   Ztestfilefolderr   r   r   getpath   s    zDataFilesHandler.getpathc                 C   s   | j st | _ d S r2   )rw   tempfilemkdtempr?   r   r   r   temp_dir   s    zDataFilesHandler.temp_dirc                 C   s(   |    tj| j|}t|| |S r2   )r   r|   r}   r   rw   ry   copy2)r0   Z	font_path	file_nameZtemppathr   r   r   	temp_font   s    zDataFilesHandler.temp_fontN)r   rJ   rK   rx   r{   r   r   r   r   r   r   r   rv      s
   rv   )r[   )N)rq   collections.abcr   ior   r|   ry   r   r   Zunittestr   rs   ZfontTools.misc.textToolsr   ZfontTools.misc.xmlWriterr   r   r&   r'   objectr   ra   rg   rh   rv   r   r   r   r   <module>   s$   (
	

