1from fontTools.otlLib.builder import ( 2 AlternateSubstBuilder, 3 ChainContextPosBuilder, 4 ChainContextSubstBuilder, 5 LigatureSubstBuilder, 6 MultipleSubstBuilder, 7 CursivePosBuilder, 8 MarkBasePosBuilder, 9 MarkLigPosBuilder, 10 MarkMarkPosBuilder, 11 ReverseChainSingleSubstBuilder, 12 SingleSubstBuilder, 13 ClassPairPosSubtableBuilder, 14 PairPosBuilder, 15 SinglePosBuilder, 16 ChainContextualRule, 17) 18from fontTools.otlLib.error import OpenTypeLibError 19from fontTools.ttLib import TTFont 20from fontTools.misc.loggingTools import CapturingLogHandler 21import logging 22import pytest 23 24 25@pytest.fixture 26def ttfont(): 27 glyphs = """ 28 .notdef space slash fraction semicolon period comma ampersand 29 quotedblleft quotedblright quoteleft quoteright 30 zero one two three four five six seven eight nine 31 zero.oldstyle one.oldstyle two.oldstyle three.oldstyle 32 four.oldstyle five.oldstyle six.oldstyle seven.oldstyle 33 eight.oldstyle nine.oldstyle onequarter onehalf threequarters 34 onesuperior twosuperior threesuperior ordfeminine ordmasculine 35 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 36 a b c d e f g h i j k l m n o p q r s t u v w x y z 37 A.sc B.sc C.sc D.sc E.sc F.sc G.sc H.sc I.sc J.sc K.sc L.sc M.sc 38 N.sc O.sc P.sc Q.sc R.sc S.sc T.sc U.sc V.sc W.sc X.sc Y.sc Z.sc 39 A.alt1 A.alt2 A.alt3 B.alt1 B.alt2 B.alt3 C.alt1 C.alt2 C.alt3 40 a.alt1 a.alt2 a.alt3 a.end b.alt c.mid d.alt d.mid 41 e.begin e.mid e.end m.begin n.end s.end z.end 42 Eng Eng.alt1 Eng.alt2 Eng.alt3 43 A.swash B.swash C.swash D.swash E.swash F.swash G.swash H.swash 44 I.swash J.swash K.swash L.swash M.swash N.swash O.swash P.swash 45 Q.swash R.swash S.swash T.swash U.swash V.swash W.swash X.swash 46 Y.swash Z.swash 47 f_l c_h c_k c_s c_t f_f f_f_i f_f_l f_i o_f_f_i s_t f_i.begin 48 a_n_d T_h T_h.swash germandbls ydieresis yacute breve 49 grave acute dieresis macron circumflex cedilla umlaut ogonek caron 50 damma hamza sukun kasratan lam_meem_jeem noon.final noon.initial 51 by feature lookup sub table uni0327 uni0328 e.fina 52 """.split() 53 glyphs.extend("cid{:05d}".format(cid) for cid in range(800, 1001 + 1)) 54 font = TTFont() 55 font.setGlyphOrder(glyphs) 56 return font 57 58 59class MockBuilderLocation(object): 60 def __init__(self, location): 61 self.location = location 62 63 def __str__(self): 64 return "%s:%s" % self.location 65 66 67def test_unsupported_subtable_break_1(ttfont): 68 location = MockBuilderLocation((0, "alpha")) 69 70 logger = logging.getLogger("fontTools.otlLib.builder") 71 72 with CapturingLogHandler(logger, "INFO") as captor: 73 builder = SinglePosBuilder(ttfont, location) 74 builder.add_subtable_break(MockBuilderLocation((5, "beta"))) 75 builder.build() 76 77 captor.assertRegex('5:beta: unsupported "subtable" statement for lookup type') 78 79 80def test_chain_pos_references_GSUB_lookup(ttfont): 81 location = MockBuilderLocation((0, "alpha")) 82 builder = ChainContextPosBuilder(ttfont, location) 83 builder2 = SingleSubstBuilder(ttfont, location) 84 builder.rules.append(ChainContextualRule([], [], [], [[builder2]])) 85 86 with pytest.raises( 87 OpenTypeLibError, 88 match="0:alpha: Missing index of the specified lookup, might be a substitution lookup", 89 ): 90 builder.build() 91