
    gY                     0   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	 Zd
 Z G d d      Z G d de      ZddZd dZ	 	 	 	 	 d!dededededededefdZ G d de      Z G d de      Z G d de      Zy)"zHelpers for writing unit tests.    )Iterable)BytesION)TestCase)Configtobytes)	XMLWriterc                    t               }d}t        | t              r|| z  }nmt        | t              r|t	        | d      z  }nMt        | t
              r|dj                  d | D              z  }n!t        dt        |       j                  z        |dz  }|j                  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              3   4   K   | ]  }t        |d         yw)r   Nr   ).0ss     U/var/www/dash_apps/app1/venv/lib/python3.12/site-packages/fontTools/misc/testTools.py	<genexpr>zparseXML.<locals>.<genexpr>"   s     @7+@s   z0expected string or sequence of strings; found %rs   </root>      )TestXMLReader_
isinstancebytesstrr   r   join	TypeErrortype__name__parserParseroot)
xmlSnippetreaderxmls      r   parseXMLr"      s     F
C*e$z	J	$wz7++	J	)sxx@Z@@@>:''(
 	
 :C
MMQ;;q>r   c                     t        |j                               D cg c]  }t        |t              r| }}|D ]  \  }}}|j	                  ||||         |j                          |S c c}w N)r"   stripr   r   fromXMLpopulateDefaults)font	parseIntor   e
parsed_xmlnameattrscontents           r   parseXmlIntor/   -   sn    %j&6&6&89TAsAS!TJT * 6eW$w56 	 Us
   A)A)c                   V    e Zd Zd Zd Zd Zd ZddZd Zd Z	d	 Z
d
 Zd Zd Zd Zy)FakeFontc                     || _         t        |      D ci c]  \  }}||
 c}}| _        d| _        i | _        t               | _        y c c}}w )NF)glyphOrder_	enumeratereverseGlyphOrderDict_lazytablesr   cfg)selfglyphsigs       r   __init__zFakeFont.__init__6   sG    !8A&8I&J1q!t&J#	8 'Ks   A
