+
    K<i                        R t ^ RIHt ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
Ht ^ RIHt ^ RIHt ^ RIHt R tR	 t ! R
 R4      t ! R R]4      tRR ltRR ltRR R llt ! R R]4      t ! R R]4      t ! R R]4      tR# )zHelpers for writing unit tests.)Iterable)BytesION)TestCase)Configtobytes)	XMLWriterc                   \        4       pRp\        V \        4      '       d
   W ,          pM\        V \        4      '       d   V\	        V R4      ,          pM[\        V \
        4      '       d!   VRP                  R V  4       4      ,          pM%\        R\        V 4      P                  ,          4      hVR,          pVP                  P                  V^4       VP                  ^,          # )a)  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   :   "   T F  p\        VR 4      x  K  	  R# 5i)r
   Nr   ).0ss   & :/usr/lib/python3/dist-packages/fontTools/misc/testTools.py	<genexpr>parseXML.<locals>.<genexpr>"   s     @Z7++Zs   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$$	J	$	$wz7++	J	)	)sxx@Z@@@>:''(
 	
 :C
MMQ;;q>r   c                    \        VP                  4       4       Uu. uF  p\        V\        4      '       d   K  VNK  	  ppV F  w  rVpVP	                  WVWp4       K  	  \        VR 4      '       d   VP                  4        V# u upi )populateDefaults)r    stripr   r   fromXMLhasattrr"   )font	parseIntor   e
parsed_xmlnameattrscontents   &&&     r   parseXmlIntor-   -   sv    %j&6&6&89T9AsAS!!9JT *W$w5 !+y,--""$ Us
   BBc                   l   a  ] tR t^6t o R tR tR tR tRR ltR t	R t
R	 tR
 tR tR tR tRtV tR# )FakeFontc                    Wn         \        V4       UUu/ uF  w  r#W2bK	  	  uppV n        R V n        / V n        \        4       V n        R# u uppi )FN)glyphOrder_	enumeratereverseGlyphOrderDict_lazytablesr   cfg)selfglyphsigs   &&  r   __init__FakeFont.__init__7   sG    !8A&8I&J8Iqt8I&J#	8 'Ks   A
c                    WP                   9   # Nr5   r7   tags   &&r   __contains__FakeFont.__contains__>   s    kk!!r   c                (    V P                   V,          # r>   r?   r@   s   &&r   __getitem__FakeFont.__getitem__A   s    {{3r   c                "    W P                   V&   R # r>   r?   )r7   rA   tables   &&&r   __setitem__FakeFont.__setitem__D   s     Cr   Nc                8    V P                   P                  W4      # r>   )r5   get)r7   rA   defaults   &&&r   rL   FakeFont.getG   s    {{s,,r   c                (    V P                   V,          # r>   r3   r7   r*   s   &&r   
getGlyphIDFakeFont.getGlyphIDJ   s    **400r   c                L    V Uu. uF  q P                  V4      NK  	  up# u upi r>   )rR   r7   lstgids   && r   getGlyphIDManyFakeFont.getGlyphIDManyM   s!    034$444   !c                n    V\        V P                  4      8  d   V P                  V,          # R V,          # )z	glyph%.5d)lenr1   )r7   glyphIDs   &&r   getGlyphNameFakeFont.getGlyphNameP   s1    S))**##G,,((r   c                L    V Uu. uF  q P                  V4      NK  	  up# u upi r>   )r^   rU   s   && r   getGlyphNameManyFakeFont.getGlyphNameManyV   s#    256#3!!#&#666rZ   c                    V P                   # r>   )r1   r7   s   &r   getGlyphOrderFakeFont.getGlyphOrderY       r   c                    V P                   # r>   rP   rd   s   &r   getReverseGlyphMapFakeFont.getReverseGlyphMap\   s    ***r   c                4    \        V P                  4       4      # r>   )sortedre   rd   s   &r   getGlyphNamesFakeFont.getGlyphNames_   s    d((*++r   )r6   r1   r4   r3   r5   r>   )r   
__module____qualname____firstlineno__r;   rB   rE   rI   rL   rR   rX   r^   ra   re   ri   rm   __static_attributes____classdictcell____classdict__s   @r   r/   r/   6   sF     " !-15)7 +, ,r   r/   c                   8   a  ] tR t^ct o R tR tR tR tRtV t	R# )r   c                    ^ RI Hp V! 4       V n        V P                  V P                  n        V P
                  V P                  n        V P                  V P                  n        RV n	        . V n
        R# )    )ParserCreateN)xml.parsers.expatry   r   startElement_StartElementHandlerendElement_EndElementHandleraddCharacterData_CharacterDataHandlerr   stack)r7   ry   s   & r   r;   TestXMLReader_.__init__d   sR    2"n*.*<*<'(,(8(8%+/+A+A(	
r   c                    W. 3pV P                   '       d+   V P                   R,          ^,          P                  V4       MW0n        V P                   P                  V4       R#    N)r   appendr   )r7   r*   r+   elements   &&& r   r{   TestXMLReader_.startElement_n   sG    #:::JJrN1$$W-I

