§
    ‚ÛgY  ã                   óP  — 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dS )%zHelpers for writing unit tests.é    )ÚIterable)ÚBytesION)ÚTestCase)ÚConfig©Útobytes)Ú	XMLWriterc                 ó¼  — t          ¦   «         }d}t          | t          ¦  «        r|| z  }n…t          | 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     úN/granary/edev/quantum/lib/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>é   é   )ÚTestXMLReader_Ú
isinstanceÚbytesÚstrr   r   ÚjoinÚ	TypeErrorÚtypeÚ__name__ÚparserÚParseÚroot)Ú
xmlSnippetÚreaderÚxmls      r   ÚparseXMLr"      së   € õ ÑÔ€FØ
€CÝ�*�eÑ$Ô$ð 

ØˆzÑˆˆÝ	�J¥Ñ	$Ô	$ð 
Ø�w�z 7Ñ+Ô+Ñ+ˆˆÝ	�J¥Ñ	)Ô	)ð 
Øˆs�xŠxÐ@Ð@°ZÐ@Ñ@Ô@Ñ@Ô@Ñ@ˆˆåØ>Ý�:ÑÔÔ'ñ(ñ
ô 
ð 	
ð ˆ:Ñ€CØ
„M×Ò˜˜QÑÔÐØŒ;�qŒ>Ðr   c                 óÆ   — d„ t          |                     ¦   «         ¦  «        D ¦   «         }|D ]\  }}}|                     |||| ¦  «         Œ|                     ¦   «          |S )Nc                 ó<   — g | ]}t          |t          ¦  «        °|‘ŒS © )r   r   )r   Úes     r   ú
<listcomp>z parseXmlInto.<locals>.<listcomp>.   s'   € ÐTÐTÐT˜ÅÈAÍsÑASÔASÐT�!ÐTÐTÐTr   )r"   ÚstripÚfromXMLÚpopulateDefaults)ÚfontÚ	parseIntor   Ú
parsed_xmlÚnameÚattrsÚcontents          r   ÚparseXmlIntor1   -   st   € ØTÐT�X j×&6Ò&6Ñ&8Ô&8Ñ9Ô9ÐTÑTÔT€JØ *ð 6ð 6Ñˆˆe�WØ×Ò˜$  w°Ñ5Ô5Ð5Ð5Ø×ÒÑ Ô Ð ØÐr   c                   óX   — 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dS )ÚFakeFontc                 ó’   — || _         d„ t          |¦  «        D ¦   «         | _        d| _        i | _        t          ¦   «         | _        d S )Nc                 ó   — i | ]\  }}||“Œ	S r%   r%   )r   ÚiÚgs      r   ú
<dictcomp>z%FakeFont.__init__.<locals>.<dictcomp>8   s   € Ð&JÐ&JÐ&J±°°1 q¨!Ð&JÐ&JÐ&Jr   F)ÚglyphOrder_Ú	enumerateÚreverseGlyphOrderDict_ÚlazyÚtablesr   Úcfg)ÚselfÚglyphss     r   Ú__init__zFakeFont.__init__6   sE   € Ø!ˆÔØ&JÐ&J½	À&Ñ8IÔ8IÐ&JÑ&JÔ&JˆÔ#ØˆŒ	ØˆŒÝ‘8”8ˆŒˆˆr   c                 ó   — || j         v S ©N©r=   ©r?   Útags     r   Ú__contains__zFakeFont.__contains__=   s   € Ø�d”kÐ!Ð!r   c                 ó   — | j         |         S rC   rD   rE   s     r   Ú__getitem__zFakeFont.__getitem__@   s   € ØŒ{˜3ÔÐr   c                 ó   — || j         |<   d S rC   rD   )r?   rF   Útables      r   Ú__setitem__zFakeFont.__setitem__C   s   € Ø ˆŒ�CÑÐÐr   Nc                 ó8   — | j                              ||¦  «        S rC   )r=   Úget)r?   rF   Údefaults      r   rN   zFakeFont.getF   s   € ØŒ{�Š˜s GÑ,Ô,Ð,r   c                 ó   — | j         |         S rC   ©r;   ©r?   r.   s     r   Ú
getGlyphIDzFakeFont.getGlyphIDI   s   € ØÔ*¨4Ô0Ð0r   c                 ó    ‡ — ˆ fd„|D ¦   «         S )Nc                 ó:   •— g | ]}‰                      |¦  «        ‘ŒS r%   )rS   ©r   Úgidr?   s     €r   r'   z+FakeFont.getGlyphIDMany.<locals>.<listcomp>M   s%   ø€ Ð4Ð4Ð4¨�—’ Ñ$Ô$Ð4Ð4Ð4r   r%   ©r?   Úlsts   ` r   ÚgetGlyphIDManyzFakeFont.getGlyphIDManyL   s   ø€ Ø4Ð4Ð4Ð4°Ð4Ñ4Ô4Ð4r   c                 óV   — |t          | j        ¦  «        k     r| j        |         S d|z  S )Nz	glyph%.5d)Úlenr9   )r?   ÚglyphIDs     r   ÚgetGlyphNamezFakeFont.getGlyphNameO   s1   € Ø•S˜Ô)Ñ*Ô*Ò*Ð*ØÔ# GÔ,Ð,à Ñ(Ð(r   c                 ó    ‡ — ˆ fd„|D ¦   «         S )Nc                 ó:   •— g | ]}‰                      |¦  «        ‘ŒS r%   )r^   rV   s     €r   r'   z-FakeFont.getGlyphNameMany.<locals>.<listcomp>V   s'   ø€ Ð6Ð6Ð6¨3�×!Ò! #Ñ&Ô&Ð6Ð6Ð6r   r%   rX   s   ` r   ÚgetGlyphNameManyzFakeFont.getGlyphNameManyU   s   ø€ Ø6Ð6Ð6Ð6°#Ð6Ñ6Ô6Ð6r   c                 ó   — | j         S rC   )r9   ©r?   s    r   ÚgetGlyphOrderzFakeFont.getGlyphOrderX   ó   € ØÔÐr   c                 ó   — | j         S rC   rQ   rc   s    r   ÚgetReverseGlyphMapzFakeFont.getReverseGlyphMap[   s   € ØÔ*Ð*r   c                 óD   — t          |                      ¦   «         ¦  «        S rC   )Úsortedrd   rc   s    r   ÚgetGlyphNameszFakeFont.getGlyphNames^   s   € Ý�d×(Ò(Ñ*Ô*Ñ+Ô+Ð+r   rC   )r   Ú
__module__Ú__qualname__rA   rG   rI   rL   rN   rS   rZ   r^   ra   rd   rg   rj   r%   r   r   r3   r3   5   sÍ   € € € € € ðð ð ð"ð "ð "ð ð  ð  ð!ð !ð !ð-ð -ð -ð -ð1ð 1ð 1ð5ð 5ð 5ð)ð )ð )ð7ð 7ð 7ð ð  ð  ð+ð +ð +ð,ð ,ð ,ð ,ð ,r   r3   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.expatro   r   ÚstartElement_ÚStartElementHandlerÚendElement_ÚEndElementHandlerÚaddCharacterData_ÚCharacterDataHandlerr   Ústack)r?   ro   s     r   rA   zTestXMLReader_.__init__c   sZ   € Ø2Ð2Ð2Ð2Ð2Ð2à"�l‘n”nˆŒØ*.Ô*<ˆŒÔ'Ø(,Ô(8ˆŒÔ%Ø+/Ô+AˆŒÔ(ØˆŒ	ØˆŒ
ˆ
ˆ
r   c                 ó®   — ||g f}| j         r'| j         d         d                              |¦  «         n|| _        | j                              |¦  «         d S ©Néÿÿÿÿr   )rw   Úappendr   )r?   r.   r/   Úelements       r   rq   zTestXMLReader_.startElement_m   s]   € Ø˜ Ð#ˆØŒ:ð 	 ØŒJ�rŒN˜1Ô×$Ò$ WÑ-Ô-Ð-Ð-àˆDŒIØŒ
×Ò˜'Ñ"Ô"Ð"Ð"Ð"r   c                 ó8   — | j                              ¦   «          d S rC   )rw   ÚpoprR   s     r   rs   zTestXMLReader_.endElement_u   s   € ØŒ
�ŠÑÔÐÐÐr   c                 óR   — | j         d         d                              |¦  «         d S ry   )rw   r{   )r?   Údatas     r   ru   z TestXMLReader_.addCharacterData_x   s'   € ØŒ
�2Œ�qÔ× Ò  Ñ&Ô&Ð&Ð&Ð&r   N)r   rk   rl   rA   rq   rs   ru   r%   r   r   r   r   b   sP   € € € € € ðð ð ð#ð #ð #ðð ð ð'ð 'ð 'ð 'ð 'r   r   ú
c                 ó¦   — t          t          ¦   «         | ¬¦  «        }|j                             d¦  «         |j                             ¦   «          |S )N)Ú
newlinestrr   )r	   r   ÚfileÚseekÚtruncate)rƒ   Úwriters     r   ÚmakeXMLWriterrˆ   |   sG   € å•w‘y”y¨ZÐ8Ñ8Ô8€Fà
„K×Ò�QÑÔÐØ
„K×ÒÑÔÐØ€Mr   c                 óä   — t          ¦   «         } | ||¦  «         |j                             ¦   «                              d¦  «        }|                     d¦  «        sJ ‚|                     ¦   «         S )zºCall 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ˆ   r„   ÚgetvalueÚdecodeÚendswithÚ
splitlines)ÚfuncÚttFontr‡   r!   s       r   ÚgetXMLr�   …   sh   € õ
 ‰_Œ_€FØ€Dˆ�ÑÔÐØ
