
    jke                     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     :/usr/lib/python3/dist-packages/fontTools/misc/testTools.py	<genexpr>zparseXML.<locals>.<genexpr>"   s     @7+@s   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$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                   P    e 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                   |   S r#   r6   )r8   tags     r   __getitem__zFakeFont.__getitem__=   s    {{3r   c                 "    || j                   |<   y r#   r>   )r8   r?   tables      r   __setitem__zFakeFont.__setitem__@   s     Cr   Nc                 :    | j                   j                  ||      S r#   )r6   get)r8   r?   defaults      r   rE   zFakeFont.getC   s    {{sG,,r   c                      | j                   |   S r#   r4   r8   r+   s     r   
getGlyphIDzFakeFont.getGlyphIDF   s    **400r   c                 J    |D cg c]  }| j                  |       c}S c c}w r#   )rJ   r8   lstgids      r   getGlyphIDManyzFakeFont.getGlyphIDManyI   s    034$444    c                 Z    |t        | j                        k  r| j                  |   S d|z  S )Nz	glyph%.5d)lenr2   )r8   glyphIDs     r   getGlyphNamezFakeFont.getGlyphNameL   s1    S))**##G,,((r   c                 J    |D cg c]  }| j                  |       c}S c c}w r#   )rT   rL   s      r   getGlyphNameManyzFakeFont.getGlyphNameManyR   s!    2563!!#&666rP   c                     | j                   S r#   )r2   r8   s    r   getGlyphOrderzFakeFont.getGlyphOrderU       r   c                     | j                   S r#   rH   rX   s    r   getReverseGlyphMapzFakeFont.getReverseGlyphMapX   s    ***r   c                 4    t        | j                               S r#   )sortedrY   rX   s    r   getGlyphNameszFakeFont.getGlyphNames[   s    d((*++r   r#   )r   
__module____qualname__r<   r@   rC   rE   rJ   rO   rT   rV   rY   r\   r_    r   r   r0   r0   5   s9     !-15)7 +,r   r0   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.expatre   r   startElement_StartElementHandlerendElement_EndElementHandleraddCharacterData_CharacterDataHandlerr   stack)r8   re   s     r   r<   zTestXMLReader_.__init__`   sR    2"n*.*<*<'(,(8(8%+/+A+A(	
r   c                     ||g f}| j                   r"| j                   d   d   j                  |       n|| _        | j                   j                  |       y Nr   )rm   appendr   )r8   r+   r,   elements       r   rg   zTestXMLReader_.startElement_j   sI    #::JJrN1$$W-DI

'"r   c                 8    | j                   j                          y r#   )rm   poprI   s     r   ri   zTestXMLReader_.endElement_r   s    

r   c                 F    | j                   d   d   j                  |       y ro   )rm   rq   )r8   datas     r   rk   z TestXMLReader_.addCharacterData_u   s    

2q  &r   N)r   r`   ra   r<   rg   ri   rk   rb   r   r   r   r   _   s    #'r   r   c                     t        t               |       }|j                  j                  d       |j                  j	                          |S )N)
newlinestrr   )r	   r   fileseektruncate)rx   writers     r   makeXMLWriterr}   y   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}   ry   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#   )_glyphOrderrq   rR   )reverseDictkeyrN   r8   s      r   __missing__z5MockFont.__init__.<locals>.AllocatingDict.__missing__   s0      '',+&#&C 
r   N)r   r`   ra   r   rX   s   r   AllocatingDictr      s    r   r   r   F)r   dict_reverseGlyphOrderr5   )r8   r   s   ` r   r<   zMockFont.__init__   s3    %;	T 	 #1)Q"@	r   c                 $    | j                   |   }|S r#   r   )r8   glyphrN   s      r   rJ   zMockFont.getGlyphID   s    %%e,
r   c                     | j                   S r#   r   rX   s    r   r\   zMockFont.getReverseGlyphMap   s    &&&r   c                      | j                   |   S r#   r   )r8   rN   s     r   rT   zMockFont.getGlyphName   s    $$r   c                     | j                   S r#   r   rX   s    r   rY   zMockFont.getGlyphOrder   rZ   r   N)	r   r`   ra   __doc__r<   rJ   r\   rT   rY   rb   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   )r8   
methodNames     r   r<   zTestCase.__init__   s2    4, t01%)%<%<D" 2r   N)r   r`   ra   r<   rb   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_tempfilesrX   s    r   setUpzDataFilesHandler.setUp   s    r   c                 \    | j                   r t        j                  | j                          y y r#   )r   shutilrmtreerX   s    r   tearDownzDataFilesHandler.tearDown   s    <<MM$,,' r   c                     t         j                  j                  t        j                  | j
                     j                        }t         j                  j                  |d|      S )Nrv   )ospathdirnamesysmodulesr`   __file__r   )r8   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mkdtemprX   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)r8   	font_path	file_nametemppaths       r   	temp_fontzDataFilesHandler.temp_font   s6    77<<i8Y)r   N)r   r`   ra   r   r   r   r   r   rb   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.   r0   objectr   r}   r   r   boolr   r   r   rb   r   r   <module>r      s    % $  	 	  
  * # , .:', ',T'V '4
 #  	
   	2 v  >=y =x r   