o
    h                     @   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)dededededededef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 }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   l/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/fontTools/misc/testTools.py	<genexpr>"   s    zparseXML.<locals>.<genexpr>z0expected string or sequence of strings; found %rs   </root>      )TestXMLReader_
isinstancebytesstrr   r   join	TypeErrortype__name__parserParseroot)
xmlSnippetreaderxmlr   r   r   parseXML   s    




r    c                 C   sL   dd t | D }|D ]\}}}|||||  qt|dr$|  |S )Nc                 S   s   g | ]	}t |ts|qS r   )r   r   )r   er   r   r   
<listcomp>.   s    z parseXmlInto.<locals>.<listcomp>populateDefaults)r    stripfromXMLhasattrr#   )font	parseIntor   
parsed_xmlnameattrscontentr   r   r   parseXmlInto-   s   
r-   c                   @   sn   e Zd Zd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>9       z%FakeFont.__init__.<locals>.<dictcomp>F)glyphOrder_	enumeratereverseGlyphOrderDict_lazytablesr   cfg)selfglyphsr   r   r   __init__7   s
   zFakeFont.__init__c                 C   s
   || j v S Nr7   r9   tagr   r   r   __contains__>      
zFakeFont.__contains__c                 C   
   | j | S r<   r=   r>   r   r   r   __getitem__A   rA   zFakeFont.__getitem__c                 C   s   || j |< d S r<   r=   )r9   r?   tabler   r   r   __setitem__D      zFakeFont.__setitem__Nc                 C   s   | j ||S r<   )r7   get)r9   r?   defaultr   r   r   rG   G   rF   zFakeFont.getc                 C   rB   r<   r5   r9   r*   r   r   r   
getGlyphIDJ   rA   zFakeFont.getGlyphIDc                        fdd|D S )Nc                       g | ]}  |qS r   )rK   r   gidr9   r   r   r"   N   r2   z+FakeFont.getGlyphIDMany.<locals>.<listcomp>r   r9   lstr   rP   r   getGlyphIDManyM      zFakeFont.getGlyphIDManyc                 C   s    |t | jk r| j| S d| S )Nz	glyph%.5d)lenr3   )r9   glyphIDr   r   r   getGlyphNameP   s   
zFakeFont.getGlyphNamec                    rL   )Nc                    rM   r   )rW   rN   rP   r   r   r"   W   r2   z-FakeFont.getGlyphNameMany.<locals>.<listcomp>r   rQ   r   rP   r   getGlyphNameManyV   rT   zFakeFont.getGlyphNameManyc                 C      | j S r<   )r3   rP   r   r   r   getGlyphOrderY      zFakeFont.getGlyphOrderc                 C   rY   r<   rI   rP   r   r   r   getReverseGlyphMap\   r[   zFakeFont.getReverseGlyphMapc                 C   s   t |  S r<   )sortedrZ   rP   r   r   r   getGlyphNames_   s   zFakeFont.getGlyphNamesr<   )r   
__module____qualname__r;   r@   rC   rE   rG   rK   rS   rW   rX   rZ   r\   r^   r   r   r   r   r.   6   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.expatra   r   startElement_StartElementHandlerendElement_EndElementHandleraddCharacterData_CharacterDataHandlerr   stack)r9   ra   r   r   r   r;   d   s   



zTestXMLReader_.__init__c                 C   s<   ||g f}| j r| j d d | n|| _| j | d S Nr   )ri   appendr   )r9   r*   r+   elementr   r   r   rc   n   s
   
zTestXMLReader_.startElement_c                 C   s   | j   d S r<   )ri   poprJ   r   r   r   re   v   rF   zTestXMLReader_.endElement_c                 C   s   | j d d | d S rj   )ri   rl   )r9   datar   r   r   rg   y   s   z TestXMLReader_.addCharacterData_N)r   r_   r`   r;   rc   re   rg   r   r   r   r   r   c   s
    
r   
c                 C   s(   t t | d}|jd |j  |S )N)
newlinestrr   )r   r   fileseektruncate)rq   writerr   r   r   makeXMLWriter}   s   
rv   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	   rp   )rv   rr   getvaluedecodeendswith
splitlines)functtFontru   r   r   r   r   getXML   s
   
r}   TFstringttLibVersioncheckSumAdjustmentmodifiedcreatedsfntVersionreturnc                 C   s^   |r	t dd| } |rt dd| } |rt dd| } |r$t dd| } |r-t 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)r~   r   r   r   r   r   r   r   r   stripVariableItemsFromTTX   s   
r   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 r<   )_glyphOrderrl   rU   )reverseDictkeyrO   rP   r   r   __missing__   s   z5MockFont.__init__.<locals>.AllocatingDict.__missing__N)r   r_   r`   r   r   rP   r   r   AllocatingDict   s    r   r   F)r   dict_reverseGlyphOrderr6   )r9   r   r   rP   r   r;      s   
zMockFont.__init__c                 C   s   | j | }|S r<   r   )r9   glyphrO   r   r   r   rK      s   
zMockFont.getGlyphIDc                 C   rY   r<   r   rP   r   r   r   r\      r[   zMockFont.getReverseGlyphMapc                 C   rB   r<   r   )r9   rO   r   r   r   rW      rA   zMockFont.getGlyphNamec                 C   rY   r<   r   rP   r   r   r   rZ      r[   zMockFont.getGlyphOrderN)	r   r_   r`   __doc__r;   rK   r\   rW   rZ   r   r   r   r   r      s    r   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;   r&   assertRaisesRegexpr   )r9   
methodNamer   r   r   r;      s   
zTestCase.__init__N)r   r_   r`   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   )tempdirnum_tempfilesrP   r   r   r   setUp   s   
zDataFilesHandler.setUpc                 C   s   | j rt| j  d S d S r<   )r   shutilrmtreerP   r   r   r   tearDown   s   zDataFilesHandler.tearDownc                 C   s&   t jtj| j j}t j|d|S )Nro   )ospathdirnamesysmodulesr_   __file__r   )r9   testfilefolderr   r   r   getpath   s   zDataFilesHandler.getpathc                 C   s   | j s
t | _ d S d S r<   )r   tempfilemkdtemprP   r   r   r   temp_dir   s   zDataFilesHandler.temp_dirc                 C   s(   |    tj| j|}t|| |S r<   )r   r   r   r   r   r   copy2)r9   	font_path	file_nametemppathr   r   r   	temp_font   s   zDataFilesHandler.temp_fontN)r   r_   r`   r   r   r   r   r   r   r   r   r   r      s    r   )rp   r<   )TTTTF)r   collections.abcr   ior   r   r   r   r   r   unittestr   r   fontTools.configr   fontTools.misc.textToolsr   fontTools.misc.xmlWriterr   r    r-   r.   objectr   rv   r}   r   boolr   r   r   r   r   r   r   <module>   sR    	-

	
	