'"r   c                :    V P                   P                  4        R # r>   )r   poprQ   s   &&r   r}   TestXMLReader_.endElement_v   s    

r   c                X    V P                   R,          ^,          P                  V4       R# r   )r   r   )r7   datas   &&r   r    TestXMLReader_.addCharacterData_y   s    

2q  &r   )r   r   r   N)
r   ro   rp   rq   r;   r{   r}   r   rr   rs   rt   s   @r   r   r   c   s     #' 'r   r   c                     \        \        4       V R 7      pVP                  P                  ^ 4       VP                  P	                  4        V# ))
newlinestr)r   r   fileseektruncate)r   writers   & r   makeXMLWriterr   }   s7    wyZ8F
KKQ
KKMr   c                    \        4       pV ! W!4       VP                  P                  4       P                  R4      pVP	                  R4      '       g   Q hVP                  4       # )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      sR    
 _F
++


 
'
'
0C<<>>r   c                l    V ^8  d   QhR\         R\        R\        R\        R\        R\        R\         /# )   stringttLibVersioncheckSumAdjustmentmodifiedcreatedsfntVersionreturn)r   bool)formats   "r   __annotate__r      sN        	
   	r   c                F   V'       d   \         P                  ! RRV 4      p V'       d   \         P                  ! RRV 4      p V'       d   \         P                  ! RRV 4      p V'       d   \         P                  ! RRV 4      p V'       d   \         P                  ! RRV 4      p V # )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                   B   a  ] tR t^t o RtR tR tR tR tR t	Rt
V tR# )	MockFontzUA font-like object that automatically adds any looked up glyphname
to its glyphOrder.c                h   a  R .S n          ! V 3R lR\        4      pV! R ^ /4      S n        RS n        R# )z.notdefc                   .   <a  ] tR t^t o V3R ltRtV tR# ))MockFont.__init__.<locals>.AllocatingDictc                \   < SP                   P                  V4       \        V 4      pW V&   V# r>   )_glyphOrderr   r\   )reverseDictkeyrW   r7   s   && r   __missing__5MockFont.__init__.<locals>.AllocatingDict.__missing__   s.      '',+&#&C 
r    N)r   ro   rp   rq   r   rr   rs   )ru   r7   s   @r   AllocatingDictr      s      r   r   FN)r   dict_reverseGlyphOrderr4   )r7   r   s   f r   r;   MockFont.__init__   s3    %;	T 	 #1)Q"@	r   c                ,    V P                   V,          pV# r>   r   )r7   glyphrW   s   && r   rR   MockFont.getGlyphID   s    %%e,
r   c                    V P                   # r>   r   rd   s   &r   ri   MockFont.getReverseGlyphMap   s    &&&r   c                (    V P                   V,          # r>   r   )r7   rW   s   &&r   r^   MockFont.getGlyphName   s    $$r   c                    V P                   # r>   r   rd   s   &r   re   MockFont.getGlyphOrder   rg   r   )r   r   r4   N)r   ro   rp   rq   __doc__r;   rR   ri   r^   re   rr   rs   rt   s   @r   r   r      s(     '%   r   r   c                   &   a  ] tR t^t o R tRtV tR# )r   c                |    \         P                  ! W4       \        V R 4      '       g   V P                  V n        R# R# )assertRaisesRegexN)	_TestCaser;   r%   assertRaisesRegexpr   )r7   
methodNames   &&r   r;   TestCase.__init__   s3    4, t011%)%<%<D" 2r   )r   N)r   ro   rp   rq   r;   rr   rs   rt   s   @r   r   r      s     = =r   r   c                   >   a  ] tR t^t o R tR tR tR tR tRt	V t
R# )DataFilesHandlerc                "    R V n         ^ V n        R # r>   )tempdirnum_tempfilesrd   s   &r   setUpDataFilesHandler.setUp   s    r   c                n    V P                   '       d#   \        P                  ! V P                   4       R # R # r>   )r   shutilrmtreerd   s   &r   tearDownDataFilesHandler.tearDown   s     <<<MM$,,' r   c                    \         P                  P                  \        P                  V P
                  ,          P                  4      p\         P                  P                  VR V4      # )r   )ospathdirnamesysmodulesro   __file__r   )r7   testfilefolders   && r   getpathDataFilesHandler.getpath   s>    T__!=!F!FGww||FFH55r   c                b    V P                   '       g   \        P                  ! 4       V n         R # R # r>   )r   tempfilemkdtemprd   s   &r   temp_dirDataFilesHandler.temp_dir   s     |||#++-DL r   c                    V P                  4        \        P                  P                  V P                  V4      p\
        P                  ! W4       V# r>   )r   r   r   r   r   r   copy2)r7   	font_path	file_nametemppaths   &&& r   	temp_fontDataFilesHandler.temp_font   s4    77<<i8Y)r   )r   r   N)r   ro   rp   rq   r   r   r   r   r   rr   rs   rt   s   @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-   r/   objectr   r   r   r   r   r   r   r   r   <module>r      s}    % $  	 	  
  * # , .:*, *,Z'V '4
2 v  >=y =x r   