Œ+×
Ò
Ñ
 Ô
 ×
'Ò
'¨Ñ
0Ô
0€Cà�<Š<˜ÑÔÐÐÐØ�>Š>ÑÔÐr   TFÚ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œ   ’   s˜   € ð ð =Ý”Ð/°°VÑ<Ô<ˆàð <Ý”Ð.°°FÑ;Ô;ˆàð KÝ”Ð=¸rÀ6ÑJÔJˆØð AÝ”Ð3°R¸Ñ@Ô@ˆØð @Ý”Ð2°B¸Ñ?Ô?ˆØ€Mr   c                   ó0   — e Zd ZdZd„ Z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 rC   )Ú_glyphOrderr{   r\   )ÚreverseDictÚkeyrW   r?   s      €r   Ú__missing__z5MockFont.__init__.<locals>.AllocatingDict.__missing__³   s6   ø€ ØÔ ×'Ò'¨Ñ,Ô,Ð,Ý˜+Ñ&Ô&�Ø#&�˜CÑ Ø�
r   N)r   rk   rl   r¦   rc   s   €r   ÚAllocatingDictr¡   ²   s.   ø€ € € € € ðð ð ð ð ð ð r   r§   r   F)r£   ÚdictÚ_reverseGlyphOrderr<   )r?   r§   s   ` r   rA   zMockFont.__init__¯   sd   ø€ Ø%˜;ˆÔð	ð 	ð 	ð 	ð 	ð 	ð 	�Tñ 	ô 	ð 	ð #1 .°)¸Q°Ñ"@Ô"@ˆÔØˆŒ	ˆ	ˆ	r   c                 ó    — | j         |         }|S rC   ©r©   )r?   ÚglyphrW   s      r   rS   zMockFont.getGlyphID¼   s   € ØÔ% eÔ,ˆØˆ
r   c                 ó   — | j         S rC   r«   rc   s    r   rg   zMockFont.getReverseGlyphMapÀ   s   € ØÔ&Ð&r   c                 ó   — | j         |         S rC   ©r£   )r?   rW   s     r   r^   zMockFont.getGlyphNameÃ   s   € ØÔ Ô$Ð$r   c                 ó   — | j         S rC   r¯   rc   s    r   rd   zMockFont.getGlyphOrderÆ   re   r   N)	r   rk   rl   Ú__doc__rA   rS   rg   r^   rd   r%   r   r   rž   rž   «   si   € € € € € ðð ðð ð ðð ð ð'ð 'ð 'ð%ð %ð %ð ð  ð  ð  ð  r   rž   c                   ó   — e Zd Zd„ ZdS )r   c                 ól   — t          j        | |¦  «         t          | d¦  «        s| j        | _        d S d S )NÚassertRaisesRegex)Ú	_TestCaserA   ÚhasattrÚassertRaisesRegexpr´   )r?   Ú
methodNames     r   rA   zTestCase.__init__Ë   sE   € ÝÔ˜4 Ñ,Ô,Ð,õ �tÐ0Ñ1Ô1ð 	=Ø%)Ô%<ˆDÔ"Ð"Ð"ð	=ð 	=r   N)r   rk   rl   rA   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_tempfilesrc   s    r   ÚsetUpzDataFilesHandler.setUpÔ   s   € ØˆŒØˆÔÐÐr   c                 óJ   — | j         rt          j        | j         ¦  «         d S d S rC   )r¼   ÚshutilÚrmtreerc   s    r   ÚtearDownzDataFilesHandler.tearDownØ   s.   € ØŒ<ð 	(ÝŒM˜$œ,Ñ'Ô'Ð'Ð'Ð'ð	(ð 	(r   c                 ó¶   — t           j                             t          j        | j                 j        ¦  «        }t           j                             |d|¦  «        S )Nr€   )ÚosÚpathÚdirnameÚsysÚmodulesrk   Ú__file__r   )r?   ÚtestfileÚfolders      r   ÚgetpathzDataFilesHandler.getpathÜ   s9   € Ý”—’¥¤¨T¬_Ô!=Ô!FÑGÔGˆÝŒw�|Š|˜F F¨HÑ5Ô5Ð5r   c                 óH   — | j         st          j        ¦   «         | _         d S d S rC   )r¼   ÚtempfileÚmkdtemprc   s    r   Útemp_dirzDataFilesHandler.temp_dirà   s*   € ØŒ|ð 	.Ý#Ô+Ñ-Ô-ˆDŒLˆLˆLð	.ð 	.r   c                 ó¢   — |                       ¦   «          t          j                             | j        |¦  «        }t          j        ||¦  «         |S rC   )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   rk   rl   r¾   rÂ   rÌ   rÐ   rÖ   r%   r   r   rº   rº   Ó   s_   € € € € € ðð ð ð(ð (ð (ð6ð 6ð 6ð.ð .ð .ðð ð ð ð r   rº   )r�   rC   )TTTTF)r±   Úcollections.abcr   Úior   rÄ   rš   rÀ   rÇ   rÎ   Úunittestr   rµ   ÚfontTools.configr   ÚfontTools.misc.textToolsr   ÚfontTools.misc.xmlWriterr	   r"   r1   r3   Úobjectr   rˆ   r�   r   Úboolrœ   rž   rº   r%   r   r   ú<module>rß      s1  ðØ %Ð %à $Ð $Ð $Ð $Ð $Ð $Ø Ð Ð Ð Ð Ð Ø 	€	€	€	Ø 	€	€	€	Ø €€€Ø 
€
€
€
Ø €€€Ø *Ð *Ð *Ð *Ð *Ð *Ø #Ð #Ð #Ð #Ð #Ð #Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø .Ð .Ð .Ð .Ð .Ð .ðð ð ð:ð ð ð*,ð *,ð *,ð *,ð *,ñ *,ô *,ð *,ðZ'ð 'ð 'ð 'ð '�Vñ 'ô 'ð 'ð4ð ð ð ð
ð 
ð 
ð 
ð Ø#ØØØðð Øðàðð ðð ð	ð
 ðð ðð 	ðð ð ð ð2 ð  ð  ð  ð  ˆvñ  ô  ð  ð>=ð =ð =ð =ð =ˆyñ =ô =ð =ðð ð ð ð �xñ ô ð ð ð r   