+
    f7i  c                   s   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                s   \        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   s:   "   T F  p\        VR 4      x  K  	  R# 5i)r   Nr   )Z.0Zs   & ?/usr/lib64/python3.14/site-packages/fontTools/misc/testTools.pyZ	<genexpr>ZparseXML.<locals>.<genexpr>"   s     @Z7++Zs   z0expected string or sequence of strings; found %rs   </root>)TestXMLReader_
isinstanceZbytesstrr   r    joinZ	TypeErrorZtype__name__parserZParseroot)
xmlSnippetZreaderxmls   &  r
   parseXMLr      s     F
C*e$$	J	$	$wz7++	J	)	)sxx@Z@@@>:''(
 	
 :C
MMQ;;q>r   c                 s   \        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   Zstripr   r   ZfromXMLhasattrr   )ZfontZ	parseIntor   ZeZ
parsed_xmlnameattrsZcontents   &&&     r
   parseXmlIntor   -   sv    %j&6&6&89T9AsAS!!9JT *W$w5 !+y,--""$ Us
   BBc                   sl   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                s    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_Z	enumeratereverseGlyphOrderDict_lazytablesr   cfg)selfZglyphsZiZg   &&  r
   __init__ZFakeFont.__init__7   sG    !8A&8I&J8Iqt8I&J#	8 'Ks   A
c                s    WP                   9   # Nr   r    tag   &&r
   __contains__ZFakeFont.__contains__>   s    kk!!r   c                (    V P                   V,          # r#   r$   r%   r'   r
   __getitem__ZFakeFont.__getitem__A   s    {{3r   c                s"    W P                   V&   R # r#   r$   )r    r&   Ztable   &&&r
   __setitem__ZFakeFont.__setitem__D   s     Cr   Nc                s8    V P                   P                  W4      # r#   )r   get)r    r&   Zdefaultr+   r
   r-   ZFakeFont.getG   s    {{s,,r   c                r)   r#   r   r    r   r'   r
   
getGlyphIDZ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#   )r0   r    Zlstgid   && r
   getGlyphIDManyZFakeFont.getGlyphIDManyM   s!    034$444   !c                sn    V\        V P                  4      8  d   V P                  V,          # R V,          # )z	glyph%.5d)lenr   )r    ZglyphIDr'   r
   getGlyphNameZFakeFont.getGlyphNameP   s1    S))**##G,,((r   c                r1   r#   )r8   r2   r4   r
   getGlyphNameManyZFakeFont.getGlyphNameManyV   s#    256#3!!#&#666r6   c                    V P                   # r#   )r   r       &r
   getGlyphOrderZFakeFont.getGlyphOrderY       r   c                r:   r#   r.   r;   r<   r
   getReverseGlyphMapZFakeFont.getReverseGlyphMap\   s    ***r   c                s4    \        V P                  4       4      # r#   )Zsortedr=   r;   r<   r
   getGlyphNamesZFakeFont.getGlyphNames_   s    d((*++r   )r   r   r   r   r   r#   )r   
__module____qualname____firstlineno__r"   r(   r*   r,   r-   r0   r5   r8   r9   r=   r?   r@   __static_attributes____classdictcell____classdict__   @r
   r   r   6   sF     " !-15)7 +, ,r   r   c                   s8   a  ] tR t^ct o R tR tR tR tRtV t	R# )r   c                s    ^ 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# )i    )ParserCreateN)Zxml.parsers.expatrI   r   startElement_ZStartElementHandlerendElement_ZEndElementHandleraddCharacterData_ZCharacterDataHandlerr   stack)r    rI   r	   r
   r"   ZTestXMLReader_.__init__d   sR    2"n*.*<*<'(,(8(8%+/+A+A(	
r   c                s    W. 3pV P                   '       d+   V P                   R,          ^,          P                  V4       MW0n        V P                   P                  V4       R# i   Ni)rM   appendr   )r    r   r   Zelement   &&& r
   rJ   ZTestXMLReader_.startElement_n   sG    #:::JJrN1$$W-I

'"r   c                s:    V P                   P                  4        R # r#   )rM   Zpopr/   r'   r
   rK   ZTestXMLReader_.endElement_v   s    

r   c                sX    V P                   R,          ^,          P                  V4       R# rN   )rM   rO   )r    datar'   r
   rL   Z TestXMLReader_.addCharacterData_y   s    

2q  &r   )r   r   rM   N)
r   rA   rB   rC   r"   rJ   rK   rL   rD   rE   rF   rH   r
   r   r   c   s     #' 'r   r   c                 s    \        \        4       V R 7      pVP                  P                  ^ 4       VP                  P	                  4        V# ))
newlinestr)r   r   fileZseekZtruncate)rR   writerr	   r
   makeXMLWriterrU   }   s7    wyZ8F
