
    <`9                        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 Z G d	 d
          Z G d de          ZddZddZ G d de          Z G d de          Z
 G d de
          ZdS )zHelpers for writing unit tests.    )Iterable)BytesION)TestCasetobytes)	XMLWriterc                    t                      }d}t          | t                    r|| z  }nt          | t                    r|t	          | d          z  }n\t          | t
                    r#|d                    d | D                       z  }n$t          dt          |           j	        z            |dz  }|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   6   K   | ]}t          |d           V  dS )r
   Nr   ).0ss     8lib/python3.11/site-packages/fontTools/misc/testTools.py	<genexpr>zparseXML.<locals>.<genexpr>    s,      @@7++@@@@@@r   z0expected string or sequence of strings; found %rs   </root>r      )TestXMLReader_
isinstancebytesstrr   r   join	TypeErrortype__name__parserParseroot)
xmlSnippetreaderxmls      r   parseXMLr       s     F
C*e$$ 5z	J	$	$ 5wz7+++	J	)	) 5sxx@@Z@@@@@@Jz**34 5 5 	5:C
MQ;q>r   c                   F    e Zd Zd Zd Zd ZddZd Zd Zd Z	d	 Z
d
 ZdS )FakeFontc                 l    || _         d t          |          D             | _        d| _        i | _        d S )Nc                     i | ]\  }}||	S  r%   )r   igs      r   
<dictcomp>z%FakeFont.__init__.<locals>.<dictcomp>,   s    &J&J&J1q!&J&J&Jr   F)glyphOrder_	enumeratereverseGlyphOrderDict_lazytables)selfglyphss     r   __init__zFakeFont.__init__*   s:    !&J&J	&8I8I&J&J&J#	r   c                     | j         |         S Nr-   )r.   tags     r   __getitem__zFakeFont.__getitem__0   s    {3r   c                     || j         |<   d S r2   r3   )r.   r4   tables      r   __setitem__zFakeFont.__setitem__3   s     Cr   Nc                 8    | j                             ||          S r2   )r-   get)r.   r4   defaults      r   r:   zFakeFont.get6   s    {sG,,,r   c                     | j         |         S r2   r+   r.   names     r   
getGlyphIDzFakeFont.getGlyphID9   s    *400r   c                 V    |t          | j                  k     r| j        |         S d|z  S )Nz	glyph%.5d)lenr)   )r.   glyphIDs     r   getGlyphNamezFakeFont.getGlyphName<   s1    S)****#G,,((r   c                     | j         S r2   )r)   r.   s    r   getGlyphOrderzFakeFont.getGlyphOrderB       r   c                     | j         S r2   r=   rF   s    r   getReverseGlyphMapzFakeFont.getReverseGlyphMapE   s    **r   c                 D    t          |                                           S r2   )sortedrG   rF   s    r   getGlyphNameszFakeFont.getGlyphNamesH   s    d((**+++r   r2   )r   
__module____qualname__r0   r5   r8   r:   r@   rD   rG   rJ   rM   r%   r   r   r"   r"   )   s               ! ! !- - - -1 1 1) ) )     + + +, , , , ,r   r"   c                   &    e Zd Zd Zd Zd Zd ZdS )r   c                     ddl m}  |            | _        | j        | j        _        | j        | j        _        | j        | j        _        d | _	        g | _
        d S )Nr   )ParserCreate)xml.parsers.expatrR   r   startElement_StartElementHandlerendElement_EndElementHandleraddCharacterData_CharacterDataHandlerr   stack)r.   rR   s     r   r0   zTestXMLReader_.__init__M   sZ    222222"lnn*.*<'(,(8%+/+A(	


r   c                     ||g f}| j         r'| j         d         d                             |           n|| _        | j                             |           d S Nr   )rZ   appendr   )r.   r?   attrselements       r   rT   zTestXMLReader_.startElement_V   s]    #: 	 JrN1$$W----DI
'"""""r   c                 8    | j                                          d S r2   )rZ   popr>   s     r   rV   zTestXMLReader_.endElement_^   s    
r   c                 R    | j         d         d                             |           d S r\   )rZ   r^   )r.   datas     r   rX   z TestXMLReader_.addCharacterData_a   s'    
2q  &&&&&r   N)r   rN   rO   r0   rT   rV   rX   r%   r   r   r   r   L   sP          # # #  ' ' ' ' 'r   r   
c                     t          t                      |           }|j                            d           |j                                         |S )N)
newlinestrr   )r   r   fileseektruncate)rg   writers     r   makeXMLWriterrl   e   sG    wyyZ888F
KQ
KMr   c                     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
   re   )rl   rh   getvaluedecodeendswith
splitlines)functtFontrk   r   s       r   getXMLrt   n   sh    
 __FD
+


 
 
'
'
0
0C<<>>r   c                   2    e Zd ZdZd ZddZd Zd Zd ZdS )	MockFontzYA font-like object that automatically adds any looked up glyphname
    to its glyphOrder.c                 t     dg _          G  fddt                    } |ddi           _        d _        d S )Nz.notdefc                       e Zd Z fdZdS ))MockFont.__init__.<locals>.AllocatingDictc                 d    j                             |           t          |           }|| |<   |S r2   )_glyphOrderr^   rB   )reverseDictkeygidr.   s      r   __missing__z5MockFont.__init__.<locals>.AllocatingDict.__missing__   s6     '',,,+&&#&C 
r   N)r   rN   rO   r   rF   s   r   AllocatingDictry      s.              r   r   r   F)r{   dict_reverseGlyphOrderr,   )r.   r   s   ` r   r0   zMockFont.__init__   sd    %;	 	 	 	 	 	 	T 	 	 	 #1.)Q"@"@			r   Nc                      | j         |         }|S r2   r   )r.   glyphrequireRealr~   s       r   r@   zMockFont.getGlyphID   s    %e,
r   c                     | j         S r2   r   rF   s    r   rJ   zMockFont.getReverseGlyphMap   s    &&r   c                     | j         |         S r2   r{   )r.   r~   s     r   rD   zMockFont.getGlyphName   s    $$r   c                     | j         S r2   r   rF   s    r   rG   zMockFont.getGlyphOrder   rH   r   r2   )	r   rN   rO   __doc__r0   r@   rJ   rD   rG   r%   r   r   rv   rv   {   sn         
 
 
   ' ' '% % %         r   rv   c                       e Zd Zd ZdS )r   c                 l    t          j        | |           t          | d          s| j        | _        d S d S )NassertRaisesRegex)	_TestCaser0   hasattrassertRaisesRegexpr   )r.   
methodNames     r   r0   zTestCase.__init__   sE    4,,, t011 	=%)%<D"""	= 	=r   N)r   rN   rO   r0   r%   r   r   r   r      s#        = = = = =r   r   c                   ,    e Zd Zd Zd Zd Zd Zd ZdS )DataFilesHandlerc                 "    d | _         d| _        d S )Nr   )tempdirnum_tempfilesrF   s    r   setUpzDataFilesHandler.setUp   s    r   c                 J    | j         rt          j        | j                    d S d S r2   )r   shutilrmtreerF   s    r   tearDownzDataFilesHandler.tearDown   s.    < 	(M$,'''''	( 	(r   c                     t           j                            t          j        | j                 j                  }t           j                            |d|          S )Nrd   )ospathdirnamesysmodulesrN   __file__r   )r.   testfilefolders      r   getpathzDataFilesHandler.getpath   s9    T_!=!FGGw||FFH555r   c                 H    | j         st          j                    | _         d S d S r2   )r   tempfilemkdtemprF   s    r   temp_dirzDataFilesHandler.temp_dir   s*    | 	.#+--DLLL	. 	.r   c                     |                                   t          j                            | j        |          }t          j        ||           |S r2   )r   r   r   r   r   r   copy2)r.   	font_path	file_nametemppaths       r   	temp_fontzDataFilesHandler.temp_font   s=    7<<i88Y)))r   N)r   rN   rO   r   r   r   r   r   r%   r   r   r   r      s_          ( ( (6 6 6. . .    r   r   )re   r2   )r   collections.abcr   ior   r   r   r   r   unittestr   r   fontTools.misc.py23r   fontTools.misc.xmlWriterr   r    r"   objectr   rl   rt   rv   r   r%   r   r   <module>r      s   % % $ $ $ $ $ $       				  



  * * * * * * ' ' ' ' ' ' . . . . . .  6 ,  ,  ,  ,  ,  ,  ,  ,F' ' ' ' 'V ' ' '2   
 
 
 
         v      <= = = = =y = = =    x     r   