from fontTools.otlLib.builder import ( AlternateSubstBuilder, ChainContextPosBuilder, ChainContextSubstBuilder, LigatureSubstBuilder, MultipleSubstBuilder, CursivePosBuilder, MarkBasePosBuilder, MarkLigPosBuilder, MarkMarkPosBuilder, ReverseChainSingleSubstBuilder, SingleSubstBuilder, ClassPairPosSubtableBuilder, PairPosBuilder, SinglePosBuilder, ChainContextualRule ) from fontTools.otlLib.error import OpenTypeLibError from fontTools.ttLib import TTFont from fontTools.misc.loggingTools import CapturingLogHandler import logging import pytest @pytest.fixture def ttfont(): glyphs = """ .notdef space slash fraction semicolon period comma ampersand quotedblleft quotedblright quoteleft quoteright zero one two three four five six seven eight nine zero.oldstyle one.oldstyle two.oldstyle three.oldstyle four.oldstyle five.oldstyle six.oldstyle seven.oldstyle eight.oldstyle nine.oldstyle onequarter onehalf threequarters onesuperior twosuperior threesuperior ordfeminine ordmasculine 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 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 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 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 A.alt1 A.alt2 A.alt3 B.alt1 B.alt2 B.alt3 C.alt1 C.alt2 C.alt3 a.alt1 a.alt2 a.alt3 a.end b.alt c.mid d.alt d.mid e.begin e.mid e.end m.begin n.end s.end z.end Eng Eng.alt1 Eng.alt2 Eng.alt3 A.swash B.swash C.swash D.swash E.swash F.swash G.swash H.swash I.swash J.swash K.swash L.swash M.swash N.swash O.swash P.swash Q.swash R.swash S.swash T.swash U.swash V.swash W.swash X.swash Y.swash Z.swash 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 a_n_d T_h T_h.swash germandbls ydieresis yacute breve grave acute dieresis macron circumflex cedilla umlaut ogonek caron damma hamza sukun kasratan lam_meem_jeem noon.final noon.initial by feature lookup sub table uni0327 uni0328 e.fina """.split() glyphs.extend("cid{:05d}".format(cid) for cid in range(800, 1001 + 1)) font = TTFont() font.setGlyphOrder(glyphs) return font class MockBuilderLocation(object): def __init__(self, location): self.location = location def __str__(self): return "%s:%s" % self.location def test_unsupported_subtable_break_1(ttfont): location = MockBuilderLocation((0, "alpha")) logger = logging.getLogger("fontTools.otlLib.builder") with CapturingLogHandler(logger, "INFO") as captor: builder = SinglePosBuilder(ttfont, location) builder.add_subtable_break(MockBuilderLocation((5, "beta"))) builder.build() captor.assertRegex('5:beta: unsupported "subtable" statement for lookup type') def test_chain_pos_references_GSUB_lookup(ttfont): location = MockBuilderLocation((0, "alpha")) builder = ChainContextPosBuilder(ttfont, location) builder2 = SingleSubstBuilder(ttfont, location) builder.rules.append(ChainContextualRule([], [], [], [[builder2]])) with pytest.raises(OpenTypeLibError, match="0:alpha: Missing index of the specified lookup, might be a substitution lookup"): builder.build()