§
    ¢”jŒ  ã                   ó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     úg/var/www/finuniver-perm.ru/html/portfolio/venv/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 ]\  }}}|                     |||| ¦  «         Œt          |d¦  «        r|                     ¦   «          |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   ÚpopulateDefaults)r"   ÚstripÚfromXMLÚhasattrr(   )ÚfontÚ	parseIntor   Ú
parsed_xmlÚnameÚattrsÚcontents          r   ÚparseXmlIntor2   -   s‡   € ØTÐT�X j×&6Ò&6Ñ&8Ô&8Ñ9Ô9ÐTÑTÔT€JØ *ð 6ð 6Ñˆˆe�WØ×Ò˜$  w°Ñ5Ô5Ð5Ð5ÝˆyÐ,Ñ-Ô-ð %Ø×"Ò"Ñ$Ô$Ð$ØÐ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>9   s   € Ð&JÐ&JÐ&J±°°1 q¨!Ð&JÐ&JÐ&Jr   F)ÚglyphOrder_Ú	enumerateÚreverseGlyphOrderDict_ÚlazyÚtablesr   Úcfg)ÚselfÚglyphss     r   Ú__init__zFakeFont.__init__7   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 rD   rE   rF   s     r   Ú__getitem__zFakeFont.__getitem__A   s   € ØŒ{˜3ÔÐr   c                 ó   — || j         |<   d S rD   rE   )r@   rG   Útables      r   Ú__setitem__zFakeFont.__setitem__D   s   € Ø ˆŒ�CÑÐÐr   Nc                 ó8   — | j                              ||¦  «        S rD   )r>   Úget)r@   rG   Údefaults      r   rO   zFakeFont.getG   s   € ØŒ{�Š˜s GÑ,Ô,Ð,r   c                 ó   — | j         |         S rD   ©r<   ©r@   r/   s     r   Ú
getGlyphIDzFakeFont.getGlyphIDJ   s   € ØÔ*¨4Ô0Ð0r   c                 ó    ‡ — ˆ fd„|D ¦   «         S )Nc                 ó:   •— g | ]}‰                      |¦  «        ‘ŒS r%   )rT   ©r   Úgidr@   s     €r   r'   z+FakeFont.getGlyphIDMany.<locals>.<listcomp>N   s%   ø€ Ð4Ð4Ð4¨�—’ Ñ$Ô$Ð4Ð4Ð4r   r%   ©r@   Úlsts   ` r   ÚgetGlyphIDManyzFakeFont.getGlyphIDManyM   s   ø€ Ø4Ð4Ð4Ð4°Ð4Ñ4Ô4Ð4r   c                 óV   — |t          | j        ¦  «        k     r| j        |         S d|z  S )Nz	glyph%.5d)Úlenr:   )r@   ÚglyphIDs     r   ÚgetGlyphNamezFakeFont.getGlyphNameP   s1   € Ø•S˜Ô)Ñ*Ô*Ò*Ð*ØÔ# GÔ,Ð,à Ñ(Ð(r   c                 ó    ‡ — ˆ fd„|D ¦   «         S )Nc                 ó:   •— g | ]}‰                      |¦  «        ‘ŒS r%   )r_   rW   s     €r   r'   z-FakeFont.getGlyphNameMany.<locals>.<listcomp>W   s'   ø€ Ð6Ð6Ð6¨3�×!Ò! #Ñ&Ô&Ð6Ð6Ð6r   r%   rY   s   ` r   ÚgetGlyphNameManyzFakeFont.getGlyphNameManyV   s   ø€ Ø6Ð6Ð6Ð6°#Ð6Ñ6Ô6Ð6r   c                 ó   — | j         S rD   )r:   ©r@   s    r   ÚgetGlyphOrderzFakeFont.getGlyphOrderY   ó   € ØÔÐr   c                 ó   — | j         S rD   rR   rd   s    r   ÚgetReverseGlyphMapzFakeFont.getReverseGlyphMap\   s   € ØÔ*Ð*r   c                 óD   — t          |                      ¦   «         ¦  «        S rD   )Úsortedre   rd   s    r   ÚgetGlyphNameszFakeFont.getGlyphNames_   s   € Ý�d×(Ò(Ñ*Ô*Ñ+Ô+Ð+r   rD   )r   Ú
__module__Ú__qualname__rB   rH   rJ   rM   rO   rT   r[   r_   rb   re   rh   rk   r%   r   r   r4   r4   6   sÍ   € € € € € ðð ð ð"ð "ð "ð ð  ð  ð!ð !ð !ð-ð -ð -ð -ð1ð 1ð 1ð5ð 5ð 5ð)ð )ð )ð7ð 7ð 7ð ð  ð  ð+ð +ð +ð,ð ,ð ,ð ,ð ,r   r4   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.expatrp   r   ÚstartElement_ÚStartElementHandlerÚendElement_ÚEndElementHandlerÚaddCharacterData_ÚCharacterDataHandlerr   Ústack)r@   rp   s     r   rB   zTestXMLReader_.__init__d   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   )rx   Úappendr   )r@   r/   r0   Úelements       r   rr   zTestXMLReader_.startElement_n   s]   € Ø˜ Ð#ˆØŒ:ð 	 ØŒJ�rŒN˜1Ô×$Ò$ WÑ-Ô-Ð-Ð-àˆDŒIØŒ
×Ò˜'Ñ"Ô"Ð"Ð"Ð"r   c                 ó8   — | j                              ¦   «          d S rD   )rx   ÚpoprS   s     r   rt   zTestXMLReader_.endElement_v   s   € ØŒ
�ŠÑÔÐÐÐr   c                 óR   — | j         d         d                              |¦  «         d S rz   )rx   r|   )r@   Údatas     r   rv   z TestXMLReader_.addCharacterData_y   s'   € ØŒ
�2Œ�qÔ× Ò  Ñ&Ô&Ð&Ð&Ð&r   N)r   rl   rm   rB   rr   rt   rv   r%   r   r   r   r   c   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 rD   )Ú_glyphOrderr|   r]   )ÚreverseDictÚkeyrX   r@   s      €r   Ú__missing__z5MockFont.__init__.<locals>.AllocatingDict.__missing__´   s6   ø€ ØÔ ×'Ò'¨Ñ,Ô,Ð,Ý˜+Ñ&Ô&�Ø#&�˜CÑ Ø�
r   N)r   rl   rm   r§   rd   s   €r   ÚAllocatingDictr¢   ³   s.   ø€ € € € € ðð ð ð ð ð ð r   r¨   r   F)r¤   ÚdictÚ_reverseGlyphOrderr=   )r@   r¨   s   ` r   rB   zMockFont.__init__°   sd   ø€ Ø%˜;ˆÔð	ð 	ð 	ð 	ð 	ð 	ð 	�Tñ 	ô 	ð 	ð #1 .°)¸Q°Ñ"@Ô"@ˆÔØˆŒ	ˆ	ˆ	r   c                 ó    — | j         |         }|S rD   ©rª   )r@   ÚglyphrX   s      r   rT   zMockFont.getGlyphID½   s   € ØÔ% eÔ,ˆØˆ
r   c                 ó   — | j         S rD   r¬   rd   s    r   rh   zMockFont.getReverseGlyphMapÁ   s   € ØÔ&Ð&r   c                 ó   — | j         |         S rD   ©r¤   )r@   rX   s     r   r_   zMockFont.getGlyphNameÄ   s   € ØÔ Ô$Ð$r   c                 ó   — | j         S rD   r°   rd   s    r   re   zMockFont.getGlyphOrderÇ   rf   r   N)	r   rl   rm   Ú__doc__rB   rT   rh   r_   re   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)Ú	_TestCaserB   r+   ÚassertRaisesRegexprµ   )r@   Ú
methodNames     r   rB   zTestCase.__init__Ì   sE   € ÝÔ˜4 Ñ,Ô,Ð,õ �tÐ0Ñ1Ô1ð 	=Ø%)Ô%<ˆDÔ"Ð"Ð"ð	=ð 	=r   N)r   rl   rm   rB   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_tempfilesrd   s    r   ÚsetUpzDataFilesHandler.setUpÕ   s   € ØˆŒØˆÔÐÐr   c                 óJ   — | j         rt          j        | j         ¦  «         d S d S rD   )r¼   ÚshutilÚrmtreerd   s    r   ÚtearDownzDataFilesHandler.tearDownÙ   s.   € ØŒ<ð 	(ÝŒM˜$œ,Ñ'Ô'Ð'Ð'Ð'ð	(ð 	(r   c                 ó¶   — t           j                             t          j        | j                 j        ¦  «        }t           j                             |d|¦  «        S )Nr�   )ÚosÚpathÚdirnameÚsysÚmodulesrl   Ú__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 rD   )r¼   ÚtempfileÚmkdtemprd   s    r   Útemp_dirzDataFilesHandler.temp_dirá   s*   € ØŒ|ð 	.Ý#Ô+Ñ-Ô-ˆDŒLˆLˆLð	.ð 	.r   c                 ó¢   — |                       ¦   «          t          j                             | j        |¦  «        }t          j        ||¦  «         |S rD   )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   rl   rm   r¾   rÂ   rÌ   rÐ   rÖ   r%   r   r   rº   rº   Ô   s_   € € € € € ðð ð ð(ð (ð (ð6ð 6ð 6ð.ð .ð .ðð ð ð ð r   rº   )r‚   rD   )TTTTF)r²   Úcollections.abcr   Úior   rÄ   r›   rÀ   rÇ   rÎ   Úunittestr   r¶   ÚfontTools.configr   ÚfontTools.misc.textToolsr   ÚfontTools.misc.xmlWriterr	   r"   r2   r4   Úobjectr   r‰   r‘   r   Úboolr�   rŸ   rº   r%   r   r   ú<module>rß      s1  ðØ %Ð %à $Ð $Ð $Ð $Ð $Ð $Ø Ð Ð Ð Ð Ð Ø 	€	€	€	Ø 	€	€	€	Ø €€€Ø 
€
€
€
Ø €€€Ø *Ð *Ð *Ð *Ð *Ð *Ø #Ð #Ð #Ð #Ð #Ð #Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø .Ð .Ð .Ð .Ð .Ð .ðð ð ð:ð ð ð*,ð *,ð *,ð *,ð *,ñ *,ô *,ð *,ðZ'ð 'ð 'ð 'ð '�Vñ 'ô 'ð 'ð4ð ð ð ð
ð 
ð 
ð 
ð Ø#ØØØðð Øðàðð ðð ð	ð
 ðð ðð 	ðð ð ð ð2 ð  ð  ð  ð  ˆvñ  ô  ð  ð>=ð =ð =ð =ð =ˆyñ =ô =ð =ðð ð ð ð �xñ ô ð ð ð r   