xref: /aosp_15_r20/external/fonttools/Tests/otlLib/mock_builder_test.py (revision e1fe3e4ad2793916b15cccdc4a7da52a7e1dd0e9)
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