o
    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 }n(t| tr|t| d7 }nt| 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   :/usr/lib/python3/dist-packages/fontTools/misc/testTools.py	<genexpr>    s    zparseXML.<locals>.<genexpr>z0expected string or sequence of strings; found %rs   </root>r      )TestXMLReader_
isinstancebytesstrr   r   join	TypeErrortype__name__parserZ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>*   s    z parseXmlInto.<locals>.<listcomp>)r   stripZfromXMLZpopulateDefaults)ZfontZ	parseIntor   Z
parsed_xmlnameattrsZ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       z%FakeFont.__init__.<locals>.<dictcomp>F)glyphOrder_	enumeratereverseGlyphOrderDict_lazytables)selfZglyphsr   r   r   __init__2   s   
zFakeFont.__init__c                 C   
   | j | S Nr-   )r.   tagr   r   r   __getitem__8      
zFakeFont.__getitem__c                 C   s   || j |< d S r1   r2   )r.   r3   tabler   r   r   __setitem__;      zFakeFont.__setitem__Nc                 C   s   | j ||S r1   )r-   get)r.   r3   defaultr   r   r   r9   >   r8   zFakeFont.getc                 C   r0   r1   r+   r.   r!   r   r   r   
getGlyphIDA   r5   zFakeFont.getGlyphIDc                        fdd|D S )Nc                       g | ]}  |qS r   )r=   r
   gidr.   r   r   r   E   r(   z+FakeFont.getGlyphIDMany.<locals>.<listcomp>r   r.   Zlstr   rB   r   getGlyphIDManyD      zFakeFont.getGlyphIDManyc                 C   s    |t | jk r| j| S d| S )Nz	glyph%.5d)lenr)   )r.   ZglyphIDr   r   r   getGlyphNameG   s   
zFakeFont.getGlyphNamec                    r>   )Nc                    r?   r   )rG   r@   rB   r   r   r   M   r(   z-FakeFont.getGlyphNameMany.<locals>.<listcomp>r   rC   r   rB   r   getGlyphNameManyL   rE   zFakeFont.getGlyphNameManyc                 C      | j S r1   )r)   rB   r   r   r   getGlyphOrderO      zFakeFont.getGlyphOrderc                 C   rI   r1   r;   rB   r   r   r   getReverseGlyphMapR   rK   zFakeFont.getReverseGlyphMapc                 C   s   t |  S r1   )sortedrJ   rB   r   r   r   getGlyphNamesU   s   zFakeFont.getGlyphNamesr1   )r   
__module____qualname__r/   r4   r7   r9   r=   rD   rG   rH   rJ   rL   rN   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)Zxml.parsers.expatrQ   r   startElement_ZStartElementHandlerendElement_ZEndElementHandleraddCharacterData_ZCharacterDataHandlerr   stack)r.   rQ   r   r   r   r/   Z   s   



zTestXMLReader_.__init__c                 C   s<   ||g f}| j r| j d d | n|| _| j | d S Nr   )rU   appendr   )r.   r!   r"   elementr   r   r   rR   c   s
   
zTestXMLReader_.startElement_c                 C   s   | j   d S r1   )rU   popr<   r   r   r   rS   k   r8   zTestXMLReader_.endElement_c                 C   s   | j d d | d S rV   )rU   rX   )r.   datar   r   r   rT   n   s   z TestXMLReader_.addCharacterData_N)r   rO   rP   r/   rR   rS   rT   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   
rb   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\   )rb   r^   getvaluedecodeendswith
splitlines)funcZttFontra   r   r   r   r   getXML{   s
   
rh   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 r1   )_glyphOrderrX   rF   )ZreverseDictkeyrA   rB   r   r   __missing__   s   z5MockFont.__init__.<locals>.AllocatingDict.__missing__N)r   rO   rP   rl   r   rB   r   r   AllocatingDict   s    rm   r   F)rj   dict_reverseGlyphOrderr,   )r.   rm   r   rB   r   r/      s   
zMockFont.__init__c                 C   s   | j | }|S r1   ro   )r.   ZglyphrA   r   r   r   r=      s   
zMockFont.getGlyphIDc                 C   rI   r1   rp   rB   r   r   r   rL      rK   zMockFont.getReverseGlyphMapc                 C   r0   r1   rj   )r.   rA   r   r   r   rG      r5   zMockFont.getGlyphNamec                 C   rI   r1   rq   rB   r   r   r   rJ      rK   zMockFont.getGlyphOrderN)	r   rO   rP   __doc__r/   r=   rL   rG   rJ   r   r   r   r   ri      s    ri   c                   @   s   e Zd Zdd ZdS )r   c                 C   s&   t | | t| ds| j| _d S d S )NassertRaisesRegex)	_TestCaser/   hasattrZassertRaisesRegexprs   )r.   Z
methodNamer   r   r   r/      s   
zTestCase.__init__N)r   rO   rP   r/   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_tempfilesrB   r   r   r   setUp   s   
zDataFilesHandler.setUpc                 C   s   | j rt| j  d S d S r1   )rw   shutilrmtreerB   r   r   r   tearDown   s   zDataFilesHandler.tearDownc                 C   s&   t jtj| j j}t j|d|S )Nr[   )ospathdirnamesysmodulesrO   __file__r   )r.   ZtestfileZfolderr   r   r   getpath   s   zDataFilesHandler.getpathc                 C   s   | j s
t | _ d S d S r1   )rw   tempfileZmkdtemprB   r   r   r   temp_dir   s   zDataFilesHandler.temp_dirc                 C   s(   |    tj| j|}t|| |S r1   )r   r|   r}   r   rw   ry   copy2)r.   Z	font_path	file_nameZtemppathr   r   r   	temp_font   s   zDataFilesHandler.temp_fontN)r   rO   rP   rx   r{   r   r   r   r   r   r   r   rv      s    rv   )r\   r1   )rr   Zcollections.abcr   ior   r|   ry   r   r   Zunittestr   rt   ZfontTools.misc.textToolsr   ZfontTools.misc.xmlWriterr   r   r#   r$   objectr   rb   rh   ri   rv   r   r   r   r   <module>   s&    (

	