KKQ
KKMr   c                s    \        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   
)rU   rS   ZgetvalueZdecodeZendswithZ
splitlines)ZfuncZttFontrT   r   r!   r
   getXMLrW      sR    
 _F
++


 
'
'
0C<<>>r   c                sl    V ^8  d   QhR\         R\        R\        R\        R\        R\        R\         /# )i   stringttLibVersioncheckSumAdjustmentmodifiedcreatedsfntVersionZreturn)r   Zbool)Zformats   "r
   __annotate__r^      sN        	
   	r   c                sF   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 z sfntVersion="[^"]+"z#<checkSumAdjustment value="[^"]+"/>z<modified value="[^"]+"/>z<created value="[^"]+"/>)reZsub)rX   rY   rZ   r[   r\   r]   s   &&&&&&r
   stripVariableItemsFromTTXr`      sw     /V<.F;=r6J3R@2B?Mr   c                   sB   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                sh   a  R .S n          ! V 3R lR\        4      pV! R ^ /4      S n        RS n        R# )z.notdefc                   s.   <a  ] tR t^t o V3R ltRtV tR# ))MockFont.__init__.<locals>.AllocatingDictc                s\   < SP                   P                  V4       \        V 4      pW V&   V# r#   )_glyphOrderrO   r7   )ZreverseDictZkeyr3   r    s   && r
   __missing__Z5MockFont.__init__.<locals>.AllocatingDict.__missing__   s.      '',+&#&C 
r    N)r   rA   rB   rC   rd   rD   rE   )rG   r    s   @r
   AllocatingDictrb      s      r   rf   FN)rc   Zdict_reverseGlyphOrderr   )r    rf   s   f r
   r"   ZMockFont.__init__   s3    %;	T 	 #1)Q"@	r   c                s,    V P                   V,          pV# r#   rg   )r    Zglyphr3   r4   r
   r0   ZMockFont.getGlyphID   s    %%e,
r   c                r:   r#   rh   r;   r<   r
   r?   ZMockFont.getReverseGlyphMap   s    &&&r   c                r)   r#   rc   )r    r3   r'   r
   r8   ZMockFont.getGlyphName   s    $$r   c                r:   r#   ri   r;   r<   r
   r=   ZMockFont.getGlyphOrder   r>   r   )rc   rg   r   N)r   rA   rB   rC   __doc__r"   r0   r?   r8   r=   rD   rE   rF   rH   r
   ra   ra      s(     '%   r   ra   c                   s&   a  ] tR t^t o R tRtV tR# )r   c                s|    \         P                  ! W4       \        V R 4      '       g   V P                  V n        R# R# )assertRaisesRegexN)	_TestCaser"   r   ZassertRaisesRegexprk   )r    Z
methodNamer'   r
   r"   ZTestCase.__init__   s3    4, t011%)%<%<D" 2r   )rk   N)r   rA   rB   rC   r"   rD   rE   rF   rH   r
   r   r      s     = =r   r   c                   s>   a  ] tR t^t o R tR tR tR tR tRt	V t
R# )DataFilesHandlerc                s"    R V n         ^ V n        R # r#   )tempdirnum_tempfilesr;   r<   r
   setUpZDataFilesHandler.setUp   s    r   c                sn    V P                   '       d#   \        P                  ! V P                   4       R # R # r#   )rn   shutilZrmtreer;   r<   r
   tearDownZDataFilesHandler.tearDown   s     <<<MM$,,' r   c                s    \         P                  P                  \        P                  V P
                  ,          P                  4      p\         P                  P                  VR V4      # )rQ   )ospathZdirnamesysZmodulesrA   Z__file__r   )r    ZtestfileZfolderr4   r
   getpathZDataFilesHandler.getpath   s>    T__!=!F!FGww||FFH55r   c                sb    V P                   '       g   \        P                  ! 4       V n         R # R # r#   )rn   tempfileZmkdtempr;   r<   r
   temp_dirZDataFilesHandler.temp_dir   s     |||#++-DL r   c                s    V P                  4        \        P                  P                  V P                  V4      p\
        P                  ! W4       V# r#   )rx   rs   rt   r   rn   rq   Zcopy2)r    Z	font_pathZ	file_nameZtemppathrP   r
   	temp_fontZDataFilesHandler.temp_font   s4    77<<i8Y)r   )ro   rn   N)r   rA   rB   rC   rp   rr   rv   rx   ry   rD   rE   rF   rH   r
   rm   rm      s#     (6. r   rm   )rV   r#   )TTTTF)rj   Zcollections.abcr    Zior   rs   r_   rq   ru   rw   Zunittestr   rl   ZfontTools.configr   ZfontTools.misc.textToolsr   ZfontTools.misc.xmlWriterr   r   r   r   Zobjectr   rU   rW   r`   ra   rm   re   r   r
   <module>rz      s}    % $  	 	  
  * # , .:*, *,Z'V '4
2 v  >=y =x r   