
    yYHh                     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     Q/var/www/html/planif/env/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	                  ||||         t        |d      r|j                          |S c c}w )NpopulateDefaults)r"   stripr   r   fromXMLhasattrr$   )font	parseIntor   e
parsed_xmlnameattrscontents           r   parseXmlIntor/   -   sy    %j&6&6&89TAsAS!TJT * 6eW$w56y,-""$ Us
   A5A5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__7   sG    !8A&8I&J1q!t&J#	8 'Ks   A
c                     || j                   v S Nr7   r9   tags     r   __contains__zFakeFont.__contains__>   s    dkk!!r   c                      | j                   |   S r?   r@   rA   s     r   __getitem__zFakeFont.__getitem__A   s    {{3r   c                 "    || j                   |<   y r?   r@   )r9   rB   tables      r   __setitem__zFakeFont.__setitem__D   s     Cr   Nc                 :    | j                   j                  ||      S r?   )r7   get)r9   rB   defaults      r   rJ   zFakeFont.getG   s    {{sG,,r   c                      | j                   |   S r?   r5   r9   r,   s     r   
getGlyphIDzFakeFont.getGlyphIDJ   s    **400r   c                 J    |D cg c]  }| j                  |       c}S c c}w r?   )rO   r9   lstgids      r   getGlyphIDManyzFakeFont.getGlyphIDManyM   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.getGlyphNameP   s1    S))**##G,,((r   c                 J    |D cg c]  }| j                  |       c}S c c}w r?   )rY   rQ   s      r   getGlyphNameManyzFakeFont.getGlyphNameManyV   s!    2563!!#&666rU   c                     | j                   S r?   )r3   r9   s    r   getGlyphOrderzFakeFont.getGlyphOrderY       r   c                     | j                   S r?   rM   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=   rC   rE   rH   rJ   rO   rT   rY   r[   r^   ra   rd    r   r   r1   r1   6   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.expatrj   r   startElement_StartElementHandlerendElement_EndElementHandleraddCharacterData_CharacterDataHandlerr   stack)r9   rj   s     r   r=   zTestXMLReader_.__init__d   sR    2"n*.*<*<'(,(8(8%+/+A+A(	
r   c                     ||g f}| j                   r"| j                   d   d   j                  |       n|| _        | j                   j                  |       y Nr   )rr   appendr   )r9   r,   r-   elements       r   rl   zTestXMLReader_.startElement_n   sI    #::JJrN1$$W-DI

'"r   c                 8    | j                   j                          y r?   )rr   poprN   s     r   rn   zTestXMLReader_.endElement_v   s    

r   c                 F    | j                   d   d   j                  |       y rt   )rr   rv   )r9   datas     r   rp   z TestXMLReader_.addCharacterData_y   s    

2q  &r   N)r   re   rf   r=   rl   rn   rp   rg   r   r   r   r   c   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?   )_glyphOrderrv   rW   )reverseDictkeyrS   r9   s      r   __missing__z5MockFont.__init__.<locals>.AllocatingDict.__missing__   s0      '',+&#&C 
r   N)r   re   rf   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   glyphrS   s      r   rO   zMockFont.getGlyphID   s    %%e,
r   c                     | j                   S r?   r   r]   s    r   ra   zMockFont.getReverseGlyphMap   s    &&&r   c                      | j                   |   S r?   r   )r9   rS   s     r   rY   zMockFont.getGlyphName   s    $$r   c                     | j                   S r?   r   r]   s    r   r^   zMockFont.getGlyphOrder   r_   r   N)	r   re   rf   __doc__r=   rO   ra   rY   r^   rg   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=   r'   assertRaisesRegexpr   )r9   
methodNames     r   r=   zTestCase.__init__   s2    4, t01%)%<%<D" 2r   N)r   re   rf   r=   rg   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 )Nr{   )ospathdirnamesysmodulesre   __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   re   rf   r   r   r   r   r   rg   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   rg   r   r   <module>r      s    % $  	 	  
  * # , .:*, *,Z'V '4
 #  	
   	2 v  >=y =x r   