c                     || j                   v S r$   r7   r9   tags     r   __contains__zFakeFont.__contains__=   s    dkk!!r   c                      | j                   |   S r$   r?   r@   s     r   __getitem__zFakeFont.__getitem__@   s    {{3r   c                 "    || j                   |<   y r$   r?   )r9   rA   tables      r   __setitem__zFakeFont.__setitem__C   s     Cr   Nc                 :    | j                   j                  ||      S r$   )r7   get)r9   rA   defaults      r   rI   zFakeFont.getF   s    {{sG,,r   c                      | j                   |   S r$   r5   r9   r,   s     r   
getGlyphIDzFakeFont.getGlyphIDI   s    **400r   c                 J    |D cg c]  }| j                  |       c}S c c}w r$   )rN   r9   lstgids      r   getGlyphIDManyzFakeFont.getGlyphIDManyL   s    034$444    c                 Z    |t        | j                        k  r| j                  |   S d|z  S )Nz	glyph%.5d)lenr3   )r9   glyphIDs     r   getGlyphNamezFakeFont.getGlyphNameO   s1    S))**##G,,((r   c                 J    |D cg c]  }| j                  |       c}S c c}w r$   )rX   rP   s      r   getGlyphNameManyzFakeFont.getGlyphNameManyU   s!    2563!!#&666rT   c                     | j                   S r$   )r3   r9   s    r   getGlyphOrderzFakeFont.getGlyphOrderX       r   c                     | j                   S r$   rL   r\   s    r   getReverseGlyphMapzFakeFont.getReverseGlyphMap[   s    ***r   c                 4    t        | j                               S r$   )sortedr]   r\   s    r   getGlyphNameszFakeFont.getGlyphNames^   s    d((*++r   r$   )r   
__module____qualname__r=   rB   rD   rG   rI   rN   rS   rX   rZ   r]   r`   rc    r   r   r1   r1   5   s>    " !-15)7 +,r   r1   c                   $    e Zd Zd Zd Zd Zd Zy)r   c                     ddl m}  |       | _        | j                  | j                  _        | j
                  | j                  _        | j                  | j                  _        d | _	        g | _
        y )Nr   )ParserCreate)xml.parsers.expatri   r   startElement_StartElementHandlerendElement_EndElementHandleraddCharacterData_CharacterDataHandlerr   stack)r9   ri   s     r   r=   zTestXMLReader_.__init__c   sR    2"n*.*<*<'(,(8(8%+/+A+A(	
r   c                     ||g f}| j                   r"| j                   d   d   j                  |       n|| _        | j                   j                  |       y Nr   )rq   appendr   )r9   r,   r-   elements       r   rk   zTestXMLReader_.startElement_m   sI    #::JJrN1$$W-DI

'"r   c                 8    | j                   j                          y r$   )rq   poprM   s     r   rm   zTestXMLReader_.endElement_u   s    

r   c                 F    | j                   d   d   j                  |       y rs   )rq   ru   )r9   datas     r   ro   z TestXMLReader_.addCharacterData_x   s    

2q  &r   N)r   rd   re   r=   rk   rm   ro   rf   r   r   r   r   b   s    #'r   r   c                     t        t               |       }|j                  j                  d       |j                  j	                          |S )N)
newlinestrr   )r	   r   fileseektruncate)r|   writers     r   makeXMLWriterr   |   s7    wyZ8F
KKQ
KKMr   c                     t               } | ||       |j                  j                         j                  d      }|j	                  d      sJ |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   r}   getvaluedecodeendswith
splitlines)functtFontr   r!   s       r   getXMLr      sQ    
 _F
++


 
'
'
0C<<>>r   stringttLibVersioncheckSumAdjustmentmodifiedcreatedsfntVersionreturnc                     |rt        j                  dd|       } |rt        j                  dd|       } |rt        j                  dd|       } |rt        j                  dd|       } |rt        j                  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   s         r   stripVariableItemsFromTTXr      sw     /V<.F;=r6J3R@2B?Mr   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)MockFontzYA font-like object that automatically adds any looked up glyphname
    to its glyphOrder.c                 d     dg _          G  fddt              } |ddi       _        d _        y )Nz.notdefc                       e Zd Z fdZy))MockFont.__init__.<locals>.AllocatingDictc                 ^    j                   j                  |       t        |       }|| |<   |S r$   )_glyphOrderru   rV   )reverseDictkeyrR   r9   s      r   __missing__z5MockFont.__init__.<locals>.AllocatingDict.__missing__   s0      '',+&#&C 
r   N)r   rd   re   r   r\   s   r   AllocatingDictr      s    r   r   r   F)r   dict_reverseGlyphOrderr6   )r9   r   s   ` r   r=   zMockFont.__init__   s3    %;	T 	 #1)Q"@	r   c                 $    | j                   |   }|S r$   r   )r9   glyphrR   s      r   rN   zMockFont.getGlyphID   s    %%e,
r   c                     | j                   S r$   r   r\   s    r   r`   zMockFont.getReverseGlyphMap   s    &&&r   c                      | j                   |   S r$   r   )r9   rR   s     r   rX   zMockFont.getGlyphName   s    $$r   c                     | j                   S r$   r   r\   s    r   r]   zMockFont.getGlyphOrder   r^   r   N)	r   rd   re   __doc__r=   rN   r`   rX   r]   rf   r   r   r   r      s     '% r   r   c                       e Zd Zd Zy)r   c                 l    t        j                  | |       t        | d      s| j                  | _        y y )NassertRaisesRegex)	_TestCaser=   hasattrassertRaisesRegexpr   )r9   
methodNames     r   r=   zTestCase.__init__   s2    4, t01%)%<%<D" 2r   N)r   rd   re   r=   rf   r   r   r   r      s    =r   r   c                   *    e Zd Zd Zd Zd Zd Zd Zy)DataFilesHandlerc                      d | _         d| _        y )Nr   )tempdirnum_tempfilesr\   s    r   setUpzDataFilesHandler.setUp   s    r   c                 \    | j                   r t        j                  | j                          y y r$   )r   shutilrmtreer\   s    r   tearDownzDataFilesHandler.tearDown   s    <<MM$,,' r   c                     t         j                  j                  t        j                  | j
                     j                        }t         j                  j                  |d|      S )Nrz   )ospathdirnamesysmodulesrd   __file__r   )r9   testfilefolders      r   getpathzDataFilesHandler.getpath   s>    T__!=!F!FGww||FFH55r   c                 P    | j                   st        j                         | _         y y r$   )r   tempfilemkdtempr\   s    r   temp_dirzDataFilesHandler.temp_dir   s    ||#++-DL r   c                     | j                          t        j                  j                  | j                  |      }t        j                  ||       |S r$   )r   r   r   r   r   r   copy2)r9   	font_path	file_nametemppaths       r   	temp_fontzDataFilesHandler.temp_font   s6    77<<i8Y)r   N)r   rd   re   r   r   r   r   r   rf   r   r   r   r      s    (6.r   r   )r   r$   )TTTTF)r   collections.abcr   ior   r   r   r   r   r   unittestr   r   fontTools.configr   fontTools.misc.textToolsr   fontTools.misc.xmlWriterr	   r"   r/   r1   objectr   r   r   r   boolr   r   r   rf   r   r   <module>r      s    % $  	 	  
  * # , .:*, *,Z'V '4
 #  	
   	2 v  >=y =x r   