)EjuPdZddlmZddlmZddlZddlZddlZddlZddl Z ddl m Z ddl mZddlmZddlmZd Zd ZGd d ZGd deZd"dZd#dZ d$dededededededefdZGddeZGdde Z Gd d!e ZdS)%zHelpers for writing unit tests.)Iterable)BytesION)TestCase)Configtobytes) XMLWriterct}d}t|tr||z }nt|tr|t |dz }n\t|t r#|dd|Dz }n$tdt|j z|dz }|j |d|j dS) aAParses 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. sutf-8c36K|]}t|dVdS)r Nr).0ss JC:\PYTHON\MyICR_Suite\python\Lib\site-packages\fontTools/misc/testTools.py zparseXML.."s,@@7++@@@@@@r z0expected string or sequence of strings; found %rs) TestXMLReader_ isinstancebytesstrrrjoin TypeErrortype__name__parserParseroot) xmlSnippetreaderxmls rparseXMLr"s  F C*e$$   z J $ $  wz7+++ J ) )  sxx@@Z@@@@@@ >:' (   :C MQ ;q>r cdt|D}|D]\}}}|||||t|dr||S)Nc<g|]}t|t|S)rr)res r z parseXmlInto...s'TTTAsASAST!TTTr populateDefaults)r"stripfromXMLhasattrr()font parseIntor parsed_xmlnameattrscontents r parseXmlIntor2-sTTXj&6&6&8&899TTTJ *66eW$w5555y,--%""$$$ r cXeZdZdZdZdZdZddZdZdZ d Z d Z d Z d Z d ZdS)FakeFontc||_dt|D|_d|_i|_t |_dS)Nci|]\}}|| Sr%r%)rigs r z%FakeFont.__init__..9s&J&J&J1q!&J&J&Jr F) glyphOrder_ enumeratereverseGlyphOrderDict_lazytablesrcfg)selfglyphss r__init__zFakeFont.__init__7sE!&J&J &8I8I&J&J&J#  88r c||jvSNr>r@tags r __contains__zFakeFont.__contains__>sdk!!r c|j|SrDrErFs r __getitem__zFakeFont.__getitem__As{3r c||j|<dSrDrE)r@rGtables r __setitem__zFakeFont.__setitem__Ds  Cr Nc8|j||SrD)r>get)r@rGdefaults rrOz FakeFont.getGs{sG,,,r c|j|SrDr<r@r/s r getGlyphIDzFakeFont.getGlyphIDJs*400r c fd|DS)Nc:g|]}|Sr%)rTrgidr@s rr'z+FakeFont.getGlyphIDMany..Ns%444$$444r r%r@lsts` rgetGlyphIDManyzFakeFont.getGlyphIDManyMs44444444r cV|t|jkr |j|Sd|zS)Nz glyph%.5d)lenr:)r@glyphIDs r getGlyphNamezFakeFont.getGlyphNamePs1 S)** * *#G, ,( (r c fd|DS)Nc:g|]}|Sr%)r_rWs rr'z-FakeFont.getGlyphNameMany..Ws'6663!!#&&666r r%rYs` rgetGlyphNameManyzFakeFont.getGlyphNameManyVs6666#6666r c|jSrD)r:r@s r getGlyphOrderzFakeFont.getGlyphOrderY r c|jSrDrRrds rgetReverseGlyphMapzFakeFont.getReverseGlyphMap\s **r cDt|SrD)sortedrerds r getGlyphNameszFakeFont.getGlyphNames_sd((**+++r rD)r __module__ __qualname__rBrHrJrMrOrTr[r_rbrerhrkr%r rr4r46s"""   !!!----111555))) 777   +++,,,,,r r4c&eZdZdZdZdZdZdS)rcddlm}||_|j|j_|j|j_|j|j_d|_ g|_ dS)Nr) ParserCreate) xml.parsers.expatrpr startElement_StartElementHandler endElement_EndElementHandleraddCharacterData_CharacterDataHandlerrstack)r@rps rrBzTestXMLReader_.__init__dsZ222222"lnn *.*< '(,(8 %+/+A (  r c||gf}|jr'|jdd|n||_|j|dSNr)rxappendr)r@r/r0elements rrrzTestXMLReader_.startElement_ns]# : JrN1  $ $W - - - -DI '"""""r c8|jdSrD)rxpoprSs rrtzTestXMLReader_.endElement_vs r cR|jdd|dSrz)rxr|)r@datas rrvz TestXMLReader_.addCharacterData_ys' 2q  &&&&&r N)rrlrmrBrrrtrvr%r rrrcsP###'''''r r ctt|}|jd|j|S)N) newlinestrr)r rfileseektruncate)rwriters r makeXMLWriterr}sG wyyZ 8 8 8F KQ K Mr ct}||||jd}|dsJ|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)rrgetvaluedecodeendswith splitlines)functtFontrr!s rgetXMLrsh __FD +   ' ' 0 0C <<    >>  r TFstring ttLibVersioncheckSumAdjustmentmodifiedcreated sfntVersionreturnc|rtjdd|}|rtjdd|}|rtjdd|}|rtjdd|}|rtjdd|}|S)zJStrip stuff like ttLibVersion, checksums, timestamps, etc. from TTX dumps.z ttLibVersion="[^"]+"z sfntVersion="[^"]+"z#zz)resub)rrrrrrs rstripVariableItemsFromTTXrs=/V<<<.F;;K=r6JJA3R@@@2B?? Mr c0eZdZdZdZdZdZdZdZdS)MockFontzYA font-like object that automatically adds any looked up glyphname to its glyphOrder.ctdg_Gfddt}|ddi_d_dS)Nz.notdefceZdZfdZdS))MockFont.__init__..AllocatingDictcdj|t|}|||<|SrD) _glyphOrderr|r]) reverseDictkeyrXr@s r __missing__z5MockFont.__init__..AllocatingDict.__missing__s6 '',,,+&&#& C  r N)rrlrmrrdsrAllocatingDictrs.       r rrF)rdict_reverseGlyphOrderr=)r@rs` rrBzMockFont.__init__sd%;       T   #1.)Q"@"@ r c |j|}|SrDr)r@glyphrXs rrTzMockFont.getGlyphIDs%e, r c|jSrDrrds rrhzMockFont.getReverseGlyphMaps &&r c|j|SrDr)r@rXs rr_zMockFont.getGlyphNames$$r c|jSrDrrds rrezMockFont.getGlyphOrderrfr N) rrlrm__doc__rBrTrhr_rer%r rrrsi   '''%%%     r rceZdZdZdS)rcltj||t|ds|j|_dSdS)NassertRaisesRegex) _TestCaserBr+assertRaisesRegexpr)r@ methodNames rrBzTestCase.__init__sE4,,,t011 =%)%rs1%%$$$$$$ ******######,,,,,,......:*,*,*,*,*,*,*,*,Z'''''V'''4    #        2     v   >=====y===xr